from functools import wraps from flask import request, redirect, url_for, flash, current_app from flask_login import current_user def login_required_api(f): """ Decorador para verificar autenticación en endpoints de API. A diferencia del decorador estándar de Flask-Login, este devuelve una respuesta JSON en lugar de redirigir. Args: f: Función a decorar Returns: function: Función decorada """ @wraps(f) def decorated_function(*args, **kwargs): if not current_user.is_authenticated: return { 'success': False, 'message': 'Autenticación requerida', 'code': 401 }, 401 return f(*args, **kwargs) return decorated_function def check_permission(required_level): """ Decorador para verificar nivel de permisos en endpoints de API. Args: required_level (int): Nivel mínimo requerido Returns: function: Decorador configurado """ def decorator(f): @wraps(f) def decorated_function(*args, **kwargs): if not current_user.is_authenticated: return { 'success': False, 'message': 'Autenticación requerida', 'code': 401 }, 401 if not current_user.has_permission(required_level): return { 'success': False, 'message': 'No tiene permisos suficientes para esta acción', 'code': 403 }, 403 return f(*args, **kwargs) return decorated_function return decorator def check_active_user(f): """ Decorador para verificar que el usuario está activo y no ha expirado. Args: f: Función a decorar Returns: function: Función decorada """ @wraps(f) def decorated_function(*args, **kwargs): if not current_user.is_authenticated: return redirect(url_for('auth.login')) if not current_user.is_active(): flash('Su cuenta está desactivada. Contacte al administrador.', 'danger') return redirect(url_for('auth.logout')) if current_user.is_expired(): flash('Su cuenta ha expirado. Contacte al administrador.', 'danger') return redirect(url_for('auth.logout')) return f(*args, **kwargs) return decorated_function def log_activity(activity_type): """ Decorador para registrar actividad del usuario. Args: activity_type (str): Tipo de actividad a registrar Returns: function: Decorador configurado """ def decorator(f): @wraps(f) def decorated_function(*args, **kwargs): # Ejecutar la función original result = f(*args, **kwargs) # Registrar actividad si el usuario está autenticado if current_user.is_authenticated: from utils.logger import log_user_activity # Extraer información relevante user_id = current_user.id ip_address = request.remote_addr user_agent = request.user_agent.string # Registrar actividad log_user_activity( user_id=user_id, activity_type=activity_type, ip_address=ip_address, user_agent=user_agent, details=kwargs ) return result return decorated_function return decorator