106 lines
4.9 KiB
Python
106 lines
4.9 KiB
Python
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)
|