ff458379b0
ban_history_view construye ban_rows (baneos de cuenta + personaje combinados, con estado Activo/Inactivo y origen Cuenta/Personaje) y los pasa por json_script a la tabla genérica HistoryTable. Sustituye la tabla Django con doble bucle. Verificado: check OK, render de la isla con datos, redirige a login sin sesión. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
98 lines
3.5 KiB
Python
98 lines
3.5 KiB
Python
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)
|
|
|
|
def _row(b, origen):
|
|
return {
|
|
'fecha_baneo': b[0] or 'No disponible',
|
|
'fecha_desbaneo': b[1] or 'No disponible',
|
|
'motivo': b[2],
|
|
'estado': 'Activo' if b[3] == 1 else 'Inactivo',
|
|
'origen': f'{origen}: {b[4]}',
|
|
}
|
|
|
|
ban_rows = ([_row(b, 'Cuenta') for b in account_bans]
|
|
+ [_row(b, 'Personaje') for b in character_bans])
|
|
|
|
return render(request, 'account/ban_history.html', {
|
|
'account_bans': account_bans,
|
|
'character_bans': character_bans,
|
|
'ban_rows': ban_rows,
|
|
'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]
|
|
|
|
login_attempts_data = [
|
|
{
|
|
'username': a.username,
|
|
'status': a.status,
|
|
'ip_address': a.ip_address,
|
|
'timestamp': a.timestamp.strftime('%d-%m-%Y %H:%M:%S') if a.timestamp else '',
|
|
}
|
|
for a in login_attempts
|
|
]
|
|
|
|
return render(request, 'account/security_history.html', {
|
|
'login_attempts': login_attempts,
|
|
'login_attempts_data': login_attempts_data,
|
|
})
|