123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- 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)
|