2c30844bf7
- app 'forum': portada (categorías/foros), ver foro y tema (paginado), crear tema, responder, editar/borrar posts y moderación (fijar, bloquear, mover, borrar/restaurar) - lee/escribe la BD acore_web (5ª conexión, DB_NAME_WEB) por SQL directo, tablas forum_categories/forums/forum_topics/forum_posts/forum_reads (portado de NovaWeb-main) - identidad = cuenta de juego en sesión; permisos simplificados por gmlevel (FORUM_MOD_GMLEVEL) en vez de la matriz group_level×permission del original - saneado del HTML de posts con nh3 (evita el XSS del original); POST+CSRF en formularios - plantillas con los partials del sitio; enlace 'FOROS' del menú apunta al foro interno - sql/forum_schema.sql y docs/FORO.md Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
3.2 KiB
3.2 KiB
Foro integrado (app forum)
Foro de comunidad reimplementado en Django dentro de NovaWoW, con el diseño
del propio sitio (usa los partials head/header/footer). Portado desde la app
Symfony NovaWeb-main, contra las mismas tablas en la base de datos
acore_web.
Arquitectura
- BD:
acore_web(5ª conexión Django,DB_NAME_WEB). Acceso por SQL directo (connections['acore_web']), mismo estilo que el resto del proyecto. - Tablas:
forum_categories,forums,forum_topics,forum_posts,forum_reads. (La tabla legacyforum_forumsNO se usa.) - Identidad del autor: la cuenta de juego en sesión de NovaWoW
(
session['account_id']/session['username']). No usa las cookies del proyecto original.
Funcionalidad (completa)
- Portada con categorías y foros (contadores de temas/mensajes, último tema).
- Ver foro: lista de temas paginada.
- Ver tema: posts paginados, con panel de autor (rol, registro, nº de mensajes).
- Crear tema, responder, editar y borrar el post propio.
- Moderación: fijar/desfijar, bloquear/desbloquear, mover, borrar/restaurar temas y posts.
- Perfil público básico (
/es/profile/<usuario>).
Rutas bajo /es/forum... (idénticas al original: app_forum, forum_view,
forum_topic, forum_create_topic, etc.).
Modelo de permisos (simplificado)
En vez de la matriz group_level×permission del original (enrevesada y con
acciones que quedaban deshabilitadas por falta de filas), se usa un modelo claro
en forum/permissions.py:
- Ver: foros públicos (
visibility=1,deleted=0) visibles para todos. - Publicar / responder / crear tema: cualquier usuario con sesión iniciada y cuenta de juego seleccionada.
- Editar / borrar un post: su autor, o un moderador.
- Moderar: cuentas con
gmlevel >= FORUM_MOD_GMLEVEL(por defecto 2), leído deacore_auth.account_access.
Seguridad
- El texto de los posts se sanea con
nh3(allowlist de etiquetas) al guardar —forum/sanitize.py— evitando el XSS que tenía el original (que renderizaba HTML del editor sin filtrar). Se renderiza con|safeya saneado. - Formularios de publicar/responder/editar/mover van por POST con CSRF.
- ⚠️ Pendiente de endurecer: las acciones de moderación (bloquear, borrar, restaurar, fijar) son enlaces GET (como en el original). Para producción se recomienda pasarlas a POST con CSRF.
Despliegue
- Crear/usar la BD
acore_weby aplicar el esquema:(Si ya existe la BD del portal Symfony con esas tablas, apuntamysql acore_web < sql/forum_schema.sqlDB_NAME_WEBa ella y omite este paso.) - Configurar variables de entorno:
DB_NAME_WEB=acore_web FORUM_MOD_GMLEVEL=2 FORUM_TOPICS_PER_PAGE=20 FORUM_POSTS_PER_PAGE=15 - El enlace «FOROS» del menú COMUNIDAD ya apunta al foro interno (
/es/forum).
Notas / posibles mejoras
- Editor enriquecido (CKEditor/TinyMCE) en el textarea de posts (ahora es
texto/HTML saneado; los saltos de línea se respetan por CSS
pre-wrap). - El autor se muestra como el nombre de cuenta de juego (
<bnetId>#1); se podría mapear a un nick o al email como en «Mi cuenta». - Endurecer las acciones de moderación a POST+CSRF.