diff --git a/algorw/planilla.py b/algorw/planilla.py index f294886..4ed3fac 100644 --- a/algorw/planilla.py +++ b/algorw/planilla.py @@ -41,29 +41,49 @@ def parse_sheets(self, sheet_dict): # son siempre *listas* de objetos Alumne. self._alulist_by_id = self._parse_notas(sheet_dict[Hojas.Notas]) - # correctores es un diccionario que mapea: + # correctores es un diccionario que se envía a index.html, y mapea + # legajos a un arreglo con: # - # • legajo ("98765") a corrector individual - # • identificador de grupo ("G07") a corrector grupal - # • 'g' + legajo (p.ej. "g98765") a su corrector grupal correspondiente + # • corrector individual + # • corrector grupal + # • identificador de grupo (normalmente uno, o cero si es un grupo de + # una sola persona; podría haber más de uno si hubo rearme de grupos). # - # Esto último se usa en las validaciones Javascript en el navegador. - por_grupo = {alu.grupo: alu.ayudante_grupal for alu in self._alulist} - por_legajo = {alu.legajo: alu.ayudante_indiv for alu in self._alulist} - por_grupal = {f"g{alu.legajo}": alu.ayudante_grupal for alu in self._alulist} - self._correctores = {**por_grupo, **por_legajo, **por_grupal} + # Por ejemplo: + # + # correctores = {"98765": ["Docente 1", "Docente 2", "G17"], + # "54321": ["Docente 3"], + # "12345": ["Docente 1", "Docente 3"], + # } + self._correctores = {alu.legajo: [] for alu in self._alulist} + + for alu in self._alulist: + for docente in (alu.ayudante_indiv, alu.ayudante_grupal): + if docente: + self._correctores[alu.legajo].append(docente.nombre) + else: + break + else: + if alu.grupo: + # TODO: extraer de la hoja Repos los casos con más de un grupo. + self._correctores[alu.legajo].append(alu.grupo) @property - def correctores(self) -> Dict[str, str]: - # Compatibilidad con la antigua planilla. (Se incluye solo el nombre del - # ayudante, y se filtran asignaciones nulas.) - return {k: v.nombre for k, v in self._correctores.items() if v is not None} + def correctores(self) -> Dict[str, List[str]]: + return self._correctores.copy() + + def get_alu(self, legajo: str) -> Alumne: + """Lookup de alumne por legajo. + + Se lanza KeyError si no el legajo no está presente. + """ + return self._alulist[legajo] def get_alulist(self, identificador: str) -> List[Alumne]: """Devuelve les alumnes para un identificador (grupo o legajo). Si el identificador es un legajo, devuelve una lista de un solo - elemento. Se lanza KeyError si noexiste el identificador. + elemento. Se lanza KeyError si no existe el identificador. """ return self._alulist_by_id[identificador] diff --git a/main.py b/main.py index 0b1383b..d1f52ef 100644 --- a/main.py +++ b/main.py @@ -150,21 +150,26 @@ def post(): files = get_files() body = request.form["body"] or "" tipo = request.form["tipo"] - identificador = request.form["identificador"] + legajo = request.form["legajo"] + modalidad = Modalidad(request.form.get("modalidad", "i")) except KeyError as ex: raise InvalidForm(f"Formulario inválido sin campo {ex.args[0]!r}") from ex + except ValueError as ex: + raise InvalidForm(f"Formulario con campo inválido: {ex.args[0]}") from ex # Obtener alumnes que realizan la entrega. planilla = fetch_planilla() try: - alulist = planilla.get_alulist(identificador) + alumne = planilla.get_alu(legajo) except KeyError as ex: - raise InvalidForm(f"No se encuentra grupo o legajo {identificador!r}") from ex + raise InvalidForm(f"No se encuentra el legajo {legajo!r}") from ex # Validar varios aspectos de la entrega. if tp not in cfg.entregas: raise InvalidForm(f"La entrega {tp!r} es inválida") - elif len(alulist) > 1 and cfg.entregas[tp] != Modalidad.GRUPAL: + elif (modalidad == Modalidad.GRUPAL and cfg.entregas[tp] != Modalidad.GRUPAL) or ( + modalidad != Modalidad.GRUPAL and cfg.entregas[tp] == Modalidad.GRUPAL + ): raise ValueError(f"La entrega {tp} debe ser individual") elif tipo == "entrega" and not files: raise InvalidForm("No se ha adjuntado ningún archivo con extensión válida.") @@ -173,15 +178,22 @@ def post(): # Encontrar a le docente correspondiente. if cfg.entregas[tp] == Modalidad.INDIVIDUAL: - docente = alulist[0].ayudante_indiv + docente = alumne.ayudante_indiv elif cfg.entregas[tp] == Modalidad.GRUPAL: - docente = alulist[0].ayudante_grupal + docente = alumne.ayudante_grupal else: docente = None if not docente and cfg.entregas[tp] != Modalidad.PARCIALITO: - legajos = ", ".join(x.legajo for x in alulist) - raise FailedDependency(f"No hay corrector para la entrega {tp} de {legajos}") + raise FailedDependency(f"No hay corrector para la entrega {tp} de {legajo}") + + # Encontrar la lista de alumnes a quienes pertenece la entrega. + alulist = [alumne] + if modalidad == "grupal" and alumne.group: + try: + alulist = planilla.get_alulist(alumne.group) + except KeyError: + logging.warn(f"KeyError in get_alulist({alumne.group})") email = make_email(tp.upper(), alulist, docente, body) legajos = utils.sorted_strnum([x.legajo for x in alulist]) diff --git a/templates/index.html b/templates/index.html index de2de85..9df9410 100644 --- a/templates/index.html +++ b/templates/index.html @@ -14,6 +14,17 @@