Compare commits

8 Commits

Author SHA1 Message Date
juanjo
c4db3639c3 Merge pre-dev: docs flujo ramas
All checks were successful
DEPLOY_MULTI_BRACH/pipeline/head This commit looks good
2026-04-17 01:15:19 +02:00
juanjo
379ce825f6 Merge pre-dev: fix api_hub_dispatcher → api_config
All checks were successful
DEPLOY_MULTI_BRACH/pipeline/head This commit looks good
2026-04-17 01:13:56 +02:00
juanjo
abe67a7f20 Merge pre-dev: fix env_file docker-compose
All checks were successful
DEPLOY_MULTI_BRACH/pipeline/head This commit looks good
2026-04-17 01:06:34 +02:00
juanjo
5367ba7313 Merge pre-dev: fix env_file path docker-compose
All checks were successful
DEPLOY_MULTI_BRACH/pipeline/head This commit looks good
2026-04-17 01:05:40 +02:00
juanjo
23cd4bf8b4 Merge pre-dev: gunicorn + wait-for-db + healthcheck
Some checks failed
DEPLOY_MULTI_BRACH/pipeline/head There was a failure building this commit
2026-04-17 00:39:30 +02:00
juanjo
b43ca9d919 Merge branch 'dev' of https://git.v-encore-lab.com/Proyecto-SaaS/django-core-base into dev 2026-04-17 00:39:30 +02:00
juanjo
adaf20bd8e Merge pre-dev: revert api_config 2026-04-16 23:31:29 +02:00
juanjo
95e036108d Merge pre-dev: renombrar api_config → api_hub_dispatcher 2026-04-16 23:28:44 +02:00
10 changed files with 30 additions and 228 deletions

3
.gitattributes vendored
View File

@@ -1,5 +1,2 @@
# Auto detect text files and perform LF normalization
* text=auto
# Shell scripts: forzar LF siempre (evita CRLF en Windows que rompe Docker)
*.sh text eol=lf

View File

