forked from val-lop20/Pagina-de-Asistencia-MAC
185 lines
6.9 KiB
Python
185 lines
6.9 KiB
Python
#!/usr/bin/env python
|
|
"""Script para crear datos de prueba VÁLIDOS respetando todas las validaciones"""
|
|
import os
|
|
import django
|
|
from datetime import datetime, time, timedelta
|
|
|
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mac_attendance.settings')
|
|
django.setup()
|
|
|
|
from django.contrib.auth.models import User
|
|
from django.utils import timezone
|
|
from authentication.models import UserProfile, Asistente
|
|
from events.models import Event
|
|
from attendance.models import Attendance, AttendanceStats
|
|
|
|
def create_valid_test_data():
|
|
print("[+] Creando datos de prueba VALIDOS...")
|
|
|
|
# Obtener o crear un asistente para registrar asistencias
|
|
try:
|
|
asistente_profile = UserProfile.objects.get(user_type='assistant')
|
|
print(f"[OK] Asistente encontrado: {asistente_profile.full_name}")
|
|
except UserProfile.DoesNotExist:
|
|
print("[ERROR] No hay asistentes en el sistema. Por favor crea uno primero.")
|
|
return
|
|
|
|
# Verificar estudiantes existentes
|
|
estudiantes = UserProfile.objects.filter(user_type='student')
|
|
if estudiantes.count() < 3:
|
|
print("[+] Creando estudiantes de prueba...")
|
|
estudiantes_data = [
|
|
('3001001', 'María González López'),
|
|
('3001002', 'Juan Pérez Martínez'),
|
|
('3001003', 'Ana Rodríguez Sánchez'),
|
|
('3001004', 'Carlos López García'),
|
|
('3001005', 'Laura Martínez Ruiz'),
|
|
]
|
|
|
|
for account, name in estudiantes_data:
|
|
if UserProfile.objects.filter(account_number=account).exists():
|
|
print(f"[SKIP] Estudiante {account} ya existe")
|
|
continue
|
|
|
|
user = User.objects.create_user(
|
|
username=account,
|
|
first_name=name,
|
|
password=None
|
|
)
|
|
user.set_unusable_password()
|
|
user.save()
|
|
|
|
UserProfile.objects.create(
|
|
user=user,
|
|
account_number=account,
|
|
full_name=name,
|
|
user_type='student'
|
|
)
|
|
print(f"[OK] Estudiante creado: {name} ({account})")
|
|
|
|
estudiantes = list(UserProfile.objects.filter(user_type='student')[:5])
|
|
print(f"[OK] {len(estudiantes)} estudiantes disponibles")
|
|
|
|
# Obtener hora actual en timezone local
|
|
now = timezone.now()
|
|
now_local = timezone.localtime(now)
|
|
today = now_local.date()
|
|
|
|
print(f"\n[INFO] Fecha/Hora actual (local): {now_local.strftime('%Y-%m-%d %H:%M:%S')}")
|
|
print(f"[INFO] Timezone: {timezone.get_current_timezone()}")
|
|
|
|
# Crear eventos para HOY con horarios fijos que funcionen
|
|
# Como estamos en la noche, usamos eventos con margen suficiente
|
|
|
|
from datetime import date
|
|
tomorrow = (now_local + timedelta(days=1)).date()
|
|
|
|
eventos_data = []
|
|
|
|
# Evento 1: Mañana 9:00-11:00 (aún no permite asistencias)
|
|
eventos_data.append((
|
|
'Introducción a la Inteligencia Artificial',
|
|
'Dr. Luis Martínez',
|
|
time(9, 0),
|
|
time(11, 0),
|
|
tomorrow
|
|
))
|
|
|
|
# Evento 2: Mañana 13:00-15:00 (aún no permite asistencias)
|
|
eventos_data.append((
|
|
'Análisis de Datos con Python',
|
|
'Ing. Patricia Gómez',
|
|
time(13, 15),
|
|
time(15, 0),
|
|
tomorrow
|
|
))
|
|
|
|
# Evento 3: Mañana 16:00-18:00 (aún no permite asistencias)
|
|
eventos_data.append((
|
|
'Taller de Machine Learning',
|
|
'Dra. Ana López',
|
|
time(16, 0),
|
|
time(18, 0),
|
|
tomorrow
|
|
))
|
|
|
|
eventos = []
|
|
for title, speaker, start, end, event_date in eventos_data:
|
|
# Verificar si ya existe
|
|
if Event.objects.filter(title=title, date=event_date).exists():
|
|
print(f"[SKIP] Evento '{title}' ya existe")
|
|
eventos.append(Event.objects.get(title=title, date=event_date))
|
|
continue
|
|
|
|
evento = Event.objects.create(
|
|
title=title,
|
|
speaker=speaker,
|
|
date=event_date,
|
|
start_time=start,
|
|
end_time=end,
|
|
event_type='lecture',
|
|
modality='presential',
|
|
location='Auditorio Principal',
|
|
description=f'Evento de prueba: {title}',
|
|
created_by=asistente_profile,
|
|
is_active=True
|
|
)
|
|
eventos.append(evento)
|
|
print(f"[OK] Evento creado: {title} ({event_date} {start.strftime('%H:%M')}-{end.strftime('%H:%M')})")
|
|
|
|
# Intentar crear asistencias (TODAS deberían fallar porque los eventos son mañana)
|
|
print("\n[+] Intentando registrar asistencias para eventos de mañana...")
|
|
print("[NOTA] TODAS las asistencias deberían fallar porque los eventos son mañana")
|
|
|
|
asistencias_creadas = 0
|
|
for i, evento in enumerate(eventos):
|
|
estudiante = estudiantes[i] if i < len(estudiantes) else estudiantes[0]
|
|
print(f"\n[TEST] Intentando registrar en: {evento.title} ({evento.date} {evento.start_time})")
|
|
try:
|
|
# Verificar si ya existe
|
|
if Attendance.objects.filter(student=estudiante, event=evento).exists():
|
|
print(f" [SKIP] {estudiante.full_name} ya tiene asistencia")
|
|
continue
|
|
|
|
att = Attendance.objects.create(
|
|
student=estudiante,
|
|
event=evento,
|
|
registered_by=asistente_profile,
|
|
registration_method='manual',
|
|
is_valid=True
|
|
)
|
|
print(f" [ERROR] Se permitió registro (NO DEBERÍA) - Asistencia: {estudiante.full_name}")
|
|
asistencias_creadas += 1
|
|
except Exception as e:
|
|
error_msg = str(e)
|
|
if "No se puede registrar asistencia antes del evento" in error_msg:
|
|
print(f" [OK] Validación funcionó correctamente - Evento es mañana")
|
|
else:
|
|
print(f" [OK] Validación funcionó: {error_msg[:80]}...")
|
|
|
|
# Actualizar estadísticas
|
|
print("\n[+] Actualizando estadísticas...")
|
|
for estudiante in estudiantes:
|
|
stats, created = AttendanceStats.objects.get_or_create(student=estudiante)
|
|
stats.update_stats()
|
|
print(f" {estudiante.full_name}: {stats.attendance_percentage}% asistencia")
|
|
|
|
print("\n" + "="*70)
|
|
print("[OK] Datos de prueba creados exitosamente!")
|
|
print("="*70)
|
|
print(f"\n[RESUMEN]")
|
|
print(f" - Estudiantes: {len(estudiantes)}")
|
|
print(f" - Eventos creados: {len(eventos)}")
|
|
print(f" - Asistencias válidas: {asistencias_creadas}")
|
|
print(f" - Fecha/Hora: {now_local.strftime('%Y-%m-%d %H:%M:%S')}")
|
|
print(f"\n[INFO] Ahora puedes:")
|
|
print(f" 1. Ir a http://127.0.0.1:8000/admin/")
|
|
print(f" 2. Ver eventos en 'Events' - eventos para mañana {tomorrow}")
|
|
print(f" 3. Ver asistencias en 'Attendances' - debería estar vacío")
|
|
print(f" 4. Ver estadísticas en 'Attendance stats'")
|
|
print(f"\n[NOTA] Las asistencias solo se pueden registrar durante los eventos")
|
|
print(f"[NOTA] Mañana {tomorrow} a partir de las 8:50 AM se podrán registrar asistencias")
|
|
|
|
if __name__ == '__main__':
|
|
create_valid_test_data()
|