Marketplace, CSS, iCal and a lot of things... #4

Closed
valentin wants to merge 59 commits from dev into main
1 changed files with 95 additions and 16 deletions
Showing only changes of commit 91e50e2c63 - Show all commits

View File

@ -24,18 +24,17 @@ class Classe(models.Model):
annee = models.IntegerField() annee = models.IntegerField()
jour_zero = models.DateField() jour_zero = models.DateField()
class Periode(models.Model):
classe = models.ForeignKey(Classe, on_delete=models.CASCADE)
#critere_colle = models.ForeignKey(Critere, on_delete=models.SET_NULL, null=True)
libelle = models.CharField(max_length=100)
debut = models.DateField()
fin = models.DateField()
class Meta:
ordering = ["debut"]
def no_semaine(self, jour): def no_semaine(self, jour):
"""
Entrées :
- self
- jour (datetime.date)
Sortie :
- Le numéro de la semaine contenant jour, sans compter les vacances.
Renvoie un numéro non spécifiée si le jour est pendant une période de vacances
"""
zone = self.classe.lycee.vacances zone = self.classe.lycee.vacances
vacances = calendrier[zone] vacances = calendrier[zone]
jour0 = self.classe.jour_zero jour0 = self.classe.jour_zero
@ -46,10 +45,28 @@ class Periode(models.Model):
n -= 2 n -= 2
return n return n
def range_semaines(self): def no_aujourdhui(self):
return range(self.no_semaine(self.debut), self.no_semaine(self.fin)+1) """
Entrée:
- self
Sortie:
- Le numéro de la semaine courante
"""
return self.no_semaine(date.today())
def date_debut_sem(self, n): def date_debut_sem(self, n):
"""
Entrée:
- self
- n (int) <-> numéro de semaine
Sortie:
- Le date du lundi de la semaine n
"""
zone = self.classe.lycee.vacances zone = self.classe.lycee.vacances
vacances = calendrier[zone] vacances = calendrier[zone]
jour0 = self.classe.jour_zero jour0 = self.classe.jour_zero
@ -62,6 +79,41 @@ class Periode(models.Model):
return jour return jour
def periode(self, jour):
"""
Entrées :
- self
- jour (datetime.date)
Sortie :
- La période (si elle existe et est unique) contenant jour
Exceptions:
- Le jour n'est pas dans une période
- Le jour est au chevauchement de deux périodes
"""
return Periode.objects.get(classe=self, debut__lte=jour, fin__gte=jour)
class Periode(models.Model):
classe = models.ForeignKey(Classe, on_delete=models.CASCADE)
#critere_colle = models.ForeignKey(Critere, on_delete=models.SET_NULL, null=True)
libelle = models.CharField(max_length=100)
debut = models.DateField()
fin = models.DateField()
class Meta:
ordering = ["debut"]
def range_semaines(self):
"""
Entrée:
- self
Sortie:
- Un range des numéros de semaine
"""
return range(self.classe.no_semaine(self.debut), self.classe.no_semaine(self.fin)+1)
class Matiere(models.Model): class Matiere(models.Model):
classe = models.ForeignKey(Classe, on_delete=models.CASCADE) classe = models.ForeignKey(Classe, on_delete=models.CASCADE)
@ -94,15 +146,24 @@ class Etudiant(models.Model):
#lv2 = models.ForeignKey(Matiere, on_delete=models.CASCADE) #lv2 = models.ForeignKey(Matiere, on_delete=models.CASCADE)
def appartient(self, groupe): def appartient(self, groupe):
"""
Renvoie si self appartient au groupe.
"""
return Appartenance.objects.filter(etudiant=self, groupe=groupe).exists() return Appartenance.objects.filter(etudiant=self, groupe=groupe).exists()
def groupe_du_critere(self, periode, critere): def groupe_du_critere(self, periode, critere):
"""
Renvoie le groupe du critère auquel self appartient.
"""
if isinstance(critere, str): if isinstance(critere, str):
critere = Critere.objects.get(periode=periode, libelle=critere) critere = Critere.objects.get(periode=periode, libelle=critere)
return Appartenance.objects.get(groupe__periode=periode, etudiant=self, groupe__critere=critere).groupe return Appartenance.objects.get(groupe__periode=periode, etudiant=self, groupe__critere=critere).groupe
def groupe_de_colle(self, periode): def groupe_de_colle(self, periode):
"""
Renvoie le groupe de colle de self pendant periode.
"""
return self.groupe_du_critere(periode, "colle") return self.groupe_du_critere(periode, "colle")
class Appartenance(models.Model): class Appartenance(models.Model):
@ -130,9 +191,15 @@ class Rotation(models.Model):
semaine = models.IntegerField() semaine = models.IntegerField()
def groupe_initial(self): def groupe_initial(self):
"""
Renvoie les étudiants inscrits à la colle sans prendre en compte les amendements.
"""
return Etudiant.objects.filter(id__in=Appartenance.objects.filter(groupe__in=self.groupes.all())) return Etudiant.objects.filter(id__in=Appartenance.objects.filter(groupe__in=self.groupes.all()))
def groupe_effectif(self): def groupe_effectif(self):
"""
Renvoie les étudiants inscrits à la colle en tenant compte des amendements.
"""
amendements=Amendement.objects.filter(rotation=self) amendements=Amendement.objects.filter(rotation=self)
return Etudiant.objects.filter( return Etudiant.objects.filter(
@ -142,6 +209,9 @@ class Rotation(models.Model):
) )
def effectif(self): def effectif(self):
"""
Renvoie le nombre d'étudiants inscrits à la colle en tenant compte des amendements.
"""
n_base = sum(len(groupe.membres()) for groupe in self.groupes.all()) n_base = sum(len(groupe.membres()) for groupe in self.groupes.all())
n_plus = len(Amendement.objects.filter(est_positif=True, rotation=self)) n_plus = len(Amendement.objects.filter(est_positif=True, rotation=self))
n_moins = len(Amendement.objects.filter(est_positif=False, rotation=self)) n_moins = len(Amendement.objects.filter(est_positif=False, rotation=self))
@ -149,27 +219,36 @@ class Rotation(models.Model):
return n_base + n_plus - n_moins return n_base + n_plus - n_moins
def est_pleine(self): def est_pleine(self):
"""
Renvoie si la colle est pleine.
"""
eff = self.effectif() eff = self.effectif()
return eff>=self.creneau.capacite return eff>=self.creneau.capacite
def est_modifiee(self): def est_modifiee(self):
"""
Renvoie si la colle a été amendée.
"""
return Amendement.objects.filter(rotation=self).exists() return Amendement.objects.filter(rotation=self).exists()
def amender(self, etudiant, est_positif): def amender(self, etudiant, est_positif):
# check annulation """
Amende la colle en (des)inscrivant etudiant à la colle self, selon est_positif.
"""
if Amendement.objects.filter(rotation=self, etudiant=etudiant, est_positif=est_positif).exists(): if Amendement.objects.filter(rotation=self, etudiant=etudiant, est_positif=est_positif).exists():
raise Exception("Duplication") raise Exception("Duplication")
elif Amendement.objects.filter(rotation=self, etudiant=etudiant, est_positif=not est_positif).exists(): elif Amendement.objects.filter(rotation=self, etudiant=etudiant, est_positif=not est_positif).exists():
# les amendements complémentaires s'annulent
Amendement.objects.get(rotation=self, etudiant=etudiant, est_positif=not est_positif).delete() Amendement.objects.get(rotation=self, etudiant=etudiant, est_positif=not est_positif).delete()
elif est_positif and any(etudiant.appartient(groupe) for groupe in self.groupes.all()): elif est_positif and any(etudiant.appartient(groupe) for groupe in self.groupes.all()):
# on ne peut pas s'ajouter si on est dans le groupe de base
raise Exception("Vous êtes déjà dans le groupe") raise Exception("Vous êtes déjà dans le groupe")
elif not est_positif and all(not etudiant.appartient(groupe) for groupe in self.groupes.all()): elif not est_positif and all(not etudiant.appartient(groupe) for groupe in self.groupes.all()):
raise Exception("Vous n'êtes pas dans le groupe") raise Exception("Vous n'êtes pas dans le groupe")
elif est_positif and self.est_pleine(): elif est_positif and self.est_pleine():
raise Exception("Capacité dépassée") raise Exception("Capacité dépassée")
else: else:
# on ne peut pas s'ajouter si on est dans le groupe de base
amendement = Amendement(rotation=self, etudiant=etudiant, est_positif=est_positif) amendement = Amendement(rotation=self, etudiant=etudiant, est_positif=est_positif)
amendement.save() amendement.save()