@@ -140,11 +140,9 @@ python manage.py migrate <app_name> zero
---
## Docker — Local y Producción
## Docker — Producción
```bash
cd deployments
# Construir e iniciar
docker-compose up --build -d
@@ -160,16 +158,6 @@ docker-compose down -v
El contenedor expone el puerto **8000**.
### Crear superusuario (primera vez con Docker)
Una vez los contenedores estén corriendo:
```bash
docker-compose exec web sh -c "cd /app/app && python manage.py createsuperuser"
```
Introduce usuario, email y contraseña cuando lo pida. Estas credenciales son las que usarás para entrar en el panel web (`web_interno`) y en `/admin/`.
Para producción con PostgreSQL, asegúrate de que `.env` tenga `DB_HOST` apuntando al host correcto (puede ser el nombre del servicio en la red Docker).
---

View File

@@ -175,11 +175,6 @@ LOGGING = {
},
}
# --- URLs de APIs internas (via red Docker saas_network) ---
API_BACKOFFICE = os.getenv('API_BACKOFFICE', 'http://api_backoffice:8001')
API_COMUNICACIONES = os.getenv('API_COMUNICACIONES', 'http://api_comunicaciones:8002')
API_DOCUMENTACION = os.getenv('API_DOCUMENTACION', 'http://api_documentacion:8003')
# --- CONFIGURACIONES PERSONALIZADAS DE LA APP ---
# Leemos la variable del .env (cargado previamente con load_dotenv)

View File

@@ -1,60 +0,0 @@
import urllib.request
import json
import os
BACKOFFICE_URL = os.getenv('BACKOFFICE_URL', 'http://django_app_backoffice:8000')
COMUNICACIONES_URL = os.getenv('COMUNICACIONES_URL', 'http://django_app_comunicaciones:8000')
DOCUMENTACION_URL = os.getenv('DOCUMENTACION_URL', 'http://django_app_documentacion:8000')
def _post(url, payload):
data = json.dumps(payload).encode('utf-8')
req = urllib.request.Request(
url, data=data,
headers={'Content-Type': 'application/json'},
method='POST'
)
with urllib.request.urlopen(req, timeout=10) as resp:
return json.loads(resp.read())
# --- Backoffice ---
def backoffice_obtener_usuario(params):
return _post(f'{BACKOFFICE_URL}/api/usuarios/obtener/', params)
def backoffice_crear_usuario(params):
return _post(f'{BACKOFFICE_URL}/api/usuarios/guardar/', params)
def backoffice_obtener_cliente(params):
return _post(f'{BACKOFFICE_URL}/api/clientes/obtener/', params)
def backoffice_crear_cliente(params):
return _post(f'{BACKOFFICE_URL}/api/clientes/guardar/', params)
def backoffice_obtener_contrato(params):
return _post(f'{BACKOFFICE_URL}/api/contratos/obtener/', params)
def backoffice_crear_contrato(params):
return _post(f'{BACKOFFICE_URL}/api/contratos/guardar/', params)
# --- Comunicaciones ---
def comunicaciones_enviar_email(params):
return _post(f'{COMUNICACIONES_URL}/api/email/enviar/', params)
def comunicaciones_enviar_sms(params):
return _post(f'{COMUNICACIONES_URL}/api/sms/enviar/', params)
def comunicaciones_registrar_webhook(params):
return _post(f'{COMUNICACIONES_URL}/api/webhooks/registrar/', params)
# --- Documentacion ---
def documentacion_generar_pdf(params):
return _post(f'{DOCUMENTACION_URL}/api/generation/pdf/', params)
def documentacion_obtener_template(params):
return _post(f'{DOCUMENTACION_URL}/api/templates/obtener/', params)
def documentacion_guardar_documento(params):
return _post(f'{DOCUMENTACION_URL}/api/storage/guardar/', params)

View File

@@ -1,100 +0,0 @@
import json
import requests
from django.conf import settings
class Request_API:
"""Dispatcher de llamadas HTTP internas hacia las APIs especializadas."""
def _post(self, base_url, url_path, data):
url = base_url.rstrip('/') + '/' + url_path.lstrip('/')
headers = {'Content-Type': 'application/json'}
response = requests.post(url, data=json.dumps(data), headers=headers, timeout=30)
return response.json(), response.status_code
# ------------------------------------------------------------------ #
# api_backoffice #
# ------------------------------------------------------------------ #
def backoffice_get_parameterized(self, data):
return self._post(settings.API_BACKOFFICE, 'api/general/get_parameterized/', data)
def backoffice_get_dataComplex(self, data):
return self._post(settings.API_BACKOFFICE, 'api/general/get_dataComplex/', data)
def backoffice_set_parameterized(self, data):
return self._post(settings.API_BACKOFFICE, 'api/general/set_parameterized/', data)
def backoffice_set_data2(self, data):
return self._post(settings.API_BACKOFFICE, 'api/general/set_data2/', data)
def backoffice_set_data_batch(self, data):
return self._post(settings.API_BACKOFFICE, 'api/general/set_data_batch/', data)
def backoffice_get_BBDD(self, data):
return self._post(settings.API_BACKOFFICE, 'api/general/get_BBDD/', data)
def backoffice_set_BBDD(self, data):
return self._post(settings.API_BACKOFFICE, 'api/general/set_BBDD/', data)
# ------------------------------------------------------------------ #
# api_comunicaciones #
# ------------------------------------------------------------------ #
def comunicaciones_get_parameterized(self, data):
return self._post(settings.API_COMUNICACIONES, 'api/general/get_parameterized/', data)
def comunicaciones_get_dataComplex(self, data):
return self._post(settings.API_COMUNICACIONES, 'api/general/get_dataComplex/', data)
def comunicaciones_set_parameterized(self, data):
return self._post(settings.API_COMUNICACIONES, 'api/general/set_parameterized/', data)
def comunicaciones_set_data2(self, data):
return self._post(settings.API_COMUNICACIONES, 'api/general/set_data2/', data)
def comunicaciones_set_data_batch(self, data):
return self._post(settings.API_COMUNICACIONES, 'api/general/set_data_batch/', data)
def comunicaciones_get_BBDD(self, data):
return self._post(settings.API_COMUNICACIONES, 'api/general/get_BBDD/', data)
def comunicaciones_set_BBDD(self, data):
return self._post(settings.API_COMUNICACIONES, 'api/general/set_BBDD/', data)
def comunicaciones_enviar_email(self, data):
return self._post(settings.API_COMUNICACIONES, 'api/email/enviar/', data)
def comunicaciones_enviar_sms(self, data):
return self._post(settings.API_COMUNICACIONES, 'api/sms/enviar/', data)
# ------------------------------------------------------------------ #
# api_documentacion #
# ------------------------------------------------------------------ #
def documentacion_get_parameterized(self, data):
return self._post(settings.API_DOCUMENTACION, 'api/general/get_parameterized/', data)
def documentacion_get_dataComplex(self, data):
return self._post(settings.API_DOCUMENTACION, 'api/general/get_dataComplex/', data)
def documentacion_set_parameterized(self, data):
return self._post(settings.API_DOCUMENTACION, 'api/general/set_parameterized/', data)
def documentacion_set_data2(self, data):
return self._post(settings.API_DOCUMENTACION, 'api/general/set_data2/', data)
def documentacion_set_data_batch(self, data):
return self._post(settings.API_DOCUMENTACION, 'api/general/set_data_batch/', data)
def documentacion_get_BBDD(self, data):
return self._post(settings.API_DOCUMENTACION, 'api/general/get_BBDD/', data)
def documentacion_set_BBDD(self, data):
return self._post(settings.API_DOCUMENTACION, 'api/general/set_BBDD/', data)
def documentacion_generar_pdf(self, data):
return self._post(settings.API_DOCUMENTACION, 'api/generation/pdf/', data)
def documentacion_guardar(self, data):
return self._post(settings.API_DOCUMENTACION, 'api/storage/guardar/', data)

View File

@@ -4,5 +4,4 @@ gunicorn==21.2.0
python-dotenv==1.0.1
djangorestframework
django-cors-headers
djangorestframework-simplejwt
requests==2.32.3
djangorestframework-simplejwt

View File

@@ -36,13 +36,6 @@ services:
depends_on:
db:
condition: service_healthy
networks:
- default
- saas_network
volumes:
postgres_data:
networks:
saas_network:
external: true

View File

@@ -4,5 +4,4 @@ gunicorn==21.2.0
python-dotenv==1.0.1
djangorestframework
django-cors-headers
djangorestframework-simplejwt
requests==2.32.3
djangorestframework-simplejwt

View File

@@ -5,7 +5,33 @@
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
"_postman_id": "django-core-base-collection"
},
"variable": [],
"variable": [
{
"key": "base_url",
"value": "http://localhost:8000",
"type": "string"
},
{
"key": "access_token",
"value": "",
"type": "string"
},
{
"key": "refresh_token",
"value": "",
"type": "string"
},
{
"key": "username",
"value": "admin",
"type": "string"
},
{
"key": "password",
"value": "admin",
"type": "string"
}
],
"item": [
{
"name": "Auth",

View File

@@ -1,35 +0,0 @@
{
"local": {
"id": "ftt19d5vxuj",
"v": 2,
"name": "LOCAL",
"variables": [
{ "key": "base_url", "secret": false, "initialValue": "http://localhost:8000", "currentValue": "http://localhost:8000" },
{ "key": "username", "secret": false, "initialValue": "admin", "currentValue": "admin" },
{ "key": "password", "secret": false, "initialValue": "admin", "currentValue": "admin" },
{ "key": "access_token", "secret": false, "initialValue": "", "currentValue": "" }
]
},
"dev": {
"id": "x8jh10qysfo",
"v": 2,
"name": "DEV",
"variables": [
{ "key": "base_url", "secret": false, "initialValue": "https://dev.v-encore-lab.com", "currentValue": "https://dev.v-encore-lab.com" },
{ "key": "username", "secret": false, "initialValue": "admin", "currentValue": "admin" },
{ "key": "password", "secret": false, "initialValue": "admin", "currentValue": "admin" },
{ "key": "access_token", "secret": false, "initialValue": "", "currentValue": "" }
]
},
"prod": {
"id": "3ckrklvkf27",
"v": 2,
"name": "PROD",
"variables": [
{ "key": "base_url", "secret": false, "initialValue": "https://v-encore-lab.com", "currentValue": "https://v-encore-lab.com" },
{ "key": "username", "secret": false, "initialValue": "admin", "currentValue": "admin" },
{ "key": "password", "secret": false, "initialValue": "admin", "currentValue": "admin" },
{ "key": "access_token", "secret": false, "initialValue": "", "currentValue": "" }
]
}
}