Compare commits

...

1050 commits

Author SHA1 Message Date
MaM Web user
42380643df Merge branch 'korekturovatko' 2025-02-19 18:09:09 +01:00
bfd8619505 Funkční kotva na korekturu 2025-02-19 18:06:56 +01:00
0c43c56698 Zasílání e-mailu při přidání komentáře 2025-02-19 17:50:48 +01:00
c1eb44e599 Lepší mazání korektur a komentářů 2025-02-19 17:44:50 +01:00
2c53acc214 Merge branch 'korekturovatko' 2025-02-19 17:08:13 +01:00
cb8f0aab18 <hr> uvnitř divu komentáře 2025-02-19 17:06:07 +01:00
0d653acd2e Mazání korektur a komentářů 2025-02-19 17:05:04 +01:00
c41281378b Merge branch 'korekturovatko' 2025-02-19 16:30:36 +01:00
136aca5b83 Počty stavů musíme inicializovat na nulu, jinak se nezmění 2025-02-19 16:29:23 +01:00
1624fdecc2 Zapomenuté importy 2025-02-19 16:24:55 +01:00
de0f0d3040 KorekturyView je DetailView místo TemplateView 2025-02-19 15:51:14 +01:00
0e600c7113 Zbytečné volání funkce 2025-02-19 15:34:49 +01:00
eb9232305f Typ 2025-02-19 15:34:30 +01:00
2f30d8d27f Čistka nepotřebných věcí 2025-02-19 15:30:10 +01:00
0f1cd2e32a Aktualizování počtu korektur a zásluh 2025-02-19 15:22:14 +01:00
b99b4ffdc4 Debugovací výpisy smazány 2025-02-13 18:28:25 +01:00
c75697b221 Merge branch 'korekturovatko' 2025-02-13 18:16:54 +01:00
7da38fbc8a hotfix: aha, strany obsahují pouze stránky, kde jsou korektury 2025-02-13 18:16:27 +01:00
23620e178b Merge branch 'korekturovatko' 2025-02-12 13:48:45 +01:00
b81648cdc8 Přidáni ?version=… pro vyhození cachí prohlížeče 2025-02-12 13:47:19 +01:00
83efe094b8 Méně zesvětlené tagy 2025-02-12 13:45:12 +01:00
c2ed4b9cc2 Tlačítko na refresh (FUJ!) 2025-02-12 13:01:06 +01:00
074c9414b2 Autorefresh korektur 2025-02-12 12:46:07 +01:00
63285485ca Schování tlačítek v adminu za pomoci css 2025-02-11 21:35:34 +01:00
d59cba7c0d fix: Když po chybě znovu otevřu komentovací okénko, nemá být disabed 2025-02-11 21:08:58 +01:00
9a6b66f7d9 Fix přijímání prázdné množiny tagů 2025-02-11 21:07:28 +01:00
283320b161 Buttonky další/předchozí korektura 2025-02-11 20:53:46 +01:00
773cd7d419 Tagy u korektur 2025-02-11 18:54:15 +01:00
326be3eaa0 Znemožnění poslání editace/přidání komentáře vícekrát 2025-02-11 15:59:44 +01:00
6bfeab0a5a Umožnění rozdílu mezi autory komentářů a orgy informovanými při přidání komentáře 2025-02-11 15:44:39 +01:00
befb013e58 fix: zobrazování tlačítek na okomentování 2025-02-11 14:57:20 +01:00
82a1efc965 Odkaz na úpravu korektury 2025-02-11 14:52:40 +01:00
aed8e0ea44 button má mít asi type 2025-02-11 12:21:22 +01:00
7237364ba5 Hotfix: chybějící mezery za korekturami 2025-02-11 12:03:47 +01:00
6eb4633af0 Dynamické přidávání korektur a komentářů a úprava komentářů 2025-02-11 12:00:47 +01:00
9ccacaecb5 Merge branch 'master' into korekturovatko 2025-02-11 08:56:18 +01:00
955dd60235 Aktualizace přidávátka úloh a problémů (desetinná čísla a číslo místo dílu) 2025-02-09 22:46:29 +01:00
0a58751155 Přednášky odřádkování (odstavce) 2025-02-09 22:32:16 +01:00
d1ba5057f1 Překlep (HlasovaniOZnalostech.Odpoved) 2025-02-09 22:11:46 +01:00
683796ea7e Merge branch 'refs/heads/prednasky' 2025-02-06 16:57:15 +01:00
4a771b802b Průhledné pruhy 2025-02-06 14:48:32 +01:00
84ed9e09a7 Průhledné pruhy 2025-02-06 13:50:01 +01:00
9460c484f7 Zobrazení Znalostí (stejně jako Přednášek) u daného seznamu 2025-02-04 23:09:47 +01:00
2767e82f11 Merge branch 'master' into prednasky 2025-02-04 22:49:06 +01:00
42c651ceb7 Zlepšení dokumentace Djanga ve Sphinxu 2025-02-04 22:47:18 +01:00
5d4b600b00 Otočení významu odpovědí na hlasování o znalostech + WTF proč to byl string 2025-02-04 21:21:15 +01:00
c1da67dbb4 Dobře, příště už při dokumentaci nebudu hrabat na typové anotace. 2025-02-04 20:33:03 +01:00
5125525238 Dokumentace aplikace prednasky 2025-01-29 01:06:00 +01:00
34f0dffd79 Merge branch 'master' into prednasky 2025-01-29 00:57:24 +01:00
9e513bba9a Kopírování je častým zdrojem chyb 2025-01-29 00:30:55 +01:00
ef9d51d922 hotfix: WTF se stalo v django-autocomplete-light=3.12.0 (%20 místo mezer apod.) 2025-01-28 19:03:51 +01:00
ca5e6728dd hotfix: Tohle by mělo opravit problém s ukládáním bodů. Nejsem si tím ale moc jistý. 2025-01-28 18:48:57 +01:00
7563dd728c Fix make/deploy 2025-01-24 22:51:09 +01:00
cb14e4a91e A očividně nevygeneroval migraci k přepsání stringů u Hlasovani.Body v commitu e933c697 2025-01-24 21:07:06 +01:00
1719e8be9a Zapomněl jsem přidat CSS místo smazaného <i> 2025-01-24 21:03:44 +01:00
0634cdad87 Očividně každý systém žere uvozovky v f-stringu jinak 2025-01-24 20:42:44 +01:00
90e7b97b85 Zakomentován starý export 2025-01-24 20:35:24 +01:00
4001822842 Oprava práv pro aplikaci přednášky 2025-01-24 20:32:28 +01:00
7ca7093371 Export hlasování do CSV 2025-01-24 20:22:38 +01:00
fbd75d2f72 Hlasování o přednáškách pomocí formsetů… 2025-01-24 19:40:54 +01:00
e12b614e1c ODPOVED -> Odpoved 2025-01-24 16:01:39 +01:00
bcda95f0b3 Stringifikace hlasování o znalostech 2025-01-24 15:51:06 +01:00
6c35a5b6f3 Uhlazení prednasky.models 2025-01-24 15:49:55 +01:00
e933c6978d Choices na Enum (u přednášek) 2025-01-24 15:36:33 +01:00
2f814956a7 Nepoužívaný kus kódu 2025-01-24 15:20:00 +01:00
f61533df0a Přidání Znalosti do modelu 2025-01-24 15:13:37 +01:00
7676b0ef60 Merge branch 'korekturovatko-full' into korekturovatko 2025-01-22 20:28:31 +01:00
95b46541c0 Uhlazení JavaScriptu… 2025-01-22 20:28:24 +01:00
0af99d4f3e Aktualizace všech komentářů jako funkce (a aktualizace, ne vytvoření) 2025-01-22 20:23:12 +01:00
f369110cd3 Stránky PDF zvlášť 2025-01-22 19:36:44 +01:00
c54e11f25a Uhlazení JavaScriptu 2025-01-22 19:31:42 +01:00
e205ca52d3 Korektury načtené z API (místo v templatu)… 2025-01-22 18:38:28 +01:00
44a8649d0e Vytváření korektur z jednoho prototypu 2025-01-22 15:39:34 +01:00
a4175f836e Zvýrazňování čar (pointrů) pomocí atributu místo třídy 2025-01-22 11:25:19 +01:00
174087edc7 Merge pull request 'Zpřístupnění informací z "jak se o nás dozvěděli" propagaci' (!85) from zpristupneni_jak_jste_se_dozvedeli into master
Reviewed-on: #85
Reviewed-by: Pavel Turinský <ksgitea@pokemon.ledoian.cz>
2025-01-21 22:15:10 +01:00
4906f82365 Inteligentní hláška, pokud nejsou žádné přednášky. 2025-01-21 22:05:04 +01:00
41032be9eb Žádné vzpomínky na seminar.models! 2025-01-21 21:59:29 +01:00
422caadb9e Smazání nadbytečné vazebné tabulky (vazba bude zase viditelná v adminu) 2025-01-21 21:58:42 +01:00
aa997bfcd8 Aktuální sous jsme chtěli blank=True 2025-01-21 21:51:30 +01:00
1a2bef328b Inteligentnější přiřazování seznamu přednášek hlasovátku a upozornění na neexistující seznam 2025-01-21 21:43:43 +01:00
a84df1909b Lepší hláška po odeslání přednášek. 2025-01-21 21:14:19 +01:00
0724030bef nazev branche splnen 2025-01-21 20:39:31 +01:00
833893f233 Merge pull request 'odevzdavatko: odesílání emailu řešiteli při změně zpětné vazby' (!83) from notifikace-zpetne-vazby into master
Reviewed-on: #83
2025-01-21 18:10:48 +01:00
a7746cddda Merge branch 'master' into notifikace-zpetne-vazby 2025-01-21 18:05:10 +01:00
2c627b3d60 Když už jsem u toho, tak event.keyCode -> event.code 2025-01-21 13:01:57 +01:00
5f904b5c66 Vytažení commform konstant z funkce showform (budu potřebovat pro submit) 2025-01-21 12:58:23 +01:00
94ca903cec Chybějící const 2025-01-21 12:01:47 +01:00
50936e2b50 Prázdné okno editace komentáře klidně zavřít 2025-01-21 11:53:12 +01:00
4a35a63f31 Zbavení se deprecated věci 2025-01-21 10:49:14 +01:00
4006ecd6b8 A ještě jedno uhlazení CSS korekturovátka 2025-01-21 10:24:43 +01:00
ce2d183446 Ještě jedno uhlazení CSS korekturovátka 2025-01-21 10:23:48 +01:00
1ff69f943e Uhlazení CSS korekturovátka 2025-01-21 10:15:42 +01:00
050ebba03b Nepoužívaná css 2025-01-21 10:06:11 +01:00
443a226943 box -> oprava 2025-01-21 10:05:27 +01:00
7da9aa5fe3 Upozorňovat při zavírání okénka editace komentáře 2025-01-21 09:40:42 +01:00
e257f31ea5 x,y uložené v opravě (nemusíme tahat z čáry (pointru)) 2025-01-21 09:28:46 +01:00
87466ce2b6 box -> oprava 2025-01-21 09:23:20 +01:00
291f39990d Vyčištění IDček v html opravy 2025-01-21 09:12:36 +01:00
b637aed7ab Zapomenutý switch podle document.body.class místo podle atributu 2025-01-21 08:22:34 +01:00
3e2469fc45 Tady je těch prázných stringů nějak moc 2025-01-21 08:20:34 +01:00
d5c57da921 Čára (pointer) jako atribut opravy místo grepování "opid-pointer" 2025-01-21 08:17:12 +01:00
370dd7d841 Už nemáme text v opravě, takže nemá smysl ho editovat 2025-01-21 08:12:42 +01:00
d818ce251b Box_edit za pomoci objektu opravy místo id 2025-01-21 08:10:13 +01:00
4121de260e Ha, tohle jsem chtěl tady 2025-01-21 07:48:05 +01:00
a8b7788d35 Merge branch 'master' into korekturovatko 2025-01-21 07:40:42 +01:00
9aa3a5154d Přesnější query (aby nebral i jiné formuláře) 2025-01-21 07:39:55 +01:00
7a4c8239f6 Čára (pointer) opravy nemá vůbec interagovat s klikáním 2025-01-21 07:37:36 +01:00
0d67b5ff83 Prozatím takhle (proházel jsem kanály) 2025-01-21 00:07:14 +01:00
2deccfada4 Oprava URL 2025-01-20 23:48:54 +01:00
d2e199e509 Dynamický update stavu opravy 2025-01-20 23:40:06 +01:00
9b0fe3d32f Tohle tu nějak zůstalo 2025-01-20 22:35:46 +01:00
af41ca5784 Čistka scrollování 2025-01-20 22:11:53 +01:00
ad2d1e676c Zobrazení tlačítek podle atributu (ne v podle stavu v templatech) 2025-01-20 22:11:02 +01:00
00e0ed0a50 Skrývání korektur pomocí atributu 2025-01-20 21:45:37 +01:00
5563eb681c Status korektury jako atribut a ne třída 2025-01-20 21:06:33 +01:00
3b74772949 Přeházení JavaScriptových věcí 2025-01-20 19:12:27 +01:00
ee69bf4c4f Drobný úklid 2025-01-20 18:38:47 +01:00
071c66ee10 personalni: změna nastavení upozorňování u existujících řešitelů 2025-01-15 18:24:22 +01:00
1bee36d9b6 personalni: přejmenování sloupce pro upozornění na zpětnou vazbu 2025-01-14 21:00:33 +01:00
aa364b3f49 Výsledkovky do TeXu (a tituly) si odteď více hlídají, že jsou správně stažené. 2025-01-09 20:28:38 +01:00
9a11491dcc Merge pull request 'Admin strxfrm mac' (!81) from strxfrm_pro_mac into master
Reviewed-on: #81
2025-01-07 18:30:51 +01:00
a97071cd03 not dumb error log message 2025-01-07 17:49:16 +01:00
9c4c60765e logger done 2025-01-07 17:44:22 +01:00
d67d2f372b Oprava zobrazování deadlinů v aktuálním zadání 2025-01-03 18:00:47 +01:00
dd86fc1fcb Dynamický update stavu 2024-12-12 13:52:55 +01:00
341ae7ce45 Rozlišení lokálního/testovacího/produkčního webu v korekturovátku 2024-12-12 12:51:32 +01:00
7906c87733 Zanášení a zastaralé pomocí atributu místo třídy 2024-12-12 12:50:56 +01:00
daf24ff981 Rozstřílení korekturovátka (html) 2024-12-12 12:33:33 +01:00
0dde05f102 Odstranění textu a autora z opravy (přesun do prvního komentáře) 2024-12-12 11:50:17 +01:00
3528a44d3c Úprava chování korektury (schovává text korektury!!!) 2024-12-12 11:24:17 +01:00
524593b7ef Merge branch 'master' into korekturovatko 2024-12-10 19:03:22 +01:00
65ec9bfaed Fix přednášek 2024-12-10 16:33:25 +01:00
7038de2e25 Merge pull request 'Dokumentace zkratek do zdrojáků' (!77) from doc_zkratky into master
Reviewed-on: #77
2024-12-03 22:33:16 +01:00
c43575d8d2 Merge pull request 'Vnořené rámečky mají být vidět' (!82) from nested_ramecky into master
Reviewed-on: #82
2024-12-03 22:32:35 +01:00
8d6b352545 Merge pull request 'Práva v data/* a načítané pomocí ./manage.py loaddata' (!80) from prava into master
Reviewed-on: #80
2024-12-03 22:32:08 +01:00
51eeffd0c5 Ještě právo řešitele a trochu jiné řazení 2024-12-03 22:23:53 +01:00
42d57e7b42 Přebývající dump práv 2024-12-03 22:19:40 +01:00
edde41e1ab Chybějící data/groups.json 2024-12-03 22:19:10 +01:00
6ea212cdf8 odevzdavatko: odesílání emailu řešiteli při změně zpětné vazby
Toto se rozbíjí, když dojde ke smazání hodnocení v pořadí dříve, než
nějaké hodnocení s neprázdnou zpětnou vazbou, neboť řádky formsetu jsou
přečíslovány a pak špatně spárovány s původními hodnotami, takže se
nesprávně detekuje změna.
2024-12-03 21:30:35 +01:00
Pavel "LEdoian" Turinsky
497bb054ee Vnitřní rámečky by měly jít vidět
Vnořený rámeček totiž značí, co dalšího ostatní neuvidí po zveřejnění
vnějšího rámečku.
2024-12-03 21:27:40 +01:00
e9451ed62e Merge pull request 'Řešitelský rámeček (aneb resitel-only; pro neveřejné věci řešitele)' (!79) from ucastnicky-ramecek into master
Reviewed-on: #79
2024-12-03 21:22:30 +01:00
MaM Web user
e87b84b028 Fix rámečku u soustředění, kde jsem nebyl účastník (Jidáš) 2024-12-03 20:59:03 +01:00
22e88daf02 Korektury api init 2024-12-03 20:10:41 +01:00
04508206bb Funkce na posílání e-mailu rozhodně nemá být uvnitř View 2024-12-03 19:41:12 +01:00
8d09fd5389 Status opravy řešit přes enum 2024-12-03 19:10:36 +01:00
9df34c22e0 Moderní přístup k choices (umožňuje např. vytáhnout seznam všech hodnot) 2024-12-03 19:01:33 +01:00
d3d5484d0e Form se nikde nepoužívá 2024-12-03 18:37:23 +01:00
62160e8440 PDF už dostáváme v URL, není to potřeba shánět znovu 2024-12-03 18:33:26 +01:00
1e6e6118a7 Nepoužívat náhodné stringy, když už máme nějaké definované… 2024-12-03 18:20:25 +01:00
c1440687aa Nepotřebné importy… 2024-12-03 17:51:33 +01:00
69e870f958 Podle mě funguje… 2024-12-03 17:50:48 +01:00
ddd12b684d komentar 2024-12-02 11:51:19 +01:00
eb2b861d48 try except na sort 2024-12-01 15:47:49 +01:00
9020f5551d Oprava testdat KorekturovanePDF 2024-11-26 23:12:43 +01:00
ca462289a9 Zúžení except klauzule 2024-11-26 23:10:08 +01:00
80b20f5290 Práva v data/* a načítané pomocí ./manage.py loaddata 2024-11-26 20:05:49 +01:00
dbe8c39b37 Merge pull request 'Korektury Link Z Admina' (!72) from korektury-link-z-admina into master
Reviewed-on: #72
2024-11-26 19:37:18 +01:00
0aee5b9bdb Řešitelský rámeček (aneb resitel-only; pro neveřejné věci řešitele) 2024-11-26 19:33:44 +01:00
aee7637fcf Oprava křížku pro mazání hodnocení 2024-11-26 19:03:06 +01:00
5bf8df0218 Merge pull request 'Upgrade CKEditoru na verzi 5' (!76) from ckeditor5 into master
Reviewed-on: #76
2024-11-26 18:36:07 +01:00
5853b243dd Komentář 2024-11-26 18:34:54 +01:00
Pavel "LEdoian" Turinsky
5f87045b31 Ještě jedna aktualizace :-) 2024-11-19 22:39:18 +01:00
Pavel "LEdoian" Turinsky
36b261580c Aktualizace toho, jak se používá Sphinx u nás 2024-11-19 22:38:46 +01:00
Pavel "LEdoian" Turinsky
3920ac72aa Sepsané zkratky pro zdrojáky 2024-11-19 22:38:34 +01:00
dc91ef571f Upgrade CKEditoru na verzi 5 2024-11-19 22:05:12 +01:00
f0fbd8021f Merge pull request 'Přidání CKEditoru do Soustředění a Novinek (#1294)' (!75) from ckeditor-dalsi-veci into master
Reviewed-on: #75
2024-11-19 20:31:18 +01:00
3d035b994a Přidání CKEditoru do Soustředění a Novinek 2024-11-19 20:22:12 +01:00
db3dd39696 Merge pull request 'Možnost mít deadline celého čísla a sousu zároveň' (!74) from deadline-cisla-a-sousu into master
Reviewed-on: #74
2024-11-13 12:16:21 +01:00
e0e1dfda41 Merge remote-tracking branch 'origin/master' into deadline-cisla-a-sousu
# Conflicts:
#	tvorba/models.py
2024-11-13 12:14:33 +01:00
MaM Web user
44766efe2a Ještě migrace
— LEdo
2024-11-12 21:47:10 +01:00
d129f8a764 Merge remote-tracking branch 'refs/remotes/origin/master' 2024-11-12 21:45:59 +01:00
5b330567f8 generating file names with three functions 2024-11-12 21:44:17 +01:00
e6a21a5f1b Komentář, abychom kdyžtak uměli duplikovat přidání deadlinu 2024-11-12 21:41:32 +01:00
042246e948 dalsí do masteru zobrazovani kontaktnicku 2024-11-12 21:39:17 +01:00
e224ee66a7 push to master quick fix zobratzeni pro orrrgy 2024-11-12 21:23:13 +01:00
5ccb94d155 Merge pull request 'verejny kontaktnicek' (!71) from kontaktnicek_pro_vsecny into master
Reviewed-on: #71
2024-11-12 21:15:24 +01:00
fa00652a69 Merge branch 'master' into kontaktnicek_pro_vsecny 2024-11-12 21:14:10 +01:00
036c68bc2a another lambad function 2024-11-12 21:07:13 +01:00
fcc2c7c374 lol komentar 2024-11-12 20:37:50 +01:00
1b755ad1f7 deduplikace listu 2024-11-12 20:37:14 +01:00
ad5a242f8d upravy generate filename 2024-11-12 20:31:08 +01:00
6186914a7c aaaaa another bug 2024-11-12 20:27:51 +01:00
7a781e463f lol docker tu nemel byt 2024-11-12 20:20:43 +01:00
2dbbb588d0 opravy pro pull 2024-11-12 20:15:09 +01:00
eada7920f0 Možnost mít deadline celého čísla a sousu zároveň 2024-11-12 20:10:19 +01:00
6a7e4b1a39 Možnost mít deadline celého čísla a sousu zároveň 2024-11-12 19:58:14 +01:00
5883a5cd28 Merge pull request 'Předělání sousových views' (!57) from predelani_sousovych_view into master
Reviewed-on: #57
2024-11-12 19:33:10 +01:00
7e8092c30c tex -> tex_prikaz 2024-11-12 19:32:19 +01:00
f01a808ac2 Komentář 2024-11-12 19:29:17 +01:00
c8dd54e8ba opravy bad designu 2024-11-12 18:37:21 +01:00
Pavel 'LEdoian' Turinsky
f2825a97cf Přidání odkazu z Admina do korekturovátka 2024-11-11 07:46:34 +01:00
0f6f6a85b6 verejny kontaktnicek 2024-11-05 22:47:18 +01:00
502588fd3a Merge pull request 'soucet_bodu' (!70) from soucet_bodu into master
Reviewed-on: #70
2024-11-05 22:27:54 +01:00
b4b6c7c0ce seminar.models se načítá automaticky, budiž to mamweb.vsechno 2024-11-05 22:25:40 +01:00
om
0e83f96318 <p> se souctem bodu pod odevzdana reseni 2024-11-05 22:20:48 +01:00
om
e660a96df2 <p> se souctem bodu pod odevzdana reseni 2024-11-05 22:10:45 +01:00
854c902322 Merge branch 'master' into predelani_sousovych_view 2024-11-05 20:36:43 +01:00
024f8e0a80 Merge pull request 'Podezřelé semináře (#1465)' (!65) from podezrele-seminare into master
Reviewed-on: #65
2024-11-05 20:31:54 +01:00
bf726df117 Přepsání loggeru, protože to vypadá lépe (i kdyby to nefungovalo) 2024-11-05 20:30:55 +01:00
227d438ebd Poslední obrana proti importování seminar.models 2024-11-05 20:22:04 +01:00
71948383d2 Upraven popis aplikace seminar 2024-11-05 20:19:34 +01:00
6df9665af3 Migrace utišující Django (stejně se default nikdy nepoužívá). 2024-11-05 20:15:41 +01:00
c1938c8ff7 Odstřel funkcí pro migrace 2024-11-05 19:56:07 +01:00
4536c56a83 Merge pull request '+5 let limit maturity' (!69) from vek_maturity into master
Reviewed-on: #69
2024-11-05 19:53:43 +01:00
om
8156f7828e +5 let limit maturity 2024-11-05 19:25:36 +01:00
f5c2e22121 Zapomenutý seminar.models 2024-11-05 18:54:01 +01:00
62a42675f8 mv SeminarModelBase a OverwriteStorage 2024-11-05 18:53:38 +01:00
a372aa1bc2 Seminar v dokumentaci 2024-11-05 17:46:27 +01:00
d0cb46b658 Název url seznamu všech soustředění 2024-11-05 17:40:36 +01:00
ac6c41cc88 Název url seznamu všech soustředění 2024-11-05 15:10:36 +01:00
1c146ac5c3 Admin ReseniNode 2024-11-05 15:07:51 +01:00
527a7b3ea6 Pojmenované URL místo čistého URL 2024-11-05 14:58:25 +01:00
e4a72940e8 Merge remote-tracking branch 'origin/master' into podezrele-seminare 2024-11-05 14:46:50 +01:00
7b3708d7ab Merge pull request 'Oprava Testu Delani Orgem' (!68) from oprava_testu_delani_orgem into master
Reviewed-on: #68
2024-11-05 14:40:37 +01:00
c0825691a6 Merge branch 'master' into podezrele-seminare 2024-11-05 14:29:02 +01:00
b606f03191 Merge pull request 'Odstřel modelu TreeNode' (!67) from odstrel_modelu_treenode into master
Reviewed-on: #67
2024-11-05 14:19:50 +01:00
Pavel "LEdoian" Turinsky
461cfa4253 Treenode: komentář o tom, proč tam je i Text a Obrazek 2024-11-03 03:20:52 +01:00
Pavel "LEdoian" Turinsky
a2517abade Odstřel: závěrečná migrace 2024-11-03 03:12:16 +01:00
Pavel "LEdoian" Turinsky
51618e0d89 Oprava testu dělání orgem 2024-11-03 02:51:27 +01:00
Pavel "LEdoian" Turinsky
9b14e4a333 Treenode: žádné pomocné treenody nebudou. 2024-11-03 01:46:18 +01:00
Pavel "LEdoian" Turinsky
8283b530e9 Merge remote-tracking branch 'gitea/podezrele-seminare' into bez_treenodu_i_bez_podezrelych_seminaru
Zatím tak, jak se namergeovalo, změny k funkčnosti v dalších commitech
(ať neděláme zbytečně magické merge)
2024-11-03 01:42:56 +01:00
Pavel "LEdoian" Turinsky
e10747aa9f odstřel Treenode: zapomenutá závislost na contenttypes 2024-11-02 22:46:14 +01:00
Pavel "LEdoian" Turinsky
8ae19988b1 Vyrábět schéma semináře už nemá moc smysl :-) 2024-11-02 22:21:47 +01:00
Pavel "LEdoian" Turinsky
2659d72d2e odstřel TreeNode: 🔫💥💥💥 2024-11-02 22:00:08 +01:00
007332804e Fix: Ať to alespoň nehází chybu. 2024-11-01 16:40:21 +01:00
7f21d10c26 Ha, tak jsem se někde zamotal do import cyklu a musel jsem ReseniNode dát tam, kam patří 2024-11-01 14:02:07 +01:00
dc0ff80632 Přehlídnutý import seminar.models 2024-11-01 13:51:43 +01:00
07d1505e2a Odstřel (importů) treenodů 2024-11-01 13:50:48 +01:00
9ca5967261 Přesun vue (zatím) do treenodů 2024-11-01 13:20:28 +01:00
eb6eb2d6fb Přejmenování loggerů 2024-11-01 13:17:39 +01:00
28fef9a393 Pojmenované URL místo relativních URL 2024-11-01 12:58:02 +01:00
f8b1f0978c Přejmenování URLs 2024-11-01 12:38:47 +01:00
5f931c49a5 Merge branch 'master' into podezrele-seminare 2024-11-01 12:10:07 +01:00
MaM Web user
5c7710ed3a Formátování jsonu (jidáš) 2024-11-01 12:09:04 +01:00
6cdc37e80b Synchronizace sitetree s produkcí (než se v tom začnu hrabat) 2024-11-01 12:01:24 +01:00
8fd582d194 Další částečné řešení #1465 (Podezřelé seminare). Záměrně se vyhýbá treenode. 2024-11-01 11:44:17 +01:00
27a16719be Merge remote-tracking branch 'origin/master' into podezrele-seminare 2024-10-31 10:56:48 +01:00
87a76b17ef Merge pull request 'Odstrel Modelu Tvorba' (!66) from odstrel_modelu_tvorba into master
Reviewed-on: #66
2024-10-31 10:54:50 +01:00
Pavel "LEdoian" Turinsky
ad9a496cee Kus kódu není potřeba (a navíc obsahuje slovo seminář :-P) 2024-10-31 00:03:00 +01:00
Pavel "LEdoian" Turinsky
26d37d96f7 Frontendové náhrady semináře
(některé netestované, smůla.)
2024-10-31 00:01:07 +01:00
Pavel 'LEdoian' Turinsky
062f70e947 odstřel tvorby: relink – post 2024-10-30 22:41:11 +01:00
5db14ea242 Částečné řešení #1465 (Podezřelé seminare) 2024-10-30 15:03:17 +01:00
Pavel 'LEdoian' Turinsky
92c05342fb odstřel tvorby: pre – relink 2024-10-30 14:36:06 +01:00
b8f377b15d Merge pull request 'Odstrel Modelu Odevzdavatko' (!64) from odstrel_modelu_odevzdavatko into master
Reviewed-on: #64
2024-10-29 19:31:54 +01:00
a6085a64f4 Přepojení importů 2024-10-29 19:21:00 +01:00
c71195fba1 Merge branch 'master' into odstrel_modelu_odevzdavatko 2024-10-29 19:15:36 +01:00
9ee82f72a7 SeminarModelBase.admin_url nyní umí i modely v jiných appkách… 2024-10-29 19:12:42 +01:00
ce83247fe0 Doplnění nepovinného nesting selektoru &, abychom rozšířili support na starší prohlížeče 2024-10-28 12:29:08 +01:00
46a8f136fa Fix formularOKView (TemplateDoesNotExist) 2024-10-25 20:21:47 +02:00
e0dc75763c Jiný pokus o opravu stylů na starých iOSech 2024-10-25 13:31:50 +02:00
788e8d22a2 Pokus o opravu stylů na starých iOSech 2024-10-25 12:57:07 +02:00
11eb3c3665 Pohrobek splitu semináře (předchozího merge) 2024-10-24 11:51:28 +02:00
446515a52e Merge branch 'master' into predelani_sousovych_view
# Conflicts:
#	soustredeni/views.py
#	various/views/generic.py
2024-10-24 11:44:04 +02:00
Pavel "LEdoian" Turinsky
c7fe1cb386 post – odevzdávátko odstřeleno! 2024-10-23 23:11:56 +02:00
Pavel "LEdoian" Turinsky
07e9c8b7e4 manage 2024-10-23 23:09:19 +02:00
Pavel "LEdoian" Turinsky
10a824719b delete 2024-10-23 23:01:54 +02:00
Pavel "LEdoian" Turinsky
d288fefecc Zrušení dočasných odkazů do seminar.models.*
Poznámky:
- `seminar.models.base` je v pořádku (není to dočasný soubor)
- dočasné importy v `seminar/models/*.py` jsou taky validní, protože
  odtamtud zmizí. Jde mi o to, aby náhodné věci buď používaly
  už-správnou aplikaci, nebo postaru `seminar.models` jako celek, aby
  během odstřelu nebylo potřeba všechny věci přepisovat.

Ano, tohle je potenciálně kontroverzní commit. Ale je dočasný a mně
poněkud rozbíjí workflow, když mi v náhodné okamžiky odmítne běžet
náhodná část webu na kterou nesahám jen kvůli tomu, že importuje věci
odněkud, odkud to nečekám.

Alternativní řešení: dát správné importy (s dočasnými
`seminar.models.*`) do správných `aplikace/models.py` už teď a
importovat věci rovnou z výsledných modulů. To zajišťuje jak
konzistenci, tak to, že při odstřelu se cesta změní na jednom očekávaném
místě (resp. spíš se prostě smaže) a všechno ostatní bude pokračovat ve
fungování.
2024-10-23 22:54:14 +02:00
Pavel "LEdoian" Turinsky
130907174d relink 2024-10-23 21:54:49 +02:00
Pavel "LEdoian" Turinsky
33381b4307 create 2024-10-23 21:46:19 +02:00
c7910ed72a Merge pull request 'Více orgů k jednomu PDF v korekturovátku' (!52) from vice_orgu_v_korekturovatku into master
Reviewed-on: #52
2024-10-23 12:47:49 +02:00
35fa97d828 Merge branch 'master' into vice_orgu_v_korekturovatku 2024-10-23 12:25:19 +02:00
35131c96ec Novinky byly bůhví proč BigAutoField 2024-10-23 12:22:46 +02:00
acdadc06ab Merge branch 'ghoul_font' 2024-10-23 11:57:29 +02:00
2ae906495d Opravil jsem font (aby fungovala diakritika apod.) 2024-10-23 11:49:48 +02:00
Pavel "LEdoian" Turinsky
49e93025c0 unm 2: změna jména 2024-10-23 01:01:09 +02:00
Pavel "LEdoian" Turinsky
d1172b9d38 unm 2024-10-23 00:31:58 +02:00
Pavel "LEdoian" Turinsky
792a8fa4dc pre 2024-10-23 00:31:21 +02:00
622b632773 Merge pull request 'ghoul_font' (!63) from ghoul_font into master
Reviewed-on: #63
2024-10-22 23:49:55 +02:00
91b6220f24 Merge branch 'master' into ghoul_font 2024-10-22 22:31:05 +02:00
bb0cf871ec Merge pull request 'Oddělení sousových věcí' (!56) from split_sous into master
Reviewed-on: #56
2024-10-22 22:15:14 +02:00
3db6231a77 Název id v url 2024-10-22 22:11:59 +02:00
d5d55d76a9 Lepší komentář 2024-10-22 21:57:01 +02:00
0423bce762 Merge branch 'master' into split_sous
# Conflicts:
#	seminar/testutils.py
#	soustredeni/urls.py
2024-10-22 21:49:15 +02:00
f9a28689b0 views_all do __init__ 2024-10-22 21:30:33 +02:00
7108702e36 Merge pull request 'Rozstřílení seminářové aplikace' (!60) from split into master
Reviewed-on: #60
2024-10-22 21:27:20 +02:00
e443ecf33d views_all do __init__ 2024-10-22 21:23:11 +02:00
8d846647f6 Merge branch 'master' into split
# Conflicts:
#	various/templates/various/titulnistrana/titulnistrana.html
2024-10-22 20:18:48 +02:00
8ff66cb631 WTF? 2024-10-22 20:15:58 +02:00
227b83b701 halloween do settings 2024-10-22 20:10:27 +02:00
192f5d2ee7 Merge pull request 'Velká revize stylů (a některých JS)' (!44) from static-files-upgrade into master
Reviewed-on: #44
2024-10-22 20:00:11 +02:00
77d158a3a7 Změna version, aby počítače přenačetly CSSka 2024-10-22 19:56:08 +02:00
05e6e5fb59 Merge branch 'master' into static-files-upgrade 2024-10-22 19:29:54 +02:00
fbd5087c02 Změna version, aby počítače přenačetly CSSka 2024-10-22 19:29:29 +02:00
8dca676edc script presunut dolu pod april 2024-10-22 19:29:28 +02:00
ffcc2e04a3 TS -> TITULNI_STRANA a AZAD -> AKTUALNI_ZADANI 2024-10-22 19:28:12 +02:00
b491dcff7e Komentář k kontejneru 2024-10-22 19:19:31 +02:00
592ae29d35 ghoul font na posledních 7 dní října 2024 2024-10-22 19:05:41 +02:00
133c487637 Sloupeček ostatní ve výsledkovce (nová makra) 2024-10-13 23:39:47 +02:00
9f421e9d77 Sloupeček ostatní ve výsledkovce (nová makra) 2024-10-13 23:38:17 +02:00
e87bbe6048 Sloupeček ostatní ve výsledkovce (nová makra) 2024-10-13 23:31:05 +02:00
6ec2a10bf5 setuptools v requirements.txt 2024-10-10 13:23:51 +02:00
c45bf88d40 Merge pull request 'Export do abstraktů (soustředění)' (!61) from sbornicek into master
Reviewed-on: #61
2024-10-10 09:08:09 +02:00
733484b503 Export do abstraktů (soustředění) 2024-10-02 21:20:44 +02:00
e250f1d5dc Admin_url soustředění (aby mohlo být v login-baru) 2024-10-02 21:16:53 +02:00
d8d37adc1f Merge branch 'refs/heads/split_sous' into predelani_sousovych_view 2024-08-06 02:41:19 +02:00
1b01fe54d2 Merge branch 'refs/heads/master' into predelani_sousovych_view 2024-08-06 02:40:04 +02:00
b41b912aa4 Merge branch 'refs/heads/master' into split_sous 2024-08-06 02:39:08 +02:00
348096024e seminar/testutils.py 2024-08-06 02:33:53 +02:00
d952ab13a5 Generování konfer s konkrétními řešiteli 2024-08-05 13:15:29 +02:00
bf748b55ee Odstraněn zakomentovaný zbytečně složitý kód 2024-08-05 13:15:25 +02:00
6a781323e0 Typové anotace a další detaily v generování testdat k soustredeni 2024-08-05 13:15:21 +02:00
0b0a939de5 Oddělení generování testdat k sous věcem 2024-08-05 13:15:17 +02:00
c34716e134 seminar/utils.py 2024-08-05 11:46:38 +02:00
85c3969c50 seminar/templatetags 2024-08-04 19:21:46 +02:00
18364eb531 seminar/static 2024-08-04 19:15:15 +02:00
95ab0ee1dc Commandy zatím do various… 2024-08-04 19:08:24 +02:00
731c795ee6 Text a Obrazek 2024-08-04 19:01:09 +02:00
31b7cbb8d7 Tvorba (templates, admin, views) 2024-08-04 18:53:35 +02:00
ba2ea74a04 Obálky do personálního 2024-08-04 18:23:58 +02:00
a6eebb2d59 Seznam organizátorů do personálního 2024-08-04 18:15:01 +02:00
be8c9810e4 Rozdělení varous.views, aby odpovídali 5f7ec853 2024-08-04 17:51:26 +02:00
47894ce335 Přesun csrf_error 2024-08-04 17:43:29 +02:00
5f7ec853fa Přesun náhodných views do various 2024-08-04 17:41:24 +02:00
0cab9a8286 Přesun csrf_error 2024-08-04 17:02:25 +02:00
9920465f99 Split novinek 2024-08-04 16:57:39 +02:00
99a1fd9a9f Merge pull request 'Vyčištění náhodných věcí (co mě tak kde štvalo)' (!58) from vycisteni into master
Reviewed-on: #58

Není tam nic sporného ani kritického[^1], takže rovnou mergeuji…

[^1]: a máme docela málo kapacity na pročítání pull requestů.
2024-08-03 13:08:46 +02:00
431978e626 Starý kus kódu, který by se mohl hodit, ale je příšerně zastaralý (ObrazekAutocomplete) 2024-08-03 13:03:09 +02:00
69635b4234 TODO jsou v kanboardu 2024-08-03 13:01:10 +02:00
f0b642ca44 Nepoužívaný kus kódu 2024-08-03 12:58:38 +02:00
8dc3a2ba98 Odstraněňo staré testování e-mailů 2024-08-03 11:50:14 +02:00
8fef21900c Autogenerované komentáře a prázdné testy 2024-08-03 11:28:03 +02:00
1d36cd0761 Tohle nastavení už je v settings 2024-08-03 11:09:39 +02:00
e21a93f9e7 Middleware řešící sessioh mezi http a https se už fakt dlouho nepoužívá a navíc je toto téma dnes dávno pasé 2024-08-03 11:06:00 +02:00
ead2a4ede3 Tahle middleware se vůbec nepoužívá (používá se contextprocessor vzhled) 2024-08-03 11:04:19 +02:00
5f9bda9afe Ha, tohle mělo smazáno být už v 75344c2c 2024-08-03 10:56:51 +02:00
0817012130 Tahle moje „dokumentace“ je k ničemu, mažu 2024-08-03 10:55:03 +02:00
7a6a7cb0f5 Návod na nahrátí obrázků do odměn (a jinak o flatpage) nemá smysl mít v kořenové složce 2024-08-03 10:42:31 +02:00
75344c2c3a Kontroly codestylu nechceme 2024-08-03 10:40:03 +02:00
350623c6ac Python už je dávno defaultně utf-8, netřeba deklarace na začátku souboru 2024-08-03 10:38:00 +02:00
2bb732959a Nepoužívaný kód 2024-08-03 10:31:20 +02:00
d55199d6ae Achich ouvej, on je to Soustredeni_Ucastnici model 2024-08-02 23:44:37 +02:00
05a710185c Předělání sousových views do hodně inheritance stavu
Vím, že je toho tady trochu moc najednou, ale napadalo mě to tak propleteně…
2024-08-02 23:36:12 +02:00
4a3681b1a6 Drobnost 2024-08-02 20:32:07 +02:00
ccf3ec07f7 Generování konfer s konkrétními řešiteli 2024-08-02 20:17:31 +02:00
b44bdadb0a Odstraněn zakomentovaný zbytečně složitý kód 2024-08-02 20:15:02 +02:00
a6220e8d50 Typové anotace a další detaily v generování testdat k soustredeni 2024-08-02 20:13:45 +02:00
27beb34153 Oddělení generování testdat k sous věcem 2024-08-02 19:38:06 +02:00
62a65af40e Odstranění zbytečného importu 2024-08-02 19:29:13 +02:00
036af434c6 Oddělení urlpatterns konkrétního sousu 2024-08-02 19:25:25 +02:00
d1db1b952f Obsah modulu soustredeni 2024-08-02 19:17:49 +02:00
ddda7052ae Zbavení se zbytečného importu modelu Resitel 2024-08-02 19:17:11 +02:00
0fa2fb8e2b Úprava importů v soustredeni 2024-08-02 19:01:50 +02:00
b094347b7c Vytažení prefixu 'soustredeni/' do aplikace soustredeni 2024-08-02 18:34:05 +02:00
3188e024da Logy týracího skriptu do .gitignore 2024-08-02 13:24:29 +02:00
69019baf4e Merge pull request 'Přidání chybové hlášky :3' (!55) from divni-uzivatele into master
Reviewed-on: #55
2024-08-02 11:52:40 +02:00
ec474530e4 add .DS_store to .gitignore 2024-07-19 11:41:53 +02:00
f564d4e145 Správný odkaz na diff (na wiki)? 2024-07-09 19:32:09 +02:00
49aea5b8b4 Změny (z gimliho) v konfiguraci nginxu, které asi chceme 2024-07-09 19:30:32 +02:00
Pavel "LEdoian" Turinsky
ca8e8506b3 Přebytečná HttpResponse 2024-07-08 22:52:58 +02:00
Pavel "LEdoian" Turinsky
2444e5f985 Nemusím shazovat web 2024-07-08 22:39:46 +02:00
476f8263d4 Merge pull request 'Otevírání článků na správné straně' (!54) from clanek-strana into master
Reviewed-on: #54
2024-06-20 14:42:39 +02:00
1ce9cb445f Tady bylo „.cislo“ navíc… 2024-06-20 14:38:27 +02:00
6225630f9f Migrační kekel 2024-06-20 14:31:58 +02:00
0bebee5329 Merge branch 'master' into clanek-strana 2024-06-19 20:34:56 +02:00
Riki
3c3b9f755a Add strana column to Clanek
Optionally add page fragment to `resitelske_clanky.html`
2024-06-15 23:35:46 +02:00
40ca76d414 Merge pull request 'akce na sjednoceni cisel do +420 123 456 789' (!53) from sjednoceni_telefonu into master
Reviewed-on: #53
2024-06-15 23:33:24 +02:00
cf3c9f6f80 prazdy string -> continue 2024-06-15 23:27:42 +02:00
fad2c6940d oprava chybové hlášky 2024-06-15 23:20:35 +02:00
491f91cf47 akce na sjednoceni cisel do +420 123 456 78 2024-06-15 22:54:26 +02:00
Pavel "LEdoian" Turinsky
2304a8282c PDF nemusí mít zodpovědného orga! 2024-06-15 22:50:20 +02:00
Pavel "LEdoian" Turinsky
8a5659420d Na výběr orgů pro PDF chceme autocomplete 2024-06-12 02:25:01 +02:00
Pavel "LEdoian" Turinsky
d895cd0636 Víc orgů k jednomu PDF v korekturovátku 2024-06-12 02:02:37 +02:00
c0958d79db Merge pull request 'Úpravy Admina před víkendovkou' (!50) from upravy-admina-pred-vikendovkou into master
Reviewed-on: #50
2024-06-04 20:20:02 +02:00
737c296da9 Merge pull request 'Vylepšení seznamu aplikací v Adminu' (!51) from pojmenovane_aplikace into master
Reviewed-on: #51
2024-06-04 20:19:57 +02:00
Pavel "LEdoian" Turinsky
067cd07352 Zapomenutý choice u osoby 2024-06-03 16:31:38 +02:00
Pavel "LEdoian" Turinsky
f75408e936 fix závislostí seminar/0117 2024-06-03 14:10:41 +02:00
Pavel "LEdoian" Turinsky
c917655a22 Při make/init_local nesyncujeme flatpages
Je to otravné a navíc to vyžaduje klíč…
2024-06-03 14:02:05 +02:00
Pavel "LEdoian" Turinsky
c78b932587 Oprava odhlášeného admina 2024-06-03 03:02:06 +02:00
Pavel "LEdoian" Turinsky
381c5ca3de Hezká jména a pořadí aplikací 2024-06-03 02:06:00 +02:00
Pavel "LEdoian" Turinsky
15b09c23a7 Posunutí odstřelu novinek až za reformu pohlaví 2024-06-03 01:28:18 +02:00
7c1d9a0329 Merge pull request 'Split Novinky' (!48) from split-novinky into master
Reviewed-on: #48
2024-06-02 22:49:15 +02:00
Pavel "LEdoian" Turinsky
e431e23ad4 Vyrábění orgů z řešitelů 2024-06-02 18:08:18 +02:00
Pavel "LEdoian" Turinsky
8dbb92d3a4 Filtrováni řešitelů 2024-06-02 17:17:57 +02:00
e06080ae31 Merge pull request 'Reforma pohlaví' (!49) from reforma_pohlavi into master
Reviewed-on: #49
2024-05-25 18:21:24 +02:00
Pavel "LEdoian" Turinsky
6165c5916b Zapomenutá závislost 2024-05-21 21:35:06 +02:00
Pavel "LEdoian" Turinsky
bb1fb87665 Oprava migrace kolem pohlaví 2024-05-21 21:33:42 +02:00
Pavel "LEdoian" Turinsky
8949424f48 Zapomenutá migrace post_sous 2024-05-21 21:33:25 +02:00
37f988f478 Merge branch 'master' into reforma_pohlavi 2024-05-21 21:20:37 +02:00
Pavel "LEdoian" Turinsky
a3a9c629d8 Reforma pohlaví, I guess 2024-05-21 21:02:53 +02:00
Pavel "LEdoian" Turinsky
607129a899 Úprava orgorozcestníku 2024-05-13 23:45:47 +02:00
Pavel "LEdoian" Turinsky
b8328c0932 Merge branch 'master' into split-novinky 2024-05-13 23:45:30 +02:00
Pavel "LEdoian" Turinsky
2ce45b3d89 Co dalšího nezapomenout při odstřelu aplikací 2024-05-13 23:44:54 +02:00
Pavel "LEdoian" Turinsky
e618d390de Orgorozcestník používá urls, ne hardcodované cesty 2024-05-13 23:44:26 +02:00
af9f244207 Drobný nesting 2024-05-13 23:26:16 +02:00
Pavel "LEdoian" Turinsky
7e6dd72722 Přesunutí admina pro novinky 2024-05-13 23:13:51 +02:00
Pavel "LEdoian" Turinsky
3be9578ec3 Novinky split
It's everything, everything at once.
2024-05-13 23:10:22 +02:00
20691f483a Merge remote-tracking branch 'origin/master' into static-files-upgrade 2024-05-13 22:41:09 +02:00
64465a0471 Merge pull request 'Oddělení soustředění do vlastní aplikace' (!47) from split-soustredeni into master
Reviewed-on: #47
2024-05-13 22:16:52 +02:00
Pavel "LEdoian" Turinsky
7569447baa Oprava assertEquals na assertEqual
první je deprecated a v Py3.12 už nefunguje.
2024-05-13 22:12:51 +02:00
Pavel "LEdoian" Turinsky
235bd096e0 Merge branch 'master' into split-soustredeni 2024-05-01 16:35:19 +02:00
Pavel "LEdoian" Turinsky
6c59c3c2ed Oprava jmen modelů po odstřelu nastavení 2024-05-01 16:32:54 +02:00
Pavel "LEdoian" Turinsky
9f08ec332f Oprava jmen modelů po odstřelu nastavení 2024-05-01 16:31:54 +02:00
Pavel "LEdoian" Turinsky
e075a9e749 Oprava jmen modelů po odstřelu personálií 2024-05-01 16:27:39 +02:00
Pavel "LEdoian" Turinsky
8c4bf4d19a Oprava jmen modelů v org právech 2024-05-01 15:48:33 +02:00
Pavel "LEdoian" Turinsky
e3771f865d Relink – post, asi done? 2024-05-01 15:37:54 +02:00
Pavel "LEdoian" Turinsky
cdc1472595 Pre, unmanage, create. Snad ve finální podobě. 2024-05-01 01:15:27 +02:00
4d13b0eb25 Tohle je myslím zastaralé (stará verze bootstrapu) 2024-04-30 23:57:55 +02:00
6cc1b1fbe7 Tohle je spíše nepoužívané 2024-04-30 23:57:32 +02:00
72f11a25ce Myslím, že funguje, že jsem byl jen hloupý 2024-04-30 23:54:57 +02:00
3f1a570878 Nějaké další přechody na CSS nesting 2024-04-30 23:53:50 +02:00
c21d040202 Merge pull request 'Split Apps: oddělení personálních modelů' (!43) from split-apps into master
Reviewed-on: #43

Muhahaha
2024-04-30 23:48:35 +02:00
53caf7f73a Novinka je rozhodně modul (můžeme ji použít kdekoliv, nejen na jedné konkrétní stránce) 2024-04-30 23:28:37 +02:00
ed703b10a1 Vize, jak by měly vypadat CSSka konkrétních stránek (a možná CSSka obecně) 2024-04-30 23:27:53 +02:00
Pavel "LEdoian" Turinsky
99c0095465 Fix migrací: přibyl FK na masteru během překopávání 2024-04-30 23:00:28 +02:00
b8b0c5440f Nějaký základ nové verze CSSek 2024-04-30 22:47:03 +02:00
Pavel "LEdoian" Turinsky
676b94ca1b Oprava pořadí migrací v Šifrovačce 2024-04-30 22:27:06 +02:00
Pavel "LEdoian" Turinsky
6ab00392cc Použít přímo nový model
… když už můžeme
2024-04-30 22:20:36 +02:00
Pavel "LEdoian" Turinsky
5070a4d914 Merge branch 'master' into split-apps
Aby se to snáz mergeovalo
2024-04-30 22:20:06 +02:00
Pavel 'LEdoian' Turinsky
77d392f14f fixup! Fix importů v personalni.models.Resitel 2024-04-30 21:36:59 +02:00
Pavel 'LEdoian' Turinsky
03589e484c Fix importů v personalni.models.Resitel
Lokální, přehlédl jsem je…
2024-04-30 21:34:54 +02:00
Pavel 'LEdoian' Turinsky
8ab25545a4 Poznámky k FK/1to1F v creaet 2024-04-30 21:07:11 +02:00
Pavel 'LEdoian' Turinsky
4eb6746c75 Chybějící ForeignKeys/1-2-1Keys 2024-04-30 21:05:10 +02:00
48123a8ce2 Merge branch 'refs/heads/master' into static-files-upgrade
# Conflicts:
#	mamweb/templates/base.html
2024-04-30 21:03:12 +02:00
d09a08f53f fix: Přeskakování v šifrovačce (je tam faaaaakt hodně sněhu) 2024-04-22 23:27:29 +02:00
9a93f95490 fix: Nápovědy v šifrovačce 2024-04-21 21:06:56 +02:00
fd736829c2 Merge pull request 'Nápovědy v šifrovačce' (!46) from sifrovackav2 into master
Reviewed-on: #46
2024-04-21 20:56:41 +02:00
026efe2467 Nápovědy v šifrovačce 2024-04-14 15:09:03 +02:00
a301b122fd Apríl 2024 2024-03-31 19:12:24 +02:00
Pavel 'LEdoian' Turinsky
51f730fe71 typo… 2024-03-26 22:27:48 +01:00
Pavel 'LEdoian' Turinsky
e0d45ddf5d Pomigrační migrace
lol wording
2024-03-26 22:26:33 +01:00
Pavel 'LEdoian' Turinsky
9b12681e45 pomigrační safeguardy 2024-03-26 22:23:40 +01:00
Pavel 'LEdoian' Turinsky
d21ac37187 vazba 2024-03-26 22:19:38 +01:00
Pavel 'LEdoian' Turinsky
49f9b05285 nezapomenout vazby… 2024-03-26 22:19:02 +01:00
Pavel 'LEdoian' Turinsky
a17914f49c Personalni: managed = True + makemigrations 2024-03-26 22:18:25 +01:00
Pavel 'LEdoian' Turinsky
b4b41b9499 Přidání závislostí do delete 2024-03-26 22:18:12 +01:00
Pavel 'LEdoian' Turinsky
1a3dd5d6b2 Jak zařídit, že model bude managed 2024-03-26 22:17:53 +01:00
Pavel 'LEdoian' Turinsky
54db53805a Nezapomenout na vazby 2024-03-26 22:16:59 +01:00
Pavel 'LEdoian' Turinsky
b17b97e4e4 OrgSkolyAutocompleteTestCase: jde vypnout
Když máme jiný model, tak se nepotkají typy dumpů.

Cherry-pickable.
2024-03-26 22:09:12 +01:00
Pavel 'LEdoian' Turinsky
9c1c393395 delete notes 2024-03-19 23:11:15 +01:00
Pavel 'LEdoian' Turinsky
858b5ce054 Smazání, makemigrations 2024-03-19 22:58:15 +01:00
Pavel 'LEdoian' Turinsky
ace30c931e Neimportovat z mazaného modulu 2024-03-19 22:57:51 +01:00
Pavel 'LEdoian' Turinsky
e083f74a83 Další poznámka 2024-03-19 22:51:23 +01:00
Pavel 'LEdoian' Turinsky
53f40e193d Doplnění chybějícího jména tabulky (do předchozí migrace, protože yolo) 2024-03-19 22:48:42 +01:00
Pavel 'LEdoian' Turinsky
9e21b2ca1a relink 2024-03-19 22:47:45 +01:00
Pavel 'LEdoian' Turinsky
1f0e6cccf6 Další poznámky 2024-03-19 22:47:11 +01:00
Pavel 'LEdoian' Turinsky
46f1d3d42d I did something! 2024-03-19 22:15:29 +01:00
5eb936d891 Fix: z flip-card mi vypadlo jejich zarovnání na střed 2024-03-19 21:52:04 +01:00
Pavel 'LEdoian' Turinsky
a23daf8b97 Další pokus o migraci, I guess (po týdnu, lol) 2024-03-19 21:35:52 +01:00
Pavel 'LEdoian' Turinsky
457236c21a Vzor migrace pro create 2024-03-12 22:25:32 +01:00
Pavel 'LEdoian' Turinsky
4182bd542e Oprava nejvíc haluz migrace, wtf, nevím co dělám
Best commit.
2024-03-12 22:15:12 +01:00
Pavel 'LEdoian' Turinsky
17b4a4764c Vyrábíme personální v personálních + oprava sem/models.
Nezapomenout na závislost v migraci!
2024-03-12 22:12:08 +01:00
Pavel 'LEdoian' Turinsky
8cc5864257 Ještě poznámka k related_names 2024-03-12 22:09:52 +01:00
df5ae2c12a Fix: bootstrap upravuje .container 2024-03-12 22:09:32 +01:00
Pavel 'LEdoian' Turinsky
d4b92854c2 Poznámky: nezapomenout na defaultní related_names 2024-03-12 21:57:09 +01:00
Pavel 'LEdoian' Turinsky
559297240d Další poznámky 2024-03-12 21:53:17 +01:00
Pavel 'LEdoian' Turinsky
e3ce5efdd6 Odmanagovaný seminář 2024-03-12 21:47:02 +01:00
Pavel 'LEdoian' Turinsky
a1c1b9f280 Poznámky k odmanagování 2024-03-12 21:46:50 +01:00
Pavel 'LEdoian' Turinsky
b550857a8d Wtf nastaveni.aktualni_cislo nebylo??!?!
Nějaká bullshit migrace, whatever.
2024-03-12 21:45:50 +01:00
Pavel 'LEdoian' Turinsky
ae8040fb04 Přidávám (si) poznámky o tom, jak se to bastlí :-) 2024-03-12 21:30:58 +01:00
Pavel 'LEdoian' Turinsky
7a34fced0a Příprava na zrušení personálních věcí ze Semináře
Modely: Osoba, Řešitel, Organizátor, Škola, Příjemce
2024-03-12 21:27:26 +01:00
81494a7152 Merge pull request 'Fix obálek' (!45) from fix-obalky into master 2024-03-03 23:29:41 +01:00
Pavel "LEdoian" Turinsky
a1000ad2bf Chybová hláška i pro stvrzenky 2024-03-03 23:12:39 +01:00
Pavel "LEdoian" Turinsky
88ae103ec1 Lepší složky i pro stvrzenky 2024-03-03 23:09:18 +01:00
Pavel "LEdoian" Turinsky
213d3cc7b2 Lepší vyrábění dočasných adresářů
Chceme je po sobě nejspíš mazat i když to spadne. Možná to zesložití
vývoj, ale je to odolnější proti náhodnému pádu čehokoliv.
2024-03-03 23:07:51 +01:00
Pavel "LEdoian" Turinsky
4ecd2a7a61 Ještě status kód 2024-03-03 23:06:43 +01:00
Pavel "LEdoian" Turinsky
d2926bd1a7 Správné hledání lišáka pro obálky 2024-03-03 23:05:39 +01:00
Pavel "LEdoian" Turinsky
a59e2f9977 Užitečná chybová stránka pro neúspěšné generování obálek 2024-03-03 22:44:59 +01:00
bd1d04802b Oprava výsledkovek 2024-02-24 11:15:01 +01:00
8cd3250bb0 Zkrocení stylů okolo otáčecích karet 2024-02-24 10:42:54 +01:00
cc09980632 Lepší řešení otáčecích karet na dotykových zařízeních 2024-02-24 08:55:09 +01:00
3363fbdc7c Tohle asi sem 2024-02-24 08:33:08 +01:00
3f8756148d Drobné úpravy CSSek 2024-02-20 19:34:50 +01:00
7b1e3ab58b Rozhození layoutovací @media (styly na menších displejích) 2024-02-20 19:26:57 +01:00
ee7771bdb3 Přesun CSS menu mimo hlavní layout 2024-02-20 19:16:47 +01:00
10c252cd16 Rozházení @media, o kterých je jasné, kam patří 2024-02-20 19:14:17 +01:00
a4a4af5f93 Tohle asi patří sem 2024-02-20 18:52:18 +01:00
5048439aee Nějaké nepoužívané css třídy a hodnoty tagů 2024-02-20 18:46:26 +01:00
14e8520b20 Úprava tabulky odevzdaných = mých řešení 2024-02-20 17:51:01 +01:00
31ee8937f8 Pruhy (local/test/prod) dozadu 2024-02-14 17:24:46 +01:00
d469019c44 Oprava mobilního meníčka na nový bootstrap (ještě jsem zapomněl jednu věc) 2024-02-14 17:00:06 +01:00
a1fa654bec Oprava mobilního meníčka na nový bootstrap 2024-02-14 16:56:47 +01:00
81004d7cdc Upgrade výsledkovky (uchycení druhého sloupce – toho se jménem) 2024-02-14 15:53:09 +01:00
da705927c2 Drobné opravy v tabulce uchycující první řádek a sloupec 2024-02-14 15:46:51 +01:00
ce54684680 Drobné opravy v tabulce uchycující první řádek a sloupec 2024-02-14 15:44:53 +01:00
837986bad8 Drobné opravy v oramovane tabulce a tabulce uchycující první řádek a sloupec 2024-02-14 12:35:44 +01:00
d7195a42f1 Drobné opravy v barevné tabulce a tabulce uchycující první řádek a sloupec 2024-02-14 11:43:28 +01:00
264f4d7646 Chybějící tag v nastylování barevné tabulky 2024-02-14 11:02:00 +01:00
5bf2df563b Rozdělení stylu tabulky došlých řešení na jednotlivé části a použití jinde 2024-02-14 10:58:21 +01:00
6d270b7af5 Ještě jedna drobná úprava stylů výsledkovky 2024-02-14 10:07:46 +01:00
d41eb64ab5 Oprava předchozího commitu (Předělání stylů výsledkovky) 2024-02-14 09:48:59 +01:00
805ed9204c Oprava předchozího commitu (Předělání stylů výsledkovky) 2024-02-14 09:42:08 +01:00
3d2f0f08c3 Předělání stylů výsledkovky 2024-02-14 09:35:49 +01:00
9cca7beba5 Update bootstrapu 2024-02-14 09:19:45 +01:00
c5b81871d2 Přemýšlel jsem, zda apríly nevyhodit do *.js, ale nakonec jen takhto do separátního template 2024-02-14 09:03:15 +01:00
52dc337a20 Dospěl jsem k názoru, že jCarousel se na webu také nepoužívá 2024-02-14 08:41:13 +01:00
eec9abb9c1 Dospěl jsem k názoru, že PrettyPhoto se na webu nepoužívá 2024-02-14 08:32:36 +01:00
c731af9ccd Přesun css galerie do galerie 2024-02-14 08:28:30 +01:00
f5e8f5bb77 První krůčky předělání css 2024-02-13 22:17:41 +01:00
72c20d2b94 Separace prettyPhoto 2024-02-12 19:04:46 +01:00
b2911d5e9f Separace bootstrapu 2024-02-12 18:55:41 +01:00
239a324a19 Ještě lepší vyřešení rozlišení webů 2024-02-05 20:34:25 +01:00
c0a3e3df8f Lepší vyřešení rozlišení webů 2024-02-05 20:08:25 +01:00
b4c693a9ab Uchycení řádku a sloupce v tabulce 2024-02-05 19:50:17 +01:00
c130ab8426 Zrychlení načítání archivu soustředění pro účastníky 2024-01-30 00:11:13 +01:00
a72435dd72 Zrychlení načítání archivu soustředění 2024-01-30 00:02:27 +01:00
8e1a03863f PLS, Windowsy… 2023-12-28 09:50:13 +01:00
b8f2e1da3b Merge pull request 'Odstranění starých dependencí a okomentování většiny stávajících' (!42) from odstraneni_starych_dependenci into master
Reviewed-on: #42
2023-12-18 23:08:56 +01:00
824a4d9eb3 Fixnuto přetékání selectů přes title a login bar 2023-12-18 22:13:17 +01:00
Pavel 'LEdoian' Turinsky
39d618834b fixup! Pokus o hack: při výrobě modelu na něj rovnou přesměrujeme původní contenttype. 2023-12-18 21:32:58 +01:00
46fd51e7d9 Odstraněno sekizai (nepoužívalo se, zbytečně zesložiťuje, jde to dělat i jinak a házelo někdy někde chyby) 2023-12-18 21:24:14 +01:00
Pavel 'LEdoian' Turinsky
f41d5587fc Pokus o hack: při výrobě modelu na něj rovnou přesměrujeme původní contenttype. 2023-12-18 21:21:17 +01:00
8babbd988c A další komentáře 2023-12-11 22:20:38 +01:00
ea5ee85e7a Odstranění django-crispy-forms (nějaké fancy formy, ale vypadá nepoužívaně) 2023-12-11 22:03:42 +01:00
187ca0ec93 Další komentáře v requirements.txt 2023-12-11 22:02:22 +01:00
7a28649436 Odstranění django-flat-theme (dávno, dávno, předávno (Django 1.9) includované do Djanga) 2023-12-11 21:59:13 +01:00
1802e90952 Odstranění django-mptt (knihovna pro stromy v Djangu, např. v adminu, na první pohled nepoužívaná, navíc unmaintained) 2023-12-11 21:51:20 +01:00
0f3874beb5 Nějaké komentáře k requirements.txt 2023-12-11 21:49:14 +01:00
191177aea0 Odstranění traitlets (kontrola typování, ale pokud správně chápu, tak nějakého svého) 2023-12-11 21:33:07 +01:00
Pavel 'LEdoian' Turinsky
37586d7433 Opravení práv
TODO: je na těch ContentTypech navěšené ještě něco dalšího? Pro nastavení asi ne, ale co ostatní aplikace?
2023-12-11 21:31:54 +01:00
3bfdde10e8 Odstranění pexpect (knihovna pro spawnování podprocesů z pythonu, nepoužívaná?) 2023-12-11 21:30:09 +01:00
b5de60d681 Odstranění html5lib (pro parsování html v Pythonu, nepoužívaná, navíc už 3 roky neudržovaná) 2023-12-11 21:26:56 +01:00
0204bd2444 Odstranění pytz (použit pouze v testdatech, ale tam naopak budeme lépe simulovat aktuální stav, když tam nacpeme UTC) 2023-12-11 21:25:36 +01:00
3fd0c7f917 Odstranění six (knihovna pro přechod mezi python2 a python3) 2023-12-11 21:17:12 +01:00
6cb41a1263 Odstranění django comments, data jsou v /akce/mam/www/old_data/django_comments.json.gz 2023-12-11 21:07:18 +01:00
Pavel 'LEdoian' Turinsky
ca0bbb1247 Manage 2023-12-11 20:32:22 +01:00
Pavel 'LEdoian' Turinsky
158c0e4d90 Druhá zapomenutá závislost 2023-12-11 20:28:58 +01:00
Pavel 'LEdoian' Turinsky
f7382fb946 Zapomenutá závislost
Ještě mi chybí jedna :-/
2023-12-11 20:28:10 +01:00
Pavel 'LEdoian' Turinsky
0bbb860b16 Zrušení seminar.Nastaveni 2023-12-11 20:25:33 +01:00
Pavel 'LEdoian' Turinsky
6a5390cdf6 Přidání Nastaveni do various 2023-12-11 20:21:27 +01:00
Pavel 'LEdoian' Turinsky
f197261271 Opravení related_name
Tohle by mělo být nezávislé, nemůžeme vyrobit foreign key na něco, co už existuje…

ERRORS:
seminar.Nastaveni.aktualni_cislo: (fields.E304) Reverse accessor for 'seminar.Nastaveni.aktualni_cislo' clashes with reverse accessor for 'various.Nastaveni.aktualni_cislo'.
	HINT: Add or change a related_name argument to the definition for 'seminar.Nastaveni.aktualni_cislo' or 'various.Nastaveni.aktualni_cislo'.
various.Nastaveni.aktualni_cislo: (fields.E304) Reverse accessor for 'various.Nastaveni.aktualni_cislo' clashes with reverse accessor for 'seminar.Nastaveni.aktualni_cislo'.
	HINT: Add or change a related_name argument to the definition for 'various.Nastaveni.aktualni_cislo' or 'seminar.Nastaveni.aktualni_cislo'.
2023-12-11 20:20:48 +01:00
Pavel 'LEdoian' Turinsky
df2e4f086a Unmanage seminar.Nastaveni
Sry, nebudu to psát česky :-)
2023-12-11 20:20:24 +01:00
ffa0c682f4 Pokus o řešení problémů s výsledkovkou posledního čísla 2023-12-11 20:16:04 +01:00
0fbfb1e3cd Fix „get_app_list() takes 2 positional arguments but 3 were given“ 2023-12-04 10:51:28 +01:00
c55fbb9dca WTF (fix admin soustředění) 2023-11-22 13:42:15 +01:00
MaM Web user
7a4213a61e Jidáš: django chce migraci related_name -> , tak ji dostane 2023-11-20 22:06:42 +01:00
MaM Web user
37437b9674 Jidáš: oprava padání sphinxu (dokumentace) 2023-11-20 21:46:42 +01:00
2afa250df6 Merge branch 'django4' 2023-11-20 20:30:44 +01:00
78866fbc93 Merge pull request 'Neodkazovat neveřejné výsledkovky' (!41) from neodkazovat_neverejne_vysledkovky into master
Reviewed-on: #41
2023-11-20 20:09:22 +01:00
Pavel 'LEdoian' Turinsky
a9a426ca91 Odkaz na výsledkovku a ne na horní část stránky 2023-11-13 20:59:06 +01:00
Pavel 'LEdoian' Turinsky
b456b8c861 Neodkazovat z archivu na výsledkovku, když tam není 2023-11-13 20:58:39 +01:00
6fe9beb0f0 Deprecated věci 2023-10-31 21:20:48 +01:00
f457520d7d Takhle už by šlo pustit (ugettext->gettext, force_text->force_str) 2023-10-30 23:33:13 +01:00
cda00bbc4c Merge pull request 'Lepsi Delani Orgu' (!35) from lepsi-delani-orgu into master
Reviewed-on: #35
2023-10-30 22:21:13 +01:00
Pavel "LEdoian" Turinsky
668546c720 Fix testu 2023-10-30 22:19:50 +01:00
e889620ddb Merge remote-tracking branch 'origin/master' 2023-10-30 21:09:42 +01:00
c673d04082 Merge branch 'prehlednejsi_hodnotitko' 2023-10-30 21:08:02 +01:00
36124fa69e Merge pull request 'Dokumentace závislostí webu' (!38) from doc_prereq into master
Reviewed-on: #38
2023-10-30 20:56:19 +01:00
14b3caaa04 Merge pull request 'Úpravy výsledkovky' (!36) from pregenerovavani-deadlinu into master
Reviewed-on: #36
2023-10-30 20:19:53 +01:00
e9782c73e4 V předchozím commitu bylo špatně trefené {% endif %} 2023-10-24 13:16:48 +02:00
Pavel "LEdoian" Turinsky
93cfa504a8 Nepadat pro hodně nevalidní CSRF
Když to nemá referer, tak je to hodně divné, ale mail o tom nechci.
2023-10-22 15:21:24 +02:00
29b5361545 (sifrovacka) stringifikace správných odpovědí 2023-10-16 20:01:41 +02:00
e589564840 (sifrovacka) odlišení přijmutých a nepřijmutých odpovědí 2023-10-16 19:55:37 +02:00
10c6f4be16 Merge pull request 'sifrovacka' (!40) from sifrovacka into master
Reviewed-on: #40
2023-10-15 20:02:24 +02:00
04e2007c3a (sifrovacka) Méně řádků v tajence v účastnickém formuláři (bez diakritiky bylo přidáno už v předchozím commitu) 2023-10-15 19:55:23 +02:00
1f7b770a5c Odpovědi od účastníků mají nově i timestamp 2023-10-15 19:52:11 +02:00
b8eee44ed0 Hrajeme si se styly. 2023-10-14 12:37:23 +02:00
b36c030af5 Merge branch 'sifrovacka' of gitea.ks.matfyz.cz:mam/mamweb into sifrovacka 2023-10-14 12:28:48 +02:00
dca7a7bedd Trochu přepsány textíky. 2023-10-14 12:28:22 +02:00
c635b0a280 K formuláři mají mít přístup i orgové… 2023-10-14 12:09:14 +02:00
1aa389414d Návrh na webappku na šifrovačku (na Sklené) 2023-10-14 11:26:38 +02:00
MaM Web user
aff9a39262 uwsgi v requirements.txt nevypadá potřebně
a navíc to pak Jidášovi nefunguje, zatím nevím proč.

P.
2023-10-09 23:00:49 +02:00
Pavel "LEdoian" Turinsky
2d416472e8 Tak superuser už může
lol…
2023-10-09 22:50:28 +02:00
Pavel "LEdoian" Turinsky
7e1644d5c1 Parciální fix testu dělání orgů 2023-10-09 22:43:27 +02:00
b69ebcd6b6 U CSRF chyby má být reason asi předvyplněný 2023-10-09 22:29:29 +02:00
Pavel "LEdoian" Turinsky
002e33002c Přegenerovávat výsledkovky nemůže běžný org 2023-10-09 22:25:25 +02:00
205409abc5 Merge pull request 'oprava_chybovych_hlasek' (!39) from oprava_chybovych_hlasek into master
Reviewed-on: #39 (by @ledoian)
2023-10-09 22:19:33 +02:00
68d51a0bf1 Překlep 2023-10-09 22:14:27 +02:00
0e24c1d9ad Komentář k CSRF chybám 2023-10-09 22:04:01 +02:00
29b3271200 CSRF chyba má vrátit 403 2023-10-09 22:02:05 +02:00
60346d6839 Stránka pro CSRF chybu 2023-10-09 21:50:50 +02:00
bb127832dc Oprava „názvu záložky“ při Ojojojojoj 2023-10-09 21:11:12 +02:00
Pavel "LEdoian" Turinsky
1f0d70b31e Dokumentace závislostí
podle dnešní schůzky, zatím velmi předběžná verze
2023-10-02 23:29:51 +02:00
0738aedc9e Oprava pipu instalujícího prereleasy 2023-10-02 21:32:09 +02:00
d006f6ebfa Oprava vytváření galerie (Pillow odstranil něco, co django-imagekit používá) 2023-10-02 10:08:49 +02:00
bfb7a75b97 Oprava vytváření galerie (Pillow odstranil něco, co django-imagekit používá) 2023-10-02 09:28:23 +02:00
MaM Web user
8a473a5097 Popisky v záhlaví výsledkovky
Sice to na mobilu nic moc neudělá, ale aspoň myší se to má šanci používat trochu snáz.
2023-09-20 11:10:55 +02:00
MaM Web user
f14df7b579 Nové kódy úloh ve výsledkovce
(Zprasený commit, má být na jiné větvi, já vím :-D)
2023-09-20 10:47:11 +02:00
MaM Web user
e182785e48 Přidány akce pro přegenerování deadlinů do Admina
Nikdo o tom neví, a když se o tom dozví, tak se buď nic nezmění, nebo to bylo
tak dávno, že si toho nikdo nevšimne :-D Ale na testování se to hodí…

Also: někde jsem přepsal mezery na taby.
2023-09-20 01:11:03 +02:00
fb31b10d66 Oprava odevzdávátka (čtyřrozměrné body) 2023-09-16 12:31:30 +02:00
30ce5a0888 Vynucení UTF-8 (v html a css) 2023-09-06 12:59:04 +02:00
0c90c2bd06 Lepší řazení problémů ve výsledkovce 2023-08-30 22:06:46 +02:00
Pavel "LEdoian" Turinsky
df657953ab Pročištění ALLOWED_HOSTS 2023-08-13 13:52:41 +02:00
527c06d91e Připomenutí orgům, že mají psát webařům. (Malilinkato rozbíjí styl na užších displejích.) 2023-08-12 00:58:09 +02:00
MaM Web user
449a3db56b Odebrání práv na mazání lidí (diff je trochu pokažený, protože save_org_prava nedrží jednotné pořadí, ale co už) 2023-08-10 23:23:48 +02:00
767358ca73 Trochu světlejší placeholder, ať vypadá méně jako vyplněné body 2023-07-08 12:56:15 +02:00
5b36650e6f Oprava nahrání řešení (Chceme nastavovat v setupu a ne v getu) 2023-06-24 17:55:51 +02:00
24c790185e Revert "Pokus o fix pádu webu"
This reverts commit 10b2d11249.
2023-06-24 17:48:49 +02:00
Pavel "LEdoian" Turinsky
14c6706bf3 Použijme konstantu, ne hardcodovaný řetězec 2023-06-24 15:23:12 +02:00
Pavel "LEdoian" Turinsky
10b2d11249 Pokus o fix pádu webu 2023-06-24 15:20:43 +02:00
Pavel "LEdoian" Turinsky
3eb9c7998d Zprávy do admina 2023-06-21 15:51:08 +02:00
Pavel "LEdoian" Turinsky
36a7a5af5d Test pro dělání orgů. Nefunguje :-/ 2023-06-21 15:41:36 +02:00
Pavel "LEdoian" Turinsky
844c55d5a7 Oprava drobností 2023-06-21 15:41:17 +02:00
Pavel "LEdoian" Turinsky
2cf4d87c6b Marginální zlepšení vyrábítka orgů
Podle diskuse na Matrixu
2023-06-21 14:45:46 +02:00
01ad1daba9 WTF (špatné právo v meníčku u korektur) 2023-06-20 17:50:17 +02:00
Pavel "LEdoian" Turinsky
feffa99d79 Fix typu v hodnotítku 2023-06-20 00:26:40 +02:00
cefbd4df7a Oprava výsledkovky do posledního čísla? 2023-06-19 21:52:01 +02:00
363776ba4f Lepší popis názvu PDF k opravám v adminu 2023-06-19 21:41:59 +02:00
13c48ae1c2 Oprava OJOJOJOJ (error 500) 2023-06-19 21:35:03 +02:00
0528dbbb9c Merge pull request 'Upgrade odevzdavatka' (!30) from upgrade_odevzdavatka into master
Reviewed-on: #30
2023-06-19 20:48:29 +02:00
37d29fcf58 Posli -> Vloz 2023-06-19 20:46:12 +02:00
baaaa0829a Pro bezpečnost Iterable -> Sequence 2023-06-19 20:31:59 +02:00
e641724eab „Překlep“ 2023-06-19 20:28:43 +02:00
205aa0b900 V NahrajReseniView z nadproblému udělat property 2023-06-19 20:24:19 +02:00
c64294099e NahrajReseniNadproblemView -> NahrajReseniRozcestnikTematekView 2023-06-19 20:15:35 +02:00
94ea718c20 Drobná úprava textu pro řešitele 2023-06-19 20:13:56 +02:00
0bf309fd78 Přejmenování .select2multiple .s2m-se-zaskrtavatky 2023-06-19 20:12:09 +02:00
dae3864ba4 Oranžové zvýraznění pro všechny Select2 2023-06-19 20:08:45 +02:00
18f55153be filter místo [… for … if …] 2023-06-19 20:06:18 +02:00
50ca3ac71f Merge branch 'master' into upgrade_odevzdavatka
# Conflicts:
#	data/sitetree.json
2023-06-17 09:25:04 +02:00
a20d7c3c34 Přidat PDF v meníčku korekturovátka 2023-06-17 09:19:34 +02:00
Pavel "LEdoian" Turinsky
5048f52ac6 Oprava nadpisu v termínářském souhrnu
Nejsou to počty řešení, spíš jejich stáří, protože se to termínářům hodí
víc.
2023-06-17 00:32:23 +02:00
bb2332dc27 Lepší popis, kdy mají posílat PDF 2023-06-15 18:57:11 +02:00
b67525a11f Merge branch 'master' into upgrade_odevzdavatka 2023-06-15 17:10:29 +02:00
b14395f91a Merge pull request 'Výroční sraz M&M' (!32) from vyroci into master
Reviewed-on: #32
2023-06-15 16:57:26 +02:00
07c465e6ca Správná url 2023-06-15 16:55:31 +02:00
1a008dff19 Další úpravy textu (a vzhledu) 2023-06-15 13:26:37 +02:00
e6d4bfe0f5 Úpravy templatů 2023-06-13 22:47:00 +02:00
5e7f6c81bc Odstraněno omezení na TextField (v databázi)
Takhle se to nedělá, ale ještě to není nikde nasazené, tak je to asi v pohodě
2023-06-13 22:40:44 +02:00
cab40cc6ef Předělány zbylé texty 2023-06-13 22:36:08 +02:00
5169c357aa Předělány texty (ukládané do databáze)
Takhle se to nedělá, ale ještě to není nikde nasazené, tak je to asi v pohodě
2023-06-13 22:33:52 +02:00
ff7914fbb2 Předělané odkazy 2023-06-13 22:25:39 +02:00
dce1de7a99 Checkboxy pouze u multiple selectu (přesněji řečeno pouze u těch, kde je select2multiple) 2023-06-13 09:12:00 +02:00
2ef3311bff Multiple select se nemají zavírat
Už jsem se internetu správně zeptal a dostal odpověď: select2 bere parametry jako atributy data-camel-case-vec=cosi (stejné jako select2({camelCaseVec: cosi}))
2023-06-13 08:50:16 +02:00
727d0b2955 Revert "Multiple select se nemají zavírat"
This reverts commit 4a3f8c66
2023-06-13 08:47:17 +02:00
bed107aeac Merge remote-tracking branch 'origin/master' into upgrade_odevzdavatka
# Conflicts:
#	mamweb/static/css/mamweb.css
2023-06-12 22:20:24 +02:00
2ab6e76fbe Merge pull request 'Vylepšení hodnotítka fix #1354 fix #1237' (!20) from vylepseni_odevzdavatka into master
Reviewed-on: #20
2023-06-12 22:17:07 +02:00
1a63195b58 Merge branch 'master' into vylepseni_odevzdavatka 2023-06-12 22:07:38 +02:00
6f3fe7f0da Nezalamovat e-mail a jméno (a přezdívku) 2023-06-02 21:34:51 +02:00
4e1ff92bd8 Účastníci výročí v adminu… 2023-06-02 21:32:55 +02:00
f3b0079651 Tabulka odpovědí k Výročnímu srazu M&M 2023-06-02 21:30:47 +02:00
3640c756ac Ach jo, „kopírování, častý zdroj chyb“ 2023-06-02 21:13:19 +02:00
32141d457f Výroční sraz M&M 2023-06-02 21:04:11 +02:00
03f0a6fd7a Jak řešit 2023 (děkujeme Tomovi) 2023-06-02 00:27:23 +02:00
fc4fc87798 Revert "Jak řesit (oproti mamtex je tam ubraný nějaký text navíc)"
This reverts commit 389a979f4c.
2023-06-02 00:22:30 +02:00
MaM Web user
a07dbf4ab3 Jidáš: jsem vůl (soubor se nemůže jmenovat select2.js, když select2.js už importujeme) 2023-06-01 17:34:40 +02:00
4b6e82120d FIX: Posílání e-mailu i řešitelům, kteří nechtějí papírové číslo 2023-06-01 15:08:55 +02:00
b2f0c47449 Oprava předmětu v e-mailu o novém čísle (oprava commitu 3c958c91) 2023-06-01 14:47:03 +02:00
389a979f4c Jak řesit (oproti mamtex je tam ubraný nějaký text navíc)
<text
       xml:space="preserve"
       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52778px;line-height:1.15;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;letter-spacing:0px;word-spacing:0px;display:inline;stroke-width:0.264583"
       x="147.6949"
       y="126.75229"
       id="text6805-0-9-7"><tspan
         sodipodi:role="line"
         x="0"
         y="0"
         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52778px;font-family:'Latin Modern Sans';-inkscape-font-specification:'Latin Modern Sans';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.264583"
         id="tspan141408-9">Důležitý je celý postup, </tspan><tspan
         sodipodi:role="line"
         x="0"
         y="0"
         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.52778px;font-family:'Latin Modern Sans';-inkscape-font-specification:'Latin Modern Sans';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.264583"
         id="tspan61014">nejen výsledek.</tspan></text>
2023-06-01 14:42:01 +02:00
3c958c917b E-mail řešitelům k prvnímu číslu 2023-06-01 14:24:14 +02:00
4a3f8c669d Multiple select se nemají zavírat 2023-05-23 01:39:46 +02:00
317cc3056e Zdroj kódu 2023-05-23 01:15:06 +02:00
c3b42e09f2 Multiple select odteď mají oranžovou barvu a obsahují checkboxy 2023-05-23 01:10:37 +02:00
Pavel "LEdoian" Turinsky
d304e46ceb Barvičky jdou vypnout 2023-05-23 00:28:13 +02:00
Pavel "LEdoian" Turinsky
fe144e6de7 Barvičkyyy! 2023-05-22 23:58:04 +02:00
669255461b Vložit řešení: i nezadané problémy 2023-05-22 23:39:04 +02:00
c93fa6c574 oprava „Vložit řešení: více řešitelů“ a více řešení 2023-05-22 23:34:37 +02:00
Pavel "LEdoian" Turinsky
86f6d47f10 Součty
Hnusně, ale přece…
2023-05-22 23:30:57 +02:00
831ed6c64c zbylé FIXME po „Vložit řešení: více řešitelů“ 2023-05-22 23:21:19 +02:00
c7ce943fc0 Vložit řešení: více řešitelů 2023-05-22 23:10:38 +02:00
0c5c923b06 Autocomplete řešitelů: oprava víceslovného hledání 2023-05-22 23:06:16 +02:00
74a26affa7 Odevzdávátko: Odevzdatelné problémy jsou všechny zadané (včetně minulých ročníků) 2023-05-22 23:02:32 +02:00
Pavel "LEdoian" Turinsky
bef932345c Kladivoo! 2023-05-22 22:47:13 +02:00
Pavel "LEdoian" Turinsky
468443e062 V tabulce potřebujeme znát i Hodnocení, kvůli bodům… 2023-05-22 22:46:47 +02:00
e26df01729 Odevzdávátko: Zaříznutí přístupu k nezadaným problémům 2023-05-22 22:28:14 +02:00
512f14ed4d Odevzdávátko: Nezadané problémy nelze odevzdat 2023-05-22 22:24:14 +02:00
Pavel "LEdoian" Turinsky
53032a49d8 Neumím psát filtry.
todo squash
2023-05-22 22:23:15 +02:00
Pavel "LEdoian" Turinsky
8f2aa72f6d Fix zapomenuté fieldy v tabulce
TODO: rebase squash
2023-05-22 22:21:42 +02:00
Pavel "LEdoian" Turinsky
ed5e7a1d9f Template pro zobrazení řešení přímo v tabulce
Snad, ještě jsem to netestoval :-)
2023-05-22 22:16:02 +02:00
Pavel "LEdoian" Turinsky
96bc21a727 Zrušen SourhnReseni
Už není potřeba, v tabulce stejně jsou už přímo řešení.
2023-05-22 22:15:27 +02:00
Pavel "LEdoian" Turinsky
659ad62b52 Ještě docstring k ReseniProblemuView 2023-05-22 22:15:07 +02:00
92cb8ec206 Odevzdávátko: Osamocený nadproblém se vybere automaticky 2023-05-22 21:53:14 +02:00
dee1b2bb2c Staré věci 2023-05-22 21:48:35 +02:00
Pavel "LEdoian" Turinsky
dd49c0e1ba Malá úprava TabulkaOdevzdanychReseniView.get_context_data.pridej_reseni 2023-05-22 21:48:33 +02:00
Pavel "LEdoian" Turinsky
dd5d8886ee Trocha popisu TabulkaOdevzdanychReseniView, ať se v tom dá vyznat 2023-05-22 21:27:04 +02:00
192ae6912f Vložit řešení -> nahrát řešení 2023-05-22 21:22:48 +02:00
bbb85b3f6a Poslat řešení -> nahrát řešení -> vložit řešení 2023-05-22 21:18:47 +02:00
b11429eaea Odevzdávátko: Seřazení problémů k odevzdání 2023-05-16 13:27:10 +02:00
a3526419a9 Odevzdávátko: Zlepšení UI 2023-05-16 00:06:12 +02:00
Pavel "LEdoian" Turinsky
61e71efcc4 Make: správně nastavit orgům práva
Tohle je trošku fishy, protože by se to teoreticky mělo dít i u
produkce, leč tam zůstávají práva persistentně v DB (a až se rozbijí,
tak se budeme divit)…
2023-05-15 23:45:26 +02:00
e04c116b80 Á, já jsem vůl 2023-05-15 23:09:56 +02:00
9ff223428b Lepší formularOKView 2023-05-15 23:06:52 +02:00
b8fc56773c Odevzdávátko: oprava meníčka 2023-05-15 22:30:20 +02:00
ee1db52114 Odevzdávátko: oprava dokumentace 2023-05-15 22:28:57 +02:00
7e99466166 Odevzdávátko: oprava POSTu 2023-05-15 22:22:03 +02:00
fbcfe7e93f Odevzdávátko: Filtrovat pouze odevzdatelná 2023-05-15 22:00:37 +02:00
ce4ee94fed Odevzdávátko: Nejprve vybrat téma, pak podúlohy – part 1 2023-05-15 21:49:35 +02:00
93fa8c6f2e Odevzdávátko: Autoři řešení -> Další autoři 2023-05-15 20:26:48 +02:00
5b698cce42 Oprava migrací po předchozím mergey (0f5b2b128f) 2023-04-17 22:16:44 +02:00
0f5b2b128f Merge branch 'reforma_prihlasky_a_posilani' 2023-04-17 22:14:17 +02:00
951185c1d3 Merge pull request 'Příjemci chtějí dostávat e-maily…' (!29) from emaily into master
Reviewed-on: #29
2023-04-17 21:57:47 +02:00
254e7949ef SQLite nežere date 2023-04-17 21:44:18 +02:00
1521b9d192 Merge pull request 'RFC: Omezení počtu adres v mailech z testwebu' (!27) from malo-mailu-z-testwebu into master
Reviewed-on: #27
2023-04-17 20:55:10 +02:00
397aacf899 Posílání e-mailů příjemcům 2023-04-17 20:41:01 +02:00
b8a9d67cc2 send_mail -> EmailMessage 2023-04-17 20:15:39 +02:00
cd9aa73a34 hotfix: přihlášky 2023-03-29 20:29:00 +02:00
99161d016d Apríl 2023 2023-03-26 01:52:17 +01:00
c97a841041 Reforma nastavení zasílání poštou 2023-03-13 23:45:05 +01:00
c8023244bd Reforma přihlášky a editace osobních dat 2023-03-13 23:35:04 +01:00
Pavel "LEdoian" Turinsky
cfdbcc8ee1 Omezení na počet adres v hlavičce mailů z testwebu
Není úplně žádoucí, aby se v mailu z testwebu poslala spousta adres,
protože je to náchylné na automatické zpracování v případě, že se k
takovému mailu dostane někdo další.
2023-03-07 23:59:42 +01:00
1dd51afb11 Zasílání je zdarma (Rozhodl jsem se pro formulaci není zpoplatněno, protože z našeho pohledu zdarma není a nechci vyvolávat ten pocit, že nás to také nic nestojí.) 2023-03-06 22:24:33 +01:00
e7a7dad50c Defaultně nezasílat číslo papírově 2023-03-06 22:15:41 +01:00
ea46d09e53 Defaultně e-mail o novém čísle zasílat 2023-03-06 22:11:58 +01:00
27b38e6b4d Korektury návodu na hodnotítko. 2023-03-06 21:38:16 +01:00
84eecdae18 Oprava e-mailu o vydání nového čísla 2023-03-06 21:31:17 +01:00
d63b5286a4 Nástřel návodu v hodnotítku 2023-03-06 21:14:58 +01:00
c0fa59a504 Merge branch 'master' into vylepseni_odevzdavatka 2023-03-06 20:17:03 +01:00
6e1b1ef4e8 Komentář 4 změny = beze změny 2023-03-06 20:16:36 +01:00
9868bff329 fuj, print 2023-03-06 20:11:50 +01:00
a70d32a4ad zalámání 2023-03-06 20:10:44 +01:00
bec500d61a Merge pull request 'Možnost stáhnout si řešení pojmenovaná podle řešitele' (!26) from jmena-do-priloh-reseni into master
Reviewed-on: #26
2023-02-27 20:48:26 +01:00
2913ea27ab add: lepší vzhled 2023-02-27 20:44:30 +01:00
Pavel "LEdoian" Turinsky
e42b6abec5 Zrušení console.log-ů 2023-02-27 20:25:45 +01:00
c6ff17050b Merge pull request 'Zklidnění testů' (!23) from clean_tests into master
Reviewed-on: #23
2023-02-27 20:12:44 +01:00
3dc6cdd7ed Merge pull request 'Html Deadline Hint' (!24) from html_deadline_hint into master
Reviewed-on: #24
2023-02-27 19:58:57 +01:00
8c9dbb5143 Merge pull request 'Ukaž řešení i orgovi' (!25) from ukaz-reseni-i-orgovi into master
Reviewed-on: #25
2023-02-22 10:07:16 +01:00
Pavel "LEdoian" Turinsky
32dc97e1c4 Možnost přidat si do názvů příloh řešení i jména řešitele
Budu zlobit a vysvětlení napíšu až do pull-requestu. Tady to IMHO čtu
jen já :-P

Pull-Request-URL: #26

(Adresa platí, pokud mě nikdo nepředběhne :-P)
2023-02-22 07:19:33 +01:00
Pavel "LEdoian" Turinsky
01f3537cef Dovolme orgovi kouknout se na řešitelský náhled řešení
Orgovi se může hodit vidět, jak zpětnou vazbu uvidí řešitel.

Možná by taky nebylo špatné odkázat na řešitelskou stránku z orgovské…
2023-02-22 07:15:18 +01:00
Pavel "LEdoian" Turinsky
d5cf81c32a Přidání titulku k výpisu deadlinu
Po najetí myší řekne, co znamenají symboly…
2023-02-21 17:08:10 +01:00
6742ecdb8b add: okomentovány vzorečky na přepočet bodů 2023-02-13 22:48:25 +01:00
d66effcd46 move: přesunuty vzorečky na přepočet bodů do seminar.utils 2023-02-13 22:46:54 +01:00
c8516d6eda add: checky v hodnotítku 2023-02-13 22:32:14 +01:00
13c8c29bb0 fix: dvojnásobky v tabulce došlých řešení 2023-02-13 20:47:42 +01:00
2b1c5e4e6e fix: maximum bodů pro hodnocení 2023-02-06 23:26:11 +01:00
db16df391b fix: maximum bodů pro hodnocení 2023-02-06 23:17:55 +01:00
4f7b64fae2 fix: maximum bodů pro hodnocení 2023-02-06 23:17:04 +01:00
Pavel "LEdoian" Turinsky
e0eb12cf9e Školy jen zakomentovat, nepsat expectedFailure test
Podle toho, jak dopadne PR se to buď aplikuje takto, nebo se tenhle
commit revertne.
2023-02-06 22:31:42 +01:00
52ac8364eb Merge remote-tracking branch 'origin/master' into vylepseni_odevzdavatka 2023-02-06 22:16:08 +01:00
6f49ab3cfa Jemné textové úpravy 2023-02-06 22:11:36 +01:00
648084d1f9 add: zobrazování max. počtu bodů i v necelkem 2023-02-06 22:09:57 +01:00
cac034149f Merge pull request 'Tag pro odkazy na poslání mailu' (!22) from maillink into master
Reviewed-on: #22
2023-02-06 22:01:59 +01:00
Pavel "LEdoian" Turinsky
fdbbc9c242 Úprava testu na autocomplete, aby nefailoval
… moc nahlas.
2023-02-06 21:58:16 +01:00
Pavel "LEdoian" Turinsky
04c3c6257c Podpora cc a bcc v {%maillink%} [neotestováno] 2023-02-06 21:56:06 +01:00
50bdb19e14 smazáno FIXME (to už jsem udělal) 2023-02-06 21:20:01 +01:00
ec0174dcdd Merge remote-tracking branch 'origin/master' into vylepseni_odevzdavatka
# Conflicts:
#	odevzdavatko/templates/odevzdavatko/detail.html
2023-02-06 21:14:13 +01:00
02fe280d4a neumím css, z toho si nic nedělejte 2023-02-06 21:10:32 +01:00
fa688ec8f3 add: skrýt teamovou část při jednom řešiteli v řešení 2023-02-06 21:00:19 +01:00
a6a57de3cf Merge pull request 'Zrychlení testů' (!21) from faster_tests into master
Reviewed-on: #21
2023-02-06 20:49:09 +01:00
Pavel "LEdoian" Turinsky
f6cb669277 Přejmenování mailsubjectu do češtiny 2023-02-06 20:27:35 +01:00
Pavel "LEdoian" Turinsky
65cd15ecbb Komentář k tomu, kde se vyrábí mailsubject 2023-02-06 20:27:19 +01:00
Pavel "LEdoian" Turinsky
0956b0780a Oddělení tagu {%mailurl%} 2023-02-06 20:15:01 +01:00
3dab396450 E-mail připomínající řešitelům možnost Nezasílat papírově 2023-01-30 20:58:37 +01:00
fad2a1bc47 Nikam -> Nezasílat papírově 2023-01-30 20:33:23 +01:00
4623adb249 fix: odřádkování ve feedbacku v hodnotíku 2023-01-24 20:57:32 +01:00
Pavel "LEdoian" Turinsky
efe1b4bb5a Použití {%maillink%} v detailu řešení
Ten řádek má sice pořád 117 znaků, ale IMHO je to o dost lepší.

Mně to i správně vyplňuje subjecty v Thunderbirdu, takže můj kód asi
není úplně mimo :-)
2023-01-08 08:53:41 +01:00
Pavel "LEdoian" Turinsky
ff996c2924 Přejmenování hodnocení
Označení bylo zavádějící, protože se vůbec nejedná o objekt Hodnocení.
Neříkám, že nové jméno je nějak úchvatné, ale aspoň mě nemate a na
proměnnou s životností dva řádky je to stejně jedno…
2023-01-08 08:51:01 +01:00
Pavel 'LEdoian' Turinsky
6994db438b Přidání tagu {% maillink %}
Vyrábí odkazy, které vedou na poslání mailu.

Psal jsem to spíš po paměti, nejsem si jistý, že to takhle je přesně
podle příslušného RFC, ale jako PoC dobrý a když to nebude fungovat, tak
se implementace opraví.

Všimněte si, že to je otestované, takže když někdo opraví testy
(=předpis chování), tak je pak snadné z diffu a všeho odvodit úpravu.

V Django dokumentaci se píše něco o tom, že by se měl použít spíš
`format_html` a `conditional_escape`, ale zatím jsem to víc nezkoumal.

Je žádoucí z tagu {% maillink %} odddělit i tag {% mailurl %}, který by
vracel samotnou URL. Obojí dává smysl umět (speciálně bastlení odkazů z
URL je stejně strašně nepřehledné, takže je lepší to zavřít do {%
maillink %} a nikdy nevidět), ale zatím to oddělené není… (Ale jsou na
to testy, takže by se mělo aspoň dát poznat, že rozdělení nerozbije
chování.)
2023-01-05 04:47:50 +01:00
MaM Web user
e6b8998edd Jidáš: hotfix: smazání přezdívky v osobních údajích 2023-01-04 21:30:52 +01:00
Pavel "LEdoian" Turinsky
3a1aade3a2 Testy: bereme parametry
Umožňuje testovat konkrétní moduly a nespouštět vždy všechno.
2023-01-04 02:11:15 +01:00
Pavel "LEdoian" Turinsky
af6628367f Testy: Schováváme si databázi napříč běhy
Při běžení testů nejdéle trvá namigrovat (prázdnou) databázi. Toto tento
krok přeskočí.

By default django pro testy používá in-memory SQLite3 databázi, která se
schovat přirozeně nedá. Používání souborů trvá déle (data níž), ale
další běhy už jsou rychlé.

Zatím nevím, jestli se někde nemůže omylem schovávat nějaký nežádoucí
stav, ale testy mi i opakovaně běží, takže se to asi nerozbíjí úplně
moc. Na první pohled je uložená databáze prázdná.

Pro produkci a CI bych klidně běžel testy od nuly, tam nevadí čekat pár
desítek sekund až jednotky minut na výsledek. Tato optimalizace je
důležitá jen pro lokální vývoj, kde je žádoucí mít testy co
nejrychlejší.

V .gitignore už přesně toto jméno souboru je. Nevím proč, ale možná to
tak bylo by default v některém dávném Djangu.

Data
---
Spouštěl jsem příkaz `time ./manage.py test [--keepdb] api`. Běhy byly
relativně konzistentní (±1 s) a trvaly u mě:
- In memory SQLite (default): 26 s
- První spuštění s db na disku (HDD): 44 s
- Následná spuštění: 7.7 s
Data jsou nejspíš zkreslena tím, že všechno je nejspíš nacachované v
systému, ale i tak je vidět zřetelné zrychlení.

Původní motivace: úplně triviální a nedatabázový test na starém
notebooku běžel kolem 3:14, což je zoufale nepoužitelné když si chci
napsat testy jako pomůcku pro vývoj.
2023-01-04 01:51:02 +01:00
a666a3fea4 hotfix: nemohl odevzdávat řešitel samotný 2023-01-03 19:04:45 +01:00
0c7a411c1f fix: nekonečné desetiné rozvoje 2023-01-03 00:21:12 +01:00
87a209bf2a fix: nekonečné desetiné rozvoje 2023-01-03 00:13:29 +01:00
d9756d5f60 add: ukládání různých bodů 2023-01-02 23:44:36 +01:00
39da362586 add: frontend k bodům 2023-01-02 23:44:04 +01:00
57b7c6372d add: různé druhy bodů u hodnocení 2023-01-02 23:42:53 +01:00
f96c24a474 Merge branch 'dokumentace'
# Conflicts:
#	docs/index.rst
2023-01-02 22:33:33 +01:00
c76fcb363a fix: ….objects.get(…) -> get_or_404 2023-01-02 21:52:19 +01:00
246f63d6e0 add: typová anotace 2023-01-02 21:40:07 +01:00
0e0bd76f28 Merge pull request 'odmeny_podle_petra' (!19) from odmeny_podle_petra into master
Reviewed-on: #19
2023-01-02 21:38:46 +01:00
72b72899fd fix: odměny mají házet alespoň 404 na špatné číslo 2023-01-02 21:20:00 +01:00
MaM Web user
5977f472c7 Fix! 2023-01-02 21:18:03 +01:00
Pavel "LEdoian" Turinsky
3c3047b548 Autodoc: Ignorování modulů 2023-01-02 21:14:00 +01:00
ea7075f707 fix: řazení řešitelů v odměnách podle příjmení 2023-01-02 21:09:56 +01:00
e10a8e0b6d fix: řazení řešitelů v adminu podle příjmení 2023-01-02 20:46:05 +01:00
3110eb92a5 Merge pull request 'Vylepšení odevzdávátka' (!13) from vylepseni_odevzdavatka into master
Reviewed-on: #13
2023-01-02 20:25:00 +01:00
09e2df75ce fix: mezera před závorkou 2022-12-20 14:29:04 +01:00
f2764a26f3 fix: ještě jeden návrh na zalámání 2022-12-20 14:26:43 +01:00
0b835ef9d4 fix: řešitelé mají být vidět jen ti, kteří neodmaturovali 2022-12-20 12:40:55 +01:00
5dedba2937 fix: „rozlámání“ dlouhého řádku 2022-12-20 12:29:19 +01:00
932ea700f3 fix: lepší count než try-catch při kontrole duplicitní přezdívky v přihlášce 2022-12-19 23:55:24 +01:00
98ac3f63bf fix: kontrola duplicitní přezdívky při editaci osobních údajů 2022-12-19 23:52:11 +01:00
abcfa996bd fix: <b> -> <strong> a zbavení se vykřičníků 2022-12-19 23:39:30 +01:00
1f16f194f7 add: Pro jistotu v DetailView i kontrola u orga 2022-12-19 23:12:23 +01:00
abdd2d65dd http -> https 2022-12-19 23:04:28 +01:00
d14b6bb799 sync_prod_flatpages 2022-12-19 23:00:48 +01:00
9bb0bcf3ca fix: překlep 2022-12-19 22:51:49 +01:00
bebc120e8f Merge pull request 'Korekturovátko: přejmenovat „irelevantní“' (!18) from neirelevantni into master
Reviewed-on: #18
2022-12-19 22:17:19 +01:00
58f05724e1 hotfix: 485c4180 má špatně proměnnou 2022-12-19 21:25:37 +01:00
5690dc297e hotfix: 1b521049 rozbil tabulku na úzké obrazovce 2022-12-19 21:16:42 +01:00
Pavel "LEdoian" Turinsky
485c4180da make/lib: podpora pro zatím neexistující větve
(pokud jsem to napsal správně.)
2022-12-19 21:09:15 +01:00
3b6e238323 Fix: lepší hledání podle přezdívky 2022-12-19 20:43:05 +01:00
Pavel "LEdoian" Turinsky
c2ad4c560d sync_prod_flatpages… 2022-12-17 00:11:00 +01:00
Pavel "LEdoian" Turinsky
4d97e21e96 Merge remote-tracking branch 'gitea/master' into neirelevantni 2022-12-16 23:57:15 +01:00
Pavel "LEdoian" Turinsky
4378c05e3e Korekturovátko: Zrušení irelevance i z nápovědy 2022-12-16 23:51:41 +01:00
Pavel "LEdoian" Turinsky
332e5e88d5 Korekturovátko: ne-irelevantní 2022-12-16 23:44:56 +01:00
9a3f51ca6b hotfix: tabulka došlých řešení 2022-12-14 22:41:00 +01:00
711693c57b Merge branch 'master' into vylepseni_odevzdavatka
# Conflicts:
#	odevzdavatko/templates/odevzdavatko/detail.html
2022-12-06 01:09:46 +01:00
2393c76d63 Merge branch 'tabs' 2022-12-06 01:03:44 +01:00
0e99cf286f fix: tohle předělání mezer na taby vypadalo podezřele, tak jsem to upravil 2022-12-06 01:02:38 +01:00
1200d77dbc Merge branch 'makefiles' 2022-12-06 00:18:52 +01:00
2e06960f51 Tož jsme to upravili 2022-12-06 00:16:40 +01:00
1b521049af hotfix: tabulka od. řešení na celou obrazovku 2022-12-05 20:53:22 +01:00
baf08c4f04 hotfix: název u korekturovaného pdf mohl být prázdný 2022-12-05 20:15:31 +01:00
52904575b0 hotfix: opraveno zobrazování smazat hodnocení v detailu řešení 2022-12-04 20:14:59 +01:00
5178d95a44 add: title u obrázkových odkazů v detailu řešení 2022-12-04 19:59:09 +01:00
Pavel "LEdoian" Turinsky
4a0e8e61be Druhá várka zarovnání tabulátory 2022-12-01 13:07:09 +01:00
Pavel "LEdoian" Turinsky
91cf18fa9e Odsazení pomocí tabulátorů [NOT CHECKED]
Pustil jsem na velkou část kódu skript, zatím nevím, co jsem rozbil.
Prosím o review :-)
2022-11-29 00:40:18 +01:00
f9b0395be7 Merge pull request 'hotfix: #1430' (!15) from fix_galerie into master
Reviewed-on: #15
2022-11-28 23:42:41 +01:00
f86e6b6838 hotfix: #1430 2022-11-28 23:38:13 +01:00
28e928a9f5 Merge branch 'sjednoceni_detailu_reseni' into vylepseni_odevzdavatka 2022-11-28 20:27:25 +01:00
79fea4074e hotfix: kruci, kopírování je častým zdrojem chyb 2022-11-24 20:44:15 +01:00
728de9be06 hotfix: při vybírání problému jsou vidět i staré ročníky, ale sortit podle ročníku neumím 2022-11-24 20:41:17 +01:00
7b5db01377 hotfix: org nemůže přiřadit hodnocení nezadaný problém (např. vyřešený) 2022-11-24 20:25:48 +01:00
Pavel "LEdoian" Turinsky
430430b460 Tabulka prerekvizit v různých distribucích / systémech 2022-11-24 04:56:52 +01:00
Pavel "LEdoian" Turinsky
9fefbd4bba Fix logiky 2022-11-24 02:50:46 +01:00
Pavel "LEdoian" Turinsky
fcd1320b45 Fix cesty 2022-11-24 02:23:03 +01:00
Pavel "LEdoian" Turinsky
d8554ad70d Ubuntu má i venv v separátním balíčku 2022-11-24 02:05:09 +01:00
e325d41f76 Fix: zapomněl jsem ještě po sjednocení odstranit 2022-11-22 00:26:35 +01:00
ad45b0a23b Fix: čárky v detailu řešení 2022-11-22 00:24:57 +01:00
Pavel "LEdoian" Turinsky
1bfe8cee5e tečka 2022-11-22 00:22:01 +01:00
Pavel "LEdoian" Turinsky
55ffdf8941 Merge branch 'makefiles' into make_docs 2022-11-22 00:20:46 +01:00
062653e708 Fix: 0.5 · #1237 2022-11-22 00:15:20 +01:00
Pavel "LEdoian" Turinsky
4853a47899 vyvoj.rst: Odkaz na dokumentaci make skriptů + smazání irelevantního příkazu 2022-11-22 00:11:41 +01:00
Pavel "LEdoian" Turinsky
4549a91e06 Dokumentace Jidášova bugu
Není to častý bug, ale nějaký obsah přece potřebujeme :-)
2022-11-22 00:11:16 +01:00
Pavel "LEdoian" Turinsky
fc6f29bbf1 Fix hesel 2022-11-22 00:05:56 +01:00
Pavel "LEdoian" Turinsky
61bb9786b3 Zrušení dvojteček 2022-11-22 00:00:22 +01:00
Pavel "LEdoian" Turinsky
1b34c2dbc4 Přidání do sidebaru 2022-11-21 23:59:19 +01:00
Pavel "LEdoian" Turinsky
fef51e2a75 fixup! Dokumentace make skriptů 2022-11-21 23:52:58 +01:00
Pavel "LEdoian" Turinsky
41c2ed0dee Dokumentace make skriptů 2022-11-21 23:48:12 +01:00
0d17b45011 Fix: 0.5 · #1237 2022-11-21 23:27:44 +01:00
Pavel "LEdoian" Turinsky
d186575712 make/README.md: Víc fancy, použít make/init_local 2022-11-21 22:51:39 +01:00
Pavel "LEdoian" Turinsky
9c92ca6575 make/README.md z make_docs 2022-11-21 22:51:29 +01:00
Pavel "LEdoian" Turinsky
5e26ac5e69 fix práv v deploy 2022-11-21 22:21:34 +01:00
Pavel "LEdoian" Turinsky
dfede45535 init_local 2022-11-21 22:17:52 +01:00
d15a8f3880 Merge pull request 'Pár poznámek k editorconfigu' (!10) from editorconfig into master
Reviewed-on: #10
2022-11-21 22:10:42 +01:00
c17afece9d Fix: #1427 2022-11-21 22:09:24 +01:00
4f773dbfe3 Merge pull request 'Fix: #1251' (!6) from zbaveni_se_obalkovani into master
Reviewed-on: #6
2022-11-21 22:07:19 +01:00
0dc0b1160e Merge pull request 'Fix: #910' (!5) from django_cleanup into master
Reviewed-on: #5
2022-11-21 22:04:37 +01:00
c0e065ad30 Merge pull request 'Fix: #992' (!4) from koncove_tagy_ve_vysledkovkach into master
Reviewed-on: #4
2022-11-21 22:04:13 +01:00
Pavel "LEdoian" Turinsky
d468108188 ensure_web_installed 2022-11-21 21:59:38 +01:00
Pavel "LEdoian" Turinsky
6b306f0849 ensure_venv v2 2022-11-21 21:57:41 +01:00
Pavel "LEdoian" Turinsky
66ce7d209d Méně hlučné testy 2022-11-21 21:11:50 +01:00
Pavel "LEdoian" Turinsky
5985c4940f fix 2022-11-21 21:03:58 +01:00
MaM Web user
df9e473686 fixup! testweb heslo 2022-11-21 20:59:14 +01:00
Pavel "LEdoian" Turinsky
5c97735948 testweb heslo 2022-11-21 20:54:36 +01:00
Pavel "LEdoian" Turinsky
dfc1267119 deploy: práva k dokumentaci 2022-11-21 20:40:43 +01:00
MaM Web user
e612899dc2 Requirements: myst_parser pro dokumentaci 2022-11-21 20:37:59 +01:00
Pavel "LEdoian" Turinsky
25fcddfba8 Při deployi vyrob dokumentaci 2022-11-21 20:18:22 +01:00
MaM Web user
6ee9c4e380 Requirements: myst_parser pro dokumentaci 2022-11-21 20:05:06 +01:00
Pavel "LEdoian" Turinsky
2ffd3bf445 Aspoň trochu relevantní make/README.md
A není to zas tak moc README, spíš intro :-/
2022-11-20 15:52:23 +01:00
Pavel "LEdoian" Turinsky
bac44b41f8 Dokumentace lokálního vývoje
Obsahuje tipy z Readme, obsahuje velkou část make/README.md.

Zatím nevím, co provedu s make/README.md, ale na něco třeba přijdu :-)
2022-11-20 15:39:20 +01:00
Pavel "LEdoian" Turinsky
50eaaf9eb7 Předěláno Readme
Teď vypadá víc jako readme, na které chceš narazit v gitee, než jako pár
random tipů. Random tipy jsem přesunul do dokumentace
2022-11-20 15:38:41 +01:00
Pavel "LEdoian" Turinsky
a184871bf9 make/lib: Když se to nepovede, tak budeme křičet
Uvědomil jsem si, že aktuálně nejde skoro vůbec poznat, jestli make
skript uspěl nebo ne. Tohle by se mělo vypsat, když se nepovede.

Víc by se mi líbilo, kdyby úspěšné doběhnutí ohlásilo "OK", ale to
neumím udělat bez nějakého zápatí skriptů.

(Resp. uměl bych: make/lib může být interpretr, který na začátku
zinicalizuje proměnné, pak natáhne příslušný skript a na konci ohlásí
OK. Ale přijde mi to trochu moc magické, takže pokud někdo nebude nějak
extra pro, tak to tak neudělám :-))
2022-11-20 05:16:02 +01:00
Pavel "LEdoian" Turinsky
3fcc03b769 Shellcheck :-)
Ne že by mi na tom záviselo, ale kód to nezhoršuje a pokud to aspoň o
trochu zmenší šanci na nějaké přehlédnutí, tak je to OK.

A spoustu varování shellchecku jsem vyignoroval a nemíním plevelit kód
komentáři, o čem všem vím a on ne :-)
2022-11-20 05:08:24 +01:00
Pavel "LEdoian" Turinsky
b1e6448c3c safe_checkout_branch: varování 2022-11-20 04:57:48 +01:00
Pavel "LEdoian" Turinsky
34e751fd69 fixup! make/lib: safe_checkout_branch stačí 1 parametr 2022-11-20 04:52:51 +01:00
Pavel "LEdoian" Turinsky
1615e92159 safe_checkout_branch: porovnáváme proti upstreamu, ne aktuální verzi. 2022-11-20 04:45:48 +01:00
Pavel "LEdoian" Turinsky
a390ef0329 make/lib: safe_checkout_branch stačí 1 parametr 2022-11-20 04:40:03 +01:00
Pavel "LEdoian" Turinsky
e4c2eda955 make/run bere parametry 2022-11-20 04:38:03 +01:00
Pavel "LEdoian" Turinsky
5963089539 make/lib: .git může být i normální soubor (worktree) 2022-11-20 04:37:27 +01:00
Pavel "LEdoian" Turinsky
28760e2c4d Smazán install_venv
Všechny make skripty stejně vyrábí venv přes `ensure_venv` a protože web
nikdo nikdy nebude instalovat jinak (nebo když bude, tak asi ví, co
dělá), tak tohle nedává smysl spouštět.
2022-11-20 04:33:19 +01:00
Pavel "LEdoian" Turinsky
e36410ee82 make/lib: komentáře kolem git-rev-parse 2022-11-20 04:27:16 +01:00
Pavel "LEdoian" Turinsky
ac9cb53185 Hezčí SSH spojení
- Přidal jsem `set -euxo pipefail`, takže nejsou potřeba `&&` a obecně se
  to chová víc jako ostatní make skripty
- Venv se zapíná stejně jako v lokálních skriptech, takže se dá
  jednoduše změnit jeho cesta
2022-11-20 04:23:41 +01:00
Pavel "LEdoian" Turinsky
346079cee3 make/lib: Funkce install_everything je jen pro Gimliho 2022-11-20 04:17:57 +01:00
Pavel "LEdoian" Turinsky
d086501095 make/lib: lokální proměnné 2022-11-20 04:15:00 +01:00
Pavel "LEdoian" Turinsky
1a56ba02f3 Make: výchozí target se jmenuje default
`all` tam nemá žádnou sémantiku…
2022-11-20 04:13:15 +01:00
Pavel "LEdoian" Turinsky
31834b7f8a Zrušen make/all
Nic moc nedělal, tak jsem ho nahradil (IMHO lepší) dokumentací.
2022-11-20 04:12:35 +01:00
Pavel "LEdoian" Turinsky
4fd3a0c4f5 Hlasitější varování při použití make 2022-11-17 01:57:37 +01:00
30853ecd77 Komentáře česky 2022-11-16 21:20:09 +01:00
38192db1de Popis, co je .editorconfig 2022-11-16 21:17:19 +01:00
577860985a Merge pull request 'editorconfig (#1011)' (!9) from editorconfig into master
Reviewed-on: #9
2022-11-16 08:59:12 +01:00
8cc1cf4d5b Merge pull request 'Fix: Petr chce obálkovat od čísla do čísla' (!8) from odmeny_podle_petra into master
Reviewed-on: #8
2022-11-16 07:14:14 +01:00
Pavel "LEdoian" Turinsky
914ec732af CSS jsou pro účely editace asi víceméně python 2022-11-16 01:37:40 +01:00
Pavel "LEdoian" Turinsky
e1be20c08b HTML odsazovat dvěma mezerami 2022-11-16 01:18:59 +01:00
315dc97635 Add: další nápad do aprílu 2022-11-15 13:08:20 +01:00
Pavel 'LEdoian' Turinsky
e810d01b0e Unset je lepší varianta 2022-11-15 12:49:11 +01:00
Pavel 'LEdoian' Turinsky
7c90c1ef5e sync_prod_flatpages 2022-11-15 12:43:31 +01:00
Pavel 'LEdoian' Turinsky
5abd93d27f Zbytek sync_test 2022-11-15 12:17:50 +01:00
Pavel 'LEdoian' Turinsky
5cfadf9236 Make: přesunuty sync_test_media
Taky jsem smazal nějaké komentáře v Makefile_old, aby nepřekážely.
2022-11-15 12:05:12 +01:00
Pavel 'LEdoian' Turinsky
0458abb419 Kontroly prerekvizit do knihovny 2022-11-15 11:58:22 +01:00
Pavel 'LEdoian' Turinsky
f6d939fc31 Přebytečný středník 2022-11-15 11:48:48 +01:00
Pavel 'LEdoian' Turinsky
2a81dbe09d Přidán editorconfig 2022-11-15 00:47:19 +01:00
8c1f042ea0 Fix: Haha, Jidáš neumí mergeovat pull requesty… 2022-11-14 23:56:54 +01:00
2c9d283a64 Merge pull request 'políčko pro zpětnou vazbu' (!3) from zpetna_vazba into master
Reviewed-on: #3
2022-11-14 23:52:13 +01:00
b6ebb1eb5e Merge pull request 'Přepsání stvrzenek do templates' (!7) from strvzenky_templates into master
Reviewed-on: #7
2022-11-14 23:39:30 +01:00
23dde1263a Fix: Petr chce obálkovat od čísla do čísla 2022-11-14 23:32:33 +01:00
17f2e22f5c Merge branch 'master' into strvzenky_templates 2022-11-14 23:24:39 +01:00
Pavel "LEdoian" Turinsky
323477dbf2 Smazán venv_check
Je úplně k ničemu, když si nové skripty zapínají venv samy
2022-11-14 23:21:20 +01:00
Pavel "LEdoian" Turinsky
d80babfd73 Smazán obsah make/sync*
Nic tam nebylo a teď je vidět ve `file *`, že tam nic není.
2022-11-14 23:20:55 +01:00
Kristyna Petrlikova
c08e6c87f5 Přepsání stvrzenek do templates 2022-11-14 23:16:24 +01:00
Pavel "LEdoian" Turinsky
a9e7cd7af2 Deploy v novém kabátu
prosím čtěte…
2022-11-14 23:16:19 +01:00
Kristyna Petrlikova
2c9c1dc8e1 Přidání účastnického poplatku v nastavení 2022-11-14 23:08:02 +01:00
376cc0d7e5 Fix: #1251 2022-11-14 22:35:00 +01:00
c3728750f7 Fix: #910 2022-11-14 22:07:29 +01:00
39c37c0c73 Fix: #992 2022-11-14 21:53:07 +01:00
Pavel "LEdoian" Turinsky
4f7c4057ea fix uvozovek
Thanks shellcheck
2022-11-14 21:37:01 +01:00
9ee7ac78c4 Fix: #1125 2022-11-14 21:36:10 +01:00
e856859ffb odevzdavatko: zobrazení chyby při nevalidním formsetu 2022-11-14 21:06:00 +01:00
f8667b8247 odevzdavatko: políčko pro zpětnou vazbu řešiteli 2022-11-14 21:05:57 +01:00
Pavel "LEdoian" Turinsky
657e73f2f0 Poznámka o důvodu existence Makefile 2022-11-07 23:15:39 +01:00
Pavel "LEdoian" Turinsky
8b36e79f04 Makefile reforma vol.2 [WIP]
Už máme ty jednoduché targety (nebo byly smazány), zbývá dořešit několik
složitých.
2022-11-07 23:14:06 +01:00
Pavel "LEdoian" Turinsky
9f78963e7f Poznámka o neplatnosti README 2022-11-07 23:12:57 +01:00
a8160214cb Merge pull request 'Fix: #1331' (!1) from fix_pristup_k_prednaskam into master
Reviewed-on: #1
2022-11-07 22:56:32 +01:00
7e60791c33 Fix: #1331 2022-11-07 22:53:08 +01:00
Pavel "LEdoian" Turinsky
75f388ddfb Fix symlink 2022-11-07 22:34:54 +01:00
Pavel "LEdoian" Turinsky
e3ebb925e1 Reforma Makefilů WIP 1 2022-11-07 22:32:06 +01:00
32768aab10 Fix: na mobilu není menu korektur 2022-11-07 22:05:44 +01:00
f12c4ccb7a Fix: rozbitá testdata 2022-11-07 20:45:39 +01:00
100e16030a Fix: rozbitá testdata 2022-11-07 20:42:12 +01:00
3d1b2794e9 Fix: rozbitá testdata 2022-11-07 19:44:49 +01:00
6eaa174d87 localhost do ALLOWED_HOSTS 2022-11-03 22:09:55 +01:00
81ef3a8f53 Fix: resetování hesla posílá i uživatelské jméno, ale odkaz na resetování o tom nemluví 2022-10-31 22:42:42 +01:00
313ee120ae Fix: aktuální výsledkovka už není průběžná, ale k datu… 2022-10-31 21:51:22 +01:00
51710892df Fix: veřejná výsledkovka ročníku se má sčítat jen do veřejného deadlinu 2022-10-31 21:46:24 +01:00
046a6be790 Add: Aktuální výsledkovka musí obsahovat datum, jinak se řešitelé ptají. 2022-10-31 21:31:09 +01:00
58d6334ba5 Merge branch 'oprava_tabulky' into develop 2022-10-24 20:34:53 +02:00
a03c9a3369 Fix (tab. doš. řešení): strftime vyhazuje datum bez paddingu nul, tak tam nakódíme string… 2022-10-24 20:33:55 +02:00
009cd49f37 Revert "Fix (tab. doš. řešení): strftime nefunguje, jak jsem si myslel"
This reverts commit 4b03a2d23c.
2022-10-24 20:16:41 +02:00
9daeeedda3 Merge branch 'oprava_tabulky' into develop 2022-10-24 16:31:55 +02:00
4b03a2d23c Fix (tab. doš. řešení): strftime nefunguje, jak jsem si myslel 2022-10-24 16:31:22 +02:00
24bc671c21 Merge branch 'oprava_tabulky' into develop 2022-10-24 15:49:34 +02:00
3476198c27 Fix (tab. doš. řešení): přídání včetně + vyjma, přidána možnost odjakživa 2022-10-24 15:48:36 +02:00
7334fc5cc5 Merge branch 'vysledkovky2' 2022-10-17 10:03:21 +02:00
587d1b4714 Merge branch 'vysledkovky2' into develop 2022-10-17 09:59:57 +02:00
c8cf67f920 Fix: Automatické přidání deadlinu k odevzdanému hodnocení
(měl jsem pocit, že už jsem to dělal)
2022-10-17 09:58:21 +02:00
e8e5cdc75f Merge remote-tracking branch 'origin/stvrzenky' into develop 2022-10-14 22:35:26 +02:00
41971e8080 Korektury stvrzenek 2022-10-14 16:09:54 +02:00
122bfc7436 Merge branch 'stvrzenky' into develop 2022-10-13 23:31:11 +02:00
6ca79ac342 Generování stvrzenek nedostávalo TeXovský soubor do tempu. 2022-10-13 23:30:23 +02:00
694aa4d3d3 Merge remote-tracking branch 'origin/stvrzenky' into develop 2022-10-13 23:14:00 +02:00
2882abd894 Hotfix: produkce vypisuje do templatu chybu??? 2022-10-13 22:37:39 +02:00
4aa67d6151 Merge branch 'vysledkovky2' into develop 2022-10-13 21:44:20 +02:00
c04eb0eaa7 Oprava reverzní migrace vracející číslu verejna_vysledkovka 2022-10-13 17:02:03 +02:00
9bccb9d17d Migrace deadline_body: Warning když beru cislo_body. 2022-10-13 16:45:44 +02:00
8d8cd9ed18 Ať nám to i řekne jaký divný deadline se přiřadil. 2022-10-13 15:58:16 +02:00
66447063a9 Ať to nepadá, pokud nebyl přiřazen deadline. 2022-10-13 15:56:07 +02:00
Pavel "LEdoian" Turinsky
81a8081c8e Nechceme řešit CSRF warningy (RFC)
Možná chceme – pokud by jich bylo moc, tak to začne být podezřelé a
nevím, jestli to zvládne chytit django.security.suspicious_behaviour
(nebo jak se jmenuje)
2022-10-12 17:21:42 +02:00
6e06f77239 Sakra tohle tu mělo zůstat 2022-10-12 14:29:35 +02:00
e6842af2a8 Polymorfismus v migraci lépe. 2022-10-12 14:27:44 +02:00
d582c43de5 Učesání datové migrace na deadliny 2022-10-12 11:37:31 +02:00
Pavel "LEdoian" Turinsky
176e601ec2 Zalámání moc dlouhého řádku 2022-10-12 03:09:12 +02:00
f5c260d79c Kopírování deadlinu při hodnocení. 2022-10-11 13:56:56 +02:00
ffab712aec Fix migrace: cislo_body může být None 2022-10-11 11:24:21 +02:00
ad1b0e238c Příkaz na přegenerovaní zmražených výsledkovek 2022-10-11 11:23:43 +02:00
8dceaec349 Migrace zachovávající výsledkovky ročníku < 26 2022-10-11 11:01:45 +02:00
Pavel "LEdoian" Turinsky
f172a1e3ee Zrušení přebytečné lokální proměnné 2022-10-11 01:38:44 +02:00
Pavel "LEdoian" Turinsky
cb922ddd67 Některé property není potřeba cachovat
Zdaleka nezaručuji, že jsou tady všechny takové…
2022-10-11 01:38:44 +02:00
Pavel "LEdoian" Turinsky
da0cf2e4cc Popis '-1' v kódu kolem výsledkovek 2022-10-11 01:38:44 +02:00
Pavel "LEdoian" Turinsky
e3318732be Přidány TODO :-) 2022-10-11 01:38:44 +02:00
Pavel "LEdoian" Turinsky
907710f40b Komentář k typu 2022-10-11 01:38:44 +02:00
Pavel "LEdoian" Turinsky
1a4a88846e VysledkovkaCisla: použít enumerate 2022-10-11 01:38:44 +02:00
Pavel "LEdoian" Turinsky
c2d442ba39 VysledkovkaRocniku: použít enumerate 2022-10-11 01:38:44 +02:00
Pavel "LEdoian" Turinsky
08f648345e Komentář` 2022-10-11 01:38:44 +02:00
Pavel "LEdoian" Turinsky
442d2a20f4 Typová anotace body_resitelu(do=…) 2022-10-11 01:38:44 +02:00
ef0f07d389 ♲ -> ⭯ 2022-10-10 22:13:22 +02:00
f68e452827 generování stvrzenek za platbu soustředění 2022-10-10 21:20:18 +02:00
a01e58dc68 Oprava ... v přihlášce 2022-10-10 20:17:39 +02:00
d013cc6844 Odmazání cachované výsledkovky při zneveřejnění 2022-10-10 09:30:45 +02:00
b06642e4ba „Cachování“ výsledkovek čísla 2022-10-10 09:28:12 +02:00
61f7f83641 Merge branch 'test' into develop 2022-10-09 22:30:05 +02:00
f927303248 Merge branch 'master' into test 2022-10-09 22:29:07 +02:00
6b3cba10bb Hotfix e-mailů (proti spamu) 2022-10-09 22:27:57 +02:00
f720bf15e0 Odstraněna veřejnost výsledkovky z čísla 2022-10-09 13:16:19 +02:00
7608982c29 Tohle tu zůstalo a nemělo 2022-10-09 12:54:04 +02:00
c2a38ece60 Odstranění deadlinů zadrátovaných v čísle 2022-10-09 12:42:11 +02:00
9e05e0dc0f Deadliny už jsou řešené jinak 2022-10-09 11:56:26 +02:00
e30ae81854 Deadliny u řešení 2022-10-09 11:50:27 +02:00
862ee994dc Deadliny v aktuálním zadání 2022-10-09 10:45:17 +02:00
7d2d54d86e Jasně, špatné pořadí 2022-10-09 10:23:44 +02:00
62186d638f Tabulka došlých řešení – fix filtrování od. 2022-10-09 10:21:28 +02:00
fb959da242 Deadline na v došlých řešeních. 2022-10-09 10:11:38 +02:00
ab5ccfce50 Deadline na titulní straně. 2022-10-09 09:52:46 +02:00
e3734b48df Odstraněny dvojitá čísla ve výsledkovce ročníku. Django databázové dotazy občas nechápu. 2022-10-08 12:43:51 +02:00
417f786bef Tituly musí být i s neveřejnými. 2022-10-08 11:31:30 +02:00
353363af8d Dneska končím 2022-10-06 12:40:02 +02:00
3dcaeee12c :'( 2022-10-06 12:38:31 +02:00
e9973ffff0 Měl bych si dát pauzu, v minulém commitu prostě chybí tohle 2022-10-06 12:26:28 +02:00
1f12f5c7ec A teď je zlomový deadline určen prakticky kompletně 2022-10-06 12:05:07 +02:00
32ac5188a6 Zlomový deadline musí být lépe určen 2022-10-06 11:58:23 +02:00
f1d5beb5ab Už jsem se zase nechal nachytat na setřízení querysetu 2022-10-06 11:17:56 +02:00
c7332119ac Odměny 2022-10-06 10:35:14 +02:00
e442a87421 Pardon, tahle funkce brala něco jiného než tvrdila 2022-10-05 22:03:41 +02:00
623124e833 Funkce použité pouze ve výsledkovce přesunuty do výsledkovky 2022-10-05 21:43:15 +02:00
0e92526a8a Hlavní problém -> téma (hlavní problém je maximální nadproblém, kdežto témata jsou to, co je ve výsledkovce) 2022-10-05 21:24:42 +02:00
f54469e7af Ostatní case 2022-10-05 21:14:27 +02:00
82024ad982 Zpět hlavni_problem místo slovníku 2022-10-05 21:08:43 +02:00
0d7ec1d90a Přepsána sčítací funkce 2022-10-05 21:02:18 +02:00
af4b802354 Kontrola na null už v databázi 2022-10-05 20:14:53 +02:00
e461fcaf78 Koukal jsem, jak je to s select_related a prefetch_related a přijde mi, že by to mělo být takhle 2022-10-05 19:43:55 +02:00
b9875b5a1a Zrychlení výsledkovky čísla sjednocením sčítání bodů. 2022-10-05 19:31:49 +02:00
d0a6e35298 FIX: Ostatní ve výsledkovce do TeXu 2022-10-03 17:31:39 +02:00
96fb5dd16f Ostatní ve výsledkovce do TeXu 2022-10-03 17:19:53 +02:00
750d02f2a7 Výsledkovky do TeXu (náchylné na chyby v „nemožných“ případech jako, že ročník má jen 1 číslo, číslo nemá deadline, apod.) 2022-10-03 16:56:38 +02:00
0069382f51 Přidání zapomenutého filtrování hodnocení do deadlinu a příprava na TeX 2022-10-02 21:03:07 +02:00
320f7dac63 Zkrácení 2022-10-02 20:53:08 +02:00
8d379d6dad A tady špatný název 2022-10-02 00:10:07 +02:00
00315ea288 Špatný název 2022-10-02 00:07:18 +02:00
382b482777 sezn -> seznam i v TeXu 2022-10-01 23:39:37 +02:00
a4ef28465f Jo, tohle tedy nefunguje :( 2022-10-01 23:28:16 +02:00
894ba3128d Oprava rozklikávání 2022-10-01 23:24:52 +02:00
34a82fc22f Měl jsem prostě zato, že to funguje. I jsem si to zkoušel. 2022-10-01 23:08:55 +02:00
1ed7162cfe Výsledkovky k jednotlivým deadlinům 2022-10-01 22:41:25 +02:00
eed3ed4dd0 Tituly 2022-10-01 22:08:21 +02:00
ba7e3409a2 Přepsání výsledkovek v1 2022-10-01 21:47:15 +02:00
79d9636c28 Automatické nastavení deadlinu u Hodnocení, orgovská úprava deadlinů u Hodnocení 2022-10-01 14:41:47 +02:00
05047d547a Fix migrace 2022-10-01 14:22:12 +02:00
261f2447e3 Já už nevím, jak určovat deadliny řešení… 2022-10-01 14:11:29 +02:00
87e51ac744 Já už nevím, jak určovat deadliny řešení… 2022-10-01 14:01:29 +02:00
d9912671ff Doplnění deadlinů, větší rozptyl kontroly 2022-10-01 12:43:16 +02:00
e33a80b16d Deadline u hodnocení 2022-10-01 11:39:59 +02:00
342c791700 Model pro deadline 2022-10-01 11:25:53 +02:00
ebe3bd8eda Fix: hromadné přidávátko (neumím používat clean…) 2022-09-30 21:35:39 +02:00
07b163389d Přesun svg + zasložkování (aby bylo jasné, k čemu patří graph a templatů jak-resit už bylo hodně) 2022-09-28 09:51:19 +02:00
6cda3f0a27 Generický formulář (stránka, kam naleju libovolný jednoduchý form) přesunuta na lepší místo 2022-09-27 21:38:20 +02:00
8c03c2e1d3 Komentář, abych to znovu neopravoval :D 2022-09-27 21:12:13 +02:00
37f7619972 Revert "Přihlášený uživatel nyní varován na přihlašovací stránce smysluplnou hláškou"
This reverts commit 5ff32f1475.
2022-09-27 21:06:54 +02:00
c6ad41606a Merge branch 'develop' into test 2022-09-25 15:04:54 +02:00
f188442666 Řešení už neposíláme (v přihlášce a editaci profilu) 2022-09-25 15:02:10 +02:00
f5ac7e3aa5 Domů => vyplněná adresa 2022-09-25 14:58:40 +02:00
4d9623d83e Poznámka o vyhledávání škol 2022-09-25 14:43:11 +02:00
c19d7adf0a Merge remote-tracking branch 'origin/develop' into test 2022-09-23 10:01:37 +02:00
75f7d17f95 FIX: Výsledkovka 2022-09-23 10:00:46 +02:00
1ca9dfda63 Merge remote-tracking branch 'origin/develop' into test 2022-09-12 11:36:35 +02:00
571c875771 FIX: Export řešitelů 2022-09-12 11:36:03 +02:00
6346f0ec4a Merge branch 'develop' into test 2022-09-08 18:32:13 +02:00
f28382eed9 Problémy v orgorozcestníku jsou nově klikací 2022-09-08 18:31:23 +02:00
c5a145070b dokumentace… 2022-09-08 18:11:27 +02:00
20a11358eb Generování testdat (poznámka při install_web) 2022-09-08 15:57:03 +02:00
550bf9811f Chyby při instalaci zkopírovány do README 2022-09-08 15:26:43 +02:00
6b64bcadfe Merge branch 'develop' into test 2022-09-05 21:04:40 +02:00
dce5178fc2 Povinnost uvést odkud znáš M&M 2022-09-05 21:03:41 +02:00
fd3df6c344 WIP 2022-09-05 20:49:23 +02:00
7ccaf87dfc Pokus o lepší orientaci v dokumentaci 2022-09-04 18:39:00 +02:00
d7ef2e8044 Merge branch 'develop' into test 2022-09-03 09:50:25 +02:00
Kristyna Petrlikova
b80e73efb9 Nástřel implementace políčka "Jak se dozvěděli" 2022-08-15 22:22:43 +02:00
bd6838ba62 Merge branch 'hromadne_pridavani_uloh' into develop 2022-07-22 18:06:51 +02:00
769a6d2dee Chytání chyb v hromadném přidání. Také přidány komentáře. 2022-07-22 18:05:50 +02:00
6dcd53b68f enumerate(...,1) místo +1 2022-07-22 17:46:23 +02:00
8ad3c761be Merge branch 'master' into develop 2022-07-22 17:26:29 +02:00
9975bbd2b0 Merge branch 'hromadne_pridavani_uloh' into test 2022-07-22 14:24:03 +02:00
c33896afec Url přesunuto z generického formu do příslušného view 2022-07-22 14:23:35 +02:00
1e2ab81bce Velmi fuj hromadné přidání úložek 2022-07-22 14:21:40 +02:00
a263f82673 Merge branch 'master' into develop 2022-07-11 18:14:53 +02:00
5ff32f1475 Přihlášený uživatel nyní varován na přihlašovací stránce smysluplnou hláškou 2022-07-07 21:33:37 +02:00
4dfe3bef7b Doba pro neodhlašování přesunuta do settings 2022-07-07 21:16:23 +02:00
e643174f5f Odhlašování po zavření prohlížeče 2022-07-07 21:13:08 +02:00
57e1f22e9d ∞ -> rok 2022-07-07 21:09:02 +02:00
3663e04452 Tlačítko neodhlašovat 2022-07-07 20:56:44 +02:00
54f16f358f Klikací jak řešit 2022-06-29 19:50:25 +02:00
5d7237b83f e-mailová konference -> discord 2022-06-29 17:10:32 +02:00
b7d61ee7c7 Oprava školní adresy v obálkách 2022-06-23 16:43:01 +02:00
1a3e8aa242 Aprílové nápady v dokumentaci 2022-06-23 15:53:36 +02:00
ce3b535b01 Merge branch 'master' into develop 2022-06-23 15:52:29 +02:00
72246867de Oprava grafu 2022-06-05 15:05:55 +02:00
Kristyna Petrlikova
9bc7588980 Zakomentovani pohadky 2022-05-28 23:13:49 +02:00
20962cfdb4 Merge branch 'master' into develop 2022-05-28 10:54:20 +02:00
d632b82e1d M&M - korespondenční seminář a časopis MFF&nbspUK -> M&M &ndash; korespondenční seminář a časopis MFF&nbspUK 2022-05-28 10:47:03 +02:00
bf1e187d91 help ke korekturám je flatpage 2022-05-27 21:39:00 +02:00
7d54198ce8 127.0.0.1:8000 -> mam.mff.cuni.cz 2022-05-27 21:26:57 +02:00
e282778623 Posun textů v grafu na titulní stránce 2022-05-27 20:53:09 +02:00
Kateřina Č
cf4cf31c75 MŠMT v patičce, pro všechny velikosti zobrazení 2022-05-24 21:28:53 +02:00
35e77e69f8 odevzdavatko | id musi byt v ramci stranky jedinecne. 2022-03-16 00:09:33 +01:00
7956a88568 Merge branch 'sphinx_test' into develop 2022-03-07 22:42:37 +01:00
87e2833a89 Markdown ve sphinxu. 2022-03-07 22:41:59 +01:00
7f1d406242 Přesunutí apidoc z conf.py do Makefilu. Fuj Windows 2022-03-07 21:56:09 +01:00
a4270f775b Lepší řazení zastaralých korektur 2022-03-07 21:36:13 +01:00
5f5ad7029b Novější syntaxe super() 2022-03-07 21:31:15 +01:00
ead67e4a82 Převrácení řazení zastaralých korektur 2022-03-07 20:57:13 +01:00
e470aaedaa Zachování časové setřízenosti korekturovátka 2022-03-07 20:49:48 +01:00
Kateřina Č
a8af72df1d větší tabulka odevzdaných řešení větším displeji 2022-02-21 21:37:54 +01:00
9a8bb26997 Na datum použít <time> místo <span> 2022-02-21 20:22:39 +01:00
a15ba2e9b2 #1356 - vylepšení formátování chybové hlášky 2022-02-21 19:44:41 +01:00
5881a9d506 Konzistentní krátké datum. 2022-02-21 18:34:17 +01:00
5113a7adab První dokumentace 2022-02-15 17:48:16 +01:00
cbf17f7709 Další konfigurace sphinx 2022-02-15 17:45:52 +01:00
5d61190695 Dalších pár změn v dokumentaci 2022-02-14 22:59:46 +01:00
ea582b6e14 Automatické přegenerování dokumentace a další malé změny v dokumentaci pomocí sphinxu 2022-02-14 22:30:44 +01:00
6b3fb8f19c Pár prvních pokusů 2022-02-10 14:01:03 +01:00
39c9eea11c Sphinx lepší vzhled 2022-02-10 14:01:03 +01:00
3789836291 Sphinx init 2022-02-10 14:01:03 +01:00
689 changed files with 64448 additions and 103240 deletions

24
.editorconfig Normal file
View file

@ -0,0 +1,24 @@
# Univerzální popis našich konvencí pro nastavení editorů.
# Vizte https://editorconfig.org pro detaily
root = true
[*]
charset = utf-8
# Unixové řádky
end_of_line = lf
insert_final_newline = true
[*.{py,css}]
indent_style = tab
# Nenařizujeme konkrétní šířku tabulátoru
indent_size = unset
# Automaticky generované migrace dodržují PEP-8, nemá smysl s tím moc bojovat.
[*/migrations/*.py]
indent_style = space
indent_size = 4
[*.html]
indent_style = space
indent_size = 2

10
.gitignore vendored
View file

@ -31,5 +31,15 @@ TODO
# reversion kvůli historii objektů v reversion
**/reversion
# dokumentace
docs/_build
docs/modules
# logy týracího skriptu (./checklinks.sh)
/wget.log.*
# pro lidi, co programují v nástrojích od JetBrains
.idea
# Mac users
.DS_Store

