Files
NightSpire/home/views/history.py
T
Inna 230d401c75 Fase 3 (islas): historiales de seguridad y transacciones en React/TSX
Tabla genérica reutilizable HistoryTable (columnas por data-columns, filas por
json_script) + entry history_table:
- security_history: intentos de conexión (username/status/ip/fecha). Se elimina la
  caja "actividad" duplicada. Las vistas pasan login_attempts_data serializable.
- trans_history: historial de transacciones (StripeLog) con transactions_data.

Datos embebidos con json_script (sin endpoint extra). Verificado: check OK, ambas
plantillas renderizan la isla con datos.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-12 21:52:20 +00:00

85 lines
3.1 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)
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]
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,
})