From 299428741b7e6e9cb8dc4bb6815b4315667b6770 Mon Sep 17 00:00:00 2001 From: juanjo <130799031+juanminguezsanz2023@users.noreply.github.com> Date: Thu, 16 Apr 2026 16:01:17 +0200 Subject: [PATCH] =?UTF-8?q?refactor:=20reorganizar=20estructura=20del=20pr?= =?UTF-8?q?oyecto=20al=20est=C3=A1ndar=20app/api=5Fconfig?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - core/ → app/api_config/ - apps/backend_admin/ → app/backend_admin/ - apps/common/ → app/common/ - apps/promociones/ → app/promociones/ - manage.py → app/manage.py - Añadir app/requirements.txt - Actualizar todos los imports y referencias (DJANGO_SETTINGS_MODULE, ROOT_URLCONF, WSGI_APPLICATION, INSTALLED_APPS) - Actualizar Dockerfile con nuevo WORKDIR Co-Authored-By: Claude Sonnet 4.6 --- .claude/settings.local.json | 22 +++++++++++++++++++ {core => app/api_config}/.env.example | 0 {apps => app/api_config}/__init__.py | 0 {core => app/api_config}/asgi.py | 2 +- {core => app/api_config}/settings.py | 10 ++++----- app/api_config/urls.py | 8 +++++++ {core => app/api_config}/wsgi.py | 2 +- {apps => app}/backend_admin/acciones.py | 0 .../backend_admin/migrations/0001_initial.py | 0 .../backend_admin/migrations/__init__.py | 0 {apps => app}/backend_admin/models.py | 0 {apps => app}/backend_admin/urls.py | 0 {apps => app}/backend_admin/views.py | 0 {apps => app}/common/apps.py | 0 {apps => app}/common/migrations/__init__.py | 0 {apps => app}/common/utils.py | 0 manage.py => app/manage.py | 2 +- {apps => app}/promociones/acciones.py | 2 +- {apps => app}/promociones/apps.py | 2 +- .../promociones/fixtures/semillas.json | 0 .../promociones/migrations/__init__.py | 0 {apps => app}/promociones/models.py | 0 {apps => app}/promociones/urls.py | 0 {apps => app}/promociones/views.py | 2 +- app/requirements.txt | 7 ++++++ core/__init__.py | 0 core/urls.py | 10 --------- deployments/Dockerfile | 6 ++--- 28 files changed, 51 insertions(+), 24 deletions(-) create mode 100644 .claude/settings.local.json rename {core => app/api_config}/.env.example (100%) rename {apps => app/api_config}/__init__.py (100%) rename {core => app/api_config}/asgi.py (57%) rename {core => app/api_config}/settings.py (97%) create mode 100644 app/api_config/urls.py rename {core => app/api_config}/wsgi.py (66%) rename {apps => app}/backend_admin/acciones.py (100%) rename {apps => app}/backend_admin/migrations/0001_initial.py (100%) rename {apps => app}/backend_admin/migrations/__init__.py (100%) rename {apps => app}/backend_admin/models.py (100%) rename {apps => app}/backend_admin/urls.py (100%) rename {apps => app}/backend_admin/views.py (100%) rename {apps => app}/common/apps.py (100%) rename {apps => app}/common/migrations/__init__.py (100%) rename {apps => app}/common/utils.py (100%) rename manage.py => app/manage.py (89%) rename {apps => app}/promociones/acciones.py (96%) rename {apps => app}/promociones/apps.py (81%) rename {apps => app}/promociones/fixtures/semillas.json (100%) rename {apps => app}/promociones/migrations/__init__.py (100%) rename {apps => app}/promociones/models.py (100%) rename {apps => app}/promociones/urls.py (100%) rename {apps => app}/promociones/views.py (97%) create mode 100644 app/requirements.txt delete mode 100644 core/__init__.py delete mode 100644 core/urls.py diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..82e944e --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,22 @@ +{ + "permissions": { + "allow": [ + "Bash(gh auth:*)", + "Bash(git config:*)", + "Read(//c/Users/juanm/**)", + "Bash(cmdkey /list)", + "Bash(curl -s -X POST https://git.v-encore-lab.com/api/v1/repos/Proyecto-SaaS/django-core-base/pulls -H 'Authorization: token 3b78f0a988a74fcc251d4b5476dd54c7d98c26d2' -H 'Content-Type: application/json' -d '{\"title\":\"Merge pre-dev into dev\",\"head\":\"pre-dev\",\"base\":\"dev\",\"body\":\"Merge de pre-dev a dev\"}')", + "Bash(curl -s -X POST https://git.v-encore-lab.com/api/v1/repos/Proyecto-SaaS/django-core-base/pulls -H 'Authorization: token 3b78f0a988a74fcc251d4b5476dd54c7d98c26d2' -H 'Content-Type: application/json' -d '{\"title\":\"Merge dev into master\",\"head\":\"dev\",\"base\":\"master\",\"body\":\"Merge de dev a master\"}')", + "Bash(curl -s -X POST https://git.v-encore-lab.com/api/v1/repos/Proyecto-SaaS/django-core-base/pulls/28/merge -H 'Authorization: token 3b78f0a988a74fcc251d4b5476dd54c7d98c26d2' -H 'Content-Type: application/json' -d '{\"Do\":\"merge\",\"merge_message_field\":\"Merge pre-dev into dev\"}')", + "Bash(curl -s https://git.v-encore-lab.com/api/v1/repos/Proyecto-SaaS/django-core-base/pulls/28 -H 'Authorization: token 3b78f0a988a74fcc251d4b5476dd54c7d98c26d2')", + "Bash(python -c \"import sys,json; p=json.load\\(sys.stdin\\); print\\('merged:', p['merged'], '| state:', p['state']\\)\")", + "Bash(curl -s -X POST https://git.v-encore-lab.com/api/v1/repos/Proyecto-SaaS/django-core-base/pulls/29/merge -H 'Authorization: token 3b78f0a988a74fcc251d4b5476dd54c7d98c26d2' -H 'Content-Type: application/json' -d '{\"Do\":\"merge\",\"merge_message_field\":\"Merge dev into master\"}')", + "Bash(curl -s https://git.v-encore-lab.com/api/v1/repos/Proyecto-SaaS/django-core-base/pulls/29 -H 'Authorization: token 3b78f0a988a74fcc251d4b5476dd54c7d98c26d2')", + "Bash(mkdir -p app)", + "Bash(mv core:*)", + "Bash(mv apps/backend_admin app/backend_admin)", + "Bash(mv apps/common app/common)", + "Bash(mv apps/promociones app/promociones)" + ] + } +} diff --git a/core/.env.example b/app/api_config/.env.example similarity index 100% rename from core/.env.example rename to app/api_config/.env.example diff --git a/apps/__init__.py b/app/api_config/__init__.py similarity index 100% rename from apps/__init__.py rename to app/api_config/__init__.py diff --git a/core/asgi.py b/app/api_config/asgi.py similarity index 57% rename from core/asgi.py rename to app/api_config/asgi.py index 7de2e6f..9fba103 100644 --- a/core/asgi.py +++ b/app/api_config/asgi.py @@ -1,4 +1,4 @@ import os from django.core.asgi import get_asgi_application -os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'core.settings') +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'api_config.settings') application = get_asgi_application() \ No newline at end of file diff --git a/core/settings.py b/app/api_config/settings.py similarity index 97% rename from core/settings.py rename to app/api_config/settings.py index c12ec3c..c11de02 100644 --- a/core/settings.py +++ b/app/api_config/settings.py @@ -56,9 +56,9 @@ INSTALLED_APPS = [ 'corsheaders', # Tus Apps (Asegúrate de que el path sea correcto) - 'apps.promociones', - 'apps.backend_admin', - 'apps.common', + 'promociones', + 'backend_admin', + 'common', ] MIDDLEWARE = [ @@ -72,7 +72,7 @@ MIDDLEWARE = [ 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] -ROOT_URLCONF = 'core.urls' +ROOT_URLCONF = 'api_config.urls' TEMPLATES = [ { @@ -90,7 +90,7 @@ TEMPLATES = [ }, ] -WSGI_APPLICATION = 'core.wsgi.application' +WSGI_APPLICATION = 'api_config.wsgi.application' # 3. DATABASE # Extraemos con fallback por si el .env falla diff --git a/app/api_config/urls.py b/app/api_config/urls.py new file mode 100644 index 0000000..29116c0 --- /dev/null +++ b/app/api_config/urls.py @@ -0,0 +1,8 @@ +from django.urls import path, include +from backend_admin import views as admin_views + +urlpatterns = [ + path('admin/', include('backend_admin.urls')), + path('promociones/', include('promociones.urls')), + path('api/token/', admin_views.api_token, name='token_obtain_pair'), +] \ No newline at end of file diff --git a/core/wsgi.py b/app/api_config/wsgi.py similarity index 66% rename from core/wsgi.py rename to app/api_config/wsgi.py index 38e1de4..a5c9ed2 100644 --- a/core/wsgi.py +++ b/app/api_config/wsgi.py @@ -2,6 +2,6 @@ import os from django.core.wsgi import get_wsgi_application # Este es el enlace con tus configuraciones -os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'core.settings') +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'api_config.settings') application = get_wsgi_application() \ No newline at end of file diff --git a/apps/backend_admin/acciones.py b/app/backend_admin/acciones.py similarity index 100% rename from apps/backend_admin/acciones.py rename to app/backend_admin/acciones.py diff --git a/apps/backend_admin/migrations/0001_initial.py b/app/backend_admin/migrations/0001_initial.py similarity index 100% rename from apps/backend_admin/migrations/0001_initial.py rename to app/backend_admin/migrations/0001_initial.py diff --git a/apps/backend_admin/migrations/__init__.py b/app/backend_admin/migrations/__init__.py similarity index 100% rename from apps/backend_admin/migrations/__init__.py rename to app/backend_admin/migrations/__init__.py diff --git a/apps/backend_admin/models.py b/app/backend_admin/models.py similarity index 100% rename from apps/backend_admin/models.py rename to app/backend_admin/models.py diff --git a/apps/backend_admin/urls.py b/app/backend_admin/urls.py similarity index 100% rename from apps/backend_admin/urls.py rename to app/backend_admin/urls.py diff --git a/apps/backend_admin/views.py b/app/backend_admin/views.py similarity index 100% rename from apps/backend_admin/views.py rename to app/backend_admin/views.py diff --git a/apps/common/apps.py b/app/common/apps.py similarity index 100% rename from apps/common/apps.py rename to app/common/apps.py diff --git a/apps/common/migrations/__init__.py b/app/common/migrations/__init__.py similarity index 100% rename from apps/common/migrations/__init__.py rename to app/common/migrations/__init__.py diff --git a/apps/common/utils.py b/app/common/utils.py similarity index 100% rename from apps/common/utils.py rename to app/common/utils.py diff --git a/manage.py b/app/manage.py similarity index 89% rename from manage.py rename to app/manage.py index 8236117..da16c72 100644 --- a/manage.py +++ b/app/manage.py @@ -6,7 +6,7 @@ import sys def main(): """Run administrative tasks.""" # Apuntamos a la configuración dentro de la carpeta 'core' - os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'core.settings') + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'api_config.settings') try: from django.core.management import execute_from_command_line except ImportError as exc: diff --git a/apps/promociones/acciones.py b/app/promociones/acciones.py similarity index 96% rename from apps/promociones/acciones.py rename to app/promociones/acciones.py index c3840d5..a97e672 100644 --- a/apps/promociones/acciones.py +++ b/app/promociones/acciones.py @@ -1,5 +1,5 @@ from django.db import connection -from apps.common.utils import clean_sql_string, clean_sql_int +from common.utils import clean_sql_string, clean_sql_int def get_status_action(): diff --git a/apps/promociones/apps.py b/app/promociones/apps.py similarity index 81% rename from apps/promociones/apps.py rename to app/promociones/apps.py index 24d8bb9..2ae325e 100644 --- a/apps/promociones/apps.py +++ b/app/promociones/apps.py @@ -2,4 +2,4 @@ from django.apps import AppConfig class PromocionesConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' - name = 'apps.promociones' \ No newline at end of file + name = 'promociones' \ No newline at end of file diff --git a/apps/promociones/fixtures/semillas.json b/app/promociones/fixtures/semillas.json similarity index 100% rename from apps/promociones/fixtures/semillas.json rename to app/promociones/fixtures/semillas.json diff --git a/apps/promociones/migrations/__init__.py b/app/promociones/migrations/__init__.py similarity index 100% rename from apps/promociones/migrations/__init__.py rename to app/promociones/migrations/__init__.py diff --git a/apps/promociones/models.py b/app/promociones/models.py similarity index 100% rename from apps/promociones/models.py rename to app/promociones/models.py diff --git a/apps/promociones/urls.py b/app/promociones/urls.py similarity index 100% rename from apps/promociones/urls.py rename to app/promociones/urls.py diff --git a/apps/promociones/views.py b/app/promociones/views.py similarity index 97% rename from apps/promociones/views.py rename to app/promociones/views.py index 60c9df5..21181ae 100644 --- a/apps/promociones/views.py +++ b/app/promociones/views.py @@ -2,7 +2,7 @@ from rest_framework.views import APIView from rest_framework.permissions import IsAuthenticated from rest_framework_simplejwt.authentication import JWTAuthentication from django.http import JsonResponse -from apps.backend_admin.models import Log +from backend_admin.models import Log from .acciones import getData from django.utils import timezone # Esta es la forma correcta class PromocionObtener(APIView): diff --git a/app/requirements.txt b/app/requirements.txt new file mode 100644 index 0000000..735e271 --- /dev/null +++ b/app/requirements.txt @@ -0,0 +1,7 @@ +Django==5.0.3 +psycopg2-binary==2.9.9 +gunicorn==21.2.0 +python-dotenv==1.0.1 +djangorestframework +django-cors-headers +djangorestframework-simplejwt \ No newline at end of file diff --git a/core/__init__.py b/core/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/core/urls.py b/core/urls.py deleted file mode 100644 index 8abc299..0000000 --- a/core/urls.py +++ /dev/null @@ -1,10 +0,0 @@ -from django.urls import path, include -from django.urls import path, include -from apps.backend_admin import views as admin_views - -urlpatterns = [ - path('admin/', include('apps.backend_admin.urls')), - # AÑADE ESTA LÍNEA AQUÍ PARA QUE SEA UNA RUTA PRINCIPAL: - path('promociones/', include('apps.promociones.urls')), - path('api/token/', admin_views.api_token, name='token_obtain_pair'), -] \ No newline at end of file diff --git a/deployments/Dockerfile b/deployments/Dockerfile index c123e9f..9c47518 100644 --- a/deployments/Dockerfile +++ b/deployments/Dockerfile @@ -22,14 +22,14 @@ COPY deployments/requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 6. COPIAR EL CÓDIGO -# Copiamos todo el contenido de la raíz (.) al directorio de trabajo (/app) -# Esto incluirá apps/, core/, manage.py, etc. COPY . . +# Cambiamos al directorio de la app donde está manage.py +WORKDIR /app/app + # 7. EXPOSICIÓN Y SCRIPT DE ENTRADA EXPOSE 8000 -# El entrypoint también está en deployments/ COPY deployments/entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh