127 lines
4.0 KiB

# 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),
]