Upgrade odevzdavatka #30
Merged
zelvuska
merged 37 commits from upgrade_odevzdavatka
into master
2 years ago
Loading…
Reference in new issue
There is no content yet.
Delete Branch 'upgrade_odevzdavatka'
Deleting a branch is permanent. It CANNOT be undone. Continue?
Pokus o to, udělat řešitelům lepší prostředí na odevzdávání (a víc je přesvědčit, aby dělali to co mají)…
# Seřadíme tak, aby ty s nadproblem==None byly dole (větší motivace tam naklikat konkrétní úlohy) a pak nějak rozumně.
# Tohle je řazení pro odevzdávátko, kde je definován nadproblém, proto je to v tomto ifu. (Jinde si to netroufám řadit)
qs = qs.order_by("nadproblem", "kod", "nazev")
qs = [problem for problem in qs if problem.hlavni_problem.id == nadproblem_id]
Tohle je možná lepší psát nějakým filterem (ať už QuerySetovým, nebo čistě pythonovým
list(filter(lambda: ..., qs))
– není to úprava dat, jen filtrování, tak ať je to názornější.(A přirozeně, pokud by to šlo tím QuerySetovým, tak to může být rychlejší, protože databáze není napsaná v Pythonu :-))
No QuerySetovým to nejde, protože hlavni_problem není databázová věc… Nebo to jde nějak obejít?
Já si úplně nepamatuju, jestli to je nebo není DB věc :-) Takže holt klasickým pythoním filterem.
"insitetree": true,
"parent": 23,
"sort_order": 52,
"title": "Nahrát řešení k nadproblému {{nadproblem_id}}",
Zatím jsem neviděl realizaci, ale pojem „nadproblém“ bych nepsal nikam, kde ho můžou vidět řešitelé. Přijde mi dost matoucí i pro orgy, ale ti se aspoň mají koho zeptat :-)
Tohle políčkoje skryté, takže ho vidí jen pokud budou prohlížet html. To mi přijde dostatečně „ne můžou vidět“.
.select2multiple .select2-results__option--highlighted {
background-color: #e84e10 !important;
}
Přemýšlím, kde všude jsou Select2Multiple, jestli je to nerozbíjí. Ale snad ne.
Tak tohle je jen tam, kam jsme explicitně přidali
'data-dropdown-css-class': 'select2multiple'
. Spíš si teď naopak říkám, že ta barva možná měla být bez toho.select2multiple
Měl jsem na mysli obecně všechny Select2Multiple, nemělo se to týkat jen barvy…
Barva asi může být všude (v Adminu tyhle styly stejně nepoužíváme, ne?)
No ale tohle neovlivňuje všechny selecty. Tohle ovlivňuje jen ty, kterým tu třídu předhodíme…
A barvu bych tedy dal všude…
Třída
.select2multiple
je naše? Tak bych ji tím pádem pojmenoval nějak aspoň parciálně česky, myslel jsem, že hackujeme nějakou vestavěnou. (Uznávám, nečetl jsem kód moc pozorně…)Možná
.s2m-se-zaskrtavatky
?<hr>
<h4>Spolupráce s dalšími řešiteli</h4>
<p>Pokud řešíte ve více lidech, je <strong>potřeba</strong> přidat tyto lidi jako „Další autoři“. 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 <strong>jednou</strong> (ne každý sám).</p>
„Další auto__ry__“
„Osobní__ch__ údaj__ích__“
return data
class NahrajReseniNadproblemView(LoginRequiredMixin, ListView):
Možná lepší pojmenovat ve stylu
NahrajReseniRozcestnikTematekView
neboNahrajReseniVyberHlavnihoProblemuView
, nebo dokonceOdevzdavatkoVyberTematkaView
? Tady se žádné řešení nenahrává, a technicky to ani není nadproblém, ale hlavní problém (bo i nadproblém může mít nadproblém, teoreticky).# Zaříznutí starých řešitelů:
# FIXME: Je to tady dost naprasené, mělo by to asi být jinde…
Tohle FIXME se vztahuje IMHO i na zaříznutí nezadaných problémů… Teď bych to asi neřešil, ale možná ho dává smysl přesunout výš…
(
.get()
není funkce, která by měla za úkol řešit jakákoliv práva, takže by to sémanticky mělo být někam vyčleněno. Ale pořád nemám rozmyšleno / nastudováno kam…)return super().get(request, *args, **kwargs)
def get_initial(self):
nadproblem_id = self.kwargs["nadproblem_id"]
Nechceme ten nadproblém rovnou uložit jako Problém do
self
? Na první čtení jsem tady měl pocit, že když mi někdo předhodí blbost do URL, že někde něco musí spadnout…Užitečnost uložení přímo Problemu je i v tom, že pak podproblémy můžeš určit jako
nadproblem.podproblemy.count() > 0
o kus níž (v rychlosti nevidím, jestli related managers umí i.exists()
)Disclaimer: kód haluzím, nechtělo se mi to hledat přesně :-)
nadproblem_id = self.kwargs["nadproblem_id"]
return {
"nadproblem_id": nadproblem_id,
"problem": [] if m.Problem.objects.filter(stav=m.Problem.STAV_ZADANY, nadproblem__id=nadproblem_id) else nadproblem_id
Uh, tohle dělá co? Ať už to dělá cokoliv, tak to z toho není zřejmé. Zejména není samozřejmé, kdy je
QuerySet
falsey.Po chvíli čtení: když to má podproblémy, tak nic nenabízíme, jinak nabídneme tu věc přímo.
Buď bych za ten QuerySet aspoň přidal
.exists()
(Dokumentace), nebo úplně vyčlenil:<a href="{% url 'logout' %}">Odhlásit se</a><br>
<a href="{% url 'seminar_resitel_edit' %}">Upravit údaje</a><br>
<a href="{% url 'seminar_nahraj_reseni' %}">Poslat řešení</a><br>
<a href="{% url 'seminar_nahraj_reseni' %}">Nahrátí řešení</a><br>
„Nahrát “ bez í asi
# Interní, nemá se nikdy objevit v urls (jinak to účastníci vytrolí)
def formularOKView(request, text=''):
def formularOKView(request, text='', dalsi_odkazy: Iterable[tuple[str, str]] = ()):
V zájmu bezpečnosti bych možná spíš než
Iterable
použilSequence
, tj. věc, kde mají věci dané pořadí (množina a slovník jsou Iterable, ale ne Sequence; asi chceme, aby to pořadí, co tady napíšeme, se dodrželo.)Ne že by někdo aktuálně moc kontroloval typy, ale třeba jednou bude :-D
Za mě asi vesměs dobrý. Koukal jsem hlavně na kód, snažil jsem se ho udělat trochu přehlednější, vyloženě blbosti tam asi nevidím…
Jen pojmenovávací poznámka: objekt v Pythonu má atributy a metody, property je taková ta divná metoda, co se chová jako atribut. (Rychlý pokus v IPythonu mi naznačuje, že nemůžu mít property mimo třídu.)
Díky :)
0528dbbb9c
into master 2 years ago0528dbbb9c
.