158
Makefile
View file

@ -1,153 +1,9 @@
PYTHON ?= python3
VENV ?= ${PYTHON} -m venv
# Všechny flagy, které se s venvem/virtualenvem/... mají volat patří sem. Volá se "${VENV} cesta"
VENV_PATH ?= env
# Musí být definovaná, i kdyby to měla být "."
# Existence tohohle Makefile je tu jen proto, aby fungovala svalová paměť. Pokud můžete, použijte rovnou `make/…`
%:
# Používání make jako příkazu je zastaralé, prosím používej radši skripty ze složky make. Spouštím následující příkaz:
make/$*
.PHONY: all venv_check clean install install_web install_venv clean_venv clean_schema run test deploy_test deploy_prod sync_test_media sync_test_db sync_test sync_local_media sync_local_db sync_local
default:
@cat make/README.md
# activate by mělo být předpokladem ke všemu, co volá webový python (i.e. python nasazený do ${VENV}u kvůli webu, např. manage.py)
all:
@# Just echo:
# Install je trochu magický:
# Spusť následující posloupnost příkazů:
# make install_venv
# . ${VENV_PATH}/bin/activate
# make install_web
#
# Pokud install_web říká Error: pg_config executable not found. nainstaluj si libpq-dev
# Pokud chybová hláška obsahuje #include <Python.h>, nainstaluj si python3-dev
#
# Až skončíš s vývojem webu, spusť "deactivate". Tím zmizí '(${VENV_PATH})' ze začátku promptu.
venv_check:
@# Pokud org nemá zapnutý venv, poradíme mu, aby si ho zapnul a spadneme. Jinak nic.
@expr $$PATH : ".*:*$(shell pwd)/${VENV_PATH}/bin" > /dev/null && exit 0 || echo 'Není zapnutý venv, spusť ". ${VENV_PATH}/bin/activate".\nPokud není venv nainstalovaný, spusť "make install_venv"' && false
clean: clean_venv clean_schema
install: install_web
install_web: venv_check
@# venv může být příšerně starý, takže nejdříve upgradujeme venvové věci
pip install --upgrade pip
pip install --upgrade setuptools
# Instalace závislostí webu
pip install -r requirements.txt --upgrade
# Po vygenerování testdat spusť ./manage.py loaddata data/*, ať máš menu a další modely
# Pro synchronizaci flatpages spusť make sync_prod_flatpages
install_venv:
${VENV} ${VENV_PATH}
clean_venv:
# Možná není 100% foolproof...
@test ! ${VENV_PATH} = . || ! echo "Smaž si prosím venv sám, nebudu mazat celý web"
rm -rfv ${VENV_PATH}
rm -f pip-selfcheck.json
clean_schema:
rm -f schema_seminar.pdf schema_all.pdf
run: venv_check
./manage.py runserver
test: venv_check
./manage.py test -v2 seminar mamweb
# DB schemata
schema: schema_seminar.pdf schema_all.pdf
schema_seminar.pdf: venv_check
./manage.py graph_models seminar | dot -Tpdf > schema_seminar.pdf
schema_all.pdf: venv_check
./manage.py graph_models -a -g | dot -Tpdf > schema_all.pdf
# Deploy to current *mamweb-test* directory
deploy_test: venv_check
@if [ ${USER} != "mam-web" ]; then echo "Only possible by user mam-web"; exit 1; fi
@if [ `readlink -f .` != "/aux/akce/mam/www/mamweb-test" ]; then echo "Only possible in directory mamweb-test"; exit 1; fi
@echo "Installing version from origin/test ..."
git pull origin test
git clean -f
make install
./manage.py migrate
./manage.py collectstatic --noinput
(chown -R :mam . || true )
(chmod -R g+rX,go-w . || true )
@echo Restarting systemd unit
systemctl --user restart mamweb-test.service
@echo Done.
# Deploy to current *mamweb-prod* directory
deploy_prod: venv_check
@if [ ${USER} != "mam-web" ]; then echo "Only possible by user mam-web"; exit 1; fi
@if [ `readlink -f .` != "/aux/akce/mam/www/mamweb-prod" ]; then echo "Only possible in directory mamweb-prod"; exit 1; fi
@echo "Backing up production DB ..."
( cd -P .. && ./backup_prod_db.sh )
@echo "Installing version from origin/master ..."
git pull origin master
git clean -f
make install
./manage.py migrate
./manage.py collectstatic --noinput
(chown -R :mam . || true )
(chmod -R g+rX,go-w . || true )
@echo Restarting systemd user unit for MaM web
systemctl --user restart mamweb-prod.service
@echo Done.
sync_prod_flatpages: venv_check
@echo Downloading current version of flatpages from mamweb-prod.
ssh mam-web@gimli.ms.mff.cuni.cz \
"cd /akce/mam/www/mamweb-prod; . env/bin/activate; ./manage.py dumpdata flatpages --indent=2 > flat.json; ./fix_json.py flat.json flat_fixed.json"
rsync -ave ssh mam-web@gimli.ms.mff.cuni.cz:/akce/mam/www/mamweb-prod/flat_fixed.json data/flat.json
@echo "Applying downloaded flatpages."
./manage.py loaddata data/flat.json
@echo "Done."
# Sync test media directory with production
sync_test_media:
@if [ ${USER} != "mam-web" ]; then echo "Only possible by user mam-web"; exit 1; fi
@if [ `readlink -f .` != "/aux/akce/mam/www/mamweb-test" ]; then echo "Only possible in /akce/mam/www/mamweb-test"; exit 1; fi
rsync -av --delete /akce/mam/www/mamweb-prod/media/ ./media
# Sync (with drop) test database with production database
sync_test_db_aggressive:
@if [ ${USER} != "mam-web" ]; then echo "Only possible by user mam-web"; exit 1; fi
pg_dump mam_test > dump-test-`date +"%Y%m%d_%H%M"`.sql
pg_dump -Fc mam_prod > dump-prod.sql
@# I am not sure which shell is used, so I am calling bash to make sure
psql mam_test -c 'DROP OWNED BY "mam-web";'
pg_restore -c --if-exists -d mam_test dump-prod.sql
rm dump-prod.sql
psql mam_test -c "UPDATE django_site SET name='MaMweb (test)', domain='mam-test.ks.matfyz.cz' WHERE id=1"
@echo Done.
# Sync test with production
# HACK ALERT: using aggressive variant, due to the schemas being too different.
sync_test: sync_test_media sync_test_db_aggressive
# Sync media directory with atrey. Useful for local development with production database
# Does not sync Galerie and CACHE (too huge).
sync_local_media:
rsync -ave ssh --exclude Galerie --exclude CACHE\
mam-web@gimli.ms.mff.cuni.cz:/akce/mam/www/mamweb-prod/media/ ./media/
# Downloads and restores production database to local database. PostgreSQL only.
sync_local_db:
scp mam-web@gimli.ms.mff.cuni.cz:`ssh mam-web@gimli.ms.mff.cuni.cz 'ls -v /akce/mam/www/backups/mam_prod-*\.pgdump.xz | tail -n 1'` \
./last.pgdump.xz
xz -fd last.pgdump.xz
pg_restore -c -d mam-prod last.pgdump
# Sync database and media. See above lines
sync_local: sync_local_media sync_local_db
# Push local compiled Vue to gimli test site
push_compiled_vue_to_test:
scp vue_frontend/webpack-stats.json mam-web@gimli:/akce/mam/www/mamweb-test/vue_frontend/
rsync -ave ssh seminar/static/seminar/vue mam-web@gimli:/akce/mam/www/mamweb-test/seminar/static/seminar/
ssh mam-web@gimli.ms.mff.cuni.cz 'cd /akce/mam/www/mamweb-test/ && . env/bin/activate && ./manage.py collectstatic --noinput'
.PHONY: default

