@ -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 ] )