Browse Source

Přepsány tituly

export_seznamu_prednasek
Pavel "LEdoian" Turinsky 4 years ago
parent
commit
80de63ab73
  1. 99
      seminar/models.py

99
seminar/models.py

@ -309,25 +309,90 @@ class Resitel(SeminarModelBase):
return sum(h.body for h in list(vsechna_hodnoceni)) return sum(h.body for h in list(vsechna_hodnoceni))
def get_titul(self, celkove_body=None): def get_titul(self, body=None):
"Vrati titul" "Vrati titul jako řetězec."
if celkove_body is None:
celkove_body = self.vsechny_body() # Nejprve si zadefinujeme titul
from enum import Enum
from functools import total_ordering
@total_ordering
class Titul(Enum):
""" Třída reprezentující možné tituly. Hodnoty jsou dvojice (dolní hranice, stringifikace). """
nic = (0, '')
bc = (20, 'Bc.')
mgr = (50, 'Mgr.')
dr = (100, 'Dr.')
doc = (200, 'Doc.')
prof = (500, 'Prof.')
akad = (1000, 'Akad.')
def __lt__(self, other):
return True if self.value[0] < other.value[0] else False
def __eq__(self, other): # Měla by být implicitní, ale klidně explicitně.
return True if self.value[0] == other.value[0] else False
if celkove_body < 10: def __str__(self):
return '' return self.value[1]
elif celkove_body < 20:
return 'Bc.' @classmethod
elif celkove_body < 50: def z_bodu(cls, body):
return 'Mgr.' aktualni = cls.nic
elif celkove_body < 100: # TODO: ověřit, že to funguje
return 'Dr.' for titul in cls: # Kdyžtak použít __members__.items()
elif celkove_body < 200: if titul.value[0] <= body:
return 'Doc.' aktualni = titul
elif celkove_body < 500: else:
return 'Prof.' break
return aktualni
# Titul pro 26. ročník
stary_titul = None
if body is None:
# Hledáme body v databázi
# V listopadu 2020 jsme se na filosofické schůzce shodli o změně hranic titulů:
# - body z 25. ročníku a dříve byly shledány dvakrát hodnotnějšími
# - proto se započítávají dvojnásobně a byly posunuté hranice titulů
# - staré tituly se ale nemají odebrat, pokud řešitel v t.č. minulém (26.) ročníku měl titul, má ho mít pořád.
hodnoceni_do_25_rocniku = Hodnoceni.objects.filter(cislo_body__rocnik__rocnik__lte=25,reseni__in=self.reseni_set.all())
novejsi_hodnoceni = Hodnoceni.objects.filter(reseni__in=self.reseni_set.all()).difference(hodnoceni_do_25_rocniku)
def body_z_hodnoceni(hh : list):
return sum(h.body for h in hh)
stare_body = body_z_hodnoceni(hodnoceni_do_25_rocniku)
nove_body = body_z_hodnoceni(novejsi_hodnoceni)
logicke_body = 2*stare_body + nove_body
hodnoceni_do_26_rocniku = Hodnoceni.objects.filter(cislo_body__rocnik__rocnik__lte=26,reseni__in=self.reseni_set.all())
def titul_do_26_rocniku(body):
""" Původní hranice bodů za tituly """
if body < 10:
return Titul.nic
elif body < 20:
return titul.bc
elif body < 50:
return titul.mgr
elif body < 100:
return titul.dr
elif body < 200:
return titul.doc
elif body < 500:
return titul.prof
else: else:
return 'Akad.' return titul.akad
stary_titul = titul_do_26_rocniku(body_z_hodnoceni(hodnoceni_do_26_rocniku))
else:
# Prostě titul podle aktuálních bodů
logicke_body = body
titul = Titul.z_bodu(logicke_body)
if stary_titul is None:
return str(titul)
return str(max(titul, stary_titul))
def __str__(self): def __str__(self):
return self.osoba.plne_jmeno() return self.osoba.plne_jmeno()

Loading…
Cancel
Save