112
README.md
View file

@ -1,74 +1,58 @@
Basic commands for web development
==================================
Web M&M
======
After you clone this repository, run `make`. It will download, locally install
and setup virtualenv and pip, and then locally install all required packages
from `requirements.txt`.
Tohle je repozitář s kódem M&Mího webu. Pokud zde hledáte web samotný nebo
informace o semináři, najdete je na <https://mam.matfyz.cz> (a upřímně nechápu,
jak jste se dostali k tomuhle textu :-D)
When working with the code, always use the binaries in `./bin/`, such as
`bin/pip`, `bin/python`, ... never the global python, pip, ...
Use `make` and `./manage.py` for most things.
Pokud jste tu zůstali, tak vás beztak zajímá vývoj webu (a jestli ne, tak
budeme rádi, když začne :-)).
Use git :-)
Co je M&Mweb uvnitř
------
Celý náš web je napsaný v [Pythonu](https://www.python.org) ve frameworku
[Django](https://www.djangoproject.com/). Web běží na serveru zvaném Gimli,
jako databázi používá PostgreSQL (pro lokální vývoj naopak SQLite) a všechen
náš kód je uložený v [Gitu](https://git-scm.com/) na [téhle
gitee](https://gitea.ks.matfyz.cz/). Pro dokumentaci používáme
[Sphinx](https://www.sphinx-doc.org).
Quickstart
----------
Run the following commands:
make install_venv
. env/bin/activate
make install_web
<!--TODO: Z odstavce výše by ideálně měla být zachována jen první věta a zbytek
by měl být někde v docs s podrobnějším popisem…-->
After finishing development, run "deactivate".
Jak si web pořídit
------
Prosím přečti si podrobnější návod v <docs/vyvoj.rst> (tady by bylo zbytečné
ho duplikovat).
Make commands
-------------
Jak web vyvíjet
----
<!--TODO: Napsat obšírněji, asi zase do docs/-->
* `make install` (or `make`) - locally install and setup virtualpy, install
required packages. Ran again installs missing packages. Run after changing
`requirements.txt`.
Na webu je mnoho věcí k dělání, některé ani nevyžadují kódění (třeba uhánění
orgů, aby si psali medailonky, aktualizace fotek, …), některé se naopak týkají
infrastruktury pod kódem (Gitea, Gimli, …). Je proto těžké mít na to úplně
obecný návod, tak tady je zhruba návod na úpravy kódu a pokud se něco z toho
nedá aplikovat, tak to prostě zkus nějak udělat jinak, po svém. (Omlouvám se
neinformatikům, ale líp to teď nesepíšu :-))
* `make clean` - remove local python packages.
* `make veryclean` - remove local packages and virtualpy enviroment and
binaries.
* `make run` - runs "./manage.py runserver_plus"
* `make push_test` - pushes the last commited version to test location.
Only git-commited changes are pushed! Rest is re-generated from scratch.
At test server, the media data and database are kept the same.
Everything else not in .gitignore is deleted/overwritten on the test server.
* `make schema` - generates graph of seminar and all schemas as PDF. Supercool!
* `make sync_prod_flatpages` - downloads and applies static/flat pages from mamweb-prod
./manage.py commands
--------------------
* `./manage.py migrate` - update the database schema, initialise the database.
You need to run this in the beginning.
* `./manage.py runserver_plus` - run a debugging server for the web. Slightly
enhanced compared to `./manage.py runserver`.
Open [127.0.0.1:8000](127.0.0.1:8000).
* `./manage.py testdata` - create pseudo-random seminar data and admin/admin
user.
* `./manage.py test` - run the tests.
* `./manage.py shell` - run commands, list elemements of database, check syntax
by importing files, etc.
Configurations
--------------
* `mamweb/settings_common.py` contains most configuration options.
* `mamweb/settings.py` is used only for local development.
* `mamweb/settings_test.py` is used for testing on atrey.
* `mamweb/settings_prod.py` is used in production deployment.
These are automatically switched by `make`.
1. Nejprve si stáhni repozitář a rozběhni si lokální web u sebe (viz <docs/vyvoj.rst>).
1. Najdi si problém v Kanboardu (klikni na „Issues“ na Gitee) a/nebo se domluv
s webaři, na čem bys tak mohl/a pracovat.
1. Najdi místo, kde se to dá opravit a zkus to tam opravit. Uznávám, že tenhle
bod je otravně obecný, pokud tápeš, zkus se zeptat zkušenějších webařů nebo
podívat do dokumentace.
1. Vyzkoušej, že ti to lokálně funguje tak, jak má.
1. Zvládneš-li a máš-li čas, zkus to i zdokumentovat a/nebo napsat testy (TODO: chybí návod)
1. Po dohodě s webaři to vyzkoušej na testwebu
1. Pošli pull-request a případně zkus reagovat na komentáře
1. Až se změna začlení do hlavní větve (`master`) a nasadí se web na produkci,
můžeš mít radost, že se web bude používat lépe Tobě i ostatním orgům :-)
### Proč pull-requesty?
<!--FIXME: Tohle ale už úplně patří do docs a ne sem, jen je zatím nemám prozkoumané…-->
Účelů pull-requestů je několik. Jednak doufáme, že pomůže webařům se orientovat
v kódu, jednak tím umožňujeme dělat experimenty a dávat si zpětnou vazbu. V
neposlední řadě pomáhají držet aspoň trochu konzistentní kód, což má pomoci
pohodě při programování… (A asi jsem na něco zapomněl :-))

View file

@ -1,16 +0,0 @@
git hooks
=========
Kontrola stylu pythoních zdrojáků pomocí flake8. Kontrolujeme jen změny,
abychom nenutili lidi dělat nesouvisející úpravy, které by rozbíjely historii
(git blame).
pre-commit
----------
* kontrola změn před commitnutím
* instalace: lokálně zkopírovat do .git/hooks (musí být spustitelný)
update
------
* kontrola změn přicházejících s pushem
* instalace: na atreyi zkopírovat do /akce/MaM/MaMweb/mamweb.git/hooks

View file

@ -1,30 +0,0 @@
#!/bin/sh
#
# Git hook script to verify what is about to be committed.
# Checks that the changes don't introduce new flake8 errors.
TMPDIFF=`tempfile`
FLAKE8="`git rev-parse --show-toplevel`/bin/flake8"
status=0
# select only changed python files which are not migrations
changed=`git diff --cached --name-only | grep 'py$' | grep -v 'migrations/[0-9]'`
if [ -z $changed ] ; then
# Nothing to check. Note the exit is necessary -- we would not pass any
# paths to git diff below and it would output the diff unfiltered.
exit 0
fi
git diff --unified=1 --cached HEAD -- $changed > $TMPDIFF
# only do the check when there are some changes to be commited
# otherwise flake8 would hang waiting for input
if [ -s $TMPDIFF ] ; then
cat $TMPDIFF | $FLAKE8 --diff
status=$?
fi
rm -f $TMPDIFF
exit $status

View file

@ -1,61 +0,0 @@
#!/bin/sh
# git update hook to check that pushed changes don't introduce new flake8
# errors
# --- Command line
refname="$1"
oldrev="$2"
newrev="$3"
# --- Safety check
if [ -z "$GIT_DIR" ]; then
echo "Don't run this script from the command line." >&2
echo " (if you want, you could supply GIT_DIR then run" >&2
echo " $0 <ref> <oldrev> <newrev>)" >&2
exit 1
fi
if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then
echo "usage: $0 <ref> <oldrev> <newrev>" >&2
exit 1
fi
TMPDIR=`mktemp -d`
TMPDIFF=`tempfile`
[ $refname != "refs/heads/master" -a $refname != "refs/heads/stable" ] && exit 0
# select only changed python files which are not migrations
changed=`git diff --name-only $oldrev $newrev | grep 'py$' | grep -v 'migrations/[0-9]'`
if [ -z $changed ] ; then
# Nothing to check. Note the exit is necessary -- we would not pass any
# paths to git diff below and it would output the diff unfiltered.
exit 0
fi
git diff --unified=1 $oldrev $newrev -- $changed >${TMPDIFF}
# there is no working tree in bare git repository, so we recreate it for flake8
git archive $newrev | tar -x -C ${TMPDIR}
cd ${TMPDIR}
# report only errors on lines in diff
# (if threre was flake8 installed on atrey, we could just call flake8)
/akce/MaM/WWW/mamweb-test/bin/flake8 --diff <${TMPDIFF}
status=$?
if [ $status != 0 ] ; then
echo
echo -n "Změny, které se snažíte pushnout, obsahují kód v pythonu "
echo -n "nevyhovující flake8 (viz výše). Opravte je a zkuste to znovu. "
echo -n "Nezapomeňte, že můžete editovat historii (git commit --amend, "
echo -n "git rebase -i). Pokud byste chybu příště raději odhalili už při "
echo "commitu, zkopírujte si pre-commit hook z _git_hooks do .git/hooks."
echo
fi
rm -rf ${TMPDIR}
rm -f ${TMPDIFF}
exit $status

View file

@ -1,5 +1,5 @@
from django.apps import AppConfig
class AesopConfig(AppConfig):
name = 'aesop'
verbose_name = 'Export do AESOPa'

View file

@ -1,5 +1,5 @@
from django.http import HttpResponse
from django.utils.encoding import force_text
from django.utils.encoding import force_str
class OvvpFile:
@ -20,7 +20,7 @@ class OvvpFile:
yield '\t'.join(self.columns) + '\n'
# rows
for r in self.rows:
yield '\t'.join([force_text(r[c]) for c in self.columns]) + '\n'
yield '\t'.join([force_str(r[c]) for c in self.columns]) + '\n'
def to_string(self):
return ''.join(self.to_lines())

View file

@ -5,16 +5,16 @@ urlpatterns = [
path(
'aesop-export/mam-rocnik-<int:prvni_rok>.csv',
views.ExportRocnikView.as_view(),
name='seminar_export_rocnik'
name='aesop_export_rocnik'
),
path(
'aesop-export/mam-sous-<str:datum_zacatku>.csv',
views.ExportSousView.as_view(),
name='seminar_export_sous'
name='aesop_export_sous'
),
path(
'aesop-export/index.csv',
views.ExportIndexView.as_view(),
name='seminar_export_index'
name='aesop_export_index'
),
]

View file

@ -1,6 +1,6 @@
import datetime
from django.utils.encoding import force_text
from django.utils.encoding import force_str
from aesop.ovvpfile import OvvpFile
@ -9,7 +9,7 @@ def default_ovvpfile(event, rocnik):
of = OvvpFile()
of.headers['version'] = '1'
of.headers['event'] = event
of.headers['year'] = force_text(rocnik.prvni_rok)
of.headers['year'] = force_str(rocnik.prvni_rok)
of.headers['date'] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
of.headers['id-scope'] = 'mam'
of.headers['id-generation'] = '1'

View file

@ -3,21 +3,22 @@ from django.shortcuts import get_object_or_404
from django.http import HttpResponse
from django.urls import reverse
from django.views import generic
from django.utils.encoding import force_text
from django.utils.encoding import force_str
from .utils import default_ovvpfile
from seminar.models import Rocnik, Soustredeni
from soustredeni.models import Soustredeni
from tvorba.models import Rocnik
from vysledkovky import utils
from seminar.utils import aktivniResitele
from tvorba.utils import aktivniResitele
class ExportIndexView(generic.View):
def get(self, request):
ls = []
for r in Rocnik.objects.filter(exportovat = True):
url = reverse('seminar_export_rocnik', kwargs={'prvni_rok': r.prvni_rok})
url = reverse('aesop_export_rocnik', kwargs={'prvni_rok': r.prvni_rok})
ls.append(url.split('/')[-1])
for s in Soustredeni.objects.filter(exportovat = True):
url = reverse('seminar_export_sous', kwargs={'datum_zacatku': s.datum_zacatku.isoformat()})
url = reverse('aesop_export_sous', kwargs={'datum_zacatku': s.datum_zacatku.isoformat()})
ls.append(url.split('/')[-1])
return HttpResponse('\n'.join(ls) + '\n', content_type='text/plain; charset=utf-8')

View file

@ -3,3 +3,4 @@ from django.apps import AppConfig
class ApiConfig(AppConfig):
name = 'api'
verbose_name = 'Různá webová API'

View file

@ -1,9 +1,9 @@
from django.test import TestCase
from django.test import TestCase, tag
from django.urls import reverse
import seminar.models as m
import seminar.views as v
from seminar.utils import sync_skoly
from personalni.models import Skola
from personalni.utils import sync_skoly
@tag('stejny-model-na-produkci')
class OrgSkolyAutocompleteTestCase(TestCase):
@classmethod
def setUpClass(cls):
@ -11,19 +11,20 @@ class OrgSkolyAutocompleteTestCase(TestCase):
sync_skoly('https://mam.mff.cuni.cz/')
# Správné školy podle toho, co orgové poslali: (prefix, ID školy)
# NOTE: Pozor, jedná se o databázové indexy. Pokud se to někdy rozbije, bude potřeba je přepsat nebo předělat na IZO
# TODO: Opravit zakomentované školy.
cls.spravna_data = [
('gymnázium kolín', 53),
('kolín', 53),
('gasoš', 96),
#('gasoš', 96),
('Rokycany', 96),
('gasoš Rokycany', 96),
('SPŠE Pardubice', 815),
#('gasoš Rokycany', 96),
#('SPŠE Pardubice', 815),
('Jaroše', 164),
("Gymnázium, Brno, tř. Kpt. Jaroše", 164),
#("Gymnázium, Brno, tř. Kpt. Jaroše", 164),
("Jírovcova", 157),
('České Budějovice', 157),
("Gymnázium, České Budějovice, Jírovcova 8", 157),
("první soukromé", 2),
#("první soukromé", 2),
("Gymnázium Elgartova", 147),
("Jihlava", 45),
('Milevsko', 223),
@ -47,7 +48,7 @@ class OrgSkolyAutocompleteTestCase(TestCase):
"""Testuje, že pro každého orga je jeho škola ve výsledném QuerySetu"""
for pfx, id in self.spravna_data:
with self.subTest(prefix=pfx, spravne_id=id):
spravna_skola = m.Skola.objects.get(id=id)
spravna_skola = Skola.objects.get(id=id)
# Zeptáme se view, co si myslí
resp = self.client.get(reverse('autocomplete_skola')+'?q='+pfx).json()
ids = [int(x['id']) for x in resp['results']]

View file

@ -1,6 +1,6 @@
from django.urls import path
from . import views
from seminar.utils import org_required
from personalni.utils import org_required
urlpatterns = [
# Export škol
@ -10,10 +10,12 @@ urlpatterns = [
# Autocomplete
path('api/autocomplete/skola/', views.SkolaAutocomplete.as_view(), name='autocomplete_skola'),
path('api/autocomplete/resitel/', org_required(views.ResitelAutocomplete.as_view()), name='autocomplete_resitel'),
path('api/autocomplete/resitel_public/', views.PublicResitelAutocomplete.as_view(), name='autocomplete_resitel_public'),
path('api/autocomplete/problem/odevzdatelny', views.OdevzdatelnyProblemAutocomplete.as_view(), name='autocomplete_problem_odevzdatelny'),
path('api/autocomplete/problem/vsechny', views.ProblemAutocomplete.as_view(), name='autocomplete_problem'),
# Ceka na autocomplete v3
# path('autocomplete/organizatori/',
# org_member_required(views.OrganizatorAutocomplete.as_view()),
# name='seminar_autocomplete_organizator')
# name='autocomplete_organizator')
]

View file

@ -1,15 +1,21 @@
"""
Views k :mod:`dal.autocomplete` pro vyhledávání objektů nějaké třídy v databázi.
"""
from dal import autocomplete
from django.shortcuts import get_object_or_404
from django.db.models import Q
import seminar.models as m
from personalni.models import Skola, Resitel
from tvorba.models import Problem
from various.models import Nastaveni
from .helpers import LoginRequiredAjaxMixin
# TODO filosofie - zkratky, jak v databázi, tak ve vyhledávání (SPŠE, GASOŠ, Kpt., soukr)
class SkolaAutocomplete(autocomplete.Select2QuerySetView):
""" View k :mod:`dal.autocomplete` pro vyhledávání škol hlavně při registraci. """
def get_queryset(self):
# Don't forget to filter out results depending on the visitor !
qs = m.Skola.objects.all()
# Don't forget to filter out results depending on the visitor !
qs = Skola.objects.all()
if self.q:
words = self.q.split(' ') #TODO re split podle bileho znaku
partq = Q()
@ -25,36 +31,70 @@ class SkolaAutocomplete(autocomplete.Select2QuerySetView):
return qs
class ResitelAutocomplete(LoginRequiredAjaxMixin,autocomplete.Select2QuerySetView):
""" View k :mod:`dal.autocomplete` pro vyhledávání řešitelů především v odevzdávátku. """
def get_queryset(self):
qs = m.Resitel.objects.all()
qs = Resitel.objects.all()
if self.q:
parts = self.q.split()
query = Q()
for part in parts:
query &= (
Q(osoba__jmeno__istartswith=self.q)|
Q(osoba__prijmeni__istartswith=self.q)|
Q(osoba__prezdivka__istartswith=self.q)
Q(osoba__jmeno__istartswith=part)|
Q(osoba__prijmeni__istartswith=part)|
Q(osoba__prezdivka__istartswith=part)
)
qs = qs.filter(query)
return qs
class OdevzdatelnyProblemAutocomplete(autocomplete.Select2QuerySetView):
class PublicResitelAutocomplete(LoginRequiredAjaxMixin, autocomplete.Select2QuerySetView):
"""
View k :mod:`dal.autocomplete` pro vyhledávání řešitelů podle přezdívky
především v odevzdávátku.
"""
def get_queryset(self):
nastaveni = get_object_or_404(m.Nastaveni)
letos = Nastaveni.get_solo().aktualni_rocnik
qs = Resitel.objects.filter(
rok_maturity__gte=letos.druhy_rok()
).filter(
prezdivka_resitele__isnull=False
).exclude(
prezdivka_resitele=""
).filter(
prezdivka_resitele__icontains=self.q
).all()
return qs
def get_result_label(self, result):
return result.prezdivka_resitele
class OdevzdatelnyProblemAutocomplete(autocomplete.Select2QuerySetView):
""" View k :mod:`dal.autocomplete` pro vyhledávání problémů především v odevzdávátku. """
def get_queryset(self):
qs = Problem.objects.filter(stav=Problem.STAV_ZADANY)
if self.q:
qs = qs.filter(
Q(nazev__icontains=self.q))
nadproblem_id = int(self.forwarded.get("nadproblem_id", -1))
if nadproblem_id != -1:
# 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 = list(filter(lambda problem: problem.hlavni_problem.id == nadproblem_id, qs))
return qs
class ProblemAutocomplete(autocomplete.Select2QuerySetView):
""" View k :mod:`dal.autocomplete` pro vyhledávání problémů především v odevzdávátku. """
def get_queryset(self):
# FIXME i starší úlohy
nastaveni = get_object_or_404(Nastaveni)
rocnik = nastaveni.aktualni_rocnik
# Od tohoto místa dál jsem zkoušel spoustu variací podle https://django-polymorphic.readthedocs.io/en/stable/advanced.html
temaQ = Q(Tema___rocnik = rocnik, stav=m.Problem.STAV_ZADANY)
ulohaQ = Q(Uloha___cislo_zadani__rocnik = rocnik, stav=m.Problem.STAV_ZADANY)
clanekQ = Q(Clanek___cislo__rocnik = rocnik, stav=m.Problem.STAV_ZADANY)
qs = m.Problem.objects.filter(temaQ | ulohaQ | clanekQ)
#print(temata, ulohy, clanky)
#ulohy.union(temata, all=True)
#print(ulohy)
#ulohy.union(clanky, all=True)
#print(ulohy)
#qs = ulohy
print(qs)
temaQ = Q(Tema___rocnik = rocnik)
ulohaQ = Q(Uloha___cislo_zadani__rocnik=rocnik)
clanekQ = Q(Clanek___cislo__rocnik=rocnik)
qs = Problem.objects.filter(temaQ | ulohaQ | clanekQ).order_by("-stav", "nazev")
if self.q:
qs = qs.filter(
Q(nazev__icontains=self.q))

View file

@ -1,7 +1,10 @@
import seminar.models as m
import personalni.models as m
from django.core import serializers as ser
from django.http import HttpResponse
def exportSkolView(request):
"""
view, který vrací json se seznamem škol, u kterých je uvedeno: 'id', 'izo', 'nazev', 'kratky_nazev', 'ulice', 'mesto', 'psc', 'stat', 'je_zs', 'je_ss'
"""
# Některé fieldy nechceme: Kontaktní osoby, AESOP ID, org poznámky.
fields = ('id', 'izo', 'nazev', 'kratky_nazev', 'ulice', 'mesto', 'psc', 'stat', 'je_zs', 'je_ss')
# TODO: Použít JSONL, aby protistrana mohla číst po řádkách a nesežralo to tunu paměti úplně hned

View file

@ -2,6 +2,9 @@ from django.http import JsonResponse
class LoginRequiredAjaxMixin(object):
"""
Objekt přidávající povinnost být přihlášený k zobrazení daného view.
"""
def dispatch(self, request, *args, **kwargs):
#if request.is_ajax() and not request.user.is_authenticated: # Pokud to otevřu jako stránku, tak se omezení neuplatní, takže to asi nechceme
if not request.user.is_authenticated:

File diff suppressed because one or more lines are too long

655
data/groups.json Normal file
View file

@ -0,0 +1,655 @@
[
{
"fields": {
"name": "org",
"permissions": [
[
"org",
"auth",
"user"
],
[
"add_flatpage",
"flatpages",
"flatpage"
],
[
"change_flatpage",
"flatpages",
"flatpage"
],
[
"delete_flatpage",
"flatpages",
"flatpage"
],
[
"view_flatpage",
"flatpages",
"flatpage"
],
[
"add_galerie",
"galerie",
"galerie"
],
[
"change_galerie",
"galerie",
"galerie"
],
[
"delete_galerie",
"galerie",
"galerie"
],
[
"view_galerie",
"galerie",
"galerie"
],
[
"add_obrazek",
"galerie",
"obrazek"
],
[
"change_obrazek",
"galerie",
"obrazek"
],
[
"delete_obrazek",
"galerie",
"obrazek"
],
[
"view_obrazek",
"galerie",
"obrazek"
],
[
"add_fotkaheader",
"header_fotky",
"fotkaheader"
],
[
"change_fotkaheader",
"header_fotky",
"fotkaheader"
],
[
"view_fotkaheader",
"header_fotky",
"fotkaheader"
],
[
"add_fotkaurlvazba",
"header_fotky",
"fotkaurlvazba"
],
[
"change_fotkaurlvazba",
"header_fotky",
"fotkaurlvazba"
],
[
"view_fotkaurlvazba",
"header_fotky",
"fotkaurlvazba"
],
[
"add_komentar",
"korektury",
"komentar"
],
[
"change_komentar",
"korektury",
"komentar"
],
[
"delete_komentar",
"korektury",
"komentar"
],
[
"view_komentar",
"korektury",
"komentar"
],
[
"add_korekturovanepdf",
"korektury",
"korekturovanepdf"
],
[
"change_korekturovanepdf",
"korektury",
"korekturovanepdf"
],
[
"delete_korekturovanepdf",
"korektury",
"korekturovanepdf"
],
[
"view_korekturovanepdf",
"korektury",
"korekturovanepdf"
],
[
"add_oprava",
"korektury",
"oprava"
],
[
"change_oprava",
"korektury",
"oprava"
],
[
"delete_oprava",
"korektury",
"oprava"
],
[
"view_oprava",
"korektury",
"oprava"
],
[
"add_novinky",
"novinky",
"novinky"
],
[
"change_novinky",
"novinky",
"novinky"
],
[
"delete_novinky",
"novinky",
"novinky"
],
[
"view_novinky",
"novinky",
"novinky"
],
[
"change_organizator",
"personalni",
"organizator"
],
[
"view_organizator",
"personalni",
"organizator"
],
[
"change_osoba",
"personalni",
"osoba"
],
[
"view_osoba",
"personalni",
"osoba"
],
[
"add_prijemce",
"personalni",
"prijemce"
],
[
"change_prijemce",
"personalni",
"prijemce"
],
[
"delete_prijemce",
"personalni",
"prijemce"
],
[
"view_prijemce",
"personalni",
"prijemce"
],
[
"change_resitel",
"personalni",
"resitel"
],
[
"view_resitel",
"personalni",
"resitel"
],
[
"add_skola",
"personalni",
"skola"
],
[
"change_skola",
"personalni",
"skola"
],
[
"delete_skola",
"personalni",
"skola"
],
[
"view_skola",
"personalni",
"skola"
],
[
"view_hlasovani",
"prednasky",
"hlasovani"
],
[
"view_hlasovanioznalostech",
"prednasky",
"hlasovanioznalostech"
],
[
"add_prednaska",
"prednasky",
"prednaska"
],
[
"change_prednaska",
"prednasky",
"prednaska"
],
[
"delete_prednaska",
"prednasky",
"prednaska"
],
[
"view_prednaska",
"prednasky",
"prednaska"
],
[
"add_seznam",
"prednasky",
"seznam"
],
[
"change_seznam",
"prednasky",
"seznam"
],
[
"delete_seznam",
"prednasky",
"seznam"
],
[
"view_seznam",
"prednasky",
"seznam"
],
[
"add_znalost",
"prednasky",
"znalost"
],
[
"change_znalost",
"prednasky",
"znalost"
],
[
"delete_znalost",
"prednasky",
"znalost"
],
[
"view_znalost",
"prednasky",
"znalost"
],
[
"add_konfera",
"soustredeni",
"konfera"
],
[
"change_konfera",
"soustredeni",
"konfera"
],
[
"delete_konfera",
"soustredeni",
"konfera"
],
[
"view_konfera",
"soustredeni",
"konfera"
],
[
"add_konfery_ucastnici",
"soustredeni",
"konfery_ucastnici"
],
[
"change_konfery_ucastnici",
"soustredeni",
"konfery_ucastnici"
],
[
"delete_konfery_ucastnici",
"soustredeni",
"konfery_ucastnici"
],
[
"view_konfery_ucastnici",
"soustredeni",
"konfery_ucastnici"
],
[
"add_soustredeni",
"soustredeni",
"soustredeni"
],
[
"change_soustredeni",
"soustredeni",
"soustredeni"
],
[
"delete_soustredeni",
"soustredeni",
"soustredeni"
],
[
"view_soustredeni",
"soustredeni",
"soustredeni"
],
[
"add_soustredeni_organizatori",
"soustredeni",
"soustredeni_organizatori"
],
[
"change_soustredeni_organizatori",
"soustredeni",
"soustredeni_organizatori"
],
[
"delete_soustredeni_organizatori",
"soustredeni",
"soustredeni_organizatori"
],
[
"view_soustredeni_organizatori",
"soustredeni",
"soustredeni_organizatori"
],
[
"add_soustredeni_ucastnici",
"soustredeni",
"soustredeni_ucastnici"
],
[
"change_soustredeni_ucastnici",
"soustredeni",
"soustredeni_ucastnici"
],
[
"delete_soustredeni_ucastnici",
"soustredeni",
"soustredeni_ucastnici"
],
[
"view_soustredeni_ucastnici",
"soustredeni",
"soustredeni_ucastnici"
],
[
"add_tag",
"taggit",
"tag"
],
[
"change_tag",
"taggit",
"tag"
],
[
"delete_tag",
"taggit",
"tag"
],
[
"view_tag",
"taggit",
"tag"
],
[
"add_taggeditem",
"taggit",
"taggeditem"
],
[
"change_taggeditem",
"taggit",
"taggeditem"
],
[
"delete_taggeditem",
"taggit",
"taggeditem"
],
[
"view_taggeditem",
"taggit",
"taggeditem"
],
[
"add_cislo",
"tvorba",
"cislo"
],
[
"change_cislo",
"tvorba",
"cislo"
],
[
"delete_cislo",
"tvorba",
"cislo"
],
[
"view_cislo",
"tvorba",
"cislo"
],
[
"add_clanek",
"tvorba",
"clanek"
],
[
"change_clanek",
"tvorba",
"clanek"
],
[
"delete_clanek",
"tvorba",
"clanek"
],
[
"view_clanek",
"tvorba",
"clanek"
],
[
"add_deadline",
"tvorba",
"deadline"
],
[
"change_deadline",
"tvorba",
"deadline"
],
[
"view_deadline",
"tvorba",
"deadline"
],
[
"add_pohadka",
"tvorba",
"pohadka"
],
[
"change_pohadka",
"tvorba",
"pohadka"
],
[
"delete_pohadka",
"tvorba",
"pohadka"
],
[
"view_pohadka",
"tvorba",
"pohadka"
],
[
"add_problem",
"tvorba",
"problem"
],
[
"change_problem",
"tvorba",
"problem"
],
[
"delete_problem",
"tvorba",
"problem"
],
[
"view_problem",
"tvorba",
"problem"
],
[
"add_rocnik",
"tvorba",
"rocnik"
],
[
"change_rocnik",
"tvorba",
"rocnik"
],
[
"delete_rocnik",
"tvorba",
"rocnik"
],
[
"view_rocnik",
"tvorba",
"rocnik"
],
[
"add_tema",
"tvorba",
"tema"
],
[
"change_tema",
"tvorba",
"tema"
],
[
"delete_tema",
"tvorba",
"tema"
],
[
"view_tema",
"tvorba",
"tema"
],
[
"add_uloha",
"tvorba",
"uloha"
],
[
"change_uloha",
"tvorba",
"uloha"
],
[
"delete_uloha",
"tvorba",
"uloha"
],
[
"view_uloha",
"tvorba",
"uloha"
],
[
"add_nastaveni",
"various",
"nastaveni"
],
[
"change_nastaveni",
"various",
"nastaveni"
],
[
"delete_nastaveni",
"various",
"nastaveni"
],
[
"view_nastaveni",
"various",
"nastaveni"
]
]
},
"model": "auth.group",
"pk": 1
},
{
"fields": {
"name": "resitel",
"permissions": [
[
"resitel",
"auth",
"user"
]
]
},
"model": "auth.group",
"pk": 2
}
]

View file

@ -73,7 +73,7 @@
"sort_order": 3,
"title": "Aktuální<br/> ročník",
"tree": 1,
"url": "seminar_aktualni_zadani",
"url": "tvorba_aktualni_zadani",
"urlaspattern": true
},
"model": "sitetree.treeitem",
@ -121,7 +121,7 @@
"sort_order": 5,
"title": "Archiv",
"tree": 1,
"url": "seminar_archiv_rocniky",
"url": "tvorba_archiv_rocniky",
"urlaspattern": true
},
"model": "sitetree.treeitem",
@ -289,7 +289,7 @@
"sort_order": 43,
"title": "Výsledková listina",
"tree": 1,
"url": "seminar_aktualni_vysledky",
"url": "tvorba_aktualni_vysledky",
"urlaspattern": true
},
"model": "sitetree.treeitem",
@ -361,7 +361,7 @@
"sort_order": 20,
"title": "Proběhlo",
"tree": 1,
"url": "seminar_seznam_soustredeni",
"url": "soustredeni_seznam",
"urlaspattern": true
},
"model": "sitetree.treeitem",
@ -409,7 +409,7 @@
"sort_order": 23,
"title": "Osobní údaje",
"tree": 1,
"url": "seminar_resitel_edit",
"url": "personalni_resitel_edit",
"urlaspattern": true
},
"model": "sitetree.treeitem",
@ -437,9 +437,9 @@
"insitetree": true,
"parent": 21,
"sort_order": 36,
"title": "Poslat řešení",
"title": "Nahrát řešení",
"tree": 1,
"url": "seminar_nahraj_reseni",
"url": "odevzdavatko_nahraj_reseni",
"urlaspattern": true
},
"model": "sitetree.treeitem",
@ -463,7 +463,7 @@
"sort_order": 35,
"title": "Témata",
"tree": 1,
"url": "seminar_archiv_temata",
"url": "tvorba_archiv_temata",
"urlaspattern": true
},
"model": "sitetree.treeitem",
@ -476,9 +476,9 @@
"access_perm_type": 1,
"access_permissions": [
[
"change_hodnoceni",
"seminar",
"hodnoceni"
"org",
"auth",
"user"
]
],
"access_restricted": true,
@ -589,7 +589,7 @@
"sort_order": 15,
"title": "Aktuální číslo",
"tree": 1,
"url": "seminar_aktualni_zadani",
"url": "tvorba_aktualni_zadani",
"urlaspattern": true
},
"model": "sitetree.treeitem",
@ -613,7 +613,7 @@
"sort_order": 24,
"title": "Čísla",
"tree": 1,
"url": "seminar_archiv_rocniky",
"url": "tvorba_archiv_rocniky",
"urlaspattern": true
},
"model": "sitetree.treeitem",
@ -719,9 +719,9 @@
"insitetree": true,
"parent": 21,
"sort_order": 36,
"title": "Nahrát řešení",
"title": "Vložit řešení",
"tree": 1,
"url": "seminar_vloz_reseni",
"url": "odevzdavatko_vloz_reseni",
"urlaspattern": true
},
"model": "sitetree.treeitem",
@ -804,7 +804,7 @@
"sort_order": 37,
"title": "Moje řešení",
"tree": 1,
"url": "seminar_resitel_odevzdana_reseni",
"url": "odevzdavatko_resitel_odevzdana_reseni",
"urlaspattern": true
},
"model": "sitetree.treeitem",
@ -828,7 +828,7 @@
"sort_order": 33,
"title": "Aktuální ročník",
"tree": 1,
"url": "seminar_aktualni_rocnik",
"url": "tvorba_aktualni_rocnik",
"urlaspattern": true
},
"model": "sitetree.treeitem",
@ -900,7 +900,7 @@
"sort_order": 46,
"title": "Ročník {{rocnik.rocnik}}",
"tree": 1,
"url": "seminar_rocnik rocnik.rocnik",
"url": "tvorba_rocnik rocnik.rocnik",
"urlaspattern": true
},
"model": "sitetree.treeitem",
@ -924,7 +924,7 @@
"sort_order": 47,
"title": "Číslo {{ cislo.rocnik.rocnik }}.{{ cislo.poradi }}",
"tree": 1,
"url": "seminar_cislo cislo.rocnik.rocnik cislo.poradi",
"url": "tvorba_cislo cislo.rocnik.rocnik cislo.poradi",
"urlaspattern": true
},
"model": "sitetree.treeitem",
@ -1007,7 +1007,18 @@
"access_guest": false,
"access_loggedin": false,
"access_perm_type": 1,
"access_permissions": [],
"access_permissions": [
[
"org",
"auth",
"user"
],
[
"resitel",
"auth",
"user"
]
],
"access_restricted": true,
"alias": null,
"description": "",
@ -1025,5 +1036,83 @@
},
"model": "sitetree.treeitem",
"pk": 51
},
{
"fields": {
"access_guest": false,
"access_loggedin": false,
"access_perm_type": 1,
"access_permissions": [
[
"resitel",
"auth",
"user"
]
],
"access_restricted": true,
"alias": null,
"description": "",
"hidden": false,
"hint": "",
"inbreadcrumbs": true,
"inmenu": true,
"insitetree": true,
"parent": 23,
"sort_order": 52,
"title": "Nahrát řešení k nadproblému {{nadproblem_id}}",
"tree": 1,
"url": "odevzdavatko_nahraj_reseni nadproblem_id",
"urlaspattern": true
},
"model": "sitetree.treeitem",
"pk": 52
},
{
"fields": {
"access_guest": false,
"access_loggedin": false,
"access_perm_type": 1,
"access_permissions": [],
"access_restricted": false,
"alias": null,
"description": "",
"hidden": false,
"hint": "",
"inbreadcrumbs": true,
"inmenu": true,
"insitetree": true,
"parent": 28,
"sort_order": 53,
"title": "Přidat PDF",
"tree": 1,
"url": "/admin/korektury/korekturovanepdf/add/",
"urlaspattern": false
},
"model": "sitetree.treeitem",
"pk": 53
},
{
"fields": {
"access_guest": false,
"access_loggedin": false,
"access_perm_type": 1,
"access_permissions": [],
"access_restricted": false,
"alias": null,
"description": "",
"hidden": false,
"hint": "",
"inbreadcrumbs": true,
"inmenu": true,
"insitetree": true,
"parent": 20,
"sort_order": 54,
"title": "Export do abstraktů sousu {{ soustredeni.id }}",
"tree": 1,
"url": "soustredeni_abstrakty soustredeni.id",
"urlaspattern": true
},
"model": "sitetree.treeitem",
"pk": 54
}
]
]

