Compare commits

...

288 commits

Author SHA1 Message Date
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
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
0d67b5ff83 Prozatím takhle (proházel jsem kanály) 2025-01-21 00:07:14 +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
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
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
af9f244207 Drobný nesting 2024-05-13 23:26:16 +02:00
20691f483a Merge remote-tracking branch 'origin/master' into static-files-upgrade 2024-05-13 22:41:09 +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
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
b8b0c5440f Nějaký základ nové verze CSSek 2024-04-30 22:47:03 +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
5eb936d891 Fix: z flip-card mi vypadlo jejich zarovnání na střed 2024-03-19 21:52:04 +01:00
df5ae2c12a Fix: bootstrap upravuje .container 2024-03-12 22:09:32 +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
500 changed files with 26958 additions and 19378 deletions

12
.gitignore vendored
View file

@ -31,9 +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
# dokumentace
docs/_build
docs/modules
# Mac users
.DS_Store

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,6 +1,3 @@
"""
Soubor sloužící k pojmenování a jiným nastavením djangovské aplikace.
"""
from django.apps import AppConfig
class AesopConfig(AppConfig):

View file

@ -1,10 +1,3 @@
"""
Soubor sloužící jako router, tj. zde se definují url adresy a na co ukazují:
- ``aesop-export/mam-rocnik-<int:prvni_rok>.csv`` (seminar_export_rocnik) :class:`~aesop.views.ExportRocnikView`
- ``aesop-export/mam-sous-<str:datum_zacatku>.csv`` (seminar_export_sous) :class:`~aesop.views.ExportSousView`
- ``aesop-export/index.csv`` (seminar_export_index) :class:`~aesop.views.ExportIndexView`
"""
from django.urls import path
from aesop import views
@ -12,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,8 +1,3 @@
"""
Soubor sloužící k deklaraci jednotlivých views (nejčastěji funkce beroucí request
a vracející :func:`django.shortcuts.render` respektive nějakou response, nebo
třídy většinou rozšiřující nějakou třídu z :mod:`django.views.generic`)
"""
import django
from django.shortcuts import get_object_or_404
from django.http import HttpResponse
@ -11,18 +6,19 @@ from django.views import generic
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

@ -1,6 +1,3 @@
"""
Soubor sloužící k pojmenování a jiným nastavením djangovské aplikace.
"""
from django.apps import AppConfig

View file

