forked from val-lop20/Pagina-de-Asistencia-MAC
Primer commit - Sistema de asistencia MAC
This commit is contained in:
@@ -0,0 +1,184 @@
|
||||
#!/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()
|
||||
Reference in New Issue
Block a user