|
@ -115,6 +115,71 @@ class Hodnoceni(bm.SeminarModelBase):
|
|||
|
||||
feedback = models.TextField('zpětná vazba', blank=True, default='', help_text='Zpětná vazba řešiteli (plain text)')
|
||||
|
||||
# TODO najít správné místo
|
||||
@staticmethod
|
||||
def vzorecek_na_prepocet(body, resitelu):
|
||||
return body * 3 / (resitelu + 2)
|
||||
|
||||
# TODO najít správné místo
|
||||
@staticmethod
|
||||
def inverze_vzorecku_na_prepocet(body, resitelu):
|
||||
return body * (resitelu + 2) / 3
|
||||
|
||||
@property
|
||||
def body_celkem(self):
|
||||
# FIXME řeším jen prvního řešitele.
|
||||
return Hodnoceni.objects.filter(problem=self.problem, reseni__resitele=self.reseni.resitele.first(), body__isnull=False).aggregate(Sum("body"))["body__sum"]
|
||||
|
||||
@body_celkem.setter
|
||||
def body_celkem(self, value):
|
||||
if value is None:
|
||||
zelvuska marked this conversation as resolved
|
||||
self.body = None
|
||||
else:
|
||||
if self.body is None:
|
||||
self.body = 0
|
||||
if self.body_celkem is None:
|
||||
self.body += value
|
||||
else:
|
||||
self.body += value - self.body_celkem
|
||||
|
||||
zelvuska marked this conversation as resolved
ledoian
commented
Tohle potenciálně generuje záporné body… Tohle potenciálně generuje záporné body…
zelvuska
commented
A to je špatně? A to je špatně?
ledoian
commented
Považuji to za dost neočekávatelné chování, zvlášť když jako org píšu body kladné. Obecně si myslím, že spíš strhávat body od již udělených nechceme (možná vyjma „ujelo mi bodování, zpětně měním počet bodů)… Považuji to za dost neočekávatelné chování, zvlášť když jako org píšu body kladné. Obecně si myslím, že spíš strhávat body od již udělených nechceme (možná vyjma „ujelo mi bodování, zpětně _měním_ počet bodů)…
zelvuska
commented
A jaké je tedy očekávané chování? A jaké je tedy očekávané chování?
ledoian
commented
Nedovolit to vůbec (a že má kdyžtak org napsat webařům, pokud nechápe proč)? Hodit aspoň Nedovolit to vůbec (a že má kdyžtak org napsat webařům, pokud nechápe proč)? Hodit aspoň `alert()`, že se o to org pokouší a že to bude vypadat blbě ve výsledkovce?
zelvuska
commented
Ale doteď tam žádná taková šaráda nebyla. (Otestováno, záporné body mohu zadat vesele.) A já na frontendu nepoznám, kolik za to už řešitel dostal… Ale doteď tam žádná taková šaráda nebyla. (Otestováno, záporné body mohu zadat vesele.) A já na frontendu nepoznám, kolik za to už řešitel dostal…
ledoian
commented
Ale doteď se ti nemohlo stát, že bys ty záporné body napsal omylem – musel bys explicitně zmáčknout mínus. Není potřeba orgy ochránit proti zlým úmyslům, ale proti dobrým chybám… Ale doteď se ti nemohlo stát, že bys ty záporné body napsal omylem – musel bys explicitně zmáčknout mínus. Není potřeba orgy ochránit proti zlým úmyslům, ale proti dobrým chybám…
zelvuska
commented
Přijde mi, že to v podstatě odchytává jen miniaturní část toho problému. To, když to zrovna vyjde záporné. Ale ve chvíli, kdy tam org zadá libovolný jiný nesprávný počet, tak to stejně nezjistíme. Tohle políčko prostě vyžaduje, aby tam org zadal správný počet. Přijde mi, že to v podstatě odchytává jen miniaturní část toho problému. To, když to zrovna vyjde záporné. Ale ve chvíli, kdy tam org zadá libovolný jiný nesprávný počet, tak to stejně nezjistíme. Tohle políčko prostě vyžaduje, aby tam org zadal správný počet.
zelvuska
commented
Jakoby souhlasím s tím, že tam ta obrana může být (přídám tam asi javascript, který vykřikne, pokud při načtení libovolná z těch hodnot je záporná). Ale nepřijde mi, že by to nějak signifikantně zvyšovalo ochranu proti špatnému zadání. Jakoby souhlasím s tím, že tam ta obrana může být (přídám tam asi javascript, který vykřikne, pokud při načtení libovolná z těch hodnot je záporná).
Ale nepřijde mi, že by to nějak signifikantně zvyšovalo ochranu proti špatnému zadání.
|
||||
@property
|
||||
def body_neprepocitane(self):
|
||||
if self.body is None:
|
||||
return None
|
||||
return self.inverze_vzorecku_na_prepocet(self.body, self.reseni.resitele.count())
|
||||
|
||||
@body_neprepocitane.setter
|
||||
def body_neprepocitane(self, value):
|
||||
if value is None:
|
||||
self.body = None
|
||||
else:
|
||||
self.body = self.vzorecek_na_prepocet(value, self.reseni.resitele.count())
|
||||
|
||||
@property
|
||||
def body_neprepocitane_celkem(self):
|
||||
if self.body_celkem is None:
|
||||
return None
|
||||
return self.inverze_vzorecku_na_prepocet(self.body_celkem, self.reseni.resitele.count())
|
||||
|
||||
@body_neprepocitane_celkem.setter
|
||||
def body_neprepocitane_celkem(self, value):
|
||||
if value is None:
|
||||
self.body = None
|
||||
else:
|
||||
self.body_celkem = self.vzorecek_na_prepocet(value, self.reseni.resitele.count())
|
||||
|
||||
@property
|
||||
def body_max(self):
|
||||
if not isinstance(Hodnoceni.objects.first().problem, am.Uloha):
|
||||
return None
|
||||
return self.problem.uloha.max_body
|
||||
|
||||
@property
|
||||
def body_neprepocitane_max(self):
|
||||
if self.body_max is None:
|
||||
return None
|
||||
return self.inverze_vzorecku_na_prepocet(self.body_max, self.reseni.resitele.count())
|
||||
|
||||
def __str__(self):
|
||||
return "{}, {}, {}".format(self.problem, self.reseni, self.body)
|
||||
|
||||
|
|
1 changed files with 65 additions and 0 deletions
Loading…
Reference in a new issue
Nechceš k tomu napsat assert nebo rovnou celý test, který by hlídal, že po nastavení bodů tímhle způsobem se správně aktualizuje počet bodů a celkový součet?
ditto níž