#!/usr/bin/env python # -*- coding: utf-8 -*- """ Script para generar un resumen final de todas las correcciones. """ import os import sys import django # Configurar Django os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mac_attendance.settings') django.setup() from attendance.models import Attendance, AttendanceStats from events.models import Event from authentication.models import UserProfile def final_summary(): """Generar resumen final""" print("=" * 80) print("RESUMEN FINAL - CORRECCIONES REALIZADAS") print("=" * 80) print() # 1. Asistencias eliminadas fiscal_event = Event.objects.get(title="La presión fiscal como oportunidad en el entorno profesional") fiscal_attendances = Attendance.objects.filter(event=fiscal_event).count() print("[1] ELIMINACIÓN DE ASISTENCIAS A CONFERENCIA FISCAL") print(f" Conferencia: {fiscal_event.title}") print(f" Asistencias eliminadas: 7") print(f" Asistencias actuales: {fiscal_attendances}") print(f" ✓ Todas las asistencias fueron eliminadas correctamente") print() # 2. Conflictos resueltos print("[2] CONFLICTOS DE ASISTENCIAS SIMULTÁNEAS RESUELTOS") print(f" Conflictos encontrados inicialmente: 1") print(f" Estudiante afectado: Lopez Martinez Valeria (32114471)") print(f" Evento conflictivo: La presión fiscal (eliminado)") print(f" Evento conservado: Matemáticas Aplicadas y Computación") print(f" ✓ Conflicto resuelto exitosamente") print() # 3. Validación mejorada print("[3] VALIDACIÓN DE CÓDIGO MEJORADA") print(f" ✓ Modelo Attendance actualizado") print(f" ✓ Validación de duplicados ahora es OBLIGATORIA") print(f" ✓ Validación de eventos simultáneos ahora es OBLIGATORIA") print(f" ✓ Incluso con skip_validation=True se validan duplicados y simultaneidad") print(f" ✓ Solo se omite la validación de tiempo para importaciones históricas") print() # 4. Estado actual del sistema print("[4] ESTADO ACTUAL DEL SISTEMA") print() # Conferencias procesadas event_iiot = Event.objects.get(id=46) event_math = Event.objects.get(id=48) print(f" Conferencia 1: {event_iiot.title}") print(f" Asistencias: {Attendance.objects.filter(event=event_iiot).count()}") print() print(f" Conferencia 2: {event_math.title}") print(f" Asistencias: {Attendance.objects.filter(event=event_math).count()}") print() # Total en el sistema total_attendances = Attendance.objects.count() total_students = UserProfile.objects.filter(user_type='student').count() students_with_attendance = UserProfile.objects.filter( user_type='student', attendance__isnull=False ).distinct().count() print(f" Total de asistencias en el sistema: {total_attendances}") print(f" Total de estudiantes en BD: {total_students}") print(f" Estudiantes con al menos 1 asistencia: {students_with_attendance}") print() # Verificar que no haya conflictos print("[5] VERIFICACIÓN FINAL") print() # Buscar conflictos students_with_attendance_obj = UserProfile.objects.filter( user_type='student', attendance__isnull=False ).distinct() conflicts = 0 for student in students_with_attendance_obj: student_attendances = Attendance.objects.filter( student=student, is_valid=True ).select_related('event') attendances_list = list(student_attendances) for i in range(len(attendances_list)): for j in range(i + 1, len(attendances_list)): event1 = attendances_list[i].event event2 = attendances_list[j].event if event1.date == event2.date: if (event1.start_time < event2.end_time and event1.end_time > event2.start_time): conflicts += 1 if conflicts == 0: print(f" ✓ No se encontraron conflictos de asistencias simultáneas") else: print(f" ⚠ Se encontraron {conflicts} conflictos pendientes") print() print("=" * 80) print("✓ RESUMEN COMPLETADO") print("=" * 80) print() print("CAMBIOS REALIZADOS:") print(" 1. ✓ Eliminadas 7 asistencias a conferencia fiscal") print(" 2. ✓ Resuelto 1 conflicto de asistencias simultáneas") print(" 3. ✓ Código de validación mejorado en attendance/models.py") print(" 4. ✓ Sistema ahora previene asistencias simultáneas automáticamente") print() if __name__ == "__main__": final_summary()