def carreras_me(): C = Storage() C.escuela = db.escuela(1) menu_migas.append(T("Descripciones de carreras")) tbl = db.descripcion_carrera query = (tbl.id > 0) tbl.id.readable = False text_lengths = {'descripcion_carrera.nombre': 50} C.titulo = T("Registro de carreras del Ministerio de Educación") puede_editar = auth.has_membership(role=myconf.take('roles.admin')) # puede_borrar = auth.has_membership(role=myconf.take('roles.admin')) puede_crear = auth.has_membership(role=myconf.take('roles.admin')) C.grid = grid_simple(query, editable=puede_editar, create=puede_crear, maxtextlengths=text_lengths, orderby=[tbl.nombre], args=request.args[:1]) return dict(C=C)
def asignaturas(): '''registro general de asigaturas''' C = Storage() C.escuela = db.escuela(1) menu_migas.append(T("Registro de asignaturas")) # -- construir el grid tbl = db.asignatura query = (tbl.id > 0) # permisos puede_crear = auth.has_membership(role=myconf.take('roles.admin')) puede_editar, puede_borrar = (puede_crear, puede_crear) tbl.id.readable = False text_lengths = {'asignatura.nombre': 50} C.grid = grid_simple(query, create=puede_crear, editable=puede_editar, maxtextlengths=text_lengths, deletable=puede_borrar) return dict(C=C)
def index(): C = Storage() C.escuela = db.escuela(1) menu_migas.append(T("Tipos de pagos")) C.titulo = T("Registro de tipos de pago") # permisos puede_editar = auth.has_membership(role=myconf.take('roles.admin')) # puede_borrar = auth.has_membership(role=myconf.take('roles.admin')) puede_crear = auth.has_membership(role=myconf.take('roles.admin')) tbl = db.tipo_pago query = (tbl.id > 0) tbl.id.readable = False if 'edit' in request.args: tbl.nombre.writable = False text_lengths = {'tipo_pago.nombre': 50} C.grid = grid_simple(query, maxtextlengths=text_lengths, create=puede_crear, editable=puede_editar) return dict(C=C)
def manejo_escuelas_medias(db, T, auth=None, request=None, conf=None): if auth is None: auth = current.auth if request is None: request = current.request if conf is None: conf = current.conf if 'new' in request.args: #preparar el formulario para agregar un elemento. if request.vars.provincia_id: prov = provincia.obtener(int(request.vars.provincia_id)) else: prov = provincia.obtener() # obtener cualquier provincia mun = municipio.obtener(provincia_id=prov.id) db.escuela_media.provincia_id.default = prov.id db.escuela_media.municipio_id.default = mun.id db.escuela_media.municipio_id.requires = IS_IN_DB( db(db.municipio.provincia_id == prov.id), 'municipio.id',"%(nombre)s",zero=None ) db.escuela_media.codigo.comment = T("Código de 4 digitos") condq = (db.escuela_media.tipo_escuela_media_id != tipo_escuela.obtener_por_uuid(tipo_escuela.ID_PROTEGIDO).id) db.escuela_media.provincia_id.show_if = condq db.escuela_media.municipio_id.show_if = condq db.escuela_media.id.readable = False # esto debe mantenerse lo más proximo posible a la contrucción del GRID if ('new' in request.args) or ('edit' in request.args): if request.vars.tipo_escuela_media_id: # guardando el formulario sid = int(request.vars.tipo_escuela_media_id) pid = tipo_escuela.obtener_por_uuid(tipo_escuela.ID_PROTEGIDO).id if sid == pid: # si es el valor ID_PROTEGIDO # asignarle valores a la provincia y municipo id_p = db.provincia.obtener_por_uuid(provincia.ID_PROTEGIDO).id id_m = db.municipio.obtener_por_uuid(municipio.ID_PROTEGIDO).id request.vars.provincia_id = id_p request.vars.municipio_id = id_m request.post_vars.provincia_id = id_p request.post_vars.municipio_id = id_m db.escuela_media.provincia_id.default = id_p db.escuela_media.municipio_id.default = id_m db.escuela_media.municipio_id.requires = [] puede_crear = auth.has_membership(role=conf.take('roles.admin')) puede_editar, puede_borrar = (puede_crear, puede_crear) text_lengths = {'escuela_media.nombre': 100} manejo = grid_simple((db.escuela_media.id > 0), maxtextlength=text_lengths, create=puede_crear, editable=puede_editar, deletable=puede_borrar) return manejo
def carreras(): '''configuración de las carreras de la unidad organica''' from agiscore.db import carrera_uo as model C = Storage() C.unidad = db.unidad_organica(int(request.args(0))) C.escuela = db.escuela(C.unidad.escuela_id) # breadcumbs u_link = Accion(C.unidad.abreviatura or C.unidad.nombre, URL('index', args=[C.unidad.id]), True) # siempre dentro de esta funcion menu_migas.append(u_link) menu_migas.append(T('Carreras')) tbl = db.carrera_uo query = (tbl.id > 0) query &= (tbl.unidad_organica_id == C.unidad.id) puede_crear = auth.has_membership(role=myconf.take('roles.admin')) puede_editar, puede_borrar = (puede_crear, puede_crear) tbl.unidad_organica_id.writable = False tbl.carrera_escuela_id.label = T("Carrera") if 'view' in request.args: planes_link = URL('carrera', 'planes', args=[request.args(3)]) redirect(planes_link) if 'new' in request.args: tbl.unidad_organica_id.default = C.unidad.id posibles = model.obtener_posibles(db, C.unidad.id) if not posibles: # si no hay carreras para seleccionar, volver al incio msg = T('No hay más carreras definidas en la escuela') session.flash = msg redirect(URL('carreras', args=[C.unidad.id])) tbl.carrera_escuela_id.requires = IS_IN_SET(posibles, zero=None) campos = [tbl.carrera_escuela_id] text_length = {'carrera_uo.carrera_escuela_id': 60} C.grid = grid_simple(query, fields=campos, searchable=False, editable=puede_editar, create=puede_crear, deletable=puede_borrar, details=True, maxtextlengths=text_length, args=request.args[:1]) return dict(C=C)
def departamentos(): C = Storage() C.unidad = db.unidad_organica(int(request.args(0))) C.escuela = db.escuela(C.unidad.escuela_id) # breadcumbs u_link = Accion(C.unidad.abreviatura or C.unidad.nombre, URL('index', args=[C.unidad.id]), True) # siempre dentro de esta funcion menu_migas.append(u_link) menu_migas.append(T('Departamentos')) # -- configurar grid tbl = db.departamento tbl.id.readable = False tbl.unidad_organica_id.writable = False if 'new' in request.args: tbl.unidad_organica_id.default = C.unidad.id query = (tbl.id > 0) & (tbl.unidad_organica_id == C.unidad.id) puede_crear = auth.has_membership(role=myconf.take('roles.admin')) puede_editar, puede_borrar = (puede_crear, puede_crear) # callbacks def onvalidation(form): row = None if 'new' in request.args: dpto_nombre = tbl.nombre.validate(form.vars.nombre)[0] row = tbl(nombre=dpto_nombre, unidad_organica_id=C.unidad.id) if 'edit' in request.args: dpto_nombre = tbl.nombre.validate(form.vars.nombre)[0] dpto_id = int(request.args(3)) # args del grid q = ((tbl.id != dpto_id) & (tbl.nombre == dpto_nombre)) row = db(q).select().first() if row: form.errors.nombre = T("Ya existe en la Unidad Orgánica") if 'view' in request.args: redirect(URL('departamento', 'index', args=[request.args(3)])) C.grid = grid_simple(query, create=puede_crear, deletable=puede_borrar, editable=puede_editar, fields=[tbl.nombre], orderby=[tbl.nombre], onvalidation=onvalidation, searchable=False, details=(auth is not None), args=request.args[:1]) return dict(C=C)
def pagos(): """Muestra el listado de los pagos realizados""" C = Storage() C.evento = db.evento(request.args(0)) C.persona = db.persona(request.args(1)) 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) concepto = db( db.tipo_pago.nombre == "PROPINA" ).select().first() assert concepto != None query = (db.pago.id > 0) query &= (db.pago.persona_id == C.persona.id) query &= (db.pago.evento_id == C.evento.id) query &= (db.pago.tipo_pago_id == concepto.id) l_pagos = [p.id for p in db(query).select(db.pago.id)] sumq = db.pago.cantidad.sum() C.total = db(query).select(sumq).first()[sumq] or 0.0 sumz = db.propina.cantidad.sum() pquery = (db.propina.id > 0) pquery &= (db.propina.persona_id == C.persona.id) pquery &= (db.propina.ano_academico_id == C.ano.id) C.propinas = db(pquery).select(sumz).first()[sumz] or 0.0 for f in db.pago: f.readable = False db.pago.id.readable = True db.pago.fecha_recivo.readable = True db.pago.cantidad.readable = True db.pago.id.represent = lambda v,r: A( v, _href=URL(c='gcontable', f='pagos', args=['view', 'pago', v], extension=False, user_signature=True) ) db.pago.id.label = T("ID Pago") C.titulo = T("Registro de pagos") C.titulo += " {}".format(C.persona.nombre_completo) C.grid = grid_simple(query, orderby=[db.pago.fecha_recivo], # fields=campos, create=False, history=False, details=False, csv=False, args=request.args[:2], formname="pagos") return dict(C=C)
def personas(): C = Storage() C.escuela = db.escuela(1) menu_migas.append(T("Registro general de personas")) # permisos puede_editar = auth.has_membership(role=myconf.take('roles.admin')) puede_borrar = auth.has_membership(role=myconf.take('roles.admin')) puede_crear = auth.has_membership(role=myconf.take('roles.admin')) tbl = db.persona query = (tbl.id > 0) campos = [tbl.id, tbl.numero_identidad, tbl.nombre_completo] tbl.numero_identidad.label = "#IDENT" tbl.nombre_completo.label = T("Nombre") text_lengths = {'persona.nombre_completo': 50} def _tipo(row): """Para mostrar el tipo de persona que es""" per = db.persona(row.id) tipo = "OTHER" if per.estudiante.select(): tipo = T("ESTUDIANTE") elif per.profesor.select(): tipo = T("PROFESOR") return CAT(tipo) enlaces = [dict(header=T('TIPO'), body=_tipo)] if 'edit' in request.args or 'new' in request.args: enlaces=[] C.grid = grid_simple(query, create=puede_crear, deletable=puede_borrar, editable=puede_editar, links=enlaces, maxtextlengths=text_lengths, orderby=[tbl.nombre_completo], fields=campos) return dict(C=C)
def especialidades(): C = Storage() C.carrera = db.carrera_uo(int(request.args(0))) C.unidad = db.unidad_organica(C.carrera.unidad_organica_id) C.escuela = db.escuela(C.unidad.escuela_id) C.carrera_format = carrera_uo_format(C.carrera) # breadcumbs # enlace a la UO 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) # enlace a la opcion carreras de la UO c_link = Accion(T('Carreras'), URL('unidad', 'carreras', args=[C.unidad.id]), True) menu_migas.append(c_link) # planes C.carrera_format = carrera_uo_format(C.carrera) menu_migas.append(C.carrera_format) menu_migas.append(T("Especialidades")) # permisos puede_crear = auth.has_membership(role=myconf.take('roles.admin')) puede_editar, puede_borrar = (puede_crear, puede_crear) tbl = db.especialidad tbl.carrera_id.default = C.carrera.id tbl.carrera_id.readable = False tbl.carrera_id.writable = False tbl.id.readable = False if ('new' in request.args) or ('edit' in request.args): dbset = (tbl.carrera_id == C.carrera.id) tbl.nombre.requires.append(IS_NOT_IN_DB(db(dbset), 'especialidad.nombre')) tbl.abreviatura.requires.append(IS_NOT_IN_DB(db, 'especialidad.abreviatura')) query = (tbl.id > 0) & (tbl.carrera_id == C.carrera.id) C.grid = grid_simple(query, create=puede_crear, editable=puede_editar, deletable=puede_borrar, args=request.args[:1]) return dict(C=C)
def index(): """Gestor de unidades orgánicas""" C = Storage() C.escuela = db.escuela(1) menu_migas.append(T("Unidades Orgánicas")) # permisos editar = auth.has_membership(role=myconf.take('roles.admin')) crear = auth.has_membership(role=myconf.take('roles.admin')) deletable = auth.has_membership(role=myconf.take('roles.admin')) # configurar grid query = (db.unidad_organica.id > 0) query &= (db.unidad_organica.escuela_id == C.escuela.id) campos = [db.unidad_organica.id, db.unidad_organica.nombre] if 'new' in request.args: db.unidad_organica.escuela_id.default = C.escuela.id db.unidad_organica.escuela_id.writable = False if 'edit' in request.args: db.unidad_organica.escuela_id.writable = False if 'view' in request.args: redirect(URL('unidad', 'index', args=[request.args(2)])) db.unidad_organica.id.readable = False C.unidades = grid_simple(query, orderby=[db.unidad_organica.nombre], fields=campos, maxtextlength=100, editable=editar, create=crear, details=True, history=False, searchable=False, deletable=deletable) cantidad = db(query).count() if (session.entrada_directa is None) and cantidad == 1: session.entrada_directa = True u = db(query).select(db.unidad_organica.ALL).first() redirect(URL('unidad', 'index', args=[u.id])) return dict(C=C)
def pagos(): C = Storage() C.escuela = db.escuela(1) menu_migas.append(T("Control de pagos")) C.titulo = T("Registros general de pagos") # permisos puede_editar = auth.has_membership(role=myconf.take('roles.admin')) puede_borrar = auth.has_membership(role=myconf.take('roles.admin')) # puede_crear = auth.has_membership(role=myconf.take('roles.admin')) tbl = db.pago query = (tbl.id > 0) & (db.persona.id == tbl.persona_id) campos = [tbl.id, db.persona.nombre_completo, tbl.cantidad, tbl.evento_id,] tbl.id.readable = True for f in db.persona: f.readable = False db.persona.nombre_completo.readable = True db.persona.nombre_completo.label = T("Nombre") tbl.persona_id.readable = False if 'edit' in request.args: tbl.persona_id.readable = True tbl.persona_id.writable = False text_lengths = {'persona.nombre_completo': 30} C.grid = grid_simple(query, field_id=tbl.id, fields=campos, orderby=[db.persona.nombre_completo], create=False, sortable=True, maxtextlength=text_lengths, editable=puede_editar, deletable=puede_borrar, details=True, args=request.args[:1]) return dict(C=C)
def grid_carreras_ies(escuela, db, T, auth=None, conf=None, request=None): if auth is None: auth = current.auth if conf is None: conf = current.conf if request is None: request = current.request model = db.carrera_escuela editar = (auth.has_membership(role=conf.take('roles.admin'))) crear = (auth.has_membership(role=conf.take('roles.admin'))) deletable = (auth.has_membership(role=conf.take('roles.admin'))) query = (model.id > 0) model.id.readable = False orden = [model.codigo] campos = [model.id, model.codigo, model.descripcion_id] text_length = {"carrera_escuela.descripcion_id": 100} if 'new' in request.args: posibles = carreras_posibles(db) model.descripcion_id.requires = IS_IN_SET(posibles, zero=None) if 'edit' in request.args: model.descripcion_id.writable = False grid = grid_simple(query, fields=campos, orderby=orden, maxtextlengths=text_length, create=crear, editable=editar, deletable=deletable) return grid
def propinas(): """Muestra el listado de los pagos realizados""" C = Storage() C.evento = db.evento(request.args(0)) C.persona = db.persona(request.args(1)) 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) concepto = db( db.tipo_pago.nombre == "PROPINA" ).select().first() assert concepto != None C.titulo = T("Registro de Propinas") query = (db.propina.id > 0) query &= (db.propina.persona_id == C.persona.id) query &= (db.propina.ano_academico_id == C.ano.id) # configurar campos db.propina.id.readable = False # db.propina.pago_id.readable = True C.grid = grid_simple(query, create=False, history=False, details=False, searchable=False, paginate=13, csv=False, args=request.args[:2], formname="propinas" ) return dict(C=C)
def turmas(): C = Storage() C.unidad = db.unidad_organica(int(request.args(0))) C.escuela = db.escuela(C.unidad.escuela_id) # breadcumbs u_link = Accion(C.unidad.abreviatura or C.unidad.nombre, URL('index', args=[C.unidad.id]), True) # siempre dentro de esta funcion menu_migas.append(u_link) menu_migas.append(T('Turmas')) C.titulo = T("Gestión de Turmas") tbl = db.turma tbl.id.readable = False tbl.unidad_organica_id.readable = False tbl.unidad_organica_id.writable = False tbl.unidad_organica_id.default = C.unidad.id query = (tbl.id > 0) & (tbl.unidad_organica_id == C.unidad.id) # permisos puede_crear = auth.has_membership(role=myconf.take('roles.admin')) puede_borrar = auth.has_membership(role=myconf.take('roles.admin')) puede_editar = auth.has_membership(role=myconf.take('roles.admin')) text_length = {'turma.carrera_id': 100} C.grid = grid_simple(query, editable=puede_editar, deletable=puede_borrar, create=puede_crear, maxtextlength=text_length, args=request.args[:1]) return dict(C=C)
def claustro(): """Gestión del claustro de un departamento""" C = Storage() C.dpto = db.departamento(int(request.args(0))) C.unidad = db.unidad_organica(C.dpto.unidad_organica_id) C.escuela = db.escuela(C.unidad.escuela_id) # breadcumbs # enlace a la UO 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) # enlace a la opcion carreras de la UO c_link = Accion(T("Departamentos"), URL("unidad", "departamentos", args=[C.unidad.id]), True) menu_migas.append(c_link) menu_migas.append(C.dpto.nombre) # permisos puede_crear = auth.has_membership(role=myconf.take("roles.admin")) puede_editar, puede_borrar = (puede_crear, puede_crear) tbl = db.profesor query = (tbl.id > 0) & (tbl.persona_id == db.persona.id) query &= tbl.departamento_id == C.dpto.id # configurar campos db.profesor.persona_id.readable = False db.persona.nombre_completo.label = T("Nombre") text_length = {"persona.nombre_completo": 100} campos = [tbl.id, db.persona.nombre_completo, tbl.vinculo, tbl.categoria, tbl.grado] db.profesor.departamento_id.default = C.dpto.id db.profesor.departamento_id.writable = False if "new" in request.args: # recoger los datos personales back = URL("claustro", args=[C.dpto.id]) if session.dcpersona is None: (C.grid, data) = form_crear_persona_ex(cancel_url=back, db=db, T=T, session=session, request=request) if data is None: return dict(C=C) session.dcpersona = data # regoger datos del docente form = SQLFORM.factory(db.profesor, submit_button=T("Guardar")) title = DIV(H3(T("Datos del docente"), _class="panel-title"), _class="panel-heading") c = DIV(title, DIV(form, _class="panel-body"), _class="panel panel-default") if form.process(dbio=False).accepted: persona_id = db.persona.insert(**db.persona._filter_fields(session.dcpersona)) form.vars.persona_id = persona_id db.profesor.insert(**db.profesor._filter_fields(form.vars)) session.flash = T("Datos del profesor guardados") # session cleanup (iss138) session.dcpersona = None redirect(back) C.grid = c else: C.grid = grid_simple( query, searchable=True, maxtextlengths=text_length, fields=campos, deletable=puede_borrar, editable=puede_editar, create=puede_crear, args=request.args[:1], ) return dict(C=C)
def index(): """UI evento de matricua""" C = Storage() C.evento = db.evento(request.args(0)) 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(C.ano.nombre, URL('unidad', 'index', args=[C.unidad.id]), True) menu_migas.append(a_links) e_link = Accion(C.evento.nombre, URL('index', args=[C.evento.id]), True) menu_migas.append(e_link) menu_migas.append(T("Candidatos admitidos")) con_pago = db.tipo_pago(nombre="MATRÍCULA E CONFIRMAÇÃO DE MATRÍCULA") if con_pago is None: raise HTTP(404) C.titulo = T("Candidatos") # configuración del grid tbl = db.candidatura query = (tbl.estudiante_id == db.estudiante.id) query &= (tbl.ano_academico_id == C.ano.id) query &= (tbl.estado_candidatura == ADMITIDO) query &= (db.estudiante.persona_id == db.persona.id) query &= (db.estudiante.unidad_organica_id == C.unidad.id) q2 = (tbl.estudiante_id == db.estudiante.id) q2 &= (tbl.ano_academico_id == C.ano.id) q2 &= (tbl.estado_candidatura == ADMITIDO) q2 &= (db.estudiante.persona_id == db.persona.id) q2 &= (db.estudiante.unidad_organica_id == C.unidad.id) q2 &= (db.matricula.estudiante_id == tbl.estudiante_id) q2 &= (db.matricula.estado_uo.belongs([MATRICULADO, MATRICULADO_CON_DEUDAS])) q2 = [a.estudiante_id for a in db(q2).select(tbl.estudiante_id, distinct=True)] query &= (~tbl.estudiante_id.belongs(q2)) campos = [tbl.numero_inscripcion, db.persona.id, db.persona.numero_identidad, db.persona.nombre_completo, db.estudiante.id] for f in tbl: f.readable = False for f in db.persona: f.readable = False for f in db.estudiante: f.readable = False tbl.numero_inscripcion.readable = True db.persona.numero_identidad.readable = True db.persona.nombre_completo.readable = True tbl.numero_inscripcion.label = T("#INS") db.persona.numero_identidad.label = T("#IDENT") db.persona.nombre_completo.label = T("Nombre") text_lengths = {'persona.nombre_completo': 45} admin_o_cobrador = auth.has_membership(role=myconf.take('roles.admin')) or \ auth.has_membership(role=myconf.take('roles.cobrador_matricula')) adm_co_admdoc = auth.has_membership(role=myconf.take('roles.admin')) adm_co_admdoc |= auth.has_membership(role=myconf.take('roles.confirmador_matricula')) adm_co_admdoc |= auth.has_membership(role=myconf.take('roles.admdocente')) ev_activo = esta_activo(C.evento) def _enlaces(row): co = CAT() mat = db.matricula(ano_academico_id=C.ano.id, estudiante_id=row.estudiante.id) # buscar un pago para la persona if mat is None: # si no ha pagado poner enlace para pagar pago_link = URL('pago', args=[C.evento.id, row.persona.id]) puede_pagar = admin_o_cobrador puede_pagar &= ev_activo co.append(Accion(CAT(SPAN('', _class='glyphicon glyphicon-hand-up'), ' ', T("Falta de pago")), pago_link, puede_pagar, _class="btn btn-default btn-sm", _title=T("Pago confirmación de matricula"))) elif mat.estado_uo == SIN_MATRICULAR: # poner enlace para confirmación de matricula c_link = URL('matricular', args=[C.evento.id, row.persona.id]) puede_confirmar = adm_co_admdoc puede_confirmar &= ev_activo co.append(Accion(CAT(SPAN('', _class='glyphicon glyphicon-hand-up'), ' ', T("Confirmar")), c_link, puede_confirmar, _class="btn btn-default btn-sm", _title=T("Confirmación de matricula"))) return co enlaces = [dict(header='', body=_enlaces)] C.grid = grid_simple(query, create=False, field_id=db.persona.id, searchable=True, fields=campos, links=enlaces, paginate=20, maxtextlengths=text_lengths, args=request.args[:1]) return dict(C=C)
def asignaturas(): C = Storage() C.plan = db.plan_curricular(int(request.args(0))) C.carrera = db.carrera_uo(C.plan.carrera_id) C.unidad = db.unidad_organica(C.carrera.unidad_organica_id) C.escuela = db.escuela(C.unidad.escuela_id) # breadcumbs # enlace a la UO 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) # enlace a la opcion carreras de la UO c_link = Accion(T('Carreras'), URL('unidad', 'carreras', args=[C.unidad.id]), True) menu_migas.append(c_link) # planes C.carrera_format = carrera_uo_format(C.carrera) menu_migas.append(C.carrera_format) p_link = Accion(T('Planes'), URL('planes', args=[C.carrera.id]), True) menu_migas.append(p_link) menu_migas.append(C.plan.nombre) # permisos puede_crear = auth.has_membership(role=myconf.take('roles.admin')) puede_borrar = auth.has_membership(role=myconf.take('roles.admin')) # -- contruir el grid tbl = db.asignatura_plan tbl.id.readable = False query = (tbl.id > 0) query &= (tbl.plan_curricular_id == C.plan.id) tbl.plan_curricular_id.readable = False if ('new' in request.args) or ('edit' in request.args): tbl.plan_curricular_id.writable = False tbl.plan_curricular_id.default = C.plan.id if 'edit' in request.args: tbl.asignatura_id.writable = False tbl.nivel_academico_id.writable = False tbl.importancia.default = 100 # validar que no se repitan las asignaturas por nivel def onvalidation(form): if 'new' in request.args: # comprobar que no exista la combinación nivel n_id = tbl.nivel_academico_id.validate(form.vars.nivel_academico_id)[0] a_id = tbl.asignatura_id.validate(form.vars.asignatura_id)[0] row = tbl(nivel_academico_id=n_id, asignatura_id=a_id, plan_curricular_id=C.plan.id) if row: # ya existe en el plan esa asignatura con el mismo nivel de # acceso form.errors.asignatura_id = T("Ya existe en el plan con el mismo nivel") text_lengths = {'asignatura_plan.asignatura_id': 50} C.grid = grid_simple(query, args=request.args[:1], editable=puede_crear, deletable=puede_borrar, create=puede_crear, onvalidation=onvalidation, maxtextlengths=text_lengths, orderby=[tbl.nivel_academico_id, tbl.asignatura_id],) return dict(C=C)
def matriculados(): """UI evento de época normal""" C = Storage() C.evento = db.evento(request.args(0)) 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(C.ano.nombre, URL('unidad', 'index', args=[C.unidad.id]), True) menu_migas.append(a_links) e_link = Accion(C.evento.nombre, URL('index', args=[C.evento.id]), True) menu_migas.append(e_link) menu_migas.append(T("Matriculados")) C.titulo = T("Registro de estudiantes") # configuración del grid tbl = db.estudiante query = (tbl.persona_id == db.persona.id) query &= (tbl.unidad_organica_id == C.unidad.id) query &= (tbl.id == db.matricula.estudiante_id) query &= (db.matricula.ano_academico_id == C.ano.id) query &= (db.matricula.estado_uo.belongs(MATRICULADO, MATRICULADO_CON_DEUDAS)) 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')) campos = [tbl.id, tbl.codigo, db.persona.id, db.persona.nombre_completo, db.matricula.estado_uo, db.matricula.regimen_id] for f in tbl: f.readable = False tbl.codigo.readable = True for f in db.persona: f.readable = False db.persona.nombre_completo.readable = True for f in db.matricula: f.readable = False db.matricula.estado_uo.readable = True db.matricula.regimen_id.readable = True db.matricula.carrera_id.readable = True db.matricula.turma_id.readable = True db.matricula.situacion.readable = True for f in db.turma: f.readable = False tbl.codigo.label = T("#MEC") db.persona.nombre_completo.label = T("Nombre") db.matricula.estado_uo.label = T("Estado") text_lengths = {'persona.nombre_completo': 45, 'matricula.estado_uo': 45} es_admin = auth.has_membership(role=myconf.take('roles.admin')) ev_activo = esta_activo(C.evento) r_regular_q = (db.regimen_unidad_organica.regimen_id == db.regimen.id) r_regular_q &= (db.regimen.codigo=='1') r_regular_q &= (db.regimen_unidad_organica.unidad_organica_id == C.unidad.id) r_regular = db(r_regular_q).select(db.regimen_unidad_organica.id).first() def _enlaces(row): co = CAT() # buscar un pago para la persona editar_link = URL('editar', args=[C.evento.id, row.persona.id]) puede_editar = es_admin puede_editar &= ev_activo co.append(Accion(CAT(SPAN('', _class='glyphicon glyphicon-hand-up'), ' ', T("Editar")), editar_link, puede_editar, _class="btn btn-default btn-sm", _title=T("Editar datos del estudiante"))) puede_pagar = es_admin or auth.has_membership(role=myconf.take('roles.cobrador_propina')) puede_pagar &= ev_activo if row.matricula.regimen_id != r_regular.id: # los del regimen regular no pagan propina co.append(pago_link("enormal-content", row.persona.id, C.evento.id, activo=puede_pagar, T=T)) return co enlaces = [dict(header='', body=_enlaces)] if request.vars._export_type: response.context = C C.grid = grid_simple(query, create=False, field_id=db.persona.id, searchable=True, fields=campos, links=enlaces, paginate=20, maxtextlengths=text_lengths, csv=True, exportclasses=exportadores, orderby=[db.persona.nombre_completo], args=request.args[:1]) return dict(C=C)
def index(): """Configuración de las aulas""" 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(db.examen._format(C.examen)) menu_migas.append(T('Asignación de aulas')) # -- permisos puede_borrar = auth.has_membership(role=myconf.take('roles.admin')) puede_crear = auth.has_membership(role=myconf.take('roles.admin')) puede_editar = auth.has_membership(role=myconf.take('roles.admin')) # -- configurar grid tbl = db.examen_aula query = (tbl.id > 0) & (tbl.examen_id == C.examen.id) if 'new' in request.args: tbl.examen_id.default = C.examen.id tbl.examen_id.writable = False estan_set = (db.aula.id > 0) & (db.aula.id == db.examen_aula.aula_id) estan_set &= (db.examen_aula.examen_id == C.examen.id) estan = [a.id for a in db(estan_set).select(db.aula.id)] a_set = (db.aula.id > 0) & (db.aula.disponible == True) a_set &= (~db.aula.id.belongs(estan)) posibles = IS_IN_DB(db(a_set), db.aula.id, '%(nombre)s', zero=None) db.examen_aula.aula_id.requires = posibles C.titulo = "{}: {}".format(T("Aulas para el exámen"), db.examen._format(C.examen)) # -- configurar los campos tbl.id.readable = False tbl.examen_id.readable = False # -- datos de capacidad from agiscore.db.examen import obtener_candidaturas, obtener_aulas from agiscore.db.aula import capacidad_total C.a_examinar = len(obtener_candidaturas(C.examen.id)) C.a_capacidad = capacidad_total(obtener_aulas(C.examen.id)) C.grid = grid_simple(query, create=puede_crear, editable=puede_editar, deletable=puede_borrar, searchable=False, history=False, args=request.args[:1]) return dict(C=C)
def distribucion(): '''Distribución de estudiantes por aulas''' 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(db.examen._format(C.examen)) menu_migas.append(T('Distribución por aulas')) C.titulo = "{} - {}".format(T("Distribución de los estudiantes por aulas"), db.examen._format(C.examen)) from agiscore.db.examen_aula_estudiante import distribuir_estudiantes puede_distribuir = auth.has_membership(role=myconf.take('roles.oexamen')) puede_distribuir |= auth.has_membership(role=myconf.take('roles.admin')) # distribuir a los estudiantes por las aulas que tenemos definidas C.distribuir_link = Accion(CAT(SPAN('', _class='glyphicon glyphicon-hand-up'), ' ', T("Distribuir aulas")), URL('distribucion', args=[C.examen.id], vars={'_distribuir': '1'}), puede_distribuir, _class="btn btn-default") if request.vars._distribuir: distribuir_estudiantes(C.examen.id) redirect(URL('distribucion', args=[C.examen.id])) cantidad = db(db.examen_aula_estudiante.examen_id == C.examen.id).count() if cantidad > 0: # --configurar el grid tbl = db.examen_aula_estudiante query = ((db.examen_aula_estudiante.examen_id == C.examen.id) & (db.estudiante.id == db.examen_aula_estudiante.estudiante_id) & (db.persona.id == db.estudiante.persona_id) & (db.candidatura.estudiante_id == \ db.examen_aula_estudiante.estudiante_id)) # -- conf de los campos for fd in db.persona: fd.readable = False db.persona.nombre_completo.readable = True db.persona.numero_identidad.readable = True db.persona.numero_identidad.label = T("#IDENT") for fd in tbl: fd.readable = False tbl.aula_id.readable = True for fd in db.estudiante: fd.readable = False for f in db.candidatura: f.readable = False db.persona.nombre_completo.label = T('Nombre') campos=[db.persona.numero_identidad, db.persona.nombre_completo, tbl.aula_id] text_lengths={'persona.nombre_completo': 50, 'persona.numero_identidad': 15} 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'), # XLS=(candidatura.EAEXLS, 'XLS') ) if request.vars._export_type: if C.examen.fecha is None or C.examen.inicio is None or C.examen.fin is None: myvars = Storage(request.vars) del myvars["_export_type"] session.flash = T('No se han definido los parámetros del exámen') redirect(URL('distribucion', vars=myvars, args=[C.examen.id])) response.context = C C.grid = grid_simple(query, orderby=[db.persona.nombre_completo], create=False, maxtextlengths=text_lengths, fields=campos, csv=True, history=False, exportclasses=exportadores, searchable=True, args=request.args[:1]) else: # --poner un mensaje msg_t = T("¡Avizo!") msg = T(''' No se han asignado aulas a este examen, las asignadas no son suficiente o no se realizó la distrubución. ''') msg = CAT(P(msg),P(Accion(T('Configuración de aulas'), URL('index', args=[request.args(0)]), True, _class="btn btn-default alert-link")), P(C.distribuir_link)) C.grid = DIV(H4(msg_t), msg,_class="alert alert-danger", _role="alert") return dict(C=C)
def codificacion(): 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(db.examen._format(C.examen)) menu_migas.append(T('Codificación de los estudiantes')) # -- configuración del grid query = ((db.examen_aula_estudiante.examen_id == C.examen.id) & (db.estudiante.id == db.examen_aula_estudiante.estudiante_id) & (db.persona.id == db.estudiante.persona_id) & (db.candidatura.estudiante_id == \ db.examen_aula_estudiante.estudiante_id)) 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')) text_lengths={'persona.nombre_completo': 50, 'persona.uuid': 100} # --conf campos for f in db.persona: f.readable = False db.persona.nombre_completo.readable = True db.persona.numero_identidad.readable = True db.persona.uuid.readable = True db.persona.uuid.label = 'UUID' for f in db.examen_aula_estudiante: f.readable = False db.examen_aula_estudiante.aula_id.readable = True for f in db.estudiante: f.readable = False for f in db.candidatura: f.readable = False campos=[db.persona.nombre_completo, db.persona.numero_identidad, db.persona.uuid, db.examen_aula_estudiante.aula_id] C.titulo = T('Codificación de los estudiantes') if request.vars._export_type: response.context = C C.grid = grid_simple(query, fields=campos, orderby=[db.persona.nombre_completo, db.examen_aula_estudiante.aula_id], csv=True, searchable=True, create=False, history=False, maxtextlengths=text_lengths, exportclasses=exportadores, args=request.args[:1]) return dict(C=C)
def planes(): '''Manejo de planes para una carrera''' C = Storage() C.carrera = db.carrera_uo(int(request.args(0))) C.unidad = db.unidad_organica(C.carrera.unidad_organica_id) C.escuela = db.escuela(C.unidad.escuela_id) # breadcumbs # enlace a la UO 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) # enlace a la opcion carreras de la UO c_link = Accion(T('Carreras'), URL('unidad', 'carreras', args=[C.unidad.id]), True) menu_migas.append(c_link) # planes C.carrera_format = carrera_uo_format(C.carrera) menu_migas.append(C.carrera_format) menu_migas.append(T("Planes")) # permisos puede_crear = auth.has_membership(role=myconf.take('roles.admin')) puede_editar, puede_borrar = (puede_crear, puede_crear) # -- contruir el grid de los planes tbl = db.plan_curricular query = ((tbl.id > 0) & (tbl.carrera_id == C.carrera.id)) # ver si es la opción de activar plan if 'activar' in request.args: plan = tbl(int(request.args(2))) # desactivar todos los planes db(query).update(estado=False) plan.update_record(estado=True) redirect(URL('carrera', 'planes', args=[C.carrera.id])) tbl.id.readable = False tbl.carrera_id.writable = False if 'new' in request.args: tbl.carrera_id.default = C.carrera.id campos = [tbl.nombre, tbl.estado] def _enlaces(row): co = CAT() link = URL('asignaturas', args=[row.id]) txt = CAT(SPAN('', _class="glyphicon glyphicon-book"), ' ', T('Asignaturas')) co.append(Accion(txt, link, True, _class="btn btn-default btn-sm")) if not row.estado: link = URL('planes', args=[C.carrera.id, 'activar', row.id], user_signature=True) txt = CAT(SPAN('', _class="glyphicon glyphicon-ok-sign"), ' ', T("Activar")) co.append(Accion(txt, link, True, _class="btn btn-default btn-sm")) return co enlaces = [dict(header='', body=_enlaces)] C.grid = grid_simple(query, create=puede_crear, editable=puede_editar, deletable=puede_borrar, fields=campos, links=enlaces, args=request.args[:1]) return dict(C=C)
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