# Generated by Django 2.2.24 on 2021-09-10 21:44 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 from datetime import date from django.db.models import Q from treenode.treelib import get_parent import datetime as dt import logging logger = logging.getLogger(__name__) # 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 if r.datum_prihlaseni else date.max # Myslím si, že None by způsobilo použití defaultu 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 o.poznamka += f'\nWEB DEBUG: Osoba pro řešitele {r.id}' if o.user: u = o.user if u.first_name: if not o.jmeno: o.jmeno = u.first_name u.first_name += ' (Uživatel!)' elif o.jmeno == u.first_name: u.first_name += ' (Uživatel!)' 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 += ' (Uživatel!)' elif o.prijmeni == u.last_name: u.last_name += ' (Uživatel!)' 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 elif o.email != u.email: 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 # Myšlenka: Když najdeme řešitele pro daného uživatele, tak se vezme Osoba příslušná uživateli, # Pokud nenajdeme uživatele, tak ještě zkusíme dohledat Osobu podle e-mailu user = org.user if user is None: logger.error(f'Org {org} nemá uživatele!') # Je to podezřelé, ale prostě vyrobíme novou osobu. osoba = Osoba() osoba.poznamka += f'\nWEB DEBUG: BUG: Osoba pro Orga {org.id} bez Uživatele' # Téhle osobě nejdou nastavit detaily, protože žádné nemáme. # Datum registrace budiž maximální osoba.datum_registrace = date.max else: logger.info(f'Org {org.user.email}(ID: {org.id}) má uživatele {user}') # 💢💢💢 Python nemá goto, ale prý má výjimky… 💢💢💢 class EndException(Exception): pass try: # Hledáme podle uživatele resitele = Resitel.objects.filter(user=user) if resitele.count() != 0 and user is not None: osoba = resitele.first().osoba osoba.poznamka += f'\nWEB DEBUG: Osoba pro Orga {org.id} spárovaná podle Uživatele Řešitele' logger.info(f'Našel jsem řešitele {resitele.first().email} podle uživatele, používám jeho Osobu') raise EndException # Hledáme podle e-mailu osoby = Osoba.objects.filter(email__iexact=user.email) if osoby.count() != 0 and user.email != '': osoba = osoby.first() if osoba.user is None: osoba.user = user osoba.poznamka += f'\nWEB DEBUG: Osoba pro Orga {org.id} spárovaná podle e-mailu' logger.info(f'Našel jsem Osobu {osoby.first().email} podle e-mailu') raise EndException # Fallback logger.warning(f'Org neměl řešitele, zakládám novou Osobu.') osoba = Osoba(user=user) osoba.poznamka += f'\nWEB DEBUG: Osoba pro Orga {org.id} vytvořena nová jen podle existence Uživatele' # Přesun informací z usera do osoby # pro osoby z řešitelů (jediné dosud existující osoby) již v minule migraci osoba.jmeno = user.first_name osoba.prijmeni = user.last_name osoba.email = user.email user.first_name += " (Uživatel!)" user.last_name += " (Uživatel!)" osoba.datum_registrace = min(osoba.datum_registrace, user.date_joined, key=lambda d: d if d is not None else date.max) user.save() except EndException: pass # 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_0052(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: if Organizator.objects.filter(osoba__user=pr.opravovatel).first() is not None: pr.opravovatele.add(Organizator.objects.filter(osoba__user=pr.opravovatel).first()) else: logger.error(f'WTF, nespárovaný opravovatel {pr.opravovatel} problému {pr}') 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( # Zakomentované fieldy by se už měly nacházet v příslušném problému problem_ptr = uold, 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, ) uold.save() # DULEZITE!!! Jinak Uloha.objects.create() přepíše všechny atributy Problému unew.opravovatele.add(*uold.opravovatele.all()) # 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') ReseniNode = apps.get_model('seminar', 'ReseniNode') Text = apps.get_model('seminar', 'Text') TextNode = apps.get_model('seminar', 'TextNode') # XXX: Org-clanky neexistuji, tak je migrace ani nepodporuje. clanky = Problem.objects.filter(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í ) cl.save() # DULEZITE!!! Jinak Clanek.objects.create() přepíše všechny atributy Problému def Clanek_Treenody(apps, schema_editor): Problem = apps.get_model('seminar', 'Problem') Clanek = apps.get_model('seminar', 'Clanek') ReseniNode = apps.get_model('seminar', 'ReseniNode') Text = apps.get_model('seminar', 'Text') TextNode = apps.get_model('seminar', 'TextNode') for cl in Clanek.objects.all(): # Vyrobíme nody: # Clanek nema vlastni node, ma (prave jedno) Reseni a to ma text_cely -- ReseniNode reseni = cl.reseni_set.all() if len(reseni) != 1: raise ValueError(f'Clanek {cl.id} ma vic reseni {len(reseni)} ({reseni})') reseni = reseni[0] resnode = ReseniNode(reseni=reseni) poskladej_strom(apps, resnode, cl.text_zadani, cl.text_reseni) resnode.save() reseni.text_cely = resnode reseni.save() def fix_Clanek_Reseni(apps, schema_editor): Problem = apps.get_model('seminar', 'Problem') Clanek = apps.get_model('seminar', 'Clanek') Reseni = apps.get_model('seminar', 'Reseni') Hodnoceni = apps.get_model('seminar', 'Hodnoceni') Resitel = apps.get_model('seminar', 'Resitel') # Je potreba zajistit, ze clanky budou mit jen jedno reseni -- z pohledu # modelu nic jineho nedava smysl. Ve stavajicim modelu ale naopak nelze # reprezentovat vice resitelu jednoho clanku (coz je ale bezne -- clanky z # konfer) Musime tedy opravit, aby misto nekolika reseni kazdeho resitele # samostatne zustalo jen jedno reseni, spravne obodovane a s vice resiteli # jako autory for cl in Clanek.objects.all(): rr = cl.reseni_set.all() if len(rr) == 1: continue # Vice nez jedno reseni, jdeme je sjednotit. resitele = [] vzor_hodnoceni = rr[0].hodnoceni_set.first() ostatni_hodnoceni = [] for r in rr: # Overime, ze nemame kolizi v datech: h = r.hodnoceni_set.first() if h.cislo_body != vzor_hodnoceni.cislo_body or h.body != vzor_hodnoceni.body: raise ValueError(f'Clanek {cl.id} ma vice nekonzistentnich reseni') if h.id != vzor_hodnoceni.id: ostatni_hodnoceni.append(h) resitele.extend(r.resitele.all()) rr[0].resitele.set(resitele) rr[0].save() vzor_hodnoceni.save() # Ted mame spravne databazi, jeste potrebujeme z databaze smazat po novu nepouzita hodnoceni for h in ostatni_hodnoceni: h.reseni.delete() h.delete() 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, ) t.save() # DULEZITE!!! Jinak Tema.objects.create() přepíše všechny atributy Problému # 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 nastav_koren(koren, node): node.root = koren node.save() if node.succ: nastav_koren(koren, node.succ) if node.first_child: nastav_koren(koren, node.first_child) 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: nastav_koren(rodic.root, potomek) # 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: tnodes = t.temavcislenode_set.all() # Migrujeme, TvCN je jen jedno dohromady assert(len(tnodes) == 1) tnode = tnodes[0] # Zkontrolujeme a preskocime cislo_reseni if t.cislo_zadani_old and t.cislo_reseni_old: assert(t.cislo_zadani_old.rocnik == t.cislo_reseni_old.rocnik and t.cislo_zadani_old.cislo <= t.cislo_reseni_old.cislo) if t.cislo_reseni_old == c: # Už by mělo být přidané do čísla zadání continue # 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'): # Zmena: Clanky nemaji vlastni Node, ale pouziva se ReseniNode v text_cely reseni = cl.reseni_set.all() if len(reseni) != 1: raise ValueError('Clanek ma vic reseni') resnode = reseni[0].text_cely pridej_potomka(cnode, resnode) # 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.0068_treenode_nazev def fix_RocnikNode_names(apps,schema_editor): Objects = apps.get_model('seminar', 'RocnikNode') for obj in Objects.objects.all(): obj.nazev = str(obj.rocnik)+" (RocnikNode)" obj.save() def fix_CisloNode_names(apps,schema_editor): Objects = apps.get_model('seminar', 'CisloNode') for obj in Objects.objects.all(): obj.nazev = str(obj.cislo)+" (CisloNode)" obj.save() def fix_MezicisloNode_names(apps,schema_editor): Objects = apps.get_model('seminar', 'MezicisloNode') for obj in Objects.objects.all(): if obj.prev: if (obj.prev.get_real_instance_class() != CisloNode and obj.prev.get_real_instance_class() != MezicisloNode): raise ValueError("Předchůdce není číslo!") posledni = obj.prev.cislo obj.nazev = "Mezičíslo po čísle"+str(posledni)+" (MezicisloNode)" elif obj.root: if obj.root.get_real_instance_class() != RocnikNode: raise ValueError("Kořen stromu není ročník!") rocnik = obj.root.rocnik obj.nazev = "První mezičíslo ročníku "+" (MezicisloNode)" else: print("!!!!! Nějaké neidentifikované mezičíslo !!!!!") obj.nazev = "Neidentifikovatelné mezičíslo! (MezicisloNode)" obj.save() def fix_TemaVCisleNode_names(apps,schema_editor): Objects = apps.get_model('seminar', 'TemaVCisleNode') for obj in Objects.objects.all(): obj.nazev = str(obj.tema)+" (TemaVCisleNode)" obj.save() def fix_KonferaNode_names(apps,schema_editor): Objects = apps.get_model('seminar', 'KonferaNode') for obj in Objects.objects.all(): obj.nazev = str(obj.konfera)+" (KonferaNode)" obj.save() def fix_ClanekNode_names(apps,schema_editor): Objects = apps.get_model('seminar', 'ClanekNode') for obj in Objects.objects.all(): obj.nazev = str(obj.clanek)+" (ClanekNode)" obj.save() def fix_UlohaZadaniNode_names(apps,schema_editor): Objects = apps.get_model('seminar', 'UlohaZadaniNode') for obj in Objects.objects.all(): obj.nazev = str(obj.uloha)+" (UlohaZadaniNode)" obj.save() def fix_PohadkaNode_names(apps,schema_editor): Objects = apps.get_model('seminar', 'PohadkaNode') for obj in Objects.objects.all(): obj.nazev = str(obj.pohadka)+" (PohadkaNode)" obj.save() def fix_UlohaVzorakNode_names(apps,schema_editor): Objects = apps.get_model('seminar', 'UlohaVzorakNode') for obj in Objects.objects.all(): obj.nazev = str(obj.uloha)+" (UlohaVzorakNode)" obj.save() def fix_TextNode_names(apps,schema_editor): Objects = apps.get_model('seminar', 'TextNode') for obj in Objects.objects.all(): obj.nazev = str(obj.text)+" (TextNode)" obj.save() def fix_all_names(apps,schema_editor): fix_RocnikNode_names(apps,schema_editor) fix_CisloNode_names(apps,schema_editor) fix_MezicisloNode_names(apps,schema_editor) fix_TemaVCisleNode_names(apps,schema_editor) fix_KonferaNode_names(apps,schema_editor) fix_ClanekNode_names(apps,schema_editor) fix_UlohaZadaniNode_names(apps,schema_editor) fix_PohadkaNode_names(apps,schema_editor) fix_UlohaVzorakNode_names(apps,schema_editor) fix_TextNode_names(apps,schema_editor) # seminar.migrations.0073_copy_osoba_email_to_user_email def copy_mails(apps, schema_editor): Osoba = apps.get_model('seminar', 'Osoba') for o in Osoba.objects.all(): if o.user is not None: u = o.user u.email = o.email u.save() # seminar.migrations.0084_clanek_cislo def najdi_cislo(apps, schema_editor): Clanek = apps.get_model('seminar', 'Clanek') Hodnoceni = apps.get_model('seminar', 'Hodnoceni') Reseni = apps.get_model('seminar', 'Reseni') ReseniNode = apps.get_model('seminar', 'ReseniNode') CisloNode = apps.get_model('seminar', 'CisloNode') ContentType = apps.get_model('contenttypes', 'ContentType') for c in Clanek.objects.all(): reseni = c.reseni_set if (reseni.count() != 1): # Pozor, reseni_set je Manager, takže se na něj musí trošku jinak logger.warn(f"Více než jedno řešení pro článek {c}") c.cislo = None c.save() continue r = reseni.first() aktualniNode = r.text_cely # Hlavní ReseniNode pro řešení while aktualniNode is not None: #if isinstance(aktualniNode, CisloNode): # Nejde, protože aktualniNode se tváří jako obecný TreeNode... # Ale v dokumentaci k django-polymorphic se píše, že tam jsou nastavené nějaké fieldy na známé hodnoty :-) # https://django-polymorphic.readthedocs.io/en/stable/migrating.html cislonode_ct = ContentType.objects.get_for_model(CisloNode) akt_ct = aktualniNode.polymorphic_ctype if akt_ct == cislonode_ct: # Zneužíváme tu opačnou vazbu k treenode_ptr, protože # aktualniNode je "jen" TreeNode a ne CisloNode c.cislo = aktualniNode.cislonode.cislo c.save() break aktualniNode = get_parent(aktualniNode) # seminar.migrations.0087_fix_polymorphism # Pomocná funkce -- děláme to samé pro obě polymorfní hierarchie def fix_ctypes(parent: str, children, apps, schema_editor): Parent = apps.get_model('seminar', parent) ContentType = apps.get_model('contenttypes', 'ContentType') # Nejdřív všechno smažeme: Parent.objects.update(polymorphic_ctype=None) # Opravíme děti for clsname in children: Model = apps.get_model('seminar', clsname) ct = ContentType.objects.get_for_model(Model) Model.objects.update(polymorphic_ctype=ct) # Ostatní instance mají mít explicitně content type pro rodiče new_ct = ContentType.objects.get_for_model(Parent) for obj in Parent.objects.filter(polymorphic_ctype__isnull=True): # Po úpravě pořadí migrací se tohle stane pro každý problém. Není to správně, ale warning moc otravuje… logger.info(f"{parent} \"{obj}\" neměl content type -- nejspíš to je instance přímo {parent}!") obj.polymorphic_ctype=new_ct obj.save() def fix_treenode(apps, schema_editor): children = ['RocnikNode', 'CisloNode', 'MezicisloNode', 'TemaVCisleNode', 'OrgTextNode', 'UlohaZadaniNode', 'UlohaVzorakNode', 'PohadkaNode', 'TextNode', 'CastNode', 'ReseniNode'] fix_ctypes("TreeNode", children, apps, schema_editor) def fix_problem_0087(apps, schema_editor): children = ['Tema', 'Clanek', 'Uloha'] # FIXME: Konfera z nějakého důvodu tenhle field vůbec nemá, asi je to špatně. fix_ctypes("Problem", children, apps, schema_editor) # seminar.migrations.0088_perm_org_a_ucastnik def add_perms(apps, schema_editor): ContentType = apps.get_model('contenttypes', 'ContentType') User = apps.get_model('auth', 'User') Permission = apps.get_model('auth', 'Permission') Resitel = apps.get_model('seminar', 'Resitel') c = ContentType.objects.get_for_model(User) org_perm = Permission.objects.filter(codename__exact='org').first() if not org_perm: org_perm = Permission.objects.create(codename='org', name='org', content_type=c) resitel_perm = Permission.objects.filter(codename__exact='resitel').first() if not resitel_perm: resitel_perm = Permission.objects.create(codename='resitel', name='resitel', content_type=c) for r in Resitel.objects.all(): u = r.osoba.user if u: u.user_permissions.add(resitel_perm) for org in User.objects.all(): if org and org.is_staff: org.user_permissions.add(org_perm) org.user_permissions.remove(resitel_perm) # seminar.migrations.0095_fix_polymorphism def fix_all(apps, schema_editor): ContentType = apps.get_model('contenttypes', 'ContentType') for modelname in [ # Problémy: 'Tema', 'Uloha', 'Clanek', # Konfery neexistuji, takze ani neni co nastavovat... # TreeNody: 'RocnikNode', 'CisloNode', 'MezicisloNode', 'TemaVCisleNode', 'OrgTextNode', 'UlohaZadaniNode', 'PohadkaNode', 'UlohaVzorakNode', 'TextNode', 'CastNode', 'ReseniNode', ]: Model = apps.get_model('seminar', modelname) ct = ContentType.objects.get_for_model(Model) Model.objects.update(polymorphic_ctype=ct) # seminar.migrations.0096_fix_zamereni def fix_zamereni(apps, schema_editor): ContentType = apps.get_model('contenttypes', 'ContentType') Problem = apps.get_model('seminar', 'Problem') ProblemCT = ContentType.objects.get_for_model(Problem) TaggedItem = apps.get_model('taggit', 'TaggedItem') typy_problemu = [ 'Clanek', 'Tema', 'Uloha', 'Konfera', ] for typ in typy_problemu: Model = apps.get_model('seminar', typ) ModelCT = ContentType.objects.get_for_model(Model) # Neumím jednoduše zjistit, které objekty jsou které, tak je prostě procyklím for obj in Model.objects.all(): TaggedItem.objects.filter(object_id=obj.problem_ptr.id, content_type=ProblemCT).update(content_type=ModelCT) class Migration(migrations.Migration): 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', '0066c_reseninode'), ('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', '0065_treenode_polymorphic_ctype'), ('seminar', '0066_problem_polymorphic_ctype'), ('seminar', '0066b_orgtextnode'), ('seminar', '0077_auto_20200318_2146'), ('seminar', '0087_fix_polymorphism'), ('seminar', '0058_problem_to_uloha_tema_clanek'), ('seminar', 'fix_0058'), ('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', '0067_auto_20190814_0805'), ('seminar', '0068_treenode_nazev'), ('seminar', '0069_auto_20191120_2115'), ('seminar', '0070_auto_20191120_2357'), ('seminar', '0071_remove_nastaveni_aktualni_rocnik'), ('seminar', '0072_auto_20191204_2257'), ('seminar', '0073_copy_osoba_email_to_user_email'), ('seminar', '0074_auto_20200228_1401'), ('seminar', '0075_auto_20200228_2010'), ('seminar', '0076_auto_20200228_2013'), ('seminar', '0079_clanek_resitelsky'), ('seminar', '0080_zruseni_claneknode_a_konferanode'), ('seminar', '0081_auto_20200408_2221'), ('seminar', '0082_auto_20200506_1951'), ('seminar', '0083_auto_20200506_1952'), ('seminar', '0084_clanek_cislo'), ('seminar', '0086_auto_20200819_0959'), ('seminar', '0088_perm_org_a_ucastnik'), ('seminar', '0089_cislo_datum_preddeadline'), ('seminar', '0090_auto_20201110_1958'), ('seminar', '0091_resitel_zasilat_cislo_emailem'), ('seminar', '0092_auto_20210309_2049'), ('seminar', '0093_auto_20210330_2105'), ('seminar', '0094_auto_20210701_0149'), ('seminar', '0095_fix_polymorphism'), ('seminar', '0096_fix_zamereni'), ('seminar', '0097_auto_20210903_0112'), ('seminar', '0098_auto_20210906_0305')] initial = True dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('contenttypes', '0002_remove_content_type_name'), ('taggit', '0001_initial'), ('taggit', '0003_taggeditem_add_unique_index'), ] 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)', reverse_sql='update seminar_rocniky set rocnik_n = cast (rocnik as nvarchar(16))', ), 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(blank=True, 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(null=True, 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_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',), ), migrations.CreateModel( name='ReseniNode', 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')), ('reseni', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='seminar.Reseni', verbose_name='reseni')), ], options={ 'verbose_name': 'Otištěné řešení (Node)', 'verbose_name_plural': 'Otištěná řešení (Node)', 'db_table': 'seminar_nodes_otistene_reseni', }, bases=('seminar.treenode',), ), migrations.AddField( model_name='reseni', name='text_cely', field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='reseni_cely_set', to='seminar.ReseniNode', verbose_name='Plná verze textu řešení'), ), migrations.RunPython( code=resitel_to_osoba, reverse_code=osoba_to_resitel, ), migrations.RunPython( code=spoj_k_organizatorum_osoby, reverse_code=django.db.migrations.operations.special.RunPython.noop, ), migrations.RunPython( code=fix_problem_0052, reverse_code=django.db.migrations.operations.special.RunPython.noop, ), migrations.RunPython( code=fix_pohadka, reverse_code=django.db.migrations.operations.special.RunPython.noop, ), migrations.RunPython( code=fix_novinka, reverse_code=django.db.migrations.operations.special.RunPython.noop, ), migrations.RunPython( code=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', ), migrations.RunPython( code=generuj_RocnikNody_a_CisloNody, reverse_code=django.db.migrations.operations.special.RunPython.noop, ), migrations.RunPython( code=reseni_to_Reseni, reverse_code=django.db.migrations.operations.special.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.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.CreateModel( name='OrgTextNode', 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')), ('org_verejny', models.BooleanField(default=True, help_text='Pokud ano, bude org pod článkem podepsaný', verbose_name='Org je veřejný?')), ('organizator', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='seminar.Organizator', verbose_name='Organizátor')), ], options={ 'verbose_name': 'Organizátorský článek (Node)', 'verbose_name_plural': 'Organizátorské články (Node)', 'db_table': 'seminar_nodes_orgtextnode', }, bases=('seminar.treenode',), ), migrations.CreateModel( name='CastNode', 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')), ('nadpis', models.CharField(help_text='Nadpis podvěšené části obsahu', max_length=100, verbose_name='Nadpis')), ], options={ 'verbose_name': 'Část (Node)', 'verbose_name_plural': 'Části (Node)', 'db_table': 'seminar_nodes_cast', }, bases=('seminar.treenode',), ), migrations.AlterField( model_name='treenode', name='first_child', field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='father_of_first', to='seminar.TreeNode', verbose_name='první potomek'), ), migrations.RunPython( code=fix_treenode, reverse_code=django.db.migrations.operations.special.RunPython.noop, ), migrations.RunPython( code=fix_problem_0087, reverse_code=django.db.migrations.operations.special.RunPython.noop, ), migrations.RunPython( code=uloha_to_Uloha, reverse_code=django.db.migrations.operations.special.RunPython.noop, ), migrations.RunPython( code=tema_to_Tema, reverse_code=django.db.migrations.operations.special.RunPython.noop, ), migrations.RunPython( code=clanek_to_Clanek, reverse_code=django.db.migrations.operations.special.RunPython.noop, ), migrations.RunPython( code=fix_Clanek_Reseni, reverse_code=django.db.migrations.operations.special.RunPython.noop, ), migrations.RunPython( code=Clanek_Treenody, reverse_code=django.db.migrations.operations.special.RunPython.noop, ), migrations.RunPython( code=konfery_rucne, reverse_code=django.db.migrations.operations.special.RunPython.noop, ), migrations.RunSQL( sql="update seminar_problemy set typ = 'uloha' where typ like 'b_uloha_';", reverse_sql="update seminar_problemy set typ = 'uloha' where typ like 'b_uloha_';", ), migrations.RunPython( code=vytvor_pohadkanode, reverse_code=django.db.migrations.operations.special.RunPython.noop, ), migrations.RunPython( code=pokacej_les, reverse_code=django.db.migrations.operations.special.RunPython.noop, ), 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(null=True, 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.PROTECT, related_name='reseni_cely_set', to='seminar.ReseniNode', 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.AlterField( model_name='konfera', name='nazev', field=models.CharField(help_text='Název konfery', max_length=100, verbose_name='název konfery'), ), migrations.AddField( model_name='treenode', name='nazev', field=models.TextField(help_text='Tento název se zobrazuje v nabídkách pro výběr vhodného TreeNode', null=True, verbose_name='název tohoto node'), ), migrations.RunPython( code=fix_all_names, reverse_code=django.db.migrations.operations.special.RunPython.noop, ), migrations.AlterModelOptions( name='cislo', options={'ordering': ['-rocnik__rocnik', '-poradi'], 'verbose_name': 'Číslo', 'verbose_name_plural': 'Čísla'}, ), migrations.RenameField( model_name='cislo', old_name='cislo', new_name='poradi', ), migrations.AlterField( model_name='problem', name='nadproblem', field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='podproblem', to='seminar.Problem', verbose_name='nadřazený problém'), ), migrations.AddField( model_name='tema', name='abstrakt', field=models.TextField(blank=True, verbose_name='Abstrakt na rozcestník'), ), migrations.AddField( model_name='tema', name='obrazek', field=models.ImageField(null=True, upload_to='', verbose_name='Obrázek na rozcestník'), ), migrations.RemoveField( model_name='nastaveni', name='aktualni_rocnik', ), migrations.AddField( model_name='treenode', name='srolovatelne', field=models.BooleanField(blank=True, help_text='Bude na stránce témátka možnost tuto položku skrýt', null=True, verbose_name='Srolovatelné'), ), migrations.AddField( model_name='treenode', name='zajimave', field=models.BooleanField(default=False, help_text='Zobrazí se daná věc na rozcestníku témátek', verbose_name='Zajímavé'), ), migrations.RunPython( code=copy_mails, reverse_code=django.db.migrations.operations.special.RunPython.noop, ), migrations.AddField( model_name='prilohareseni', name='res_poznamka', field=models.TextField(blank=True, help_text='Poznámka k příloze řešení, např. co daný soubor obsahuje', verbose_name='poznámka řešitele'), ), migrations.AlterField( model_name='hodnoceni', name='problem', field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='hodnoceni', to='seminar.Problem', verbose_name='problém'), ), migrations.AlterField( model_name='hodnoceni', name='body', field=models.DecimalField(decimal_places=1, max_digits=8, null=True, verbose_name='body'), ), migrations.AlterField( model_name='hodnoceni', name='cislo_body', field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='hodnoceni', to='seminar.Cislo', verbose_name='číslo pro body'), ), migrations.DeleteModel( name='Konfery_Ucastnici', ), migrations.RemoveField( model_name='konfera', name='ucastnici', ), migrations.RemoveField( model_name='konfera', name='id', ), migrations.RemoveField( model_name='clanek', name='cislo', ), migrations.RemoveField( model_name='reseni', name='text_zkraceny', ), migrations.DeleteModel( name='KonferaNode', ), migrations.AddField( model_name='konfera', name='problem_ptr', field=models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='seminar.Problem'), preserve_default=False, ), migrations.RemoveField( model_name='konfera', name='nazev', ), migrations.RemoveField( model_name='konfera', name='organizator', ), migrations.RemoveField( model_name='konfera', name='poznamka', ), migrations.RemoveField( model_name='konfera', name='reseni', ), migrations.AlterField( model_name='reseni', name='text_cely', field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='reseni_cely_set', to='seminar.ReseniNode', verbose_name='Plná verze textu řešení'), ), migrations.DeleteModel( name='ClanekNode', ), 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.CASCADE, to='seminar.Konfera', verbose_name='konfera')), ('resitel', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='seminar.Resitel', verbose_name='řešitel')), ], options={ 'verbose_name': 'Účast na konfeře', 'verbose_name_plural': 'Účasti na konfeře', 'db_table': 'seminar_konfery_ucastnici', 'ordering': ['konfera', 'resitel'], }, ), 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='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.AddField( model_name='cislo', name='titulka_nahled', field=models.ImageField(blank=True, help_text='Obrázek titulní strany, generuje se automaticky', null=True, upload_to=seminar.models.cislo_png_filename, verbose_name='Obrázek titulní strany'), ), migrations.AlterField( model_name='treenode', name='first_child', field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='father_of_first', to='seminar.TreeNode', verbose_name='první potomek'), ), migrations.AddField( model_name='clanek', name='cislo', field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='vydane_clanky', to='seminar.Cislo', verbose_name='číslo vydání'), ), migrations.RunPython( code=najdi_cislo, reverse_code=django.db.migrations.operations.special.RunPython.noop, ), migrations.AlterModelOptions( name='organizator', options={'ordering': ['-organizuje_do', 'osoba__jmeno', 'osoba__prijmeni'], 'verbose_name': 'Organizátor', 'verbose_name_plural': 'Organizátoři'}, ), migrations.RunPython( code=add_perms, reverse_code=django.db.migrations.operations.special.RunPython.noop, ), migrations.AddField( model_name='cislo', name='datum_preddeadline', field=models.DateField(blank=True, help_text='Datum pro příjem řešení, která se otisknou v dalším čísle', null=True, verbose_name='datum předdeadline'), ), migrations.AlterField( model_name='textnode', name='text', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='seminar.Text', verbose_name='text'), ), migrations.AddField( model_name='resitel', name='zasilat_cislo_emailem', field=models.BooleanField(default=False, help_text='True pokud chce řešitel dostávat číslo emailem', verbose_name='zasílat číslo emailem'), ), migrations.AlterField( model_name='tema', name='rocnik', field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='temata', to='seminar.Rocnik', verbose_name='ročník'), ), migrations.AlterField( model_name='osoba', name='prezdivka', field=models.CharField(blank=True, max_length=256, null=True, verbose_name='přezdívka'), ), migrations.RunPython( code=fix_all, reverse_code=django.db.migrations.operations.special.RunPython.noop, ), migrations.RunPython( code=fix_zamereni, ), migrations.AlterField( model_name='tema', name='obrazek', field=models.ImageField(blank=True, null=True, upload_to='', verbose_name='Obrázek na rozcestník'), ), migrations.AlterField( model_name='hodnoceni', name='body', field=models.DecimalField(blank=True, decimal_places=1, max_digits=8, null=True, verbose_name='body'), ), migrations.AlterField( model_name='hodnoceni', name='cislo_body', field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='hodnoceni', to='seminar.Cislo', verbose_name='číslo pro body'), ), ]