diff --git a/seminar/testutils.py b/seminar/testutils.py index f82afbd6..97067b21 100644 --- a/seminar/testutils.py +++ b/seminar/testutils.py @@ -7,7 +7,7 @@ import django.contrib.auth from django.db import transaction import unidecode -from seminar.models import Skola, Resitel, Rocnik, Cislo, Problem, Reseni, PrilohaReseni, Nastaveni, Soustredeni, Soustredeni_Ucastnici, Soustredeni_Organizatori, Osoba, Organizator, Prijemce, Tema, Uloha, Konfera, KonferaNode, TextNode, UlohaVzorakNode, RocnikNode, CisloNode, TemaVCisleNode, Text, Hodnoceni +from seminar.models import Skola, Resitel, Rocnik, Cislo, Problem, Reseni, PrilohaReseni, Nastaveni, Soustredeni, Soustredeni_Ucastnici, Soustredeni_Organizatori, Osoba, Organizator, Prijemce, Tema, Uloha, Konfera, KonferaNode, TextNode, UlohaVzorakNode, RocnikNode, CisloNode, TemaVCisleNode, Text, Hodnoceni, UlohaZadaniNode from django.contrib.flatpages.models import FlatPage from django.contrib.sites.models import Site @@ -122,7 +122,7 @@ def gen_organizatori(rnd, osoby, last_rocnik, users): organizuje_od=od, organizuje_do=do)) return organizatori -def gen_ulohy_do_cisla(rnd, ci, organizatori, resitele, slovnik_cisel, size): +def gen_ulohy_do_cisla(rnd, organizatori, resitele, rocnik_cisla, rocniky, size): # ulohy resene v cisle jaka = ["Šachová", "Černá", "Větrná", "Dlouhá", "Křehká", "Rychlá", "Zákeřná", "Fyzikální"] @@ -141,63 +141,83 @@ def gen_ulohy_do_cisla(rnd, ci, organizatori, resitele, slovnik_cisel, 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í"] - - if ci >= 3: #TODO nagenerovat i nody!!! - for pi in range(1, ((size + 1) // 2) + 1): - 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=slovnik_cisel[ci-2], - cislo_reseni=slovnik_cisel[ci], - cislo_deadline=slovnik_cisel[ci], - max_body = rnd.randint(1, 8) - ) - p.zadani = " ".join( - [rnd.choice(sloveso), - rnd.choice(koho), - rnd.choice(ceho), - rnd.choice(jmeno), - rnd.choice(kde)] - ) - - #Tomův pokus o opravu bugu: - 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 - + k = 0 + for rocnik in rocniky: + k+=1 + cisla = rocnik_cisla[k-1] + for ci in range(3, len(cisla)+1): + for pi in range(1, ((size + 1) // 2) + 1): + + 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) + ) - p.opravovatele.set(rnd.sample(organizatori,poc_op)) - p.save() - - # reseni ulohy - poc_reseni = rnd.randint(size // 2, size * 2) - #poc_resitel = rnd.randint(1, 3) <- k čemu je himbajs tahle proměnná? - # vybereme nahodny vzorek resitelu o delce poctu reseni - # (nebo skoro vsechny resitele, pokud jich je mene nez pocet reseni) - for ri in range(poc_reseni): - res_vyber = rnd.sample(resitele, rnd.randint(1, 5)) - # problem a resitele přiřadíme později, ManyToManyField - # se nedá vyplnit v create() - res = Reseni.objects.create(forma=rnd.choice(Reseni.FORMA_CHOICES)) - res.save() - hod = Hodnoceni.objects.create( - body=rnd.randint(0, p.max_body), - cislo_body=slovnik_cisel[ci], - reseni=res, - problem=p + 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) + + 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() + + # reseni ulohy + poc_reseni = rnd.randint(size // 2, size * 2) + #poc_resitel = rnd.randint(1, 3) <- k čemu je himbajs tahle proměnná? + # vybereme nahodny vzorek resitelu o delce poctu reseni + # (nebo skoro vsechny resitele, pokud jich je mene nez pocet reseni) + for ri in range(poc_reseni): + res_vyber = rnd.sample(resitele, rnd.randint(1, 5)) + # problem a resitele přiřadíme později, ManyToManyField + # se nedá vyplnit v create() + res = Reseni.objects.create(forma=rnd.choice(Reseni.FORMA_CHOICES)) + #res.save() <- asi smazat + 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 + ) + return def gen_soustredeni(rnd, resitele, organizatori): @@ -251,10 +271,10 @@ def gen_konfery(rnd, reseni, organizatori, ucastnici, soustredeni): return konfery def gen_cisla(rnd, rocniky): - slovnik_rocnik_cisla = {} + rocnik_cisla = [] for rocnik in rocniky: otec = True - slovnik_cisel = {} + cisla = [] cisel = rnd.randint(4, 8) node = None for ci in range(1, cisel + 1): @@ -289,11 +309,11 @@ def gen_cisla(rnd, rocniky): rocnik.rocniknode.first_child = node rocnik.save() - slovnik_cisel[ci] = cislo - slovnik_rocnik_cisla[rocnik] = slovnik_cisel - return slovnik_rocnik_cisla + cisla.append(cislo) + rocnik_cisla.append(cisla) + return rocnik_cisla -def gen_temata(rnd, rocniky, slovnik_rocnik_cisla, organizatori): +def gen_temata(rnd, rocniky, rocnik_cisla, organizatori): jake = ["Hravé", "Fyzikální", "Nejlepší", "Totálně masakrální", "Šokující", "Magnetické", "Modré", "Překvapivé", "Plasmatické", "Novoroční"] @@ -302,40 +322,41 @@ def gen_temata(rnd, rocniky, slovnik_rocnik_cisla, organizatori): poc_oboru = rnd.randint(1, 2) poc_op = rnd.randint(1, 3) - slovnik_rocnik_temata = {} + rocnik_temata = [] + k = 0 for rocnik in rocniky: - n = 1 - temata = {} - slovnik_cisel = slovnik_rocnik_cisla[rocnik] - for ci in slovnik_cisel: - if ci <= 3: - t = Tema.objects.create( - # atributy třídy Problem - nazev=" ".join([rnd.choice(jake), 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(n), - # atributy třídy Téma - tema_typ=rnd.choice(Tema.TEMA_CHOICES), - rocnik=rocnik - ) - n+=1 - konec_tematu = min(rnd.randint(ci, 7), len(slovnik_cisel)) - for i in range(ci, konec_tematu+1): - node = TemaVCisleNode.objects.create(tema = t) - otec = slovnik_cisel[i].cislonode - otec_syn(otec, node) + k+=1 + n = 0 + temata = [] + cisla = rocnik_cisla[k-1] + for ci in range(1, 3): + n+=1 + t = Tema.objects.create( + # atributy třídy Problem + nazev=" ".join([rnd.choice(jake), 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(n), + # atributy třídy Téma + tema_typ=rnd.choice(Tema.TEMA_CHOICES), + rocnik=rocnik + ) + konec_tematu = min(rnd.randint(ci, 7), len(cisla)) + for i in range(ci, konec_tematu+1): + node = TemaVCisleNode.objects.create(tema = t) + otec = cisla[i-1].cislonode + otec_syn(otec, node) - t.opravovatele.set(rnd.sample(organizatori, poc_op)) - t.save() - temata[n] = (ci, konec_tematu, t) - slovnik_rocnik_temata[rocnik] = temata - return slovnik_rocnik_temata + t.opravovatele.set(rnd.sample(organizatori, poc_op)) + t.save() + temata.append((ci, konec_tematu, t)) + rocnik_temata.append(temata) + return rocnik_temata -def gen_ulohy_k_tematum(rocniky, slovnik_rocnik_cisla, slovnik_rocnik_temata): #Tahle funkce je nedodělaná +def gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori): # ulohy resene v cisle jaka = ["Šachová", "Černá", "Větrná", "Dlouhá", "Křehká", "Rychlá", "Zákeřná", "Fyzikální"] @@ -354,19 +375,23 @@ def gen_ulohy_k_tematum(rocniky, slovnik_rocnik_cisla, slovnik_rocnik_temata): # "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í"] + k = 0 for rocnik in rocniky: - slovnik_cisel = slovnik_rocnik_cisla[rocnik] - slovnik_temat = slovnik_rocnik_temata[rocnik] - for ci in list(slovnik_cisel)[:-2]: - cislo = slovnik_cisel[ci] + k+=1 + cisla = rocnik_cisla[k-1] + temata = rocnik_temata[k-1] + for ci in range(len(cisla)): + cislo = cisla[ci-1] mozna_tema_vcn = cislo.cislonode.first_child while mozna_tema_vcn != None: if type(mozna_tema_vcn) != TemaVCisleNode: + mozna_tema_vcn = mozna_tema_vcn.succ continue else: tema = mozna_tema_vcn.tema - if not slovnik_temat[int(tema.kod)][1] >= ci+2: # Dnes, za přítomnosti dvou svědků Tomáš Domes slíbil, že tento slovník, ve kterém používá jako klíče přirozená čísla, přepíše na normální list. Budiž. Zde jsem také skončil 21. 6. léta Páně 2019 s první vlnou debugování. Bože žehnej těm, kteří toto debugovací břímě převezmou. + if not temata[int(tema.kod)-1][1] >= ci+2: + mozna_tema_vcn = mozna_tema_vcn.succ continue for i in range(1, rnd.randint(1, 4)): @@ -380,18 +405,35 @@ def gen_ulohy_k_tematum(rocniky, slovnik_rocnik_cisla, slovnik_rocnik_temata): # zamereni=tema.zamereni, autor=tema.autor, garant=tema.garant, - opravovatele=rnd.sample(organizatori, poc_op), kod=str(i), cislo_zadani=cislo, - cislo_reseni=slovnik_cisel[ci+2], - cislo_deadline=slovnik_cisel[ci+2], + cislo_reseni=cisla[ci+2-1], + cislo_deadline=cisla[ci+2-1], max_body = rnd.randint(1, 8) ) - p.zadani = " ".join([rnd.choice(sloveso), rnd.choice(koho), - rnd.choice(ceho), rnd.choice(jmeno), rnd.choice(kde)]) - uloha_zadani = UlohaZadaniNode.objects.create(uloha=p) - p.UlohaZadaniNode = uloha_zadani - otec_syn(mozna_tema_vcn, uloha_zadani) + + p.opravovatele.set(rnd.sample(organizatori, poc_op)) + + 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(mozna_tema_vcn, uloha_zadani) # TODO dělá se podproblém takto??? TODO text_vzoraku = Text.objects.create( na_web = rnd.choice(reseni), @@ -400,8 +442,7 @@ def gen_ulohy_k_tematum(rocniky, slovnik_rocnik_cisla, slovnik_rocnik_temata): # vzorak = TextNode.objects.create(text = text_vzoraku) uloha_vzorak = UlohaVzorakNode.objects.create(uloha=p, first_child = vzorak) p.UlohaVzorakNode = uloha_vzorak - #res_tema_vcn = - res_tema_vcn = slovnik_cisel[ci+2].CisloNode.first_child + res_tema_vcn = cisla[ci+2-1].cislonode.first_child while res_tema_vcn.tema != tema: res_tema_vcn = res_tema_vcn.succ otec_syn(res_tema_vcn, uloha_vzorak) @@ -409,6 +450,7 @@ def gen_ulohy_k_tematum(rocniky, slovnik_rocnik_cisla, slovnik_rocnik_temata): # p.save() mozna_tema_vcn = mozna_tema_vcn.succ + return def otec_syn(otec, syn): bratr = otec.first_child @@ -428,6 +470,7 @@ def create_test_data(size = 6, rnd = None): s = Site.objects.filter(name="example.com") f = FlatPage.objects.create(url="/", title="Seminář M&M", content = "

