forked from DGNum/gestioCOF
[petitscours] Extrait la proposition de profs dans une méthode
Ce patch simplifie le code (dupliqué) de calcul des proposition de profs pour une demande dans une méthode du modèle`Demande`, et l'utilise. Il s'agit d'un préparatif pour #208; ce code devra être réutilisé dans le nouveau système. J'en ai également profité pour nettoyer deux vues de `petitscours`, `retraitement` et `demande_raw`, qui dupliquaient les vues `traitement` et `demande`, en utilisant des arguments nommés. petitscours/ * models.py: Définition de `get_proposals` pour calculer les propositions de profs pour une demande. * views.py: Utilise `get_proposals` à la place du code copié-collé. La fonction `_finalize_traitement` est maintenant responsable du calcul des `proposed_for` et `attribdata` à fournir aux templates. * urls.py: Passe directement les arguments aux vues plutôt que de faire deux fonctions séparées.
This commit is contained in:
parent
c960d97b67
commit
2b8f81c94b
3 changed files with 78 additions and 129 deletions
|
@ -3,6 +3,7 @@ from functools import reduce
|
|||
from django.contrib.auth.models import User
|
||||
from django.db import models
|
||||
from django.db.models import Min
|
||||
from django.utils.functional import cached_property
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
|
||||
|
@ -55,6 +56,12 @@ class PetitCoursAbility(models.Model):
|
|||
self.user.username, self.matiere, self.niveau
|
||||
)
|
||||
|
||||
@cached_property
|
||||
def counter(self) -> int:
|
||||
"""Le compteur d'attribution associé au professeur pour cette matière."""
|
||||
|
||||
return PetitCoursAttributionCounter.get_uptodate(self.user, self.matiere).count
|
||||
|
||||
|
||||
class PetitCoursDemande(models.Model):
|
||||
name = models.CharField(_("Nom/prénom"), max_length=200)
|
||||
|
@ -128,6 +135,42 @@ class PetitCoursDemande(models.Model):
|
|||
candidates = candidates.order_by("?").select_related().all()
|
||||
yield (matiere, candidates)
|
||||
|
||||
def get_proposals(self, *, max_candidates: int = None, redo: bool = False):
|
||||
"""Calcule une proposition de profs pour la demande.
|
||||
|
||||
Args:
|
||||
max_candidates (optionnel; défaut: `None`): Le nombre maximum de
|
||||
candidats à proposer par demande. Si `None` ou non spécifié,
|
||||
il n'y a pas de limite.
|
||||
|
||||
redo (optionel; défaut: `False`): Détermine si on re-calcule les
|
||||
propositions pour la demande (les professeurs à qui on a déjà
|
||||
proposé cette demande sont exclus).
|
||||
|
||||
Returns:
|
||||
proposals: Le dictionnaire qui associe à chaque matière la liste
|
||||
des professeurs proposés. Les matières pour lesquelles aucun
|
||||
professeur n'est disponible ne sont pas présentes dans
|
||||
`proposals`.
|
||||
unsatisfied: La liste des matières pour lesquelles aucun
|
||||
professeur n'est disponible.
|
||||
"""
|
||||
|
||||
proposals = {}
|
||||
unsatisfied = []
|
||||
for matiere, candidates in self.get_candidates(redo=redo):
|
||||
if not candidates:
|
||||
unsatisfied.append(matiere)
|
||||
else:
|
||||
proposals[matiere] = matiere_proposals = []
|
||||
|
||||
candidates = sorted(candidates, key=lambda c: c.counter)
|
||||
candidates = candidates[:max_candidates]
|
||||
for candidate in candidates[:max_candidates]:
|
||||
matiere_proposals.append(candidate.user)
|
||||
|
||||
return proposals, unsatisfied
|
||||
|
||||
class Meta:
|
||||
app_label = "gestioncof"
|
||||
verbose_name = "Demande de petits cours"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue