plentas / app.py
jfarray's picture
Update app.py
83e0735
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)