import sys from pathlib import Path from flask import Flask, request, jsonify from waitress import serve app = Flask(__name__) # Agregar el directorio lib al path de Python lib_path = Path(__file__).parent / 'lib' sys.path.append(str(lib_path)) # Ahora puedes importar los módulos desde el directorio lib from selenium_setup import configure_selenium from argument_parser import parse_arguments from web_navigation import navigate_to_url, click_element from data_processing import process_html from database_operations import log from funciones import * def main(clave, contraseña): # Configurar Selenium y navegar a la URL driver = configure_selenium() url = "sgu.ulsa.edu.mx/psulsa/alumnos/consultainformacionalumnos/consultainformacion.aspx" datos_alumno, historial_academico = navigate_to_url(driver, url, clave, contraseña) materias_sgu, actualmente_cursadas, periodo_actual, grupo_actual = process_html(historial_academico) insert_actualmente_cursadas(clave, actualmente_cursadas, periodo_actual, grupo_actual) # Obtener datos de la base periodos_base = get_periodos(materias_sgu) # obtener la fecha mínima del arreglo de diccionarios de periodos en su campo "Periodo_fecha_inicio" fecha_mínima = min(periodos_base, key=lambda x: x['Periodo_fecha_inicial'])['Periodo_fecha_inicial'] # déjalo en el primer día del mes datos_alumno['fecha_ingreso'] = fecha_mínima.replace(day=1) materias_base = get_materias(materias_sgu) tipo_calificaciones_base = get_tipo_calificaciones(materias_sgu) alumno_base = insert_alumno(datos_alumno) # Actualizar servicio social actualizar_servicio(clave, datos_alumno['servicio_social']) #insert datos insert_datos(datos_alumno) calificaciones = [] no_insertadas = [] for materia_sgu in materias_sgu: materia_base = next((materia_base for materia_base in materias_base if materia_sgu['Cve ULSA'] in materia_base['Materia_claves'] or (materia_sgu['Cve SEP'] in materia_base["Materia_claves"] and alumno_base['PlanEstudio_id'] == materia_base['PlanEstudio_id'])), None) periodo_base = next((periodo_base for periodo_base in periodos_base if periodo_base['Periodo_shortname'] == materia_sgu['PERIODO']), None) tipo_calificacion_base = next((calificacion_base for calificacion_base in tipo_calificaciones_base if calificacion_base['TipoCalificacion_desc_corta'] == materia_sgu['EXAMEN']), None) if 'GRUPO' in materia_sgu.keys(): grupo = get_grupo(materia_sgu['GRUPO'], alumno_base['Carrera_id']) else: grupo = None if materia_base and periodo_base and tipo_calificacion_base: calificaciones.append(f"({clave[2:]}, {materia_base['Materia_id']}, {periodo_base['Periodo_id']}, {tipo_calificacion_base['TipoCalificacion_id']}, {materia_sgu['CALIF']}, CURRENT_DATE, 'SGU')") if not materia_base or not periodo_base or not tipo_calificacion_base or not grupo: no_insertadas.append(f'''Materia: {materia_base['Materia_id'] if materia_base else materia_sgu['Cve ULSA']} - Periodo_base: {periodo_base['Periodo_id'] if periodo_base else materia_sgu['PERIODO']} Tipo_calificacion_base: {tipo_calificacion_base['TipoCalificacion_id'] if tipo_calificacion_base else materia_sgu['EXAMEN']} Grupo: {grupo['Grupo_id'] if grupo else materia_sgu['GRUPO'] if 'GRUPO' in materia_sgu.keys() else 'None' } ''') continue insert_materia(clave, materia_base['Materia_id'], periodo_base['Periodo_id'], grupo['Grupo_id']) if not calificaciones or len(calificaciones) == 0: raise Exception("No hay calificaciones para insertar o actualizar.") # Insertar calificaciones insert_calificaciones(calificaciones) return clave, no_insertadas @app.route('/calificaciones', methods=['POST']) def calificaciones(): try: # Obtener la clave y la contraseña de la solicitud POST clave = request.form.get('clave') contraseña = request.form.get('contraseña') # Verificar si la clave y la contraseña existen if clave is None or contraseña is None: return "Error: La clave y/o contraseña no fueron proporcionadas en la solicitud." # Procesar los datos (aquí llamamos a la función main) clave, no_insertadas = main(clave, contraseña) # Registro de éxito log("Proceso terminado con éxito.", 200, None, clave, no_insertadas) # Retornar respuesta exitosa como JSON return jsonify({"mensaje": "Proceso terminado con éxito.", "clave": clave, "no_insertadas": no_insertadas, "success": True}) except Exception as e: # remove all ' from the error message e = e.replace("'", "") log(str(e), 500, e, None) # Retornar mensaje de error como JSON return jsonify({"mensaje": str(e), "success": False}) if __name__ == "__main__": serve(app, host='0.0.0.0', port=5000)