Web M&M
https://mam.matfyz.cz
128 lines
4.0 KiB
128 lines
4.0 KiB
# -*- 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),
|
|
]
|
|
|