View file

@ -1,637 +0,0 @@
[
{
"codename": "org",
"ct_app_label": "auth",
"ct_model": "user"
},
{
"codename": "add_flatpage",
"ct_app_label": "flatpages",
"ct_model": "flatpage"
},
{
"codename": "change_flatpage",
"ct_app_label": "flatpages",
"ct_model": "flatpage"
},
{
"codename": "delete_flatpage",
"ct_app_label": "flatpages",
"ct_model": "flatpage"
},
{
"codename": "view_flatpage",
"ct_app_label": "flatpages",
"ct_model": "flatpage"
},
{
"codename": "add_galerie",
"ct_app_label": "galerie",
"ct_model": "galerie"
},
{
"codename": "change_galerie",
"ct_app_label": "galerie",
"ct_model": "galerie"
},
{
"codename": "delete_galerie",
"ct_app_label": "galerie",
"ct_model": "galerie"
},
{
"codename": "view_galerie",
"ct_app_label": "galerie",
"ct_model": "galerie"
},
{
"codename": "add_obrazek",
"ct_app_label": "galerie",
"ct_model": "obrazek"
},
{
"codename": "change_obrazek",
"ct_app_label": "galerie",
"ct_model": "obrazek"
},
{
"codename": "delete_obrazek",
"ct_app_label": "galerie",
"ct_model": "obrazek"
},
{
"codename": "view_obrazek",
"ct_app_label": "galerie",
"ct_model": "obrazek"
},
{
"codename": "add_komentar",
"ct_app_label": "korektury",
"ct_model": "komentar"
},
{
"codename": "change_komentar",
"ct_app_label": "korektury",
"ct_model": "komentar"
},
{
"codename": "delete_komentar",
"ct_app_label": "korektury",
"ct_model": "komentar"
},
{
"codename": "view_komentar",
"ct_app_label": "korektury",
"ct_model": "komentar"
},
{
"codename": "add_korekturovanepdf",
"ct_app_label": "korektury",
"ct_model": "korekturovanepdf"
},
{
"codename": "change_korekturovanepdf",
"ct_app_label": "korektury",
"ct_model": "korekturovanepdf"
},
{
"codename": "delete_korekturovanepdf",
"ct_app_label": "korektury",
"ct_model": "korekturovanepdf"
},
{
"codename": "view_korekturovanepdf",
"ct_app_label": "korektury",
"ct_model": "korekturovanepdf"
},
{
"codename": "add_oprava",
"ct_app_label": "korektury",
"ct_model": "oprava"
},
{
"codename": "change_oprava",
"ct_app_label": "korektury",
"ct_model": "oprava"
},
{
"codename": "delete_oprava",
"ct_app_label": "korektury",
"ct_model": "oprava"
},
{
"codename": "view_oprava",
"ct_app_label": "korektury",
"ct_model": "oprava"
},
{
"codename": "add_hlasovani",
"ct_app_label": "prednasky",
"ct_model": "hlasovani"
},
{
"codename": "change_hlasovani",
"ct_app_label": "prednasky",
"ct_model": "hlasovani"
},
{
"codename": "delete_hlasovani",
"ct_app_label": "prednasky",
"ct_model": "hlasovani"
},
{
"codename": "view_hlasovani",
"ct_app_label": "prednasky",
"ct_model": "hlasovani"
},
{
"codename": "add_prednaska",
"ct_app_label": "prednasky",
"ct_model": "prednaska"
},
{
"codename": "change_prednaska",
"ct_app_label": "prednasky",
"ct_model": "prednaska"
},
{
"codename": "delete_prednaska",
"ct_app_label": "prednasky",
"ct_model": "prednaska"
},
{
"codename": "view_prednaska",
"ct_app_label": "prednasky",
"ct_model": "prednaska"
},
{
"codename": "add_seznam",
"ct_app_label": "prednasky",
"ct_model": "seznam"
},
{
"codename": "change_seznam",
"ct_app_label": "prednasky",
"ct_model": "seznam"
},
{
"codename": "delete_seznam",
"ct_app_label": "prednasky",
"ct_model": "seznam"
},
{
"codename": "view_seznam",
"ct_app_label": "prednasky",
"ct_model": "seznam"
},
{
"codename": "add_cislo",
"ct_app_label": "seminar",
"ct_model": "cislo"
},
{
"codename": "change_cislo",
"ct_app_label": "seminar",
"ct_model": "cislo"
},
{
"codename": "delete_cislo",
"ct_app_label": "seminar",
"ct_model": "cislo"
},
{
"codename": "view_cislo",
"ct_app_label": "seminar",
"ct_model": "cislo"
},
{
"codename": "add_clanek",
"ct_app_label": "seminar",
"ct_model": "clanek"
},
{
"codename": "change_clanek",
"ct_app_label": "seminar",
"ct_model": "clanek"
},
{
"codename": "delete_clanek",
"ct_app_label": "seminar",
"ct_model": "clanek"
},
{
"codename": "view_clanek",
"ct_app_label": "seminar",
"ct_model": "clanek"
},
{
"codename": "add_konfera",
"ct_app_label": "seminar",
"ct_model": "konfera"
},
{
"codename": "change_konfera",
"ct_app_label": "seminar",
"ct_model": "konfera"
},
{
"codename": "delete_konfera",
"ct_app_label": "seminar",
"ct_model": "konfera"
},
{
"codename": "view_konfera",
"ct_app_label": "seminar",
"ct_model": "konfera"
},
{
"codename": "add_konfery_ucastnici",
"ct_app_label": "seminar",
"ct_model": "konfery_ucastnici"
},
{
"codename": "change_konfery_ucastnici",
"ct_app_label": "seminar",
"ct_model": "konfery_ucastnici"
},
{
"codename": "delete_konfery_ucastnici",
"ct_app_label": "seminar",
"ct_model": "konfery_ucastnici"
},
{
"codename": "view_konfery_ucastnici",
"ct_app_label": "seminar",
"ct_model": "konfery_ucastnici"
},
{
"codename": "add_nastaveni",
"ct_app_label": "seminar",
"ct_model": "nastaveni"
},
{
"codename": "change_nastaveni",
"ct_app_label": "seminar",
"ct_model": "nastaveni"
},
{
"codename": "delete_nastaveni",
"ct_app_label": "seminar",
"ct_model": "nastaveni"
},
{
"codename": "view_nastaveni",
"ct_app_label": "seminar",
"ct_model": "nastaveni"
},
{
"codename": "add_novinky",
"ct_app_label": "seminar",
"ct_model": "novinky"
},
{
"codename": "change_novinky",
"ct_app_label": "seminar",
"ct_model": "novinky"
},
{
"codename": "delete_novinky",
"ct_app_label": "seminar",
"ct_model": "novinky"
},
{
"codename": "view_novinky",
"ct_app_label": "seminar",
"ct_model": "novinky"
},
{
"codename": "add_organizator",
"ct_app_label": "seminar",
"ct_model": "organizator"
},
{
"codename": "change_organizator",
"ct_app_label": "seminar",
"ct_model": "organizator"
},
{
"codename": "delete_organizator",
"ct_app_label": "seminar",
"ct_model": "organizator"
},
{
"codename": "view_organizator",
"ct_app_label": "seminar",
"ct_model": "organizator"
},
{
"codename": "add_osoba",
"ct_app_label": "seminar",
"ct_model": "osoba"
},
{
"codename": "change_osoba",
"ct_app_label": "seminar",
"ct_model": "osoba"
},
{
"codename": "delete_osoba",
"ct_app_label": "seminar",
"ct_model": "osoba"
},
{
"codename": "view_osoba",
"ct_app_label": "seminar",
"ct_model": "osoba"
},
{
"codename": "add_pohadka",
"ct_app_label": "seminar",
"ct_model": "pohadka"
},
{
"codename": "change_pohadka",
"ct_app_label": "seminar",
"ct_model": "pohadka"
},
{
"codename": "delete_pohadka",
"ct_app_label": "seminar",
"ct_model": "pohadka"
},
{
"codename": "view_pohadka",
"ct_app_label": "seminar",
"ct_model": "pohadka"
},
{
"codename": "add_prijemce",
"ct_app_label": "seminar",
"ct_model": "prijemce"
},
{
"codename": "change_prijemce",
"ct_app_label": "seminar",
"ct_model": "prijemce"
},
{
"codename": "delete_prijemce",
"ct_app_label": "seminar",
"ct_model": "prijemce"
},
{
"codename": "view_prijemce",
"ct_app_label": "seminar",
"ct_model": "prijemce"
},
{
"codename": "add_problem",
"ct_app_label": "seminar",
"ct_model": "problem"
},
{
"codename": "change_problem",
"ct_app_label": "seminar",
"ct_model": "problem"
},
{
"codename": "delete_problem",
"ct_app_label": "seminar",
"ct_model": "problem"
},
{
"codename": "view_problem",
"ct_app_label": "seminar",
"ct_model": "problem"
},
{
"codename": "add_resitel",
"ct_app_label": "seminar",
"ct_model": "resitel"
},
{
"codename": "change_resitel",
"ct_app_label": "seminar",
"ct_model": "resitel"
},
{
"codename": "delete_resitel",
"ct_app_label": "seminar",
"ct_model": "resitel"
},
{
"codename": "view_resitel",
"ct_app_label": "seminar",
"ct_model": "resitel"
},
{
"codename": "add_rocnik",
"ct_app_label": "seminar",
"ct_model": "rocnik"
},
{
"codename": "change_rocnik",
"ct_app_label": "seminar",
"ct_model": "rocnik"
},
{
"codename": "delete_rocnik",
"ct_app_label": "seminar",
"ct_model": "rocnik"
},
{
"codename": "view_rocnik",
"ct_app_label": "seminar",
"ct_model": "rocnik"
},
{
"codename": "add_skola",
"ct_app_label": "seminar",
"ct_model": "skola"
},
{
"codename": "change_skola",
"ct_app_label": "seminar",
"ct_model": "skola"
},
{
"codename": "delete_skola",
"ct_app_label": "seminar",
"ct_model": "skola"
},
{
"codename": "view_skola",
"ct_app_label": "seminar",
"ct_model": "skola"
},
{
"codename": "add_soustredeni",
"ct_app_label": "seminar",
"ct_model": "soustredeni"
},
{
"codename": "change_soustredeni",
"ct_app_label": "seminar",
"ct_model": "soustredeni"
},
{
"codename": "delete_soustredeni",
"ct_app_label": "seminar",
"ct_model": "soustredeni"
},
{
"codename": "view_soustredeni",
"ct_app_label": "seminar",
"ct_model": "soustredeni"
},
{
"codename": "add_soustredeni_organizatori",
"ct_app_label": "seminar",
"ct_model": "soustredeni_organizatori"
},
{
"codename": "change_soustredeni_organizatori",
"ct_app_label": "seminar",
"ct_model": "soustredeni_organizatori"
},
{
"codename": "delete_soustredeni_organizatori",
"ct_app_label": "seminar",
"ct_model": "soustredeni_organizatori"
},
{
"codename": "view_soustredeni_organizatori",
"ct_app_label": "seminar",
"ct_model": "soustredeni_organizatori"
},
{
"codename": "add_soustredeni_ucastnici",
"ct_app_label": "seminar",
"ct_model": "soustredeni_ucastnici"
},
{
"codename": "change_soustredeni_ucastnici",
"ct_app_label": "seminar",
"ct_model": "soustredeni_ucastnici"
},
{
"codename": "delete_soustredeni_ucastnici",
"ct_app_label": "seminar",
"ct_model": "soustredeni_ucastnici"
},
{
"codename": "view_soustredeni_ucastnici",
"ct_app_label": "seminar",
"ct_model": "soustredeni_ucastnici"
},
{
"codename": "add_tema",
"ct_app_label": "seminar",
"ct_model": "tema"
},
{
"codename": "change_tema",
"ct_app_label": "seminar",
"ct_model": "tema"
},
{
"codename": "delete_tema",
"ct_app_label": "seminar",
"ct_model": "tema"
},
{
"codename": "view_tema",
"ct_app_label": "seminar",
"ct_model": "tema"
},
{
"codename": "add_uloha",
"ct_app_label": "seminar",
"ct_model": "uloha"
},
{
"codename": "change_uloha",
"ct_app_label": "seminar",
"ct_model": "uloha"
},
{
"codename": "delete_uloha",
"ct_app_label": "seminar",
"ct_model": "uloha"
},
{
"codename": "view_uloha",
"ct_app_label": "seminar",
"ct_model": "uloha"
},
{
"codename": "add_tag",
"ct_app_label": "taggit",
"ct_model": "tag"
},
{
"codename": "change_tag",
"ct_app_label": "taggit",
"ct_model": "tag"
},
{
"codename": "delete_tag",
"ct_app_label": "taggit",
"ct_model": "tag"
},
{
"codename": "view_tag",
"ct_app_label": "taggit",
"ct_model": "tag"
},
{
"codename": "add_taggeditem",
"ct_app_label": "taggit",
"ct_model": "taggeditem"
},
{
"codename": "change_taggeditem",
"ct_app_label": "taggit",
"ct_model": "taggeditem"
},
{
"codename": "delete_taggeditem",
"ct_app_label": "taggit",
"ct_model": "taggeditem"
},
{
"codename": "view_taggeditem",
"ct_app_label": "taggit",
"ct_model": "taggeditem"
},
{
"codename": "add_fotkaheader",
"ct_app_label": "header_fotky",
"ct_model": "fotkaheader"
},
{
"codename": "change_fotkaheader",
"ct_app_label": "header_fotky",
"ct_model": "fotkaheader"
},
{
"codename": "view_fotkaheader",
"ct_app_label": "header_fotky",
"ct_model": "fotkaheader"
},
{
"codename": "add_fotkaurlvazba",
"ct_app_label": "header_fotky",
"ct_model": "fotkaurlvazba"
},
{
"codename": "change_fotkaurlvazba",
"ct_app_label": "header_fotky",
"ct_model": "fotkaurlvazba"
},
{
"codename": "view_fotkaurlvazba",
"ct_app_label": "header_fotky",
"ct_model": "fotkaurlvazba"
}
]

