import gradio as gr import json from flask import jsonify from sentence_transformers import SentenceTransformer, InputExample, util from codeScripts.utils import save_json, load_json, create_file_path from plentas import Plentas import pandas as pd import zipfile import os def Main(configuration, uploadedFile): error = "" modelResult = "" configuration_dict = json.loads(configuration) try: uploadedFilePath = uploadedFile.name config_json = load_json("configV2.json") #configuring plentas methodology response = Plentas(config_json[0], [answersTodict(uploadedFilePath), createTeacherJson(configuration_dict)]) # #overwriting the custom settings for the settings from the api response.setApiSettings(configuration) modelResult = jsonify(response.processApiData()) except Exception as e: error = "Oops: " + str(e) return [error, modelResult] def createTeacherJson(configuration): """ This function extracts the information about the subquestions and subanswers and puts them in the correct format. Inputs: config: The configured info from the api. Outputs: teachersJson: The generated dictionary with the subquestions. """ teachersJson = {"enunciado": "", "minipreguntas":[], "keywords":""} #5 is the maximum number of permitted subquestions in the configuration2 page for i in range(5): try: teachersJson["minipreguntas"].append({ "minipregunta": configuration["minip" + str(i+1)], "minirespuesta": configuration["minir" + str(i+1)] }) except: break return teachersJson def extractZipData(ruta_zip): """ This function extracts the students's answers from the zip file (the one the teacher has in the task section). Inputs: ruta_zip: The path inherited from answersTodict """ #defining the path where the extracted info is to be stored ruta_extraccion = create_file_path("StudentAnswers/", doctype= 1) #extracting the info archivo_zip = zipfile.ZipFile(ruta_zip, "r") try: archivo_zip.extractall(pwd=None, path=ruta_extraccion) except: pass archivo_zip.close() def removeHtmlFromString(string): """ This function removes the html tags from the student's response. Inputs: -string: The student's response Outputs: -new_string: The filtered response """ string = string.encode('utf-8', 'replace') string = string.decode('utf-8', 'replace') new_string = "" skipChar = 0 for char in string: if char == "<": skipChar = 1 elif char == ">": skipChar = 0 else: if not skipChar: new_string = new_string+char new_string = new_string.encode('utf-8', 'replace') new_string = new_string.decode('utf-8', 'replace') return new_string def answersTodict(zip_path): """ This function extracts the students's answers and stacks them in one specific format so that it can be processed next. Inputs: ruta_zip: The path where the zip file is stored Outputs: studentAnswersDict: The dictionary with all the responses """ #extracting the data extractZipData(zip_path) studentAnswersDict = [] #stacking the information of each extracted folder for work_folder in os.listdir(create_file_path("StudentAnswers/", doctype= 1)): for student, indx in zip(os.listdir(create_file_path("StudentAnswers/" + work_folder, doctype= 1)), range(len(os.listdir(create_file_path("StudentAnswers/" + work_folder, doctype= 1))))): student_name = student.split("(") student_name = student_name[0] try: #opening the file #fichero = open(create_file_path("StudentAnswers/" + work_folder + "/" + student + "/" + 'comments.txt', doctype= 1)) #where the actual response is fichero = open(create_file_path("StudentAnswers/" + work_folder + "/" + student + "/" + 'Adjuntos del envio/Respuesta enviada', doctype= 1), encoding='utf-8') #reading it lineas = fichero.readlines() #removing html lineas[0] = removeHtmlFromString(lineas[0]) #saving it studentAnswersDict.append({"respuesta":lineas[0], "hashed_id":student_name, "TableIndex":indx}) except: studentAnswersDict.append({"respuesta":"", "hashed_id":student_name, "TableIndex":indx}) #saving the final dictionary save_json(create_file_path('ApiStudentsDict.json', doctype= 1),studentAnswersDict) return studentAnswersDict configuration = gr.inputs.Textbox(lines=10, placeholder="JSON de ConfiguraciĆ³n") zipFileInput = gr.inputs.File(label="ZIP file") #dataFrameOutput = gr.outputs.Dataframe(headers=["Resultados"], max_rows=20, max_cols=None, overflow_row_behaviour="paginate", type="pandas", label="Resultado") labelOutput = gr.outputs.Label(num_top_classes=None, type="auto", label="") labelError = gr.outputs.Label(num_top_classes=None, type="auto", label="") iface = gr.Interface(fn=Main , inputs=[configuration, zipFileInput] , outputs=[labelError, labelOutput] , title = "PLENTAS" ) iface.launch(share = False,enable_queue=True, show_error =True, server_port=7870)