Vítejte na stránce semináře MaM!

") + print(s) f.sites.add(s[0]) f.save() @@ -466,20 +509,17 @@ def create_test_data(size = 6, rnd = None): rocniky = gen_rocniky(last_rocnik, size) # cisla - slovnik_rocnik_cisla = gen_cisla(rnd, rocniky) + rocnik_cisla = gen_cisla(rnd, rocniky) # generování obyčejných úloh do čísel - for rocnik in rocniky: - slovnik_cisel = slovnik_rocnik_cisla[rocnik] - for ci in slovnik_cisel: - gen_ulohy_do_cisla(rnd, ci, organizatori, resitele, slovnik_cisel, size) + gen_ulohy_do_cisla(rnd, organizatori, resitele, rocnik_cisla, rocniky, size) # generování témat, zatím v prvních třech číslech po jednom # FIXME: více témat - slovnik_rocnik_temata = gen_temata(rnd, rocniky, slovnik_rocnik_cisla, organizatori) + rocnik_temata = gen_temata(rnd, rocniky, rocnik_cisla, organizatori) # generování úloh k tématům ve všech číslech - gen_ulohy_k_tematum(rocniky, slovnik_rocnik_cisla, slovnik_rocnik_temata) + gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori) # FIXME: misto typu ruzne typy objektu a vnoreni do sebe # TODO: vytvorit temata s ruznymi vlakny