Vylepšení odevzdávátka #13
Merged
zelvuska
merged 17 commits from vylepseni_odevzdavatka
into master
2 years ago
Loading…
Reference in new issue
There is no content yet.
Delete Branch 'vylepseni_odevzdavatka'
Deleting a branch is permanent. It CANNOT be undone. Continue?
Tohle by postupně mělo řešit #1237, tedy umět přidat další řešitele + umět body automaticky dopočítávat, a #1354, tedy umět napovídat body. Plus bych k tomu zařadil, že to má umět i říct, kolik řešitel bodů už za tento problém má…
WIP: Vylepšení odevzdávátkato Vylepšení odevzdávátka 2 years agoTu část, která je tu bychom měli mergenout předtím, než začnou řešitelé znovu odevzdávat…
Takže chceš, aby to někdo viděl ideálně ještě dneska?
Ano prosím :)
).exclude(
prezdivka_resitele=""
).filter(
prezdivka_resitele__startswith=self.q
Možná to chceme mít aspoň case-insensitive.
asi
…__icontains=self.q
function zkontroluj_hodnoceni() {
const pocet = $('.hodnoceni').length;
if (pocet === 1) { // vydím pouze plusko
i
qs = m.Resitel.objects.filter(
prezdivka_resitele__isnull=False
).exclude(
prezdivka_resitele=""
Nebylo by lepší ty řádky spojit do něčeho jako
prezdivka__len__gt=0
?Mě to takhle asi přijde popisnější a jsem si jistější, že to funguje…
prezdivka_resitele=""
).filter(
prezdivka_resitele__icontains=self.q
).all()
Tenhle způsob zalámání nejspíš nikde nemáme – trochu mi to rozbíjí čtení kódu. Ale možná nikde nemáme takovýhle kód, takže by to pokus o fluent kód (vizte níž) udělal možná taky…
Pod fluent kódem si představuji cca toto:
(Je to o něco kratší a neskáče tam odsazení jak na pile, což mi přijde trošičku lepší pro čtení, ale je to jen malá preference…)
Tak takhle mi zase chvíli trvá, než mi dojde, k čemu ta tečka na začátku řádku patří…
<p>Řešitelé: {% for r in object.resitele.all %} {{ r }} (<a href="mailto:{{ r.osoba.email }}?subject={{ "Oprava řešení M&M " | urlencode }}{{ object.problem.all.0.hlavni_problem | urlencode }}">{{ r.osoba.email }}</a>)
{% if forloop.revcounter0 != 0 %}, {% endif %} {% endfor %}</p>
<p>Řešitelé: {% for r in object.resitele.all %}{{ r }}{% if edit %}(<a href="mailto:{{ r.osoba.email }}?subject={{ "Oprava řešení M&M " | urlencode }}{{ object.problem.all.0.hlavni_problem | urlencode }}">{{ r.osoba.email }}</a>){% endif %}{% if forloop.revcounter0 != 0 %}, {% endif %} {% endfor %}</p>
Přijde mi lepší se nesnažit všechno nacpat na jeden řádek. To HTML se vykreslí stejně a v tomhle se mi špatně orientuje…
No až na to, že tam přibydou mezery. Nechceš to nasekat ty?
Sice nevím, kde přibudou mezery, kouknu na testweb, ale pak to klidně nasekám…
Na testwebu to aktuálně běží…
LGTM
Za mě všechno, nasekáš to?
Klidně to mergni, nasekám, ale možná to o pár desítek minut odložím (a když na to zapomenu úplně, tak to bolet taky nebude…)
Na jak velkou míru enterprise kódu míříme? DjangoTemplates jsou trochu na palici a těch mezer kvůli odřádkování se neumí zbavit, ale skoro určitě se to dá obejít pomocí triviálního filtru, takže by se pak dalo použít něco jako
{{ o | withemail }}
, což by rovnou udělalo tu výslednou věc a ten kód by byl přehlednější, ač na jednom řádku.Ale znamená to mít k tomu ještě kousek kódu vedle.
Alternativně se něco takového dá spočítat už ve view, což se ale bude motat s výkonným kódem, který už tak je nejspíš na spodní hranici přehlednosti…
(A nebo se smíříme s tím, že ten řádek nejde tak jednoduše přečíst. Ostatně, nebyl by první – výsledkovky v TeXu trpí stejným problémem…)
Možná se mi podaří tam dát aspoň pár málo odřádkování, ale těžko odhadnout…
Co takhle?
👎 Pořád je to na jednom řádku a teď tam navíc překážejí komentáře.
Tak to nechávám na tobě, protože na tohle máš očividně daleko vyšší nároky (mě to totiž ty komentáře naopak hezky oddělují…).
Nebo mě ještě napadlo tohle…
Případně ještě něco jako
čímž celý e-mail bude na jednom řádku, ale zase je to dost nahouby z pohledu tagů
Případně
nebo
</tr>
{% endfor %}
</table>
{% endif %}
Tohle nečtu, to se uvidí na testwebu, jak to vypadá… Čitelné to nejspíš je, tak asi dobrý…
A jak to vypadá?
LGTM
<p style="text-align: justify">Když řešení různých témátek vložíš každé zvlášť, lépe se v nich vyznáme a třeba ti je i rychleji opravíme.</p>
<p>Pokud řešíte ve více lidech, je <b>nutné</b> přidat tyto lidi jako „Autory řešení“! V tomto poli se vyhledává podle přezdívek, které si lze nastavit v „Osobní údaje“. Sebe vyplňovat nemusíte a za skupinu odevzdávejte pouze <b>jednou</b> (ne každý sám)!</p>
Nejsem si jistý, jestli není lepší spíš používat
<emph>
a<strong>
. A možná bych si odpustil ty vykřičníky, mohly by působit trochu děsivě…(To, jak moc velká zeď textu v odevzdávátku vzniká, posoudím za chvíli vizuálně…)
return ctx
def check_access(self):
""" Na orga máme nároky už v urls.py """
Tohle nemá být docstring, ale komentář.
def check_access(self):
""" Na orga máme nároky už v urls.py """
pass
„Better safe than sorry“? Je to ±jeden řádek tak jak tak, a aspoň stačí vidět jen jeden soubor…
def hodnoceniReseniView(request, pk, *args, **kwargs):
reseni = get_object_or_404(m.Reseni, pk=pk)
template_name = 'odevzdavatko/detail.html'
form_class = f.OhodnoceniReseniFormSet
Tohle zmizelo proč? (Na první pohled to vypadá jako velmi podezřelá změna, ale ještě jsem nedočetl zbytek kódu…)
Dočetl jsem a tuhle změnu pořád nechápu.
Protože se to tam vůbec nepoužívalo?
Já vůbec nechápu proč to tam bylo…
LOL aha. Já čekal, že se ten template vykresluje, ale on je tam redirect, tak je to jedno. Budiž :-)
if prezdivka_resitele == '':
return prezdivka_resitele
try:
Resitel.objects.get(prezdivka_resitele=prezdivka_resitele)
Tohle velmi zní, jako že ta přezdívka prostě nejde editovat vůbec – pokud už v databázi jsem, tak tohle matchne.
?
Pokud si Alice nastaví přezdívku „Axolotl“, tak ji má v databázi. Dotaz
Restitel.objects.get(prezdivka=Axolotl)
tedy tuto přezdívku najde a celýResitelEditForm
kvůli tomu nepůjde Alici odeslat, přestože je to její přezdívka.Promiň, tvůj komentář jsem pochopil jinak. Samozřejmě tohle je špatně… Dík
Ha, já nevím, podle čeho určit, který řešitel to edituje…
A nestačí to prostě uložit a zjistit, jestli to vyšlo? (Dost možná nestačí, nemám nastudovanou interakci formů a modelů, ale kdyby to stačilo, tak je to zdaleka nejjednodušší…)
A poznáš, co selhalo? A přijde mi, že tohle by mělo být ještě v clean_…
Vyřešeno. Ten objekt má při použití nastavený username…
Resitel.objects.get(prezdivka_resitele=prezdivka_resitele)
raise forms.ValidationError('Přezdívka je již použita')
except ObjectDoesNotExist:
pass
Reálně se celý try-block snaží jen imitovat podmínku „pokud přezdívka není zabraná“ – je přehlednější to vyřešit spíš něčím jako
if m.Resitel.objects.….count() > 0: raise Exception()
(ne nutně na jednom řádku a s určitě s příslušnými třídami a doplněními).</p>
<p class="gdpr">
Veřejně vystavujeme pouze výsledkové listiny, které také uchováváme pro archivní účely. Pokud ale z nějakého důvodu nebudeš chtít mít své jméno či školu uvedené ve výsledkové listině, není problém to zařídit, napiš nám. Z tištěných materiálů samozřejmě údaje už odstranit nemůžeme.
Veřejně vystavujeme pouze seznam přezdívek (pro výběr spoluřešitelů k řešení) a výsledkové listiny, které také uchováváme pro archivní účely. Pokud ale z nějakého důvodu nebudeš chtít mít své jméno či školu uvedené ve výsledkové listině, není problém to zařídit, napiš nám. Z tištěných materiálů samozřejmě údaje už odstranit nemůžeme.
👍
Bug: Pokud někdo už odmaturoval, tak sice on nemůže poslat řešení, ale někdo jiný tohoto člověka může přidat do svého řešení podle přezdívky. (Repro: nastavit řešiteli
r1
přezdívku a jakor
řešení poslat.r1
je odmaturovaný a už poslat řešení nemůže, ale tohle projde.)Řešíme rozsekání.
</p>
{% else %}
<p>Řešitelé: {{ object.resitele.all | join:", " }}</p>
{% endif %}
Pardon, snažil jsem se nějak dostat sem do konverzace aktuální stav těch 5 řádků, ale asi to neumím.
3110eb92a5
into master 2 years ago3110eb92a5
.