Añade foro de comunidad integrado (app forum) con el diseño de NovaWoW

- 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>
This commit is contained in:
2026-07-12 17:10:55 +00:00
parent 2162fe34d0
commit 2c30844bf7
21 changed files with 1385 additions and 1 deletions
+50
View File
@@ -0,0 +1,50 @@
<!DOCTYPE html>
{% include 'partials/head.html' %}
{% include 'partials/header.html' %}
{% include 'partials/video.html' %}
<div class="main-page">
<div class="middle-content">
<div class="body-content">
<div class="title-content"><h1>Foro de la comunidad</h1></div>
<div class="box-content">
<div class="body-box-content">
{% include 'forum/_style.html' %}
<div class="forum-wrap">
{% for category in categories %}
<div class="forum-cat">
<div class="forum-cat-title">{{ category.name }}</div>
{% for forum in category.forums %}
<div class="forum-row {% if forum.deleted %}forum-deleted{% endif %}">
<div class="main">
<a class="name" href="{% url 'forum_view_p1' forum_id=forum.id %}"
{% if forum.colortitle and forum.colortitle != '0' %}style="color:{{ forum.colortitle }}"{% endif %}>
{{ forum.name }}
</a>
{% if not forum.visibility %}<span class="forum-badge">Oculto</span>{% endif %}
<div class="desc">{{ forum.description }}</div>
</div>
<div class="stats">
<div>{{ forum.topic_count }} temas</div>
<div>{{ forum.post_count }} mensajes</div>
{% if forum.last_topic_name %}
<div>Último: <a href="{% url 'forum_topic_p1' topic_id=forum.last_topic_id %}">{{ forum.last_topic_name|truncatechars:30 }}</a></div>
{% endif %}
</div>
</div>
{% endfor %}
</div>
{% empty %}
<p>Todavía no hay foros disponibles.</p>
{% endfor %}
</div>
</div>
</div>
</div>
</div>
</div>
{% include 'partials/social.html' %}
{% include 'partials/footer.html' %}
{% include 'partials/final.html' %}