From 97240a41039ec6a4c683141128189d7081f1b9f5 Mon Sep 17 00:00:00 2001 From: Anet Date: Fri, 24 Apr 2020 18:11:39 +0200 Subject: [PATCH] =?UTF-8?q?testutils:=20=C3=BApravy=20funkc=C3=AD=20k=20v?= =?UTF-8?q?=C4=9Bt=C5=A1=C3=AD=20=C4=8Ditelnosti?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/testutils.py | 207 ++++++++++++++++++++++++------------------- 1 file changed, 118 insertions(+), 89 deletions(-) diff --git a/seminar/testutils.py b/seminar/testutils.py index 65ffbfcd..b562bf74 100644 --- a/seminar/testutils.py +++ b/seminar/testutils.py @@ -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