diff --git a/seminar/models.py b/seminar/models.py index 43d6e59d..5619d15c 100644 --- a/seminar/models.py +++ b/seminar/models.py @@ -27,6 +27,7 @@ from reversion import revisions as reversion from seminar.utils import roman, FirstTagParser # Pro získání úryvku z TextNode from unidecode import unidecode # Používám pro získání ID odkazu (ještě je to někde po někom zakomentované) +from seminar.treelib import safe_pred from polymorphic.models import PolymorphicModel @@ -1338,7 +1339,7 @@ class MezicisloNode(TreeNode): # TODO: Využít TreeLib def aktualizuj_nazev(self): - if self.prev: + if safe_pred(self) is not None: if (self.prev.get_real_instance_class() != CisloNode and self.prev.get_real_instance_class() != MezicisloNode): raise ValueError("Předchůdce není číslo!") diff --git a/seminar/testutils.py b/seminar/testutils.py index 34010168..18319546 100644 --- a/seminar/testutils.py +++ b/seminar/testutils.py @@ -10,10 +10,11 @@ import unidecode import logging from seminar.models import Skola, Resitel, Rocnik, Cislo, Problem, Reseni, PrilohaReseni, Nastaveni, Soustredeni, Soustredeni_Ucastnici, Soustredeni_Organizatori, Osoba, Organizator, Prijemce, Tema, Uloha, Konfera, TextNode, UlohaVzorakNode, RocnikNode, CisloNode, TemaVCisleNode, Text, Hodnoceni, UlohaZadaniNode, Novinky, TreeNode +import seminar.models as m from django.contrib.flatpages.models import FlatPage from django.contrib.sites.models import Site -from seminar.treelib import all_children, insert_last_child, all_children_of_type +from seminar.treelib import all_children, insert_last_child, all_children_of_type, create_node_after User = django.contrib.auth.get_user_model() @@ -420,6 +421,85 @@ def gen_cisla(rnd, rocniky): rocnik_cisla.append(cisla) return rocnik_cisla +def add_first_child(node, child): + node.first_child = child + node.save() + return + +def get_text(): + odstavec = lorem.paragraph() + return Text.objects.create(na_web = odstavec, do_cisla = odstavec) + +def gen_dlouhe_tema(rnd, organizatori, rocnik, nazev, obor, kod): + tema = Tema.objects.create( + nazev=nazev, + stav=Problem.STAV_ZADANY, + zamereni="M", + autor=rnd.choice(organizatori), + garant=rnd.choice(organizatori), + kod=str(kod), + tema_typ=rnd.choice(Tema.TEMA_CHOICES)[0], + rocnik=rocnik, + abstrakt = lorem.paragraph() + ) + + # Generování struktury k tématu + cisla = sorted(rocnik.cisla.all(), key=lambda cislo: cislo.poradi) + for cislo in cisla: + # Přidáme TemaVCisleNode do daného čísla + cislo_node = cislo.cislonode + tema_cislo_node = TemaVCisleNode.objects.create(tema = tema) + insert_last_child(cislo_node, tema_cislo_node) + + # Přidávání obsahu do čísla + cast_node = m.CastNode.objects.create(nadpis = "Příspěvek k číslu {}".format(cislo.kod)) + add_first_child(tema_cislo_node, cast_node) + + text_node = TextNode.objects.create(text = get_text()) + add_first_child(cast_node, text_node) + + cast_node2 = m.CastNode.objects.create(nadpis = "První podproblém") + add_first_child(text_node, cast_node2) + + text_node2 = TextNode.objects.create(text = get_text()) + add_first_child(cast_node2, text_node2) + + cast_node3 = m.CastNode.objects.create(nadpis = "Druhý podproblém") + add_first_child(text_node2, cast_node3) + + text_node3 = TextNode.objects.create(text = get_text()) + add_first_child(cast_node3, text_node3) + + cast_node4 = m.CastNode.objects.create(nadpis = "Třetí podproblém") + add_first_child(text_node3, cast_node4) + + text_node4 = TextNode.objects.create(text = get_text()) + add_first_child(cast_node3, text_node4) + + cast_node3a = m.CastNode.objects.create(nadpis = "Podproblém paralelní s " + "druhým podproblémem") + cast_node3.succ = cast_node3a + cast_node3.save() + + text_node3a = TextNode.objects.create(text = get_text()) + add_first_child(cast_node3a, text_node3a) + + # Občas přidáme mezičíslo + if rnd.randint(1, 3) == 1: + create_node_after(cislo_node, m.MezicisloNode) + mezicislo_node = cislo_node.succ + + cast_node_mezicislo = m.CastNode.objects.create( + nadpis = "Příspěvek k mezičíslu".format(cislo.kod)) + add_first_child(mezicislo_node, cast_node_mezicislo) + + odstavec = lorem.paragraph() + text_mezicislo = Text.objects.create(na_web = odstavec, do_cisla = odstavec) + text_node_mezicislo = TextNode.objects.create(text = text_mezicislo) + add_first_child(cast_node_mezicislo, text_node_mezicislo) + + return tema + def gen_temata(rnd, rocniky, rocnik_cisla, organizatori): logger.info('Generuji témata...') @@ -666,6 +746,10 @@ def create_test_data(size = 6, rnd = None): # rocnik_temata je pole polí trojic (první číslo :int, poslední číslo :int, téma:Tema), přičemž každé vnitřní pole odpovídá ročníku a FIXME: je to takhle fuj a když to někdo vidí poprvé, tak je z toho smutný, protože vůbec neví, co se děje a co má čekat. rocnik_temata = gen_temata(rnd, rocniky, rocnik_cisla, organizatori) + rocnik = Rocnik.objects.filter(rocnik = 23).first() + dlouhe_tema = gen_dlouhe_tema(rnd, organizatori, rocnik, "Strašně dlouhé téma", + "MFI", 8) + # generování úloh k tématům ve všech číslech gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori) diff --git a/seminar/views/views_all.py b/seminar/views/views_all.py index 95eb07d1..c311f597 100644 --- a/seminar/views/views_all.py +++ b/seminar/views/views_all.py @@ -19,7 +19,7 @@ from django.db import transaction import seminar.models as s from seminar.models import Problem, Cislo, Reseni, Nastaveni, Rocnik, Soustredeni, Organizator, Resitel, Novinky, Soustredeni_Ucastnici, Pohadka, Tema, Clanek, Osoba, Skola # Tohle je stare a chceme se toho zbavit. Pouzivejte s.ToCoChci #from .models import VysledkyZaCislo, VysledkyKCisluZaRocnik, VysledkyKCisluOdjakziva -from seminar import utils,treelib +from seminar import utils, treelib from .unicodecsv import UnicodeWriter from seminar.forms import PrihlaskaForm, LoginForm, ProfileEditForm import seminar.forms as f