testutils: doplnění komentářů, debugování.

Aktuálně je to zaseklé na neexistenci čísel při generování témat při generování čísel.
Je potřeba to odděli do samostatné funkce, která dostane už nagenerovaná čísla.
This commit is contained in:
Anet 2019-05-24 02:31:15 +02:00
parent d14acdd77e
commit 11ef242141

View file

@ -6,12 +6,13 @@ 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, Osoba, Organizator
from seminar.models import Skola, Resitel, Rocnik, Cislo, Problem, Reseni, PrilohaReseni, Nastaveni, Soustredeni, Soustredeni_Ucastnici, Osoba, Organizator, Prijemce, Tema, Uloha
from django.contrib.flatpages.models import FlatPage
from django.contrib.sites.models import Site
User = django.contrib.auth.get_user_model()
zlinska = None # tohle bude speciální škola, které později dodáme kontaktní osobu
def gen_osoby(rnd, size):
jmena_m = ['Aleš', 'Tomáš', 'Martin', 'Jakub', 'Petr', 'Lukáš', 'Cyril', 'Pavel Karel']
@ -34,7 +35,9 @@ def gen_osoby(rnd, size):
'Unterschiedlich', 'Old York', 'Lancastershire', 'Vóloďháza']
osoby = []
for i in range(3 * size): # 3 je náhodná konstanta, size je použité na víc místech a říká, jak velká asi chceme testovací data
# 3 je náhodná konstanta, size je použité na víc místech a
# říká, jak velká asi chceme testovací data
for i in range(3 * size):
pohlavi = rnd.randint(0,1)
jmeno = rnd.choice([jmena_m, jmena_f][pohlavi])
prijmeni = rnd.choice([prijmeni_m, prijmeni_f][pohlavi])
@ -77,10 +80,12 @@ def gen_skoly(): #TODO někdy to přepsat, aby jich bylo více
skoly.append(Skola.objects.create(mesto='Humenné', stat='SK', psc='012 34',
ulice='Pltká 1', nazev='Sredná škuola', je_zs=False, je_ss=True))
#FIXME pridat kontaktni osobu alespon nekde
skoly.append(Skola.objects.create(mesto = 'Zlín', stat='CZ', psc='76001',
global zlinska
zlinska = Skola.objects.create(mesto = 'Zlín', stat='CZ', psc='76001',
ulice='náměstí T.G. Masaryka 2734-9',
nazev='Gymnázium a Střední jazyková škola s právem SJZ',
kratky_nazev="GaSJŠspSJZ", je_zs=True, je_ss=True))
kratky_nazev="GaSJŠspSJZ", je_zs=True, je_ss=True)
skoly.append(zlinska)
return skoly
def gen_resitele(rnd, osoby, skoly):
@ -106,17 +111,20 @@ def gen_organizatori(rnd, osoby, last_rocnik, users):
rand = rnd.randint(0, 8)
if (rand % 8 == 0):
pusobnost = rnd.randint(1, last_rocnik)
od = 1993 + pusobnost
do = od + rnd.randint(1, 6)
od = datetime.date(1993 + pusobnost, rnd.randint(1, 12), rnd.randint(1, 28))
do = datetime.date(od.year + rnd.randint(1, 6), rnd.randint(1, 12),
rnd.randint(1, 28))
#aktualni organizatori jeste nemaji vyplnene organizuje_do
if do > datetime.datetime.now().year:
if do.year > datetime.datetime.now().year:
do = None
organizatori.append(Organizator.objects.create(osoba=os,
organizuje_od=od, organizuje_do=do))
return organizatori
def gen_ulohy_do_cisla(rnd, cislo, organizatori, resitele, slovnik_cisel, size):
'''cislo = cislo cisla v rocniku, nikoli objekt Cislo '''
'''
cislo = cislo cisla v rocniku, nikoli objekt Cislo
'''
# ulohy resene v ci
jaka = ["Šachová", "Černá", "Větrná", "Dlouhá", "Křehká", "Rychlá",
"Zákeřná", "Fyzikální"]
@ -138,23 +146,25 @@ def gen_ulohy_do_cisla(rnd, cislo, organizatori, resitele, slovnik_cisel, size):
if cislo >= 3:
for pi in range(1, ((size + 1) // 2) + 1):
poc_op = rnd.randint(1, 4) #počet opravovatelů
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(zamereni, poc_oboru),
autor=rnd.choice(organizatori),
garant=rnd.choice(organizatori),
opravovatele=rnd.sample(organizatori, poc_op),
kod=str(pi),
# atributy třídy Uloha
cislo_zadani=slovnik_cisel[cislo-2],
cislo_reseni=slovnik_cisel[cislo],
cislo_deadline=slovnik_cisel[cislo],
max_body = rnd.randint(1, 8))
p.zadani = " ".join([rnd.choice(sloveso), rnd.choice(koho),
rnd.choice(ceho), rnd.choice(jmeno), rnd.choice(kde)])
p.vzorak = " - ".join([p.zadani, rnd.choice(reseni)])
p.vzorak = " - ".join([p.zadani, rnd.choice(reseni)])
p.opravovatele = rnd.sample(organizatori, poc_op)
p.save()
# reseni ulohy
@ -164,15 +174,22 @@ def gen_ulohy_do_cisla(rnd, cislo, organizatori, resitele, slovnik_cisel, size):
# (nebo skoro vsechny resitele, pokud jich je mene nez pocet reseni)
res_vyber = rnd.sample(resitele, min(poc_reseni, len(resitele) - 2))
for resitel in res_vyber:
res = Reseni.objects.create(problem = p,
resitele=[resitel],
forma=rnd.choice(Reseni.FORMA_CHOICES))
hod = Hodnoceni.objects.create(body=rnd.randint(0, p.max_body),
cislo_body=slovnik_cisel[cislo], reseni=res, problem=p)
# 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.resitele = [resitel]
res.problem = p
res.save()
hod = Hodnoceni.objects.create(
body=rnd.randint(0, p.max_body),
cislo_body=slovnik_cisel[cislo],
reseni=res, problem=p)
return
def gen_soustredeni():
# TODO: vice soustredeni a k nim nahodne podmnoziny organizatoru a ucastniku
# TODO: pozor, organizatori a ucastnici jsou ManyToManyField, musí se přiřadit
# mimo create() a pak dát save()
sous = Soustredeni.objects.create(rocnik=Rocnik.objects.first(), verejne_db=True,
misto=u'Někde', datum_zacatku=datetime.date(2000, 11, 23),
datum_konce=datetime.date(2000, 11, 27))
@ -181,8 +198,6 @@ def gen_soustredeni():
Soustredeni_Ucastnici.objects.create(resitel=res, soustredeni=sous)
sous.save()
nastaveni = Nastaveni.objects.create(aktualni_rocnik = Rocnik.objects.last(),
aktualni_cislo = Cislo.objects.all()[1])
@transaction.atomic
def create_test_data(size = 6, rnd = None):
@ -222,8 +237,9 @@ def create_test_data(size = 6, rnd = None):
organizatori = gen_organizatori(rnd, osoby, last_rocnik, users)
# prijemci
prijemci = gen_prijemci(rnd)
prijemci = gen_prijemci(rnd, osoby)
global zlinska
zlinska.kontaktni_osoba=rnd.choice(osoby)
zlinska.save()
@ -235,17 +251,25 @@ def create_test_data(size = 6, rnd = None):
cisel = rnd.randint(4, 8)
slovnik_cisel = {}
for ci in range(1, cisel + 1):
if ci >= 3:
vydano = datetime.date(r.prvni_rok, ci + 6, rnd.randint(1, 28))
deadline = datetime.date(r.prvni_rok, ci + 8, rnd.randint(1, 28))
else:
vydano = datetime.date(r.druhy_rok, ci - 3, rnd.randint(1, 28))
# posledni 2 cisla v rocniku nemaji deadline
if (ci + 2 > cisel):
deadline = datetime.date(r.druhy_rok, ci - 1,
rnd.randint(1, 28))
else:
deadline = None
# první číslo vydáváme typicky okolo prázdnin
# (ci - 1)*2 zaručuje první číslo v červnu a všechna
# další po dvou měsících (což je rozumná aproximace)
mesic_vydani = (ci - 1)*2 + 6
# celociselné dělení mi řekne, jestli to je první nebo druhý rok ročníku
vydano = datetime.date(r.prvni_rok + mesic_vydani // 12,
mesic_vydani,
rnd.randint(1, 28))
deadline = datetime.date(r.prvni_rok + (mesic_vydani + 2) // 12,
mesic_vydani + 2,
rnd.randint(1, 28))
# posledni 2 cisla v rocniku nemaji deadline
if (ci + 2 > cisel):
deadline = datetime.date(r.druhy_rok, ci - 1,
rnd.randint(1, 28))
else:
deadline = None
cislo = Cislo.objects.create(rocnik = r, cislo = str(ci),
datum_vydani=vydano, datum_deadline=deadline,
verejne_db=True)
@ -254,7 +278,8 @@ def create_test_data(size = 6, rnd = None):
# generovani uloh
gen_ulohy_do_cisla(rnd, ci, organizatori, resitele, slovnik_cisel, size)
# generovani temat
# generování témat, zatím v prvních třech číslech po jednom
# FIXME: více témat
if ci <= 3:
jake = ["Hravé", "Fyzikální", "Nejlepší", "Totálně masakrální",
"Šokující", "Magnetické", "Modré", "Překvapivé",
@ -264,31 +289,42 @@ def create_test_data(size = 6, rnd = None):
poc_oboru = rnd.randint(1, 2)
poc_op = rnd.randint(1, 3)
t = Tema.objects.create(
# atributy třídy Problem
nazev=" ".join([rnd.choice(jake), rnd.choice(co)]),
stav=Problem.STAV_ZADANY,
zamereni=rnd.sample(zamereni, poc_oboru),
zamereni=rnd.sample(["M", "F", "I", "O", "B"], poc_oboru),
autor=rnd.choice(organizatori),
garant=rnd.choice(organizatori),
opravovatele=rnd.sample(organizatori, poc_op),
kod=str(pi),
# FIXME: téma má kód podle čísla, až jich bude
# více, tak udělat kód podle pořadí vygenerování
kod=str(ci),
# atributy třídy Téma
tema_typ=rnd.choice(Tema.TEMA_CHOICES),
rocnik=r)
t.opravovatele=rnd.sample(organizatori, poc_op)
t.save()
# FIXME: nefunguje, protože další čísla v tuhle chvíli ještě
# nejsou nagenerovaná
# nagenerovat k tématu úlohy a Nody pro vsechna cisla
for i in range(ci, cisel):
# vytvor ulohu
for i in range(ci, cisel-2):
# vytvoř úlohu pro každé ze zbývajících čísel
poc_op = rnd.randint(1, 4)
poc_oboru = rnd.randint(1, 2)
p = Uloha.objects.create(
nazev=": ".join([t.nazev, "úloha {}.".format(i)]),
nazev=": ".join([t.nazev,
"úloha {}.".format(i-ci+1)]),
nadproblem=t,
stav=Problem.STAV_ZADANY,
zamereni=t.zamereni,
autor=t.autor,
garant=t.garant,
opravovatele=rnd.sample(organizatori, poc_op),
kod=str(i),
cislo_zadani=slovnik_cisel[cislo-2],
cislo_reseni=slovnik_cisel[cislo],
cislo_deadline=slovnik_cisel[cislo],
cislo_zadani=slovnik_cisel[ci],
cislo_reseni=slovnik_cisel[ci+2],
cislo_deadline=slovnik_cisel[ci+2],
max_body = rnd.randint(1, 8))
p.zadani = " ".join([rnd.choice(sloveso), rnd.choice(koho),
rnd.choice(ceho), rnd.choice(jmeno), rnd.choice(kde)])
@ -310,6 +346,6 @@ def create_test_data(size = 6, rnd = None):
# TODO: nahodne nagenerovat problemum reseni a prilohy reseni, hodnoceni
# obecné nastavení semináře, musí být už přidané ročníky a čísla, jinak se nastaví divně
nastaveni = Nastaveni.objects.create(aktualni_rocnik = Rocnik.objects.last(),
aktualni_cislo = Cislo.objects.all()[1])