Přednášky #87

Merged
zelvuska merged 14 commits from prednasky into master 2025-02-26 20:58:50 +01:00
Owner

Trochu update aplikace přednášek + přidání Tomových požadavků.

Trochu update aplikace přednášek + přidání Tomových požadavků.
zelvuska added 10 commits 2025-01-24 20:38:37 +01:00
zelvuska added 1 commit 2025-01-24 20:42:56 +01:00
zelvuska added 1 commit 2025-01-24 21:03:52 +01:00
zelvuska added 1 commit 2025-01-24 21:07:31 +01:00
zelvuska added 1 commit 2025-01-29 00:31:18 +01:00
Author
Owner

Haha, v adminu seznamu nezobrazuji Znalosti 🤦

Haha, v adminu seznamu nezobrazuji Znalosti 🤦
zelvuska added 1 commit 2025-01-29 00:57:27 +01:00
zelvuska added 1 commit 2025-01-29 01:06:29 +01:00
zelvuska added 1 commit 2025-02-04 20:33:56 +01:00
zelvuska added 1 commit 2025-02-04 21:21:42 +01:00
zelvuska changed title from WIP: Přednášky to Přednášky 2025-02-04 21:22:52 +01:00
Author
Owner

Uživatelsky approved…

Uživatelsky approved…
zelvuska added 2 commits 2025-02-04 23:10:20 +01:00
Author
Owner

TODO testdata, testy, dořešit zbytek exportů (které smazat, které doplnit o Znalosti).

TODO testdata, testy, dořešit zbytek exportů (které smazat, které doplnit o `Znalost`i).
ledoian changed target branch from master to merge-vetev-pro-prednasky 2025-02-11 19:59:27 +01:00
ledoian reviewed 2025-02-11 22:07:11 +01:00
ledoian left a comment
Owner

Mostly LGTM

Mostly LGTM
@ -77,0 +87,4 @@
#: *(přechod z jména na objekt Osoby nějak kape na tom,
#: že všechna předchozí hlasování zde mají náhodný string…)
#: TODO Změnit to na Osobu*
ucastnik = models.CharField("Účastník", max_length=100)
Owner

Hmm, existuje čisté a praktické řešení. To čisté a datazachovávající je mít pro osobu nový FK (s null=True, blank=False) a mít stará řešení se string-účastníkem a nová s Osobou.

Praktické řešení je se na původní hlasy vykašlat, buď je dropnout úplně, nebo jim nastavit Osobu na NULL a pak sice nepůjde dohledat, kdo hlasoval k čemu, ale aspoň informace o zájmu v každém seznamu přežije. (Myslím, že ta druhá varianta vyžaduje zbytečně moc hackování třeba exportů, takže za to nestojí…)

Hmm, existuje čisté a praktické řešení. To čisté a datazachovávající je mít pro osobu nový FK (s `null=True, blank=False`) a mít stará řešení se string-účastníkem a nová s Osobou. Praktické řešení je se na původní hlasy vykašlat, buď je dropnout úplně, nebo jim nastavit Osobu na NULL a pak sice nepůjde dohledat, kdo hlasoval k čemu, ale aspoň informace o zájmu v každém seznamu přežije. (Myslím, že ta druhá varianta vyžaduje zbytečně moc hackování třeba exportů, takže za to nestojí…)
Owner

Also: tu Osobu (s null=True) si IMHO chceme ukládat už teď, ať pak můžeme zmigrovat a nechybí nám data… (původní hlasovátko ještě nevědělo nic o účastnických uživatelích/osobách…)

Also: tu Osobu (s null=True) si IMHO chceme ukládat už teď, ať pak můžeme zmigrovat a nechybí nám data… (původní hlasovátko ještě nevědělo nic o účastnických uživatelích/osobách…)
zelvuska marked this conversation as resolved
@ -38,0 +16,4 @@
{% for f, p in formy_a_prednasky %}
<h4>{{p.nazev}} ({{p.org}})</h4>
<p class="textprednasky">{{p.anotace}}</p>
<label>Obor: </label> {{p.obor}}<br>
Owner

Navrhuji mít kolem každého bloku hlasování aspoň dummy <div>, ať se kdyžtak dají různě popřeskládat (kupř. nějakým flexem na ultraširokém monitoru vedle sebe, idk) a nehrozí někde rozbití CSS. (Případně ať si můžu nahackovat dodatečná CSS :-D)