View file

@ -13,7 +13,6 @@ make install_venv
make install
deploy_v2/pre_migration.py
make deploy_test
./manage.py load_org_permissions admin_org_prava.json
./manage.py loaddata data/*
systemctl --user start mamweb-test.service
./manage.py generate_thumbnails

21
docs/Makefile Normal file
View file

@ -0,0 +1,21 @@
# Minimal makefile for Sphinx documentation
#
# You can set these variables from the command line, and also
# from the environment for the first two.
SPHINXOPTS ?=
SPHINXBUILD ?= sphinx-build
SOURCEDIR = .
BUILDDIR = _build
# Put it first so that "make" without argument is like "make help".
help:
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
.PHONY: help Makefile
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
sphinx-apidoc --module-first -o modules .. ../*/migrations --templatedir _templates -f
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

8
docs/_templates/module.rst_t vendored Normal file
View file

@ -0,0 +1,8 @@
{%- if show_headings %}
{{- [basename, ".py"] | join('') | e | heading }}
{% endif -%}
.. automodule:: {{ qualname }}
{%- for option in automodule_options %}
:{{ option }}:
{%- endfor %}

57
docs/_templates/package.rst_t vendored Normal file
View file

@ -0,0 +1,57 @@
{%- macro automodule(modname, options) -%}
.. automodule:: {{ modname }}
{%- for option in options %}
:{{ option }}:
{%- endfor %}
{%- endmacro %}
{%- macro toctree(docnames) -%}
.. toctree::
:maxdepth: {{ maxdepth }}
{% for docname in docnames %}
{{ docname }}
{%- endfor %}
{%- endmacro %}
{%- if is_namespace %}
{{- pkgname | e | heading }}
{% else %}
{{- pkgname | e | heading }}
{% endif %}
{%- if is_namespace %}
.. py:module:: {{ pkgname }}
{% endif %}
{%- if modulefirst and not is_namespace %}
{{ automodule(pkgname, automodule_options) }}
{% endif %}
{%- if subpackages %}
{# Subpackages #}
{# ----------- #}
{{ toctree(subpackages) }}
{% endif %}
{%- if submodules %}
{# Submodules #}
{# ---------- #}
{% if separatemodules %}
{{ toctree(submodules) }}
{% else %}
{%- for submodule in submodules %}
{% if show_headings %}
{{- submodule | e | heading(2) }}
{% endif %}
{{ automodule(submodule, automodule_options) }}
{% endfor %}
{%- endif %}
{%- endif %}
{%- if not modulefirst and not is_namespace %}
Module contents
---------------
{{ automodule(pkgname, automodule_options) }}
{% endif %}

7
docs/_templates/toc.rst_t vendored Normal file
View file

@ -0,0 +1,7 @@
{{ "Seznam aplikací" | heading }}
.. toctree::
:maxdepth: {{ maxdepth }}
{% for docname in docnames %}
{{ docname }}
{%- endfor %}

5
docs/april.rst Normal file
View file

@ -0,0 +1,5 @@
Aprílové nápad
==============
* aprílový easter-egg pro řešitele - vytvořit nějakou vtipnou testovací databázi a nasadit ji místo produkce
* změnit veškerý text na oranžovo

102
docs/conf.py Normal file
View file

@ -0,0 +1,102 @@
# Configuration file for the Sphinx documentation builder.
#
# This file only contains a selection of the most common options. For a full
# list see the documentation:
# https://www.sphinx-doc.org/en/master/usage/configuration.html
# -- Path setup --------------------------------------------------------------
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#
import os
import sys
import django
sys.path.insert(0, os.path.abspath('..'))
os.environ['DJANGO_SETTINGS_MODULE'] = 'mamweb.settings'
django.setup()
# -- Project information -----------------------------------------------------
project = 'Web M&M'
copyright = '2022, Orgové'
author = 'Orgové'
# -- General configuration ---------------------------------------------------
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
'sphinx.ext.autodoc',
'sphinx.ext.viewcode',
'sphinx.ext.intersphinx',
'sphinx.ext.autosectionlabel',
'myst_parser',
'sphinxcontrib_django',
]
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = 'cs'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This pattern also affects html_static_path and html_extra_path.
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
# -- Options for HTML output -------------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
import sphinx_rtd_theme
html_theme = 'sphinx_rtd_theme'
html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# Provázání s jinými dokumentacemi
intersphinx_mapping = {'python': ('https://docs.python.org/3', None),
'django': ('http://docs.djangoproject.com/en/3.2/',
'http://docs.djangoproject.com/en/3.2/_objects/'),}
# Generování tříd/funkcí/atributů v pořádí jak jsou naprogramované
autodoc_member_order = "bysource"
# Nezobrazování zděděné (ze super tříd) dokumentace TODO nefunguje?
autodoc_inherit_docstrings = False
source_suffix = {
'.rst': 'restructuredtext',
'.md': 'markdown',
}
# Autodoc má ignorovat některé moduly
# Ref: https://www.sphinx-doc.org/en/master/usage/extensions/autodoc.html#event-autodoc-skip-member
# Kudos: https://stackoverflow.com/a/21449475/
def ignorovat(app, what, name, obj, skip, options):
blacklist = (
# typ (what), name
('module', 'settings.mamweb_prod'),
)
ignore = (what, name) in blacklist
return True if ignore else None
def setup(app):
app.connect('autodoc-skip-member', ignorovat)

27
docs/css.rst Normal file
View file

@ -0,0 +1,27 @@
CSS (a další styly na webu)
===========================
Inspirován `css-trick článkem <https://css-tricks.com/methods-organize-css/>`_ jsem se rozhodl rozdělit
CSSka do
- Konstant (``constants.css``), které jsou využívány na mnoha místech CSSek
- Nastylování html tagů (``base.css``)
- Layoutu (``layout.css``), což je to, co určuje celkové rozložení stránky
- Jednotlivých prvků (``modules.css``)
Dále jsem separoval CSSka pro **galerii** (potřebuje hodně specifických stylů). Stejně tak **korekturovátko** má styly separátně.
Dále web (asi) používá externí frameworky (v separátních složkách mají k sobě i JS a podobné věci):
- bootstrap: dělá nějaké basic stylování, *web je na něm hodně závislý* (například jsem zjistil, že bootstrap kdysi přidával ``font-size:14px``, bez čehož se web úplně rozpadnul) (také na něm běží mobilní meníčko, které navíc vyžaduje Popper, tedy bootstrap.bundle.js místo bootstrap.js)
Pak jsou tu ``mamweb-dev.css`` a ``printtable.css``, co jsem si ještě nerozmyslel, co s tím.
Pár myšlenek
------------
- Až na pár výjimek (galerii a korekturovátko) bych styly držel v jedné složce a málo souborech,
protože CSS šíleně dědí všechno možné
- Chce to dobře pojmenovávat třídy (speciálně aby bylo vidět, co ta třída dělá nebo kde se používá)
- Chce to hodně komentovat kód (speciálně tam, kde není splněn předchozí bod)

86
docs/dalsi_soubory.rst Normal file
View file

@ -0,0 +1,86 @@
Další soubory/složky v kořenovém adresáři
=========================================
media
-----
Složka, kam django nahrává soubory „jako by je nahrávalo do databáze“.
static
------
Složka, kam django nakopíruje všechno ze složek static a pak na to z templatů / kódu jde ukazovat pomocí ``static``.
data
----
Obsahuje data, která patří do databáze, ale jsou přímo součástí webu jako
takového. Aktuálně jsou to statické stránky, meníčko a rozložení obrázků
v pozadí meníčka.
Generuje se za pomocí::
./manage.py dumpdata flatpages > data/flat_new.json
./fix_json.py data/flat_new.json data/flat.json
nebo (v případě meníčka)::
./manage.py dumpdata sitetree --natural-foreign > data/sitetree_new.json
./fix_json.py data/sitetree_new.json data/sitetree.json
deploy_v2
---------
Věci, které byly potřeba při nasazování nového (2021) webu.
docs
----
Zde je dokumentace webu. Viz :ref:`Sphinx na našem webu`.
setup
-----
Tato složka obsahuje různé konfiguráky potřebné k rozběhnutí webu na serveru.
vue_frontend
------------
Obsahuje první pokusy o editory treenodů ve vue.
.gitignore
----------
Klasické `.gitignore`_
.. _.gitignore: https://git-scm.com/docs/gitignore
checklinks.sh
-------------
„Týrací“ skript na kontrolu, že nic, kam se lze proklikat na webu, nehází chybu.
constraints.txt
---------------
Obsahuje omezení na :ref:`requirements.txt`.
convert_spaces_to_tabs.sh
-------------------------
Skript na změnu odsazování.
db-local.sqlite3
----------------
Lokální databáze (na serveru není).
diff_db_backup.sh
-----------------
Nevím. Typoval bych skript na diff záloh (resp. dumpů) databáze.
Makefile
--------
Klasické `Makefile`_. Obsahuje například vytvoření virtual_env, instalaci a nasazování webu.
.. _Makefile: https://www.gnu.org/software/make/manual/make.html
manage.py
---------
Základní soubor djanga.
README.md
---------
Většina je spíš zbytek po bývalých webařích.
requirements.txt
----------------
Seznam balíčků, které jsou potřeba pro běh mamwebu. (Cílem je vytvoření virtualenvu se všemi těmito balíčky, např. pomocí daného příkazu v :ref:`Makefile`.)

55
docs/default_doc.rst Normal file
View file

@ -0,0 +1,55 @@
Defaultní dokumentace speciálních souborů
=========================================
Drobná nápověda k běžným django souborům. (Do nich jsem to vkládal copy-paste.)
admin.py
--------
Soubor sloužící k definici toho, co bude v adminu. Většinou pouhým zavoláním
funkce :func:`django.contrib.admin.site.register`, v případě, že chceme něco
upravit, tak jako třída rozšiřující :class:`django.contrib.admin.ModelAdmin`
s dekorátorem :func:`django.contrib.admin.register`.
Zde se definuje admin pro:
apps.py
-------
Soubor sloužící k pojmenování a jiným nastavením djangovské aplikace.
forms.py
--------
Formuláře (:class:`django.forms.Form`) umožňují jednoduchou tvorbu formulářů,
které lze pak jednoduše dát do frontendu i zpracovat na backendu.
Pro přidání políčka do formuláře je potřeba
- mít v modelu tu položku, kterou chci upravovat
- přidat do views (prihlaskaView, resitelEditView)
- přidat do forms
- includovat do html
models.py
---------
Tento soubor slouží k definici databázového modelu.
Třídy rozšiřují většinou :class:`django.db.models.Model` a jejich atributy jsou
většinou sloupce v databázi (tj. nastaví se na hodnotu něčeho z :mod:`django.db.models`).
Na výběr jsou:
- :class:`django.db.models.TextField`
- :class:`django.db.models.ForeignKey`
- :class:`django.db.models.DateField`
- :class:`django.db.models.DateTimeField`
- :class:`django.db.models.ImageField`
- :class:`django.db.models.CharField`
testutils.py
------------
Soubor sloužící ke generování testdat.
urls.py
-------
Soubor sloužící jako „router“, tj. zde se definují url adresy a na co ukazují:
views.py
--------

45
docs/index.rst Normal file
View file

@ -0,0 +1,45 @@
.. Web M&M documentation master file, created by
sphinx-quickstart on Mon Jan 31 21:56:04 2022.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Vítejte v dokumentaci M&Mího webu!
===================================
Tzv. produkce (tedy to, co vidí uživatelé) běží na `<mam.mff.cuni.cz>`_ (resp.
`<mam.matfyz.cz>`_), menu, obrázky v pozadí menu a spousta stránek (ty pouze se
statickým textem/obrázky) se mění přímo na produkci. Testovací verze běží na
`<https://mam-test.ks.matfyz.cz/>`_.
Abychom uměli web vyvíjet, musíme ho většinou nejdřív umět
:doc:`naklonovat a spustit lokálně <vyvoj>`.
:doc:`struktura mamwebu <struktura>` se řídí hlavně djangem, ale snažíme se
také o oddělení jednotlivých částí do :doc:`samostatných aplikací
<modules/modules>`.
Dokumentace (jak v ``docs/``, tak přímo v kódu) je psaná ve
:doc:`sphinxu <sphinx>`.
.. toctree::
:caption: M&M web
:maxdepth: 2
:titlesonly:
vyvoj
zavislosti
sphinx
skripty
zkratky
modules/modules
dalsi_soubory
zapisy/zapisy
Rejstříky a vyhledávání
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`

View file

@ -1,3 +1,4 @@
FIXME přepsat do rst, přidat i další věci a případně přesunout na wiki
Přidání obrázků do odměn:
admin -> flatpage odměn -> ikona přidat obrázek
záložka odeslat, vybrat obrázek, odeslat

108
docs/skripty.rst Normal file
View file

@ -0,0 +1,108 @@
Skripty pro práci s repozitářem
===================
Máme dvě hlavní sady skriptů/příkazů na ovládání webu a repozitáře. Skripty pro
práci s webem psané v Pythonu jsou uložené ve složkách
``<aplikace>/management/commands/``, případně vestavěné, a volají se pomocí
``./manage.py <příkaz>``. Oproti tomu skripty pro práci s repozitářem a pro
úpravy databáze a souborů „zvenčí“ se nejčastěji nacházejí ve složce ``make/``
a volají se pomocí cesty: ``make/<příkaz>``.
Občas existují i nějaké další skripty na různých jiných místech. Všechny by
měly být ideálně popsány asi tady.
Make skripty
----
Skripty v ``make/`` se označují jako „Make skripty“. Slouží často k velkým
úkonům s repozitářem, jako je nasazení celého webu, zprovoznění lokálního webu
a podobně.
.. note:: Označení pro tyto skripty je dáno tím, že byly původně volány pomocí
make (tj. z Makefile). Ve skutečnosti je lze stále volat i jako ``make
<skript>``, ale pak není možné předávat parametry a obecně je tato cesta
zastaralá a existuje jen pro zpětnou kompatibilitu se svalovou pamětí.
Tyto skripty jsou samonosné, dají se spustit rovnou a v případě problémů si
budou hlasitě stěžovat. Pro účely debugování různých věcí jsou ale (bohužel?)
hlasité i při normálním spuštění, konkrétně vypisují všechny příkazy, které se
spouštějí (\ ``set -x``). Tyto příkazy jsou vidět za jedním či více plusky (\ ``+``).
.. tip:: Pokud některý make skript selže, tak by na konci měl vypsat, že se něco nepovedlo.
Knihovna ``make/lib.sh``
^^^^^^
Pro pohodlí při psaní velká část z nich využívá knihovnu uloženou
v ``make/lib.sh``. Jsou zde definované užitečné proměnné, kontroly a společný
kód. Kromě toho při inicializaci otestuje, že je skript spuštěn z kořene
repozitáře (takže to pak není potřeba zkoumat v ostatních skriptech).
Proměnné
"""""
Popsány jsou jen užitečné proměnné, ve skutečnosti jich je definovaných víc,
ale jsou triviální a samopopisné.
``VENV_PATH``
Cesta virtuálního prostředí. Též lze přepsat.
``REPO``
Cesta ke gitovému repozitáři na serveru, rovnou použitelná v ``git clone``
``GIMLI_LOGIN``
Přihlašovací údaje ke Gimlimu
``PRODWEB`` a ``TESTWEB``
Cesty ke složkám s produkčním a testovacím webem
Funkce a další zkratky
""""""
``ensure_venv``
Zajistí, že se zbytek skriptu spustí ve virtuálním prostředí, a pokud neexistuje, tak jej založí.
``ensure_web_installed``
Vyzkouší, že je web (django) aspoň elementárně zprovozněno a pokud ne, tak vyzve uživatele, aby to spravil.
``gimli_only``
Otestuje, že je příkaz spuštěn na Gimlim, pokud tomu tak není, zeptá se, jestli si uživatel skutečně přeje zbytek skriptu vykonat
``only_in_directory <složka>``
Otestuje, že skript běží z konkrétní složky. Zejména použitelné s ``gimli_only`` a ``$TESTWEB``
``safe_checkout_branch <větev>``
Bezpečně přepne repozitář na jinou větev. Pokud by mělo dojít k přepsání
knihovny nebo volajícího make skriptu, vyzve uživatele, aby přepnul ručně.
``install_everything``
Společná část kódu pro nasazování produkce a testwebu.
Skripty pro lokální vývoj
^^^^^^^
``make/install_web`` (nebo ekvivalentně ``make/install``)
Vytvoří virtualenv a nainstaluje do něj závislosti webu podle ``requirements.txt``. Následně popíše, jak vyrobit zbytek lokálního webu.
``make/run``
Spustí lokální web (ekvivalentní s ``./manage.py runserver``)
``make/schema``
Vykreslí závislosti a atributy modelů
``make/sync_prod_flatpages``
Stáhne z produkce aktuální statické stránky a uloží je do složky ``data/``
``make/test``
Spustí testy (ekvivalentní s ``./manage.py test -v2``)
``make/init_local``
Zkratka za posloupnost ``make/install_web``, ``./manage.py testdata``, ``./manage.py loaddata data/*``, ``make/sync_prod_flatpages``
Práce s testwebem
^^^^^^^
``make/deploy``
Nasadí testweb. Volitelně bere jako parametr jméno větve, kterou má nasadit.
Rovnou nastaví přihlašování a vygeneruje příslušnou verzi dokumentace `sem <https://mam-test.ks.matfyz.cz/docs>`_.
``make/push_compiled_vue_to_test``
**Neotestováno** Nahraje Vue z lokálního počítače na testweb. (Gimli často má moc starou verzi Node.js, takže nejde zkompilovat tam)
``make/sync_test_db_aggressive``
Zkopíruje databázi z produkčního webu.
``make/sync_test_media``
Zkopíruje média (obrázky, nahrané soubory) z produkčního webu.
``make/sync_test``
Zkratka za ``make/sync_test_db_aggressive`` + ``make/sync_test_media``.
Nasazení produkce
^^^^
``make/deploy_prod``. Před samotným nasazením zálohuje databázi a zkontroluje, že se nasazuje větev ``master``.

41
docs/sphinx.rst Normal file
View file

@ -0,0 +1,41 @@
Sphinx na našem webu
====================
Dokumentace se zkompiluje příkazem ``make html`` ve složce ``docs``. (Musíte mít zapnutý virtualenv)
Složka ``modules`` je automaticiky generována a přegenerovávána. (**Nic v ní neupravovat!**)
Jinak všechny rst, co jsou ve složce ``docs`` a jejích podsložkách nezačínajících podtržítkem, budou v dokumentaci a to je přesně to, co editovat pro změnu dokumentace (kromě dokumentace přímo v Pythonu).
Sphinx se píše v rst: `Návod na syntaxi rst`_ `Cheat sheet`_
Pokud něco chcete protlačit do bočního meníčka, je potřeba to připsat do souboru ``docs/index.rst`` (Zatím není úplně konsensus nad tím, co tam má a nemá být, takže pokud si nejste jistí, cpěte tam *všechno* ☺)
To je snad vše, co je potřeba vědět k dokumentaci mamwebu. Následující sekce jsou o tom, co jsem provedl Sphinxu, aby to fungovalo:
.. _Návod na syntaxi rst: https://sphinx-tutorial.readthedocs.io/step-1/#sections
.. _Cheat sheet: https://sphinx-tutorial.readthedocs.io/cheatsheet/
make html
---------
``make html`` dělá následující: Vygenerují se rst soubory do modules z pythoní dokumentace pomocí::
sphinx-apidoc --module-first -o modules .. ../*/migrations --templatedir _templates -f
- ``--module-first`` říká, že dokumentace modulu má být dřív než to, co obsahuje,
- ``-o`` je výstupní složka příkazu,
- ``..`` prochází složku mamweb,
- ``../*/migrations`` ignoruje migrace
- ``--templatedir _templates`` určuje templaty, podle kterých se vyrábí rst z Pythoní dokumentace a struktury složek a souborů,
- ``-f`` donutí phinx znovu přegenerovat soubory, protože nepozná, že se nějaká dokumentace změnila)
Poté se spustí „samotný sphinx“ a vygenerují se soubory v ``_build/html``.
Templates
---------
Templaty jsou originální s pár změnami:
- Změnil jsem nadpisy
- Odstranil jsem některá slova v nadpisech (module, package, …)
- Odstranil jsem nadpis Subpackages
přišlo mi to takhle lepší. Ale stále nejsem moc spokojen, protože je to pořád nepřehledné.

32
docs/struktura.rst Normal file
View file

@ -0,0 +1,32 @@
Co kde najít (mamweb + django)
==============================
Nejdůležitější aplikace z pohledu djanga je ``mamweb``. Tu totiž django pouští
a obsahuje tedy nastavení (tam se přidávají ostatní aplikace, včetně těch
importovaných z djanga, a nastavují se tam různé věci jak v djangu, tak i naše,
například složky, kam se budou věci přidané uživateli ukládat). Dále obsahuje
základní urls, udávající, „na jaké adrese co je“. A nakonec obsahuje obecné
věci jako chybové hlášky a vzhled M&M stránek (menu, patička, atd.). Aktuálně
i veškeré csv.
Další jsou pak jednotlivé aplikace (pokud něco hledáte, tak zřejmě chcete najít
tu aplikaci, která tomu odpovídá, respektive se k ní dostat přes url).
**TLDR: Nevšímejte si složek data/ seminar/ a souborů přímo v kořenové složce.**
Kromě věcí potřebných ke gitu, :doc:`ke spuštění <vyvoj>` a fukci djanga,
dalších drobností, lokální databáze a již zmíněných aplikací jsou tu ``data``,
kde je takový ten obsah webu, co by se měl dát snadno měnit (tudíž musí být v
databázi), tj. statické stránky, menu a obrázky v pozadí menu. Ten je třeba
měnit hlavně na produkci a sekundárně tady (může to dělat i newebař a nechcete
přepsat jeho práci). Vše, co nejsou aplikace je popsáno :doc:`tady <dalsi_soubory>`.
Ještě je tu aplikace ``seminar/``, kde bylo původně skoro všechno, a tak nám
tam zbývá spoustu historických migrací (čehož se jen tak nezbavíme).
Základy djanga
--------------
mamweb je psaný téměř čistě v djangu. Což znamená, že to „co je vidět na stránkách“
jsou views.

184
docs/vyvoj.rst Normal file
View file

@ -0,0 +1,184 @@
Lokální vývoj mamwebu
=====================
Asi hlavní část vývoje většiny webu probíhá lokálně. Každý tak může pracovat na
vlastních úpravách nezávisle na ostatních.
Potřebné vybavení
-------
Tento soupis cílí na Linuxáky. Jistě je
spousta dalších možností, které zde nejsou postihnuty poraď se s webaři,
pokud si nejsi jistý. (Speciálně lze nějak vyvíjet na Windows, leč lze často
narazit na odlišné chování od Linuxu.)
Motivace cílení na Linux je to, že Gimli je Linuxový stroj, takže je vývojové
prostředí pak podobné produkci a zmenšuje to množství odlišného chování.
.. TODO: Na dokumentaci odlišného chování (Postgres vs. SQLite, Win vs. Linux, …)
by to asi chtělo výhledově separátní stránku, ale teď píšu tuhle :-)
Nutné
^^^^
- `Git <https://git-scm.com>`_
- `Python <https://python.org>`_
- Ideálně ve verzi 3.9 (to je to, co je aktuálně (2022) na Gimlim)
- Včetně pip-u (na Ubuntu balíček ``python3-pip``), venvu (``python3-venv``) a knihoven pro kompilaci
Cčkových rozšíření (``python3-dev``)
- Knihovna pro práci s PostgreSQL (``libpq-dev``, protože jsou potřeba všechny db backendy)
- Webový prohlížeč
- \*NIXový shell (typicky ``bash``)
.. TODO: Pokud tu něco chybí, tak to dopiš :-)
Kromě toho je potřeba mít účet na `Gitee <https://gitea.ks.matfyz.cz>`_, kde
bydlí gitový repozitář s kódem.
.. tip:: Potřebné balíčky v různých distribucích jsou sepsané v :ref:`tabulce
prerekvizit <Alternativní jména balíčků>`.
Doporučené
^^^^^^^^^^
- Python wheel (možná řeší problémy s potřebou ``-dev`` balíčků…)
- Editor / IDE podporující `Editorconfig <https://editorconfig.org/>`_
- Uživatelská zkušenost s `produkční verzí webu <https://mam.matfyz.cz>`_
- Účet v `Kanci <https://kanboard.ledoian.cz>`_
.. TODO: A nejspíš další věci, na které jsem si teď nevzpomněl.
Zprovoznění
-------
Nejprve je potřeba stáhnout si repozitář. To se provede příkazem ``git clone
https://gitea.ks.matfyz.cz/mam/mamweb.git``, případně ``git clone
git@gitea.ks.matfyz.cz:mam/mamweb.git``, pokud už máš nahraný SSH klíč na
Giteu. (Obě adresy se dají zkopírovat ze `stránky repozitáře
<https://gitea.ks.matfyz.cz/mam/mamweb>`_.) To vyrobí složku ``mamweb``, přepni
se do ní (``cd mamweb``)
O zprovoznění webu se stará skript ``make/install_web``, stačí ho spustit. Ten
vytvoří virtualenv (neexistuje-li) a nainstaluje do něj závislosti webu (podle
souboru ``requirements.txt``).
.. FIXME: Novowebaři zmínka o requirements.txt tady moc nepomůže, to má být na
stránce o celkové stavbě repozitáře a stacku…
Následně je potřeba nahrát další data do databáze, což uděláš pomocí příkazů
``./manage.py testdata`` a ``./manage.py loaddata data/*``. Skript
``make/install_web`` to kdyžtak na konci připomene.
.. caution:: Zatímco skripty v ``make/`` to nepotřebují, pro použití skriptu
``./manage.py`` (a dalších) se potřebuješ přepnout do virtuálního prostředí.
To uděláš velmi pravděpodobně spuštěním ``source env/bin/activate``, před
začátkem *promptu* by se mělo objevit ``(env)``. Pro opuštění spusť
``deactivate``.
Samotný web se spustí třeba pomocí ``make/run``, nebo ekvivalentně
``./manage.py runserver`` a pak je vidět na `<http://127.0.0.1:8000>`_.
Časté problémy
^^^^^^
- ``make/install_web`` vypíše ``Error: pg_config executable not found.``:
Chybí ``libpq-dev``
- Chybová hláška obsahuje ``#include <Python.h>``: chybí ``python3-dev``
- Na webu není vidět meníčko: spusť ``./manage.py loaddata data/*``
- ``locale.Error: unsupported locale setting``: Chybí podpora pro příslušný
jazyk ve tvém systému. Odkomentuj příslušnou lokalizaci v ``/etc/locale.gen``
a spusť ``locale-gen`` jako root, tím se to spraví.
S dalšími problémy se zkus obrátit na další webaře, třeba někdo bude vědět :-)
Příkazy pro ovládání webu
-------
Příkazy se dělí do několika skupin. Některé souvisí přímo s webem, Djangem,
databází a podobně, ty typicky používají ``./manage.py``. Skripty pro
obhospodařování repozitáře a webu „zvenku“ typicky bydlí ve složce ``make/``.
Ostatní skripty jsou na náhodných místech :-)
Tady jsou rozebrány jen příkazy relevantní pro lokální web a univerzálně
užitečné, ostatní najdeš v :ref:`Skripty pro práci s repozitářem`.
Make skripty
^^^^^^^
- ``make/install_web`` nainstaluje závislosti webu
- ``make/run`` spustí web (ekvivalentní s ``./manage.py runserver``)
- ``make/schema`` nakreslí schéma vazeb modelů (může se hodit pro referenci a představu)
- ``make/test`` spustí testy (ale moc jich zatím není; ekvivalentní s ``./manage.py test``)
- ``make/sync_prod_flatpages`` stáhne statické stránky z produkčního webu a
uloží je do souboru v gitu, což umožňuje jejich verzování
Manage.py skripty
^^^^^
.. note:: Je potřeba je spouštět ve virtuálním prostředí, viz výše.
Všechny skripty kdyžtak mají ``--help``, dá se tak zjistit, co všechno umějí.
- ``./manage.py testdata`` vygeneruje spíše chudá testovací data, aby bylo na
čem testovat web.
- ``./manage.py loaddata <soubor/y>`` nahraje data ze souborů do databáze
- ``./manage.py dumpdata <model>`` naopak z databáze vyrobí textovou reprezentaci
- ``./manage.py shell`` spustí interaktivní pythoní shell, ze kterého lze
interagovat s webem / Djangem.
- ``./manage.py dbshell`` spustí databázový shell (typicky používá SQL)
- ``./manage.py makemigrations`` vyrobí popis migrací, ``./manage.py migrate``
je spustí, ``showmigrations`` ukáže, které migrace jsou aplikované a které
ne.
- ``./manage.py runserver_plus`` spouští o něco lepší vývojový server (ale
nikdy jsem asi ty lepší featury nepoužil)
Může se hodit vědět, že spuštění ``./manage.py`` bez parametrů vypíše seznam
všech příkazů, které lze spustit.
Dokumentace djangových příkazů je v `dokumentaci Djanga
<https://docs.djangoproject.com/en/3.2/ref/django-admin/#available-commands>`_
Ostatní užitečné příkazy
^^^^^
- ``git status`` je univerzální nápověda na aktuální stav repozitáře a co s tím
lze dělat.
- ``git clean -fxd`` smaže všechny soubory, které nejsou uložené v gitu (včetně
ignorovaných). **Nebezpečný příkaz**, zamysli se, než ho spustíš
Specifika lokálního webu
-------
Lokální uživatelé
^^^^^^^
Přihlašovací údaje jsou psány jako ``login:heslo``
- Superuživatel: ``admin:admin``
- Orgovské účty: ``o:o``, ``o1:o````o3:o``
- Řešitelské účty: ``r:r``, ``r1:r````r3:r``
Všechny tyto účty jsou (?) svázané s nějakými fiktivními osobami, není ale zřejmé se
kterými, budeš to muset vyzkoušet a pak tady zdokumentovat :-)
E-maily
^^^^^
Posílání e-mailů se lokálně dá zkoušet, e-mail se vypíše do terminálu, kde je
web spuštěn (e.g. pomocí ``make/run``).
Pruhy
^^^^
To, že má lokální web po stranách zelené pruhy je normální a správně, slouží to
k vizuálnímu odlišení lokálního webu.
.. TODO: Mít někde popis všech tří instancí a tady na něj pak odkázat.
.. - Tahák k používání gitových větví: do workflow, ne sem…
.. - Užitečné odkazy kam se kouknout
(dohledávání views podle URL, settings_*, )
.. - Zpříjemnění práce (ssh-klíče, tea, --help, …)

View file

@ -116,7 +116,7 @@ Aktuálně: Jakýsi coding style zhruba existuje, není popsaný, šíří se li
- Nesmí být striktně vynucovaný
- Musel by být hodně nastavitelný
- Nechceme mít kód plný `#NOQA: WTF42`
- Nejspíš vždycky bude mít false positives (`seminar.utils.roman_numerals`) i false negatives (`seminar.models.tvorba.Cislo.posli_cislo_mailem`)
- Nejspíš vždycky bude mít false positives (`tvorba.utils.roman_numerals`) i false negatives (`tvorba.models.Cislo.posli_cislo_mailem`)
- Možná dobrý sluha, ale určitě špatný pán (also: špatná zkušenost ☺)
- __Důsledek:__ Hrozí, že těch falešných varování bude moc, čímž to ztratí smysl úplně
- Potenciálně by šlo aplikovat jen lokálně na změny?

8
docs/zapisy/zapisy.rst Normal file
View file

@ -0,0 +1,8 @@
Zápisy
======
.. toctree::
:caption: Importy zápisů z Markdownu
:maxdepth: 1
2021-12-06-testovani_dokumentace_codereview

97
docs/zavislosti.rst Normal file
View file

@ -0,0 +1,97 @@
Závislosti webu
@@@@@@@@@@@@@@@
Web ke svému běhu potřebuje různé další programy. Tahle stránka se snaží je pokrýt.
Stránka je koncipována jako odrážkový seznam balíčků pro Ubuntu s případnými
komentáři, na konci stránky jsou uvedena :ref:`jména balíčků <Alternativní jména
balíčků>` v různých dalších distribucích. (Seznam mj. cílí na lokální
rozchození, proto popisuji Ubuntu a ne Debian. I tak se ale snažíme popsat web
v úplnosti.)
.. I use Arch, btw.
Základ webu
===========
- ``python3`` Ideálně Python 3.9, jenž je na Gimlim
- ``python3-pip`` pro instalaci dalších Pythoních balíčků podle ``requirements.txt``
- ``python3-venv``
- ``gcc`` kompilace Pythoních knihoven ze zdrojových distribucí (sdist), možná (neotestováno) jde jako alternativu použít ``python3-wheel`` a stahovat bdists
- ``python3-dev`` taktéž
- ``libpq-dev`` do třetice…
- ``ghostscript`` TODO konverze PDF v korekturovátku
- ``pdflatex`` FIXME! generování obálek a stvrzenek
- ``git`` používán :ref:`Make skripty`
- ``locales`` pro české formáty
Nasazení na produkci / testweb
==============================
(nejsou nutně potřeba k provozu lokální instance)
- ``rsync``
- ``pg_utils`` FIXME
- ``htpasswd`` FIXME aby testweb nepoužívali náhodní kolemjdoucí
- ``postgresql-server`` TODO
- ``acl`` pro nastavování práv přes ``setfacl``
Pro testweb je potřeba i všechno pro :ref:`dokumentaci <Dokumentace>`, vizte níž.
Předpokládá se nasazení v uWSGI pod Nginxem a služba běžící pod systemd, nicméně to už je spíš záležitost infrastruktury a ne specifikum mamwebu.
Dokumentace
===========
- ``make`` pro zbuildění
- Pythoní balíčky podle příslušné části ``requirements.txt``
Vývojové nástroje
=================
(Nejsou nezbytně nutné, ale předpokládáme jejich užitečnost. Mohou se hodit i na produkci.)
- ``psql`` TODO pro manuální dotazy do PostgreSQL
- ``sqlite3`` TODO totéž pro SQLite3
- ``ssh``
- ``graphviz`` pro vygenerování schématu
- ``rsync``
- ``ipython3`` hezčí interaktivní shell (stačí z ``requirements.txt``)
Potenciální usnadnění života
============================
(Úplně zbytečné, ale sdílíme pozitivní zkušenosti :-))
- ``tea`` CLI klient pro Giteu, aby člověk nepotřeboval otevírat web pro založení PR
Alternativní jména balíčků
==========================
Různé distribuce balí SW různě, takže to, co je v jedné distribuci jeden
balíček může být v jiné rozděleno do víc. Pro usnadnění nasazení je tady
přehled známých alternativních jmen.
TODO: tabulka není úplná. Pokud na něco narazíte, tak ji prosím doplňte.
.. admonition:: Jak se pozná, že web funguje, pro účely tabulky?
Na čistém repozitáři (``git clean -fxd``) a čistém systému spouštíme
``make/init_local``. Když to spadne, tak do tabulky zapíšeme, co jsme
přiinstalovali. Protože nefunguje synchronizace flatpages (nemáme SSH klíč),
``make/init_local`` sestřelíme při pokusu o synchronizaci a vyzkoušíme, že
``make/test`` spustí testy.
.. Grafické tabulky (grid-tables, simple-tables) jsou strašný porod vyrábět, dlabu na to a cpu to do CSV…
.. csv-table:: Prerekvizity v jednotlivých distribucích
:header: Distribuce / OS, Repozitář s Py3.9, venv, py knihovny, PostgreSQL knihovna, poznámky
Ubuntu 22.10, ??, ``python3-venv``, ``python3-dev``, ``libpq-dev``, "Je potřeba zapnout zdroj ``universe`` a nainstalovat kompilátor C (``gcc``)?"
Linux Mint 21, ??, ``python3-venv``, ``python3-dev``, ``libpq-dev``, ""
Archlinux 2022.11.01, AUR, vestavěný, vestavěné, ``postgresql-libs``, "Je potřeba céčkový kompilátor (``gcc``)"
openSUSE Leap 15.4, oficiální (``python39``), předinstalovaný?, ``python39-devel``, ??FIXME!!, "Výchozí verze pythonu je 3.6 a ta je moc stará, potřeba instalovat ``gcc``. Nevím jak sehnat pg_config."
Debian 11, "oficiální, výchozí", ??, ??, ??, "Určitě to tam rozběhat jde, protože Gimli. Nejspíš bude relativně podobné Ubuntu."

86
docs/zkratky.rst Normal file
View file

@ -0,0 +1,86 @@
Zkratky aplikací ve zdrojácích
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Ve zdrojácích (zejména různé ``models.py``, ``views.py`` ap.) používáme spoustu
modelů. Někdy je praktičtější / někdo preferuje importovat celou aplikaci jako
jedno jméno a používat modely bez explicitních importů, tj::
# „hromadné“ importy:
import personalni.models as p
...
p.Organizator.objects.all()
# „explicitní“ importy:
from personalni.models import Organizator
...
Organizator.objects.all()
Na webschůzce 2024-11-05 jsme na toto téma otevřeli diskusi, tady je její závěr.
.. admonition:: Historické okénko
:class: note
Kdysi jsme měli (prakticky) všechny modely v jedné aplikaci, ``seminar``. Na
různých místech se pak ``seminar.models`` importovalo typicky jako ``s``
nebo jako ``m``.
Přirozeně, toto už nejde tak snadno, protože už neexistuje jedno místo, ze
kterého chceme tahat modely v kódu.
Konvence
========
Shodli jsme se, že nám rozhodně nevadí explicitní importy a z pohledu
čitelnosti je preferujeme. Nicméně při psaní kódu to některým webařům přijde
nepohodlné, takže očekáváme, že bude existovat spousta kódu, která bude chtít
importovat hromadně. Usnesli jsme se proto na následujících kanonických
zkratkách, aby se aplikace alespoň zkracovaly konzistentně.
V závorkách je uvedené případné jméno, ale nepředpokládáme, že někdo bude danou
aplikaci chtít importovat hromadně. Některé aplikace zkratku nemají, ty se
importují vždy pod plným jménem nebo explicitně.
.. list-table::
:header-rows: 1
* - Model
- Zkratka
* - ``aesop``
- ---
* - ``api``
- --- (``api``)
* - ``galerie``
- ``g``
* - ``header_fotky``
- --- (``hdr``)
* - ``korektury``
- ``kor``
* - ``novinky``
- ``nov``
* - ``odevzdavatko``
- ``odev``
* - ``personální``
- ``pers``/``p``
* - ``sifrovacka``
- (``sifr``)
* - ``soustredeni``
- ``sou``
* - ``treenode``
- ``tn``
* - ``tvorba``
- ``tv``
* - ``various``
- ``v``/``var``
* - ``vyroci``
- ---
* - ``vysledkovky``
- ``vysl``
.. admonition:: O všech modelech pod jedním jménem
:class: warning
Historické okénko výš zatajuje jeden detail: Při práci v shellu se hodí mít
modely k dispozici a nemuset přemýšlet nad dělením do aplikací, takže ve
skutečnosti existuje ``mamweb.vsechno``, jenž všechny modely obsahuje.
Z čitelnostních důvodů je ale *zakázáno* tento modul používat v kódu.

View file

@ -1,25 +0,0 @@
========
| TODO |
|======|
Aktualni
* co s titulni fotkou
* do CSS
* nahledy
* nastylovat tabulku s nahledy
* komentare uz na nahledy?
* detail
* nahledy pred a po
* opravit prechodove sipky
* vyrobit prechodove sipky ve M&M-stylu
Dlouhodobe
* sipky na prechazeni mezi fotkami
* hromadne PRIDANI fotek do jiz existujici galerie
Fylozoficke
* zvolit velikosti velke a male fotky
* je potreba i jine razeni nez automaticky podle casu nebo staci podgalerie?
* napr. dve hry na dvou ruznych mistech ve stejny cas
* fotky od ucastniku ze hry (skupinky se pohybuji ve stejny cas, ale maji sled fotek) -- nestaci to pripadne vrazit do podgalerii?

View file

@ -1,5 +1,3 @@
#coding: utf-8
from galerie.models import Obrazek, Galerie
from django.contrib import admin
from django.http import HttpResponseRedirect

View file

@ -1,47 +0,0 @@
# -*- coding: utf-8 -*-
from autocomplete_light import shortcuts as autocomplete_light
from .models import Obrazek, Galerie
from .views import cesta_od_korene
class ObrazekAutocomplete(autocomplete_light.AutocompleteModelBase):
model = Obrazek
search_fields = ['nazev', 'popis']
split_words = True
limit_choices = 15
attrs = {
# This will set the input placeholder attribute:
'placeholder': u'Obrázek',
# This will set the yourlabs.Autocomplete.minimumCharacters
# options, the naming conversion is handled by jQuery
'data-autocomplete-minimum-characters': 1,
}
choice_html_format = '''
<span class="block" data-value="{}">
<span class="block">
{}
<span class="block">{}</span>
</span>
</span>
'''
def choice_label(self, obrazek):
cesta = "/".join(g.nazev for g in cesta_od_korene(obrazek.galerie))
popis = "{}<br>".format(obrazek.popis) if obrazek.popis else ""
return '{}<br>{}{}'.format(obrazek.nazev, popis, cesta)
def choice_html(self, obrazek):
"""Vrátí kus html i s obrázkem, které se pak ukazuje v nabídce"""
return self.choice_html_format.format(self.choice_value(obrazek),
obrazek.obrazek_maly_tag(), self.choice_label(obrazek))
widget_attrs={
'data-widget-maximum-values': 15,
'class': 'modern-style',
}
autocomplete_light.register(ObrazekAutocomplete)

View file

@ -1,7 +1,4 @@
#coding: utf-8
from django import forms
from seminar.models import Soustredeni
class KomentarForm(forms.Form):
komentar = forms.CharField(label = "Komentář:", max_length = 300, required=False)

View file

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations

View file

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations

View file

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations

View file

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations

View file

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations

View file

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations

View file

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations

View file

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-04-30 21:40
from __future__ import unicode_literals

View file

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.21 on 2019-06-10 21:58
from __future__ import unicode_literals

View file

@ -0,0 +1,13 @@
# Generated by Django 4.2.11 on 2024-04-30 21:53
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('galerie', '0010_auto_20200819_0947'),
]
operations = [
]

View file

@ -0,0 +1,20 @@
# Generated by Django 4.2.11 on 2024-05-01 13:07
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('soustredeni', '0001_split_from_seminar'),
('galerie', '0011_pre_split_soustredeni'),
]
operations = [
migrations.AlterField(
model_name='galerie',
name='soustredeni',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='soustredeni.soustredeni'),
),
]

View file

@ -0,0 +1,14 @@
# Generated by Django 4.2.11 on 2024-05-01 13:35
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('galerie', '0012_soustredeni_relink'),
('soustredeni', '0003_post_split_soustredeni'),
]
operations = [
]

View file

@ -1,14 +1,11 @@
# coding: utf-8
from django.db import models
#from django.db.models import Q
from django.utils.encoding import force_text
from imagekit.models import ImageSpecField
from imagekit.processors import ResizeToFit, Transpose
import os
from seminar.models import Soustredeni
from soustredeni.models import Soustredeni
VZDY=0
ORG=1

View file

@ -0,0 +1,186 @@
@charset "utf-8"; /* vynuť utf-8 */
/* Galerie */
/* velká fotka */
/* zmenšování spolu s oknem prohlížeče */
.galerie .obrazek, .titulni_obrazek {
max-width: 100%;
height: auto;
width: auto\9; /* ie8 */
}
.predchozi_obrazek{
position: absolute;
z-index: 1;
width: 33%;
height: 100%;
left: 0;
top: 0;
}
.predchozi_obrazek:hover{
background-image: url("/static/galerie/prvky/predchozi.svg");
filter: drop-shadow(0px 5px 5px rgba(0, 0, 0, 0.4));
background-position: left center;
background-repeat: no-repeat;
}
.dalsi_obrazek{
position: absolute;
z-index: 1;
width: 33%;
height: 100%;
left: 67%;
top: 0;
}
.dalsi_obrazek:hover{
background-image: url("/static/galerie/prvky/dalsi.svg");
filter: drop-shadow(0px 5px 5px rgba(0, 0, 0, 0.4));
background-position: right center;
background-repeat: no-repeat;
}
.galerie {
position: relative;
text-align: center;
margin: 20px auto 0 auto;
}
.galerie h1 {
text-align: center;
}
.galerie_hlavicka {
margin: 30px auto 30px auto;
}
.popis {
margin: 10px 10px 30px 0px;
text-align: center;
}
#nahoru {
text-align: center;
}
/* titulní obrázek hlavní galerie soustředění */
.galerie_nahledy{
/*margin: 1em 0;*/
margin: auto;
padding: 10px;
text-align: center;
overflow: auto;
}
.galerie_nahledy img {
margin: 10px;
}
.galerie_nahledy div.navigace {
display: inline-block;
}
.galerie_nahled, .podgalerie_nahled { /* frame */
display: block;
position: relative;
float: left;
width: 200px;
height: 200px;
text-align: center;
border: solid;
border-width: 1px;
border-radius: 4px;
border-color: var(--svetla-oranzova);
background-color: var(--barva-pozadi);
white-space: nowrap;
margin: 10px;
font-weight: bold;
}
.galerie_nahled:hover, .podgalerie_nahled:hover {
background-color: var(--svetla-oranzova);
filter: drop-shadow(0px 5px 5px rgba(0, 0, 0, 0.4));
color: var(--tmava-oranzova);
}
.vystredeno{ /* helper */
display: inline-block;
height: 100%;
vertical-align: middle;
}
.galerie_nahled img {
vertical-align: middle;
max-height: 180px;
max-width: 180px;
}
.galerie_nahled div {
position: absolute;
bottom: 0px;
width: 100%;
text-align: center;
}
.podgalerie_nahled img {
margin-top: 20px;
margin-bottom: 15px;
max-height: 125px;
max-width: 167px;
}
.podgalerie_nahled .nazev_galerie {
position: absolute;
width: 100%;
top: 160px;
}
/* Odkazy na předchozí a následující podgalerii */
.galerie_predchozi_nasledujici {
overflow: auto;
margin: 10px auto 10px auto;
}
.galerie_predchozi_nasledujici .predchozi {
float: left;
}
.galerie_predchozi_nasledujici .nasledujici {
float: right;
}
/* posune kotvu obrázku v galerii o oranžový pruh dolu, aby se pod ním obrázek neschovával */
/* https://stackoverflow.com/questions/10732690/offsetting-an-html-anchor-to-adjust-for-fixed-header */
.kotva_obrazku {
position: absolute;
width: 0;
height: 55px; /* viz #title */
margin-top: -55px; /* viz #title */
}
@media(max-width: 860px) {
.kotva_obrazku {
height: 3em; /* #FIXME nemám páru, jak zjistit výšku toho elementu */
margin-top: -3em; /* #FIXME */
}
}
/* plus a minus tlacitka */
.mam-org-only-galerie {
background: var(--orgovska-svetla-fialova);
padding: 10px;
margin: 10px 10px 10px -20px;
border: #333 2px dashed;
float: left;
}
.mam-org-only-galerie a{
padding: 3px 5px;
margin: 5px;
border-radius: 20px;
background-color: var(--tmava-oranzova);;
color: var(--barva-pozadi);
float: left;
}

