def notas_reporte(): '''Reporte de las notas de los estudiantes para este examen''' C = Storage() C.examen = db.examen(int(request.args(0))) C.asignatura = C.examen.asignatura_id C.evento = db.evento(C.examen.evento_id) C.ano = db.ano_academico(C.evento.ano_academico_id) C.unidad = db.unidad_organica(C.ano.unidad_organica_id) C.escuela = db.escuela(C.unidad.escuela_id) # breadcumbs u_link = Accion(C.unidad.abreviatura or C.unidad.nombre, URL('unidad', 'index', args=[C.unidad.id]), True) # siempre dentro de esta funcion menu_migas.append(u_link) a_links = Accion(T('Años académicos'), URL('unidad', 'index', args=[C.unidad.id]), True) menu_migas.append(a_links) e_link = Accion(C.evento.nombre, URL('evento','index', args=[C.evento.id]), True) menu_migas.append(e_link) menu_migas.append(T('Reporte de resultados')) C.titulo = "{} - {}".format(db.examen._format(C.examen), C.evento.nombre) from agiscore.db import nota as nota_model nota_model.crear_entradas(C.examen.id) query = (db.nota.examen_id == C.examen.id) query &= (db.nota.estudiante_id == db.estudiante.id) query &= (db.estudiante.persona_id == db.persona.id) query &= (db.candidatura.estudiante_id == db.nota.estudiante_id) # preparar campos for f in db.nota: f.readable = False for f in db.persona: f.readable = False for f in db.estudiante: f.readable = False for f in db.candidatura: f.readable = False db.candidatura.numero_inscripcion.readable = True db.candidatura.numero_inscripcion.label = T('#INS') db.persona.nombre_completo.readable = True db.persona.nombre_completo.label = T("Nombre") db.nota.valor.readable = True db.nota.valor.label = T("Nota") campos = [db.candidatura.numero_inscripcion, db.persona.nombre_completo, db.nota.valor] text_lengths={'persona.nombre_completo': 50} exportadores = dict(xml=False, html=False, csv_with_hidden_cols=False, csv=False, tsv_with_hidden_cols=False, tsv=False, json=False, PDF=(tools.ExporterPDF, 'PDF')) if request.vars._export_type: response.context = C C.grid = grid_simple(query, orderby=[db.persona.nombre_completo], maxtextlengths=text_lengths, exportclasses=exportadores, csv=True, fields=campos, create=False, editable=False, deletable=False, history=False, args=request.args[:1]) return dict(C=C)
def grid_asignar_nota(examen): """Retorna un grid para manejo de las notas de un examen""" co = CAT() if not examen: return co auth = current.auth if not auth.user: return co db = current.db T = current.T conf = current.conf request = current.request rol_admin = conf.take('roles.admin') rol_profesor = conf.take('roles.profesor') nota_model.definir_tabla() nota_model.crear_entradas(examen.id) db.nota.examen_id.readable = False q = (db.nota.examen_id == examen.id) q &= (db.nota.estudiante_id == db.estudiante.id) q &= (db.persona.uuid == db.estudiante.uuid) campos = [db.persona.uuid] if auth.has_membership(role=rol_admin): campos.append(db.persona.nombre_completo) campos.append(db.nota.valor) campos.append(db.nota.id) # configurar campos persona_model.esconder_campos() estudiante_model.esconder_campos() db.nota.estudiante_id.readable = False db.persona.uuid.readable = True db.persona.nombre_completo.label = T('Nombre') db.persona.uuid.label = "UUID" if auth.has_membership(role=rol_admin): db.persona.nombre_completo.readable = True # enlaces en el GRID ------------------------------------------------------ def enlaces(row): request = current.request c = request.controller f = request.function pars = request.vars e = db.estudiante(uuid=row.persona.uuid) pars['estudiante_id'] = e.id u = db.auth_user(auth.user.id) profesor = None asignacion = None if u.persona.select().first(): profesor = u.persona.select().first().profesor.select().first() if profesor: asignacion = db.profesor_asignatura(profesor_id=profesor.id, asignatura_id=examen.asignatura_id, evento_id=examen.evento_id) nota = db.nota(examen_id=examen.id, estudiante_id=e.id) puede = ((auth.has_membership(role=rol_admin) or \ (asignacion and asignacion.es_jefe))) puede = puede or (auth.has_membership(role=rol_profesor) and \ ((nota.valor is None) and asignacion)) from agiscore.db.evento import esta_activo puede = puede and esta_activo(db.evento(examen.evento_id)) url1 = URL(c=c, f=f, args=[examen.id, 'new'], vars=pars, user_signature=True) a1 = Accion(SPAN('', _class='glyphicon glyphicon-plus-sign'), url1, puede, _class="btn btn-default", _title=T("Poner nota")) return CAT(a1) # ------------------------------------------------------------------------- g_links = [dict(header='', body=enlaces)] text_lengths = {'persona.nombre_completo': 50, 'persona.uuid': 100} manejo = grid_simple(q, fields=campos, create=False, deletable=False, editable=False, maxtextlengths=text_lengths, links=g_links, args=request.args[:1]) co.append(DIV( DIV(H3(T("Asignación de notas para"), " ", examen_model.examen_format(examen), _class="panel-title"), _class="panel-heading"), DIV(manejo, _class="panel-body"), _class="panel panel-default")) return co