Navrhuji mít kolem každého bloku hlasování aspoň dummy `<div>`, ať se kdyžtak dají různě popřeskládat (kupř. nějakým flexem na ultraširokém monitoru vedle sebe, idk) a nehrozí někde rozbití CSS. (Případně ať si můžu nahackovat dodatečná CSS :-D)
zelvuska marked this conversation as resolved
@ -15,3 +15,3 @@
<a href="/prednasky/seznam_prednasek/{{seznam.id}}">Seznam přednášek na soustředění {{seznam.soustredeni.misto}} </a>
{% endif %}
<a href="/prednasky/seznam_prednasek/{{seznam.id}}/export">Export</a>
<a href="/prednasky/seznam_prednasek/{{seznam.id}}/hlasovani.csv">Export</a>
Owner

{% url … %}

`{% url … %}`
zelvuska marked this conversation as resolved
@ -32,3 +43,1 @@
# id z důvodu duplicitních jmen (přechod z jména na objekt Osoby nějak kape na tom,
# že všechna předchozí hlasování zde mají náhodný string…)
# TODO Změnit to na Osobu
ucastnik = osoba.plne_jmeno() + ' ' + str(osoba.id) # id, kvůli kolizi jmen
Owner

Asi OK. Možná si teoreticky můžeme místo účastníků u všeho držet celý objekt s informacemi o hlasování k celému seznamu, ale to za to nestojí, zvlášť pokud budeme mít ambice zmigrovat to celé na Osoby.

Asi OK. Možná si teoreticky můžeme místo účastníků u všeho držet celý objekt s informacemi o hlasování k celému seznamu, ale to za to nestojí, zvlášť pokud budeme mít ambice zmigrovat to celé na Osoby.
zelvuska marked this conversation as resolved
@ -58,0 +87,4 @@
prednasky = seznam.prednaska_set.all()
znalosti = seznam.znalost_set.all()
# FIXME Spadnout, pokud nesedí přednáška/znalost s formulářem. (Nějak se mi to nepovedlo.)
# Může se totiž stát, že se mezitím změnily přednášky (nějaká byla přidána/odebrána)
Owner

A neumíme v takovém případě dát rozumnou hlášku na frontend? (Jakože, špatná sada přednášek je asi divný okrajový případ a mám trochu chuť seznamu o kterém se aktuálně hlasuje zakázat změny, ale je otázka, jestli nemůže nastat nějaký jiný divný stav…)

A když už nic, tak navrhuji tady aspoň zalogovat stav všech formulářů, ať aspoň nepřijdeme o (špatná) data…

A neumíme v takovém případě dát rozumnou hlášku na frontend? (Jakože, špatná sada přednášek je asi divný okrajový případ a mám trochu chuť seznamu o kterém se aktuálně hlasuje zakázat změny, ale je otázka, jestli nemůže nastat nějaký jiný divný stav…) A když už nic, tak navrhuji tady aspoň zalogovat stav všech formulářů, ať aspoň nepřijdeme o (špatná) data…
Author
Owner

No ono možná více okrajový případ je, že form nebude validní (to se musí někde rozbít předvyplnění, musí se v tom účastník hrabat nebo prohlížeč musí dovolit odkliknout radio buttons…)

