Foro: paginación en la búsqueda y contador de visitas por tema

- búsqueda paginada (count_search_topics + offset/limit) con controles en la plantilla
- contador de visitas: columna opcional forum_topics.views con detección automática
  (has_views_column), increment_views al ver el tema, mostrado en lista y cabecera
- sql/forum_views.sql (ALTER opcional) + docs

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-12 17:22:05 +00:00
parent fd49d6cd96
commit eb93758c43
7 changed files with 90 additions and 12 deletions
+14 -1
View File
@@ -87,14 +87,22 @@ def view_forum(request, forum_id, page=1):
def search(request):
query = (request.GET.get('q') or '').strip()
try:
page = int(request.GET.get('page', 1))
except (TypeError, ValueError):
page = 1
results = []
pag = None
if len(query) >= 2:
results = db.search_topics(query)
total = db.count_search_topics(query)
pag, offset = _paginate(total, page, settings.FORUM_TOPICS_PER_PAGE)
results = db.search_topics(query, offset, settings.FORUM_TOPICS_PER_PAGE)
for r in results:
r['display_poster'] = db.get_display_name(r['poster_id']) or r['poster']
return render(request, 'forum/search.html', _base_context(request, {
'query': query,
'results': results,
'pagination': pag,
}))
@@ -106,6 +114,11 @@ def view_topic(request, topic_id, page=1):
forum = db.get_forum(topic['forum_id'], include_hidden=True)
# Contador de visitas (si la columna existe)
db.increment_views(topic_id)
if topic.get('views') is not None:
topic['views'] = topic['views'] + 1
total = db.count_posts(topic_id)
pag, offset = _paginate(total, page, settings.FORUM_POSTS_PER_PAGE)
include_deleted = perm.is_moderator(request)