testutils: úpravy funkcí k větší čitelnosti
This commit is contained in:
parent
869b58f35a
commit
97240a4103
1 changed files with 118 additions and 89 deletions
|
@ -173,13 +173,12 @@ def gen_organizatori(rnd, osoby, last_rocnik, users):
|
|||
if do.year > datetime.datetime.now().year:
|
||||
do = None
|
||||
organizatori.append(Organizator.objects.create(osoba=os,
|
||||
organizuje_od=od, organizuje_do=do, strucny_popis_organizatora = popis_orga))
|
||||
organizuje_od=od, organizuje_do=do, strucny_popis_organizatora = popis_orga))
|
||||
return organizatori
|
||||
|
||||
def gen_ulohy_do_cisla(rnd, organizatori, resitele, rocnik_cisla, rocniky, size):
|
||||
logger.info('Generuji úlohy do čísla (size={})...'.format(size))
|
||||
|
||||
# ulohy resene v cisle
|
||||
def gen_zadani_ulohy(rnd, cisla, organizatori, pocet_oboru, poradi_cisla, poradi_problemu):
|
||||
|
||||
# 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č",
|
||||
|
@ -189,7 +188,47 @@ def gen_ulohy_do_cisla(rnd, organizatori, resitele, rocnik_cisla, rocniky, size)
|
|||
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"]
|
||||
obory = ["M", "F", "I", "O", "B"]
|
||||
|
||||
p = Uloha.objects.create(
|
||||
# atributy třídy Problem
|
||||
nazev=" ".join([rnd.choice(jaka), rnd.choice(co)]),
|
||||
stav=Problem.STAV_ZADANY,
|
||||
zamereni=rnd.sample(obory, pocet_oboru),
|
||||
autor=rnd.choice(organizatori),
|
||||
garant=rnd.choice(organizatori),
|
||||
kod=str(poradi_problemu),
|
||||
# atributy třídy Uloha
|
||||
cislo_zadani=cisla[poradi_cisla-2-1],
|
||||
cislo_reseni=cisla[poradi_cisla-1],
|
||||
cislo_deadline=cisla[poradi_cisla-1],
|
||||
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(
|
||||
[rnd.choice(sloveso),
|
||||
rnd.choice(koho),
|
||||
rnd.choice(ceho),
|
||||
rnd.choice(jmeno),
|
||||
rnd.choice(kde)]
|
||||
)
|
||||
)
|
||||
zad = TextNode.objects.create(text = text_zadani)
|
||||
uloha_zadani = UlohaZadaniNode.objects.create(uloha = p, first_child = zad)
|
||||
p.ulohazadaninode = uloha_zadani
|
||||
otec_syn(cisla[poradi_cisla-2-1].cislonode, uloha_zadani)
|
||||
|
||||
return p
|
||||
|
||||
def gen_vzoroveho_reseni_ulohy(rnd, cisla, organizatori, uloha, pocet_opravovatelu, poradi_cisla):
|
||||
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",
|
||||
|
@ -197,96 +236,81 @@ def gen_ulohy_do_cisla(rnd, organizatori, resitele, rocnik_cisla, rocniky, size)
|
|||
"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í"]
|
||||
|
||||
# Generování vzorového řešení.
|
||||
text_vzoraku = Text.objects.create(
|
||||
na_web = rnd.choice(reseni),
|
||||
do_cisla = rnd.choice(reseni)
|
||||
)
|
||||
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
|
||||
|
||||
def gen_reseni_ulohy(rnd, cisla, uloha, pocet_resitelu, poradi_cisla, resitele_cisla, resitele):
|
||||
|
||||
pocet_reseni = rnd.randint(pocet_resitelu//4, pocet_resitelu * 4)
|
||||
# generujeme náhodný počet řešení vzhledem k počtu řešitelů čísla
|
||||
for _ in range(pocet_reseni):
|
||||
#print("Generuji {}-té řešení".format(reseni))
|
||||
if rnd.randint(1, 10) == 1:
|
||||
# cca desetina řešení od více řešitelů
|
||||
res_vyber = rnd.sample(resitele_cisla,
|
||||
rnd.randint(2, 5))
|
||||
else:
|
||||
res_vyber = rnd.sample(resitele_cisla, 1)
|
||||
if resitele[0] in res_vyber: # speciální řešitel, který nemá žádné body
|
||||
res_vyber.remove(resitele[0])
|
||||
|
||||
# Vytvoření řešení.
|
||||
res = Reseni.objects.create(forma=rnd.choice(Reseni.FORMA_CHOICES)[0])
|
||||
# Problím a řešitele přiřadíme později, ManyToManyField
|
||||
# se nedá vyplnit v create().
|
||||
res.resitele.set(res_vyber)
|
||||
res.save()
|
||||
|
||||
# Vytvoření hodnocení.
|
||||
hod = Hodnoceni.objects.create(
|
||||
body=rnd.randint(0, uloha.max_body),
|
||||
cislo_body=cisla[poradi_cisla - 1],
|
||||
reseni=res,
|
||||
problem=uloha
|
||||
)
|
||||
return
|
||||
|
||||
def gen_ulohy_do_cisla(rnd, organizatori, resitele, rocnik_cisla, rocniky, size):
|
||||
logger.info('Generuji úlohy do čísla (size={})...'.format(size))
|
||||
|
||||
k = 0
|
||||
for rocnik in rocniky:
|
||||
k+=1
|
||||
k += 1
|
||||
print("Generuji {}. číslo.".format(k))
|
||||
cisla = rocnik_cisla[k-1]
|
||||
for ci in range(3, len(cisla)+1): # pro všechna čísla
|
||||
cisla = rocnik_cisla[k - 1]
|
||||
for ci in range(3, len(cisla) + 1): # pro všechna čísla
|
||||
resitele_size = round(7/8 * 30 * size) # očekáváný celkový počet řešitelů
|
||||
poc_res = rnd.randint(round(resitele_size/8), round(resitele_size/4))
|
||||
poc_res = rnd.randint(resitele_size//8, resitele_size//4)
|
||||
# dané číslo řeší něco mezi osminou a čtvrtinou všech řešitelů
|
||||
# (náhodná hausnumera, možno změnit)
|
||||
# účelem je, aby se řešení generovala z menší množiny řešitelů a tedy
|
||||
# bylo více řešení od jednoho řešitele daného čísla
|
||||
resitele_cisla = rnd.sample(resitele, poc_res)
|
||||
for pi in range(1, ((size + 1) // 2) + 1):
|
||||
for pi in range(1, ((size + 1) // 2) + 1): # počet problémů
|
||||
|
||||
poc_op = rnd.randint(1, 4) # počet opravovatelů
|
||||
poc_oboru = rnd.randint(1, 2)
|
||||
p = Uloha.objects.create(
|
||||
# atributy třídy Problem
|
||||
nazev=" ".join([rnd.choice(jaka), rnd.choice(co)]),
|
||||
stav=Problem.STAV_ZADANY,
|
||||
zamereni=rnd.sample(["M", "F", "I", "O", "B"], poc_oboru),
|
||||
autor=rnd.choice(organizatori),
|
||||
garant=rnd.choice(organizatori),
|
||||
kod=str(pi),
|
||||
# atributy třídy Uloha
|
||||
cislo_zadani=cisla[ci-2-1],
|
||||
cislo_reseni=cisla[ci-1],
|
||||
cislo_deadline=cisla[ci-1],
|
||||
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(
|
||||
[rnd.choice(sloveso),
|
||||
rnd.choice(koho),
|
||||
rnd.choice(ceho),
|
||||
rnd.choice(jmeno),
|
||||
rnd.choice(kde)]
|
||||
)
|
||||
)
|
||||
zad = TextNode.objects.create(text = text_zadani)
|
||||
uloha_zadani = UlohaZadaniNode.objects.create(uloha=p, first_child = zad)
|
||||
p.ulohazadaninode = uloha_zadani
|
||||
otec_syn(cisla[ci-2-1].cislonode, uloha_zadani)
|
||||
|
||||
# generování vzorového textu
|
||||
text_vzoraku = Text.objects.create(
|
||||
na_web = rnd.choice(reseni),
|
||||
do_cisla = rnd.choice(reseni)
|
||||
)
|
||||
vzorak = TextNode.objects.create(text = text_vzoraku)
|
||||
uloha_vzorak = UlohaVzorakNode.objects.create(uloha=p, first_child = vzorak)
|
||||
p.ulohavzoraknode = uloha_vzorak
|
||||
otec_syn(cisla[ci-1].cislonode, uloha_vzorak)
|
||||
|
||||
p.opravovatele.set(rnd.sample(organizatori,poc_op))
|
||||
p.save()
|
||||
|
||||
# generování řešení
|
||||
poc_reseni = rnd.randint(poc_res, poc_res * 4)
|
||||
# generujeme náhodný počet řešení vzhledem k počtu řešitelů čísla
|
||||
for ri in range(poc_reseni):
|
||||
#print("Generuji {}-té řešení".format(ri))
|
||||
if rnd.randint(1, 10) == 6:
|
||||
# cca desetina řešení od více řešitelů
|
||||
res_vyber = rnd.sample(resitele_cisla,
|
||||
rnd.randint(2, 5))
|
||||
else:
|
||||
res_vyber = rnd.sample(resitele_cisla, 1)
|
||||
if resitele[0] in res_vyber:
|
||||
res_vyber.remove(resitele[0])
|
||||
res = Reseni.objects.create(forma=rnd.choice(Reseni.FORMA_CHOICES)[0])
|
||||
# problem a resitele přiřadíme později, ManyToManyField
|
||||
# se nedá vyplnit v create()
|
||||
res.resitele.set(res_vyber)
|
||||
res.save()
|
||||
hod = Hodnoceni.objects.create(
|
||||
body=rnd.randint(0, p.max_body),
|
||||
cislo_body=cisla[ci-1],
|
||||
reseni=res,
|
||||
problem=p
|
||||
)
|
||||
|
||||
# Generování zadání úlohy a UlohaZadaniNode,
|
||||
# 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)
|
||||
# Generování řešení a hodnocení k úloze
|
||||
gen_reseni_ulohy(rnd, cisla, p, poc_res, ci,
|
||||
resitele_cisla, resitele)
|
||||
|
||||
return
|
||||
|
||||
|
@ -482,8 +506,10 @@ def gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori)
|
|||
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í.
|
||||
# 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:
|
||||
|
@ -505,7 +531,8 @@ def gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori)
|
|||
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)
|
||||
# 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
|
||||
|
||||
|
@ -581,8 +608,10 @@ def gen_novinky(rnd, organizatori):
|
|||
kdy = ["Zítra bude", "10. 10. 2020 bude", "V prosinci bude", "V létě bude"]
|
||||
|
||||
for i in range(5):
|
||||
text_novinky = " ".join([rnd.choice(kdy),rnd.choice(kde),rnd.choice(jake),rnd.choice(co)])
|
||||
novinka = Novinky.objects.create(id=i,autor=rnd.choice(organizatori),text=(text_novinky+", těšíme se na vás!"),zverejneno=rnd.choice([True,False]))
|
||||
text_novinky = " ".join([rnd.choice(kdy), rnd.choice(kde), rnd.choice(jake),
|
||||
rnd.choice(co)])
|
||||
novinka = Novinky.objects.create(id=i,autor=rnd.choice(organizatori),
|
||||
text=(text_novinky+", těšíme se na vás!"),zverejneno=rnd.choice([True,False]))
|
||||
novinka.save()
|
||||
return
|
||||
|
||||
|
|
Loading…
Reference in a new issue