class Evaluacion(gj.Document): alumno = db.ReferenceField(Alumno) curso = db.ReferenceField(Curso) acierto = db.IntField(default=0) creado = db.DateTimeField(default=datetime.now) actualizado = db.DateTimeField(default=datetime.now) respuestas = db.ListField(db.EmbeddedDocumentField(Respuesta)) json = db.StringField() meta = {'strict': False} def save(self, *args): self.actualizado = datetime.now() super().save() def to_dict(self): contenidos_respuesta = [] for respuesta in self.respuestas: contenidos_respuesta.append(respuesta.to_dict()) return { "id": str(self.id), "alumno": self.alumno.to_dict(False), "recurso": str(self.curso.id), "recurso_nombre": self.curso.nombre, "respuestas": contenidos_respuesta, "acierto": self.acierto }
class SuperAdmin(db.Document, UserMixin): email = db.EmailField() password = db.StringField() active = db.BooleanField(default=True) confirmed_at = db.DateTimeField() created = db.DateTimeField(default=datetime.now) updated = db.DateTimeField(default=datetime.now) meta = {'strict': False} def encrypt_password(self, password_to_encrypt): self.password = hash_password(password_to_encrypt) def check_password(self, password_to_check): return verify_password(self.password, str(password_to_check).strip())
class Historial(db.EmbeddedDocument): fecha = db.DateTimeField(default=datetime.now) data = db.StringField() meta = {'strict': False} def to_dict(self): return {"fecha": str(self.fecha), "data": self.data}
class CursoBase(gj.Document): nombre = db.StringField(verbose_name="Nombre curso", max_length=200) descripcion = db.StringField() fecha_creacion = db.DateTimeField(default=datetime.now) contenidos = db.ListField(db.EmbeddedDocumentField(Contenido)) institucion = db.ReferenceField(Institucion) categoria = db.ReferenceField(Categoria) habilidades = db.ListField(db.ReferenceField(Habilidad)) imagen = db.StringField() meta = {'strict': False} def __str__(self): return self.nombre def to_dict(self): contenidos = [] for contenido in self.contenidos: contenidos.append(contenido.to_dict()) habilidades = [] for habilidad in self.habilidades: habilidades.append(habilidad.to_dict()) return{ "id": str(self.id), "nombre": self.nombre, "descripcion": self.descripcion, "fecha_creacion": str(self.fecha_creacion), "contenidos": contenidos, "imagen": self.imagen, "categoria": self.categoria.to_dict(), "habilidades": habilidades }
class Evento(gj.Document): title = db.StringField(max_length=256) start = db.DateTimeField() backgroundColor = db.StringField() textColor = db.StringField(default="white") cursos = db.ListField(db.ReferenceField(Curso)) activo = db.BooleanField(default=False) eliminado = db.BooleanField(default=False) def setStart(self): mes = str(self.start.month) dia = str(self.start.day) if len(str(self.start.month)) is 1: mes = "0" + str(self.start.month) if len(str(self.start.day)) is 1: dia = "0" + str(self.start.day) return str(self.start.year) + "-" + mes + "-" + dia def to_dict(self): cursos = [] for curso in self.cursos: cursos.append(curso.nombre) return { "id": str(self.id), "title": self.title, "start": self.setStart(), "backgroundColor": self.backgroundColor, "textColor": self.textColor, "cursos": cursos, "activo": self.activo }
class EventModel(db.Document): name = db.StringField(required=True) organizer = db.StringField() location = db.StringField() about = db.StringField() attendees = db.ListField(default=[]) date = db.DateTimeField() event_type = db.StringField(default='other', choices=[ 'tech', 'science', 'finance', 'artisan skills', 'health', 'education', 'art', 'other' ]) meta = {'collection': 'events'} def json(self): return json.loads(self.to_json()) def save_to_db(self): self.save() def delete_from_db(self): self.delete()
class Blockchainid(db.Document): # metadata created_at = db.DateTimeField(default=datetime.datetime.now, required=True) # account data username = db.StringField(max_length=255, required=True) profile = db.StringField(required=True) transfer_address = db.StringField(max_length=255, required=True)
class User(db.Document, UserMixin): email = db.StringField(max_length=255) password = db.StringField(max_length=255) active = db.BooleanField(default=True) confirmed_at = db.DateTimeField() roles = db.ListField(db.ReferenceField(Role), default=[]) def __unicode__(self): return self.email
class Product(db.Document): meta = {"collection": "products", "queryset_class": MyQuerySet} name = db.StringField(required=True) description = db.StringField(required=True) price = db.DecimalField(0, precision=2, required=True) location = db.EmbeddedDocumentField(Location, required=True) dateAdded = db.DateTimeField(default=datetime.now, required=True) seller = db.LazyReferenceField(User, reverse_delete_rule=2, required=True) def to_json(self): data = self.to_mongo() data["seller"] = loads(self.seller.fetch().to_json()) return json_util.dumps(data)
class Justificacion(db.Document): fecha = db.DateTimeField(default=datetime.now) asistencia = db.ReferenceField(Asistencia) alumno = db.ReferenceField(Alumno) causa = db.StringField(max_length=200) activo = db.BooleanField(default=True) def to_dict(self): return { "id": str(self.id), "asistencia": self.asistencia.to_dict_short(), "alumno": self.alumno.to_dict(), "causa": self.causa, "fecha": self.fecha.strftime("%Y/%m/%d %H:%M:%S") }
class Alerta(db.Document): tipo = db.StringField(choices=TIPOS_ALERTA) alumno = db.ReferenceField(Alumno) asignatura = db.ReferenceField(Asignatura) data = db.StringField(max_length=250) fecha = db.DateTimeField(default=datetime.now) historial = db.ListField(db.EmbeddedDocumentField(Historial)) def to_dict(self): return { "id": str(self.id), "alumno": self.alumno.to_dict(), "data": self.data, "fecha": self.fecha.strftime("%m/%d/%Y %H:%M:%S"), "tipo": self.tipo, "asignatura": self.asignatura.to_dict() }
class CursoBase(gj.Document): nombre = db.StringField(verbose_name="Nombre curso", max_length=200) descripcion = db.StringField() fecha_creacion = db.DateTimeField(default=datetime.now) contenidos = db.ListField(db.EmbeddedDocumentField(Contenido)) categoria = db.ReferenceField(Categoria, requiered=True) habilidades = db.ListField(db.ReferenceField(Habilidad)) imagen = db.StringField() # juego android = db.URLField(help_text="Url para android") ios = db.URLField(help_text="Url para ios") meta = {'strict': False} def __str__(self): return self.nombre def to_dict(self): contenidos = [] contador = 0 for contenido in self.contenidos: contenido.indentificador = contador contenidos.append(contenido.to_dict()) contador = contador + 1 habilidades = [] for habilidad in self.habilidades: habilidades.append(habilidad.to_dict()) categoria = {} if self.categoria: categoria = self.categoria.to_dict() self.save() return { "id": str(self.id), "nombre": self.nombre, "descripcion": self.descripcion, "fecha_creacion": str(self.fecha_creacion), "contenidos": contenidos, "imagen": self.imagen, "categoria": categoria, "habilidades": habilidades }
class ObservacionProfesor(gj.Document): titulo = db.StringField(max_length=30) contenido = db.StringField(max_length=200) anonimo = db.StringField(choices=ANONIMATO) alumno = db.ReferenceField(Alumno) profesor = db.ReferenceField(Profesor) fecha = db.DateTimeField(default=datetime.now) def to_dict(self): return{ "id": str(self.id), "titulo": self.titulo, "contenido": self.contenido, "anonimo": self.anonimo, "alumno": self.alumno.to_dict(), "profesor": self.profesor.to_dict(), "fecha": self.fecha.strftime("%Y/%m/%d %H:%M:%S") }
class Observacion(gj.Document): titulo = db.StringField(max_length=30) contenido = db.StringField(max_length=200) tipo = db.StringField(choices=TIPOS_OBSERVACION) nombre_personal = db.StringField(max_length=30) alumno = db.ReferenceField(Alumno) fecha = db.DateTimeField(default=datetime.now) def to_dict(self): return{ "id": str(self.id), "titulo": self.titulo, "contenido": self.contenido, "tipo": self.tipo, "nombre_personal": self.nombre_personal, "alumno": self.alumno.to_dict(), "fecha": self.fecha.strftime("%Y/%m/%d %H:%M:%S") }
class ArticleModel(db.Document): title = db.StringField(required=True) content = db.StringField() author = db.StringField() date = db.DateTimeField() article_type = db.StringField(default='other', choices=['business news', 'tech news', 'science news', 'other']) meta = {'collection': 'articles'} def json(self): return json.loads(self.to_json()) def save_to_db(self): self.save() def delete_from_db(self): self.delete()
class Curso(gj.Document): nombre = db.StringField(verbose_name="Nombre curso", max_length=200) fecha_creacion = db.DateTimeField(default=datetime.now) contenidos = db.ListField(db.EmbeddedDocumentField(Contenido)) asignatura = db.ReferenceField(Asignatura) institucion = db.ReferenceField(Institucion) profesor = db.ReferenceField(Profesor) categoria = db.ReferenceField(Categoria) alumnos = db.ListField(db.ReferenceField(Alumno)) activo = db.BooleanField(default=True) version = db.StringField(default="1.0") curso_base = db.ReferenceField(CursoBase) descripcion = db.StringField() aprobacion = db.IntField(default=0) imagen = db.StringField() habilidades = db.ListField(db.ReferenceField(Habilidad)) meta = {'strict': False} def __str__(self): return self.nombre def to_dict(self, full=True): data = { "id": str(self.id), "nombre": self.nombre, "fecha_creacion": str(self.fecha_creacion), "profesor": self.profesor.to_dict(), "activo": self.activo, "version": self.version, "descripcion": self.descripcion, "imagen": self.imagen, "curso_base": self.curso_base.to_dict(), "categoria": self.categoria.to_dict() } if full: data.update({ "contenidos": [x.to_dict() for x in self.contenidos], "asignatura": self.asignatura.to_dict(), "alumnos": [x.to_dict() for x in self.alumnos], "aprobacion": self.aprobacion, "curso_base": self.curso_base.to_dict(), "habilidades": [x.to_dict() for x in self.habilidades] }) return data
class Institucion(gj.Document): nombre = db.StringField(verbose_name="Nombre Institucion", max_length=200) fecha_creacion = db.DateTimeField(default=datetime.now) logo = db.StringField() identificador = db.StringField() meta = {'strict': False} def __str__(self): return self.nombre def to_dict(self): return{ "id": str(self.id), "nombre": self.nombre, "fecha_creacion": str(self.fecha_creacion), "logo": self.logo, "identificador": self.identificador }
class Asistencia(db.Document): fecha = db.DateTimeField(default=datetime.now) curso = db.ReferenceField(Curso) asignatura = db.ReferenceField(Asignatura) alumnos_presentes = db.ListField(db.ReferenceField(Alumno)) alumnos_ausentes = db.ListField(db.ReferenceField(Alumno)) def to_dict_short(self): return { "id": str(self.id), "asignatura": self.asignatura.nombre, "alumnos_presentes": len(self.alumnos_presentes), "alumnos_ausentes": len(self.alumnos_ausentes), "curso": self.curso.nombre, "fecha": self.fecha.strftime("%Y/%m/%d %H:%M:%S"), } def to_dict(self): curso = Curso.objects(id=self.curso.id).first() asignatura = Asignatura.objects(id=self.asignatura.id).first() alumnos_presentes = [] alumnos_ausentes = [] for alumno in self.alumnos_presentes: alumno_aux = Alumno.objects(id=alumno.id).first() alumnos_presentes.append(alumno_aux.to_dict()) for alumno in self.alumnos_ausentes: alumno_aux = Alumno.objects(id=alumno.id).first() alumnos_ausentes.append(alumno_aux.to_dict()) return { "id": str(self.id), "asignatura": asignatura.to_dict(), "alumnos_presentes": alumnos_presentes, "alumnos_ausentes": alumnos_ausentes, "curso": self.curso.to_dict(), "fecha": self.fecha.strftime("%Y/%m/%d %H:%M:%S") }
class History(db.Document): date = db.DateTimeField(required=True) list = db.ListField(DataRecord) user = db.ReferenceField(Account)
class Email(db.Document): # metadata created_at = db.DateTimeField(default=datetime.datetime.now, required=True) # account data address = db.EmailField(required=True, unique=True) email_list = db.StringField(max_length=255, required=True)
class TokenBlocklist(db.Document, BaseMixin): jti = db.StringField(max_length=36) created_at = db.DateTimeField(default=datetime.utcnow())
class Archivo(gj.Document): nombre = db.StringField(verbose_name="Nombre Archivo", max_length=200) path = db.StringField(verbose_name="Path", max_length=200) asignatura = db.ReferenceField(Asignatura) fecha = db.DateTimeField(default=datetime.now) meta = {'strict': False} def __str__(self): return self.nombre def to_dict(self): return { "id": str(self.id), "nombre": self.nombre, "path": self.path, "asignatura": self.asignatura.to_dict(), "fecha": self.fecha.strftime("%Y/%m/%d %H:%M:%S") } # literal los class method son los services en java @classmethod def upload(cls, base_path, new_file, asignatura_id): asignatura = Asignatura.objects(id=asignatura_id).first() folder = base_path + str(asignatura['id']) if not os.path.exists(folder): os.mkdir(folder) file_name = secure_filename(new_file.filename) path = os.path.join(folder, file_name) new_file.save(path) if os.path.exists(path): archivo = Archivo(nombre=file_name, path=path, asignatura=asignatura) archivo.save() return archivo.to_dict() @classmethod def get_all_by_asignatura(cls, asignatura_id): archivos = Archivo.objects(asignatura=asignatura_id).all() result_list = [] for archivo in archivos: result_list.append(archivo.to_dict()) return result_list @classmethod def download(cls, archivo_id): archivo = Archivo.objects(id=archivo_id).first() print(60 * "*", archivo.path) return send_file(archivo.path, as_attachment=True, attachment_filename=archivo.nombre + "") @classmethod def erase(cls, archivo_id): try: archivo = Archivo.objects(id=archivo_id).first() os.remove(archivo.path) archivo.delete() return "Archivo eliminado" except Exception as e: print(str(e)) return "No se pudo eliminar el archivo" @classmethod def get_all(cls): archivos = Archivo.objects().all() result_list = [] for archivo in archivos: result_list.append(archivo.to_dict()) return result_list
class Curso(gj.Document): nombre = db.StringField(verbose_name="Nombre curso", max_length=200) fecha_creacion = db.DateTimeField(default=datetime.now) contenidos = db.ListField(db.EmbeddedDocumentField(Contenido)) asignatura = db.ReferenceField(Asignatura) institucion = db.ReferenceField(Institucion) profesor = db.ReferenceField(Profesor) categoria = db.ReferenceField(Categoria) alumnos = db.ListField(db.ReferenceField(Alumno)) activo = db.BooleanField(default=True) version_actual = db.BooleanField(default=True) publicado = db.BooleanField(default=False) eliminado = db.BooleanField(default=False) version = db.IntField(default=1) curso_base = db.ReferenceField(CursoBase, reverse_delete_rule=3) descripcion = db.StringField() aprobacion = db.IntField( default=0 ) imagen = db.StringField() habilidades = db.ListField(db.ReferenceField(Habilidad)) clon_padre = db.ReferenceField('Curso') meta = {'strict': False } def __str__(self): return self.nombre def actualizar_aprobacion(self): from models.evaluacion import Evaluacion promedio = 0 cantidad = Evaluacion.objects(curso=self.id).count() for evaluacion in Evaluacion.objects(curso=self.id).all(): promedio = evaluacion.acierto + promedio if cantidad>0: promedio = int(promedio/cantidad) self.aprobacion = promedio def to_dict(self, full=True): data = { "id": str(self.id), "nombre": self.nombre, "fecha_creacion": str(self.fecha_creacion), "activo": self.activo, "eliminado": self.eliminado, "publicado": self.publicado, "version": self.version, "descripcion": self.descripcion, "imagen": self.imagen, "curso_base": self.curso_base.to_dict() } if self.profesor: data['profesor'] = self.profesor.to_dict() if self.categoria: data['categoria'] = self.categoria.to_dict() if full: clon_padre = {} if self.clon_padre != None: clon_padre = self.clon_padre.to_dict() data.update({ "contenidos": [x.to_dict() for x in self.contenidos], "alumnos": [x.to_dict() for x in self.alumnos], "aprobacion": self.aprobacion, "curso_base": self.curso_base.to_dict(), "habilidades": [x.to_dict() for x in self.habilidades], "clon_padre": clon_padre, "version_actual": self.version_actual }) if self.asignatura: data['asignatura'] = self.asignatura.to_dict() return data
class Evaluacion(gj.Document): alumno = db.ReferenceField(Alumno) prueba = db.ReferenceField(Prueba) cantidad_buenas = db.IntField() cantidad_malas = db.IntField() cantidad_omitidas = db.IntField() puntaje = db.IntField() fecha = db.DateTimeField(default=datetime.now) respuestas = db.ListField(db.EmbeddedDocumentField(Respuesta)) meta = {'strict': False} def to_dict(self): respuestas = [] for respuesta in self.respuestas: respuestas.append(respuesta.to_dict()) return { "id": str(self.id), "alumno": self.alumno.to_dict(), "prueba": self.prueba.to_dict(), "cantidad_buenas": self.cantidad_buenas, "cantidad_malas": self.cantidad_malas, "cantidad_omitidas": self.cantidad_omitidas, "puntaje": self.puntaje, "fecha": self.fecha.strftime("%Y/%m/%d %H:%M:%S"), "respuestas": respuestas } #TODO: validar si existen los objetos asociados @classmethod def evaluar_prueba(cls, alumno_id, body): prueba_id = body["prueba_id"] listado_respuestas = body["respuestas"] prueba = Prueba.objects(id=prueba_id).first() alumno = Alumno.objects(id=alumno_id).first() print(prueba_id) print("prueba: ", prueba) evaluacion = Evaluacion() cantidad_buenas = 0 cantidad_malas = 0 cantidad_omitidas = 0 evaluacion.alumno = alumno evaluacion.prueba = prueba for pregunta in prueba.preguntas: respuesta = Respuesta() respuesta.numero_pregunta = pregunta.numero_pregunta if listado_respuestas[str(pregunta.numero_pregunta)] == "": cantidad_omitidas = cantidad_omitidas + 1 respuesta.correcta = False if prueba.tipo != "TAREA": respuesta.alternativa = "O" else: if prueba.tipo != "TAREA": if listado_respuestas[str(pregunta.numero_pregunta)].upper( ) == pregunta.alternativa.upper(): cantidad_buenas = cantidad_buenas + 1 respuesta.correcta = True else: cantidad_malas = cantidad_malas + 1 respuesta.correcta = False respuesta.alternativa = str(listado_respuestas[str( pregunta.numero_pregunta)].upper()) else: if listado_respuestas[str( pregunta.numero_pregunta)].upper() == "CORRECTA": cantidad_buenas = cantidad_buenas + 1 respuesta.correcta = True if listado_respuestas[str( pregunta.numero_pregunta)].upper() == "INCORRECTA": cantidad_malas = cantidad_malas + 1 respuesta.correcta = False evaluacion.respuestas.append(respuesta) evaluacion.cantidad_buenas = cantidad_buenas evaluacion.cantidad_malas = cantidad_malas evaluacion.cantidad_omitidas = cantidad_omitidas evaluacion.puntaje = int(( (850 - prueba.puntaje_base) / len(prueba.preguntas)) * cantidad_buenas + prueba.puntaje_base) evaluacion.save() return {'Response': 'exito'} @classmethod def list_to_dict(cls, lista): result_list = [] for element in lista: result_list.append(element.to_dict()) return result_list @classmethod def get_pruebas_no_respondidas(cls, alumno_id, asignatura_id): ensayos = Prueba.objects(asignatura=asignatura_id, visible=True, tipo='ENSAYO').all() talleres = Prueba.objects(asignatura=asignatura_id, visible=True, tipo='TALLER').all() pruebas = list(ensayos) + list(talleres) pruebas_no_respondidas = [] for prueba in pruebas: evaluacion = Evaluacion.objects(alumno=alumno_id, prueba=prueba.id).first() if evaluacion == None: pruebas_no_respondidas.append(prueba) return Prueba.list_to_dict(pruebas_no_respondidas)
class Historial(db.EmbeddedDocument): fecha = db.DateTimeField(default=datetime.now) id_visto = db.StringField() meta = {'strict': False}
class Session(db.DynamicDocument): name = db.StringField(required=True) password = db.StringField() created_on = db.DateTimeField(default=datetime.utcnow) songs = db.ListField(db.EmbeddedDocumentField('Song')) messages = db.ListField(db.StringField())
class Video(gj.Document): nombre = db.StringField(verbose_name="Nombre Video", max_length=200) uri = db.StringField(verbose_name="Uri", max_length=200) asignatura = db.ReferenceField(Asignatura) curso = db.ReferenceField(Curso) fecha = db.DateTimeField(default=datetime.now) meta = {'strict': False} def __str__(self): return self.nombre def to_dict(self): return { "id": str(self.id), "nombre": self.nombre, "uri": self.uri, "asignatura": self.asignatura.to_dict(), "curso": self.curso.to_dict(), "fecha": self.fecha.strftime("%Y/%m/%d %H:%M:%S") } # literal los class method son los services en java @classmethod def create(cls, new_video): asignatura = Asignatura.objects(id=new_video["asignatura_id"]).first() curso = Curso.objects(id=new_video["curso_id"]).first() id_video = new_video['uri'].split("?v=") id_video = id_video[1] if "&" in id_video: id_video = id_video.split("&")[0] embed_link = "https://www.youtube.com/embed/" + id_video video = Video(nombre=new_video['nombre'], uri=embed_link, asignatura=asignatura, curso=curso) video.save() return video.to_dict() @classmethod def get_all(cls): videos = Video.objects().all() result_list = [] for video in videos: result_list.append(video.to_dict()) return result_list @classmethod def get_all_by_asignatura(cls, asignatura_id): videos = Video.objects(asignatura=asignatura_id).all() result_list = [] for video in videos: result_list.append(video.to_dict()) return result_list @classmethod def get_all_by_asignatura_and_curso(cls, asignatura_id, curso_id): videos = Video.objects(asignatura=asignatura_id, curso=curso_id).all() result_list = [] for video in videos: result_list.append(video.to_dict()) return result_list @classmethod def get_by_id(cls, video_id): video = Video.objects(id=video_id).first() return video.to_dict() @classmethod def erase(cls, video_id): video = Video.objects(id=video_id).first() video.delete() return "Video eliminado"
class Prueba(gj.Document): nombre = db.StringField(max_length=250) cantidad_preguntas = db.IntField() asignatura = db.ReferenceField(Asignatura) fecha = db.DateTimeField(default=datetime.now) preguntas = db.ListField(db.EmbeddedDocumentField(Pregunta)) topicos = db.ListField(db.ReferenceField(Topico)) tipo = db.StringField(choices=TIPOS_PRUEBA) visible = db.BooleanField(default=False) activo = db.BooleanField(default=True) puntaje_base = db.IntField(default=0) meta = {'strict': False} def __str__(self): return self.nombre def to_dict(self): topicos = [] for topico in self.topicos: topicos.append(topico.to_dict()) preguntas = [] for pregunta in self.preguntas: preguntas.append(pregunta.to_dict()) return { "id": str(self.id), "nombre": self.nombre, "cantidad_preguntas": self.cantidad_preguntas, "asignatura": self.asignatura.to_dict(), "fecha": self.fecha.strftime("%Y/%m/%d %H:%M:%S"), "tipo": self.tipo, "topicos": topicos, "preguntas": preguntas, "puntaje_base": self.puntaje_base, "visible": self.visible } #TODO: validar que id de la prueba @classmethod def load_preguntas(cls, lista, prueba_id): try: prueba = Prueba.objects(id=prueba_id).first() if (prueba == None): return {"error": "Prueba no encontrada"} except: return {"error": "Error en el id de la prueba"} listado_preguntas = Pregunta.create_from_excel(lista) if (len(listado_preguntas) == 0): return { "error": "Problema al cargar las preguntas de la prueba, favor revisar excel" } prueba.preguntas = listado_preguntas prueba.cantidad_preguntas = len(lista) prueba.save() return {"Response": "Prueba creada con exito"} @classmethod def list_to_dict(cls, lista): result_list = [] for element in lista: result_list.append(element.to_dict()) return result_list @classmethod def update_visible(cls, id_prueba): prueba = Prueba.objects(id=id_prueba).first() prueba.visible = not prueba.visible prueba.save() return "Campo visible actualizado"