From d07883e0872ff59e44a28c5a024246d48858469e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kate=C5=99ina=20=C4=8C=C3=AD=C5=BEkov=C3=A1?= Date: Wed, 19 Feb 2020 20:14:13 +0100 Subject: [PATCH] testdata popis orga --- flat.json | 332 +++ .../0001_squashed_0067_auto_20190814_0805.py | 2164 +++++++++++++++++ seminar/testutils.py | 33 +- 3 files changed, 2512 insertions(+), 17 deletions(-) create mode 100644 flat.json create mode 100644 seminar/migrations/0001_squashed_0067_auto_20190814_0805.py diff --git a/flat.json b/flat.json new file mode 100644 index 00000000..61a7a2db --- /dev/null +++ b/flat.json @@ -0,0 +1,332 @@ +[ +{ + "model": "flatpages.flatpage", + "pk": 1, + "fields": { + "url": "/o-seminari/", + "title": "O semin\u00e1\u0159i", + "content": "

Pro\u010d \u0159ešit práv\u011b M&M?

\r\n\r\n\r\n", + "enable_comments": false, + "template_name": "", + "registration_required": false, + "sites": [ + 1 + ] + } +}, +{ + "model": "flatpages.flatpage", + "pk": 2, + "fields": { + "url": "/", + "title": "Semin\u00e1\u0159 M&M", + "content": "

Vítejte na stránce seminá\u0159e MaM!

\r\n", + "enable_comments": false, + "template_name": "home.html", + "registration_required": false, + "sites": [ + 1 + ] + } +}, +{ + "model": "flatpages.flatpage", + "pk": 3, + "fields": { + "url": "/co-je-MaM/uvod/", + "title": "Co je M&M?", + "content": "

M&M je mezioborov\u00fd koresponden\u010dn\u00ed semin\u00e1\u0159 pro studenty st\u0159edn\u00edch \u0161kol zam\u011b\u0159en\u00fd na matematiku, fyziku a informatiku. Ro\u010dn\u011b vyd\u00e1v\u00e1me p\u0159ibli\u017en\u011b sedm \u010d\u00edsel \u010dasopisu, ve kter\u00e9m najde\u0161 t\u00e9mata k b\u00e1d\u00e1n\u00ed, dopln\u011bn\u00e9 o zaj\u00edmav\u00e9 \u00falohy a o \u010dl\u00e1nky jak od n\u00e1s, organiz\u00e1tor\u016f, tak od v\u00e1s, \u0159e\u0161itel\u016f. \u010casopis je zdarma.

\r\n\r\n

M&M je taky sout\u011b\u017e. Za v\u0161echny p\u0159\u00edsp\u011bvky k t\u00e9mat\u016fm, \u0159e\u0161en\u00ed \u00faloh i \u010dl\u00e1nky ud\u011blujeme body. Na z\u00e1klad\u011b z\u00edskan\u00fdch bod\u016f sestavujeme v\u00fdsledkovou listinu. Na nejlep\u0161\u00ed \u0159e\u0161itele \u010dekaj\u00ed knihy a deskovky. Autor nejlep\u0161\u00edho p\u0159\u00edsp\u011bvku do t\u00e9m\u00e1tka si bude moci smlsnout na dortu. Taky se m\u016f\u017ee\u0161 dostat na Matfyz bez p\u0159ij\u00edma\u010dek (viz n\u00ed\u017ee). A hlavn\u011b, p\u0159ibli\u017en\u011b dvacet p\u011bt nej\u00fasp\u011b\u0161n\u011bj\u0161\u00edch \u0159e\u0161itel\u016f zveme dvakr\u00e1t do roka na soust\u0159ed\u011bn\u00ed.

\r\n\r\n

Jak se zapojit

\r\n\r\n

V pr\u016fb\u011bhu \u0161koln\u00edho roku vych\u00e1z\u00ed zpravidla sedm \u010d\u00edsel \u010dasopisu. V nich jsou zadan\u00e9 r\u016fzn\u00e9 podn\u011bty k p\u0159em\u00fd\u0161len\u00ed. Pokud t\u011b n\u011bkter\u00fd zaujme, pokus se k n\u011bmu n\u011bco napsat a poslat n\u00e1m to \u2013 podrobnosti najde\u0161 v sekci Jak \u0159e\u0161it.

\r\n\r\n

Soust\u0159ed\u011bn\u00ed

\r\n\r\n

V\u017edy na podzim a na ja\u0159e p\u0159ipravujeme pro na\u0161e nejlep\u0161\u00ed \u0159e\u0161itele t\u00fddenn\u00ed soust\u0159ed\u011bn\u00ed. To se obvykle kon\u00e1 n\u011bkde v bl\u00edzkosti p\u011bkn\u00e9 p\u0159\u00edrody. Soust\u0159ed\u011bn\u00ed je \u010d\u00e1ste\u010dn\u011b odborn\u00e9, m\u00e1me pro v\u00e1s p\u0159ipraveny p\u0159edn\u00e1\u0161ky ze v\u0161elijak\u00fdch tradi\u010dn\u00edch i netradi\u010dn\u00edch z\u00e1kout\u00ed nejen matematiky, fyziky i informatiky. Dost \u010dasu je v\u011bnov\u00e1no i zaj\u00edmav\u00fdm a z\u00e1bavn\u00fdm hr\u00e1m, venku i uvnit\u0159. P\u0159edev\u0161\u00edm je ale soust\u0159ed\u011bn\u00ed p\u0159\u00edle\u017eitost, jak potkat fajn lidi s podobn\u00fdmi z\u00e1jmy! M\u016f\u017ee\u0161 si prohl\u00e9dnout fotky z p\u0159ede\u0161l\u00fdch soust\u0159ed\u011bn\u00ed.

\r\n\r\n

\r\n\r\n

P\u0159ij\u00edmac\u00ed zkou\u0161ky na MFF

\r\n\r\n

Matematicko-fyzik\u00e1ln\u00ed fakulta Univerzity Karlovy se rozhodla \u00fasp\u011b\u0161n\u00fdm \u0159e\u0161itel\u016fm na\u0161eho koresponden\u010dn\u00edho semin\u00e1\u0159e odpustit p\u0159ij\u00edmac\u00ed zkou\u0161ky. Konkr\u00e9tn\u011b se to t\u00fdk\u00e1 t\u011bch \u0159e\u0161itel\u016f, kte\u0159\u00ed z\u00edskaj\u00ed za rok alespo\u0148 65 bod\u016f. Ti od n\u00e1s dostanou \u201eosv\u011bd\u010den\u00ed \u00fasp\u011b\u0161n\u00e9ho \u0159e\u0161itele\u201c, kter\u00e9 pak mohou p\u0159edlo\u017eit fakult\u011b.

", + "enable_comments": false, + "template_name": "", + "registration_required": false, + "sites": [ + 1 + ] + } +}, +{ + "model": "flatpages.flatpage", + "pk": 4, + "fields": { + "url": "/clanky/uvod/", + "title": "\u010cl\u00e1nky", + "content": "

V M&M publikujeme \u010dlánky – stejn\u011b jako v opravdovém v\u011bdeckém \u010dasopise. Setkat se u nás m\u016f\u017eeš jednak s \u010dlánky od organizátor\u016f (v rámci n\u011bjakého seriálu, nebo jen tak), jednak nám m\u016f\u017eeš poslat \u010dlánek ty sám.

\r\n\r\n

Organizátorské \u010dlánky

\r\n\r\n

Organizáto\u0159i t\u011b ve svých \u010dláncích obvykle cht\u011bjí nau\u010dit n\u011bco, co by se ti mohlo hodit nebo líbit.

\r\n\r\n

\u010clánky od \u0159ešitel\u016f

\r\n\r\n

Ty sám nám také m\u016f\u017eeš zaslat \u010dlánek k publikování. Krom \u010dlánku k tématu (který spadá do jiné sekce) to nej\u010dast\u011bji bude nejspíš \u010dlánek o tvé konfe\u0159e ze soust\u0159ed\u011bní. M\u016f\u017eeš nám ale poslat i pojednání o \u010demkoli jiném, o \u010dem si myslíš, \u017ee by to mohlo ostatní \u0159ešitele zajímat. My pak tvoji práci zredigujeme a otiskneme. 

\r\n\r\n

Proto\u017ee víc hlav víc ví, m\u016f\u017eete na \u010dláncích pracovat i ve skupinách – stejn\u011b jako p\u0159i \u0159ešení témat!

\r\n\r\n

P\u0159i psaní \u010dlánku do M&M je dobré mít na pam\u011bti základní zásady pro psaní v\u011bdeckého \u010dlánku.

\r\n", + "enable_comments": false, + "template_name": "", + "registration_required": false, + "sites": [ + 1 + ] + } +}, +{ + "model": "flatpages.flatpage", + "pk": 5, + "fields": { + "url": "/archiv/temata/", + "title": "T\u00e9mata", + "content": "

Tady se pracuje

\r\n

\r\n Na t\u00e9to str\u00e1nce velmi intenzivn\u011b pracujeme.\r\n Za do\u010dasnou nedostupnost se omlouv\u00e1me.\r\n Zkuste p\u0159ej\u00edt na tituln\u00ed str\u00e1nku\r\n nebo se pod\u00edvat na aktu\u00e1ln\u00ed zad\u00e1n\u00ed.\r\n

\r\n ", + "enable_comments": false, + "template_name": "", + "registration_required": false, + "sites": [ + 1 + ] + } +}, +{ + "model": "flatpages.flatpage", + "pk": 6, + "fields": { + "url": "/archiv/ulohy/", + "title": "\u00dalohy", + "content": "

Tady se pracuje

\r\n

\r\n Na t\u00e9to str\u00e1nce velmi intenzivn\u011b pracujeme.\r\n Za do\u010dasnou nedostupnost se omlouv\u00e1me.\r\n Zkuste p\u0159ej\u00edt na tituln\u00ed str\u00e1nku\r\n nebo se pod\u00edvat na aktu\u00e1ln\u00ed zad\u00e1n\u00ed.\r\n

\r\n ", + "enable_comments": false, + "template_name": "", + "registration_required": false, + "sites": [ + 1 + ] + } +}, +{ + "model": "flatpages.flatpage", + "pk": 7, + "fields": { + "url": "/co-je-MaM/jak-resit/", + "title": "Jak \u0159e\u0161it?", + "content": "

\u010c\u00edm se n\u00e1\u0161 semin\u00e1\u0159 li\u0161\u00ed od v\u011bt\u0161iny ostatn\u00edch sout\u011b\u017e\u00ed, jsou p\u0159\u00edsp\u011bvkov\u00e1 t\u00e9mata. Jedn\u00e1 se o simulaci v\u011bdeck\u00e9 pr\u00e1ce ve smyslu, \u017ee zad\u00e1me jist\u00fd okruh probl\u00e9m\u016f, nad kter\u00fdm m\u016f\u017ee\u0161 n\u00e1sleduj\u00edc\u00ed rok b\u00e1dat. O v\u00fdsledky sv\u00e9 pr\u00e1ce se pak pod\u011bl\u00ed\u0161 s n\u00e1mi a s ostatn\u00edmi \u0159e\u0161iteli a my tvou pr\u00e1ci ohodnot\u00edme. V ka\u017ed\u00e9 s\u00e9rii b\u00fdvaj\u00ed t\u00e9mata roz\u0161i\u0159ov\u00e1na, nav\u00edc jsou n\u011bkter\u00e9 zadan\u00e9 probl\u00e9my omezeny term\u00ednem odesl\u00e1n\u00ed, proto je pot\u0159eba sv\u00e9 v\u00fdsledky pos\u00edlat u\u017e pr\u016fb\u011b\u017en\u011b. Na ka\u017ed\u00fd ro\u010dn\u00edk t\u00e9mat vypisujeme p\u011bt a\u017e \u0161est.

\r\n\r\n

\u0158e\u0161en\u00ed, kter\u00e9 n\u00e1m po\u0161le\u0161, m\u016f\u017ee b\u00fdt dvou r\u016fzn\u00fdch typ\u016f:

\r\n\r\n

\u00dalohy

\r\n\r\n

V r\u00e1mci ka\u017ed\u00e9ho t\u00e9matu b\u00fdv\u00e1 zad\u00e1na jedna nebo dv\u011b men\u0161\u00ed \u00falohy, kter\u00e9 dan\u00fd probl\u00e9m ur\u010dit\u00fdm zp\u016fsobem rozv\u00edj\u00ed. Tyto \u00falohy b\u00fdvaj\u00ed trochu t\u011b\u017e\u0161\u00ed ne\u017e obvykl\u00e9 \u0161koln\u00ed, jejich \u0159e\u0161en\u00ed \u010dasto vy\u017eaduje bu\u010f hlub\u0161\u00ed zamy\u0161len\u00ed nebo n\u011bjak\u00fd trik. St\u0159edo\u0161kolsk\u00e9 znalosti by na n\u011b ale m\u011bly sta\u010dit. Odevzd\u00e1v\u00e1n\u00ed \u00faloh se omezuje term\u00ednem odesl\u00e1n\u00ed, pot\u00e9 b\u00fdv\u00e1 zve\u0159ejn\u011bno vzorov\u00e9 \u0159e\u0161en\u00ed. U ka\u017ed\u00e9 \u00falohy je uveden po\u010det bod\u016f za spr\u00e1vn\u00e9 \u0159e\u0161en\u00ed. P\u0159im\u011b\u0159enou \u010d\u00e1st z t\u011bchto bod\u016f lze z\u00edskat i za ne\u00fapln\u00e9 \u0159e\u0161en\u00ed. A naopak za velmi zaj\u00edmav\u00e9 nebo elegantn\u00ed \u0159e\u0161en\u00ed m\u016f\u017ee\u0161 dostat i bodovou pr\u00e9mii.

\r\n\r\n

\u010cl\u00e1nky

\r\n\r\n

Syst\u00e9m t\u00e9mat poskytuje p\u0159\u00edle\u017eitost pro podrobn\u011bj\u0161\u00ed rozbor dan\u00e9ho okruhu probl\u00e9m\u016f. V\u00fdsledek takov\u00e9 pr\u00e1ce v\u0161ak vy\u017eaduje o n\u011bco v\u00edc prostoru ne\u017eli klasick\u00e9 \u0159e\u0161en\u00ed, proto je tv\u00fdm \u00fakolem napsat \u010dl\u00e1nek zab\u00fdvaj\u00edc\u00ed se probl\u00e9mem, kter\u00fd sis vybral. M\u016f\u017ee to b\u00fdt z\u00e1znam o proveden\u00e9m experimentu, teoretick\u00e9m v\u00fdpo\u010dtu \u010di \u00favaze, napsan\u00e9m programu \u010di o dal\u0161\u00edch (podle tebe zaj\u00edmav\u00fdch) ot\u00e1zk\u00e1ch z dan\u00e9ho okruhu. 

\r\n\r\n

Jak na to?

\r\n\r\n

Vy\u0159e\u0161 podprobl\u00e9m

\r\n\r\n

Vyber si n\u011bkter\u00fd z navrhovan\u00fdch podprobl\u00e9m\u016f, kter\u00fdm se chce\u0161 zab\u00fdvat, p\u0159\u00edpadn\u011b si navrhni podprobl\u00e9m vlastn\u00ed (to b\u00fdv\u00e1 ohodnoceno bodov\u00fdm bonusem). Podprobl\u00e9m pak vy\u0159e\u0161 podobn\u011b jako \u00falohu z \u010d\u00edsla. Podrobn\u00e9 \u0159e\u0161en\u00ed n\u011bkter\u00e9ho z podprobl\u00e9m\u016f bude bodov\u011b hodnoceno v\u00fdrazn\u011b l\u00e9pe ne\u017e souhrnn\u00fd \u010dl\u00e1nek kr\u00e1tce zmi\u0148uj\u00edc\u00ed kdeco. I \u010d\u00e1ste\u010dn\u00e9 \u0159e\u0161en\u00ed je lep\u0161\u00ed ne\u017e \u017e\u00e1dn\u00e9. Sv\u00e9 \u0159e\u0161en\u00ed pak hezky sepi\u0161, aby m\u011blo formu \u010dl\u00e1nku, a \u010dl\u00e1nek n\u00e1m po\u0161li. Vedouc\u00ed t\u00e9matu ho pak ohodnot\u00ed, p\u0159\u00edpadn\u011b zkoriguje a publikuje na webu \u010di dokonce v \u010d\u00edsle. \u010c\u00edm bl\u00ed\u017ee bude forma tv\u00e9ho p\u0159\u00edsp\u011bvku publikovateln\u00e9mu \u010dl\u00e1nku, t\u00edm lep\u0161\u00edho bodov\u00e9ho ohodnocen\u00ed dos\u00e1hne\u0161. Moder\u00e1tor t\u00e9matu ho pak ohodnot\u00ed, p\u0159\u00edpadn\u011b zkoriguje a publikuje na webu \u010di dokonce v \u010d\u00edsle. \u010c\u00edm bl\u00ed\u017ee bude forma tv\u00e9ho p\u0159\u00edsp\u011bvku publikovateln\u00e9mu \u010dl\u00e1nku, t\u00edm lep\u0161\u00edho bodov\u00e9ho ohodnocen\u00ed dos\u00e1hne\u0161.

\r\n\r\n

Inspiruj se

\r\n\r\n

Velmi d\u016fle\u017eitou vlastnost\u00ed t\u00e9mat je, \u017ee m\u016f\u017ee\u0161 na \u010dl\u00e1nky ostatn\u00edch reagovat \u2013 rozv\u00edjet je, nebo naopak bo\u0159it jejich p\u0159edstavy. Proto se hod\u00ed poslat tak\u00e9 \u010d\u00e1ste\u010dn\u00e1 \u0159e\u0161en\u00ed, post\u0159ehy, nebo n\u00e1pady na dal\u0161\u00ed podprobl\u00e9my, kter\u00e9 t\u0159eba nezvl\u00e1dne\u0161 vy\u0159e\u0161it s\u00e1m. Takov\u00e9to p\u0159\u00edsp\u011bvky d\u00e1vaj\u00ed prostor ostatn\u00edm a mohou je d\u00e1l inspirovat \u2013 ostatn\u00ed zase sv\u00fdmi p\u0159\u00edsp\u011bvky mohou inspirovat tebe.

\r\n\r\n

Proto\u017ee v\u00edc hlav v\u00edc v\u00ed, m\u016f\u017eete na t\u00e9matech pracovat i ve skupin\u00e1ch.

\r\n\r\n\r\n

Nad n\u00e1pady k t\u00e9mat\u016fm m\u016f\u017ee\u0161 p\u0159em\u00fd\u0161let cel\u00fd rok a\u017e do term\u00ednu odevzd\u00e1n\u00ed posledn\u00ed s\u00e9rie \u00faloh. Samoz\u0159ejm\u011b, \u010d\u00edm d\u0159\u00edve n\u00e1m \u010dl\u00e1nek po\u0161le\u0161, t\u00edm d\u0159\u00edve na n\u011bj ostatn\u00ed budou moci zareagovat.

\r\n\r\n

Pi\u0161 hezk\u00e9 \u010dl\u00e1nky

\r\n\r\n

\u010cl\u00e1nek k t\u00e9matu by m\u011bl po obsahov\u00e9 a form\u00e1ln\u00ed str\u00e1nce odpov\u00eddat v\u011bdeck\u00e9mu \u010dl\u00e1nku. M\u016f\u017ee\u0161 se pod\u00edvat na stru\u010dn\u00fd p\u0159ehled toho, jak by m\u011bl takov\u00fd v\u011bdeck\u00fd \u010dl\u00e1nek vypadat.

\r\n\r\n

Pro\u010d t\u00e9mata?

\r\n\r\n

T\u00e9mata vytv\u00e1\u0159ej\u00ed prostor pro vlastn\u00ed tv\u016fr\u010d\u00ed (\u010dasto v\u011bdeckou) \u010dinnost, jej\u00edm\u017e smyslem je krom jin\u00e9ho p\u0159in\u00e9st ostatn\u00edm \u0159e\u0161itel\u016fm nov\u00e9 podn\u011bty a inspirovat je k dal\u0161\u00edm n\u00e1pad\u016fm. Krom\u011b samotn\u00e9ho b\u00e1d\u00e1n\u00ed je d\u016fle\u017eit\u00e1 i komunikace mezi lidmi, kter\u00e1 je obvykle zprost\u0159edkov\u00e1na odborn\u00fdmi \u010dasopisy a v\u011bdeck\u00fdmi konferencemi. \u010casopis M&M je ur\u010den pr\u00e1v\u011b pro p\u00edsemnou komunikaci. \u00dastn\u00ed formu prezentace si m\u016f\u017ee\u0161 vyzkou\u0161et na na\u0161em soust\u0159ed\u011bn\u00ed, kde se tradi\u010dn\u011b kon\u00e1 mal\u00e1 v\u011bdeck\u00e1 konference.

\r\n\r\n

Jak poslat \u0159e\u0161en\u00ed

\r\n\r\n

Sv\u00e1 \u0159e\u0161en\u00ed m\u016f\u017ee\u0161 poslat bu\u010f elektronicky na n\u00e1\u0161 e-mail mam@matfyz.cz, nebo po\u0161tou na na\u0161i adresu. Pokud pot\u0159ebuje\u0161 k \u0159e\u0161en\u00ed p\u0159ilo\u017eit n\u011bjak\u00fd hodn\u011b velk\u00fd soubor, pou\u017eij n\u011bkterou voln\u011b dostupnou slu\u017ebu pro sd\u00edlen\u00ed soubor\u016f (DropboxGoogle Drive, \u2026) nebo n\u00e1s kontaktuj na e-mailu mam@matfyz.cz a p\u0159ed\u00e1n\u00ed domluv\u00edme.

\r\n\r\n

Pokud pos\u00edl\u00e1\u0161 \u0159e\u0161en\u00ed elektronicky, v\u011bz, \u017ee n\u00e1s daleko v\u00edce pot\u011b\u0161\u00ed pdfko s textem ne\u017e vyfocen\u00e9 ru\u010dn\u011b psan\u00e9 \u0159e\u0161en\u00ed. Ka\u017edou \u00falohu pros\u00edm po\u0161li v samostatn\u00e9m souboru resp. na samostatn\u00e9m list\u011b A4, aby si \u00falohy mohli rozd\u011blit r\u016fzn\u00ed opravuj\u00edc\u00ed. Na ka\u017ed\u00fd list uve\u010f svoje jm\u00e9no a \u010d\u00edslo \u00falohy \u010di t\u00e9matu. Na tvou po\u0161tovn\u00ed adresu ti pak budou zdarma chodit dal\u0161\u00ed \u010d\u00edsla na\u0161eho \u010dasopisu.

\r\n\r\n

Ke sv\u00e9mu prvn\u00edmu \u0159e\u0161en\u00ed p\u0159ilo\u017e pros\u00edm tak\u00e9 sv\u00e9 jm\u00e9no, adresu, e-mail, \u0161kolu a rok maturity. Pokud chce\u0161 jet na soust\u0159ed\u011bn\u00ed, uve\u010f pros\u00edm i telefon. A neboj, tyto \u00fadaje budeme vyu\u017e\u00edvat pouze pro pot\u0159eby M&M. Mimo \u00fadaj\u016f na v\u00fdsledkov\u00e9 listin\u011b (jm\u00e9no, \u0161kola, ro\u010dn\u00edk) je nebudeme nikde zve\u0159ej\u0148ovat.

\r\n", + "enable_comments": false, + "template_name": "", + "registration_required": false, + "sites": [ + 1 + ] + } +}, +{ + "model": "flatpages.flatpage", + "pk": 8, + "fields": { + "url": "/co-je-MaM/FAQ/", + "title": "\u010casto kladen\u00e9 dotazy", + "content": "

Jaký je smysl M&M?

\r\n\r\n

Smyslem M&M je pomáhat student\u016fm s nadáním na matematiku, fyziku \u010di informatiku rozvíjet jejich schopnosti a zprost\u0159edkovávat jejich setkávání a navazování p\u0159átelství.

\r\n\r\n

Jsem student st\u0159ední školy, posledních ro\u010dník\u016f základní školy \u010di ekvivalentních ro\u010dník\u016f víceletého gymnázia: Co mi M&M m\u016f\u017ee p\u0159inést?

\r\n\r\n

Pokud t\u011b zajímá matematika, fyzika nebo informatika, m\u016f\u017eeme ti nabídnout zajímavé podn\u011bty k p\u0159emýšlení. A pokud se zú\u010dastníš n\u011bkterého z našich soust\u0159ed\u011bní, pak i p\u0159átelský kolektiv fajn lidí podobných tob\u011b.

\r\n\r\n

Jsem u\u010ditel matematiky, fyziky \u010di informatiky na st\u0159ední škole: K \u010demu mi M&M m\u016f\u017ee být dobré?

\r\n\r\n

Jestli\u017ee nabídnete svým student\u016fm M&M k \u0159ešení, m\u016f\u017ee je náš \u010dasopis motivovat k dalšímu rozvoji. Náš archiv úloh a témat m\u016f\u017eete pou\u017eít jako zdroj náro\u010dn\u011bjších úloh pro nadané \u017eáky. Naše úlohy jsou \u0159ešitelné se st\u0159edoškolskými znalostmi – s trochou p\u0159emýšlení.

\r\n\r\n

Jsem rodi\u010d studenta nadaného na matematiku, fyziku \u010di informatiku: Je M&M pro moje dít\u011b dobré?

\r\n\r\n

Jednozna\u010dn\u011b ano – pokud o nás samo bude stát. Primárn\u011b m\u016f\u017eeme Vaše dít\u011b odborn\u011b rozvíjet. Náš kolektiv je navíc velmi otev\u0159ený a dovede p\u0159ijmout i mláde\u017e, která má problém s integrací do b\u011b\u017eného školního kolektivu.

\r\n\r\n

Ješt\u011b n\u011bjaké dotazy?

\r\n\r\n

Sem s nimi!

\r\n", + "enable_comments": false, + "template_name": "", + "registration_required": false, + "sites": [ + 1 + ] + } +}, +{ + "model": "flatpages.flatpage", + "pk": 9, + "fields": { + "url": "/soustredeni/", + "title": "Informace", + "content": "

Pro na\u0161e nejlep\u0161\u00ed \u0159e\u0161itele po\u0159\u00e1d\u00e1me dvakr\u00e1t do roka t\u00fddenn\u00ed soust\u0159ed\u011bn\u00ed pln\u00e9 odborn\u00e9ho programu i nejr\u016fzn\u011bj\u0161\u00ed z\u00e1bavy.

\r\n\r\n\r\n

Pro\u010d jet na soust\u0159ed\u011bn\u00ed?

\r\n\r\n

P\u0159edn\u00e1\u0161ky

\r\n\r\n

V\u011bt\u0161inou t\u011b ka\u017ed\u00fd den \u010dekaj\u00ed dv\u011b devades\u00e1timinutov\u00e9 p\u0159edn\u00e1\u0161ky. Vybrat si obvykle m\u016f\u017ee\u0161 mezi matematikou, fyzikou a informatikou, proto\u017ee se konaj\u00ed t\u0159i p\u0159edn\u00e1\u0161ky z\u00e1rove\u0148. N\u011bkter\u00e9 p\u0159edn\u00e1\u0161ky jsou leh\u010d\u00ed, jin\u00e9 t\u011b\u017e\u0161\u00ed, obecn\u011b je ale jejich \u00farove\u0148 vhodn\u00e1 pr\u00e1v\u011b pro zv\u00eddav\u00e9 st\u0159edo\u0161kol\u00e1ky. P\u0159edn\u00e1\u0161\u00edme jak klasick\u00e1 t\u00e9mata, tak t\u00e9mata nev\u0161edn\u00ed, z\u00e1kulisn\u00ed \u010di dokonce obskurn\u00ed. Kdy\u017e bude\u0161 organiz\u00e1tory hodn\u011b prosit, mo\u017en\u00e1 se dostane i na n\u011bjakou \u010dernou magii!

\r\n\r\n

Krom toho p\u0159edn\u00e1\u0161\u00edme i na po\u017e\u00e1d\u00e1n\u00ed \u2013 sta\u010d\u00ed, kdy\u017e si vybere\u0161 t\u00e9ma, kter\u00e9 t\u011b zaj\u00edm\u00e1, a oslov\u00ed\u0161 toho spr\u00e1vn\u00e9ho organiz\u00e1tora.

\r\n\r\n

Lid\u00e9

\r\n\r\n

Pozn\u00e1\u0161 lidi, pro kter\u00e9 je p\u0159em\u00fd\u0161len\u00ed obl\u00edbenou \u010dinnost\u00ed a pro kter\u00e9 matematika nen\u00ed sprost\u00e9 slovo. P\u0159edev\u0161\u00edm to jsou ale lidi, kte\u0159\u00ed se r\u00e1di bav\u00ed a se kter\u00fdmi si u\u017eije\u0161 mnoho legrace u j\u00eddla, b\u011bhem her, na v\u00fdlet\u011b, jen tak, p\u0159i hran\u00ed na kytaru nebo p\u0159i \u0161ar\u00e1d\u011bn\u00ed (pokud nev\u00ed\u0161, co tohle slovo znamen\u00e1, je na \u010dase to zjistit!).

\r\n\r\n

Konfery

\r\n\r\n

Konfery jsou na\u0161\u00ed specialitou. Ve skupin\u011b \u00fa\u010dastn\u00edk\u016f a pod veden\u00edm zku\u0161en\u00e9ho organiz\u00e1tora m\u016f\u017ee\u0161 zkusit pracovat na zadan\u00e9m probl\u00e9mu a v\u00fdsledky pak ostatn\u00edm prezentovat na mal\u00e9 v\u011bdeck\u00e9 konferenci. Pr\u00e1ce na konfe\u0159e je velmi podobn\u00e1 skute\u010dn\u00e9 v\u011bdeck\u00e9 pr\u00e1ci. M\u00e1me za sebou nap\u0159\u00edklad stavbu katapultu, po\u010d\u00edta\u010dovou synt\u00e9zu zvuku \u010di tropickou geometrii.

\r\n\r\n

Hry

\r\n\r\n

M\u00e1me pro tebe p\u0159ipravenou celou \u0159adu denn\u00edch i no\u010dn\u00edch her, uvnit\u0159 i venku, strategick\u00fdch i ak\u010dn\u00edch. A n\u011bkdy tohle v\u0161echno dohromady. Chceme, aby sis mohl/a zkusit \u010dinnosti, ke kter\u00fdm se b\u011b\u017en\u011b nedostane\u0161. St\u0159elba z luku, lezen\u00ed po skal\u00e1ch, slackline \u010di celono\u010dn\u00ed \u0161ifrova\u010dka? Nen\u00ed probl\u00e9m!

\r\n\r\n

Legenda

\r\n\r\n

Ka\u017ed\u00e9 soust\u0159ed\u011bn\u00ed m\u00e1 sv\u00e9 vlastn\u00ed prost\u0159ed\u00ed \u010di p\u0159\u00edb\u011bh, kter\u00fd j\u00edm prov\u00e1z\u00ed. U\u017e jsme byli ve starov\u011bk\u00e9m \u0158ecku \u010di pod podlahou obcho\u010f\u00e1ku, cestovali jsme \u010dasem a tak\u00e9 jsme bojovali s krvela\u010dn\u00fdmi zmutovan\u00fdmi tule\u0148\u00e1tky, kter\u00e1 se nakonec uk\u00e1zala b\u00fdt filma\u0159sk\u00fdm trikem. Co n\u00e1s \u010dek\u00e1 p\u0159\u00ed\u0161t\u011b?

\r\n\r\n

Absence ve \u0161kole

\r\n\r\n

Ne\u017e pojede\u0161 na soust\u0159ed\u011bn\u00ed, po\u0161leme ti ofici\u00e1ln\u00ed omluvenku od MFF UK. Jeliko\u017e je soust\u0159ed\u011bn\u00ed pln\u00e9 odborn\u00e9ho programu, v\u011bt\u0161ina \u0161kol na\u0161e \u0159e\u0161itele bez probl\u00e9mu uvol\u0148uje. N\u011bkter\u00e9 \u0161koly dokonce \u00fa\u010dast na soust\u0159ed\u011bn\u00ed nezapo\u010d\u00edt\u00e1vaj\u00ed do absence. V\u017edy je ale dobr\u00e9 se informovat, jak \u00fa\u010dast na podobn\u00fdch akc\u00edch \u0159e\u0161\u00ed tvoje \u0161kola, a p\u0159\u00edpadn\u011b se osobn\u011b domluvit s \u0159editelem \u010di \u0159editelkou.

\r\n\r\n

Kapacita soust\u0159ed\u011bn\u00ed

\r\n\r\n

Proto\u017ee chceme zachovat p\u0159\u00e1telskou a komorn\u00ed atmosf\u00e9ru soust\u0159ed\u011bn\u00ed, zveme na soust\u0159ed\u011bn\u00ed zhruba dvacet nej\u00fasp\u011b\u0161n\u011bj\u0161\u00edch \u0159e\u0161itel\u016f koresponden\u010dn\u00edho semin\u00e1\u0159e. N\u011bkolik dal\u0161\u00edch \u0159e\u0161itel\u016f zveme jako n\u00e1hradn\u00edky pro p\u0159\u00edpad, \u017ee by n\u011bkte\u0159\u00ed pozvan\u00ed nemohli. Pokud t\u011b na soust\u0159ed\u011bn\u00ed nepozveme, nezoufej a zkus v p\u0159\u00ed\u0161t\u00edm p\u016flroce v\u00edc \u0159e\u0161it t\u00e9mata. Dostat se mezi nejlep\u0161\u00edch dvacet \u0159e\u0161itel\u016f je s trochou p\u00edle hra\u010dka.

\r\n\r\n

 

\r\n", + "enable_comments": false, + "template_name": "", + "registration_required": false, + "sites": [ + 1 + ] + } +}, +{ + "model": "flatpages.flatpage", + "pk": 11, + "fields": { + "url": "/soustredeni/pripravujeme/", + "title": "P\u0159ipravujeme", + "content": "

Pozdimn\u00ed soust\u0159ed\u011bn\u00ed

\r\n\r\n

se bude konat v term\u00ednu od 12. do 20. \u0159\u00edjna 2019.

", + "enable_comments": false, + "template_name": "", + "registration_required": false, + "sites": [ + 1 + ] + } +}, +{ + "model": "flatpages.flatpage", + "pk": 12, + "fields": { + "url": "/soustredeni/probehlo/", + "title": "Prob\u011bhlo", + "content": "

Tady se pracuje

\r\n\r\n

Na této stránce velmi intenzivn\u011b pracujeme. Za do\u010dasnou nedostupnost se omlouváme. Zkuste p\u0159ejít na titulní stránku nebo se podívat na aktuální zadání.

\r\n\r\n

\r\n", + "enable_comments": false, + "template_name": "", + "registration_required": false, + "sites": [ + 1 + ] + } +}, +{ + "model": "flatpages.flatpage", + "pk": 16, + "fields": { + "url": "/zadani/temata/", + "title": "T\u00e9mata", + "content": "

T\u00e9mata jsou texty nejen z oblasti matematiky, fyziky a informatiky, kter\u00e9 popisuj\u00ed n\u011bjak\u00fd probl\u00e9m a jsou doprov\u00e1zeny n\u00e1vodn\u00fdmi \u00falohami. Va\u0161\u00edm \u00fakolem je zamyslet se nad dan\u00fdm probl\u00e9mem a sepsat va\u0161e \u00favahy ve form\u011b kr\u00e1tk\u00e9ho textu.

\r\n\r\n

Jak \u0159e\u0161it t\u00e9ma?

\r\n\r\n

 

\r\n\r\n

AKTU\u00c1LN\u00cd T\u00c9MATA

", + "enable_comments": false, + "template_name": "", + "registration_required": false, + "sites": [ + 1 + ] + } +}, +{ + "model": "flatpages.flatpage", + "pk": 17, + "fields": { + "url": "/zadani/aktualni-cislo/", + "title": "Aktu\u00e1ln\u00ed \u010d\u00edslo", + "content": "

Tady pat\u0159í aktuální \u010díslo.

\r\n", + "enable_comments": false, + "template_name": "", + "registration_required": false, + "sites": [ + 1 + ] + } +}, +{ + "model": "flatpages.flatpage", + "pk": 18, + "fields": { + "url": "/zadani/vysledkova-listina/", + "title": "V\u00fdsledkov\u00e1 listina", + "content": "

Tady se pracuje

\r\n\r\n

Na této stránce velmi intenzivn\u011b pracujeme. Za do\u010dasnou nedostupnost se omlouváme. Zkuste p\u0159ejít na titulní stránku nebo se podívat na aktuální zadání.

\r\n\r\n

\r\n", + "enable_comments": false, + "template_name": "", + "registration_required": false, + "sites": [ + 1 + ] + } +}, +{ + "model": "flatpages.flatpage", + "pk": 19, + "fields": { + "url": "/clanky/org/", + "title": "Organiz\u00e1torsk\u00e9 \u010dl\u00e1nky", + "content": "

Tady se pracuje

\r\n

\r\n Na t\u00e9to str\u00e1nce velmi intenzivn\u011b pracujeme.\r\n Za do\u010dasnou nedostupnost se omlouv\u00e1me.\r\n Zkuste p\u0159ej\u00edt na tituln\u00ed str\u00e1nku\r\n nebo se pod\u00edvat na aktu\u00e1ln\u00ed zad\u00e1n\u00ed.\r\n

\r\n ", + "enable_comments": false, + "template_name": "", + "registration_required": false, + "sites": [ + 1 + ] + } +}, +{ + "model": "flatpages.flatpage", + "pk": 20, + "fields": { + "url": "/clanky/resitel/", + "title": "\u0158e\u0161itelsk\u00e9 \u010dl\u00e1nky", + "content": "

\u0158e\u0161itelsk\u00e9 \u010dl\u00e1nky

\r\n\r\n

Na t\u00e9to str\u00e1nce se budou postupn\u011b objevovat r\u016fznorod\u00e9 \u010dl\u00e1nky od na\u0161ich \u0159e\u0161itel\u016f.

\r\n\r\n

Obsah:

\r\n\r\n

Ond\u0159ej Knopp: Flatland (ji\u017e brzy)

\r\n\r\n

 

\r\n\r\n

 

\r\n\r\n
\r\n

Ond\u0159ej Knopp: Flatland (15b)

\r\n\r\n

 

\r\n\r\n
\r\n

 

\r\n", + "enable_comments": false, + "template_name": "", + "registration_required": false, + "sites": [ + 1 + ] + } +}, +{ + "model": "flatpages.flatpage", + "pk": 21, + "fields": { + "url": "/clanky/jak-psat-vedecky-clanek/", + "title": "Jak ps\u00e1t v\u011bdeck\u00fd \u010dl\u00e1nek", + "content": "

Pro psan\u00ed v\u011bdeck\u00fdch \u010dl\u00e1nk\u016f byla vytvo\u0159ena n\u011bkter\u00e1 obecn\u00e1 pravidla, kter\u00e1 usnad\u0148uj\u00ed jejich \u010ditelnost a mo\u017enost vyhledat pot\u0159ebn\u00e9 informace. Na tomto m\u00edst\u011b bychom ti cht\u011bli uk\u00e1zat, jak by m\u011bl takov\u00fd v\u011bdeck\u00fd \u010dl\u00e1nek vypadat po obsahov\u00e9 i form\u00e1ln\u00ed str\u00e1nce.

\r\n\r\n

O \u010dem ps\u00e1t?

\r\n\r\n

Kvalita v\u011bdeck\u00e9ho \u010dl\u00e1nku z\u00e1vis\u00ed hlavn\u011b na tom, kolik nov\u00fdch poznatk\u016f p\u0159in\u00e1\u0161\u00ed. Je velmi vhodn\u00e9, aby obsahem bylo jen to, co m\u016f\u017ee zaj\u00edmat ostatn\u00ed \u0159e\u0161itele dan\u00e9ho t\u00e9matu.

\r\n\r\n

D\u00e1le plat\u00ed pravidlo, \u017ee jeden \u010dl\u00e1nek by se m\u011bl t\u00fdkat pr\u00e1v\u011b jednoho probl\u00e9mu. Pokud p\u00ed\u0161e\u0161 o v\u00edce probl\u00e9mech najednou, zamysli se nad t\u00edm, jestli by nebylo mo\u017en\u00e9 napsat v\u00edce \u010dl\u00e1nk\u016f. \u010c\u00edm stru\u010dn\u011bj\u0161\u00ed a p\u0159ehledn\u011bj\u0161\u00ed \u010dl\u00e1nek je a \u010d\u00edm v\u00edce nov\u00fdch poznatk\u016f na tak omezen\u00e9m prostoru obsahuje, t\u00edm \u010diteln\u011bj\u0161\u00ed a zaj\u00edmav\u011bj\u0161\u00ed je pro ostatn\u00ed \u0159e\u0161itele.

\r\n\r\n

Struktura \u010dl\u00e1nku

\r\n\r\n

Ka\u017ed\u00fd \u010dl\u00e1nek by m\u011bl m\u00edt vhodn\u00fd n\u00e1zev (titulek), kter\u00fd dok\u00e1\u017ee p\u0159it\u00e1hnout \u010dten\u00e1\u0159e, kte\u0159\u00ed se zaj\u00edmaj\u00ed o dan\u00e9 t\u00e9ma. Nadpis je ta \u010d\u00e1st \u010dl\u00e1nku, kter\u00e9 si ka\u017ed\u00fd v\u0161imne hned na prvn\u00ed pohled. Nepodce\u0148uj jeho zn\u011bn\u00ed a dej pozor na to, aby p\u0159esn\u011b vystihoval to, \u010demu se v \u010dl\u00e1nku v\u011bnuje\u0161.

\r\n\r\n

\u00favodu bys m\u011bl popsat probl\u00e9m, kter\u00fdm ses zab\u00fdval, d\u00e1le na co a na koho jsi navazoval a tak\u00e9 pro\u010d ses dan\u00fdm probl\u00e9mem zab\u00fdval. V\u011bt\u0161inou je zde uvedena hypot\u00e9za, kter\u00e1 je dokazov\u00e1na v samotn\u00e9m \u010dl\u00e1nku. Sou\u010d\u00e1st\u00ed \u00favodu je i motivace \u010dten\u00e1\u0159e a prvn\u00ed p\u0159ibl\u00ed\u017een\u00ed podstaty probl\u00e9mu.

\r\n\r\n

Za \u00favodem pak pokra\u010duje podrobn\u011bj\u0161\u00ed popis postup\u016f, kter\u00e9 vyu\u017e\u00edv\u00e1\u0161, a zd\u016fvodn\u011bn\u00ed tv\u00fdch tvrzen\u00ed.

\r\n\r\n

Kvalita v\u011bdeck\u00e9ho \u010dl\u00e1nku je d\u00e1na p\u0159edev\u0161\u00edm t\u00edm, jakou m\u00e1 informa\u010dn\u00ed hodnotu. Informacemi v \u010dl\u00e1nku mohou b\u00fdt jak v\u00fdsledky vlastn\u00edho v\u00fdzkumu, tak p\u0159ehledn\u00e9 shrnut\u00ed a zpracov\u00e1n\u00ed jinde uve\u0159ejn\u011bn\u00fdch v\u00fdsledk\u016f t\u00fdkaj\u00edc\u00edch se zkouman\u00e9ho probl\u00e9mu. Takov\u00e9mu zpracov\u00e1n\u00ed se \u0159\u00edk\u00e1 re\u0161er\u0161e a pokud podobn\u00e9 shrnut\u00ed je\u0161t\u011b neexistuje, m\u016f\u017ee b\u00fdt p\u0159\u00ednosn\u00e9 stejn\u011b jako vlastn\u00ed nov\u00fd v\u00fdzkum.

\r\n\r\n

Je d\u016fle\u017eit\u00e9, aby v\u0161echna tvrzen\u00ed uveden\u00e1 v \u010dl\u00e1nku byla dostate\u010dn\u011b podlo\u017eena fakty. \u010cl\u00e1nek tedy nelze zalo\u017eit na n\u011b\u010dem, o \u010dem si jen mysl\u00ed\u0161, \u017ee by to mohlo platit. Jak\u00e1koliv slo\u017eit\u011bj\u0161\u00ed tvrzen\u00ed v \u010dl\u00e1nku by m\u011bla b\u00fdt podpo\u0159ena bu\u010f odkazem na literaturu, anebo d\u016fkazem \u010di experimentem. M\u011bly by b\u00fdt tak\u00e9 uvedeny v\u0161echny p\u0159edpoklady pou\u017eit\u00fdch tvrzen\u00ed a teori\u00ed a v p\u0159\u00edpad\u011b experimentu podm\u00ednky, za kter\u00fdch byl prov\u00e1d\u011bn.

\r\n\r\n

z\u00e1v\u011bru je pak vhodn\u00e9 znovu shrnout hlavn\u00ed v\u00fdsledky sv\u00e9 pr\u00e1ce a p\u0159\u00edpadn\u011b polo\u017eit n\u011bjak\u00e9 dal\u0161\u00ed ot\u00e1zky souvisej\u00edc\u00ed s t\u00e9matem, jejich\u017e \u0159e\u0161en\u00ed by mohlo navazovat na tv\u016fj \u010dl\u00e1nek.

\r\n\r\n

Na \u00fapln\u00e9m konci se pak uv\u00e1d\u00ed seznam pou\u017eit\u00e9 literatury a literatury, na kterou bylo v \u010dl\u00e1nku odkazov\u00e1no. Obvykle se v \u010dl\u00e1nku pou\u017eije jen odkaz, nap\u0159. \u201e... Jak je uvedeno v [1], m\u016f\u017eeme v\u00fdraz upravit...\u201c V seznamu literatury se pak uvedou pln\u00e9 \u00fadaje o knize, \u010dl\u00e1nku \u010di internetov\u00e9 adrese. Dodr\u017euje se n\u00e1sleduj\u00edc\u00ed sch\u00e9ma:

\r\n\r\n

 

\r\n\r\n

[#] Autor. N\u00e1zev d\u00edla: podn\u00e1zev d\u00edla. \u010c\u00edslo vyd\u00e1n\u00ed. M\u00edsto vyd\u00e1n\u00ed: Ozna\u010den\u00ed nakladatele, Rok vyd\u00e1n\u00ed. Po\u010det str\u00e1nek. ISBN.

\r\n\r\n

Nap\u0159\u00edklad:
\r\n[1] O. Lepil, Z. Krupka. Fyzika pro gymn\u00e1zia: Optika. 2. vyd\u00e1n\u00ed. Praha: Prometheus, 1996. 167 s. ISBN 80\u201385849\u201371\u20132.

\r\n\r\n

Jednotliv\u00e9 \u010d\u00e1sti kr\u00e1tk\u00e9ho \u010dl\u00e1nku sta\u010d\u00ed odd\u011blit odstavci. Pokud se jedn\u00e1 o rozs\u00e1hlej\u0161\u00ed p\u0159\u00edsp\u011bvek, je lep\u0161\u00ed rozd\u011blit ho na n\u011bkolik sekc\u00ed s vhodn\u00fdmi podnadpisy.

\r\n\r\n

Jazyk a styl \u010dl\u00e1nku

\r\n\r\n

V odborn\u00e9m \u010dl\u00e1nku je nutn\u00e9 se vyjad\u0159ovat p\u0159esn\u011b a jednozna\u010dn\u011b. Je pot\u0159eba pou\u017e\u00edvat spr\u00e1vn\u00e9 term\u00edny, aby byl \u010dl\u00e1nek spr\u00e1vn\u011b pochopen ostatn\u00edmi \u010dten\u00e1\u0159i. Pokud pou\u017e\u00edv\u00e1\u0161 pom\u011brn\u011b neobvykl\u00fd pojem nebo zav\u00e1d\u00ed\u0161 n\u011bjak\u00fd nov\u00fd, tak je pot\u0159eba jej p\u0159esn\u011b definovat. V\u017edy si po\u0159\u00e1dn\u011b uv\u011bdom, kdo bude tv\u016fj \u010dl\u00e1nek \u010d\u00edst. Na tom tak\u00e9 z\u00e1le\u017e\u00ed, jak\u00e9 term\u00edny pou\u017eije\u0161 a jak moc podrobn\u011b je bude\u0161 vysv\u011btlovat.

\r\n\r\n

Aby byl \u010dl\u00e1nek v\u016fbec publikovateln\u00fd, m\u011bl by b\u00fdt naps\u00e1n bez jazykov\u00fdch a stylistick\u00fdch chyb. V \u010dl\u00e1nku, kter\u00fd je publikov\u00e1n, a tedy jej \u010dte \u0161ir\u0161\u00ed skupina lid\u00ed, pou\u017e\u00edv\u00e1me spisovn\u00fd jazyk. V M&Mku m\u016f\u017ee\u0161 ps\u00e1t \u010desky nebo slovensky.

\r\n\r\n

 

\r\n\r\n

Douf\u00e1me, \u017ee ti tento n\u00e1vod p\u0159i psan\u00ed \u010dl\u00e1nk\u016f pom\u016f\u017ee, a \u017ee i d\u00edky n\u011bmu na\u0161e t\u00e9m\u00e1tka z\u016fstanou p\u0159ehledn\u00e1, \u010diteln\u00e1 a zaj\u00edmav\u00e1.

\r\n", + "enable_comments": false, + "template_name": "", + "registration_required": false, + "sites": [ + 1 + ] + } +}, +{ + "model": "flatpages.flatpage", + "pk": 22, + "fields": { + "url": "/co-je-MaM/kontakt/", + "title": "Kontakt", + "content": "

Sv\u00e1 \u0159e\u0161en\u00ed \u010di p\u0159\u00edpadn\u00e9 dotazy n\u00e1m m\u016f\u017eete pos\u00edlat bu\u010f klasickou, nebo elektronickou po\u0161tou:

\r\n\r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n
\r\n\t\t\t

Adresa redakce:

\r\n\r\n\t\t\t

M&M, OPMK MFF UK
\r\n\t\t\tKe Karlovu 3
\r\n\t\t\t121 16 Praha 2

\r\n\t\t\t
\r\n\t\t\t

E-mailmam@matfyz.cz

\r\n\r\n\t\t\t

Facebook: Koresponden\u010dn\u00ed semin\u00e1\u0159 M&M

\r\n\r\n\t\t\t

Google Kalend\u00e1\u0159: casopis.mam@gmail.com

\r\n\t\t\t
\r\n\r\n

 

\r\n\r\n

B\u011bhem \u0161koln\u00edho roku je velk\u00e1 \u010d\u00e1st organiz\u00e1tor\u016f k zasti\u017een\u00ed na koleji 17. listopadu \u010di jinde po Praze.

\r\n\r\n

Adresa koleje:

\r\n\r\n

P\u00e1tkova 3
\r\n182 00, Praha 8

", + "enable_comments": false, + "template_name": "", + "registration_required": false, + "sites": [ + 1 + ] + } +}, +{ + "model": "flatpages.flatpage", + "pk": 23, + "fields": { + "url": "/odevzdat-reseni/muj-ucet/", + "title": "Odevzdat \u0159e\u0161en\u00ed", + "content": "

Svoje \u0159ešení nám prosím pošli na náš e-mail mam@matfyz.cz, nebo poštou na adresu redakce.

\r\n", + "enable_comments": false, + "template_name": "", + "registration_required": false, + "sites": [ + 1 + ] + } +}, +{ + "model": "flatpages.flatpage", + "pk": 24, + "fields": { + "url": "/archiv/vysledky/", + "title": "V\u00fdsledkov\u00e9 listiny", + "content": "

Tady se pracuje

\r\n\r\n

Na této stránce velmi intenzivn\u011b pracujeme. Za do\u010dasnou nedostupnost se omlouváme. Zkuste p\u0159ejít na titulní stránku nebo se podívat na aktuální zadání.

\r\n\r\n

\r\n", + "enable_comments": false, + "template_name": "", + "registration_required": false, + "sites": [ + 1 + ] + } +}, +{ + "model": "flatpages.flatpage", + "pk": 25, + "fields": { + "url": "/co-je-MaM/odmeny/", + "title": "Odm\u011bny", + "content": "

Odm\u011bny za um\u00edst\u011bn\u00ed v semin\u00e1\u0159i

\r\n\r\n

Ka\u017ed\u00fd rok oce\u0148ujeme 5 nejlep\u0161\u00edch \u0159e\u0161itel\u016f knihou a deskovou hrou dle jejich v\u00fdb\u011bru.
\r\nLetos m\u016f\u017ee\u0161 b\u00fdt mezi nimi i ty, sta\u010d\u00ed piln\u011b \u0159e\u0161it! :-)
\r\nN\u00e1sleduj\u00edc\u00ed knihy a deskovky si vybralo p\u011bt nej\u00fasp\u011b\u0161n\u011bj\u0161\u00edch \u0159e\u0161itel\u016f 23. ro\u010dn\u00edku semin\u00e1\u0159e:

\r\n\r\n

\"Odm\u011bny

\r\n\r\n

M\u016f\u017ee\u0161 se pod\u00edvat i na odm\u011bny z 22. a 21. ro\u010dn\u00edku.

\r\n\r\n

Odm\u011bny za tituly

\r\n\r\n

 Bc.MM (10 bod\u016f) \u2013 propiska
\r\n\"\"

\r\n\r\n

Mgr.MM (20 bod\u016f) \u2013 reflexn\u00ed p\u00e1ska
\r\n\"\"

\r\n\r\n

Dr.MM (50 bod\u016f) \u2013 hrne\u010dek
\r\n\"\"

\r\n\r\n

Doc.MM (100 bod\u016f) \u2013 deka
\r\n\"\"

\r\n\r\n

Prof.MM (200 bod\u016f) \u2013 mikina

\r\n\r\n

\"\"

\r\n\r\n

Akad.MM (500 bod\u016f) \u2013 tabule s n\u00e1pisem \u201eJsi fakt borec\u201c podepsan\u00e1 v\u0161emi organiz\u00e1tory

\r\n", + "enable_comments": false, + "template_name": "", + "registration_required": false, + "sites": [ + 1 + ] + } +}, +{ + "model": "flatpages.flatpage", + "pk": 27, + "fields": { + "url": "/co-je-MaM/mam-moc-casu/", + "title": "M\u00e1m moc \u010dasu!", + "content": "

Z\u00e1\u017eitkov\u00e9 akce

\r\n\r\n

Letn\u00ed a Zimn\u00ed \u0160kola Matematiky a Fyziky (L\u0160MF, Z\u0160MF) - \u0160MFko je v zim\u011b t\u00fddenn\u00ed, v l\u00e9t\u011b dvout\u00fddenn\u00ed, z\u00e1\u017eitkov\u00e1 akce ur\u010den\u00e1 st\u0159edo\u0161kol\u00e1k\u016fm se z\u00e1jmem o dal\u0161\u00ed sebevzd\u011bl\u00e1n\u00ed. Krom popul\u00e1rn\u011b nau\u010dn\u00fdch p\u0159edn\u00e1\u0161ek se na \u0161mfku prob\u011bhne\u0161 venku, vy\u0159\u00e1d\u00ed\u0161 se ve sn\u011bhu, u\u017eije\u0161 si vesel\u00fd vnit\u0159n\u00ed program a taky se pobav\u00ed\u0161 b\u011bhem spole\u010dn\u00e9ho \u0161ar\u00e1d\u011bn\u00ed, leno\u0161en\u00ed nebo hran\u00ed na kytaru.

\r\n\r\n

InterSoB - InterSoB je z\u00e1bavn\u00e1 a pou\u010dn\u00e1 jednodenn\u00ed sout\u011b\u017e st\u0159edo\u0161kolsk\u00fdch student\u016f, p\u0159i kter\u00e9 m\u00e1te mo\u017enost pod\u00edvat se netradi\u010dn\u00edm zp\u016fsobem do z\u00e1kulis\u00ed Masarykovy univerzity, vyzkou\u0161et si sv\u00e9 schopnosti v mnoha r\u016fzn\u00fdch oblastech, ud\u011blat si s kamar\u00e1dy zaj\u00edmav\u00fd v\u00fdlet po Brn\u011b a v neposledn\u00ed \u0159ad\u011b tak\u00e9 pom\u011b\u0159it svoje s\u00edly s dal\u0161\u00edmi t\u00fdmy.

\r\n\r\n

Dal\u0161\u00ed semin\u00e1\u0159e

\r\n\r\n

Koresponden\u010dn\u00ed Semin\u00e1\u0159 z Programov\u00e1n\u00ed (KSP) - KSP je semin\u00e1\u0159 ur\u010den\u00fd pro studenty st\u0159edn\u00edch a z\u00e1kladn\u00edch \u0161kol, kte\u0159\u00ed maj\u00ed z\u00e1jem nau\u010dit se n\u011bco z oblasti algoritm\u016f, logick\u00fdch \u00faloh, programov\u00e1n\u00ed a informatiky v\u016fbec. Na sv\u00e9 si v\u0161ak p\u0159ijdou i p\u0159\u00edznivci matematiky (a vlastn\u011b libovoln\u00e9ho p\u0159em\u00fd\u0161len\u00ed), je\u017eto oba obory maj\u00ed mnoho spole\u010dn\u00e9ho.

\r\n\r\n

FYzik\u00e1ln\u00ed KOresponden\u010dn\u00ed Semin\u00e1\u0159 (FYKOS) - FYKOS pro v\u00e1s p\u0159edstavuje mo\u017enost si zaj\u00edmav\u00fdm zp\u016fsobem roz\u0161\u00ed\u0159it ch\u00e1p\u00e1n\u00ed fyziky a proniknout do dal\u0161\u00edch, dosud nepoznan\u00fdch, oblast\u00ed t\u00e9to v\u011bdy. C\u00edlem FYKOSu je rozv\u00edjet fyzik\u00e1ln\u00ed my\u0161len\u00ed, proto\u017ee \u010dlov\u011bk, kter\u00fd se um\u00ed nad (nejen fyzik\u00e1ln\u00edmi) probl\u00e9my zamyslet a c\u00edt\u00ed touhu dobrat se k n\u011bjak\u00e9mu \u0159e\u0161en\u00ed, se uplatn\u00ed v\u0161ude, kde si schopnost\u00ed lidsk\u00e9ho mozku cen\u00ed.

\r\n\r\n

Matematick\u00fd koresponden\u010dn\u00ed semin\u00e1\u0159 PraSe (PRA\u017esk\u00fd SEmin\u00e1\u0159) - \u0158e\u0161en\u00edm \u00faloh tohoto semin\u00e1\u0159e z\u00edsk\u00e1\u0161 mnoho matematick\u00fdch znalost\u00ed a nau\u010d\u00ed\u0161 p\u0159esn\u011bji a srozumiteln\u011bji formulovat sv\u00e9 my\u0161lenky a z\u00e1v\u011bry. Semin\u00e1\u0159 je dobrou p\u0159\u00edpravou pro \u00fa\u010dast v nejr\u016fzn\u011bj\u0161\u00edch matematick\u00fdch sout\u011b\u017e\u00edch i pro dal\u0161\u00ed studium matematiky, ale schopnost logick\u00e9ho my\u0161len\u00ed, kterou si m\u016f\u017ee\u0161 procvi\u010dit, se ti v \u017eivot\u011b bude hodit, i kdy\u017e se v n\u011bm t\u0159eba pr\u00e1v\u011b matematice v\u011bnovat nehodl\u00e1\u0161.

\r\n\r\n

Pro mlad\u0161\u00ed sourozence

\r\n\r\n

Pikomat - Pikomat je matematick\u00fd semin\u00e1\u0159 ur\u010den\u00fd \u017e\u00e1k\u016fm \u0161est\u00fdch a\u017e dev\u00e1t\u00fdch t\u0159\u00edd z\u00e1kladn\u00edch \u0161kol a student\u016fm odpov\u00eddaj\u00edc\u00edch ro\u010dn\u00edk\u016f v\u00edcelet\u00fdch gymn\u00e1zi\u00ed. Spo\u010d\u00edv\u00e1 v \u0159e\u0161en\u00ed n\u011bkolika \u00faloh propojen\u00fdch p\u0159\u00edb\u011bhem. Sout\u011b\u017e\u00edc\u00ed ode\u0161le v dan\u00fdch term\u00ednech jednotliv\u00e9 p\u0159\u00edklady dan\u00e9 s\u00e9rie na adresu Pikomatu nebo je odevzd\u00e1 elektronicky. Organiz\u00e1to\u0159i oprav\u00ed do\u0161l\u00e9 \u00falohy, vypracuj\u00ed jejich vzorov\u00e1 \u0159e\u0161en\u00ed a sestav\u00ed v\u00fdsledkovou listinu. Na ja\u0159e se kon\u00e1 soust\u0159ed\u011bn\u00ed pro nejlep\u0161\u00ed \u0159e\u0161itele, v l\u00e9t\u011b pak t\u00e1bor pro v\u0161echny z\u00e1jemce.

\r\n\r\n

V\u00fdfuk (V\u00ddpo\u010dty Fyzik\u00e1ln\u00edch UKol\u016f) - V\u00fdfuk je samostatn\u00fd koresponden\u010dn\u00ed semin\u00e1\u0159 Matfyzu, kter\u00fd spad\u00e1 pod Katedru didaktiky fyziky. B\u011bhem \u0161koln\u00edho roku krom\u011b \u0161esti s\u00e9ri\u00ed semin\u00e1\u0159e organiz\u00e1to\u0159i p\u0159ipravuj\u00ed i podzimn\u00ed a jarn\u00ed setk\u00e1n\u00ed, letn\u00ed t\u00e1bor a N\u00e1boj junior.

\r\n\r\n

 

", + "enable_comments": false, + "template_name": "", + "registration_required": false, + "sites": [ + 1 + ] + } +} +] diff --git a/seminar/migrations/0001_squashed_0067_auto_20190814_0805.py b/seminar/migrations/0001_squashed_0067_auto_20190814_0805.py new file mode 100644 index 00000000..05d5f265 --- /dev/null +++ b/seminar/migrations/0001_squashed_0067_auto_20190814_0805.py @@ -0,0 +1,2164 @@ +# Generated by Django 2.2.6 on 2019-10-30 20:20 + +from django.conf import settings +from django.db import migrations, models +import django.db.migrations.operations.special +import django.db.models.deletion +import django.utils.timezone +import django_countries.fields +import imagekit.models.fields +import seminar.models +import taggit.managers + +# migr 0053 +import datetime as dt + +# migr 0058 +from django.db.models import Q + + +# Functions from the following migrations need manual copying. +# Move them and any dependencies into this file, then update the +# RunPython operations to refer to the local versions: + +# seminar.migrations.0051_resitel_to_osoba + +def resitel_to_osoba(apps,schema_editor): + Resitel = apps.get_model('seminar','Resitel') + Osoba = apps.get_model('seminar','Osoba') + for r in Resitel.objects.all(): + o = Osoba() + o.datum_narozeni = r.datum_narozeni + o.datum_registrace = r.datum_prihlaseni + o.datum_souhlasu_udaje = r.datum_souhlasu_udaje + o.datum_souhlasu_zasilani = r.datum_souhlasu_zasilani + o.email = r.email + o.jmeno = r.jmeno + o.mesto = r.mesto + o.pohlavi_muz = r.pohlavi_muz + o.prijmeni = r.prijmeni + o.psc = r.psc + o.stat = r.stat + o.telefon = r.telefon + o.ulice = r.ulice + o.user = r.user + if o.user: + u = o.user + if u.first_name: + if not o.jmeno: + o.jmeno = u.first_name + u.first_name = 'Použij osobu!' + elif o.jmeno == u.first_name: + u.first_name = 'Použij osobu!' + else: + raise ValueError('jmeno a first_name rozdílné: "{}" vs. "{}"'.format(o.jmeno, u.first_name)) + if u.last_name: + if not o.prijmeni: + o.prijmeni = u.last_name + u.last_name = 'Použij osobu!' + elif o.prijmeni == u.last_name: + u.last_name = 'Použij osobu!' + else: + raise ValueError('prijmeni a last_name rozdílné: "{}" vs. "{}"'.format(o.prijmeni, u.last_name)) + if u.email: + if not o.email: + o.email = u.email + u.email = 'Použij osobu!' + elif o.email == u.email: + u.email = 'Použij osobu!' + else: + raise ValueError('o.email a u.email rozdílné: "{}" vs. "{}"'.format(o.email, u.email)) + u.save() + + + o.save() + r.osoba = o + r.save() + +def osoba_to_resitel(apps, schema_editor): + Resitel = apps.get_model('seminar','Resitel') + Osoba = apps.get_model('seminar','Osoba') + for r in Resitel.objects.all(): + o = r.osoba + r.datum_narozeni = o.datum_narozeni + r.datum_prihlaseni = o.datum_registrace + r.datum_souhlasu_udaje = o.datum_souhlasu_udaje + r.datum_souhlasu_zasilani = o.datum_souhlasu_zasilani + r.email = o.email + r.jmeno = o.jmeno + r.mesto = o.mesto + r.pohlavi_muz = o.pohlavi_muz + r.prijmeni = o.prijmeni + r.psc = o.psc + r.stat = o.stat + r.telefon = o.telefon + r.ulice = o.ulice + r.user = o.user + r.save() + o.delete() + + +# seminar.migrations.0052_user_to_organizator + +def spoj_k_organizatorum_osoby(apps, scema_editor): + Organizator = apps.get_model('seminar', 'Organizator') + Resitel = apps.get_model('seminar', 'Resitel') + Osoba = apps.get_model('seminar', 'Osoba') + for org in Organizator.objects.all(): + + # Spárování organizátora s osobou + user = org.user + resitele = Resitel.objects.filter(user=user) + if resitele.count() != 0: + osoba = resitele.first().osoba + else: + osoba = Osoba(user=user) + + # Přesun informací z usera do osoby + # pro řešitele již v minule migraci + osoba.jmeno = user.first_name + osoba.prijmeni = user.last_name + osoba.email = user.email + user.jmeno = "Použij osobu!" + user.prijmeni = "Použij osobu!" + user.email = "Použij osobu!" + user.save() + + # Přesun informací z organizátora do jeho osoby + osoba.prezdivka = org.prezdivka if org.prezdivka is not None else '' + osoba.foto = org.foto + + # Všechno uložit + osoba.save() + org.osoba = osoba + org.save() + +def fix_problem(apps, schema_editor): + Problem = apps.get_model('seminar', 'Problem') + Organizator = apps.get_model('seminar', 'Organizator') + for pr in Problem.objects.all(): + if pr.autor_old is not None: + pr.autor = Organizator.objects.filter(osoba__user=pr.autor_old).first() + else: + pr.autor = None + if pr.opravovatel is not None: + pr.opravovatele.add(Organizator.objects.filter(osoba__user=pr.opravovatel).first()) + pr.save() + +def fix_pohadka(apps, schema_editor): + Pohadka = apps.get_model('seminar', 'Pohadka') + Organizator = apps.get_model('seminar', 'Organizator') + for poh in Pohadka.objects.all(): + if poh.autor_old is not None: + poh.autor = Organizator.objects.filter(osoba__user=poh.autor_old).first() + else: + poh.autor = None + poh.save() + +def fix_novinka(apps, schema_editor): + Novinky = apps.get_model('seminar', 'Novinky') + Organizator = apps.get_model('seminar', 'Organizator') + for nov in Novinky.objects.all(): + nov.autor = Organizator.objects.filter(osoba__user=nov.autor_old).first() + nov.save() + +# seminar.migrations.0053_organizator_organizuje_od_do + +def rok_to_datetime(apps,schema_editor): + Organizator = apps.get_model('seminar','Organizator') + for o in Organizator.objects.all(): + rok = o.organizuje_od_roku + if rok: + o.organizuje_od = dt.datetime(rok,1,1) + rok = o.organizuje_do_roku + if rok: + o.organizuje_do = dt.datetime(rok,12,31) + o.save() + +def datetime_to_rok(apps,schema_editor): + Organizator = apps.get_model('seminar','Organizator') + for o in Organizator.objects.all(): + o.organizuje_od_roku = o.organizuje_od.year + o.organizuje_do_roku = o.organizuje_do.year + o.save() + +# seminar.migrations.0056_vrcholy_pro_rocniky_a_cisla + +def generuj_RocnikNody_a_CisloNody(apps,schema_editor): + Rocnik = apps.get_model('seminar', 'Rocnik') + RocnikNode = apps.get_model('seminar', 'RocnikNode') + Cislo = apps.get_model('seminar', 'Cislo') + CisloNode = apps.get_model('seminar', 'CisloNode') + + last_rn = None # last_* slouží k navázání následníků + for r in Rocnik.objects.all(): + rn = RocnikNode.objects.create(rocnik=r) + rn.save() + rn.root = rn + rn.save() + if last_rn: + last_rn.succ = rn + last_rn.save() + last_rn = rn + + last_cn = None + for c in Cislo.objects.filter(rocnik=r): + cn = CisloNode.objects.create(cislo=c, root=rn) + cn.save() + if last_cn: # Jsme něčí následník + last_cn.succ = cn + last_cn.save() + else: # Jsme první v řadě, takže se musíme přidat jako first_child RočníkNodu + rn.first_child = cn + rn.save() + last_cn = cn + +# seminar.migrations.0057_reseni_to_reseni_hodnoceni + +def reseni_to_Reseni(apps, schema_editor): + Reseni = apps.get_model('seminar','Reseni') + Reseni_Resitele = apps.get_model('seminar','Reseni_Resitele') + Hodnoceni = apps.get_model('seminar','Hodnoceni') + + for r in Reseni.objects.all(): + rr = Reseni_Resitele.objects.create(resitele = r.resitel, reseni=r) + if r.body == None: + print("!!!!!!!!!!!!!!!") + print(r.id,r) + print("!!!!!!!!!!!!!!!") + else: + h = Hodnoceni.objects.create( + body=r.body, + cislo_body = r.cislo_body, + problem = r.problem_old, + reseni = r) + +# seminar.migrations.0058_problem_to_uloha_tema_clanek + +def poskladej_strom(apps, rodic, *texty): + Text = apps.get_model('seminar', 'Text') + TextNode = apps.get_model('seminar', 'TextNode') + if not rodic: + raise ValueError("Rodič musí být definovaný") + + uz_ma_deti = False + tn = None + for txt in texty: + if not txt: + continue + # Přidej do stromu: + textobj = Text.objects.create(na_web = txt) + textobj.save() + textnode = TextNode.objects.create(text = textobj) + textnode.save() + if not uz_ma_deti: + rodic.first_child = textnode + rodic.save() + tn = rodic.first_child + uz_ma_deti = True + else: + tn.succ = textnode + tn.save() + tn = tn.succ + +def uloha_to_Uloha(apps,schema_editor): + Problem = apps.get_model('seminar', 'Problem') + Uloha = apps.get_model('seminar', 'Uloha') + Text = apps.get_model('seminar', 'Text') + UlohaZadaniNode = apps.get_model('seminar', 'UlohaZadaniNode') + UlohaVzorakNode = apps.get_model('seminar', 'UlohaVzorakNode') + TextNode = apps.get_model('seminar', 'TextNode') + + ulohy = Problem.objects.filter(typ = 'uloha') + for uold in ulohy: + unew = Uloha.objects.create( + problem_ptr = uold, + # Zakomentované fieldy by se už měly nacházet v příslušném problému + #nazev = uold.nazev, + #stav = uold.stav, + #zamereni = uold.zamereni, + #poznamka = uold.poznamka, + #autor = uold.autor, + #kod = uold.kod, + cislo_zadani = uold.cislo_zadani_old, + cislo_reseni = uold.cislo_reseni_old, + max_body = uold.body, + #vytvoreno = uold.vytvoreno, + ) +# unew.opravovatele.add(*uold.opravovatele.all()) + unew.save() + + # Nody: + zadani_node = UlohaZadaniNode.objects.create(uloha = unew) + poskladej_strom(apps, zadani_node, uold.text_zadani) + zadani_node.save() + vzorak_node = UlohaVzorakNode.objects.create(uloha = unew) + poskladej_strom(apps, vzorak_node, uold.text_reseni) + vzorak_node.save() + +def konfery_rucne(apps, schema_editor): + # Tohle dělat nebudu, máme aktuálně celou jednu. Ale "Errors should never pass silently" + Problem = apps.get_model('seminar', 'Problem') + pocet_konfer = Problem.objects.filter(typ = 'konfera').count() + if pocet_konfer > 0: + raise NotImplementedError("Zkonvertuj {} konfer na objekt Konfera ručně, prosím".format(pocet_konfer)) + +def clanek_to_Clanek(apps,schema_editor): + Problem = apps.get_model('seminar', 'Problem') + Clanek = apps.get_model('seminar', 'Clanek') + ClanekNode = apps.get_model('seminar', 'ClanekNode') + Text = apps.get_model('seminar', 'Text') + TextNode = apps.get_model('seminar', 'TextNode') + + clanky = Problem.objects.filter(Q(typ='org-clanek') | Q(typ='res-clanek')) + for cl in clanky: + # Vybereme vhodné číslo pro článek z čísla zadání a čísla řešení: + if cl.cislo_zadani_old is None: + cislo = cl.cislo_reseni_old + elif cl.cislo_reseni_old is None: + cislo = cl.cislo_zadani_old + elif cl.cislo_reseni_old == cl.cislo_zadani_old: + cislo = cl.cislo_zadani_old + else: + raise ValueError("Různá čísla zadání a řešení u článku! (Článek: {})".format(cl.nazev)) + + clnew = Clanek.objects.create( + problem_ptr = cl, + # Problém by nemělo být potřeba upravovat + cislo = cislo, + # Body ignorujeme, protože už jsou v hodnocení + ) + clnew.save() + + # Aktuálně nemáme v modelu informaci o tom, jestli je to org-článek + # nebo řešitelský článek. Aby se neztratila informace, poznamenám to do + # poznámky. + cl.poznamka += "\nTyp:\t{}".format(cl.typ) + cl.save() + + # Vyrobíme nody: + clnode = ClanekNode(clanek = clnew) + poskladej_strom(apps, clnode, cl.text_zadani, cl.text_reseni) + clnode.save() + +def tema_to_Tema(apps, schema_editor): + Problem = apps.get_model('seminar', 'Problem') + Tema = apps.get_model('seminar', 'Tema') + TemaVCisleNode = apps.get_model('seminar', 'TemaVCisleNode') + Text = apps.get_model('seminar', 'Text') + TextNode = apps.get_model('seminar', 'TextNode') + + temata = Problem.objects.filter(Q(typ = 'tema') | Q(typ='serial')) + for t in temata: + # Vymyslíme správně ročník: + if t.cislo_zadani_old is None and t.cislo_reseni_old is None: + rocnik = None + elif t.cislo_zadani_old is None: + rocnik = t.cislo_reseni_old.rocnik + elif t.cislo_reseni_old is None: + rocnik = t.cislo_zadani_old.rocnik + elif t.cislo_reseni_old.rocnik == t.cislo_zadani_old.rocnik: + rocnik = t.cislo_zadani_old.rocnik + else: + raise ValueError("Nelze mít téma přes více ročníků! (Téma: {}".format(t.nazev)) + + tnew = Tema.objects.create( + problem_ptr = t, + tema_typ = t.typ, + rocnik = rocnik, + ) + tnew.save() + + # Nody: + tnode = TemaVCisleNode(tema = tnew) + poskladej_strom(apps, tnode, t.text_zadani, t.text_reseni) + tnode.save() + +# seminar.migrations.0059_vytvorit_pohadkanode + +def vytvor_pohadkanode(apps, schema_editor): + Pohadka = apps.get_model('seminar', 'Pohadka') + PohadkaNode = apps.get_model('seminar', 'PohadkaNode') + Text = apps.get_model('seminar', 'Text') + TextNode = apps.get_model('seminar', 'TextNode') + + for p in Pohadka.objects.all(): + t = Text.objects.create(na_web = p.text) + t.save() + tn = TextNode.objects.create(text = t) + tn.save() + pn = PohadkaNode.objects.create(pohadka = p, first_child = tn) + pn.save() + +# seminar.migrations.0060_spoj_stromy + +def pridej_potomka(rodic, potomek): + # Daný vrchol bude posledním potomkem rodiče + uz_ma_deti = False + posledni = None + + # Přidávaný potomek by neměl mít následovníka -- přidáváme potomka, ne podles. + if potomek.succ: + raise ValueError("Potomek má následovníka, to je velmi podezřelé!") + + # Najdeme aktuálně posledního potomka: + if rodic.first_child: + uz_ma_deti = True + posledni = rodic.first_child + while posledni.succ: + posledni = posledni.succ + + # Nastavíme kořen: + potomek.root = rodic.root + potomek.save() + + # Připojíme vrchol: + if uz_ma_deti: + posledni.succ = potomek + posledni.save() + else: + rodic.first_child = potomek + rodic.save() + +def pokacej_les(apps, schema_editor): + # Teď je potřeba všechny TreeNody příslušející k zadaným problémům připojit + # do hlavního stromu + # Tohle je jednoduchá verze: nejdřív témátka a seriály, pak úložky a pohádky, + # pak články a konfery, pak vzoráky, všechno setříděné podle kódu (FIXME?) + + # Kopírování je častým zdrojem chyb! + Cislo = apps.get_model('seminar', 'Cislo') + Tema = apps.get_model('seminar', 'Tema') + Konfera = apps.get_model('seminar', 'Konfera') + Clanek = apps.get_model('seminar', 'Clanek') + Uloha = apps.get_model('seminar', 'Uloha') + Problem = apps.get_model('seminar', 'Problem') + Pohadka = apps.get_model('seminar', 'Pohadka') + + for c in Cislo.objects.all().reverse(): + cnode = c.cislonode + + # Témata a seriály: + relevantni_temata = Tema.objects.filter(Q(cislo_zadani_old = c) | Q(cislo_reseni_old = c)).order_by('kod') + # Téma dáme do prvního čísla, kde se vyskytne + for t in relevantni_temata: + tnode = t.temavcislenode + if t.cislo_zadani_old and t.cislo_reseni_old: + assert(t.cislo_zadani_old <= t.cislo_reseni_old) + if t.cislo_reseni_old == c: + # Už by mělo být přidané do čísla zadání + continue + else: + # Patří sem (buď je to jediné číslo, nebo je to číslo zadání) + pridej_potomka(cnode, tnode) + + # Úložky (zadání) a pohádky + for u in Uloha.objects.filter(cislo_zadani = c).order_by('kod'): + unode = u.ulohazadaninode + pohadky_pred = Pohadka.objects.filter(uloha_old = u.problem_ptr, pred = True) + pohadky_po = Pohadka.objects.filter(uloha_old = u.problem_ptr, pred = False) + for p in pohadky_pred: + pnode = p.pohadkanode + pridej_potomka(cnode, pnode) + pridej_potomka(cnode, unode) + for p in pohadky_po: + pnode = p.pohadkanode + pridej_potomka(cnode, pnode) + + # Pohádky, které nejsou u úlohy jsou špatně: + if Pohadka.objects.exclude(uloha_old__typ='uloha').count(): + raise ValueError("Existuje pohádka, která není u úlohy") + + # Články + for cl in Clanek.objects.filter(cislo = c).order_by('kod'): + clnode = cl.claneknode + pridej_potomka(cnode, clnode) + + # Konfery + for k in Konfera.objects.all(): + knode = k.konferanode + if k.reseni and knode.root is None: + # Takováhle konfera nejspíš neexistuje + raise NotImplementedError("Konfery neumím zapojit do stromu") + + # Vzoráky + for u in Uloha.objects.filter(cislo_reseni = c).order_by('kod'): + unode = u.ulohavzoraknode + pridej_potomka(cnode, unode) + +# seminar.migrations.0065_treenode_polymorphic_ctype + +def vyrob_treenodum_ctypes(apps, schema_editor): + # Kód zkopírovaný z dokumentace: https://django-polymorphic.readthedocs.io/en/stable/migrating.html + # XXX: Nevím, jestli se tohle náhodou nemělo spustit na všech childech (jen/i) + TreeNode = apps.get_model('seminar', 'TreeNode') + ContentType = apps.get_model('contenttypes', 'ContentType') + + new_ct = ContentType.objects.get_for_model(TreeNode) + TreeNode.objects.filter(polymorphic_ctype__isnull=True).update(polymorphic_ctype=new_ct) + +# seminar.migrations.0066_problem_polymorphic_ctype + +def vyrob_problemum_ctypes(apps, schema_editor): + # Kód zkopírovaný z dokumentace: https://django-polymorphic.readthedocs.io/en/stable/migrating.html + # XXX: Nevím, jestli se tohle náhodou nemělo spustit na všech childech (jen/i) + Problem = apps.get_model('seminar', 'Problem') + ContentType = apps.get_model('contenttypes', 'ContentType') + + new_ct = ContentType.objects.get_for_model(Problem) + Problem.objects.filter(polymorphic_ctype__isnull=True).update(polymorphic_ctype=new_ct) + + +class Migration(migrations.Migration): + atomic = False + replaces = [('seminar', '0001_initial'), ('seminar', '0002_add_body_views'), ('seminar', '0003_add_skola_zs_ss'), ('seminar', '0004_add_old_dakos_id'), ('seminar', '0005_alter_problem_autor'), ('seminar', '0006_problem_add_timestamp'), ('seminar', '0007_problem_zamereni'), ('seminar', '0008_reseni_forma'), ('seminar', '0009_rename_imported_IDs'), ('seminar', '0010_alter_rok_maturity'), ('seminar', '0011_alter_timestamp_def'), ('seminar', '0012_remove_soustredeni_ucastnici'), ('seminar', '0013_soustredeni_ucastnici_through_model'), ('seminar', '0014_uprava_poznamek'), ('seminar', '0015_soustredeni_text'), ('seminar', '0016_texty_problemu'), ('seminar', '0017_texty_problemu_minor'), ('seminar', '0018_problemnavrh_problemzadany'), ('seminar', '0019_rocnik_ciselne'), ('seminar', '0020_indexy_a_razeni'), ('seminar', '0021_cislo_verejna_vysledkovka'), ('seminar', '0022_decimal_body'), ('seminar', '0023_add_novinky'), ('seminar', '0024_add_organizator'), ('seminar', '0025_zmena_cesty_nahravani_obrazku'), ('seminar', '0026_soustredeni_typ'), ('seminar', '0027_export_flag_a_typ_akce'), ('seminar', '0028_add_body_celkem_views'), ('seminar', '0029_fix_body_celkem_views'), ('seminar', '0030_add_vysledky'), ('seminar', '0031_cislo_pdf'), ('seminar', '0032_cislo_pdf_blank_typos'), ('seminar', '0033_organizator_studuje_popisek'), ('seminar', '0034_reseni_forma_default_email'), ('seminar', '0035_django_imagekit'), ('seminar', '0036_add_org_to_soustredeni'), ('seminar', '0037_prispevek'), ('seminar', '0038_change_meta_prispevek'), ('seminar', '0039_pohadka'), ('seminar', '0040_pohadka_nepovinny_autor'), ('seminar', '0041_konfery'), ('seminar', '0042_cislo_faze'), ('seminar', '0043_uprava_faze'), ('seminar', '0044_uprava_faze'), ('seminar', '0045_cislo_pridani_faze_nahrano'), ('seminar', '0042_auto_20161005_0847'), ('seminar', '0046_merge'), ('seminar', '0047_auto_20170120_2118'), ('seminar', '0048_add_cislo_datum_deadline_soustredeni'), ('seminar', '0049_auto_20190430_2354'), ('seminar', '0050_auto_20190510_2228'), ('seminar', '0051_resitel_to_osoba'), ('seminar', '0052_user_to_organizator'), ('seminar', '0053_organizator_organizuje_od_do'), ('seminar', '0055_smazat_nemigrovane_zastarale_veci'), ('seminar', '0056_vrcholy_pro_rocniky_a_cisla'), ('seminar', '0057_reseni_to_reseni_hodnoceni'), ('seminar', '0058_problem_to_uloha_tema_clanek'), ('seminar', '0059_vytvorit_pohadkanode'), ('seminar', '0060_spoj_stromy'), ('seminar', '0061_kill_frankenstein'), ('seminar', '0062_redukce_modelu_pohadky'), ('seminar', '0063_procisteni_migraci'), ('seminar', '0064_auto_20190610_2358'), ('seminar', '0065_treenode_polymorphic_ctype'), ('seminar', '0066_problem_polymorphic_ctype'), ('seminar', '0067_auto_20190814_0805')] + + initial = True + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('taggit', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Cislo', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('cislo', models.CharField(help_text='Většinou jen "1", vyjímečně "7-8", lexikograficky určije pořadí v ročníku!', max_length=32, verbose_name='název čísla')), + ('datum_vydani', models.DateField(blank=True, help_text='Datum vydání finální verze', null=True, verbose_name='datum vydání')), + ('datum_deadline', models.DateField(blank=True, help_text='Datum pro příjem řešení úloh zadaných v tomto čísle', null=True, verbose_name='datum deadline')), + ('verejne_db', models.BooleanField(db_column='verejne', default=False, verbose_name='číslo zveřejněno')), + ], + options={ + 'ordering': ['rocnik__rocnik', 'cislo'], + 'db_table': 'seminar_cisla', + 'verbose_name': 'Číslo', + 'verbose_name_plural': 'Čísla', + }, + ), + migrations.CreateModel( + name='Problem', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('nazev', models.CharField(max_length=256, verbose_name='název')), + ('typ', models.CharField(choices=[(b'uloha', 'Úloha'), (b'tema', 'Téma'), (b'serial', 'Seriál'), (b'org-clanek', 'Organizátorský článek'), (b'res-clanek', 'Řesitelský článek')], default=b'uloha', max_length=32, verbose_name='typ problému')), + ('stav', models.CharField(choices=[(b'navrh', 'Návrh'), (b'zadany', 'Zadaný'), (b'smazany', 'Smazaný')], default=b'navrh', max_length=32, verbose_name='stav problému')), + ('text_problemu_org', models.TextField(blank=True, verbose_name='organizátorský (neveřejný) text')), + ('text_problemu', models.TextField(blank=True, verbose_name='veřejný text zadání a řešení')), + ('kod', models.CharField(blank=True, default=b'', help_text='Číslo/kód úlohy v čísle nebo kód tématu/článku/seriálu v ročníku', max_length=32, verbose_name='lokální kód')), + ('body', models.IntegerField(blank=True, null=True, verbose_name='maximum bodů')), + ('autor', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='autor_uloh', to=settings.AUTH_USER_MODEL, verbose_name='autor problému')), + ('cislo_reseni', models.ForeignKey(blank=True, help_text='Číslo s řešením úlohy, jen pro úlohy', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='resene_problemy', to='seminar.Cislo', verbose_name='číslo řešení')), + ('cislo_zadani', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='zadane_problemy', to='seminar.Cislo', verbose_name='číslo zadání')), + ('opravovatel', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='opravovatel_uloh', to=settings.AUTH_USER_MODEL, verbose_name='opravovatel')), + ], + options={ + 'db_table': 'seminar_problemy', + 'verbose_name': 'Problém', + 'verbose_name_plural': 'Problémy', + }, + ), + migrations.CreateModel( + name='Resitel', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('jmeno', models.CharField(max_length=256, verbose_name='jméno')), + ('prijmeni', models.CharField(max_length=256, verbose_name='příjmení')), + ('pohlavi_muz', models.BooleanField(default=False, verbose_name='pohlaví (muž)')), + ('rok_maturity', models.IntegerField(verbose_name='rok maturity')), + ('email', models.EmailField(blank=True, default=b'', max_length=256, verbose_name='e-mail')), + ('telefon', models.CharField(blank=True, default=b'', max_length=256, verbose_name='telefon')), + ('datum_narozeni', models.DateField(blank=True, null=True, verbose_name='datum narození')), + ('datum_souhlasu_udaje', models.DateField(blank=True, help_text='Datum souhlasu se zpracováním osobních údajů', null=True, verbose_name='datum souhlasu (údaje)')), + ('datum_souhlasu_zasilani', models.DateField(blank=True, help_text='Datum souhlasu se zasíláním MFF materiálů', null=True, verbose_name='datum souhlasu (spam)')), + ('datum_prihlaseni', models.DateField(default=django.utils.timezone.now, verbose_name='datum přihlášení')), + ('zasilat', models.CharField(choices=[(b'domu', 'Domů'), (b'do_skoly', 'Do školy'), (b'nikam', 'Nikam')], default=b'domu', max_length=32, verbose_name='kam zasílat')), + ('ulice', models.CharField(blank=True, default=b'', max_length=256, verbose_name='ulice')), + ('mesto', models.CharField(blank=True, default=b'', max_length=256, verbose_name='město')), + ('psc', models.CharField(blank=True, default=b'', max_length=32, verbose_name='PSČ')), + ('stat', django_countries.fields.CountryField(default=b'CZ', help_text='ISO 3166-1 kód země velkými písmeny (CZ, SK, ...)', max_length=2, verbose_name='stát')), + ('poznamka', models.TextField(blank=True, help_text='Neveřejná poznámka k řešiteli (plain text)', verbose_name='neveřejná poznámka')), + ], + options={ + 'ordering': ['prijmeni', 'jmeno'], + 'db_table': 'seminar_resitele', + 'verbose_name': 'Řešitel', + 'verbose_name_plural': 'Řešitelé', + }, + ), + migrations.CreateModel( + name='Rocnik', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('prvni_rok', models.IntegerField(verbose_name='první rok')), + ('rocnik', models.CharField(max_length=16, verbose_name='číslo ročníku')), + ], + options={ + 'ordering': ['rocnik'], + 'db_table': 'seminar_rocniky', + 'verbose_name': 'Ročník', + 'verbose_name_plural': 'Ročníky', + }, + ), + migrations.CreateModel( + name='Skola', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('aesop_id', models.CharField(blank=True, default=b'', help_text='Aesopi ID typu "izo:..." nebo "aesop:..."', max_length=32, verbose_name='Aesop ID')), + ('izo', models.CharField(blank=True, help_text='IZO školy (jen české školy)', max_length=32, verbose_name='IZO')), + ('nazev', models.CharField(help_text='Celý název školy', max_length=256, verbose_name='název')), + ('kratky_nazev', models.CharField(blank=True, help_text=b'Zkr\xc3\xa1cen\xc3\xbd n\xc3\xa1zev pro zobrazen\xc3\xad ve v\xc3\xbdsledkovce', max_length=256, verbose_name='zkrácený název')), + ('ulice', models.CharField(max_length=256, verbose_name='ulice')), + ('mesto', models.CharField(max_length=256, verbose_name='město')), + ('psc', models.CharField(max_length=32, verbose_name='PSČ')), + ('stat', django_countries.fields.CountryField(default=b'CZ', help_text='ISO 3166-1 kód zeme velkými písmeny (CZ, SK, ...)', max_length=2, verbose_name='stát')), + ('poznamka', models.TextField(blank=True, help_text='Neveřejná poznámka ke škole (plain text)', verbose_name='neveřejná poznámka')), + ], + options={ + 'db_table': 'seminar_skoly', + 'verbose_name': 'Škola', + 'verbose_name_plural': 'Školy', + }, + ), + migrations.CreateModel( + name='Soustredeni', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('datum_zacatku', models.DateField(blank=True, help_text='První den soustředění', null=True, verbose_name='datum začátku')), + ('datum_konce', models.DateField(blank=True, help_text='Poslední den soustředění', null=True, verbose_name='datum konce')), + ('verejne_db', models.BooleanField(db_column='verejne', default=False, verbose_name='soustředění zveřejněno')), + ('misto', models.CharField(blank=True, default=b'', help_text='Místo (název obce, volitelně též objektu', max_length=256, verbose_name='místo soustředění')), + ('rocnik', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='soustredeni', to='seminar.Rocnik', verbose_name='ročník')), + ('ucastnici', models.ManyToManyField(db_table='seminar_soustredeni_ucastnici', help_text='Seznam účastníků soustředění', to='seminar.Resitel', verbose_name='účastníci soustředění')), + ], + options={ + 'ordering': ['rocnik__rocnik', 'datum_zacatku'], + 'db_table': 'seminar_soustredeni', + 'verbose_name': 'Soustředění', + 'verbose_name_plural': 'Soustředění', + }, + ), + migrations.AddField( + model_name='resitel', + name='skola', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='seminar.Skola', verbose_name='škola'), + ), + migrations.AddField( + model_name='resitel', + name='user', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='uživatel'), + ), + migrations.CreateModel( + name='Reseni', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('body', models.IntegerField(blank=True, null=True, verbose_name='body')), + ('timestamp', models.DateTimeField(auto_now=True, verbose_name='vytvořeno')), + ('poznamka', models.TextField(blank=True, help_text='Neveřejná poznámka k řešení (plain text)', verbose_name='neveřejná poznámka')), + ('cislo_body', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='bodovana_reseni', to='seminar.Cislo', verbose_name='číslo pro body')), + ('problem', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reseni', to='seminar.Problem', verbose_name='problém')), + ('resitel', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reseni', to='seminar.Resitel', verbose_name='řešitel')), + ], + options={ + 'ordering': ['problem', 'resitel'], + 'db_table': 'seminar_reseni', + 'verbose_name': 'Řešení', + 'verbose_name_plural': 'Řešení', + }, + ), + migrations.CreateModel( + name='PrilohaReseni', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('timestamp', models.DateTimeField(auto_now=True, verbose_name='vytvořeno')), + ('soubor', models.FileField(upload_to=seminar.models.generate_filename, verbose_name='soubor')), + ('poznamka', models.TextField(blank=True, help_text='Neveřejná poznámka k příloze řešení (plain text), např. o původu', verbose_name='neveřejná poznámka')), + ('reseni', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='prilohy', to='seminar.Reseni', verbose_name='řešení')), + ], + options={ + 'ordering': ['reseni', 'timestamp'], + 'db_table': 'seminar_priloha_reseni', + 'verbose_name': 'Příloha řešení', + 'verbose_name_plural': 'Přílohy řešení', + }, + ), + migrations.CreateModel( + name='Nastaveni', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('aktualni_cislo', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='seminar.Cislo', verbose_name='poslední vydané číslo')), + ('aktualni_rocnik', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='seminar.Rocnik', verbose_name='aktuální ročník')), + ], + options={ + 'db_table': 'seminar_nastaveni', + 'verbose_name': 'Nastavení semináře', + }, + ), + migrations.AddField( + model_name='cislo', + name='rocnik', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='cisla', to='seminar.Rocnik', verbose_name='ročník'), + ), + migrations.AlterField( + model_name='reseni', + name='poznamka', + field=models.TextField(blank=True, help_text='Neveřejná poznámka k řešení (plain text, editace v detailu řešení)', verbose_name='neveřejná poznámka'), + ), + migrations.AddField( + model_name='skola', + name='je_ss', + field=models.BooleanField(default=True, verbose_name='střední stupeň'), + ), + migrations.AddField( + model_name='skola', + name='je_zs', + field=models.BooleanField(default=True, verbose_name='základní stupeň'), + ), + migrations.AlterField( + model_name='problem', + name='autor', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='autor_uloh', to=settings.AUTH_USER_MODEL, verbose_name='autor problému'), + ), + migrations.AddField( + model_name='problem', + name='zamereni', + field=taggit.managers.TaggableManager(blank=True, help_text=b'Zam\xc4\x9b\xc5\x99en\xc3\xad M/F/I/O probl\xc3\xa9mu, p\xc5\x99\xc3\xadp. dal\xc5\xa1\xc3\xad tagy', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='zaměření'), + ), + migrations.AddField( + model_name='reseni', + name='forma', + field=models.CharField(choices=[(b'papir', 'Papírové řešení'), (b'email', 'Emailem'), (b'upload', 'Upload přes web')], default=b'papir', max_length=16, verbose_name='forma řešení'), + ), + migrations.AddField( + model_name='resitel', + name='import_mamoper_id', + field=models.CharField(blank=True, default=b'', help_text='MAMOPER.MM_RIESITELIA.ID z DAKOS importu, jen historický význam', max_length=32, verbose_name='importované MM_RIESITELIA.ID'), + ), + migrations.AddField( + model_name='skola', + name='import_dakos_id', + field=models.CharField(blank=True, default=b'', help_text='DKSROOT.V_SKOLA.ID z DAKOS importu, jen historický význam', max_length=32, verbose_name='importované DKSROOT.V_SKOLA.ID'), + ), + migrations.AlterField( + model_name='resitel', + name='rok_maturity', + field=models.IntegerField(blank=True, null=True, verbose_name='rok maturity'), + ), + migrations.AlterField( + model_name='prilohareseni', + name='timestamp', + field=models.DateTimeField(blank=True, default=django.utils.timezone.now, editable=False, verbose_name='vytvořeno'), + ), + migrations.AddField( + model_name='problem', + name='import_dakos_id', + field=models.CharField(blank=True, default=b'', help_text='ID z importu z DAKOSU s prefixem podle původu: "AZAD:xxx (MAMOPER.MM_AZAD), ""DOZ:xxx" (MAMOPER.MM_DOZ), "ZAD:rocnik.cislo.uloha.typ" (MAMOPER.MM_ZADANIA), "ULOHA:xxx" (MAMOPER.MM_ULOHY)', max_length=32, verbose_name='importované ID s typem'), + ), + migrations.AddField( + model_name='problem', + name='timestamp', + field=models.DateTimeField(blank=True, default=django.utils.timezone.now, editable=False, verbose_name='vytvořeno'), + ), + migrations.AlterField( + model_name='reseni', + name='timestamp', + field=models.DateTimeField(blank=True, default=django.utils.timezone.now, editable=False, verbose_name='vytvořeno'), + ), + migrations.RemoveField( + model_name='soustredeni', + name='ucastnici', + ), + migrations.CreateModel( + name='Soustredeni_Ucastnici', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('poznamka', models.TextField(blank=True, help_text='Neveřejná poznámka k účasti (plain text)', verbose_name='neveřejná poznámka')), + ('resitel', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='seminar.Resitel', verbose_name='řešitel')), + ('soustredeni', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='seminar.Soustredeni', verbose_name='soustředění')), + ], + options={ + 'ordering': ['soustredeni', 'resitel'], + 'db_table': 'seminar_soustredeni_ucastnici', + 'verbose_name': 'Účast na soustředění', + 'verbose_name_plural': 'Účasti na soustředění', + }, + ), + migrations.AddField( + model_name='soustredeni', + name='ucastnici', + field=models.ManyToManyField(help_text='Seznam účastníků soustředění', through='seminar.Soustredeni_Ucastnici', to='seminar.Resitel', verbose_name='účastníci soustředění'), + ), + migrations.AlterModelOptions( + name='problem', + options={'ordering': ['nazev'], 'verbose_name': 'Problém', 'verbose_name_plural': 'Problémy'}, + ), + migrations.AlterModelOptions( + name='reseni', + options={'ordering': ['problem_id', 'resitel_id'], 'verbose_name': 'Řešení', 'verbose_name_plural': 'Řešení'}, + ), + migrations.AlterModelOptions( + name='skola', + options={'ordering': ['mesto', 'nazev'], 'verbose_name': 'Škola', 'verbose_name_plural': 'Školy'}, + ), + migrations.AddField( + model_name='cislo', + name='poznamka', + field=models.TextField(blank=True, help_text='Neveřejná poznámka k číslu (plain text)', verbose_name='neveřejná poznámka'), + ), + migrations.AlterField( + model_name='reseni', + name='poznamka', + field=models.TextField(blank=True, help_text='Neveřejná poznámka k řešení (plain text)', verbose_name='neveřejná poznámka'), + ), + migrations.AddField( + model_name='soustredeni', + name='text', + field=models.TextField(blank=True, default=b'', verbose_name='text k soustředění (HTML)'), + ), + migrations.RenameField( + model_name='problem', + old_name='text_problemu_org', + new_name='text_org', + ), + migrations.AlterField( + model_name='problem', + name='text_org', + field=models.TextField(blank=True, verbose_name='neveřejné zadání a organizátorské a poznámky'), + ), + migrations.RenameField( + model_name='problem', + old_name='text_problemu', + new_name='text_zadani', + ), + migrations.AlterField( + model_name='problem', + name='text_org', + field=models.TextField(blank=True, help_text='Neveřejný návrh úlohy, návrh řešení, text zadání, poznámky ...', verbose_name='org poznámky (HTML)'), + ), + migrations.AlterField( + model_name='problem', + name='text_zadani', + field=models.TextField(blank=True, help_text='Veřejný text zadání (HTML)', verbose_name='veřejné zadání (HTML)'), + ), + migrations.AddField( + model_name='problem', + name='text_reseni', + field=models.TextField(blank=True, help_text='Veřejný text řešení (HTML, u témat i příspěvky a komentáře)', verbose_name='veřejné řešení (HTML)'), + ), + migrations.CreateModel( + name='ProblemNavrh', + fields=[ + ], + options={ + 'verbose_name': 'Problém (návrh)', + 'proxy': True, + 'verbose_name_plural': 'Problémy (návrhy)', + }, + bases=('seminar.problem',), + ), + migrations.CreateModel( + name='ProblemZadany', + fields=[ + ], + options={ + 'verbose_name': 'Problém (zadaný)', + 'proxy': True, + 'verbose_name_plural': 'Problémy (zadané)', + }, + bases=('seminar.problem',), + ), + migrations.AddField( + model_name='rocnik', + name='rocnik_n', + field=models.IntegerField(default=0, verbose_name='číslo ročníku'), + preserve_default=False, + ), + migrations.RunSQL( + sql='update seminar_rocniky set rocnik_n = cast (rocnik as integer)', + ), + migrations.RemoveField( + model_name='rocnik', + name='rocnik', + ), + migrations.RenameField( + model_name='rocnik', + old_name='rocnik_n', + new_name='rocnik', + ), + migrations.AlterModelOptions( + name='cislo', + options={'ordering': ['-rocnik__rocnik', '-cislo'], 'verbose_name': 'Číslo', 'verbose_name_plural': 'Čísla'}, + ), + migrations.AlterModelOptions( + name='reseni', + options={'ordering': ['problem_id', 'resitel__prijmeni', 'resitel__jmeno'], 'verbose_name': 'Řešení', 'verbose_name_plural': 'Řešení'}, + ), + migrations.AlterModelOptions( + name='rocnik', + options={'ordering': ['-rocnik'], 'verbose_name': 'Ročník', 'verbose_name_plural': 'Ročníky'}, + ), + migrations.AlterField( + model_name='cislo', + name='cislo', + field=models.CharField(db_index=True, help_text='Většinou jen "1", vyjímečně "7-8", lexikograficky určije pořadí v ročníku!', max_length=32, verbose_name='název čísla'), + ), + migrations.AlterField( + model_name='rocnik', + name='prvni_rok', + field=models.IntegerField(db_index=True, unique=True, verbose_name='první rok'), + ), + migrations.AlterField( + model_name='rocnik', + name='rocnik', + field=models.IntegerField(db_index=True, unique=True, verbose_name='číslo ročníku'), + ), + migrations.AddField( + model_name='cislo', + name='verejna_vysledkovka', + field=models.BooleanField(default=False, help_text='Je-li false u veřejného čísla, není výsledkovka zatím veřejná.', verbose_name='zveřejněna výsledkovka'), + ), + migrations.AlterField( + model_name='problem', + name='body', + field=models.DecimalField(blank=True, decimal_places=1, max_digits=8, null=True, verbose_name='maximum bodů'), + ), + migrations.AlterField( + model_name='reseni', + name='body', + field=models.DecimalField(blank=True, decimal_places=1, max_digits=8, null=True, verbose_name='body'), + ), + migrations.CreateModel( + name='Novinky', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('datum', models.DateField(auto_now_add=True)), + ('text', models.TextField(blank=True, null=True, verbose_name=b'Text novinky')), + ('obrazek', models.ImageField(blank=True, null=True, upload_to=b'image_novinky/%Y/%m/%d/', verbose_name=b'Obr\xc3\xa1zek')), + ('zverejneno', models.BooleanField(default=False, verbose_name=b'Zve\xc5\x99ejn\xc4\x9bno')), + ('autor', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name=b'Autor novinky')), + ], + options={ + 'verbose_name': 'Novinka', + 'verbose_name_plural': 'Novinky', + }, + ), + migrations.CreateModel( + name='Organizator', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('prezdivka', models.CharField(blank=True, max_length=32, null=True, verbose_name=b'P\xc5\x99ezd\xc3\xadvka')), + ('organizuje_od_roku', models.IntegerField(blank=True, null=True, verbose_name=b'Organizuje od roku')), + ('organizuje_do_roku', models.IntegerField(blank=True, null=True, verbose_name=b'Organizuje do roku')), + ('studuje', models.CharField(blank=True, max_length=256, null=True, verbose_name=b'Studuje')), + ('strucny_popis_organizatora', models.TextField(blank=True, null=True, verbose_name=b'Stru\xc4\x8dn\xc3\xbd popis organiz\xc3\xa1tora')), + ('foto', models.ImageField(blank=True, help_text=b'Vlo\xc5\xbe fotografii organiz\xc3\xa1tora o libovon\xc3\xa9 velikosti', null=True, upload_to=b'image_organizatori/velke/%Y/', verbose_name=b'Fotografie organiz\xc3\xa1tora')), + ('foto_male', models.ImageField(blank=True, editable=False, null=True, upload_to=b'image_organizatori/male/%Y/')), + ('user', models.OneToOneField(help_text=b'Vyber \xc3\xba\xc4\x8det sp\xc5\x99a\xc5\xbeen\xc3\xbd s organiz\xc3\xa1torem.', on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name=b'Osoba')), + ], + options={ + 'verbose_name': 'Organizátor', + 'verbose_name_plural': 'Organizátoři', + }, + ), + migrations.AddField( + model_name='rocnik', + name='exportovat', + field=models.BooleanField(db_column='exportovat', default=False, help_text='Exportuje se jen podle tohoto flagu (ne veřejnosti), a to jen čísla s veřejnou výsledkovkou', verbose_name='export do AESOPa'), + ), + migrations.AddField( + model_name='soustredeni', + name='exportovat', + field=models.BooleanField(db_column='exportovat', default=False, help_text='Exportuje se jen podle tohoto flagu (ne veřejnosti)', verbose_name='export do AESOPa'), + ), + migrations.AddField( + model_name='soustredeni', + name='typ', + field=models.CharField(choices=[(b'jarni', 'Jarní soustředění'), (b'podzimni', 'Podzimní soustředění'), (b'vikend', 'Víkendový sraz')], default=b'podzimni', max_length=16, verbose_name='typ akce'), + ), + migrations.AlterField( + model_name='organizator', + name='foto', + field=models.ImageField(blank=True, help_text=b'Vlo\xc5\xbe fotografii organiz\xc3\xa1tora o libovoln\xc3\xa9 velikosti', null=True, upload_to=b'image_organizatori/velke/%Y/', verbose_name=b'Fotografie organiz\xc3\xa1tora'), + ), + migrations.AlterModelOptions( + name='soustredeni', + options={'ordering': ['-rocnik__rocnik', '-datum_zacatku'], 'verbose_name': 'Soustředění', 'verbose_name_plural': 'Soustředění'}, + ), + migrations.AlterField( + model_name='cislo', + name='cislo', + field=models.CharField(db_index=True, help_text='Většinou jen "1", vyjímečně "7-8", lexikograficky určuje pořadí v ročníku!', max_length=32, verbose_name='název čísla'), + ), + migrations.AddField( + model_name='cislo', + name='pdf', + field=models.FileField(blank=True, help_text='Pdf čísla, které si mohou řešitelé stáhnout', null=True, upload_to=seminar.models.cislo_pdf_filename, verbose_name='pdf'), + ), + migrations.AlterField( + model_name='problem', + name='typ', + field=models.CharField(choices=[(b'uloha', 'Úloha'), (b'tema', 'Téma'), (b'serial', 'Seriál'), (b'org-clanek', 'Organizátorský článek'), (b'res-clanek', 'Řešitelský článek')], default=b'uloha', max_length=32, verbose_name='typ problému'), + ), + migrations.AlterField( + model_name='skola', + name='stat', + field=django_countries.fields.CountryField(default=b'CZ', help_text='ISO 3166-1 kód země velkými písmeny (CZ, SK, ...)', max_length=2, verbose_name='stát'), + ), + migrations.AlterField( + model_name='organizator', + name='studuje', + field=models.CharField(blank=True, help_text=b"Nap\xc5\x99. 'Studuje Obecnou fyziku (Bc.), 3. ro\xc4\x8dn\xc3\xadk', 'Vystudovala Diskr\xc3\xa9tn\xc3\xad modely a algoritmy (Mgr.)' nebo 'P\xc5\x99edn\xc3\xa1\xc5\xa1\xc3\xad na MFF'", max_length=256, null=True, verbose_name=b'Studium aj.'), + ), + migrations.AlterField( + model_name='reseni', + name='forma', + field=models.CharField(choices=[(b'papir', 'Papírové řešení'), (b'email', 'Emailem'), (b'upload', 'Upload přes web')], default=b'email', max_length=16, verbose_name='forma řešení'), + ), + migrations.RemoveField( + model_name='organizator', + name='foto_male', + ), + migrations.AlterField( + model_name='organizator', + name='foto', + field=imagekit.models.fields.ProcessedImageField(blank=True, help_text=b'Vlo\xc5\xbe fotografii organiz\xc3\xa1tora o libovoln\xc3\xa9 velikosti', null=True, upload_to=b'image_organizatori/velke/%Y/', verbose_name=b'Fotografie organiz\xc3\xa1tora'), + ), + migrations.CreateModel( + name='Soustredeni_Organizatori', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('poznamka', models.TextField(blank=True, help_text='Neveřejná poznámka k účasti organizátora (plain text)', verbose_name='neveřejná poznámka')), + ('organizator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='seminar.Organizator', verbose_name='organizátor')), + ('soustredeni', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='seminar.Soustredeni', verbose_name='soustředění')), + ], + options={ + 'ordering': ['soustredeni', 'organizator'], + 'db_table': 'seminar_soustredeni_organizatori', + 'verbose_name': 'Účast organizátorů na soustředění', + 'verbose_name_plural': 'Účasti organizátorů na soustředění', + }, + ), + migrations.AddField( + model_name='soustredeni', + name='organizatori', + field=models.ManyToManyField(help_text='Seznam organizátorů soustředění', through='seminar.Soustredeni_Organizatori', to='seminar.Organizator', verbose_name='Organizátoři soustředění'), + ), + migrations.CreateModel( + name='Prispevek', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('nazev', models.CharField(max_length=200, verbose_name=b'N\xc3\xa1zev')), + ('text_org', models.TextField(blank=True, null=True, verbose_name=b'Orgovsk\xc3\xbd text')), + ('text_resitel', models.TextField(blank=True, null=True, verbose_name=b'\xc5\x98e\xc5\xa1itelsk\xc3\xbd text')), + ('zverejnit', models.BooleanField(verbose_name=b'Zve\xc5\x99ejnit?')), + ('problem', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='seminar.Problem', verbose_name=b'Probl\xc3\xa9m')), + ('reseni', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='seminar.Reseni', verbose_name=b'\xc5\x98e\xc5\xa1en\xc3\xad')), + ], + options={ + 'abstract': False, + 'verbose_name': 'Příspěvek k problému', + 'verbose_name_plural': 'Příspěvky k problémům', + }, + ), + migrations.CreateModel( + name='Konfera', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('nazev', models.CharField(help_text='Název konfery', max_length=40, verbose_name='název konfery')), + ('popis', models.TextField(blank=True, help_text='Popis konfery k zobrazení na webu', verbose_name='popis konfery')), + ('abstrakt', models.TextField(blank=True, help_text='Abstrakt konfery tak, jak byl uveden ve sborníku', verbose_name='abstrakt')), + ('org_poznamka', models.TextField(blank=True, help_text='Neveřejná poznámka ke konfeře(plain text)', verbose_name='neveřejná poznámka')), + ('typ_prezentace', models.CharField(choices=[(b'veletrh', 'Veletrh (postery)'), (b'prezentace', 'Prezentace (přednáška)')], default=b'veletrh', max_length=16, verbose_name='typ prezentace')), + ('prezentace', models.FileField(help_text='Prezentace nebo fotka posteru', upload_to=seminar.models.generate_filename_konfera, verbose_name='prezentace')), + ('materialy', models.FileField(help_text='Další materiály ke konfeře zabalené do jednoho souboru', upload_to=seminar.models.generate_filename_konfera, verbose_name='materialy')), + ('organizator', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='konfery', to='seminar.Organizator', verbose_name='organizátor')), + ('soustredeni', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='konfery', to='seminar.Soustredeni', verbose_name='soustředění')), + ], + options={ + 'db_table': 'seminar_konfera', + 'verbose_name': 'Konfera', + 'verbose_name_plural': 'Konfery', + }, + ), + migrations.CreateModel( + name='Konfery_Ucastnici', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('poznamka', models.TextField(blank=True, help_text='Neveřejná poznámka k účasti (plain text)', verbose_name='neveřejná poznámka')), + ('konfera', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='seminar.Konfera', verbose_name='konfera')), + ('resitel', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='seminar.Resitel', verbose_name='řešitel')), + ], + options={ + 'ordering': ['konfera', 'resitel'], + 'db_table': 'seminar_konfery_ucastnici', + 'verbose_name': 'Účast na konfeře', + 'verbose_name_plural': 'Účasti na konfeře', + }, + ), + migrations.AlterField( + model_name='problem', + name='typ', + field=models.CharField(choices=[(b'uloha', 'Úloha'), (b'tema', 'Téma'), (b'serial', 'Seriál'), (b'konfera', 'Konfera'), (b'org-clanek', 'Organizátorský článek'), (b'res-clanek', 'Řešitelský článek')], default=b'uloha', max_length=32, verbose_name='typ problému'), + ), + migrations.AddField( + model_name='konfera', + name='ucastnici', + field=models.ManyToManyField(help_text='Seznam účastníků konfery', through='seminar.Konfery_Ucastnici', to='seminar.Resitel', verbose_name='účastníci konfery'), + ), + migrations.AlterField( + model_name='konfera', + name='materialy', + field=models.FileField(blank=True, help_text='Další materiály ke konfeře zabalené do jednoho souboru', upload_to=seminar.models.generate_filename_konfera, verbose_name='materialy'), + ), + migrations.AlterField( + model_name='konfera', + name='prezentace', + field=models.FileField(blank=True, help_text='Prezentace nebo fotka posteru', upload_to=seminar.models.generate_filename_konfera, verbose_name='prezentace'), + ), + migrations.AddField( + model_name='konfera', + name='prispevek', + field=models.ForeignKey(blank=True, help_text='Účastnický přípěvek o konfeře', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='konfery', to='seminar.Problem', verbose_name='příspěvek do čísla'), + ), + migrations.AddField( + model_name='cislo', + name='faze', + field=models.CharField(choices=[('admin', 'Úpravy na webu'), ('tex', 'Úpravy v TeXu'), ('nahrano', 'Nahráno na web')], default='admin', help_text='Během fáze "Úpravy na webu" se obsah čísla vytváří (a případně komentuje) ve webovém rozhraní. Během fáze "Úpravy v TeXu" už obsah ve webovém rozhraní editovat nelze a návrhy na úpravy se píší do korekturovátka a zanášejí do gitu. Z něj se pak vygeneruje verze pro web a číslo se přepne do fáze "Nahráno na web", což jen znamená, že už nejde automaticky stáhnout obsah pro založení čísla v TeXu.', max_length=32, verbose_name='Fáze vytváření obsahu'), + ), + migrations.AddField( + model_name='cislo', + name='datum_deadline_soustredeni', + field=models.DateField(blank=True, help_text='Datum pro příjem řešení pro účast na soustředění', null=True, verbose_name='datum deadline soustředění'), + ), + migrations.CreateModel( + name='Osoba', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('jmeno', models.CharField(max_length=256, verbose_name='jméno')), + ('prijmeni', models.CharField(max_length=256, verbose_name='příjmení')), + ('prezdivka', models.CharField(max_length=256, verbose_name='přezdívka')), + ('pohlavi_muz', models.BooleanField(default=False, verbose_name='pohlaví (muž)')), + ('email', models.EmailField(blank=True, default='', max_length=256, verbose_name='e-mail')), + ('telefon', models.CharField(blank=True, default='', max_length=256, verbose_name='telefon')), + ('datum_narozeni', models.DateField(blank=True, null=True, verbose_name='datum narození')), + ('datum_souhlasu_udaje', models.DateField(blank=True, help_text='Datum souhlasu se zpracováním osobních údajů', null=True, verbose_name='datum souhlasu (údaje)')), + ('datum_souhlasu_zasilani', models.DateField(blank=True, help_text='Datum souhlasu se zasíláním MFF materiálů', null=True, verbose_name='datum souhlasu (spam)')), + ('datum_registrace', models.DateField(default=django.utils.timezone.now, verbose_name='datum registrace do semináře')), + ('ulice', models.CharField(blank=True, default='', max_length=256, verbose_name='ulice')), + ('mesto', models.CharField(blank=True, default='', max_length=256, verbose_name='město')), + ('psc', models.CharField(blank=True, default='', max_length=32, verbose_name='PSČ')), + ('stat', django_countries.fields.CountryField(default='CZ', help_text='ISO 3166-1 kód země velkými písmeny (CZ, SK, ...)', max_length=2, verbose_name='stát')), + ('poznamka', models.TextField(blank=True, help_text='Neveřejná poznámka k osobě (plain text)', verbose_name='neveřejná poznámka')), + ('foto', imagekit.models.fields.ProcessedImageField(blank=True, help_text='Vlož fotografii osoby o libovolné velikosti', null=True, upload_to='image_osoby/velke/%Y/', verbose_name='Fotografie osoby')), + ('user', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='uživatel')), + ], + options={ + 'verbose_name': 'Osoba', + 'verbose_name_plural': 'Osoby', + 'db_table': 'seminar_osoby', + 'ordering': ['prijmeni', 'jmeno'], + }, + ), + migrations.CreateModel( + name='Prijemce', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('poznamka', models.TextField(blank=True, help_text='Neveřejná poznámka k příemci čísel (plain text)', verbose_name='neveřejná poznámka')), + ('osoba', models.ForeignKey(help_text='Které osobě či na jakou adresu se mají zasílat čísla', on_delete=django.db.models.deletion.CASCADE, to='seminar.Osoba', verbose_name='komu')), + ], + options={ + 'verbose_name': 'příjemce', + 'verbose_name_plural': 'příjemce', + 'db_table': 'seminar_prijemce', + }, + ), + migrations.CreateModel( + name='Text', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('na_web', models.TextField(blank=True, help_text='Text ke zveřejnění na webu', verbose_name='text na web')), + ('do_cisla', models.TextField(blank=True, help_text='Text ke zveřejnění v čísle', verbose_name='text do čísla')), + ], + options={ + 'verbose_name': 'text', + 'verbose_name_plural': 'texty', + 'db_table': 'seminar_texty', + }, + ), + migrations.CreateModel( + name='Uloha', + fields=[ + ('problem_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='seminar.Problem')), + ('max_body', models.DecimalField(blank=True, decimal_places=1, max_digits=8, null=True, verbose_name='maximum bodů')), + ], + options={ + 'verbose_name': 'Úloha', + 'verbose_name_plural': 'Úlohy', + 'db_table': 'seminar_ulohy', + }, + bases=('seminar.problem',), + ), + migrations.AlterModelOptions( + name='novinky', + options={'ordering': ['-datum'], 'verbose_name': 'Novinka', 'verbose_name_plural': 'Novinky'}, + ), + migrations.AlterModelOptions( + name='prilohareseni', + options={'ordering': ['reseni', 'vytvoreno'], 'verbose_name': 'Příloha řešení', 'verbose_name_plural': 'Přílohy řešení'}, + ), + migrations.AlterModelOptions( + name='reseni', + options={'ordering': ['-cas_doruceni'], 'verbose_name': 'Řešení', 'verbose_name_plural': 'Řešení'}, + ), + migrations.AlterModelOptions( + name='resitel', + options={'ordering': ['osoba'], 'verbose_name': 'Řešitel', 'verbose_name_plural': 'Řešitelé'}, + ), + migrations.RenameField( + model_name='konfera', + old_name='org_poznamka', + new_name='poznamka', + ), + migrations.RenameField( + model_name='reseni', + old_name='timestamp', + new_name='cas_doruceni', + ), + migrations.RenameField( + model_name='prilohareseni', + old_name='timestamp', + new_name='vytvoreno', + ), + migrations.RenameField( + model_name='problem', + old_name='text_org', + new_name='poznamka', + ), + migrations.RenameField( + model_name='problem', + old_name='timestamp', + new_name='vytvoreno', + ), + migrations.RenameField( + model_name='problem', + old_name='cislo_zadani', + new_name='cislo_zadani_old', + ), + migrations.RenameField( + model_name='problem', + old_name='cislo_reseni', + new_name='cislo_reseni_old', + ), + migrations.AddField( + model_name='konfera', + name='anotace', + field=models.TextField(blank=True, help_text='Popis, o čem bude konfera.', verbose_name='anotace'), + ), + migrations.AddField( + model_name='organizator', + name='organizuje_do', + field=models.DateTimeField(blank=True, null=True, verbose_name='Organizuje do'), + ), + migrations.AddField( + model_name='organizator', + name='organizuje_od', + field=models.DateTimeField(blank=True, null=True, verbose_name='Organizuje od'), + ), + migrations.AddField( + model_name='organizator', + name='skola', + field=models.CharField(blank=True, help_text='Škola, např. MFF, VŠCHT, VUT, ... prostě aby se nemuselo psát do studuješkolu, ale jen obor, možnost zobrazit zvlášť', max_length=256, null=True, verbose_name='Škola, kterou studuje'), + ), + migrations.AddField( + model_name='organizator', + name='vytvoreno', + field=models.DateTimeField(blank=True, default=django.utils.timezone.now, editable=False, verbose_name='Vytvořeno'), + ), + migrations.AddField( + model_name='problem', + name='garant', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='garant_problemu_problem', to='seminar.Organizator', verbose_name='garant zadaného problému'), + ), + migrations.AddField( + model_name='problem', + name='nadproblem', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='nadproblem_problem', to='seminar.Problem', verbose_name='nadřazený problém'), + ), + migrations.AddField( + model_name='problem', + name='opravovatele', + field=models.ManyToManyField(blank=True, related_name='opravovatele_problem', to='seminar.Organizator', verbose_name='opravovatelé'), + ), + migrations.AddField( + model_name='reseni', + name='zverejneno', + field=models.BooleanField(default=False, help_text='Udává, zda je řešení zveřejněno', verbose_name='řešení zveřejněno'), + ), + migrations.AlterField( + model_name='cislo', + name='verejna_vysledkovka', + field=models.BooleanField(default=False, help_text='Je-li false u veřejného čísla,\t\t\t\t není výsledkovka zatím veřejná.', verbose_name='zveřejněna výsledkovka'), + ), + migrations.AlterField( + model_name='cislo', + name='verejne_db', + field=models.BooleanField(db_column='verejne', default=False, verbose_name='číslo zveřejněno'), + ), + migrations.AlterField( + model_name='konfera', + name='typ_prezentace', + field=models.CharField(choices=[('veletrh', 'Veletrh (postery)'), ('prezentace', 'Prezentace (přednáška)')], default='veletrh', max_length=16, verbose_name='typ prezentace'), + ), + migrations.RenameField( + model_name='novinky', + old_name='autor', + new_name='autor_old', + ), + migrations.AddField( + model_name='novinky', + name='autor', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='seminar.Organizator', verbose_name='Autor novinky'), + ), + migrations.AlterField( + model_name='novinky', + name='obrazek', + field=models.ImageField(blank=True, null=True, upload_to='image_novinky/%Y/%m/%d/', verbose_name='Obrázek'), + ), + migrations.AlterField( + model_name='novinky', + name='text', + field=models.TextField(blank=True, null=True, verbose_name='Text novinky'), + ), + migrations.AlterField( + model_name='novinky', + name='zverejneno', + field=models.BooleanField(default=False, verbose_name='Zveřejněno'), + ), + migrations.AlterField( + model_name='organizator', + name='strucny_popis_organizatora', + field=models.TextField(blank=True, null=True, verbose_name='Stručný popis organizátora'), + ), + migrations.AlterField( + model_name='organizator', + name='studuje', + field=models.CharField(blank=True, help_text="Např. 'Studuje Obecnou fyziku (Bc.), 3. ročník', 'Vystudovala Diskrétní modely a algoritmy (Mgr.)' nebo 'Přednáší na MFF'", max_length=256, null=True, verbose_name='Studium aj.'), + ), + migrations.CreateModel( + name='Pohadka', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('text', models.TextField(verbose_name='Text pohádky')), + ('pred', models.BooleanField(default=True, verbose_name='Před úlohou')), + ('vytvoreno', models.DateTimeField(blank=True, default=django.utils.timezone.now, editable=False, verbose_name='Vytvořeno')), + ('autor_old', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name=b'Autor poh\xc3\xa1dky')), + ('uloha_old', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='pohadky', to='seminar.Problem', verbose_name='Úloha')), + ('autor', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='seminar.Organizator', verbose_name='Autor pohádky')), + ('uloha', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='pohadky', to='seminar.Uloha', verbose_name='Úloha')), + ], + options={ + 'ordering': ['uloha__cislo_zadani', 'uloha__kod', '-pred'], + 'db_table': 'seminar_pohadky', + 'verbose_name': 'Pohádka', + 'verbose_name_plural': 'Pohádky', + }, + ), + migrations.RenameField( + model_name='problem', + old_name='autor', + new_name='autor_old', + ), + migrations.AddField( + model_name='problem', + name='autor', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='autor_problemu_problem', to='seminar.Organizator', verbose_name='autor problému'), + ), + migrations.AlterField( + model_name='problem', + name='kod', + field=models.CharField(blank=True, default='', help_text='Číslo/kód úlohy v čísle nebo kód tématu/článku/seriálu v ročníku', max_length=32, verbose_name='lokální kód'), + ), + migrations.AlterField( + model_name='problem', + name='stav', + field=models.CharField(choices=[('navrh', 'Návrh'), ('zadany', 'Zadaný'), ('vyreseny', 'Vyřešený'), ('smazany', 'Smazaný')], default='navrh', max_length=32, verbose_name='stav problému'), + ), + migrations.AlterField( + model_name='problem', + name='zamereni', + field=taggit.managers.TaggableManager(blank=True, help_text='Zaměření M/F/I/O problému, příp. další tagy', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='zaměření'), + ), + migrations.AlterField( + model_name='reseni', + name='forma', + field=models.CharField(choices=[('papir', 'Papírové řešení'), ('email', 'Emailem'), ('upload', 'Upload přes web')], default='email', max_length=16, verbose_name='forma řešení'), + ), + migrations.RenameField( + model_name='reseni', + old_name='problem', + new_name='problem_old', + ), + migrations.AlterField( + model_name='resitel', + name='zasilat', + field=models.CharField(choices=[('domu', 'Domů'), ('do_skoly', 'Do školy'), ('nikam', 'Nikam')], default='domu', max_length=32, verbose_name='kam zasílat'), + ), + migrations.AlterField( + model_name='rocnik', + name='exportovat', + field=models.BooleanField(db_column='exportovat', default=False, help_text='Exportuje se jen podle tohoto flagu (ne veřejnosti), a to jen čísla s veřejnou výsledkovkou', verbose_name='export do AESOPa'), + ), + migrations.AlterField( + model_name='skola', + name='aesop_id', + field=models.CharField(blank=True, default='', help_text='Aesopi ID typu "izo:..." nebo "aesop:..."', max_length=32, verbose_name='Aesop ID'), + ), + migrations.AlterField( + model_name='skola', + name='kratky_nazev', + field=models.CharField(blank=True, help_text='Zkrácený název pro zobrazení ve výsledkovce', max_length=256, verbose_name='zkrácený název'), + ), + migrations.AlterField( + model_name='skola', + name='stat', + field=django_countries.fields.CountryField(default='CZ', help_text='ISO 3166-1 kód země velkými písmeny (CZ, SK, ...)', max_length=2, verbose_name='stát'), + ), + migrations.AlterField( + model_name='soustredeni', + name='exportovat', + field=models.BooleanField(db_column='exportovat', default=False, help_text='Exportuje se jen podle tohoto flagu (ne veřejnosti)', verbose_name='export do AESOPa'), + ), + migrations.AlterField( + model_name='soustredeni', + name='misto', + field=models.CharField(blank=True, default='', help_text='Místo (název obce, volitelně též objektu', max_length=256, verbose_name='místo soustředění'), + ), + migrations.AlterField( + model_name='soustredeni', + name='text', + field=models.TextField(blank=True, default='', verbose_name='text k soustředění (HTML)'), + ), + migrations.AlterField( + model_name='soustredeni', + name='typ', + field=models.CharField(choices=[('jarni', 'Jarní soustředění'), ('podzimni', 'Podzimní soustředění'), ('vikend', 'Víkendový sraz')], default='podzimni', max_length=16, verbose_name='typ akce'), + ), + migrations.AlterField( + model_name='soustredeni', + name='verejne_db', + field=models.BooleanField(db_column='verejne', default=False, verbose_name='soustředění zveřejněno'), + ), + migrations.AlterModelTable( + name='problem', + table='seminar_problemy', + ), + migrations.AddField( + model_name='uloha', + name='cislo_deadline', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='deadlinove_ulohy', to='seminar.Cislo', verbose_name='číslo deadlinu'), + ), + migrations.AddField( + model_name='uloha', + name='cislo_reseni', + field=models.ForeignKey(blank=True, help_text='Číslo s řešením úlohy, jen pro úlohy', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='resene_ulohy', to='seminar.Cislo', verbose_name='číslo řešení'), + ), + migrations.AddField( + model_name='uloha', + name='cislo_zadani', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='zadane_ulohy', to='seminar.Cislo', verbose_name='číslo zadání'), + ), + migrations.CreateModel( + name='Tema', + fields=[ + ('problem_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='seminar.Problem')), + ('tema_typ', models.CharField(choices=[('tema', 'Téma'), ('serial', 'Seriál')], default='tema', max_length=16, verbose_name='Typ tématu')), + ('rocnik', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='seminar.Rocnik', verbose_name='ročník')), + ], + options={ + 'verbose_name': 'Téma', + 'verbose_name_plural': 'Témata', + 'db_table': 'seminar_temata', + }, + bases=('seminar.problem',), + ), + migrations.CreateModel( + name='Reseni_Resitele', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('reseni', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='seminar.Reseni', verbose_name='řešení')), + ('resitele', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='seminar.Resitel', verbose_name='řešitel')), + ], + options={ + 'verbose_name': 'Řešení řešitelů', + 'verbose_name_plural': 'Řešení řešitelů', + 'db_table': 'seminar_reseni_resitele', + 'ordering': ['reseni', 'resitele'], + }, + ), + migrations.CreateModel( + name='Obrazek', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('na_web', models.ImageField(blank=True, null=True, upload_to='obrazky/%Y/%m/%d/', verbose_name='obrázek na web')), + ('do_cisla_barevny', models.FileField(blank=True, help_text='Barevná verze obrázku do čísla', null=True, upload_to='obrazky/%Y/%m/%d/', verbose_name='barevný obrázek do čísla')), + ('do_cisla_cernobily', models.FileField(blank=True, help_text='Černobílá verze obrázku do čísla', null=True, upload_to='obrazky/%Y/%m/%d/', verbose_name='černobílý obrázek do čísla')), + ('text', models.ForeignKey(help_text='text, ve kterém se obrázek vyskytuje', on_delete=django.db.models.deletion.CASCADE, to='seminar.Text', verbose_name='text')), + ], + options={ + 'verbose_name': 'obrázek', + 'verbose_name_plural': 'obrázky', + 'db_table': 'seminar_obrazky', + }, + ), + migrations.CreateModel( + name='Hodnoceni', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('body', models.DecimalField(decimal_places=1, max_digits=8, verbose_name='body')), + ('cislo_body', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='hodnoceni', to='seminar.Cislo', verbose_name='číslo pro body')), + ('problem', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='seminar.Problem', verbose_name='problém')), + ('reseni', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='seminar.Reseni', verbose_name='řešení')), + ], + options={ + 'verbose_name': 'Hodnocení', + 'verbose_name_plural': 'Hodnocení', + 'db_table': 'seminar_hodnoceni', + }, + ), + migrations.CreateModel( + name='Clanek', + fields=[ + ('problem_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='seminar.Problem')), + ('cislo', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='seminar.Cislo', verbose_name='číslo')), + ], + options={ + 'verbose_name': 'Článek', + 'verbose_name_plural': 'Články', + 'db_table': 'seminar_clanky', + }, + bases=('seminar.problem',), + ), + migrations.AddField( + model_name='reseni', + name='resitele', + field=models.ManyToManyField(help_text='Seznam autorů řešení', through='seminar.Reseni_Resitele', to='seminar.Resitel', verbose_name='autoři řešení'), + ), + migrations.AddField( + model_name='reseni', + name='text_cely', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='reseni_cely_set', to='seminar.Text', verbose_name='Plná verze textu řešení'), + ), + migrations.AddField( + model_name='reseni', + name='text_zkraceny', + field=models.ManyToManyField(help_text='Seznam úryvků z řešení', related_name='reseni_zkraceny_set', to='seminar.Text', verbose_name='zkrácené verze řešení'), + ), + migrations.AddField( + model_name='skola', + name='kontaktni_osoba', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='seminar.Osoba', verbose_name='Kontaktní osoba'), + ), + migrations.AddField( + model_name='reseni', + name='problem', + field=models.ManyToManyField(help_text='Problém', through='seminar.Hodnoceni', to='seminar.Problem', verbose_name='problém'), + ), + migrations.AddField( + model_name='konfera', + name='reseni', + field=models.OneToOneField(blank=True, help_text='Účastnický přípěvek o konfeře', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='konfery', to='seminar.Reseni', verbose_name='článek ke konfeře'), + ), + migrations.AddField( + model_name='organizator', + name='osoba', + field=models.OneToOneField(help_text='osobní údaje organizátora', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='org', to='seminar.Osoba', verbose_name='osoba'), + ), + migrations.AddField( + model_name='resitel', + name='osoba', + field=models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, to='seminar.Osoba', verbose_name='osoba'), + ), + migrations.CreateModel( + name='TreeNode', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('first_child', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='seminar.TreeNode', verbose_name='první potomek')), + ('root', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='potomci_set', to='seminar.TreeNode', verbose_name='kořen stromu')), + ('succ', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='prev', to='seminar.TreeNode', verbose_name='další element na stejné úrovni')), + ], + options={ + 'verbose_name': 'TreeNode', + 'verbose_name_plural': 'TreeNody', + 'db_table': 'seminar_nodes_treenode', + }, + ), + migrations.CreateModel( + name='CisloNode', + fields=[ + ('treenode_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='seminar.TreeNode')), + ('cislo', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, to='seminar.Cislo', verbose_name='číslo')), + ], + options={ + 'verbose_name': 'Číslo (Node)', + 'verbose_name_plural': 'Čísla (Node)', + 'db_table': 'seminar_nodes_cislo', + }, + bases=('seminar.treenode',), + ), + migrations.CreateModel( + name='ClanekNode', + fields=[ + ('treenode_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='seminar.TreeNode')), + ('clanek', models.OneToOneField(null=True, on_delete=django.db.models.deletion.PROTECT, to='seminar.Clanek', verbose_name='článek')), + ], + options={ + 'verbose_name': 'Článek (Node)', + 'verbose_name_plural': 'Články (Node)', + 'db_table': 'seminar_nodes_clanek', + }, + bases=('seminar.treenode',), + ), + migrations.CreateModel( + name='KonferaNode', + fields=[ + ('treenode_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='seminar.TreeNode')), + ('konfera', models.OneToOneField(null=True, on_delete=django.db.models.deletion.PROTECT, to='seminar.Konfera', verbose_name='konfera')), + ], + options={ + 'verbose_name': 'Konfera (Node)', + 'verbose_name_plural': 'Konfery (Node)', + 'db_table': 'seminar_nodes_konfera', + }, + bases=('seminar.treenode',), + ), + migrations.CreateModel( + name='MezicisloNode', + fields=[ + ('treenode_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='seminar.TreeNode')), + ], + options={ + 'verbose_name': 'Mezičíslo (Node)', + 'verbose_name_plural': 'Mezičísla (Node)', + 'db_table': 'seminar_nodes_mezicislo', + }, + bases=('seminar.treenode',), + ), + migrations.CreateModel( + name='RocnikNode', + fields=[ + ('treenode_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='seminar.TreeNode')), + ('rocnik', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, to='seminar.Rocnik', verbose_name='ročník')), + ], + options={ + 'verbose_name': 'Ročník (Node)', + 'verbose_name_plural': 'Ročníky (Node)', + 'db_table': 'seminar_nodes_rocnik', + }, + bases=('seminar.treenode',), + ), + migrations.CreateModel( + name='TemaVCisleNode', + fields=[ + ('treenode_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='seminar.TreeNode')), + ('tema', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='seminar.Tema', verbose_name='téma v čísle')), + ], + options={ + 'verbose_name': 'Téma v čísle (Node)', + 'verbose_name_plural': 'Témata v čísle (Node)', + 'db_table': 'seminar_nodes_temavcisle', + }, + bases=('seminar.treenode',), + ), + migrations.CreateModel( + name='TextNode', + fields=[ + ('treenode_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='seminar.TreeNode')), + ('text', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='seminar.Text', verbose_name='text')), + ], + options={ + 'verbose_name': 'Text (Node)', + 'verbose_name_plural': 'Text (Node)', + 'db_table': 'seminar_nodes_obsah', + }, + bases=('seminar.treenode',), + ), + migrations.CreateModel( + name='UlohaVzorakNode', + fields=[ + ('treenode_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='seminar.TreeNode')), + ('uloha', models.OneToOneField(null=True, on_delete=django.db.models.deletion.PROTECT, to='seminar.Uloha', verbose_name='úloha')), + ], + options={ + 'verbose_name': 'Vzorák úlohy (Node)', + 'verbose_name_plural': 'Vzoráky úloh (Node)', + 'db_table': 'seminar_nodes_uloha_vzorak', + }, + bases=('seminar.treenode',), + ), + migrations.CreateModel( + name='UlohaZadaniNode', + fields=[ + ('treenode_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='seminar.TreeNode')), + ('uloha', models.OneToOneField(null=True, on_delete=django.db.models.deletion.PROTECT, to='seminar.Uloha', verbose_name='úloha')), + ], + options={ + 'verbose_name': 'Zadání úlohy (Node)', + 'verbose_name_plural': 'Zadání úloh (Node)', + 'db_table': 'seminar_nodes_uloha_zadani', + }, + bases=('seminar.treenode',), + ), + migrations.CreateModel( + name='PohadkaNode', + fields=[ + ('treenode_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='seminar.TreeNode')), + ('pohadka', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, to='seminar.Pohadka', verbose_name='pohádka')), + ], + options={ + 'verbose_name': 'Pohádka (Node)', + 'verbose_name_plural': 'Pohádky (Node)', + 'db_table': 'seminar_nodes_pohadka', + }, + bases=('seminar.treenode',), + ), + + # migr 0051 + migrations.RunPython( + resitel_to_osoba, + reverse_code=osoba_to_resitel, + ), + + # migr 0052 + migrations.RunPython( + spoj_k_organizatorum_osoby, + ), + migrations.RunPython( + fix_problem, + ), + migrations.RunPython( + fix_pohadka, + ), + migrations.RunPython( + fix_novinka, + ), + + # migr 0053 + migrations.RunPython( + rok_to_datetime, + reverse_code=datetime_to_rok, + ), + + migrations.RemoveField( + model_name='prispevek', + name='problem', + ), + migrations.RemoveField( + model_name='prispevek', + name='reseni', + ), + migrations.DeleteModel( + name='ProblemNavrh', + ), + migrations.DeleteModel( + name='ProblemZadany', + ), + migrations.RemoveField( + model_name='cislo', + name='faze', + ), + migrations.RemoveField( + model_name='konfera', + name='popis', + ), + migrations.RemoveField( + model_name='konfera', + name='prispevek', + ), + migrations.RemoveField( + model_name='problem', + name='import_dakos_id', + ), + migrations.RemoveField( + model_name='resitel', + name='import_mamoper_id', + ), + migrations.RemoveField( + model_name='skola', + name='import_dakos_id', + ), + migrations.DeleteModel( + name='Prispevek', + ), + + # migr 0056 + migrations.RunPython( + generuj_RocnikNody_a_CisloNody, + ), + + # migr 0057 + migrations.RunPython( + reseni_to_Reseni, + ), + + # migr 0058 + migrations.RunPython( + uloha_to_Uloha, + ), + migrations.RunPython( + tema_to_Tema, + ), + migrations.RunPython( + clanek_to_Clanek, + ), + migrations.RunPython( + konfery_rucne, + ), + + # migr 0059 + migrations.RunPython( + vytvor_pohadkanode, + ), + + # migr 0060 + migrations.RunPython( + pokacej_les, + ), + + migrations.RemoveField( + model_name='novinky', + name='autor_old', + ), + migrations.RemoveField( + model_name='organizator', + name='foto', + ), + migrations.RemoveField( + model_name='organizator', + name='organizuje_do_roku', + ), + migrations.RemoveField( + model_name='organizator', + name='organizuje_od_roku', + ), + migrations.RemoveField( + model_name='organizator', + name='prezdivka', + ), + migrations.RemoveField( + model_name='organizator', + name='user', + ), + migrations.RemoveField( + model_name='pohadka', + name='autor_old', + ), + migrations.RemoveField( + model_name='pohadka', + name='uloha_old', + ), + migrations.RemoveField( + model_name='problem', + name='autor_old', + ), + migrations.RemoveField( + model_name='problem', + name='body', + ), + migrations.RemoveField( + model_name='problem', + name='cislo_reseni_old', + ), + migrations.RemoveField( + model_name='problem', + name='cislo_zadani_old', + ), + migrations.RemoveField( + model_name='problem', + name='opravovatel', + ), + migrations.RemoveField( + model_name='problem', + name='text_reseni', + ), + migrations.RemoveField( + model_name='problem', + name='text_zadani', + ), + migrations.RemoveField( + model_name='problem', + name='typ', + ), + migrations.RemoveField( + model_name='reseni', + name='body', + ), + migrations.RemoveField( + model_name='reseni', + name='cislo_body', + ), + migrations.RemoveField( + model_name='reseni', + name='problem_old', + ), + migrations.RemoveField( + model_name='reseni', + name='resitel', + ), + migrations.RemoveField( + model_name='resitel', + name='datum_narozeni', + ), + migrations.RemoveField( + model_name='resitel', + name='datum_prihlaseni', + ), + migrations.RemoveField( + model_name='resitel', + name='datum_souhlasu_udaje', + ), + migrations.RemoveField( + model_name='resitel', + name='datum_souhlasu_zasilani', + ), + migrations.RemoveField( + model_name='resitel', + name='email', + ), + migrations.RemoveField( + model_name='resitel', + name='jmeno', + ), + migrations.RemoveField( + model_name='resitel', + name='mesto', + ), + migrations.RemoveField( + model_name='resitel', + name='pohlavi_muz', + ), + migrations.RemoveField( + model_name='resitel', + name='prijmeni', + ), + migrations.RemoveField( + model_name='resitel', + name='psc', + ), + migrations.RemoveField( + model_name='resitel', + name='stat', + ), + migrations.RemoveField( + model_name='resitel', + name='telefon', + ), + migrations.RemoveField( + model_name='resitel', + name='ulice', + ), + migrations.RemoveField( + model_name='resitel', + name='user', + ), + migrations.AlterModelOptions( + name='pohadka', + options={'ordering': ['vytvoreno'], 'verbose_name': 'Pohádka', 'verbose_name_plural': 'Pohádky'}, + ), + migrations.RemoveField( + model_name='pohadka', + name='pred', + ), + migrations.RemoveField( + model_name='pohadka', + name='text', + ), + migrations.RemoveField( + model_name='pohadka', + name='uloha', + ), + migrations.AlterField( + model_name='cislo', + name='verejna_vysledkovka', + field=models.BooleanField(default=False, help_text='Je-li false u veřejného čísla, není výsledkovka zatím veřejná.', verbose_name='zveřejněna výsledkovka'), + ), + migrations.AlterField( + model_name='prijemce', + name='osoba', + field=models.OneToOneField(help_text='Které osobě či na jakou adresu se mají zasílat čísla', on_delete=django.db.models.deletion.CASCADE, to='seminar.Osoba', verbose_name='komu'), + ), + migrations.AlterField( + model_name='reseni', + name='cas_doruceni', + field=models.DateTimeField(blank=True, default=django.utils.timezone.now, verbose_name='čas_doručení'), + ), + migrations.AlterField( + model_name='cislo', + name='rocnik', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='cisla', to='seminar.Rocnik', verbose_name='ročník'), + ), + migrations.AlterField( + model_name='clanek', + name='cislo', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='seminar.Cislo', verbose_name='číslo'), + ), + migrations.AlterField( + model_name='hodnoceni', + name='cislo_body', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='hodnoceni', to='seminar.Cislo', verbose_name='číslo pro body'), + ), + migrations.AlterField( + model_name='hodnoceni', + name='problem', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='seminar.Problem', verbose_name='problém'), + ), + migrations.AlterField( + model_name='konfery_ucastnici', + name='konfera', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='seminar.Konfera', verbose_name='konfera'), + ), + migrations.AlterField( + model_name='konfery_ucastnici', + name='resitel', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='seminar.Resitel', verbose_name='řešitel'), + ), + migrations.AlterField( + model_name='nastaveni', + name='aktualni_cislo', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='seminar.Cislo', verbose_name='poslední vydané číslo'), + ), + migrations.AlterField( + model_name='nastaveni', + name='aktualni_rocnik', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='seminar.Rocnik', verbose_name='aktuální ročník'), + ), + migrations.AlterField( + model_name='novinky', + name='autor', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='seminar.Organizator', verbose_name='Autor novinky'), + ), + migrations.AlterField( + model_name='organizator', + name='osoba', + field=models.OneToOneField(help_text='osobní údaje organizátora', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='org', to='seminar.Osoba', verbose_name='osoba'), + ), + migrations.AlterField( + model_name='osoba', + name='user', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to=settings.AUTH_USER_MODEL, verbose_name='uživatel'), + ), + migrations.AlterField( + model_name='pohadka', + name='autor', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='seminar.Organizator', verbose_name='Autor pohádky'), + ), + migrations.AlterField( + model_name='problem', + name='autor', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='autor_problemu_problem', to='seminar.Organizator', verbose_name='autor problému'), + ), + migrations.AlterField( + model_name='problem', + name='garant', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='garant_problemu_problem', to='seminar.Organizator', verbose_name='garant zadaného problému'), + ), + migrations.AlterField( + model_name='problem', + name='nadproblem', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='nadproblem_problem', to='seminar.Problem', verbose_name='nadřazený problém'), + ), + migrations.AlterField( + model_name='reseni', + name='text_cely', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='reseni_cely_set', to='seminar.Text', verbose_name='Plná verze textu řešení'), + ), + migrations.AlterField( + model_name='reseni_resitele', + name='resitele', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='seminar.Resitel', verbose_name='řešitel'), + ), + migrations.AlterField( + model_name='resitel', + name='osoba', + field=models.OneToOneField(null=True, on_delete=django.db.models.deletion.SET_NULL, to='seminar.Osoba', verbose_name='osoba'), + ), + migrations.AlterField( + model_name='resitel', + name='skola', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='seminar.Skola', verbose_name='škola'), + ), + migrations.AlterField( + model_name='skola', + name='kontaktni_osoba', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='seminar.Osoba', verbose_name='Kontaktní osoba'), + ), + migrations.AlterField( + model_name='soustredeni', + name='rocnik', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='soustredeni', to='seminar.Rocnik', verbose_name='ročník'), + ), + migrations.AlterField( + model_name='soustredeni_organizatori', + name='organizator', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='seminar.Organizator', verbose_name='organizátor'), + ), + migrations.AlterField( + model_name='soustredeni_organizatori', + name='soustredeni', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='seminar.Soustredeni', verbose_name='soustředění'), + ), + migrations.AlterField( + model_name='soustredeni_ucastnici', + name='resitel', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='seminar.Resitel', verbose_name='řešitel'), + ), + migrations.AlterField( + model_name='soustredeni_ucastnici', + name='soustredeni', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='seminar.Soustredeni', verbose_name='soustředění'), + ), + migrations.AlterField( + model_name='tema', + name='rocnik', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='seminar.Rocnik', verbose_name='ročník'), + ), + migrations.AlterField( + model_name='uloha', + name='cislo_deadline', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='deadlinove_ulohy', to='seminar.Cislo', verbose_name='číslo deadlinu'), + ), + migrations.AlterField( + model_name='uloha', + name='cislo_reseni', + field=models.ForeignKey(blank=True, help_text='Číslo s řešením úlohy, jen pro úlohy', null=True, on_delete=django.db.models.deletion.PROTECT, related_name='resene_ulohy', to='seminar.Cislo', verbose_name='číslo řešení'), + ), + migrations.AlterField( + model_name='uloha', + name='cislo_zadani', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='zadane_ulohy', to='seminar.Cislo', verbose_name='číslo zadání'), + ), + migrations.AddField( + model_name='treenode', + name='polymorphic_ctype', + field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_seminar.treenode_set+', to='contenttypes.ContentType'), + ), + migrations.RunPython( + vyrob_treenodum_ctypes, + reverse_code=migrations.RunPython.noop, + ), + migrations.AddField( + model_name='problem', + name='polymorphic_ctype', + field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_seminar.problem_set+', to='contenttypes.ContentType'), + ), + migrations.RunPython( + vyrob_problemum_ctypes, + reverse_code=migrations.RunPython.noop, + ), + migrations.AlterField( + model_name='konfera', + name='nazev', + field=models.CharField(help_text='Název konfery', max_length=100, verbose_name='název konfery'), + ), + ] diff --git a/seminar/testutils.py b/seminar/testutils.py index 8a1581a0..9ff32b53 100644 --- a/seminar/testutils.py +++ b/seminar/testutils.py @@ -35,11 +35,6 @@ def gen_osoby(rnd, size): 'Stará myslivna', 'Kocourkov', 'Šalingrad', 'Medvědí hora', 'Basilej', 'Unterschiedlich', 'Old York', 'Lancastershire', 'Vóloďháza'] - seznam_konicku = ["vařím", "jezdím na kole", "řeším diferenciální rovnice", "koukám z okna", - "tancuji", "programuji", "jezdím vlakem", "nedělám nic"] - seznam_oboru = ["matematiku", "matematiku", "matematiku", "fyziku", "literaturu", - "informatiku", "informatiku", "běhání dokolečka"] - osoby = [] # 30 je náhodná konstanta, size je použité na víc místech a # říká, jak velká asi chceme testovací data @@ -58,20 +53,10 @@ def gen_osoby(rnd, size): mesto = rnd.choice(seznam_mest) psc = "".join([str(rnd.choice([k for k in range(10)])) for i in range(5)]) - konicek1 = rnd.choice(seznam_konicku) - popis_orga = "Ve volném čase ".join(konicek1) - popis_orga.join(" a kromě toho taky ") - konicek2 = rnd.choice(seznam_konicku) - popis_orga.join(konicek2) - obor = rnd.choice(seznam_oboru) - popis_orga.join(" Studuji ") - popis_orga.join(obor) - popis_orga.join(" a moc mě to baví.") - osoby.append(Osoba.objects.create(jmeno = jmeno, prijmeni = prijmeni, prezdivka = prezdivka, pohlavi_muz = pohlavi, email = email, telefon = telefon, datum_narozeni = narozeni, ulice = ulice, - mesto = mesto, psc = psc, strucny_popis_organizatora = popis_orga, + mesto = mesto, psc = psc, datum_registrace = datetime.date(rnd.randint(2019, 2029), rnd.randint(1, 12), rnd.randint(1, 28)))) #TODO pridat foto male a velke. Jak? @@ -122,6 +107,13 @@ def gen_prijemci(rnd, osoby, kolik=10): def gen_organizatori(rnd, osoby, last_rocnik, users): organizatori = [] + + + seznam_konicku = ["vařím", "jezdím na kole", "řeším diferenciální rovnice", "koukám z okna", + "tancuji", "programuji", "jezdím vlakem", "nedělám nic"] + seznam_oboru = ["matematiku", "matematiku", "matematiku", "fyziku", "literaturu", + "informatiku", "informatiku", "běhání dokolečka"] + for os in osoby: rand = rnd.randint(0, 8) if (rand % 8 == 0): @@ -130,10 +122,17 @@ def gen_organizatori(rnd, osoby, last_rocnik, users): do = datetime.date(od.year + rnd.randint(1, 6), rnd.randint(1, 12), rnd.randint(1, 28)) #aktualni organizatori jeste nemaji vyplnene organizuje_do + + #popis orga + konicek1 = rnd.choice(seznam_konicku) + konicek2 = rnd.choice(seznam_konicku) + obor = rnd.choice(seznam_oboru) + popis_orga = "Ve volném čase " + konicek1 + " a také " + konicek2 + ". Studuji " + obor + " a moc mě to baví." + if do.year > datetime.datetime.now().year: do = None organizatori.append(Organizator.objects.create(osoba=os, - organizuje_od=od, organizuje_do=do)) + organizuje_od=od, organizuje_do=do, strucny_popis_organizatora = popis_orga)) return organizatori def gen_ulohy_do_cisla(rnd, organizatori, resitele, rocnik_cisla, rocniky, size):