View file

@ -1,4 +1,4 @@
{% extends "base.html" %}
{% extends "galerie/base.html" %}
{% block nadpis1a %}

View file

@ -1,4 +1,4 @@
{% extends "base.html" %}
{% extends "galerie/base.html" %}
{% block nadpis1a %}
Galerie {{galerie.nazev}}

View file

@ -1,4 +1,4 @@
{% extends "base.html" %}
{% extends "galerie/base.html" %}
{% block content %}

View file

@ -0,0 +1,6 @@
{% extends "base.html" %}
{% load static %}
{% block custom_css %}
<link href="{% static 'css/galerie.css' %}?version=1" rel="stylesheet">
{% endblock %}

View file

@ -1,7 +1,5 @@
# coding: utf-8
from django.urls import path
from seminar.utils import org_required
from personalni.utils import org_required
from . import views
urlpatterns = [

View file

@ -1,5 +1,3 @@
# coding: utf-8
import random
from django.http import HttpResponse, Http404
@ -8,7 +6,7 @@ from django.template import RequestContext
from datetime import datetime
from galerie.models import Obrazek, Galerie
from seminar.models import Soustredeni
from soustredeni.models import Soustredeni
from galerie.forms import KomentarForm, NewGalerieForm
def zobrazit(galerie, request):

View file

@ -0,0 +1,6 @@
"""
Aplikace umožňující na uživatelské úrovni měnit obrázek v pozadí meníčka.
Umožňuje uložit obrázek a následně popsat, na kterých stránkách (podle url)
a v který čas (den/noc) se zobrazovat.
"""

View file

@ -4,7 +4,11 @@ import header_fotky.models as m
class FotkaPozadiAdmin(ModelAdmin):
"""
Nastaví čas vložení (:attr:`~header_fotky.models.FotkaHeader.cas`) jako
readonly = neměnitelný
"""
readonly_fields = ['cas']
admin.site.register(m.FotkaHeader, FotkaPozadiAdmin)
admin.site.register(m.FotkaUrlVazba)
admin.site.register(m.FotkaUrlVazba)

View file

@ -3,3 +3,4 @@ from django.apps import AppConfig
class HeaderFotkyConfig(AppConfig):
name = 'header_fotky'
verbose_name = 'Fotky v záhlaví'

View file

@ -1,4 +1,8 @@
"""
Context processory lze přidat do djanga v :mod:`~mamweb.settings` a dělají to,
že do contextu (tj. to, z čeho se např. berou proměnné v templatech) libovolné
stránky přidají další věci.
"""
from datetime import datetime, date
import random
@ -8,38 +12,46 @@ from header_fotky.models import FotkaUrlVazba
def vzhled(request):
''' Podle casu prida do templatu, zdali je nebo neni noc '''
hodin = datetime.now().hour
if (hodin <= 6) or (hodin >= 20):
noc = True
nedoba = 'den'
doba = 'noc'
else:
noc = False
nedoba = 'noc'
doba = 'den'
url = request.path
"""
Podle času přidá do contextu, zdali je nebo není noc. Dále podle dení
doby a url přidá do contextu správnou fotku.
fotky = FotkaUrlVazba.objects.exclude(denni_doba=nedoba)
fotka = None
url adresu nejprve vyzkouší celou, pak postupně odřezává věci za
lomítkem, dokud nenajde url, pro kterou existuje alespoň jedna fotka.
Z fotek pro toto url zkusí vybrat tu ve správné denní době a poté
libovolnou. (Z více možných fotek pro 1 url a 1 dobu vybírá náhodně.)
"""
hodin = datetime.now().hour
if (hodin <= 6) or (hodin >= 20):
noc = True
nedoba = 'den'
doba = 'noc'
else:
noc = False
nedoba = 'noc'
doba = 'den'
url = request.path
# TODO rychlejší patternmatch?
while (fotka is None) and (url != ''):
presne = fotky.filter(url__exact=url)
if presne.count() > 0:
presne_doba = presne.filter(denni_doba=doba)
if presne_doba.count() > 0:
fotka = random.choice(presne_doba).url_fotky()
else:
fotka = random.choice(presne).url_fotky()
fotky = FotkaUrlVazba.objects.exclude(denni_doba=nedoba)
fotka = None
url = url[:-1]
index = url.rfind('/')
if index != -1:
url = url[:index+1]
# TODO rychlejší patternmatch?
while (fotka is None) and (url != ''):
presne = fotky.filter(url__exact=url)
if presne.count() > 0:
presne_doba = presne.filter(denni_doba=doba)
if presne_doba.count() > 0:
fotka = random.choice(presne_doba).url_fotky()
else:
fotka = random.choice(presne).url_fotky()
if fotka is None:
fotka = settings.STATIC_URL + "images/header/vikendovka.jpg"
url = url[:-1]
index = url.rfind('/')
if index != -1:
url = url[:index+1]
return {'noc': noc, 'fotka': fotka}
if fotka is None:
fotka = settings.STATIC_URL + "images/header/vikendovka.jpg"
return {'noc': noc, 'fotka': fotka}

View file

@ -4,6 +4,7 @@ from django.utils import timezone
class FotkaHeader(models.Model):
""" fotka pro :mod:`fotka_header`, konkrétně :class:`~fotka_header.models.FotkaUrlVazba` """
class Meta:
ordering = ['-cas']
db_table = 'fotky_header'
@ -11,27 +12,34 @@ class FotkaHeader(models.Model):
verbose_name_plural = u'fotky do pozadí menu'
cas = models.DateTimeField(u'čas vložení fotky', default=timezone.now, help_text='Čas vložení fotky')
""" čas vložení fotky """
nazev = models.CharField(
u'název fotky', null=False, blank=False, unique=True, primary_key=True,
max_length=50, help_text='Název např. archiv_noc'
)
""" jméno fotky na webu """
fotka = models.ImageField(upload_to='header', null=False, blank=False)
""" soubor fotky (Nahrává se automaticky do složky ``media``.) """
def __str__(self):
return self.nazev
def clean(self):
""" kontroluje, zda sedí poměr stran """
if not self.fotka:
raise ValidationError("Chybí obrázek")
""" Kontroluje, zda sedí poměr stran """
if abs(self.fotka.width - (self.fotka.height * 970 / 350)) > 2:
raise ValidationError("Obrázek by měl mít rozměry 970w na 350h, nebo alespoň podobný poměr stran.")
super().clean()
class FotkaUrlVazba(models.Model):
"""
spojení :class:`~fotka_header.models.FotkaHeader` a url
(resp. prefixu url), na které být zobrazována
"""
class Meta:
ordering = ['url']
db_table = 'fotky_url_vazby'
@ -42,11 +50,13 @@ class FotkaUrlVazba(models.Model):
u'URL', blank=True, null=False, max_length=100,
help_text='url prefix stránek např: /archiv/ nebo /'
)
""" url prefix stránek, kde má být fotka zobrazena, např: /archiv/ nebo / """
fotka = models.ForeignKey(
FotkaHeader, blank=False, null=False, verbose_name='fotka',
on_delete=models.CASCADE
)
""" :class:`~fotka_header.models.FotkaHeader`, která má být zobrazována """
DOBA_DEN = 'den'
DOBA_NOC = 'noc'
@ -57,9 +67,11 @@ class FotkaUrlVazba(models.Model):
(DOBA_OBOJI, 'Zobrazovat pořád')]
denni_doba = models.CharField('denní doba', max_length=16, choices=DOBA_CHOICES, blank=False, default=DOBA_OBOJI)
""" dení doba, kdy tam má být zobrazována """
def __str__(self):
return self.url
def url_fotky(self):
""" vrací url fotky (tj. url, kde reálně získám soubor fotky) """
return self.fotka.fotka.url