No ono možná více okrajový případ je, že form nebude validní (to se musí někde rozbít předvyplnění, musí se v tom účastník hrabat nebo prohlížeč musí dovolit odkliknout radio buttons…)
@ -63,0 +117,4 @@
{
'form_set_prednasky': form_set_prednasky, 'form_set_znalosti': form_set_znalosti,
'formy_a_prednasky': zip(form_set_prednasky, prednasky),
'formy_a_znalosti': zip(form_set_znalosti, znalosti),
Owner

Osobní preference: mít z toho „klasické“ datové typy (pole dvojic), ne zip objekty, které se konzumují a nedají se proto cyklit opakovaně. (Až to někdo bude zkoušet, tak je imho velká šance, že mu to bude dělat blbosti a nebude chápat proč…)

Osobní preference: mít z toho „klasické“ datové typy (pole dvojic), ne `zip` objekty, které se konzumují a nedají se proto cyklit opakovaně. (Až to někdo bude zkoušet, tak je imho velká šance, že mu to bude dělat blbosti a nebude chápat proč…)
zelvuska marked this conversation as resolved
@ -126,0 +221,4 @@
if h.prednaska.id in prednasky_map:
table[h.ucastnik][prednasky_map[h.prednaska.id]] = h.body
else:
pass # TODO Padat hlasitě?
Owner

Aspoň warning, ať přijde e-mail… (A i níž…)

Aspoň warning, ať přijde e-mail… (A i níž…)
zelvuska marked this conversation as resolved
ledoian reviewed 2025-02-19 17:49:06 +01:00
ledoian left a comment
Owner

Review dokumentace… Asi vesměs usable, jen místy se generuje divně…

Review dokumentace… Asi vesměs usable, jen místy se generuje divně…
@ -12,0 +12,4 @@
"""
Pomůcka pro :py:class:`prednasky.admin.SeznamAdmin` zobrazující hezky :py:class:`Přednášky <prednasky.models.Prednaska>`
v adminu :py:class:`Seznamu <prednasky.models.Seznam>`.
"""
Owner

Nechceš tomu prostě říkat Inline a odkázat dokumentaci Djanga rovnou? Přijde mi, že znalý stejně vidí, že to je Inline a neznalému „Pomůcka zobrazující hezky“ dá zbytečně málo informace.

Navrhuji „Inline pro … zobrazující …“

(i dál)

Nechceš tomu prostě říkat Inline a odkázat dokumentaci Djanga rovnou? Přijde mi, že znalý stejně vidí, že to je Inline a neznalému „Pomůcka zobrazující hezky“ dá zbytečně málo informace. Navrhuji „Inline pro … zobrazující …“ (i dál)
zelvuska marked this conversation as resolved
@ -57,1 +89,4 @@
class SeznamAdmin(VersionAdmin):
""" Admin pro :py:class:`Seznam <prednasky.models.Seznam>` """
Owner

Tyhle komentáře mi nepřijdou moc užitečné tbh. (Ale aspoň jsou krátké a asi nemám, co dalšího tam napsat anyway.)

Teda, možná se dá popsat, čím se liší od běžného autogenerovaného Adminu (přidání inlinů), ale to je taky literally dva řádky pod tím…

Tyhle komentáře mi nepřijdou moc užitečné tbh. (Ale aspoň jsou krátké a asi nemám, co dalšího tam napsat anyway.) Teda, možná se dá popsat, čím se liší od běžného autogenerovaného Adminu (přidání inlinů), ale to je taky literally dva řádky pod tím…
Author
Owner

Přidávají informaci, pro jaký model je to admin. (V kódu se dá napravit ta, že budeme místo admin.site.register používat správný dekorátor. Ale v dokumentaci ne…)

A ano, všechno ostatní je napsané hned podtím (ať už v kódu, nebo v dokumentaci).

Přidávají informaci, pro jaký model je to admin. (V kódu se dá napravit ta, že budeme místo `admin.site.register` používat správný dekorátor. Ale v dokumentaci ne…) A ano, všechno ostatní je napsané hned podtím (ať už v kódu, nebo v dokumentaci).
Owner

Uh, ale jména těch tříd dost držíme konzistentní a taky velmi jasná (i bez dekorátoru). Ale OK, aspoň to přidává odkaz ig

Uh, ale jména těch tříd dost držíme konzistentní a taky velmi jasná (i bez dekorátoru). Ale OK, aspoň to přidává odkaz ig
ledoian marked this conversation as resolved
@ -62,3 +97,4 @@
class PrednaskaAdmin(VersionAdmin):
""" Admin pro :py:class:`Přednášku <prednasky.models.Prednaska> """
Owner

>`

``>` ``
zelvuska marked this conversation as resolved
@ -100,0 +140,4 @@
"""
Admin pro :py:class:`Znalost <prednasky.models.Znalost>
TODO předělat, aby nedědila z :py:class:`prednasky.admin.PrednaskaAdmin`, ale společné věci byly zvlášť
"""
Owner

Za Znalost> má být `, před prednasky.admin.PrednaskaAdmin má taky být `.

Za ``Znalost>`` má být `` ` ``, před ``prednasky.admin.PrednaskaAdmin`` má taky být `` ` ``.
Author
Owner

Před PrednskaAdmin je…

Před PrednskaAdmin je…
zelvuska marked this conversation as resolved
@ -7,1 +12,4 @@
#: :py:class:`Hodnocení (Body) <prednasky.models.Hlasovani.Body>` této přednášky
body = forms.ChoiceField(label=False, widget=forms.RadioSelect, choices=Hlasovani.Body.choices, initial=Hlasovani.Body.JEDNO)
#: Množina formulářů (:py:class:`formset <django.forms.formsets.BaseFormSet>` :py:class:`HlasovaniPrednaskaFormů <prednasky.forms.HlasovaniPrednaskaForm>`)
Owner

btw, proč to automaticky nalinkovalo formset na dokumentaci Djanga 3.2 a ne toho, které používáme (což je určitě aspoň 4)?

btw, proč to automaticky nalinkovalo `formset` na dokumentaci Djanga _3.2_ a ne toho, které používáme (což je určitě aspoň 4)?
zelvuska marked this conversation as resolved
@ -8,0 +17,4 @@
HlasovaniPrednaskaFormSet = forms.formset_factory(HlasovaniPrednaskaForm, extra=0)
class HlasovaniZnalostiForm(forms.Form):
""" :py:class:`Formulář <django.forms.Form>` pro pro :py:class:`HlasováníOZnalostech <prednasky.models.HlasovaniOZnalostech>` o jedné :py:class:`Znalosti <prednasky.models.Znalost>`
Owner

Jsem pro smazání jednoho pro

Jsem pro smazání jednoho `pro` ☺
zelvuska marked this conversation as resolved
@ -8,0 +24,4 @@
#: ID :py:class:`Znalosti <prednasky.models.Znalost>`, o které hlasujeme
znalost_id = forms.IntegerField(widget=forms.HiddenInput)
#: :py:class:`Odpověď <prednasky.models.HlasovaniOZnalostech.Odpoved>` na tuto znalost
odpoved = forms.ChoiceField(label=False, widget=forms.RadioSelect, choices=HlasovaniOZnalostech.Odpoved.choices)
Owner

Ty jednotlivé fieldy mi přijdou dostatečně samopopisné, ale chápu, proč by bez těch dokumentačních komentářů generovaná dokumentace působila divně. Možná spíš rozepsat u znalost_id, proč je hidden a jak je to použité v templatech?

Ty jednotlivé fieldy mi přijdou dostatečně samopopisné, ale chápu, proč by bez těch dokumentačních komentářů generovaná dokumentace působila divně. Možná spíš rozepsat u `znalost_id`, proč je hidden a jak je to použité v templatech?
Author
Owner

A není to jasné z toho, jak funguje forms.HiddenInput? (A možná moc nechápu, co je myšleno tím použitím v templatech. Tam se jen vykreslí celý form.)

A není to jasné z toho, jak funguje `forms.HiddenInput`? (A možná moc nechápu, co je myšleno tím použitím v templatech. Tam se jen vykreslí celý form.)
Owner

Přijde mi dobré mít v tomhle místě při čtení kódu mít kontext, že template tu Znalost rozepisuje nezávisle, a tím pádem ve formuláři se má vložit neviditelně.

Ale je to spíš stylem „když už tam nějaký text má být, tak ať už tam je spíš tohle“…

Přijde mi dobré mít v tomhle místě při čtení kódu mít kontext, že template tu Znalost rozepisuje nezávisle, a tím pádem ve formuláři se má vložit neviditelně. Ale je to spíš stylem „když už tam nějaký text má být, tak ať už tam je spíš tohle“…
zelvuska marked this conversation as resolved
@ -27,0 +20,4 @@
class Stav(models.IntegerChoices):
""" Stav seznamu přednášek (NAVRH se používá k hlasování viz :py:func:`daný view <prednasky.views.newPrednaska>`). """
NAVRH = 1, "Návrh"
BUDE = 2, "Bude"
Owner

Umíme dokumentovat i přímo jednotlivé možnosti? Přijde mi, že si to tady říká o rozepsání, že NAVRH odpovídá před-soustřeďkové představě o tom, jaké přednášky dělat (dá se o nich třeba hlasovat ap.), zatímco BUDE odpovídá definitivní představě o tom, co bude/bylo a dá se porovnávat s novými návrhy (třeba aby stejná přednáška nebyla na pěti po sobě jdoucích sousech…)

(also: za mě sémanticky View využívá Model, takže odkazovat to, jak funguje Model podle použití ve View je kinda divné…)

Umíme dokumentovat i přímo jednotlivé možnosti? Přijde mi, že si to tady říká o rozepsání, že `NAVRH` odpovídá před-soustřeďkové představě o tom, jaké přednášky dělat (dá se o nich třeba hlasovat ap.), zatímco `BUDE` odpovídá definitivní představě o tom, co bude/bylo a dá se porovnávat s novými návrhy (třeba aby stejná přednáška nebyla na pěti po sobě jdoucích sousech…) (also: za mě sémanticky View využívá Model, takže odkazovat to, jak funguje Model podle použití ve View je kinda divné…)
zelvuska marked this conversation as resolved
@ -27,0 +24,4 @@
id = models.AutoField(primary_key=True)
soustredeni = models.ForeignKey(Soustredeni, null=True, default=None, on_delete=models.PROTECT)
stav = models.IntegerField("Stav", choices=Stav.choices, default=Stav.NAVRH) #: :py:class:`Stav <prednasky.models.Seznam.Stav>` Seznamu
Owner

Tady se v dokumentaci nenageneruje nic použitelného :-/

stav

Type: IntegerField
Stav
Choices:

  • 1
  • 2

Stav Seznamu

Tady se v dokumentaci nenageneruje nic použitelného :-/ > #### stav > Type: IntegerField > Stav > Choices: > - 1 > - 2 > > `Stav` Seznamu
Author
Owner

Nageneruje se prokliknutelný odkaz.

Nageneruje se prokliknutelný odkaz.
@ -60,0 +49,4 @@
id = models.AutoField(primary_key=True)
nazev = models.CharField("Název", max_length=300)
org = models.ForeignKey(Organizator, on_delete=models.PROTECT)
popis = models.TextField("Popis pro orgy", null=True, blank=True, help_text="Neveřejný popis pro ostatní orgy")
Owner

Gah, tady se prostě zkombinuje název políčka a help_text za sebe, takže to pak v dokumentaci vypadá divně (a hlavně nic neříkajícně).

Gah, tady se prostě zkombinuje název políčka a `help_text` za sebe, takže to pak v dokumentaci vypadá divně (a hlavně nic neříkajícně).
Author
Owner

A nějaký nápad, jak to vyřešit?

A nějaký nápad, jak to vyřešit?
@ -81,0 +117,4 @@
Reprezentuje hlasování jednoho účastníka
o jedné :py:class:`Znalosti <prednasky.models.Znalost>`
v jednom :py:class:`Seznamu <prednasky.models.Seznam>` (účastníkův pohled se totiž mezi sousy změnit)
"""
Owner

Asi se hodí napsat, že je to vlastně v podstatě přednáška, akorát s jinými odpověďmi v hlasování a jen o Znalostech získáváme feedback, nic dalšího nezkoumáme (a nevím, jaké další rozdíly jsou…)

Asi se hodí napsat, že je to vlastně v podstatě přednáška, akorát s jinými odpověďmi v hlasování a jen o Znalostech získáváme feedback, nic dalšího nezkoumáme (a nevím, jaké další rozdíly jsou…)
zelvuska marked this conversation as resolved
@ -75,0 +136,4 @@
"""
Náhled na to, kolik která přednáška v :py:class:`Seznamu <prednasky.models.Seznam>` :py:class:`hlasů <prednasky.models.Hlasovani.Body>`.
(Je otázka, zda tento View vůbec chceme. Pokud ano, hodilo by se do něj přidat i znalosti.)
"""
Owner

To je ten View, o kterém víme, že vlastně vůbec Seznamy neřeší? Tak ten buď smažme, nebo to aspoň zdokumentujme jako známý bug…

To je ten View, o kterém víme, že vlastně vůbec Seznamy neřeší? Tak ten buď smažme, nebo to aspoň zdokumentujme jako známý bug…
zelvuska marked this conversation as resolved
zelvuska added 100 commits 2025-02-21 16:38:03 +01:00
zelvuska changed target branch from merge-vetev-pro-prednasky to master 2025-02-21 16:38:32 +01:00
zelvuska added 3 commits 2025-02-21 17:14:46 +01:00
zelvuska added 2 commits 2025-02-21 17:17:35 +01:00
zelvuska added 1 commit 2025-02-22 16:38:24 +01:00
zelvuska added 2 commits 2025-02-26 13:48:06 +01:00
zelvuska added 1 commit 2025-02-26 14:06:28 +01:00
mam added 1 commit 2025-02-26 14:25:37 +01:00
Owner

Noooo, asi to lepší nebude… Ideálně někam poznamenat moje výtky k dokumentaci, ale jinak asi mergenout…

Noooo, asi to lepší nebude… Ideálně někam poznamenat moje výtky k dokumentaci, ale jinak asi mergenout…
zelvuska merged commit 73dcb441ef into master 2025-02-26 20:58:50 +01:00
zelvuska deleted branch prednasky 2025-02-26 20:58:51 +01:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
3 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: mam/mamweb#87
No description provided.