Divide home/views.py en el paquete home/views/ por secciones
El módulo monolítico (~3200 líneas) se convierte en un paquete cuyo __init__.py re-exporta todas las vistas, de modo que `views.X`, `from home.views import X` y la cadena 'home.views.not_found' (handler404) siguen funcionando sin tocar urls.py. Módulos por sección: _base (imports comunes + require_paid_stripe), auth, pages, account, recruit, characters, store, points, guild, history, players y payments. Cada submódulo hereda los imports con `from ._base import *`; las dependencias entre secciones se resuelven con imports explícitos (guild->auth, recruit/history->account). Se eliminan dos definiciones duplicadas que quedaban muertas al cargar: - get_character_image (primera copia, idéntica a la efectiva) - store_novawow_success_view (stub sin SOAP, pisado por la versión real) Validado con `manage.py check` (0 issues), resolución de las 100 rutas y un chequeo estático de nombres no definidos por módulo. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
from ._base import *
|
||||
from .account import get_account_id
|
||||
|
||||
|
||||
def format_datetime(timestamp):
|
||||
if timestamp:
|
||||
return datetime.utcfromtimestamp(timestamp).strftime('%d-%m-%Y %H:%M:%S')
|
||||
return "No disponible"
|
||||
|
||||
|
||||
def get_ban_history(account_id):
|
||||
# Consulta de baneos de la cuenta
|
||||
with connections['acore_auth'].cursor() as cursor:
|
||||
cursor.execute("""
|
||||
SELECT bandate, unbandate, banreason, active, account.username
|
||||
FROM account_banned
|
||||
JOIN account ON account_banned.id = account.id
|
||||
WHERE account_banned.id = %s
|
||||
""", [account_id])
|
||||
account_bans = cursor.fetchall()
|
||||
|
||||
# Formatear las fechas
|
||||
account_bans = [(format_datetime(ban[0]), format_datetime(ban[1]), ban[2], ban[3], ban[4]) for ban in account_bans]
|
||||
|
||||
# Consulta de baneos de los personajes asociados a la cuenta
|
||||
with connections['acore_characters'].cursor() as cursor:
|
||||
cursor.execute("""
|
||||
SELECT bandate, unbandate, banreason, active, characters.name
|
||||
FROM character_banned
|
||||
JOIN characters ON character_banned.guid = characters.guid
|
||||
WHERE characters.account = %s
|
||||
""", [account_id])
|
||||
character_bans = cursor.fetchall()
|
||||
|
||||
# Formatear las fechas
|
||||
character_bans = [(format_datetime(ban[0]), format_datetime(ban[1]), ban[2], ban[3], ban[4]) for ban in character_bans]
|
||||
|
||||
return account_bans, character_bans
|
||||
def calculate_unmute_date(mute_date, mute_duration):
|
||||
if isinstance(mute_date, int):
|
||||
mute_date = datetime.fromtimestamp(mute_date)
|
||||
return mute_date + timedelta(seconds=mute_duration)
|
||||
def ban_history_view(request):
|
||||
# Verificar si el usuario tiene un `username` en la sesión
|
||||
username = request.session.get('username')
|
||||
if not username:
|
||||
return redirect('login')
|
||||
|
||||
# Obtener el account_id a partir del username
|
||||
account_id = get_account_id(username)
|
||||
if not account_id:
|
||||
return redirect('login') # O redirigir a otra página si no se encuentra el account_id
|
||||
|
||||
print(f"Account ID: {account_id}") # Depurar el account_id
|
||||
|
||||
account_bans, character_bans = get_ban_history(account_id)
|
||||
|
||||
return render(request, 'account/ban_history.html', {
|
||||
'account_bans': account_bans,
|
||||
'character_bans': character_bans,
|
||||
'now': datetime.now(),
|
||||
})
|
||||
def security_history_view(request):
|
||||
username = request.session.get('username')
|
||||
if not username:
|
||||
return redirect('login') # Si no está autenticado, redirigir al login
|
||||
|
||||
# Obtener los últimos 20 intentos de inicio de sesión
|
||||
login_attempts = LoginAttempt.objects.filter(username=username).order_by('-timestamp')[:20]
|
||||
|
||||
return render(request, 'account/security_history.html', {'login_attempts': login_attempts})
|
||||
Reference in New Issue
Block a user