Browse Source

testutils: zkrácení a rozsekání funkce gen_ulohy_k_tematum

export_seznamu_prednasek
Anet 4 years ago
parent
commit
4240fa787f
  1. 157
      seminar/testutils.py

157
seminar/testutils.py

@ -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
@ -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):
""" Generování úlohy k danému tématu. """
def gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori): # Proměnné pro náhodné generování názvů a zadání.
logger.info('Generuji úlohy k tématům...')
# 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,57 +487,9 @@ 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í",
"použitím věty z prvního semestru na matfyzu",
"jednoduše pomocí látky z druhého semestru na matfyzu",
"netriviální aplikace diferenciálních rovnic", "zadání je vnitřně"
"sporné", "nepopsatelně jednoduché", "pokud jste na to nepřišli,"
"tak jste fakt hloupí"]
# 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):
# Do každého čísla nagenerujeme ke každému témátku pár úložek
for cislo in cisla:
print("Generuji úložky do {}-tého čísla".format(cislo.poradi))
# Vzorák bude o dvě čísla dál
cislo_se_vzorakem = Cislo.objects.filter(
rocnik=rocnik,
poradi=str(int(cislo.poradi) + 2),
)
# 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í...)
# Tohle sice umožňuje vygenerovat vzorák do čísla dávno po konci témátka,
# ale to nám pro jednoduchost nevadí.
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
tema_node = mozna_tema_node
tema = tema_node.tema
# Pokud už témátko skončilo, žádné úložky negenerujeme
# 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
# Generujeme 1 až 4 úložky k tomuto témátku do tohoto čísla uloha = Uloha.objects.create(
for kod in range(1, rnd.randint(1, 4)):
u = Uloha.objects.create(
nazev=": ".join([tema.nazev, nazev=": ".join([tema.nazev,
"úloha {}.".format(kod)]), "úloha {}.".format(kod)]),
nadproblem=tema, nadproblem=tema,
@ -553,9 +504,6 @@ def gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori)
max_body = rnd.randint(1, 8) 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í # Samotný obsah následně vzniklého Textu zadání
obsah = " ".join( obsah = " ".join(
[rnd.choice(sloveso), [rnd.choice(sloveso),
@ -569,32 +517,63 @@ def gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori)
do_cisla = obsah, do_cisla = obsah,
) )
zad = TextNode.objects.create(text = text_zadani) zad = TextNode.objects.create(text = text_zadani)
uloha_zadani = UlohaZadaniNode.objects.create(uloha=u, first_child = zad) uloha_zadani = UlohaZadaniNode.objects.create(uloha=uloha, first_child = zad)
u.ulohazadaninode = uloha_zadani uloha.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 return uloha, uloha_zadani
otec_syn(tema_node, uloha_zadani)
# Text vzoráku stejně
obsah = rnd.choice(reseni) def gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori):
text_vzoraku = Text.objects.create( logger.info('Generuji úlohy k tématům...')
na_web = obsah,
do_cisla = obsah, # 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):
# Do každého čísla nagenerujeme ke každému témátku pár úložek
for cislo in cisla:
print("Generuji úložky do {}-tého čísla".format(cislo.poradi))
# Vzorák bude o dvě čísla dál
cislo_se_vzorakem = Cislo.objects.filter(
rocnik=rocnik,
poradi=str(int(cislo.poradi) + 2),
) )
vzorak = TextNode.objects.create(text = text_vzoraku) # Pokud není číslo pro vzorák, tak se dá do posledního čísla
uloha_vzorak = UlohaVzorakNode.objects.create(uloha=u, first_child = vzorak) # (i kdyby tam mělo být zadání i řešení...)
u.UlohaVzorakNode = uloha_vzorak # Tohle sice umožňuje vygenerovat vzorák do čísla dávno po konci témátka,
# ale to nám pro jednoduchost nevadí.
if len(cislo_se_vzorakem) == 0:
cislo_se_vzorakem = cisla[-1]
else:
cislo_se_vzorakem = cislo_se_vzorakem.first()
for tema_node in all_children_of_type(cislo.cislonode, TemaVCisleNode):
tema = tema_node.tema
# Pokud už témátko skončilo, žádné úložky negenerujeme
# 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
# Generujeme 1 až 4 úložky k tomuto témátku do tohoto čísla.
for kod in range(1, rnd.randint(1, 4)):
u, uz = gen_ulohy_tematu(rnd, organizatori, tema, kod,
cislo, cislo_se_vzorakem)
insert_last_child(tema_node, uz)
poc_op = rnd.randint(1, 4)
uvz = gen_vzoroveho_reseni_ulohy(rnd, organizatori,
u, poc_op)
# 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):
if node.tema == tema:
res_tema_node = node 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…
Cancel
Save