Changelogs

Fase 0/1 migración a TSX: islas React con Vite + API JSON (piloto: noticias)

12 de julio de 2026 a las 20:18

adevopg · 98c3cbd

Arquitectura elegida: islas React/TSX montadas sobre las plantillas Django existentes (django-vite), alimentadas por endpoints JSON bajo /api/. El backend, las URLs y la auth por sesión se mantienen; se migra sección a sección. Fase 0 (tooling): - frontend/ con Vite + React 18 + TypeScript. Build a static/dist con manifest. - django-vite 3.1 en INSTALLED_APPS + DJANGO_VITE (dev_mode=DEBUG, static_url_prefix='dist'). STATIC_URL pasa a '/static/' (absoluto) para que los assets no choquen con el <base href> de la plantilla. WhiteNoise sirve el bundle. - .gitignore: frontend/node_modules y static/dist (artefactos de build). Fase 1 (piloto: lista de noticias de la portada): - API: home/views/api.py -> home_news_api (JsonResponse); ruta /api/home/news/ montada en home/api_urls.py fuera de i18n_patterns. - React: NewsList.tsx hace fetch de la API y renderiza las noticias (mismas clases CSS que el HTML original). Entry src/entries/home.tsx monta en #home-news-app. - partials/noticias.html: el bucle {% for noticia %} se reemplaza por el contenedor de montaje + {% vite_asset %}. Verificado en producción: manage.py check OK, /api/home/news/ 200, la home incluye el mount y el <script> del bundle, y el bundle se sirve (200). Build en deploy: cd frontend && npm run build && collectstatic (ver frontend/README.md).




Despliegue en nightspire.gg: dominio real, estáticos y home resiliente

12 de julio de 2026 a las 20:01

adevopg · 1ee126a

- settings: ALLOWED_HOSTS y CSRF_TRUSTED_ORIGINS a nightspire.gg / www.nightspire.gg (+ IP del servidor). Se retira el antiguo novawow.com. - WhiteNoise para servir estáticos desde gunicorn (el reverse proxy Caddy corre como usuario 'caddy' y no puede leer /root): middleware + STORAGES con CompressedStaticFilesStorage. Añadido a requirements.txt. - home: get_online_characters_count() ahora tolera que la BD de personajes (AzerothCore) no exista/esté vacía y devuelve 0 en vez de provocar un 500 en la portada (mismo criterio que el context_processor get_server_info).




Corrige ContentCreator.__str__ (self.titles -> self.title)

12 de julio de 2026 a las 19:16

adevopg · 96ab91a

El campo se llama `title`; `self.titles` no existía y provocaba AttributeError al representar el modelo (p. ej. en el admin de Django).




Divide home/models.py en el paquete home/models/ por secciones

12 de julio de 2026 a las 19:15

adevopg · 5852856

El módulo (~310 líneas, 30 modelos) se convierte en un paquete cuyo __init__.py re-exporta todos los modelos, de modo que `from home.models import X`, el admin y el resto de consumidores siguen funcionando igual. Módulos por sección: pricing (precios/costes de servicios + GuildRenameSettings), store (Category, Item, StripeLog, Pedido), site (contenido/config del sitio), recruit, accounts (activación, token de seguridad, LoginAttempt), voting (VoteSite, VoteLog, HomeApiPoints) e history. Las claves foráneas por clase directa quedan en el mismo módulo; cada submódulo importa solo lo que usa. Se eliminan imports de cabecera muertos (ValidationError, uuid, secrets) y las líneas de import duplicadas del original. Migración-neutral: `makemigrations home --dry-run` -> "No changes detected" (app_label=home y nombres/tablas de modelo intactos). Definición de cada modelo idéntica (extracción por AST). `manage.py check` sin incidencias.




Divide home/views.py en el paquete home/views/ por secciones

12 de julio de 2026 a las 19:09

adevopg · b3184fb

El módulo monolítico (~3200 líneas) se convierte en un paquete cuyo __init__.py re-exporta todas las vistas, de modo que `views.X`, `from home.views import X` y la cadena 'home.views.not_found' (handler404) siguen funcionando sin tocar urls.py. Módulos por sección: _base (imports comunes + require_paid_stripe), auth, pages, account, recruit, characters, store, points, guild, history, players y payments. Cada submódulo hereda los imports con `from ._base import *`; las dependencias entre secciones se resuelven con imports explícitos (guild->auth, recruit/history->account). Se eliminan dos definiciones duplicadas que quedaban muertas al cargar: - get_character_image (primera copia, idéntica a la efectiva) - store_novawow_success_view (stub sin SOAP, pisado por la versión real) Validado con `manage.py check` (0 issues), resolución de las 100 rutas y un chequeo estático de nombres no definidos por módulo.





SÍGUENOS EN