testutils: zkrácení a rozsekání funkce gen_ulohy_k_tematum
This commit is contained in:
parent
ef62622be3
commit
4240fa787f
1 changed files with 73 additions and 94 deletions
|
@ -13,6 +13,8 @@ from seminar.models import Skola, Resitel, Rocnik, Cislo, Problem, Reseni, Prilo
|
||||||
|
|
||||||
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
|
||||||
|
from seminar.treelib import all_children, insert_last_child, all_children_of_type
|
||||||
|
|
||||||
|
|
||||||
User = django.contrib.auth.get_user_model()
|
User = django.contrib.auth.get_user_model()
|
||||||
zlinska = None # tohle bude speciální škola, které později dodáme kontaktní osobu
|
zlinska = None # tohle bude speciální škola, které později dodáme kontaktní osobu
|
||||||
|
@ -189,7 +191,7 @@ def gen_zadani_ulohy(rnd, cisla, organizatori, pocet_oboru, poradi_cisla, poradi
|
||||||
jmeno = ["řešení", "tahů", "čísel", "kalhot", "koulí", "hadů"]
|
jmeno = ["řešení", "tahů", "čísel", "kalhot", "koulí", "hadů"]
|
||||||
kde = ["na zemi", "ve vesmíru", "ve vzduchu", "na šňůře", "v letadle"]
|
kde = ["na zemi", "ve vesmíru", "ve vzduchu", "na šňůře", "v letadle"]
|
||||||
obory = ["M", "F", "I", "O", "B"]
|
obory = ["M", "F", "I", "O", "B"]
|
||||||
|
|
||||||
p = Uloha.objects.create(
|
p = Uloha.objects.create(
|
||||||
# atributy třídy Problem
|
# atributy třídy Problem
|
||||||
nazev=" ".join([rnd.choice(jaka), rnd.choice(co)]),
|
nazev=" ".join([rnd.choice(jaka), rnd.choice(co)]),
|
||||||
|
@ -205,21 +207,16 @@ def gen_zadani_ulohy(rnd, cisla, organizatori, pocet_oboru, poradi_cisla, poradi
|
||||||
max_body = rnd.randint(1, 8)
|
max_body = rnd.randint(1, 8)
|
||||||
)
|
)
|
||||||
|
|
||||||
text_zadani = Text.objects.create(
|
text = " ".join(
|
||||||
na_web = " ".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 = text,
|
||||||
|
do_cisla = text,
|
||||||
)
|
)
|
||||||
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 = p, first_child = zad)
|
||||||
|
@ -228,7 +225,7 @@ def gen_zadani_ulohy(rnd, cisla, organizatori, pocet_oboru, poradi_cisla, poradi
|
||||||
|
|
||||||
return p
|
return p
|
||||||
|
|
||||||
def gen_vzoroveho_reseni_ulohy(rnd, cisla, organizatori, uloha, pocet_opravovatelu, poradi_cisla):
|
def gen_vzoroveho_reseni_ulohy(rnd, organizatori, uloha, pocet_opravovatelu):
|
||||||
reseni = ["to je přece jasné", "triviální", "omlouváme se,"
|
reseni = ["to je přece jasné", "triviální", "omlouváme se,"
|
||||||
"otevřený problém", "neřešitelné", "triviálně triviální",
|
"otevřený problém", "neřešitelné", "triviálně triviální",
|
||||||
"použitím věty z prvního semestru na matfyzu",
|
"použitím věty z prvního semestru na matfyzu",
|
||||||
|
@ -238,18 +235,18 @@ def gen_vzoroveho_reseni_ulohy(rnd, cisla, organizatori, uloha, pocet_opravovate
|
||||||
"tak jste fakt hloupí"]
|
"tak jste fakt hloupí"]
|
||||||
|
|
||||||
# Generování vzorového řešení.
|
# Generování vzorového řešení.
|
||||||
|
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 = uloha, first_child = vzorak)
|
uloha_vzorak = UlohaVzorakNode.objects.create(uloha = uloha, first_child = vzorak)
|
||||||
uloha.ulohavzoraknode = uloha_vzorak
|
uloha.ulohavzoraknode = uloha_vzorak
|
||||||
otec_syn(cisla[poradi_cisla-1].cislonode, uloha_vzorak)
|
|
||||||
|
|
||||||
uloha.opravovatele.set(rnd.sample(organizatori, pocet_opravovatelu))
|
uloha.opravovatele.set(rnd.sample(organizatori, pocet_opravovatelu))
|
||||||
uloha.save()
|
uloha.save()
|
||||||
return
|
return uloha_vzorak
|
||||||
|
|
||||||
def gen_reseni_ulohy(rnd, cisla, uloha, pocet_resitelu, poradi_cisla, resitele_cisla, resitele):
|
def gen_reseni_ulohy(rnd, cisla, uloha, pocet_resitelu, poradi_cisla, resitele_cisla, resitele):
|
||||||
|
|
||||||
|
@ -307,7 +304,10 @@ def gen_ulohy_do_cisla(rnd, organizatori, resitele, rocnik_cisla, rocniky, size)
|
||||||
# přivěšení pod dané číslo
|
# přivěšení pod dané číslo
|
||||||
p = gen_zadani_ulohy(rnd, cisla, organizatori, poc_oboru, ci, pi)
|
p = gen_zadani_ulohy(rnd, cisla, organizatori, poc_oboru, ci, pi)
|
||||||
# Generování vzorového řešení
|
# Generování vzorového řešení
|
||||||
gen_vzoroveho_reseni_ulohy(rnd, cisla, organizatori, p, poc_op, ci)
|
uloha_vzorak = gen_vzoroveho_reseni_ulohy(rnd, organizatori,
|
||||||
|
p, poc_op)
|
||||||
|
insert_last_child(cisla[ci-1].cislonode, uloha_vzorak)
|
||||||
|
|
||||||
# Generování řešení a hodnocení k úloze
|
# Generování řešení a hodnocení k úloze
|
||||||
gen_reseni_ulohy(rnd, cisla, p, poc_res, ci,
|
gen_reseni_ulohy(rnd, cisla, p, poc_res, ci,
|
||||||
resitele_cisla, resitele)
|
resitele_cisla, resitele)
|
||||||
|
@ -474,11 +474,10 @@ def gen_temata(rnd, rocniky, rocnik_cisla, organizatori):
|
||||||
rocnik_temata.append(letosni_temata)
|
rocnik_temata.append(letosni_temata)
|
||||||
return rocnik_temata
|
return rocnik_temata
|
||||||
|
|
||||||
|
def gen_ulohy_tematu(rnd, organizatori, tema, kod, cislo, cislo_se_vzorakem):
|
||||||
def gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori):
|
""" Generování úlohy k danému tématu. """
|
||||||
logger.info('Generuji úlohy k tématům...')
|
|
||||||
|
# Proměnné pro náhodné generování názvů a zadání.
|
||||||
# ulohy resene v cisle
|
|
||||||
jaka = ["Šachová", "Černá", "Větrná", "Dlouhá", "Křehká", "Rychlá",
|
jaka = ["Šachová", "Černá", "Větrná", "Dlouhá", "Křehká", "Rychlá",
|
||||||
"Zákeřná", "Fyzikální"]
|
"Zákeřná", "Fyzikální"]
|
||||||
co = ["kostka", "smršť", "díra", "zrada", "toulka", "tyč",
|
co = ["kostka", "smršť", "díra", "zrada", "toulka", "tyč",
|
||||||
|
@ -488,14 +487,45 @@ def gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori)
|
||||||
ceho = ["všech", "správných", "konstatních", "zelených"]
|
ceho = ["všech", "správných", "konstatních", "zelených"]
|
||||||
jmeno = ["řešení", "tahů", "čísel", "kalhot", "koulí", "hadů"]
|
jmeno = ["řešení", "tahů", "čísel", "kalhot", "koulí", "hadů"]
|
||||||
kde = ["na zemi", "ve vesmíru", "ve vzduchu", "na šňůře", "v letadle"]
|
kde = ["na zemi", "ve vesmíru", "ve vzduchu", "na šňůře", "v letadle"]
|
||||||
obor = ["M", "F", "I", "O", "B"]
|
obory = ["M", "F", "I", "O", "B"]
|
||||||
reseni = ["to je přece jasné", "triviální", "omlouváme se,"
|
|
||||||
"otevřený problém", "neřešitelné", "triviálně triviální",
|
uloha = Uloha.objects.create(
|
||||||
"použitím věty z prvního semestru na matfyzu",
|
nazev=": ".join([tema.nazev,
|
||||||
"jednoduše pomocí látky z druhého semestru na matfyzu",
|
"úloha {}.".format(kod)]),
|
||||||
"netriviální aplikace diferenciálních rovnic", "zadání je vnitřně"
|
nadproblem=tema,
|
||||||
"sporné", "nepopsatelně jednoduché", "pokud jste na to nepřišli,"
|
stav=Problem.STAV_ZADANY,
|
||||||
"tak jste fakt hloupí"]
|
zamereni=tema.zamereni,
|
||||||
|
autor=tema.autor,
|
||||||
|
garant=tema.garant,
|
||||||
|
kod=str(kod),
|
||||||
|
cislo_zadani=cislo,
|
||||||
|
cislo_reseni=cislo_se_vzorakem,
|
||||||
|
cislo_deadline=cislo_se_vzorakem,
|
||||||
|
max_body = rnd.randint(1, 8)
|
||||||
|
)
|
||||||
|
|
||||||
|
# Samotný obsah následně vzniklého Textu zadání
|
||||||
|
obsah = " ".join(
|
||||||
|
[rnd.choice(sloveso),
|
||||||
|
rnd.choice(koho),
|
||||||
|
rnd.choice(ceho),
|
||||||
|
rnd.choice(jmeno),
|
||||||
|
rnd.choice(kde)]
|
||||||
|
)
|
||||||
|
text_zadani = Text.objects.create(
|
||||||
|
na_web = obsah,
|
||||||
|
do_cisla = obsah,
|
||||||
|
)
|
||||||
|
zad = TextNode.objects.create(text = text_zadani)
|
||||||
|
uloha_zadani = UlohaZadaniNode.objects.create(uloha=uloha, first_child = zad)
|
||||||
|
uloha.ulohazadaninode = uloha_zadani
|
||||||
|
|
||||||
|
return uloha, uloha_zadani
|
||||||
|
|
||||||
|
|
||||||
|
def gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori):
|
||||||
|
logger.info('Generuji úlohy k tématům...')
|
||||||
|
|
||||||
# Ke každému ročníku si vezmeme příslušná čísla a témata
|
# Ke každému ročníku si vezmeme příslušná čísla a témata
|
||||||
for rocnik, cisla, temata in zip(rocniky, rocnik_cisla, rocnik_temata):
|
for rocnik, cisla, temata in zip(rocniky, rocnik_cisla, rocnik_temata):
|
||||||
# Do každého čísla nagenerujeme ke každému témátku pár úložek
|
# Do každého čísla nagenerujeme ke každému témátku pár úložek
|
||||||
|
@ -515,19 +545,7 @@ def gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori)
|
||||||
else:
|
else:
|
||||||
cislo_se_vzorakem = cislo_se_vzorakem.first()
|
cislo_se_vzorakem = cislo_se_vzorakem.first()
|
||||||
|
|
||||||
# FIXME: Tenhle generátor dát asi někam jinam
|
for tema_node in all_children_of_type(cislo.cislonode, TemaVCisleNode):
|
||||||
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
|
|
||||||
tema_node = mozna_tema_node
|
|
||||||
tema = tema_node.tema
|
tema = tema_node.tema
|
||||||
|
|
||||||
# Pokud už témátko skončilo, žádné úložky negenerujeme
|
# Pokud už témátko skončilo, žádné úložky negenerujeme
|
||||||
|
@ -536,65 +554,26 @@ def gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori)
|
||||||
if not temata[int(tema.kod)-1][1] >= int(cislo_se_vzorakem.poradi):
|
if not temata[int(tema.kod)-1][1] >= int(cislo_se_vzorakem.poradi):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# Generujeme 1 až 4 úložky k tomuto témátku do tohoto čísla
|
# Generujeme 1 až 4 úložky k tomuto témátku do tohoto čísla.
|
||||||
for kod in range(1, rnd.randint(1, 4)):
|
for kod in range(1, rnd.randint(1, 4)):
|
||||||
u = Uloha.objects.create(
|
u, uz = gen_ulohy_tematu(rnd, organizatori, tema, kod,
|
||||||
nazev=": ".join([tema.nazev,
|
cislo, cislo_se_vzorakem)
|
||||||
"úloha {}.".format(kod)]),
|
|
||||||
nadproblem=tema,
|
|
||||||
stav=Problem.STAV_ZADANY,
|
|
||||||
zamereni=tema.zamereni,
|
|
||||||
autor=tema.autor,
|
|
||||||
garant=tema.garant,
|
|
||||||
kod=str(kod),
|
|
||||||
cislo_zadani=cislo,
|
|
||||||
cislo_reseni=cislo_se_vzorakem,
|
|
||||||
cislo_deadline=cislo_se_vzorakem,
|
|
||||||
max_body = rnd.randint(1, 8)
|
|
||||||
)
|
|
||||||
|
|
||||||
poc_opravovatelu = rnd.randint(1, 4)
|
|
||||||
u.opravovatele.set(rnd.sample(organizatori, poc_opravovatelu))
|
|
||||||
|
|
||||||
# Samotný obsah následně vzniklého Textu zadání
|
|
||||||
obsah = " ".join(
|
|
||||||
[rnd.choice(sloveso),
|
|
||||||
rnd.choice(koho),
|
|
||||||
rnd.choice(ceho),
|
|
||||||
rnd.choice(jmeno),
|
|
||||||
rnd.choice(kde)]
|
|
||||||
)
|
|
||||||
text_zadani = Text.objects.create(
|
|
||||||
na_web = obsah,
|
|
||||||
do_cisla = obsah,
|
|
||||||
)
|
|
||||||
zad = TextNode.objects.create(text = text_zadani)
|
|
||||||
uloha_zadani = UlohaZadaniNode.objects.create(uloha=u, first_child = zad)
|
|
||||||
u.ulohazadaninode = uloha_zadani
|
|
||||||
|
|
||||||
# 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
|
insert_last_child(tema_node, uz)
|
||||||
otec_syn(tema_node, uloha_zadani)
|
|
||||||
|
poc_op = rnd.randint(1, 4)
|
||||||
|
uvz = gen_vzoroveho_reseni_ulohy(rnd, organizatori,
|
||||||
|
u, poc_op)
|
||||||
|
|
||||||
# Text vzoráku stejně
|
|
||||||
obsah = rnd.choice(reseni)
|
|
||||||
text_vzoraku = Text.objects.create(
|
|
||||||
na_web = obsah,
|
|
||||||
do_cisla = obsah,
|
|
||||||
)
|
|
||||||
vzorak = TextNode.objects.create(text = text_vzoraku)
|
|
||||||
uloha_vzorak = UlohaVzorakNode.objects.create(uloha=u, first_child = vzorak)
|
|
||||||
u.UlohaVzorakNode = uloha_vzorak
|
|
||||||
|
|
||||||
# Najdeme správný TemaVCisleNode pro vložení vzoráku
|
# Najdeme správný TemaVCisleNode pro vložení vzoráku
|
||||||
res_tema_node = None;
|
res_tema_node = None;
|
||||||
for node in potomci(cislo_se_vzorakem.cislonode):
|
for node in all_children(cislo_se_vzorakem.cislonode):
|
||||||
if isinstance(node, TemaVCisleNode) and node.tema == tema:
|
if isinstance(node, TemaVCisleNode):
|
||||||
res_tema_node = node
|
if node.tema == tema:
|
||||||
|
res_tema_node = node
|
||||||
if res_tema_node is None:
|
if res_tema_node is None:
|
||||||
raise LookupError("Nenalezen Node pro vložení vzoráku")
|
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í.
|
insert_last_child(res_tema_node, uvz)
|
||||||
otec_syn(res_tema_node, uloha_vzorak)
|
|
||||||
|
|
||||||
u.save()
|
u.save()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue