|
|
@ -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.sites.models import Site |
|
|
|
from seminar.treelib import all_children, insert_last_child, all_children_of_type |
|
|
|
|
|
|
|
|
|
|
|
User = django.contrib.auth.get_user_model() |
|
|
|
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) |
|
|
|
) |
|
|
|
|
|
|
|
text_zadani = Text.objects.create( |
|
|
|
na_web = " ".join( |
|
|
|
[rnd.choice(sloveso), |
|
|
|
rnd.choice(koho), |
|
|
|
rnd.choice(ceho), |
|
|
|
rnd.choice(jmeno), |
|
|
|
rnd.choice(kde)] |
|
|
|
), |
|
|
|
do_cisla = " ".join( |
|
|
|
text = " ".join( |
|
|
|
[rnd.choice(sloveso), |
|
|
|
rnd.choice(koho), |
|
|
|
rnd.choice(ceho), |
|
|
|
rnd.choice(jmeno), |
|
|
|
rnd.choice(kde)] |
|
|
|
) |
|
|
|
text_zadani = Text.objects.create( |
|
|
|
na_web = text, |
|
|
|
do_cisla = text, |
|
|
|
) |
|
|
|
zad = TextNode.objects.create(text = text_zadani) |
|
|
|
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 |
|
|
|
|
|
|
|
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," |
|
|
|
"otevřený problém", "neřešitelné", "triviálně triviální", |
|
|
|
"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í"] |
|
|
|
|
|
|
|
# Generování vzorového řešení. |
|
|
|
obsah = rnd.choice(reseni) |
|
|
|
text_vzoraku = Text.objects.create( |
|
|
|
na_web = rnd.choice(reseni), |
|
|
|
do_cisla = rnd.choice(reseni) |
|
|
|
na_web = obsah, |
|
|
|
do_cisla = obsah |
|
|
|
) |
|
|
|
vzorak = TextNode.objects.create(text = text_vzoraku) |
|
|
|
uloha_vzorak = UlohaVzorakNode.objects.create(uloha = uloha, first_child = vzorak) |
|
|
|
uloha.ulohavzoraknode = uloha_vzorak |
|
|
|
otec_syn(cisla[poradi_cisla-1].cislonode, uloha_vzorak) |
|
|
|
|
|
|
|
uloha.opravovatele.set(rnd.sample(organizatori, pocet_opravovatelu)) |
|
|
|
uloha.save() |
|
|
|
return |
|
|
|
return uloha_vzorak |
|
|
|
|
|
|
|
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 = gen_zadani_ulohy(rnd, cisla, organizatori, poc_oboru, ci, pi) |
|
|
|
# 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 |
|
|
|
gen_reseni_ulohy(rnd, cisla, p, poc_res, ci, |
|
|
|
resitele_cisla, resitele) |
|
|
@ -474,11 +474,10 @@ def gen_temata(rnd, rocniky, rocnik_cisla, organizatori): |
|
|
|
rocnik_temata.append(letosni_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): |
|
|
|
logger.info('Generuji úlohy k tématům...') |
|
|
|
|
|
|
|
# ulohy resene v cisle |
|
|
|
# Proměnné pro náhodné generování názvů a zadání. |
|
|
|
jaka = ["Šachová", "Černá", "Větrná", "Dlouhá", "Křehká", "Rychlá", |
|
|
|
"Zákeřná", "Fyzikální"] |
|
|
|
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"] |
|
|
|
jmeno = ["řešení", "tahů", "čísel", "kalhot", "koulí", "hadů"] |
|
|
|
kde = ["na zemi", "ve vesmíru", "ve vzduchu", "na šňůře", "v letadle"] |
|
|
|
obor = ["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 |
|
|
|
obory = ["M", "F", "I", "O", "B"] |
|
|
|
|
|
|
|
# Generujeme 1 až 4 úložky k tomuto témátku do tohoto čísla |
|
|
|
for kod in range(1, rnd.randint(1, 4)): |
|
|
|
u = Uloha.objects.create( |
|
|
|
uloha = Uloha.objects.create( |
|
|
|
nazev=": ".join([tema.nazev, |
|
|
|
"úloha {}.".format(kod)]), |
|
|
|
nadproblem=tema, |
|
|
@ -553,9 +504,6 @@ def gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori) |
|
|
|
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), |
|
|
@ -569,32 +517,63 @@ def gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori) |
|
|
|
do_cisla = obsah, |
|
|
|
) |
|
|
|
zad = TextNode.objects.create(text = text_zadani) |
|
|
|
uloha_zadani = UlohaZadaniNode.objects.create(uloha=u, first_child = zad) |
|
|
|
u.ulohazadaninode = uloha_zadani |
|
|
|
uloha_zadani = UlohaZadaniNode.objects.create(uloha=uloha, first_child = zad) |
|
|
|
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 |
|
|
|
otec_syn(tema_node, uloha_zadani) |
|
|
|
return uloha, uloha_zadani |
|
|
|
|
|
|
|
# Text vzoráku stejně |
|
|
|
obsah = rnd.choice(reseni) |
|
|
|
text_vzoraku = Text.objects.create( |
|
|
|
na_web = obsah, |
|
|
|
do_cisla = obsah, |
|
|
|
|
|
|
|
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 |
|
|
|
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) |
|
|
|
uloha_vzorak = UlohaVzorakNode.objects.create(uloha=u, first_child = vzorak) |
|
|
|
u.UlohaVzorakNode = uloha_vzorak |
|
|
|
# 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() |
|
|
|
|
|
|
|
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 |
|
|
|
res_tema_node = None; |
|
|
|
for node in potomci(cislo_se_vzorakem.cislonode): |
|
|
|
if isinstance(node, TemaVCisleNode) and node.tema == tema: |
|
|
|
for node in all_children(cislo_se_vzorakem.cislonode): |
|
|
|
if isinstance(node, TemaVCisleNode): |
|
|
|
if 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) |
|
|
|
|
|
|
|
insert_last_child(res_tema_node, uvz) |
|
|
|
u.save() |
|
|
|
return |
|
|
|
|
|
|
|