""" Modelo de permisos del foro (versión simplificada y mantenible). En lugar de la matriz group_level×permission del proyecto original, usamos reglas claras basadas en: * si el usuario ha iniciado sesión y tiene una cuenta de juego seleccionada (``request.session['account_id']``), * su nivel GM (``acore_auth.account_access.gmlevel``), * y la propiedad del contenido (autor == usuario). """ from django.conf import settings from django.db import connections def get_account_id(request): """Id de la cuenta de juego seleccionada en sesión, o None.""" return request.session.get('account_id') def is_authenticated(request): return bool(request.session.get('account_id')) def get_gmlevel(account_id): """Nivel GM máximo de una cuenta (acore_auth.account_access). 0 si no tiene.""" if not account_id: return 0 try: with connections['acore_auth'].cursor() as cursor: cursor.execute( "SELECT MAX(gmlevel) FROM account_access WHERE id = %s", [account_id], ) row = cursor.fetchone() return int(row[0]) if row and row[0] is not None else 0 except Exception: return 0 def is_moderator(request): """¿El usuario puede moderar el foro?""" account_id = get_account_id(request) if not account_id: return False return get_gmlevel(account_id) >= settings.FORUM_MOD_GMLEVEL def can_post(request): """¿Puede crear temas / responder? Cualquier usuario autenticado.""" return is_authenticated(request) def can_edit_post(request, post): """Puede editar/borrar un post: su autor o un moderador.""" account_id = get_account_id(request) if not account_id: return False if post and int(post.get('poster_id') or 0) == int(account_id): return True return is_moderator(request) def forum_context(request): """Datos comunes de permisos para las plantillas.""" return { 'forum_is_authenticated': is_authenticated(request), 'forum_is_moderator': is_moderator(request), 'forum_account_id': get_account_id(request), 'forum_username': request.session.get('username'), }