View file

@ -1,11 +0,0 @@
- korektura potrebuje reakci
+ komentáře fixně na username
- používat skutečné jméno?
- vyžádat pozornost autora obsahu
- zvednout upload limit na 5MB
- sbalit a rozbalit korekturu
- nahrávání jiných věcí než PDF - kontrolovat?
- stylování
- seznam PDF - co zobrazovat?

View file

@ -0,0 +1,5 @@
"""
Seznam pdf k opravě a `opraf`_ v djangu místo PHP.
.. _opraf: https://github.com/vitstradal/opraf
"""

View file

@ -1,16 +1,23 @@
from django.contrib import admin
from reversion.admin import VersionAdmin
from korektury.models import KorekturovanePDF
from korektury.models import KorekturovanePDF, Oprava, KorekturaTag
from django.core.mail import send_mail
from django.core.mail import EmailMessage
from django.urls import reverse
# Register your models here.
class KorekturovanePDFAdmin(VersionAdmin):
"""
nastaví čas vložení (:attr:`~koretkury.models.KorekturovanePDF.cas`) a počet
stran (:attr:`~koretkury.models.KorekturovanePDF.stran`) jako readonly =
neměnitelný
Při prvním uložení pošle e-mail.
"""
readonly_fields = ['cas', 'stran']
def get_readonly_fields(self, request, obj=None):
""" Když pdf existuje, tak nedovolím měnit ani pdf."""
if obj:
return self.readonly_fields + ['pdf']
return self.readonly_fields
@ -18,14 +25,18 @@ class KorekturovanePDFAdmin(VersionAdmin):
fieldsets = [
(None,
{'fields':
['pdf', 'cas', 'org', 'stran', 'nazev', 'komentar', 'poslat_mail']}),
['pdf', 'cas', 'stran', 'nazev', 'orgove', 'komentar', 'poslat_mail']}),
# (u'PDF', {'fields': ['pdf']}),
]
list_display = ['nazev', 'cas', 'stran', 'org']
list_display = ['nazev', 'cas', 'stran']
list_filter = []
search_fields = []
autocomplete_fields = ['orgove']
def save_model(self, request, obj, form, change):
"""
Pokud je soubor nový a se poslat e-mail, tak pošle e-mail o novém pdf.
"""
super().save_model(request, obj, form, change)
if not change and obj.poslat_mail: # Je nový a má se poslat mail
odkaz = request.build_absolute_uri(reverse('korektury', kwargs={'pdf': obj.id}))
@ -43,6 +54,19 @@ Popis souboru:
S pozdravem a korekturám zdar!
Korekturovátko
'''
send_mail(predmet,text,odesilatel,[prijemce])
EmailMessage(
subject=predmet,
body=text,
from_email=odesilatel,
to=[prijemce],
).send()
admin.site.register(KorekturovanePDF, KorekturovanePDFAdmin)
class OpravaAdmin(admin.ModelAdmin):
model = Oprava
filter_horizontal = ("informovani_orgove", "tagy",)
admin.site.register(Oprava, OpravaAdmin)
admin.site.register(KorekturaTag)

7
korektury/api/apps.py Normal file
View file

@ -0,0 +1,7 @@
from django.apps import AppConfig
class ApiConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'korektury.api'
label = 'korektury_api' # Protože jedno api už máme.

11
korektury/api/urls.py Normal file
View file

@ -0,0 +1,11 @@
from django.urls import path
from personalni.utils import org_required
from . import views
urlpatterns = [
path('<int:pdf_id>/stav', org_required(views.korektury_stav_view), name='korektury_api_pdf_stav'),
path('oprava/stav', org_required(views.oprava_stav_view), name='korektury_api_oprava_stav'),
path('<int:pdf_id>/opravy_a_komentare', org_required(views.opravy_a_komentare_view), name='korektury_api_opravy_a_komentare'),
path('oprava/smaz', org_required(views.oprava_smaz_view), name='korektury_api_oprava_smaz'),
path('komentar/smaz', org_required(views.komentar_smaz_view), name='korektury_api_komentar_smaz'),
]

129
korektury/api/views.py Normal file
View file

@ -0,0 +1,129 @@
from http import HTTPStatus
from django.http import JsonResponse, HttpResponse
from django.shortcuts import get_object_or_404
from django.utils.html import linebreaks
from rest_framework import serializers
from korektury.utils import send_email_notification_komentar
from korektury.models import Oprava, KorekturovanePDF, Komentar, KorekturaTag
from personalni.models import Organizator
def korektury_stav_view(request, pdf_id: int, **kwargs):
q = request.POST
pdf = get_object_or_404(KorekturovanePDF, id=pdf_id)
status = q.get('state')
if status is not None:
assert status in KorekturovanePDF.STATUS.values
pdf.status = status
pdf.save()
return JsonResponse({'status': pdf.status})
def oprava_stav_view(request, **kwargs):
q = request.POST
op_id_str = q.get('id')
assert op_id_str is not None
op_id = int(op_id_str)
op = get_object_or_404(Oprava, id=op_id)
status = q.get('action')
if status is not None:
assert status in Oprava.STATUS.values
op.status = status
op.save()
return JsonResponse({'status': op.status})
def oprava_smaz_view(request, **kwargs):
q = request.POST
op_id_str = q.get('oprava_id')
assert op_id_str is not None
op_id = int(op_id_str)
oprava = get_object_or_404(Oprava, id=op_id)
oprava.delete()
return HttpResponse(status=HTTPStatus.NO_CONTENT)
def komentar_smaz_view(request, **kwargs):
q = request.POST
kom_id_str = q.get('komentar_id')
assert kom_id_str is not None
kom_id = int(kom_id_str)
komentar = get_object_or_404(Komentar, id=kom_id)
komentar.delete()
return HttpResponse(status=HTTPStatus.NO_CONTENT)
class KomentarSerializer(serializers.ModelSerializer):
class Meta:
model = Komentar
fields = '__all__'
def to_representation(self, instance):
ret = super().to_representation(instance)
ret["autor"] = str(instance.autor)
ret["text"] = linebreaks(ret["text"], autoescape=True) # Autora není třeba escapovat, ten se vkládá jako text.
return ret
class KorekturaTagSerializer(serializers.ModelSerializer):
class Meta:
model = KorekturaTag
fields = '__all__'
class OpravaSerializer(serializers.ModelSerializer):
class Meta:
model = Oprava
fields = '__all__'
def to_representation(self, instance):
ret = super().to_representation(instance)
ret["komentare"] = [KomentarSerializer(komentar).data for komentar in instance.komentar_set.all()]
ret["tagy"] = [KorekturaTagSerializer(tag).data for tag in instance.tagy.all()]
return ret
# komentar_set = serializers.ListField(child=KomentarSerializer())
def opravy_a_komentare_view(request, pdf_id: int, **kwargs):
if request.method == 'POST':
q = request.POST
x = int(q.get('x'))
y = int(q.get('y'))
img_id = int(q.get('img_id'))
oprava_id = int(q.get('oprava_id'))
komentar_id = int(q.get('komentar_id'))
text = q.get('text')
# prirazeni autora podle prihlaseni
autor_user = request.user
# pokud existuje ucet (user), ale neni to organizator = 403
autor = Organizator.objects.filter(osoba__user=autor_user).first()
if komentar_id != -1:
komentar = get_object_or_404(Komentar, id=komentar_id)
komentar.text = text
komentar.autor = autor
komentar.save()
else:
if oprava_id != -1:
oprava = get_object_or_404(Oprava, id=oprava_id)
else:
pdf = get_object_or_404(KorekturovanePDF, id=pdf_id)
oprava = Oprava.objects.create(
pdf=pdf,
strana=img_id,
x=x,
y=y,
)
tagy_raw = q.get('tagy')
if tagy_raw != "":
tagy = list(map(int, tagy_raw.split(",")))
oprava.tagy.add(*KorekturaTag.objects.filter(id__in=tagy))
Komentar.objects.create(oprava=oprava, autor=autor, text=text)
send_email_notification_komentar(oprava, autor, request)
opravy = Oprava.objects.filter(pdf=pdf_id).all()
# Serializovat list je prý security vulnerability, tedy je přidán slovník pro bezpečnost
return JsonResponse({"context": [OpravaSerializer(oprava).data for oprava in opravy]})

View file

@ -1,13 +0,0 @@
from django import forms
class OpravaForm(forms.Form):
text = forms.CharField(max_length=256)
autor = forms.CharField(max_length=20)
x = forms.IntegerField()
y = forms.IntegerField()
scroll = forms.CharField(max_length=256)
pdf = forms.CharField(max_length=256)
img_id = forms.CharField(max_length=256)
id = forms.CharField(max_length=256)
action = forms.CharField(max_length=256)

View file

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations

View file

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations

View file

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations

View file

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations

View file

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations

View file

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations

View file

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations

View file

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations

View file

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models

View file

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models

View file

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models

View file

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models

View file

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models

View file

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models

View file

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models

View file

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-04-30 21:40
from __future__ import unicode_literals

View file

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.21 on 2019-06-10 21:58
from __future__ import unicode_literals

View file

@ -0,0 +1,18 @@
# Generated by Django 2.2.28 on 2022-12-05 19:14
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('korektury', '0018_korekturovanepdf_poslat_mail'),
]
operations = [
migrations.AlterField(
model_name='korekturovanepdf',
name='nazev',
field=models.CharField(help_text='Název (např. 22.1 verze 4) korekturovaného PDF', max_length=50, verbose_name='název PDF'),
),
]

View file

@ -0,0 +1,18 @@
# Generated by Django 2.2.28 on 2023-06-19 19:38
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('korektury', '0019_auto_20221205_2014'),
]
operations = [
migrations.AlterField(
model_name='korekturovanepdf',
name='nazev',
field=models.CharField(help_text='Název (např. `22.1 | analyza v4` nebo `propagace | letacek v0`) korekturovaného PDF', max_length=50, verbose_name='název PDF'),
),
]

View file

@ -0,0 +1,13 @@
# Generated by Django 4.2.8 on 2024-03-12 20:24
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('korektury', '0020_lepsi_popis_nazvu_PDF_v_adminu'),
]
operations = [
]

Some files were not shown because too many files have changed in this diff Show more