main.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import sys
  2. from pathlib import Path
  3. from flask import Flask, request, jsonify
  4. from waitress import serve
  5. app = Flask(__name__)
  6. # Agregar el directorio lib al path de Python
  7. lib_path = Path(__file__).parent / 'lib'
  8. sys.path.append(str(lib_path))
  9. # Ahora puedes importar los módulos desde el directorio lib
  10. from selenium_setup import configure_selenium
  11. from argument_parser import parse_arguments
  12. from web_navigation import navigate_to_url, click_element
  13. from data_processing import process_html
  14. from database_operations import log
  15. from funciones import *
  16. def main(clave, contraseña):
  17. # Configurar Selenium y navegar a la URL
  18. driver = configure_selenium()
  19. url = "sgu.ulsa.edu.mx/psulsa/alumnos/consultainformacionalumnos/consultainformacion.aspx"
  20. datos_alumno, historial_academico = navigate_to_url(driver, url, clave, contraseña)
  21. materias_sgu, actualmente_cursadas, periodo_actual, grupo_actual = process_html(historial_academico)
  22. insert_actualmente_cursadas(clave, actualmente_cursadas, periodo_actual, grupo_actual)
  23. # Obtener datos de la base
  24. periodos_base = get_periodos(materias_sgu)
  25. # obtener la fecha mínima del arreglo de diccionarios de periodos en su campo "Periodo_fecha_inicio"
  26. fecha_mínima = min(periodos_base, key=lambda x: x['Periodo_fecha_inicial'])['Periodo_fecha_inicial']
  27. # déjalo en el primer día del mes
  28. datos_alumno['fecha_ingreso'] = fecha_mínima.replace(day=1)
  29. materias_base = get_materias(materias_sgu)
  30. tipo_calificaciones_base = get_tipo_calificaciones(materias_sgu)
  31. alumno_base = insert_alumno(datos_alumno)
  32. # Actualizar servicio social
  33. actualizar_servicio(clave, datos_alumno['servicio_social'])
  34. #insert datos
  35. insert_datos(datos_alumno)
  36. calificaciones = []
  37. no_insertadas = []
  38. for materia_sgu in materias_sgu:
  39. 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)
  40. periodo_base = next((periodo_base for periodo_base in periodos_base if periodo_base['Periodo_shortname'] == materia_sgu['PERIODO']), None)
  41. tipo_calificacion_base = next((calificacion_base for calificacion_base in tipo_calificaciones_base if calificacion_base['TipoCalificacion_desc_corta'] == materia_sgu['EXAMEN']), None)
  42. if 'GRUPO' in materia_sgu.keys():
  43. grupo = get_grupo(materia_sgu['GRUPO'], alumno_base['Carrera_id'])
  44. else:
  45. grupo = None
  46. if materia_base and periodo_base and tipo_calificacion_base:
  47. calificaciones.append(f"({clave[2:]}, {materia_base['Materia_id']}, {periodo_base['Periodo_id']}, {tipo_calificacion_base['TipoCalificacion_id']}, {materia_sgu['CALIF']}, CURRENT_DATE, 'SGU')")
  48. if not materia_base or not periodo_base or not tipo_calificacion_base or not grupo:
  49. 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' } ''')
  50. continue
  51. insert_materia(clave, materia_base['Materia_id'], periodo_base['Periodo_id'], grupo['Grupo_id'])
  52. if not calificaciones or len(calificaciones) == 0:
  53. raise Exception("No hay calificaciones para insertar o actualizar.")
  54. # Insertar calificaciones
  55. insert_calificaciones(calificaciones)
  56. return clave, no_insertadas
  57. @app.route('/calificaciones', methods=['POST'])
  58. def calificaciones():
  59. try:
  60. # Obtener la clave y la contraseña de la solicitud POST
  61. clave = request.form.get('clave')
  62. contraseña = request.form.get('contraseña')
  63. # Verificar si la clave y la contraseña existen
  64. if clave is None or contraseña is None:
  65. return "Error: La clave y/o contraseña no fueron proporcionadas en la solicitud."
  66. # Procesar los datos (aquí llamamos a la función main)
  67. clave, no_insertadas = main(clave, contraseña)
  68. # Registro de éxito
  69. log("Proceso terminado con éxito.", 200, None, clave, no_insertadas)
  70. # Retornar respuesta exitosa como JSON
  71. return jsonify({"mensaje": "Proceso terminado con éxito.", "clave": clave, "no_insertadas": no_insertadas, "success": True})
  72. except Exception as e:
  73. # remove all ' from the error message
  74. e = e.replace("'", "")
  75. log(str(e), 500, e, None)
  76. # Retornar mensaje de error como JSON
  77. return jsonify({"mensaje": str(e), "success": False})
  78. if __name__ == "__main__":
  79. serve(app, host='0.0.0.0', port=5000)