Vylepšení hodnotítka fix #1354 fix #1237 #20

Merged
zelvuska merged 25 commits from vylepseni_odevzdavatka into master 2023-06-12 22:17:08 +02:00
Showing only changes of commit 57b7c6372d - Show all commits

View file

@ -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)') 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
zelvuska marked this conversation as resolved Outdated

seminar/utils.py? odevzdavatko/utils.py?

seminar/utils.py? odevzdavatko/utils.py?
@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
Review

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?

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?
Review

ditto níž

ditto níž
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
Review

Tohle potenciálně generuje záporné body…

Tohle potenciálně generuje záporné body…
Review

A to je špatně?

A to je špatně?
Review

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ů)…
Review

A jaké je tedy očekávané chování?

A jaké je tedy očekávané chování?
Review

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?

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?
Review

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…
Review

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…
Review

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.
Review

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())
zelvuska marked this conversation as resolved Outdated

IMHO spíš počet bodů za úlohu je počet nepřepočítaných bodů, i.e. když řešíš úlohu za b bodů ve dvojici, tak plný počet označuje stav, kdy řešení dostane b bodů a tedy každý řešitel jen 0.75b.

IMHO spíš počet bodů za úlohu je počet nepřepočítaných bodů, i.e. když řešíš úlohu za $b$ bodů ve dvojici, tak plný počet označuje stav, kdy řešení dostane $b$ bodů a tedy každý řešitel jen $0.75b$.

No, tak b bodů jsou nepřepočítané body, to je ten stav, který chceš většinou řešit.

A body ve výsledkovce (tedy body bez přívlastku) jsou už ty přepočítané pomocí našeho kouzelného vzorce z webu…

No, tak $b$ bodů jsou nepřepočítané body, to je ten stav, který chceš většinou řešit. A body ve výsledkovce (tedy body bez přívlastku) jsou už ty přepočítané pomocí našeho kouzelného vzorce z webu…

No, ale tvoje self.body_max vrací b, i když má vracet 3b/(n+2), protože b má vracet self.body_neprepocitane_max, ne?

No, ale tvoje `self.body_max` vrací $b$, i když má vracet $3b/(n+2)$, protože $b$ má vracet `self.body_neprepocitane_max`, ne?

Mám to opačně, co?

Mám to opačně, co?

A hlavně to aktuálně z nějakého důvodu nefunguje :'(

A hlavně to aktuálně z nějakého důvodu nefunguje :'(

Áno, opačně

(Edit: fix race condition :-P)

Áno, opačně (Edit: fix race condition :-P)
def __str__(self): def __str__(self):
return "{}, {}, {}".format(self.problem, self.reseni, self.body) return "{}, {}, {}".format(self.problem, self.reseni, self.body)