Testdata: Hezčí gen_ulohy_k_tematum, pár změn v gen_temata
This commit is contained in:
parent
3e2238a3e1
commit
b17c4e45b2
1 changed files with 76 additions and 56 deletions
|
@ -9,7 +9,7 @@ from django.db import transaction
|
||||||
import unidecode
|
import unidecode
|
||||||
import logging
|
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, KonferaNode, TextNode, UlohaVzorakNode, RocnikNode, CisloNode, TemaVCisleNode, Text, Hodnoceni, UlohaZadaniNode, Novinky
|
from seminar.models import Skola, Resitel, Rocnik, Cislo, Problem, Reseni, PrilohaReseni, Nastaveni, Soustredeni, Soustredeni_Ucastnici, Soustredeni_Organizatori, Osoba, Organizator, Prijemce, Tema, Uloha, Konfera, KonferaNode, TextNode, UlohaVzorakNode, RocnikNode, CisloNode, TemaVCisleNode, Text, Hodnoceni, UlohaZadaniNode, Novinky, TreeNode
|
||||||
|
|
||||||
from django.contrib.flatpages.models import FlatPage
|
from django.contrib.flatpages.models import FlatPage
|
||||||
from django.contrib.sites.models import Site
|
from django.contrib.sites.models import Site
|
||||||
|
@ -395,7 +395,7 @@ def gen_temata(rnd, rocniky, rocnik_cisla, organizatori):
|
||||||
# Věříme, že rocnik_cisla je pole polí čísel podle ročníků, tak si necháme dát vždycky jeden ročník a k němu příslušná čísla.
|
# Věříme, že rocnik_cisla je pole polí čísel podle ročníků, tak si necháme dát vždycky jeden ročník a k němu příslušná čísla.
|
||||||
for rocnik, cisla in zip(rocniky, rocnik_cisla):
|
for rocnik, cisla in zip(rocniky, rocnik_cisla):
|
||||||
kod = 1
|
kod = 1
|
||||||
temata = []
|
letosni_temata = []
|
||||||
# Do každého ročníku vymyslíme tři (zatím) témata, v každém z prvních čísel jedno
|
# Do každého ročníku vymyslíme tři (zatím) témata, v každém z prvních čísel jedno
|
||||||
for zacatek_tematu in range(1, 3):
|
for zacatek_tematu in range(1, 3):
|
||||||
# Vygenerujeme téma
|
# Vygenerujeme téma
|
||||||
|
@ -420,6 +420,7 @@ def gen_temata(rnd, rocniky, rocnik_cisla, organizatori):
|
||||||
# Vyrobíme TemaVCisleNody pro obsah
|
# Vyrobíme TemaVCisleNody pro obsah
|
||||||
for i in range(zacatek_tematu, konec_tematu+1):
|
for i in range(zacatek_tematu, konec_tematu+1):
|
||||||
node = TemaVCisleNode.objects.create(tema = t)
|
node = TemaVCisleNode.objects.create(tema = t)
|
||||||
|
# FIXME: Není to off-by-one?
|
||||||
otec = cisla[i-1].cislonode
|
otec = cisla[i-1].cislonode
|
||||||
otec_syn(otec, node)
|
otec_syn(otec, node)
|
||||||
|
|
||||||
|
@ -429,8 +430,8 @@ def gen_temata(rnd, rocniky, rocnik_cisla, organizatori):
|
||||||
|
|
||||||
# Uložíme všechno
|
# Uložíme všechno
|
||||||
t.save()
|
t.save()
|
||||||
temata.append((zacatek_tematu, konec_tematu, t))
|
letosni_temata.append((zacatek_tematu, konec_tematu, t))
|
||||||
rocnik_temata.append(temata)
|
rocnik_temata.append(letosni_temata)
|
||||||
return rocnik_temata
|
return rocnik_temata
|
||||||
|
|
||||||
|
|
||||||
|
@ -455,84 +456,103 @@ def gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori)
|
||||||
"netriviální aplikace diferenciálních rovnic", "zadání je vnitřně"
|
"netriviální aplikace diferenciálních rovnic", "zadání je vnitřně"
|
||||||
"sporné", "nepopsatelně jednoduché", "pokud jste na to nepřišli,"
|
"sporné", "nepopsatelně jednoduché", "pokud jste na to nepřišli,"
|
||||||
"tak jste fakt hloupí"]
|
"tak jste fakt hloupí"]
|
||||||
k = 0
|
# Ke každému ročníku si vezmeme příslušná čísla a témata
|
||||||
for rocnik in rocniky:
|
for rocnik, cisla, temata in zip(rocniky, rocnik_cisla, rocnik_temata):
|
||||||
k+=1
|
# Do každého čísla nagenerujeme ke každému témátku pár úložek
|
||||||
cisla = rocnik_cisla[k-1]
|
for cislo in cisla:
|
||||||
temata = rocnik_temata[k-1]
|
print("Generuji úložky do {}-tého čísla".format(cislo.poradi))
|
||||||
for ci in range(len(cisla)):
|
# Vzorák bude o dvě čísla dál
|
||||||
print("Generuji {}-té číslo".format(ci))
|
cislo_se_vzorakem = Cislo.objects.filter(
|
||||||
cislo = cisla[ci-1]
|
rocnik=rocnik,
|
||||||
mozna_tema_vcn = cislo.cislonode.first_child
|
poradi=str(int(cislo.poradi) + 2),
|
||||||
# kdybyste nad tím někdo taky přemýšleli, tak vcn == VCisleNode :)
|
)
|
||||||
while mozna_tema_vcn != None:
|
# Pokud není číslo pro vzorák, tak se dá do posledního čísla (i kdyby tam mělo být zadání i řešení...)
|
||||||
if type(mozna_tema_vcn) != TemaVCisleNode:
|
# Tohle sice umožňuje vygenerovat vzorák do čísla dávno po konci témátka, ale to nám pro jednoduchost nevadí.
|
||||||
mozna_tema_vcn = mozna_tema_vcn.succ
|
if len(cislo_se_vzorakem) == 0:
|
||||||
|
cislo_se_vzorakem = cisla[-1]
|
||||||
|
else:
|
||||||
|
cislo_se_vzorakem = cislo_se_vzorakem.first()
|
||||||
|
|
||||||
|
# FIXME: Tenhle generátor dát asi někam jinam
|
||||||
|
def potomci(node):
|
||||||
|
if not isinstance(node, TreeNode):
|
||||||
|
raise ValueError("Typ {} nemá potomky", type(node))
|
||||||
|
current_child = node.first_child
|
||||||
|
while current_child is not None:
|
||||||
|
yield current_child
|
||||||
|
current_child = current_child.succ
|
||||||
|
|
||||||
|
for mozna_tema_node in potomci(cislo.cislonode):
|
||||||
|
if not isinstance(mozna_tema_node, TemaVCisleNode):
|
||||||
continue
|
continue
|
||||||
else:
|
tema_node = mozna_tema_node
|
||||||
tema = mozna_tema_vcn.tema
|
tema = tema_node.tema
|
||||||
|
|
||||||
if not temata[int(tema.kod)-1][1] >= ci+2:
|
# Pokud už témátko skončilo, žádné úložky negenerujeme
|
||||||
mozna_tema_vcn = mozna_tema_vcn.succ
|
# FIXME: Bylo by hezčí, kdyby se čísla předávala jako Cislo a ne jako int v té trojici (start, konec, tema)
|
||||||
|
if not temata[int(tema.kod)-1][1] >= int(cislo_se_vzorakem.poradi):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
for i in range(1, rnd.randint(1, 4)):
|
# Generujeme 1 až 4 úložky k tomuto témátku do tohoto čísla
|
||||||
poc_op = rnd.randint(1, 4)
|
for kod in range(1, rnd.randint(1, 4)):
|
||||||
poc_oboru = rnd.randint(1, 2)
|
u = Uloha.objects.create(
|
||||||
p = Uloha.objects.create(
|
|
||||||
nazev=": ".join([tema.nazev,
|
nazev=": ".join([tema.nazev,
|
||||||
"úloha {}.".format(i)]),
|
"úloha {}.".format(kod)]),
|
||||||
nadproblem=tema,
|
nadproblem=tema,
|
||||||
stav=Problem.STAV_ZADANY,
|
stav=Problem.STAV_ZADANY,
|
||||||
zamereni=tema.zamereni,
|
zamereni=tema.zamereni,
|
||||||
autor=tema.autor,
|
autor=tema.autor,
|
||||||
garant=tema.garant,
|
garant=tema.garant,
|
||||||
kod=str(i),
|
kod=str(kod),
|
||||||
cislo_zadani=cislo,
|
cislo_zadani=cislo,
|
||||||
cislo_reseni=cisla[ci+2-1],
|
cislo_reseni=cislo_se_vzorakem,
|
||||||
cislo_deadline=cisla[ci+2-1],
|
cislo_deadline=cislo_se_vzorakem,
|
||||||
max_body = rnd.randint(1, 8)
|
max_body = rnd.randint(1, 8)
|
||||||
)
|
)
|
||||||
|
|
||||||
p.opravovatele.set(rnd.sample(organizatori, poc_op))
|
poc_opravovatelu = rnd.randint(1, 4)
|
||||||
|
u.opravovatele.set(rnd.sample(organizatori, poc_opravovatelu))
|
||||||
|
|
||||||
text_zadani = Text.objects.create(
|
# Samotný obsah následně vzniklého Textu zadání
|
||||||
na_web = " ".join(
|
obsah = " ".join(
|
||||||
[rnd.choice(sloveso),
|
|
||||||
rnd.choice(koho),
|
|
||||||
rnd.choice(ceho),
|
|
||||||
rnd.choice(jmeno),
|
|
||||||
rnd.choice(kde)]
|
|
||||||
),
|
|
||||||
do_cisla = " ".join(
|
|
||||||
[rnd.choice(sloveso),
|
[rnd.choice(sloveso),
|
||||||
rnd.choice(koho),
|
rnd.choice(koho),
|
||||||
rnd.choice(ceho),
|
rnd.choice(ceho),
|
||||||
rnd.choice(jmeno),
|
rnd.choice(jmeno),
|
||||||
rnd.choice(kde)]
|
rnd.choice(kde)]
|
||||||
)
|
)
|
||||||
)
|
text_zadani = Text.objects.create(
|
||||||
|
na_web = obsah,
|
||||||
|
do_cisla = obsah,
|
||||||
|
)
|
||||||
zad = TextNode.objects.create(text = text_zadani)
|
zad = TextNode.objects.create(text = text_zadani)
|
||||||
uloha_zadani = UlohaZadaniNode.objects.create(uloha=p, first_child = zad)
|
uloha_zadani = UlohaZadaniNode.objects.create(uloha=u, first_child = zad)
|
||||||
p.ulohazadaninode = uloha_zadani
|
u.ulohazadaninode = uloha_zadani
|
||||||
otec_syn(mozna_tema_vcn, uloha_zadani)
|
|
||||||
# TODO dělá se podproblém takto??? TODO
|
# FIXME: Tohle dává zadání vždy jako prvního potomka témátka, spec. se naskládají v opačném pořadí a nemůže mezi nimi vzniknout žádný (orgo-)text
|
||||||
|
otec_syn(tema_node, uloha_zadani)
|
||||||
|
|
||||||
|
# Text vzoráku stejně
|
||||||
|
obsah = rnd.choice(reseni)
|
||||||
text_vzoraku = Text.objects.create(
|
text_vzoraku = Text.objects.create(
|
||||||
na_web = rnd.choice(reseni),
|
na_web = obsah,
|
||||||
do_cisla = rnd.choice(reseni)
|
do_cisla = obsah,
|
||||||
)
|
)
|
||||||
vzorak = TextNode.objects.create(text = text_vzoraku)
|
vzorak = TextNode.objects.create(text = text_vzoraku)
|
||||||
uloha_vzorak = UlohaVzorakNode.objects.create(uloha=p, first_child = vzorak)
|
uloha_vzorak = UlohaVzorakNode.objects.create(uloha=u, first_child = vzorak)
|
||||||
p.UlohaVzorakNode = uloha_vzorak
|
u.UlohaVzorakNode = uloha_vzorak
|
||||||
res_tema_vcn = cisla[ci+2-1].cislonode.first_child
|
|
||||||
while res_tema_vcn.tema != tema:
|
# Najdeme správný TemaVCisleNode pro vložení vzoráku
|
||||||
res_tema_vcn = res_tema_vcn.succ
|
res_tema_node = None;
|
||||||
otec_syn(res_tema_vcn, uloha_vzorak)
|
for node in potomci(cislo_se_vzorakem.cislonode):
|
||||||
|
if isinstance(node, TemaVCisleNode) and node.tema == tema:
|
||||||
|
res_tema_node = node
|
||||||
|
if res_tema_node is None:
|
||||||
|
raise LookupError("Nenalezen Node pro vložení vzoráku")
|
||||||
|
# FIXME: Stejný problém jako výše: vzoráky se dají na začátek v opačném pořadí.
|
||||||
|
otec_syn(res_tema_node, uloha_vzorak)
|
||||||
|
|
||||||
p.save()
|
u.save()
|
||||||
|
|
||||||
mozna_tema_vcn = mozna_tema_vcn.succ
|
|
||||||
return
|
return
|
||||||
|
|
||||||
def gen_novinky(rnd, organizatori):
|
def gen_novinky(rnd, organizatori):
|
||||||
|
@ -552,7 +572,7 @@ def gen_novinky(rnd, organizatori):
|
||||||
|
|
||||||
def otec_syn(otec, syn):
|
def otec_syn(otec, syn):
|
||||||
bratr = otec.first_child
|
bratr = otec.first_child
|
||||||
syn.ucc = bratr
|
syn.succ = bratr
|
||||||
otec.first_child = syn
|
otec.first_child = syn
|
||||||
syn.save()
|
syn.save()
|
||||||
otec.save()
|
otec.save()
|
||||||
|
|
Loading…
Reference in a new issue