# -*- coding: utf-8 -*- # Generated by Django 1.11.20 on 2019-05-29 03:26 from __future__ import unicode_literals from django.db import migrations from django.db.models import Q 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) class Migration(migrations.Migration): dependencies = [ ('seminar', '0059_vytvorit_pohadkanode'), ] operations = [ migrations.RunPython(pokacej_les, migrations.RunPython.noop), ]