@ -1,8 +1,7 @@
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):
@ -49,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,18 +1,6 @@
"""
Soubor sloužící jako router, tj. zde se definují url adresy a na co ukazují:
- ``api/expor/skoly/`` (export_skoly) :func:`~api.views.exports.exportSkolView`
- ``api/autocomplete/skola/`` (autocomplete_skola) :class:`~api.views.autocomplete.SkolaAutocomplete`
- ``api/autocomplete/resitel/`` (autocomplete_resitel) :class:`~api.views.autocomplete.ResitelAutocomplete`
- ``api/autocomplete/problem/odevzdatelny`` (autocomplete_problem_odevzdatelny) :class:`~api.views.autocomplete.OdevzdatelnyProblemAutocomplete`
Na autocomplete v3 čeká:
- ``autocomplete/organizatori/`` (seminar_autocomplete_organizator) :class:`~api.views.autocomplete.OrganizatorAutocomplete`
"""
from django.urls import path
from . import views
from seminar.utils import org_required
from personalni.utils import org_required
urlpatterns = [
# Export škol
@ -29,5 +17,5 @@ urlpatterns = [
# Ceka na autocomplete v3
# path('autocomplete/organizatori/',
# org_member_required(views.OrganizatorAutocomplete.as_view()),
# name='seminar_autocomplete_organizator')
# name='autocomplete_organizator')
]

View file

@ -1,7 +1,2 @@
"""
Soubory sloužící k deklaraci jednotlivých views (nejčastěji funkce beroucí request
a vracející :func:`django.shortcuts.render` respektive nějakou response, nebo
třídy většinou rozšiřující nějakou třídu z :mod:`django.views.generic`)
"""
from .autocomplete import *
from .exports import *

View file

@ -5,7 +5,9 @@ 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)
@ -13,7 +15,7 @@ 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()
qs = Skola.objects.all()
if self.q:
words = self.q.split(' ') #TODO re split podle bileho znaku
partq = Q()
@ -31,7 +33,7 @@ class SkolaAutocomplete(autocomplete.Select2QuerySetView):
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()
@ -51,8 +53,8 @@ class PublicResitelAutocomplete(LoginRequiredAjaxMixin, autocomplete.Select2Quer
především v odevzdávátku.
"""
def get_queryset(self):
letos = m.Nastaveni.get_solo().aktualni_rocnik
qs = m.Resitel.objects.filter(
letos = Nastaveni.get_solo().aktualni_rocnik
qs = Resitel.objects.filter(
rok_maturity__gte=letos.druhy_rok()
).filter(
prezdivka_resitele__isnull=False
@ -70,7 +72,7 @@ class PublicResitelAutocomplete(LoginRequiredAjaxMixin, autocomplete.Select2Quer
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 = m.Problem.objects.filter(stav=m.Problem.STAV_ZADANY)
qs = Problem.objects.filter(stav=Problem.STAV_ZADANY)
if self.q:
qs = qs.filter(
Q(nazev__icontains=self.q))
@ -87,12 +89,12 @@ 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(m.Nastaveni)
nastaveni = get_object_or_404(Nastaveni)
rocnik = nastaveni.aktualni_rocnik
temaQ = Q(Tema___rocnik = rocnik)
ulohaQ = Q(Uloha___cislo_zadani__rocnik=rocnik)
clanekQ = Q(Clanek___cislo__rocnik=rocnik)
qs = m.Problem.objects.filter(temaQ | ulohaQ | clanekQ).order_by("-stav", "nazev")
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,4 +1,4 @@
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):

645
data/groups.json Normal file
View file

@ -0,0 +1,645 @@
[
{
"fields": {
"name": "org",
"permissions": [
[
"org",
"auth",
"user"
],
[
"add_flatpage",
"flatpages",
"flatpage"
],
[
"delete_flatpage",
"flatpages",
"flatpage"
],
[
"change_flatpage",
"flatpages",
"flatpage"
],
[
"view_flatpage",
"flatpages",
"flatpage"
],
[
"add_galerie",
"galerie",
"galerie"
],
[
"delete_galerie",
"galerie",
"galerie"
],
[
"change_galerie",
"galerie",
"galerie"
],
[
"view_galerie",
"galerie",
"galerie"
],
[
"add_obrazek",
"galerie",
"obrazek"
],
[
"delete_obrazek",
"galerie",
"obrazek"
],
[
"change_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"
],
[
"delete_komentar",
"korektury",
"komentar"
],
[
"change_komentar",
"korektury",
"komentar"
],
[
"view_komentar",
"korektury",
"komentar"
],
[
"add_korekturovanepdf",
"korektury",
"korekturovanepdf"
],
[
"delete_korekturovanepdf",
"korektury",
"korekturovanepdf"
],
[
"change_korekturovanepdf",
"korektury",
"korekturovanepdf"
],
[
"view_korekturovanepdf",
"korektury",
"korekturovanepdf"
],
[
"add_oprava",
"korektury",
"oprava"
],
[
"delete_oprava",
"korektury",
"oprava"
],
[
"change_oprava",
"korektury",
"oprava"
],
[
"view_oprava",
"korektury",
"oprava"
],
[
"add_novinky",
"novinky",
"novinky"
],
[
"delete_novinky",
"novinky",
"novinky"
],
[
"change_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"
],
[
"delete_prijemce",
"personalni",
"prijemce"
],
[
"change_prijemce",
"personalni",
"prijemce"
],
[
"view_prijemce",
"personalni",
"prijemce"
],
[
"change_resitel",
"personalni",
"resitel"
],
[
"view_resitel",
"personalni",
"resitel"
],
[
"add_skola",
"personalni",
"skola"
],
[
"delete_skola",
"personalni",
"skola"
],
[
"change_skola",
"personalni",
"skola"
],
[
"view_skola",
"personalni",
"skola"
],
[
"add_hlasovani",
"prednasky",
"hlasovani"
],
[
"delete_hlasovani",
"prednasky",
"hlasovani"
],
[
"change_hlasovani",
"prednasky",
"hlasovani"
],
[
"view_hlasovani",
"prednasky",
"hlasovani"
],
[
"add_prednaska",
"prednasky",
"prednaska"
],
[
"delete_prednaska",
"prednasky",
"prednaska"
],
[
"change_prednaska",
"prednasky",
"prednaska"
],
[
"view_prednaska",
"prednasky",
"prednaska"
],
[
"add_seznam",
"prednasky",
"seznam"
],
[
"delete_seznam",
"prednasky",
"seznam"
],
[
"change_seznam",
"prednasky",
"seznam"
],
[
"view_seznam",
"prednasky",
"seznam"
],
[
"add_konfera",
"soustredeni",
"konfera"
],
[
"delete_konfera",
"soustredeni",
"konfera"
],
[
"change_konfera",
"soustredeni",
"konfera"
],
[
"view_konfera",
"soustredeni",
"konfera"
],
[
"add_konfery_ucastnici",
"soustredeni",
"konfery_ucastnici"
],
[
"delete_konfery_ucastnici",
"soustredeni",
"konfery_ucastnici"
],
[
"change_konfery_ucastnici",
"soustredeni",
"konfery_ucastnici"
],
[
"view_konfery_ucastnici",
"soustredeni",
"konfery_ucastnici"
],
[
"add_soustredeni",
"soustredeni",
"soustredeni"
],
[
"delete_soustredeni",
"soustredeni",
"soustredeni"
],
[
"change_soustredeni",
"soustredeni",
"soustredeni"
],
[
"view_soustredeni",
"soustredeni",
"soustredeni"
],
[
"add_soustredeni_organizatori",
"soustredeni",
"soustredeni_organizatori"
],
[
"delete_soustredeni_organizatori",
"soustredeni",
"soustredeni_organizatori"
],
[
"change_soustredeni_organizatori",
"soustredeni",
"soustredeni_organizatori"
],
[
"view_soustredeni_organizatori",
"soustredeni",
"soustredeni_organizatori"
],
[
"add_soustredeni_ucastnici",
"soustredeni",
"soustredeni_ucastnici"
],
[
"delete_soustredeni_ucastnici",
"soustredeni",
"soustredeni_ucastnici"
],
[
"change_soustredeni_ucastnici",
"soustredeni",
"soustredeni_ucastnici"
],
[
"view_soustredeni_ucastnici",
"soustredeni",
"soustredeni_ucastnici"
],
[
"add_tag",
"taggit",
"tag"
],
[
"delete_tag",
"taggit",
"tag"
],
[
"change_tag",
"taggit",
"tag"
],
[
"view_tag",
"taggit",
"tag"
],
[
"add_taggeditem",
"taggit",
"taggeditem"
],
[
"delete_taggeditem",
"taggit",
"taggeditem"
],
[
"change_taggeditem",
"taggit",
"taggeditem"
],
[
"view_taggeditem",
"taggit",
"taggeditem"
],
[
"add_cislo",
"tvorba",
"cislo"
],
[
"delete_cislo",
"tvorba",
"cislo"
],
[
"change_cislo",
"tvorba",
"cislo"
],
[
"view_cislo",
"tvorba",
"cislo"
],
[
"add_clanek",
"tvorba",
"clanek"
],
[
"delete_clanek",
"tvorba",
"clanek"
],
[
"change_clanek",
"tvorba",
"clanek"
],
[
"view_clanek",
"tvorba",
"clanek"
],
[
"add_deadline",
"tvorba",
"deadline"
],
[
"change_deadline",
"tvorba",
"deadline"
],
[
"view_deadline",
"tvorba",
"deadline"
],
[
"add_pohadka",
"tvorba",
"pohadka"
],
[
"delete_pohadka",
"tvorba",
"pohadka"
],
[
"change_pohadka",
"tvorba",
"pohadka"
],
[
"view_pohadka",
"tvorba",
"pohadka"
],
[
"add_problem",
"tvorba",
"problem"
],
[
"delete_problem",
"tvorba",
"problem"
],
[
"change_problem",
"tvorba",
"problem"
],
[
"view_problem",
"tvorba",
"problem"
],
[
"add_rocnik",
"tvorba",
"rocnik"
],
[
"delete_rocnik",
"tvorba",
"rocnik"
],
[
"change_rocnik",
"tvorba",
"rocnik"
],
[
"view_rocnik",
"tvorba",
"rocnik"
],
[
"add_tema",
"tvorba",
"tema"
],
[
"delete_tema",
"tvorba",
"tema"
],
[
"change_tema",
"tvorba",
"tema"
],
[
"view_tema",
"tvorba",
"tema"
],
[
"add_uloha",
"tvorba",
"uloha"
],
[
"delete_uloha",
"tvorba",
"uloha"
],
[
"change_uloha",
"tvorba",
"uloha"
],
[
"view_uloha",
"tvorba",
"uloha"
],
[
"add_nastaveni",
"various",
"nastaveni"
],
[
"delete_nastaveni",
"various",
"nastaveni"
],
[
"change_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",
@ -439,7 +439,7 @@
"sort_order": 36,
"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",
@ -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",
@ -721,7 +721,7 @@
"sort_order": 36,
"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": "",
@ -1050,7 +1061,7 @@
"sort_order": 52,
"title": "Nahrát řešení k nadproblému {{nadproblem_id}}",
"tree": 1,
"url": "seminar_nahraj_reseni nadproblem_id",
"url": "odevzdavatko_nahraj_reseni nadproblem_id",
"urlaspattern": true
},
"model": "sitetree.treeitem",
@ -1079,5 +1090,29 @@
},
"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,622 +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_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"
},
{
"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_deadline",
"ct_app_label": "seminar",
"ct_model": "deadline"
},
{
"codename": "change_deadline",
"ct_app_label": "seminar",
"ct_model": "deadline"
},
{
"codename": "view_deadline",
"ct_app_label": "seminar",
"ct_model": "deadline"
},
{
"codename": "add_konfera",
"ct_app_label": "soustredeni",
"ct_model": "konfera"
},
{
"codename": "change_konfera",
"ct_app_label": "soustredeni",
"ct_model": "konfera"
},
{
"codename": "delete_konfera",
"ct_app_label": "soustredeni",
"ct_model": "konfera"
},
{
"codename": "view_konfera",
"ct_app_label": "soustredeni",
"ct_model": "konfera"
},
{
"codename": "add_konfery_ucastnici",
"ct_app_label": "soustredeni",
"ct_model": "konfery_ucastnici"
},
{
"codename": "change_konfery_ucastnici",
"ct_app_label": "soustredeni",
"ct_model": "konfery_ucastnici"
},
{
"codename": "delete_konfery_ucastnici",
"ct_app_label": "soustredeni",
"ct_model": "konfery_ucastnici"
},
{
"codename": "view_konfery_ucastnici",
"ct_app_label": "soustredeni",
"ct_model": "konfery_ucastnici"
},
{
"codename": "add_nastaveni",
"ct_app_label": "various",
"ct_model": "nastaveni"
},
{
"codename": "change_nastaveni",
"ct_app_label": "various",
"ct_model": "nastaveni"
},
{
"codename": "delete_nastaveni",
"ct_app_label": "various",
"ct_model": "nastaveni"
},
{
"codename": "view_nastaveni",
"ct_app_label": "various",
"ct_model": "nastaveni"
},
{
"codename": "add_novinky",
"ct_app_label": "novinky",
"ct_model": "novinky"
},
{
"codename": "change_novinky",
"ct_app_label": "novinky",
"ct_model": "novinky"
},
{
"codename": "delete_novinky",
"ct_app_label": "novinky",
"ct_model": "novinky"
},
{
"codename": "view_novinky",
"ct_app_label": "novinky",
"ct_model": "novinky"
},
{
"codename": "change_organizator",
"ct_app_label": "personalni",
"ct_model": "organizator"
},
{
"codename": "view_organizator",
"ct_app_label": "personalni",
"ct_model": "organizator"
},
{
"codename": "change_osoba",
"ct_app_label": "personalni",
"ct_model": "osoba"
},
{
"codename": "view_osoba",
"ct_app_label": "personalni",
"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": "personalni",
"ct_model": "prijemce"
},
{
"codename": "change_prijemce",
"ct_app_label": "personalni",
"ct_model": "prijemce"
},
{
"codename": "delete_prijemce",
"ct_app_label": "personalni",
"ct_model": "prijemce"
},
{
"codename": "view_prijemce",
"ct_app_label": "personalni",
"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": "change_resitel",
"ct_app_label": "personalni",
"ct_model": "resitel"
},
{
"codename": "view_resitel",
"ct_app_label": "personalni",
"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": "personalni",
"ct_model": "skola"
},
{
"codename": "change_skola",
"ct_app_label": "personalni",
"ct_model": "skola"
},
{
"codename": "delete_skola",
"ct_app_label": "personalni",
"ct_model": "skola"
},
{
"codename": "view_skola",
"ct_app_label": "personalni",
"ct_model": "skola"
},
{
"codename": "add_soustredeni",
"ct_app_label": "soustredeni",
"ct_model": "soustredeni"
},
{
"codename": "change_soustredeni",
"ct_app_label": "soustredeni",
"ct_model": "soustredeni"
},
{
"codename": "delete_soustredeni",
"ct_app_label": "soustredeni",
"ct_model": "soustredeni"
},
{
"codename": "view_soustredeni",
"ct_app_label": "soustredeni",
"ct_model": "soustredeni"
},
{
"codename": "add_soustredeni_organizatori",
"ct_app_label": "soustredeni",
"ct_model": "soustredeni_organizatori"
},
{
"codename": "change_soustredeni_organizatori",
"ct_app_label": "soustredeni",
"ct_model": "soustredeni_organizatori"
},
{
"codename": "delete_soustredeni_organizatori",
"ct_app_label": "soustredeni",
"ct_model": "soustredeni_organizatori"
},
{
"codename": "view_soustredeni_organizatori",
"ct_app_label": "soustredeni",
"ct_model": "soustredeni_organizatori"
},
{
"codename": "add_soustredeni_ucastnici",
"ct_app_label": "soustredeni",
"ct_model": "soustredeni_ucastnici"
},
{
"codename": "change_soustredeni_ucastnici",
"ct_app_label": "soustredeni",
"ct_model": "soustredeni_ucastnici"
},
{
"codename": "delete_soustredeni_ucastnici",
"ct_app_label": "soustredeni",
"ct_model": "soustredeni_ucastnici"
},
{
"codename": "view_soustredeni_ucastnici",
"ct_app_label": "soustredeni",
"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"
}
]

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

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)

View file

@ -9,12 +9,6 @@ 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``.
_git_hooks
----------
Hooky do gitu pro kontrolu Pythoního stylu. Především ``flake8``.
Zbylo tu z minulosti mamwebu.
data
----
Obsahuje data, která patří do databáze, ale jsou přímo součástí webu jako

View file

@ -30,6 +30,7 @@ Dokumentace (jak v ``docs/``, tak přímo v kódu) je psaná ve
zavislosti
sphinx
skripty
zkratky
modules/modules
dalsi_soubory
zapisy/zapisy

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

View file

@ -1,13 +1,15 @@
Sphinx na našem webu
====================
Dokumentace se zkompiluje příkazem ``make html`` ve složce ``doc``.
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 ``doc`` 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).
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

View file

@ -10,11 +10,9 @@ věci jako chybové hlášky a vzhled M&M stránek (menu, patička, atd.). Aktu
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), za
zmínku stojí seminar, kde jsou takové ty věci, co zbyly. Plus jsou tam aktuálně
téměř všechny modely, protože je těžké je přesunout jinam.
tu aplikaci, která tomu odpovídá, respektive se k ní dostat přes url).
**TLDR: Nevšímejte si složky data/ a souborů přímo v kořenové složce.**
**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
@ -22,6 +20,9 @@ databázi), tj. statické stránky, menu a obrázky v pozadí menu. Ten je třeb
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
--------------

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?

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

@ -1,5 +1,3 @@
# coding: utf-8
from django.db import models
#from django.db.models import Q
from imagekit.models import ImageSpecField

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,14 +1,5 @@
"""
Soubor sloužící jako router, tj. zde se definují url adresy a na co ukazují:
- ``<int:pk>/`` :func:`~galerie.views.nahled`
- ``<int:pk>/<int:fotka>/`` :func:`~galerie.views.detail`
- ``<int:galerie>/new/`` :func:`~galerie.views.new_galerie`
- ``<int:galerie>/plus/<int:subgalerie>/`` :func:`~galerie.views.plus_galerie`
- ``<int:galerie>/minus/<int:subgalerie>/`` :func:`~galerie.views.minus_galerie`
"""
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

@ -1,14 +1,3 @@
"""
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:
- :class:`~header_fotky.models.FotkaHeader`
- :class:`~header_fotky.models.FotkaUrlVazba`
"""
from django.contrib import admin
from django.contrib.admin import ModelAdmin
import header_fotky.models as m
@ -22,4 +11,4 @@ class FotkaPozadiAdmin(ModelAdmin):
readonly_fields = ['cas']
admin.site.register(m.FotkaHeader, FotkaPozadiAdmin)
admin.site.register(m.FotkaUrlVazba)
admin.site.register(m.FotkaUrlVazba)

View file

@ -1,6 +1,3 @@
"""
Soubor sloužící k pojmenování a jiným nastavením djangovské aplikace.
"""
from django.apps import AppConfig

View file

@ -1,17 +1,3 @@
"""
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`
"""
from django.core.exceptions import ValidationError
from django.db import models
from django.utils import timezone

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

@ -1,13 +1,3 @@
"""
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:
- :class:`korektury.models.KorekturovanePDF`
"""
from django.contrib import admin
from reversion.admin import VersionAdmin
from korektury.models import KorekturovanePDF
@ -15,7 +5,6 @@ from korektury.models import KorekturovanePDF
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
@ -36,12 +25,13 @@ 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):
"""

View file

@ -1,13 +1,3 @@
"""
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
"""
from django import forms
class OpravaForm(forms.Form):

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,41 @@
# Generated by Django 4.2.13 on 2024-06-11 23:53
from django.db import migrations, models
def pridej_orgy(apps, schema_editor):
PDF = apps.get_model('korektury', 'KorekturovanePDF')
for pdf in PDF.objects.all(): # Tohle by asi mělo jít udělat pomocí update, ale moc práce a rychlé hledání taky nepomohlo.
if pdf.org is not None: pdf.orgove.add(pdf.org)
pdf.save() # ig?
def vyber_orga(apps, schema_editor):
PDF = apps.get_model('korektury', 'KorekturovanePDF')
for pdf in PDF.objects.all():
orgove = pdf.orgove.all()
if len(orgove) > 1:
raise migrations.exceptions.IrreversibleError(f'PDF {pdf.id} má víc než jednoho zodpovědného orga, nejde odmigrovat na verzi, která umí jen jednoho.')
if len(orgove) == 0:
pdf.org = None
else:
pdf.org = orgove[0]
pdf.save()
class Migration(migrations.Migration):
dependencies = [
('personalni', '0011_osloveni_vsechny_choices'),
('korektury', '0023_personalni_post_migrate'),
]
operations = [
migrations.AddField(
model_name='korekturovanepdf',
name='orgove',
field=models.ManyToManyField(blank=True, default=None, help_text='Zodpovědní organizátoři za obsah (chodí jim maily o nových korekturách)', to='personalni.organizator'),
),
migrations.RunPython(pridej_orgy, vyber_orga),
migrations.RemoveField(
model_name='korekturovanepdf',
name='org',
),
]

View file

@ -1,19 +1,6 @@
"""
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`
"""
import os
from django.db import models
from django.urls import reverse
from django.utils import timezone
from django.conf import settings
from django.core.exceptions import ObjectDoesNotExist
@ -40,7 +27,6 @@ def generate_filename(self, filename):
clean)
return os.path.join(settings.KOREKTURY_PDF_DIR, fname)
#@reversion.register(ignore_duplicates=True)
class KorekturovanePDF(models.Model):
class Meta:
@ -60,9 +46,9 @@ class KorekturovanePDF(models.Model):
pdf = models.FileField(u'PDF', upload_to = generate_filename)
org = models.ForeignKey(Organizator, blank=True,
help_text='Zodpovědný organizátor za obsah',
null=True, default=None, on_delete=models.SET_NULL)
orgove = models.ManyToManyField(Organizator, blank=True,
help_text='Zodpovědní organizátoři za obsah (chodí jim maily o nových korekturách)',
default=None)
stran = models.IntegerField(u'počet stran', help_text='Počet stran PDF',
default=0)
@ -143,6 +129,9 @@ class KorekturovanePDF(models.Model):
return nazev_split[0] # + " " + nazev_split[2]
except IndexError:
return self.nazev
def get_absolute_url(self):
return reverse('korektury', kwargs={'pdf': self.id})
@reversion.register(ignore_duplicates=True)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 697 B

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 717 B

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 702 B

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 617 B

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -1,3 +0,0 @@
from django.test import TestCase
# Create your tests here.

View file

@ -35,24 +35,27 @@ def create_test_pdf(rnd, organizatori):
# TODO silent ghostscript (vypisuje odstavec za každou stránku…)
KorekturovanePDF.objects.create(
nazev='B', komentar='Neuronové sítě', org=rnd.choice(organizatori), pdf=gen_filename(filename='B.pdf')
)
KorekturovanePDF.objects.create(
nazev='A', komentar='M&M: Jak řešit?', org=rnd.choice(organizatori), pdf=gen_filename(filename='A.pdf')
korekturovane_pdf = KorekturovanePDF.objects.create(
nazev='B', komentar='Neuronové sítě', pdf=gen_filename(filename='B.pdf')
)
korekturovane_pdf.orgove.set((rnd.choice(organizatori),))
korekturovane_pdf = KorekturovanePDF.objects.create(
nazev='A', komentar='M&M: Jak řešit?', org=rnd.choice(organizatori), pdf=gen_filename(filename='A.pdf'),
nazev='A', komentar='M&M: Jak řešit?', pdf=gen_filename(filename='A.pdf')
)
korekturovane_pdf.orgove.set(rnd.sample(organizatori, 2))
KorekturovanePDF.objects.create(
nazev='A', komentar='M&M: Jak řešit?', pdf=gen_filename(filename='A.pdf'),
status='zanaseni'
)
KorekturovanePDF.objects.create(
nazev='A', komentar='M&M: Jak řešit?', org=rnd.choice(organizatori), pdf=gen_filename(filename='A.pdf'),
korekturovane_pdf = KorekturovanePDF.objects.create(
nazev='A', komentar='M&M: Jak řešit?', pdf=gen_filename(filename='A.pdf'),
status='zastarale'
)
except (FileNotFoundError, Exception) as e:
korekturovane_pdf.orgove.set((rnd.choice(organizatori),))
except OSError as e:
# TODO najít správné chyby, které vyhazují různé systémy při neexistenci ImageMagick, nebo knihoven
logger.error(str(e))
logger.error(

View file

@ -1,13 +1,5 @@
"""
Soubor sloužící jako router, tj. zde se definují url adresy a na co ukazují:
- ``korektury/`` (korektury_list) :class:`~korektury.views.KorekturySeskupeneListView`
- ``korektury/neseskupene/`` (korektury_neseskupene_list) :class:`~korektury.views.KorekturyAktualniListView`
- ``korektury/zastarale/`` (korektury_stare_list) :class:`~korektury.views.KorekturyZastaraleListView`
- ``korektury/<int:pdf>/`` (korektury) :class:`~korektury.views.KorekturyView`
"""
from django.urls import path
from seminar.utils import org_required
from personalni.utils import org_required
from . import views
urlpatterns = [

View file

@ -1,8 +1,3 @@
"""
Soubor sloužící k deklaraci jednotlivých views (nejčastěji funkce beroucí request
a vracející :func:`django.shortcuts.render` respektive nějakou response, nebo
třídy většinou rozšiřující nějakou třídu z :mod:`django.views.generic`)
"""
from django.shortcuts import get_object_or_404, render
from django.views import generic
from django.conf import settings
@ -188,9 +183,9 @@ class KorekturyView(generic.TemplateView):
if email_komentujiciho:
emails.add(email_komentujiciho)
# zodpovedny org
if oprava.pdf.org:
email_zobpovedny = oprava.pdf.org.osoba.email
# zodpovedni orgove
for org in oprava.pdf.orgove.all():
email_zobpovedny = org.osoba.email
if email_zobpovedny:
emails.add(email_zobpovedny)
@ -199,13 +194,6 @@ class KorekturyView(generic.TemplateView):
if email:
emails.discard(email)
if not settings.POSLI_MAILOVOU_NOTIFIKACI:
print("Poslal bych upozornění na tyto adresy: ", " ".join(emails))
print("---- Upozornění:")
print(text)
print("---- Konec upozornění")
return
EmailMessage(
subject=subject,
body=text,

View file

@ -8,4 +8,3 @@ ensure_venv
./manage.py testdata
./manage.py loaddata data/*
#make/sync_prod_flatpages
./manage.py load_org_permissions deploy_v2/admin_org_prava.json

View file

@ -95,7 +95,7 @@ function safe_checkout_branch {
echo >&2 "Změna v $SCRIPT, prosím pullni manuálně"
exit 1
fi
git checkout "$BRANCH"
git checkout "$BRANCH" --
git pull
git clean -f
}

View file

@ -4,7 +4,7 @@ set -exuo pipefail
. make/lib.sh
scp vue_frontend/webpack-stats.json "$GIMLI_LOGIN:$TESTWEB/vue_frontend/"
rsync -ave ssh seminar/static/seminar/vue "$GIMLI_LOGIN:$TESTWEB/seminar/static/seminar/"
rsync -ave ssh treenode/static/treenode/vue "$GIMLI_LOGIN:$TESTWEB/treenode/static/treenode/"
ssh "$GIMLI_LOGIN" "
set -euxo pipefail
cd $TESTWEB

View file

@ -5,5 +5,4 @@ set -exuo pipefail
ensure_web_installed
./manage.py graph_models seminar | dot -Tpdf > schema_seminar.pdf
./manage.py graph_models -a -g | dot -Tpdf > schema_all.pdf

View file

@ -7,17 +7,18 @@ import locale
from django.contrib import admin
from django.contrib.admin import AdminSite
from django.contrib.flatpages.models import FlatPage
import logging
# Note: we are renaming the original Admin and Form as we import them!
from django.contrib.flatpages.admin import FlatPageAdmin as FlatPageAdminOld
from django.contrib.flatpages.admin import FlatpageForm as FlatpageFormOld
from django import forms
from ckeditor_uploader.widgets import CKEditorUploadingWidget
from django_ckeditor_5.widgets import CKEditor5Widget
class FlatpageForm(FlatpageFormOld):
content = forms.CharField(widget=CKEditorUploadingWidget())
content = forms.CharField(widget=CKEditor5Widget())
class Meta:
model = FlatPage # this is not automatically inherited from FlatpageFormOld
exclude = []
@ -43,7 +44,7 @@ def get_app_list(self, request, app_label=None):
app_dict = self._build_app_dict(request, label=app_label)
aplikace_nahore = [
'seminar',
'tvorba',
'personalni',
'novinky',
'korektury',
@ -56,8 +57,13 @@ def get_app_list(self, request, app_label=None):
# Sort the models alphabetically within each app.
for app in app_list:
app['models'].sort(key=lambda x: locale.strxfrm('žž' + x['name'].lower()) if (x['name'].endswith("(Node)")) else locale.strxfrm(x['name'].lower()))
try: # na macu nefunguje locale.strxfrm :-/ proto je tu try except block
for app in app_list:
app['models'].sort(key=lambda x: locale.strxfrm(x['name'].lower()))
except OSError as e:
# locale.strxfrm nefunguje na macu... :-/ -> neprovede se řazení
logger = logging.getLogger(__name__)
logger.error(e)
return app_list

View file

@ -1,88 +0,0 @@
from datetime import datetime, date
from django.conf import settings
from django.http import HttpResponse, HttpResponseRedirect
class LoggedInHintCookieMiddleware(object):
"""Middleware to securely help with 'logged-in' detection for dual HTTP/HTTPS sites.
On insecure requests: Checks for a (non-secure) cookie settings.LOGGED_IN_HINT_COOKIE_NAME
and if present, redirects to HTTPS (same adress).
Note this usually breaks non-GET (POST) requests.
On secure requests: Updates cookie settings.LOGGED_IN_HINT_COOKIE_NAME to reflect
whether an user is logged in in the current session (cookie set to 'True' or cleared).
The cookie is set to expire at the same time as the sessionid cookie.
By default, LOGGED_IN_HINT_COOKIE_NAME = 'logged_in_hint'.
"""
def __init__(self):
if hasattr(settings, 'LOGGED_IN_HINT_COOKIE_NAME'):
self.cookie_name = settings.LOGGED_IN_HINT_COOKIE_NAME
else: self.cookie_name = 'logged_in_hint'
self.cookie_value = 'True'
def cookie_correct(self, request):
return self.cookie_name in request.COOKIES and request.COOKIES[self.cookie_name] == self.cookie_value
def process_request(self, request):
if not request.is_secure():
if self.cookie_correct(request):
# redirect insecure (assuming http) requests with hint cookie to https
url = request.build_absolute_uri()
assert url[:5] == 'http:'
return HttpResponseRedirect('https:' + url[5:])
return None
def process_response(self, request, response):
if request.is_secure():
# assuming full session info (as the conn. is secure)
try:
user = request.user
except AttributeError: # no user - ajax or other special request
return response
if user.is_authenticated():
if not self.cookie_correct(request):
expiry = None if request.session.get_expire_at_browser_close() else request.session.get_expiry_date()
response.set_cookie(self.cookie_name, value=self.cookie_value, expires=expiry, secure=False)
else:
if self.cookie_name in request.COOKIES:
response.delete_cookie(self.cookie_name)
return response
class vzhled:
def process_request(self, request):
return None
def process_view(self, request, view_func, view_args, view_kwargs):
#print "====== process_request ======"
#print view_func
#print view_args
#print view_kwargs
#print "============================="
return None
def process_template_response(self, request, response):
hodin = datetime.now().hour
if (hodin <= 6) or (hodin >= 14): # TODO 20
response.context_data['noc'] = True
else:
response.context_data['noc'] = False
return response
def process_response(self, request, response):
#hodin = datetime.now().hour
#if (hodin <= 6) or (hodin >= 14): # TODO 20
#response.context_data['noc'] = True
#else:
#response.context_data['noc'] = False
return response
##def process_exception(request, exception):
#pass

View file

@ -54,7 +54,7 @@ SESSION_EXPIRE_AT_BROWSER_CLOSE = True
DOBA_ODHLASENI_PRI_ZASKRTNUTI_NEODHLASOVAT = 365 * 24 * 3600 # rok
# View pro chybu s CSRF tokenem (např. se sušenkami)
CSRF_FAILURE_VIEW = 'various.views.csrf_error'
CSRF_FAILURE_VIEW = 'various.views.csrf.csrf_error'
# Modules configuration
@ -68,9 +68,6 @@ MIDDLEWARE = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
# FIXME: rozbilo se při přechodu na Django 2.0, nevím, jestli
# se to dá zahodit bez náhrady
# 'mamweb.middleware.LoggedInHintCookieMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
@ -90,6 +87,7 @@ TEMPLATES = [
'header_fotky.context_processors.vzhled',
'various.context_processors.rozliseni',
'various.context_processors.april',
'various.context_processors.halloween',
)
},
},
@ -112,8 +110,7 @@ INSTALLED_APPS = (
'reversion',
'django_countries',
'solo',
'ckeditor',
'ckeditor_uploader',
'django_ckeditor_5',
'taggit',
'dal',
'dal_select2',
@ -134,6 +131,7 @@ INSTALLED_APPS = (
# MaMweb
'mamweb',
'seminar',
'tvorba',
'galerie',
'korektury',
'prednasky',
@ -187,26 +185,98 @@ SUMMERNOTE_CONFIG = {
]
}
CKEDITOR_UPLOAD_PATH = "uploads/"
CKEDITOR_IMAGE_BACKEND = 'pillow'
#CKEDITOR_JQUERY_URL = '//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'
CKEDITOR_CONFIGS = {
CKEDITOR_5_CUSTOM_CSS = "css/ckeditor5_fix.css"
# customColorPalette = [
# {
# 'color': 'hsl(4, 90%, 58%)',
# 'label': 'Red',
# },
# {
# 'color': 'hsl(340, 82%, 52%)',
# 'label': 'Pink',
# },
# {
# 'color': 'hsl(291, 64%, 42%)',
# 'label': 'Purple',
# },
# {
# 'color': 'hsl(262, 52%, 47%)',
# 'label': 'Deep Purple',
# },
# {
# 'color': 'hsl(231, 48%, 48%)',
# 'label': 'Indigo',
# },
# {
# 'color': 'hsl(207, 90%, 54%)',
# 'label': 'Blue',
# },
# ]
CKEDITOR_5_FILE_STORAGE = "various.storage.UploadStorage"
CKEDITOR_5_CONFIGS = {
'default': {
'entities': False,
'toolbar': [
['Source', 'ShowBlocks', '-', 'Maximize'],
['Bold', 'Italic', 'Subscript', 'Superscript', '-', 'RemoveFormat'],
['NumberedList','BulletedList','-','Blockquote','-','JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'],
['Link', 'Unlink', 'Anchor', '-', 'Image', 'Table', 'HorizontalRule'],
['Format'],
'language': 'cs',
'blockToolbar': [
'paragraph', 'heading1', 'heading2', 'heading3',
'|',
'bulletedList', 'numberedList',
'|',
'blockQuote',
],
# 'toolbar': 'full',
'height': '40em',
'width': '100%',
'toolbarStartupExpanded': False,
'allowedContent' : True,
'toolbar': ['sourceEditing', '|', 'heading', '|',
# 'outdent', 'indent', '|',
'bold', 'italic', 'link', 'underline', 'strikethrough',
'code',
# 'subscript', 'superscript',
# 'highlight',
'|', 'codeBlock', 'insertImage',
'bulletedList', 'numberedList', 'todoList', '|',
# 'blockQuote', '|',
# 'fontSize', 'fontFamily', 'fontColor', 'fontBackgroundColor',
# 'mediaEmbed',
'removeFormat',
# 'insertTable',
],
'image': {
'toolbar': ['imageTextAlternative', '|', 'imageStyle:alignLeft',
'imageStyle:alignRight', 'imageStyle:alignCenter', 'imageStyle:side', '|'],
'styles': [
'full',
'side',
'alignLeft',
'alignRight',
'alignCenter',
]
},
# 'table': {
# 'contentToolbar': [ 'tableColumn', 'tableRow', 'mergeTableCells',
# 'tableProperties', 'tableCellProperties' ],
# 'tableProperties': {
# 'borderColors': customColorPalette,
# 'backgroundColors': customColorPalette,
# },
# 'tableCellProperties': {
# 'borderColors': customColorPalette,
# 'backgroundColors': customColorPalette,
# }
# },
'heading' : {
'options': [
{ 'model': 'paragraph', 'title': 'Paragraph', 'class': 'ck-heading_paragraph' },
{ 'model': 'heading1', 'view': 'h1', 'title': 'Heading 1', 'class': 'ck-heading_heading1' },
{ 'model': 'heading2', 'view': 'h2', 'title': 'Heading 2', 'class': 'ck-heading_heading2' },
{ 'model': 'heading3', 'view': 'h3', 'title': 'Heading 3', 'class': 'ck-heading_heading3' },
]
},
},
'list': {
'properties': {
'styles': 'true',
'startIndex': 'true',
'reversed': 'true',
},
}
}
# Webpack loader
@ -280,11 +350,11 @@ LOGGING = {
'filters': ['Http404AsInfo'],
},
'seminar.prihlaska.form':{
'personalni.prihlaska.form':{
'handlers': ['console','registration_logfile'],
'level': 'INFO'
},
'seminar.prihlaska.problem':{
'personalni.prihlaska.problem':{
'handlers': ['console','mail_registration','registration_error_log'],
'level': 'INFO'
},
@ -343,10 +413,7 @@ SEMINAR_KONFERY_DIR = os.path.join('konfery')
KOREKTURY_PDF_DIR = os.path.join('korektury', 'pdf')
KOREKTURY_IMG_DIR = os.path.join('korektury', 'img')
CISLO_IMG_DIR = os.path.join('cislo', 'img')
# E-MAIL NOTIFICATIONS
POSLI_MAILOVOU_NOTIFIKACI = False
SOUSTREDENI_KONTAKTNICKY_DIR = os.path.join('soustredeni', 'kontaktnicky')

View file

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
import os.path
#
@ -70,5 +68,4 @@ LOGGING['handlers']['registration_error_log']['filename'] = '/home/mam-web/logs/
# E-MAIL NOTIFICATIONS
POSLI_MAILOVOU_NOTIFIKACI = True
LOCAL_TEST_PROD = "prod"

View file

@ -1,5 +1,3 @@
# -*- coding: utf-8 -*-
import os.path
#
@ -74,7 +72,6 @@ LOGGING['handlers']['registration_error_log']['filename'] = '/home/mam-web/logs/
FILE_UPLOAD_PERMISSIONS = 0o440
# Testování e-mailů
POSLI_MAILOVOU_NOTIFIKACI = True
EMAIL_BACKEND = 'various.mail_prefixer.PrefixingMailBackend'
# TODO Pouze na otestování testu… Zvolit konferu!
# XXX: Je to pole, protože implementační detail backendu.

12068
mamweb/static/bootstrap/css/bootstrap.css vendored Normal file

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

102
mamweb/static/css/base.css Normal file
View file

@ -0,0 +1,102 @@
@charset "utf-8"; /* vynuť utf-8 */
/* Obecné styly pro html tagy */
@font-face {
font-family: 'OpenSans';
src: url("../fonts/OpenSans/OpenSans-Regular.ttf");
font-weight: normal;
}
/* https://fontzone.net/font-details/qtghoulface-regular doplněný o diakritiku pomocí FontForge*/
@font-face {
font-family: 'GhoulFace';
src: url("../fonts/ghoul/ghoul.ttf");
font-weight: normal;
}
body {
font-size: 14px;
font-family: 'OpenSans';
background-color: var(--barva-pozadi);
min-height: 100%;
}
p {
/* zarovnání odstavců do bloku */
text-align: justify;
}
/**** NADPISY ****/
h1, h2, h3, h4 { color: var(--tmava-oranzova); }
h5, h6 { color: black; }
h1, h2, h3, h4, h5, h6 {
font-variant: small-caps;
font-weight: bold;
}
/* TODO: odlišit 1 a 2 */
h1 { font-size: 200%; }
h2 { font-size: 200%; }
h3 { font-size: 160%; }
h4 { font-size: 140%; }
h5 { font-size: 140%; }
h6 { font-size: 120%; }
h1 {
margin-top: 0;
}
/*****************/
/**** TLAČÍTKA ****/
a {
color: var(--tmava-oranzova);
text-decoration: none;
}
a:focus, a:hover, a:active {
color: var(--hlavni-oranzova);
}
.button {
margin: 10px 0 10px 0;
padding: 4px 0; /*vertikální centování textu*/
text-align: center;
background-color: var(--hlavni-oranzova);
color: var(--barva-pozadi);
font-size: 150%;
font-weight: bold;
font-variant: small-caps;
filter: drop-shadow(0px 5px 5px rgba(0, 0, 0, 0.4));
&:hover {
position: relative;
top: 2px;
left: 2px;
background-color: #df490e;
}
}
/******************/
/**** Další ****/
input[type="file"] {
max-width: 250px;
text-overflow: ellipsis;
}
/***************/
/**** Divné (aneb nevím, co bylo cílem) ****/
h1 a:hover {
text-decoration: none;
}
img {
filter: drop-shadow(0px 3px 3px rgba(0, 0, 0, 0.4));
max-width: 100%;
height: auto;
}
/*******************************************/

View file

@ -1,469 +0,0 @@
/*!
* Bootstrap v3.3.1 (http://getbootstrap.com)
* Copyright 2011-2014 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/
.btn-default,
.btn-primary,
.btn-success,
.btn-info,
.btn-warning,
.btn-danger {
text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
}
.btn-default:active,
.btn-primary:active,
.btn-success:active,
.btn-info:active,
.btn-warning:active,
.btn-danger:active,
.btn-default.active,
.btn-primary.active,
.btn-success.active,
.btn-info.active,
.btn-warning.active,
.btn-danger.active {
-webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
}
.btn-default .badge,
.btn-primary .badge,
.btn-success .badge,
.btn-info .badge,
.btn-warning .badge,
.btn-danger .badge {
text-shadow: none;
}
.btn:active,
.btn.active {
background-image: none;
}
.btn-default {
text-shadow: 0 1px 0 #fff;
background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);
background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));
background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-color: #dbdbdb;
border-color: #ccc;
}
.btn-default:hover,
.btn-default:focus {
background-color: #e0e0e0;
background-position: 0 -15px;
}
.btn-default:active,
.btn-default.active {
background-color: #e0e0e0;
border-color: #dbdbdb;
}
.btn-default:disabled,
.btn-default[disabled] {
background-color: #e0e0e0;
background-image: none;
}
.btn-primary {
background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);
background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));
background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-color: #245580;
}
.btn-primary:hover,
.btn-primary:focus {
background-color: #265a88;
background-position: 0 -15px;
}
.btn-primary:active,
.btn-primary.active {
background-color: #265a88;
border-color: #245580;
}
.btn-primary:disabled,
.btn-primary[disabled] {
background-color: #265a88;
background-image: none;
}
.btn-success {
background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);
background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));
background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-color: #3e8f3e;
}
.btn-success:hover,
.btn-success:focus {
background-color: #419641;
background-position: 0 -15px;
}
.btn-success:active,
.btn-success.active {
background-color: #419641;
border-color: #3e8f3e;
}
.btn-success:disabled,
.btn-success[disabled] {
background-color: #419641;
background-image: none;
}
.btn-info {
background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));
background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-color: #28a4c9;
}
.btn-info:hover,
.btn-info:focus {
background-color: #2aabd2;
background-position: 0 -15px;
}
.btn-info:active,
.btn-info.active {
background-color: #2aabd2;
border-color: #28a4c9;
}
.btn-info:disabled,
.btn-info[disabled] {
background-color: #2aabd2;
background-image: none;
}
.btn-warning {
background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));
background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-color: #e38d13;
}
.btn-warning:hover,
.btn-warning:focus {
background-color: #eb9316;
background-position: 0 -15px;
}
.btn-warning:active,
.btn-warning.active {
background-color: #eb9316;
border-color: #e38d13;
}
.btn-warning:disabled,
.btn-warning[disabled] {
background-color: #eb9316;
background-image: none;
}
.btn-danger {
background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));
background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-color: #b92c28;
}
.btn-danger:hover,
.btn-danger:focus {
background-color: #c12e2a;
background-position: 0 -15px;
}
.btn-danger:active,
.btn-danger.active {
background-color: #c12e2a;
border-color: #b92c28;
}
.btn-danger:disabled,
.btn-danger[disabled] {
background-color: #c12e2a;
background-image: none;
}
.thumbnail,
.img-thumbnail {
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
}
.dropdown-menu > li > a:hover,
.dropdown-menu > li > a:focus {
background-color: #e8e8e8;
background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
background-repeat: repeat-x;
}
.dropdown-menu > .active > a,
.dropdown-menu > .active > a:hover,
.dropdown-menu > .active > a:focus {
background-color: #2e6da4;
background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
background-repeat: repeat-x;
}
.navbar-default {
background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);
background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));
background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-radius: 4px;
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
}
.navbar-default .navbar-nav > .open > a,
.navbar-default .navbar-nav > .active > a {
background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));
background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);
background-repeat: repeat-x;
-webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
}
.navbar-brand,
.navbar-nav > li > a {
text-shadow: 0 1px 0 rgba(255, 255, 255, .25);
}
.navbar-inverse {
background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);
background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));
background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
}
.navbar-inverse .navbar-nav > .open > a,
.navbar-inverse .navbar-nav > .active > a {
background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);
background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));
background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);
background-repeat: repeat-x;
-webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
}
.navbar-inverse .navbar-brand,
.navbar-inverse .navbar-nav > li > a {
text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);
}
.navbar-static-top,
.navbar-fixed-top,
.navbar-fixed-bottom {
border-radius: 0;
}
@media (max-width: 767px) {
.navbar .navbar-nav .open .dropdown-menu > .active > a,
.navbar .navbar-nav .open .dropdown-menu > .active > a:hover,
.navbar .navbar-nav .open .dropdown-menu > .active > a:focus {
color: #fff;
background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
background-repeat: repeat-x;
}
}
.alert {
text-shadow: 0 1px 0 rgba(255, 255, 255, .2);
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
}
.alert-success {
background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));
background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
background-repeat: repeat-x;
border-color: #b2dba1;
}
.alert-info {
background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));
background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);
background-repeat: repeat-x;
border-color: #9acfea;
}
.alert-warning {
background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));
background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);
background-repeat: repeat-x;
border-color: #f5e79e;
}
.alert-danger {
background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));
background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);
background-repeat: repeat-x;
border-color: #dca7a7;
}
.progress {
background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));
background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);
background-repeat: repeat-x;
}
.progress-bar {
background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);
background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));
background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);
background-repeat: repeat-x;
}
.progress-bar-success {
background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);
background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));
background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);
background-repeat: repeat-x;
}
.progress-bar-info {
background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));
background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);
background-repeat: repeat-x;
}
.progress-bar-warning {
background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));
background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);
background-repeat: repeat-x;
}
.progress-bar-danger {
background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);
background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));
background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);
background-repeat: repeat-x;
}
.progress-bar-striped {
background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
}
.list-group {
border-radius: 4px;
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
}
.list-group-item.active,
.list-group-item.active:hover,
.list-group-item.active:focus {
text-shadow: 0 -1px 0 #286090;
background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);
background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a));
background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);
background-repeat: repeat-x;
border-color: #2b669a;
}
.list-group-item.active .badge,
.list-group-item.active:hover .badge,
.list-group-item.active:focus .badge {
text-shadow: none;
}
.panel {
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
}
.panel-default > .panel-heading {
background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
background-repeat: repeat-x;
}
.panel-primary > .panel-heading {
background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
background-repeat: repeat-x;
}
.panel-success > .panel-heading {
background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));
background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);
background-repeat: repeat-x;
}
.panel-info > .panel-heading {
background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));
background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);
background-repeat: repeat-x;
}
.panel-warning > .panel-heading {
background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));
background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);
background-repeat: repeat-x;
}
.panel-danger > .panel-heading {
background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));
background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);
background-repeat: repeat-x;
}
.well {
background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));
background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);
background-repeat: repeat-x;
border-color: #dcdcdc;
-webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,3 @@
.ck.ck-editor {
color: black !important; /* V tmavém módu zapomene CKEditor přepnout barvu textu. (Bílý text na bílém pozadí je best.) */
}

View file

@ -0,0 +1,18 @@
@charset "utf-8"; /* vynuť utf-8 */
/* Konstanty (převážně barvy) pro užití v dalších css */
:root {
--hlavni-oranzova: #e84e10;
--tmava-oranzova: #6f2509;
--svetla-oranzova: #f9d59e;
--svetlounka-oranzova: rgb(253, 237, 213);
--orgovska-fialova: #6a0043;
--orgovska-svetla-fialova: #eee4ec;
--resitelska-fialova: #f296b3;
--resitelska-svetla-fialova: #f2E5EF;
--barva-pozadi: #fffbf6;
}

View file

@ -0,0 +1,581 @@
@charset "utf-8"; /* vynuť utf-8 */
/* Rozložení webu a jeho prvky (hlavička, menu, footer) */
:root {
--footer-height: 200px;
--login-bar-height: 20px;
}
/**** KONTEJNER ****/
div.kontejner {/* Ne container, aby se to netlouklo s bootstrapem. */
width: 970px;
margin: auto;
min-height: 100vh;
position: relative;
padding: 0;
.org-logged-in & {
margin-top: var(--login-bar-height);
}
& div.kontent-wrapper {
padding-bottom: var(--footer-height);
& div.kontent {
padding: 15px 30px;
}
}
}
/* Roztáhne obsah z containeru na celou šířku obrazovky: */
.full_width {
width: 100vw;
margin-left: calc(-50vw + 485px);
/* Na úzkém displeji nechceme nic dělat. */
@media(max-width: 860px) {
margin-left: 0;
width: unset;
}
}
/*******************/
/**** HLAVIČKA ****/
#title { /*dělá blbosti šířka, je to kvůli fixed pozici, zatím natvrdo, vyřešit*/
height: 55px;
width: 970px;
position: fixed;
z-index: 2048;
background-color: var(--hlavni-oranzova);
filter: drop-shadow(0px 5px 5px rgba(0, 0, 0, 0.4));
font-size: 28px;
color: var(--barva-pozadi);
font-weight: 400;
font-variant: small-caps;
text-align: center;
text-decoration: none;
padding-top: 8px;
text-shadow: none;
}
#header {
position: relative;
background: url("../images/header/vikendovka.jpg") no-repeat center top; /* poměr 350:970, TODO: aby to nemuselo být přesně na pixely */
background-size: 100%;
top: 58px;
& img.logo {
width: 100%;
filter: drop-shadow(0px 5px 5px rgba(0, 0, 0, 0.4));
}
& img.logo-mobile {
display: none;
}
& .no-mobile {
background-size: contain;
}
}
/******************/
/**** Footer ****/
#footer {
position: absolute;
bottom: 0;
width: 100%;
background: url("../images/mozaika-footer.svg") no-repeat top center;
height: var(--footer-height);
background-size: 100%;
filter: drop-shadow(5px 0px 5px rgba(0, 0, 0, 0.4));
padding-top: 3.5%;
& p.license {
text-align: center;
font-weight: 400;
bottom: 0;
& a {
color: #333;
}
}
@media (max-width: 650px) {
display: none;
}
}
p.license-mobile {
display: none;
margin-bottom: 0;
@media (max-width: 650px) {
position: relative;
display: block;
font-size: 90%;
background-color: var(--hlavni-oranzova);
padding: 5%;
text-align: justify;
}
}
/****************/
/**** LOGIN BAR ****/
div.login-bar {
background: var(--orgovska-fialova);
color: var(--svetla-oranzova);
width: 100%;
position: fixed;
margin-top: calc(-1 * var(--login-bar-height));
min-height: var(--login-bar-height);
z-index: 4086;
padding-left: 5px;
padding-right: 5px;
& div {
display: inline;
}
& a.LOGIN-ref-admin {
display: inline;
color: var(--barva-pozadi);
}
& .LOGIN_napis-webarum {
display: inline;
color: var(--barva-pozadi);
float: right;
& a {
color: var(--svetla-oranzova);
text-decoration: underline;
}
}
}
/*******************/
/* stránka přes celý displej */
@media (max-width: 970px) {
div.kontejner {
width: 100%;
}
#title {
width: 100%;
text-align: center;
}
#header {
background-size: 100%;
& img.logo {
width: 100%;
}
}
#footer {
width: 100%;
}
}
/* malý tablet, mobil */
@media (max-width: 650px) {
#hide-if-small.login-bar-flatpage {
display: none;
}
#title {
display: none;
}
#header {
width: 100%;
top: 0;
background-image: none;
& img.logo {
display: none;
}
& img.logo-mobile {
display: block;
top: 0;
left: 0;
width: 100%;
filter: drop-shadow(0px 0 5px rgba(0, 0, 0, 0.4));
margin-bottom: 3px;
}
& .no-mobile{
display: none;
}
}
}
/**** MENU ****/
ul.menu_mobile {
display: none;
}
nav.nav-button {
display: none;
}
ul.menu {
width: 100%;
padding: 0;
margin-top: -5px; /* posune celé menu nahoru (pak potřeba zvětšit mezeru mezi menu a submenu) */
font-variant: small-caps;
& a {
text-decoration: none;
font-weight: bold;
font-size: 105%;
}
& li {
margin: 0;
display: inline-block;
width: 16.666667%;
text-align: center;
font-size: 140%;
font-weight: 400;
&>a:hover, &>a:active {
color: black;
}
&.active>a {
color: var(--svetla-oranzova);
}
}
& ul.submenu {
background-color: var(--hlavni-oranzova);
margin-top: 10px; /* mezera mezi hlavním menu a submenu */
margin-bottom: 10px;
padding-top: 10px;
padding-bottom: 5px;
filter: drop-shadow(0px 5px 5px rgba(0, 0, 0, 0.4));
z-index: 50;
font-weight: 400;
& li {
width: auto;
padding: 0 20px 0 20px;
display: inline-block;
&>a {
color: var(--svetla-oranzova);
text-decoration: none;
text-shadow: none;
&:hover {
color: black;
}
}
}
}
& ul.submenu li.active>a, & .parentactive ul li:first-child>a {
color: black;
}
}
@media (max-width: 970px) {
ul.menu {
font-size: 90%;
margin-top: -7px;
& li {
margin-top: 10px; /* posunutí textu hlavního menu níže */
}
}
ul.submenu {
margin-top: 8px; /* mezera mezi hlavním menu a submenu */
& li {
margin-top: 0; /* aby se spolu s textem hlavního menu neposunoval níže i text submenu */
}
}
}
@media(max-width: 800px) {
ul.menu {
font-size: 80%;
margin-top: -2px;
& li {
margin-top: 10px; /* posunutí textu hlavního menu níže */
}
}
ul.submenu {
margin-top: 8px; /* mezera mezi hlavním menu a submenu */
& li {
margin-top: 0; /* aby se spolu s textem hlavního menu neposunoval níže i text submenu */
}
}
}
@media (max-width: 650px) {
ul.menu {
display: none;
}
ul.menu_mobile {
display: block;
z-index: 10;
position: sticky;
font-variant: small-caps;
font-size: 150%;
font-weight: bold;
list-style-type: none;
padding-top: 3px;
padding-bottom: 3px;
padding-left: 12px;
& a {
&:active, &:hover, &:focus {
text-decoration: none;
color: black;
}
}
& ul {
list-style-type: none;
font-size: 90%;
color: black; /*černé šipky submenu*/
& li {
&>a {
color: black;
}
&::before {
content: ' \276D '; /*https://www.w3schools.com/cssref/css_entities.asp*/
}
}
}
& br {
display: none;
}
}
nav.nav-button {
display: block;
position: sticky;
position: -webkit-sticky;
top: 0;
z-index: 10;
}
#navbar-content {
background-color: var(--hlavni-oranzova);
}
button.navbar-button {
color: #f9d59e;
background-color: var(--hlavni-oranzova);
font-variant: small-caps;
font-size: 160%;
border-radius: 0;
border-width: 0;
width: 100%;
text-align: right;
}
button.navbar-button span::after {
content: ' \2261 ';
font-size: 120%;
}
li.dropdown div.submenu_mobile {
display: none;
--bs-dropdown-bg: var(--hlavni-oranzova);
}
li.dropdown div.submenu_mobile.show {
display: block;
}
} /* konec @media */
/**************/
/**** ROZLIŠENÍ MEZI LOKÁLNÍM, TESTOVACÍM A PRODUKČNÍM WEBEM ****/
body.localweb, body.testweb, body.suprodweb {
&:before, &:after {
content: "";
position: fixed;
width: 20px;
height: 100%;
top: 0;
z-index: -1000;
}
&:before { left: 0; }
&:after { right: 0; }
}
body.localweb { &:before, &:after { background: greenyellow; } }
body.testweb { &:before, &:after { background: darkorange; } }
body.suprodweb { &:before, &:after { background: red; } }
/****************************************************************/
/**** ZBYTEK ****/
/* (konkrétní stránky) */
/* Titulní stránka */
.titulnistrana {
display: flex;
text-align: justify;
@media(max-width: 800px){
display: block;
}
& h1 { text-align: center; }
& .TITULNI_STRANA_zjistit_vic{
text-align: center;
margin-bottom: 30px;
& hr {
display: none;
@media(max-width: 800px){
display: flex;
}
}
}
& .TITULNI_STRANA_graf {
@media(max-width: 800px) {
padding-top: 40px;
}
& .TITULNI_STRANA_graf-svg {
display: flex;
& #svg-graf {
width: 100%;
height: auto;
margin: 30px;
@media(max-width: 800px){
max-width: 500px;
padding: 10px;
margin: auto;
}
}
}
}
& .TITULNI_STRANA_obsah {
width: 66%;
@media(max-width: 800px){
width: 100%;
}
}
& .TITULNI_STRANA_vitej_titulka, & .TITULNI_STRANA_temata_titulka {
width: 49%;
padding: 10px;
display: table-cell;
@media (max-width: 650px) {
width: 100%;
display: block;
}
}
& .TITULNI_STRANA_novinky {
width: 33%;
padding: 10px;
@media(max-width: 800px){
width: 100%;
max-width: 500px;
margin: auto;
}
}
}
div.org-text {
font-style: italic;
}
div.odpocet {
margin: 20px;
text-align: center;
}
/* Stránky Aktuální ročník */
.stranka_aktualni_zadani {
text-align: center;
& #AKTUALNI_ZADADNI_obrazek {
margin-top: 15px;
}
& div.AKTUALNI_ZADANI_termin {
text-align: center;
font-size: large;
font-weight: bold;
@media (max-width: 420px) {
font-size: small;
}
& .AKTUALNI_ZADANI_datum {
color: var(--hlavni-oranzova);
margin: 0;
}
}
}
#obrazek_cisla_archiv {
text-align: center;
margin: 10px;
}
/* Stránka Jak řešit */
.jakresit svg {
width: 33%;
padding: 10px;
filter: none;
@media(max-width: 860px) {
margin: auto;
display: grid;
width: 100%;
max-width: 360px;
}
}

View file

@ -1,38 +0,0 @@
/*
.pink {
background-color: #ffc0cb;
}
div.borderized {
border-style: solid;
border-radius: 5px;
padding: 5px;
padding-right: 20px;
}
div.tnmenu {
float: right;
margin-right: 0px;
}
div.parent {
border-width: 2px;
}
div.children {
border-width: 1px;
}
div.node_type {
background-color: #d4d4d4;
}
.hidden-tn {
display: none;
}
/*test*/
h1 {
color: chartreuse;
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,731 @@
@charset "utf-8"; /* vynuť utf-8 */
@supports (-webkit-touch-callout: none) and (not (offset-position: normal)) {
.button {
margin: 10px 0 10px 0;
padding: 4px 0; /*vertikální centování textu*/
text-align: center;
background-color: var(--hlavni-oranzova);
color: var(--barva-pozadi);
font-size: 150%;
font-weight: bold;
font-variant: small-caps;
filter: drop-shadow(0px 5px 5px rgba(0, 0, 0, 0.4));
}
.button:hover {
position: relative;
top: 2px;
left: 2px;
background-color: #df490e;
}
/******************/
/* Rozložení webu a jeho prvky (hlavička, menu, footer) */
/**** KONTEJNER ****/
div.kontejner { /* Ne container, aby se to netlouklo s bootstrapem. */
width: 970px;
margin: auto;
min-height: 100vh;
position: relative;
padding: 0;
}
.org-logged-in div.kontejner {
margin-top: var(--login-bar-height);
}
div.kontejner div.kontent-wrapper {
padding-bottom: var(--footer-height);
}
div.kontejner div.kontent-wrapper div.kontent {
padding: 15px 30px;
}
/* Roztáhne obsah z containeru na celou šířku obrazovky: */
.full_width {
width: 100vw;
margin-left: calc(-50vw + 485px);
}
/* Na úzkém displeji nechceme nic dělat. */
@media(max-width: 860px) {
.full_width {
margin-left: 0;
width: unset;
}
}
/*******************/
/**** HLAVIČKA ****/
#header {
position: relative;
background: url("../images/header/vikendovka.jpg") no-repeat center top; /* poměr 350:970, TODO: aby to nemuselo být přesně na pixely */
background-size: 100%;
top: 58px;
}
#header img.logo {
width: 100%;
filter: drop-shadow(0px 5px 5px rgba(0, 0, 0, 0.4));
}
#header img.logo-mobile {
display: none;
}
#header .no-mobile {
background-size: contain;
}
/******************/
/**** Footer ****/
#footer {
position: absolute;
bottom: 0;
width: 100%;
background: url("../images/mozaika-footer.svg") no-repeat top center;
height: var(--footer-height);
background-size: 100%;
filter: drop-shadow(5px 0px 5px rgba(0, 0, 0, 0.4));
padding-top: 3.5%;
}
#footer p.license {
text-align: center;
font-weight: 400;
bottom: 0;
}
#footer p.license a {
color: #333;
}
@media (max-width: 650px) {
#footer {
display: none;
}
}
p.license-mobile {
display: none;
margin-bottom: 0;
}
@media (max-width: 650px) {
p.license-mobile {
position: relative;
display: block;
font-size: 90%;
background-color: var(--hlavni-oranzova);
padding: 5%;
text-align: justify;
}
}
/****************/
/**** LOGIN BAR ****/
div.login-bar {
background: var(--orgovska-fialova);
color: var(--svetla-oranzova);
width: 100%;
position: fixed;
margin-top: calc(-1 * var(--login-bar-height));
min-height: var(--login-bar-height);
z-index: 4086;
padding-left: 5px;
padding-right: 5px;
}
div.login-bar div {
display: inline;
}
div.login-bar a.LOGIN-ref-admin {
display: inline;
color: var(--barva-pozadi);
}
div.login-bar .LOGIN_napis-webarum {
display: inline;
color: var(--barva-pozadi);
float: right;
}
div.login-bar .LOGIN_napis-webarum a {
color: var(--svetla-oranzova);
text-decoration: underline;
}
/*******************/
/* stránka přes celý displej */
@media (max-width: 970px) {
#header {
background-size: 100%;
}
#header img.logo {
width: 100%;
}
}
/* malý tablet, mobil */
@media (max-width: 650px) {
#header {
width: 100%;
top: 0;
background-image: none;
}
#header img.logo {
display: none;
}
#header img.logo-mobile {
display: block;
top: 0;
left: 0;
width: 100%;
filter: drop-shadow(0px 0 5px rgba(0, 0, 0, 0.4));
margin-bottom: 3px;
}
#header .no-mobile{
display: none;
}
}
/**** MENU ****/
ul.menu {
width: 100%;
padding: 0;
margin-top: -5px; /* posune celé menu nahoru (pak potřeba zvětšit mezeru mezi menu a submenu) */
font-variant: small-caps;
}
ul.menu a {
text-decoration: none;
font-weight: bold;
font-size: 105%;
}
ul.menu li {
margin: 0;
display: inline-block;
width: 16.666667%;
text-align: center;
font-size: 140%;
font-weight: 400;
}
ul.menu li >a:hover, >a:active {
color: black;
}
ul.menu li.active>a {
color: var(--svetla-oranzova);
}
ul.menu ul.submenu {
background-color: var(--hlavni-oranzova);
margin-top: 10px; /* mezera mezi hlavním menu a submenu */
margin-bottom: 10px;
padding-top: 10px;
padding-bottom: 5px;
filter: drop-shadow(0px 5px 5px rgba(0, 0, 0, 0.4));
z-index: 50;
font-weight: 400;
}
ul.menu ul.submenu li {
width: auto;
padding: 0 20px 0 20px;
display: inline-block;
}
ul.menu ul.submenu li >a {
color: var(--svetla-oranzova);
text-decoration: none;
text-shadow: none;
}
ul.menu ul.submenu li >a :hover {
color: black;
}
ul.menu ul.submenu li.active>a, .parentactive ul li:first-child>a {
color: black;
}
@media (max-width: 970px) {
ul.menu {
font-size: 90%;
margin-top: -7px;
}
ul.menu li {
margin-top: 10px; /* posunutí textu hlavního menu níže */
}
ul.submenu {
margin-top: 8px; /* mezera mezi hlavním menu a submenu */
}
ul.submenu li {
margin-top: 0; /* aby se spolu s textem hlavního menu neposunoval níže i text submenu */
}
}
@media(max-width: 800px) {
ul.menu {
font-size: 80%;
margin-top: -2px;
}
ul.menu li {
margin-top: 10px; /* posunutí textu hlavního menu níže */
}
ul.submenu {
margin-top: 8px; /* mezera mezi hlavním menu a submenu */
}
ul.submenu li {
margin-top: 0; /* aby se spolu s textem hlavního menu neposunoval níže i text submenu */
}
}
@media (max-width: 650px) {
ul.menu {
display: none;
}
ul.menu_mobile {
display: block;
z-index: 10;
position: sticky;
font-variant: small-caps;
font-size: 150%;
font-weight: bold;
list-style-type: none;
padding-top: 3px;
padding-bottom: 3px;
padding-left: 12px;
}
ul.menu_mobile a:active, ul.menu_mobile a:hover, ul.menu_mobile a:focus {
text-decoration: none;
color: black;
}
ul.menu_mobile ul {
list-style-type: none;
font-size: 90%;
color: black; /*černé šipky submenu*/
}
ul.menu_mobile ul li > a {
color: black;
}
ul.menu_mobile ul li::before {
content: ' \276D '; /*https://www.w3schools.com/cssref/css_entities.asp*/
}
ul.menu_mobile br {
display: none;
}
} /* konec @media */
/**************/
/**** ZBYTEK ****/
/* (konkrétní stránky) */
/* Titulní stránka */
.titulnistrana {
display: flex;
text-align: justify;
@media(max-width: 800px){
.titulnistrana {
display: block;
}
}
.titulnistrana h1 { text-align: center; }
.titulnistrana .TITULNI_STRANA_zjistit_vic {
text-align: center;
margin-bottom: 30px;
}
.titulnistrana .TITULNI_STRANA_zjistit_vic hr {
display: none;
}
@media(max-width: 800px){
.titulnistrana .TITULNI_STRANA_zjistit_vic hr {
display: flex;
}
}
@media(max-width: 800px) {
.titulnistrana .TITULNI_STRANA_graf {
padding-top: 40px;
}
}
.titulnistrana .TITULNI_STRANA_graf .TITULNI_STRANA_graf-svg {
display: flex;
}
.titulnistrana .TITULNI_STRANA_graf .TITULNI_STRANA_graf-svg #svg-graf {
width: 100%;
height: auto;
margin: 30px;
}
@media(max-width: 800px){
.titulnistrana .TITULNI_STRANA_graf .TITULNI_STRANA_graf-svg #svg-graf {
max-width: 500px;
padding: 10px;
margin: auto;
}
}
.titulnistrana .TITULNI_STRANA_obsah {
width: 66%;
}
@media(max-width: 800px){
.titulnistrana .TITULNI_STRANA_obsah {
width: 100%;
}
}
.titulnistrana .TITULNI_STRANA_vitej_titulka, .TITULNI_STRANA_temata_titulka {
width: 49%;
padding: 10px;
display: table-cell;
}
@media (max-width: 650px) {
.titulnistrana .TITULNI_STRANA_vitej_titulka, .TITULNI_STRANA_temata_titulka {
width: 100%;
display: block;
}
}
.titulnistrana .TITULNI_STRANA_novinky {
width: 33%;
padding: 10px;
}
@media(max-width: 800px){
.titulnistrana .TITULNI_STRANA_novinky {
width: 100%;
max-width: 500px;
margin: auto;
}
}
/* Stránky Aktuální ročník */
.stranka_aktualni_zadani {
text-align: center;
}
.stranka_aktualni_zadani #AKTUALNI_ZADADNI_obrazek {
margin-top: 15px;
}
.stranka_aktualni_zadani div.AKTUALNI_ZADANI_termin {
text-align: center;
font-size: large;
font-weight: bold;
}
@media (max-width: 420px) {
.stranka_aktualni_zadani div.AKTUALNI_ZADANI_termin {
font-size: small;
}
}
.stranka_aktualni_zadani .AKTUALNI_ZADANI_datum {
color: var(--hlavni-oranzova);
margin: 0;
}
}
/* Stránka Jak řešit */
.jakresit svg {
width: 33%;
padding: 10px;
filter: none;
}
@media(max-width: 860px) {
.jakresit svg {
margin: auto;
display: grid;
width: 100%;
max-width: 360px;
}
}
/**** OZNAČENÍ NE-PUBLIC ČÁSTÍ ****/
.mam-org-only {
background: var(--orgovska-svetla-fialova);
padding: 10px;
margin: 10px -10px;
border: var(--orgovska-fialova) 2px dashed;
}
.mam-org-only .mam-org-only {
border: 0;
}
.mam-org-only li {
padding: 3px 0;
margin: -2px 0;
}
/**********************************/
/**** OTÁČECÍ KARTY ****/
/* (orgové, archiv) */
.flip-card {
perspective: 1000px; /* Remove this if you don't want the 3D effect */
margin-left: auto;
margin-right: auto;
}
/* This container is needed to position the front and back side */
.flip-card .flip-card-inner {
position: relative;
width: 100%;
height: 100%;
transition: transform 0.8s;
transform-style: preserve-3d;
}
/* Do an horizontal flip when you move the mouse over the flip box container */
.flip-card:hover .flip-card-inner {
transform: rotateY(180deg);
}
/* Position the front and back side */
.flip-card .flip-card-front, .flip-card-back {
position: absolute;
width: 100%;
height: 100%;
-webkit-backface-visibility: hidden; /* Safari */
backface-visibility: hidden;
}
.flip-card div.flip-card-foto, div.flip-card-foto img {
width: 100%;
height: 100%;
/* Pokud je na přední straně něco proklikávacího (třeba celá fotka), tak na dotykových zařízeních nemůže proklikávat, aby se dalo otáčet */
@media(hover: none) {
.flip-card div.flip-card-foto, div.flip-card-foto img a { pointer-events: none; }
}
/* Style the back side */
.flip-card-back {
transform: rotateY(180deg);
padding: 10px;
padding-top: 20px;
}
}
/***********************/
/**** TABULKY ****/
/** Tabulka s čárami mezi sloupci **/
/* Např. výsledkovky */
.tabulka_oramovane_sloupce {
border: solid 2px;
}
.tabulka_oramovane_sloupce td:first-child, .tabulka_oramovane_sloupce th:first-child {
border-left: none;
border-right: solid 1px;
}
.tabulka_oramovane_sloupce td:nth-child(2), .tabulka_oramovane_sloupce th:nth-child(2) {
border-left: none;
}
.tabulka_oramovane_sloupce td, .tabulka_oramovane_sloupce th {
padding: 0.1em 0.3em;
border-left: solid 1px;
}
.tabulka_oramovane_sloupce thead th, .tabulka_oramovane_sloupce thead td {
border-bottom: solid 1px;
}
/***********************************/
/** Tabulka se střídajícími se barvami řádků **/
/* Skoro jakákoliv tabulka kromě výsledkovek */
.barevna_tabulka td th {
padding: 1px 10px 1px 10px;
}
.barevna_tabulka tbody tr:nth-child(even), thead tr {
background: var(--svetlounka-oranzova);
}
.barevna_tabulka tbody tr:nth-child(odd) {
background: var(--barva-pozadi);
}
/**********************************************/
/** Tabulka, kde první řádek a sloupec je pořád vidět **/
/* Např. tabulka odevzdaných řešení, nebo výsledkovky */
.tabulka_s_uchycenym_radkem_a_sloupcem {
/* Omezí výšku a šířku, aby bylo příjemné na scrollování a zapne scrollování */
display: block;
width: fit-content; /* display: block; roztahuje na celou šířku */
max-height: 80vh;
overflow: auto;
max-width: 90%; /* (FIXME asi není potřeba u tabulek, co nejsou na celou obrazovku) */
margin-left: 5%; /* Vystředování (FIXME není potřeba u tabulek, co nejsou na celou obrazovku) */
border-collapse: separate; /* Pokud má tabulka orámování, je potřeba ho separovat, aby dodrželo position: sticky; */
border-spacing: 0;
}
/* Uchytí první řádek */
.tabulka_s_uchycenym_radkem_a_sloupcem thead tr {
position: sticky;
top: 0;
z-index: 2;
}
/* Uchytí první sloupec */
.tabulka_s_uchycenym_radkem_a_sloupcem td:first-child, .tabulka_s_uchycenym_radkem_a_sloupcem th:first-child {
position: sticky;
left: 0;
background: inherit; /* (Snad) zneprůhlední první sloupec */
z-index: 1;
}
/*******************************************************/
/** Tabulka mající všechna ohraničení **/
.plne_ohranicena_tabulka {
border-collapse: collapse;
}
.plne_ohranicena_tabulka tr th, .plne_ohranicena_tabulka tr td {
border: 1px solid black;
padding: 1px 10px 1px 10px;
}
/***************************************/
/** Výsledkovky **/
.vysledkovka, .tabulka_oramovane_sloupce td:first-child, .vysledkovka, .tabulka_oramovane_sloupce th:first-child { position: unset; }
.vysledkovka, .tabulka_oramovane_sloupce td:nth-child(2), .vysledkovka, .tabulka_oramovane_sloupce th:nth-child(2) {
border-right: solid 1px;
position: sticky;
left: 0;
background: inherit; /* (Snad) zneprůhlední druhý sloupec */
z-index: 1;
}
.vysledkovka, .tabulka_oramovane_sloupce td:nth-child(3), .vysledkovka, .tabulka_oramovane_sloupce th:nth-child(3) {
border-left: none;
}
/*****************/
/** Tabulka mých (řešitelových) řešení **/
.moje_reseni tr th, .moje_reseni tr td {
text-align: center;
}
.moje_reseni tr td.problem { text-align: left; }
/****************************************/
/** Detail řešení **/
.bodovani>input {
width: 4em;
}
.bodovani>input::placeholder {
color: lightgray;
opacity: 1;
}
.bodovani>input::-webkit-input-placeholder { /* Edge */
color: lightgray;
}
/*******************/
/*****************/
.novinka .novinka_obrazek {
margin: 10px 0 10px 0;
width: 100%;
}
.novinka .novinka_datum {
font-weight: bold;
}
.novinka .novinka_autor {
text-align: right;
font-style: italic;
}
/**** FORMULÁŘE ****/
div.gdpr {
font-size: 6pt;
}
div.gdpr p {
font-size: 6pt;
margin-bottom: .66em;
}
/*******************/
}

View file

@ -0,0 +1,507 @@
@charset "utf-8"; /* vynuť utf-8 */
/* Bloky použité na webu */
.horizonatlni_scrollovani { overflow-x: auto; }
/* Používá se pro podproblémy ve výsledkovkách -- zesvětlí se daný sloupec */
.zesvetleni { color: gray; }
/**** OZNAČENÍ NE-PUBLIC ČÁSTÍ ****/
.mam-org-only {
background: var(--orgovska-svetla-fialova);
padding: 10px;
margin: 10px -10px;
border: var(--orgovska-fialova) 2px dashed;
& .mam-org-only {
/* Vnitřní rámečky mají být taky vidět */
border-width: 1px;
background-color: rgba(0, 0, 0, 0.06);
}
& li {
padding: 3px 0;
margin: -2px 0;
}
}
.mam-resitel-only {
background: var(--resitelska-svetla-fialova);
padding: 10px;
margin: 10px -10px;
border: var(--resitelska-fialova) 2px dashed;
& .mam-resitel-only {
/* Vnitřní rámečky mají být taky vidět */
border-width: 1px;
background-color: rgba(0, 0, 0, 0.06);
}
& li {
padding: 3px 0;
margin: -2px 0;
}
}
/**********************************/
/**** ZAŠKRTÁVÁTKO ****/
/* Select2 používaný hlavně multiple selectem. Přidání checkboxů a změna barvy. */
/* Podle https://stackoverflow.com/a/48290544 */
/* U autocomplete.ModelSelect2Multiple vyžaduje 'data-dropdown-css-class': 's2m-se-zaskrtavatky' */
.s2m-se-zaskrtavatky .select2-results__option[aria-selected=true]:before {
content: '☑ ';
padding: 0 0 0 8px;
}
.s2m-se-zaskrtavatky .select2-results__option[aria-selected=false]:before {
content: '◻ ';
padding: 0 0 0 8px;
}
/* Oranžové zvýraznění v Select2 */
.select2-results__option--highlighted {
background-color: var(--hlavni-oranzova) !important;
}
/**********************/
/**** OTÁČECÍ KARTY ****/
/* (orgové, archiv) */
.flip-card {
perspective: 1000px; /* Remove this if you don't want the 3D effect */
margin-left: auto;
margin-right: auto;
/* This container is needed to position the front and back side */
& .flip-card-inner {
position: relative;
width: 100%;
height: 100%;
transition: transform 0.8s;
transform-style: preserve-3d;
}
/* Do an horizontal flip when you move the mouse over the flip box container */
&:hover .flip-card-inner {
transform: rotateY(180deg);
}
/* Position the front and back side */
& .flip-card-front, & .flip-card-back {
position: absolute;
width: 100%;
height: 100%;
-webkit-backface-visibility: hidden; /* Safari */
backface-visibility: hidden;
}
& div.flip-card-foto, & div.flip-card-foto img {
width: 100%;
height: 100%;
/* Pokud je na přední straně něco proklikávacího (třeba celá fotka), tak na dotykových zařízeních nemůže proklikávat, aby se dalo otáčet */
@media(hover: none) {
& a { pointer-events: none; }
}
}
/* Style the back side */
& .flip-card-back {
transform: rotateY(180deg);
padding: 10px;
padding-top: 20px;
}
}
.flip-card-back {
background-color: var(--svetla-oranzova);
color: black;
}
.otaceci_cisla .flip-card-back {
background-color: white;
color: unset;
}
/* Otáčecí karta musí mít kolem sebe nějaké místo a mívá nějaký nadpis */
.flip_card_container {
display: inline-block;
width: 30%;
min-width: 300px;
text-align: center;
}
/** Jednotlivá použití **/
.seznam_orgu, .seznam_archiv, .rozcestnik_temat {
text-align: center; /* zarovná karty na střed */
}
.seznam_orgu .flip-card {
width: 200px;
height: 250px;
}
.seznam_orgu .flip_card_container h3 {
margin-bottom: 0;
}
.seznam_archiv .flip-card {
width: 210px;
height: 298px;
}
.cisla-v-rocniku .flip-card {
width: 144px;
height: 205px;
}
.cisla-v-rocniku .flip_card_container {
width: 15%;
min-width: 165px;
padding: 10px;
}
.rozcestnik_temat .flip-card {
width: 300px;
height: 300px;
}
.rozcestnik_temat .flip_card_container {
width: 40%;
min-width: 350px;
padding-bottom: 20px;
}
/************************/
/* karty archiv */
div.popis_rocniku {
text-align: left;
font-weight: bold;
margin: 20px;
}
div.popis_rocniku a, div.cislo_odkazy a {
font-weight: bold;
color: unset;
}
div.popis_rocniku a:hover,
div.cislo_odkazy a:hover {
color: var(--tmava-oranzova);
}
div.cislo_odkazy ul {
margin: 0;
padding: 0;
}
/* karty orgů */
div.org_email {
margin-bottom: 10px;
font-weight: bold;
}
/***********************/
/**** TABULKY ****/
/** Tabulka s čárami mezi sloupci **/
/* Např. výsledkovky */
.tabulka_oramovane_sloupce {
border: solid 2px;
& td, & th {
&:first-child, &:first-child {
border-left: none;
border-right: solid 1px;
}
&:nth-child(2), &:nth-child(2) {
border-left: none;
}
padding: 0.1em 0.3em;
border-left: solid 1px;
}
& thead { & th, & td {
border-bottom: solid 1px;
} }
}
/***********************************/
/** Tabulka se střídajícími se barvami řádků **/
/* Skoro jakákoliv tabulka kromě výsledkovek */
.barevna_tabulka {
& td th {
padding: 1px 10px 1px 10px;
}
& tbody tr:nth-child(even), & thead tr {
background: var(--svetlounka-oranzova);
}
& tbody tr:nth-child(odd) {
background: var(--barva-pozadi);
}
}
/**********************************************/
/** Tabulka, kde první řádek a sloupec je pořád vidět **/
/* Např. tabulka odevzdaných řešení, nebo výsledkovky */
.tabulka_s_uchycenym_radkem_a_sloupcem {
/* Omezí výšku a šířku, aby bylo příjemné na scrollování a zapne scrollování */
display: block;
width: fit-content; /* display: block; roztahuje na celou šířku */
max-height: 80vh;
overflow: auto;
max-width: 90%; /* (FIXME asi není potřeba u tabulek, co nejsou na celou obrazovku) */
margin-left: 5%; /* Vystředování (FIXME není potřeba u tabulek, co nejsou na celou obrazovku) */
border-collapse: separate; /* Pokud má tabulka orámování, je potřeba ho separovat, aby dodrželo position: sticky; */
border-spacing: 0;
/* Uchytí první řádek */
& thead tr {
position: sticky;
top: 0;
z-index: 2;
}
/* Uchytí první sloupec */
& td, & th { &:first-child {
position: sticky;
left: 0;
background: inherit; /* (Snad) zneprůhlední první sloupec */
z-index: 1;
} }
}
/* (Snad) zneprůhlednění prvního řádku (a sloupce) FIXME: tohle je trochu hack a potenciálně může něco rozbít */
.tabulka_s_uchycenym_radkem_a_sloupcem,
.tabulka_s_uchycenym_radkem_a_sloupcem thead,
.tabulka_s_uchycenym_radkem_a_sloupcem tbody,
.tabulka_s_uchycenym_radkem_a_sloupcem tr,
.kontejner,
.kontent-wrapper,
.kontent
{
background: inherit;
}
/*******************************************************/
/** Tabulka mající všechna ohraničení **/
.plne_ohranicena_tabulka {
border-collapse: collapse;
& tr { & th, & td {
border: 1px solid black;
padding: 1px 10px 1px 10px;
} }
}
/***************************************/
/** Tabulka odevzdaných a došlých řešení **/
.tabulka_doslych_reseni td {
min-width: 8em; /* Nastřeleno, aby se řádky s řešeními nezalamovaly. */
}
/******************************************/
/** Výsledkovky **/
.vysledkovka, .tabulka_oramovane_sloupce {
& td, & th {
&:first-child { position: unset; }
&:nth-child(2) {
border-right: solid 1px;
position: sticky;
left: 0;
background: inherit; /* (Snad) zneprůhlední druhý sloupec */
z-index: 1;
}
&:nth-child(3) {
border-left: none;
}
}
}
/*****************/
/** Tabulka mých (řešitelových) řešení **/
.moje_reseni tr {
& th, & td {
text-align: center;
}
& td.problem { text-align: left; }
}
/* Různá šířka problému */
.odevzdanareseni_mid, .odevzdanareseni_small, .odevzdanareseni_mini { display: none; }
@media (max-width: 970px) {
.odevzdanareseni_big { display: none; }
.odevzdanareseni_mid { display: table-cell; }
}
@media(max-width: 800px) {
.odevzdanareseni_mid { display: none; }
.odevzdanareseni_small { display: table-cell; }
}
@media (max-width: 650px) {
.odevzdanareseni_small { display: none; }
.odevzdanareseni_mini { display: table-cell; }
}
/****************************************/
/** Detail řešení **/
.bodovani>input {
width: 4em;
&::placeholder {
color: lightgray;
opacity: 1;
}
&::-webkit-input-placeholder { /* Edge */
color: lightgray;
}
}
/* td obsahující křížek v detailu řešení se nesmí smrštit na 0 */
td:has(.smazat_hodnoceni) {
min-width: 20px;
padding: 3px;
}
/*******************/
/*****************/
.novinka {
& .novinka_obrazek {
margin: 10px 0 10px 0;
width: 100%;
}
& .novinka_datum {
font-weight: bold;
}
& .novinka_autor {
text-align: right;
font-style: italic;
}
}
/**** FORMULÁŘE ****/
/* přihláška a další formuláře */
table.form td, table.form tr {
table-layout: fixed;
word-wrap: break-word;
padding: 5px;
}
table#reseni.form td, table#reseni.form tr {
display: inline-table;
}
@media (max-width: 650px) {
table.form td, table.form tr {
display: inherit;
}
}
@media(max-width: 800px) {
table#reseni.form td, table#reseni.form tr {
display: inline-grid;
max-width: 300px;
}
}
.field-with-comment{
position:relative;
}
.field-comment{
display:none;
text-shadow: 0 1px 0 #fff;
background-color: #f0f0f0 ;
position:absolute;
z-index:100;
border-width:1px;
border-color: #dbdbdb;
border-style:solid;
border-radius: 5px;
padding:3px;
top:50px;
left:10px;
}
.field-with-comment:hover span.field-comment{
display: block;
}
input {
margin: 5px;
}
textarea.feedback {
margin: 5px;
}
ul.form {
list-style-type: none;
padding-left: 0;
}
label.field-label {
font-weight: normal;
}
label.field-required {
font-weight: bold;
}
.field-error {
font-size: 14px;
color: red;
}
ul.form li{
margin-bottom: 3px;
}
div.gdpr {
font-size: 6pt;
& p {
font-size: 6pt;
margin-bottom: .66em;
}
}
/* registrace */
label[for=id_skola] {
font-weight: bold;
}
/*******************/

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