- forum/forms.py: TopicForm/ReplyForm/EditPostForm con CKEditor5Widget (rich text) - vistas crear/responder/editar pasan el form; el HTML del editor se sanea con nh3 - acciones de moderación (bloquear, fijar, mover, borrar/restaurar temas y posts) ahora exigen POST y van con CSRF; las plantillas usan formularios en vez de enlaces GET - docs/FORO.md actualizado Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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. - Todas las acciones que modifican datos (publicar, responder, editar, mover, bloquear/desbloquear, fijar, borrar/restaurar temas y posts) van por POST con CSRF. Las vistas de moderación rechazan GET.
Editor
Los mensajes se escriben con CKEditor 5 (el mismo editor que usa el resto de
NovaWoW), vía forum/forms.py (TopicForm, ReplyForm, EditPostForm). El
HTML que produce el editor se sanea con nh3 al guardar, así que el rich text
es seguro.
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
- 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».