Files
NovaWoW/docs/FORO.md
T
Inna 874a0c1ad9 Foro: editor CKEditor 5 en los mensajes y moderación por POST+CSRF
- 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>
2026-07-12 17:15:35 +00:00

3.2 KiB
Raw Blame History

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 legacy forum_forums NO 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 de acore_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 |safe ya 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

  1. Crear/usar la BD acore_web y aplicar el esquema:
    mysql acore_web < sql/forum_schema.sql
    
    (Si ya existe la BD del portal Symfony con esas tablas, apunta DB_NAME_WEB a ella y omite este paso.)
  2. Configurar variables de entorno:
    DB_NAME_WEB=acore_web
    FORUM_MOD_GMLEVEL=2
    FORUM_TOPICS_PER_PAGE=20
    FORUM_POSTS_PER_PAGE=15
    
  3. 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».