2015-03-29 14:52:07 +02:00
# -*- coding: utf-8 -*-
import datetime
2019-08-14 14:08:56 +02:00
from pytz import timezone
2015-03-29 14:52:07 +02:00
import random
2019-06-11 01:34:20 +02:00
import lorem
2015-03-29 14:52:07 +02:00
import django . contrib . auth
from django . db import transaction
2019-05-10 23:19:43 +02:00
import unidecode
2019-08-14 03:34:49 +02:00
import logging
2015-03-29 14:52:07 +02:00
2020-02-26 23:40:02 +01:00
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 , Novinky , TreeNode
2015-03-29 14:52:07 +02:00
2015-06-02 22:37:25 +02:00
from django . contrib . flatpages . models import FlatPage
from django . contrib . sites . models import Site
2015-03-29 14:52:07 +02:00
User = django . contrib . auth . get_user_model ( )
2019-05-24 02:31:15 +02:00
zlinska = None # tohle bude speciální škola, které později dodáme kontaktní osobu
2015-03-29 14:52:07 +02:00
2019-08-14 03:34:49 +02:00
logger = logging . getLogger ( __name__ )
2020-02-11 22:40:12 +01:00
# testuje unikátnost vygenerovaného jména
def __unikatni_jmeno ( osoby , jmeno , prijmeni ) :
for os in osoby :
if os . jmeno == jmeno and os . prijmeni == prijmeni :
return 0
else : return 1
2019-05-23 22:52:08 +02:00
def gen_osoby ( rnd , size ) :
2019-08-14 03:34:49 +02:00
logger . info ( ' Generuji osoby (size= {} )... ' . format ( size ) )
2019-05-11 01:15:05 +02:00
jmena_m = [ ' Aleš ' , ' Tomáš ' , ' Martin ' , ' Jakub ' , ' Petr ' , ' Lukáš ' , ' Cyril ' , ' Pavel Karel ' ]
2019-05-16 23:27:24 +02:00
jmena_f = [ ' Eva ' , ' Karolína ' , ' Zuzana ' , ' Sylvie ' , ' Iva ' , ' Jana ' , ' Marie ' ,
' Marta Iva ' , ' Shu Shan ' ]
prijmeni_m = [ ' Novotný ' , ' Svoboda ' , ' Pecha ' , ' Kořen ' , ' Holan ' , ' Uhlíř ' , ' Chytráček ' ,
' Pokora ' , ' Koch ' , ' Szegedy ' , ' Rudý ' , " von Neumann " , " d ' Este " ]
prijmeni_f = [ ' Novotná ' , ' Svobodová ' , ' Machová ' , ' Zelená ' , ' Yu-Xin ' , ' Mlsná ' , ' Dubná ' ,
' Mrkvová ' , ' Suchá ' , ' Lovelace ' , ' Holcová ' , ' Rui ' ]
2019-07-25 21:42:54 +02:00
prezdivky = [ ' Kaki ' , ' Hurdur ' , ' Maracuja ' , ' Bobbo ' , " " , " " , " " , " " , " " ,
2019-05-16 23:27:24 +02:00
" " , " " , ' Riki ' , ' Sapa ' , " " , ' ' , ' --- ' , ' Koko ' ]
domain = [ ' example.com ' , ' dolujeme.eu ' , ' mff.cuni.cz ' , ' strcprstskrzkrk.cz ' ,
' british.co.uk ' , ' splachni.to ' , ' haha.org ' ]
2019-05-11 01:15:05 +02:00
seznam_ulic = [ ' Krátká ' , ' Vlhká ' , ' Jungmanova ' , ' 17. listopadu ' , ' 4. října ' , ' Roztocká ' ,
2019-05-16 23:27:24 +02:00
' Forstova ' , ' Generála Františka Janouška ' , ' Náměstí Války ' ,
' Svratecké náměstí ' , ' Zelená lhota ' , ' Z Plynu ' , ' K Jezeru ' , ' U Kocourkova ' ,
' Uštěpačná ' , ' Ostrorepská ' , ' Zubří ' ]
2019-05-11 01:15:05 +02:00
seznam_mest = [ ' Praha ' , ' Brno ' , ' Ostrava ' , ' Horní Jelení ' , ' Dolní Zábrdovice ' , ' Prdelkov ' ,
' Stará myslivna ' , ' Kocourkov ' , ' Šalingrad ' , ' Medvědí hora ' , ' Basilej ' ,
' Unterschiedlich ' , ' Old York ' , ' Lancastershire ' , ' Vóloďháza ' ]
osoby = [ ]
2019-07-24 16:05:01 +02:00
# 30 je náhodná konstanta, size je použité na víc místech a
2019-05-24 02:31:15 +02:00
# říká, jak velká asi chceme testovací data
2019-07-24 16:05:01 +02:00
for i in range ( 30 * size ) :
2019-05-11 01:15:05 +02:00
pohlavi = rnd . randint ( 0 , 1 )
jmeno = rnd . choice ( [ jmena_m , jmena_f ] [ pohlavi ] )
prijmeni = rnd . choice ( [ prijmeni_m , prijmeni_f ] [ pohlavi ] )
2020-02-11 22:40:12 +01:00
pokusy = 0
max_pokusy = 120 * size
while ( not __unikatni_jmeno and pokusy < max_pokusy ) :
# pokud jméno a příjmení není unikátní, zkoušíme generovat nová
# do daného limitu (abychom se nezacyklili do nekonečna při málo jménech a příjmeních
# ze kterých se generuje)
jmeno = rnd . choice ( [ jmena_m , jmena_f ] [ pohlavi ] )
prijmeni = rnd . choice ( [ prijmeni_m , prijmeni_f ] [ pohlavi ] )
pokusy = pokusy + 1
if pokusy > = max_pokusy :
print ( " Chyba, na danou velikost testovacích dat příliš málo možných "
" jmen a příjmení " )
exit
2019-07-25 21:42:54 +02:00
prezdivka = rnd . choice ( prezdivky )
2019-05-11 01:15:05 +02:00
email = " @ " . join ( [ unidecode . unidecode ( jmeno ) , rnd . choice ( domain ) ] )
2019-07-25 21:42:54 +02:00
telefon = " " . join ( [ str ( rnd . choice ( [ k for k in range ( 10 ) ] ) ) for i in range ( 9 ) ] )
2019-05-16 23:27:24 +02:00
narozeni = datetime . date ( rnd . randint ( 1980 , 2020 ) , rnd . randint ( 1 , 12 ) ,
rnd . randint ( 1 , 28 ) )
ulic = rnd . choice ( seznam_ulic )
cp = rnd . randint ( 1 , 99 )
ulice = " " . join ( [ ulic , str ( cp ) ] )
2019-07-25 21:42:54 +02:00
mesto = rnd . choice ( seznam_mest )
psc = " " . join ( [ str ( rnd . choice ( [ k for k in range ( 10 ) ] ) ) for i in range ( 5 ) ] )
2019-05-16 23:27:24 +02:00
osoby . append ( Osoba . objects . create ( jmeno = jmeno , prijmeni = prijmeni ,
2019-05-23 21:34:37 +02:00
prezdivka = prezdivka , pohlavi_muz = pohlavi , email = email ,
telefon = telefon , datum_narozeni = narozeni , ulice = ulice ,
mesto = mesto , psc = psc ,
datum_registrace = datetime . date ( rnd . randint ( 2019 , 2029 ) ,
rnd . randint ( 1 , 12 ) , rnd . randint ( 1 , 28 ) ) ) )
2019-05-11 01:15:05 +02:00
#TODO pridat foto male a velke. Jak?
2019-06-20 21:08:12 +02:00
# Pavel tvrdí, že to necháme a přidáme až do adminu
2019-05-11 01:15:05 +02:00
2019-05-23 21:34:37 +02:00
return osoby
2019-05-23 22:54:07 +02:00
def gen_skoly ( ) : #TODO někdy to přepsat, aby jich bylo více
2019-08-14 03:34:49 +02:00
logger . info ( ' Generuji školy... ' )
2019-05-23 21:34:37 +02:00
skoly = [ ]
prvnizs = Skola . objects . create ( mesto = ' Praha ' , stat = ' CZ ' , psc = ' 101 00 ' ,
ulice = ' Krátká 5 ' , nazev = ' První ZŠ ' , je_zs = True , je_ss = False )
skoly . append ( prvnizs )
skoly . append ( Skola . objects . create ( mesto = ' Praha ' , stat = ' CZ ' , psc = ' 101 00 ' ,
ulice = ' Krátká 5 ' , nazev = ' První SŠ ' , je_zs = False , je_ss = True ) )
skoly . append ( Skola . objects . create ( mesto = ' Praha ' , stat = ' CZ ' , psc = ' 102 00 ' ,
ulice = ' Dlouhá 5 ' , nazev = ' Druhá SŠ ' , je_zs = False , je_ss = True ) )
skoly . append ( Skola . objects . create ( mesto = ' Praha ' , stat = ' CZ ' , psc = ' 103 00 ' ,
ulice = ' Široká 3 ' , nazev = ' Třetí SŠ a ZŠ ' , je_zs = True , je_ss = True ) )
skoly . append ( Skola . objects . create ( mesto = ' Ostrava ' , stat = ' CZ ' , psc = ' 700 00 ' ,
ulice = ' Hluboká 42 ' , nazev = ' Hutní gympl ' , je_zs = False , je_ss = True ) )
skoly . append ( Skola . objects . create ( mesto = ' Humenné ' , stat = ' SK ' , psc = ' 012 34 ' ,
ulice = ' Pltká 1 ' , nazev = ' Sredná škuola ' , je_zs = False , je_ss = True ) )
2019-05-24 02:31:15 +02:00
global zlinska
zlinska = Skola . objects . create ( mesto = ' Zlín ' , stat = ' CZ ' , psc = ' 76001 ' ,
2019-05-23 21:34:37 +02:00
ulice = ' náměstí T.G. Masaryka 2734-9 ' ,
nazev = ' Gymnázium a Střední jazyková škola s právem SJZ ' ,
2019-05-24 02:31:15 +02:00
kratky_nazev = " GaSJŠspSJZ " , je_zs = True , je_ss = True )
skoly . append ( zlinska )
2019-05-23 21:34:37 +02:00
return skoly
2019-05-23 22:52:08 +02:00
def gen_resitele ( rnd , osoby , skoly ) :
2019-08-14 03:34:49 +02:00
logger . info ( ' Generuji řešitele... ' )
2019-05-11 01:15:05 +02:00
resitele = [ ]
for os in osoby :
rand = rnd . randint ( 0 , 8 )
if not ( rand % 8 == 0 ) :
2019-05-23 23:37:54 +02:00
resitele . append ( Resitel . objects . create ( osoba = os , skola = rnd . choice ( skoly ) ,
2019-05-16 23:27:24 +02:00
rok_maturity = rnd . randint ( 2019 , 2029 ) ,
2019-08-14 04:41:12 +02:00
zasilat = rnd . choice ( Resitel . ZASILAT_CHOICES ) [ 0 ] ) )
2019-05-23 21:34:37 +02:00
return resitele
2019-05-23 22:52:08 +02:00
def gen_prijemci ( rnd , osoby , kolik = 10 ) :
2019-08-14 03:34:49 +02:00
logger . info ( ' Generuji příjemce (kolik= {} )... ' . format ( kolik ) )
2019-05-23 21:34:37 +02:00
prijemci = [ ]
2019-06-21 00:50:55 +02:00
for i in rnd . sample ( osoby , kolik ) :
prijemci . append ( Prijemce . objects . create ( osoba = i ) )
2019-05-29 02:39:04 +02:00
return prijemci
2019-05-23 21:34:37 +02:00
2019-05-23 23:37:54 +02:00
def gen_organizatori ( rnd , osoby , last_rocnik , users ) :
2019-08-14 03:34:49 +02:00
logger . info ( ' Generuji organizátory... ' )
2019-05-23 21:34:37 +02:00
organizatori = [ ]
for os in osoby :
rand = rnd . randint ( 0 , 8 )
if ( rand % 8 == 0 ) :
2019-05-11 01:15:05 +02:00
pusobnost = rnd . randint ( 1 , last_rocnik )
2019-08-14 14:08:56 +02:00
od = datetime . datetime (
year = 1993 + pusobnost ,
month = rnd . randint ( 1 , 12 ) ,
day = rnd . randint ( 1 , 28 ) ,
tzinfo = timezone ( ' CET ' ) ,
)
do = datetime . datetime (
year = od . year + rnd . randint ( 1 , 6 ) ,
month = rnd . randint ( 1 , 12 ) ,
day = rnd . randint ( 1 , 28 ) ,
tzinfo = timezone ( ' CET ' ) ,
)
2019-05-23 22:52:08 +02:00
#aktualni organizatori jeste nemaji vyplnene organizuje_do
2019-05-24 02:31:15 +02:00
if do . year > datetime . datetime . now ( ) . year :
2019-05-23 22:52:08 +02:00
do = None
organizatori . append ( Organizator . objects . create ( osoba = os ,
organizuje_od = od , organizuje_do = do ) )
2019-05-23 23:37:54 +02:00
return organizatori
2019-05-23 22:52:08 +02:00
2019-07-16 23:27:14 +02:00
def gen_ulohy_do_cisla ( rnd , organizatori , resitele , rocnik_cisla , rocniky , size ) :
2019-08-14 03:34:49 +02:00
logger . info ( ' Generuji úlohy do čísla (size= {} )... ' . format ( size ) )
2019-05-28 23:12:34 +02:00
# ulohy resene v cisle
2019-05-23 21:34:37 +02:00
jaka = [ " Šachová " , " Černá " , " Větrná " , " Dlouhá " , " Křehká " , " Rychlá " ,
" Zákeřná " , " Fyzikální " ]
co = [ " kostka " , " smršť " , " díra " , " zrada " , " toulka " , " tyč " ,
" úloha " , " blecha " ]
sloveso = [ " Najděte " , " Spočítejte " , " Zapište " , " Změřte " , " Odhadněte " ]
koho = [ " délku " , " počet " , " množství " , " dílky " ]
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 " ]
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 " ,
" jednoduše pomocí látky z druhého semestru na matfyzu " ,
" 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í " ]
2019-07-16 23:27:14 +02:00
k = 0
for rocnik in rocniky :
k + = 1
2020-02-11 22:40:12 +01:00
print ( " Generuji {} . číslo. " . format ( k ) )
2019-07-16 23:27:14 +02:00
cisla = rocnik_cisla [ k - 1 ]
2020-02-11 20:41:57 +01:00
for ci in range ( 3 , len ( cisla ) + 1 ) : # pro všechna čísla
2020-02-11 21:17:17 +01:00
resitele_size = round ( 7 / 8 * 30 * size ) # očekáváný celkový počet řešitelů
2020-02-11 22:40:12 +01:00
poc_res = rnd . randint ( round ( resitele_size / 8 ) , round ( resitele_size / 4 ) )
# dané číslo řeší něco mezi osminou a čtvrtinou všech řešitelů
2020-02-11 21:17:17 +01:00
# (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 )
2019-07-16 23:27:14 +02:00
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 )
)
2019-06-21 00:50:55 +02:00
2019-07-16 23:27:14 +02:00
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 ) ]
)
2019-05-23 23:54:30 +02:00
)
2019-07-16 23:27:14 +02:00
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 )
2020-02-11 20:41:57 +01:00
# generování vzorového textu
2019-07-16 23:27:14 +02:00
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 ( )
2020-02-11 20:41:57 +01:00
# generování řešení
2020-02-11 22:40:12 +01:00
poc_reseni = rnd . randint ( poc_res , poc_res * 4 )
# generujeme náhodný počet řešení vzhledem k počtu řešitelů čísla
2019-07-16 23:27:14 +02:00
for ri in range ( poc_reseni ) :
2020-02-11 22:40:12 +01:00
#print("Generuji {}-té řešení".format(ri))
2020-02-11 20:41:57 +01:00
if rnd . randint ( 1 , 10 ) == 6 :
# cca desetina řešení od více řešitelů
2020-02-11 21:17:17 +01:00
res_vyber = rnd . sample ( resitele_cisla , rnd . randint ( 2 , 5 ) )
2020-02-11 20:41:57 +01:00
else :
2020-02-11 21:17:17 +01:00
res_vyber = rnd . sample ( resitele_cisla , 1 )
2020-02-11 20:41:57 +01:00
res = Reseni . objects . create ( forma = rnd . choice ( Reseni . FORMA_CHOICES ) [ 0 ] )
2019-07-16 23:27:14 +02:00
# 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
)
2019-05-28 23:12:34 +02:00
return
2019-05-23 21:34:37 +02:00
2019-06-11 01:50:50 +02:00
def gen_soustredeni ( rnd , resitele , organizatori ) :
2019-08-14 03:34:49 +02:00
logger . info ( ' Generuji soustředění... ' )
2019-08-14 03:36:42 +02:00
soustredeni = [ ]
for _ in range ( 1 , 10 ) : #FIXME Tu range si změňte jak chcete, nevím, co přesně znamená size (asi Anet?)
datum_zacatku = datetime . date ( rnd . randint ( 2000 , 2020 ) , rnd . randint ( 1 , 12 ) , rnd . randint ( 1 , 28 ) )
working_sous = Soustredeni . objects . create (
rocnik = Rocnik . objects . order_by ( ' ? ' ) . first ( ) ,
verejne_db = rnd . choice ( [ True , False ] ) ,
misto = rnd . choice ( [ ' Kremrolovice ' , ' Indiánov ' , ' U zmzliny ' , ' Vafláreň ' , ' Větrník ' , ' Horní Rakvička ' , ' Dolní cheesecake ' ] ) ,
typ = rnd . choice ( [ ' jarni ' , ' podzimni ' , ' vikend ' ] ) ,
datum_zacatku = datum_zacatku ,
datum_konce = datum_zacatku + datetime . timedelta ( days = 7 ) )
ucastnici = rnd . sample ( resitele , min ( len ( resitele ) , 20 ) )
working_sous . ucastnici . set ( ucastnici )
#for res in rnd.sample(resitele, min(len(resitele), 20)):
# Soustredeni_Ucastnici.objects.create(resitel=res, soutredeni=working_sous)
orgove_vyber = rnd . sample ( organizatori , min ( len ( organizatori ) , 20 ) )
working_sous . organizatori . set ( orgove_vyber )
#for org in rnd.sample(organizatori, min(len(organizatori), 20)):
# Soustredeni_Organizatori.objects.create(organizator=org, soutredeni=working_sous)
working_sous . save ( )
soustredeni . append ( working_sous )
return soustredeni
2019-05-23 22:54:10 +02:00
2019-06-11 00:25:25 +02:00
def gen_rocniky ( last_rocnik , size ) :
2019-08-14 03:34:49 +02:00
logger . info ( ' Generuji ročníky (size= {} )... ' . format ( size ) )
2019-06-11 00:25:25 +02:00
rocniky = [ ]
node = None
2019-05-11 01:15:05 +02:00
for ri in range ( min ( last_rocnik - size , 1 ) , last_rocnik + 1 ) :
2019-06-11 00:25:25 +02:00
rocnik = Rocnik . objects . create ( prvni_rok = 1993 + ri , rocnik = ri )
node2 = RocnikNode . objects . create ( rocnik = rocnik , succ = node )
2019-06-21 00:50:55 +02:00
rocnik . save ( )
2019-06-11 00:25:25 +02:00
node = node2
rocniky . append ( rocnik )
return rocniky
2019-05-11 01:15:05 +02:00
2019-07-24 16:05:01 +02:00
def gen_konfery ( size , rnd , organizatori , resitele , soustredeni ) :
2019-08-14 03:34:49 +02:00
logger . info ( ' Generuji konfery (size= {} )... ' . format ( size ) )
2019-06-20 21:08:12 +02:00
konfery = [ ]
2019-08-13 20:10:31 +02:00
for _ in range ( 1 , size ) : #FIXME Tu range si změňte jak chcete, nevím, co přesně znamená size (asi Anet?)
# Anet: size je parametr udávající velikost testovacích dat a dá se pomocí ní škálovat,
# kolik dat se nageneruje
2019-06-20 21:08:12 +02:00
konfera = Konfera . objects . create (
nazev = rnd . choice ( [ ' Pozorování ' , ' Zkoumání ' , ' Modelování ' , ' Počítání ' , ' Zkoušení ' ] ) + rnd . choice ( [ ' vlastností ' , ' jevů ' , ' charakteristik ' ] ) + rnd . choice ( [ ' vektorových prostorů ' , ' kinetické terorie látek ' , ' molekulární biologie ' , ' syntentických stromů ' ] ) ,
anotace = lorem . paragraph ( ) ,
abstrakt = lorem . paragraph ( ) ,
organizator = rnd . choice ( organizatori ) ,
soustredeni = rnd . choice ( soustredeni ) ,
typ_prezentace = rnd . choice ( [ ' veletrh ' , ' prezentace ' ] ) )
2019-07-24 16:05:01 +02:00
ucastnici_sous = list ( konfera . soustredeni . ucastnici . all ( ) )
ucastnici = rnd . sample ( ucastnici_sous , min ( len ( ucastnici_sous ) , rnd . randint ( 3 , 6 ) ) )
konfera . ucastnici . set ( ucastnici )
#for res in rnd.sample(ucastnici, min(len(ucastnici), rnd.randint(3, 6))):
# Konfery_Ucastnici.objects.create(resitel=res, konfera=konfera)
2019-06-20 21:08:12 +02:00
konfera . save ( )
2019-07-24 16:05:01 +02:00
konfery . append ( konfera )
2019-06-20 21:08:12 +02:00
konferanode = KonferaNode . objects . create ( konfera = konfera )
konferanode . save ( )
return konfery
2019-06-11 01:34:20 +02:00
2019-06-21 00:50:55 +02:00
def gen_cisla ( rnd , rocniky ) :
2019-08-14 03:34:49 +02:00
logger . info ( ' Generuji čísla... ' )
2019-07-16 23:27:14 +02:00
rocnik_cisla = [ ]
2019-06-11 00:25:25 +02:00
for rocnik in rocniky :
2019-06-11 02:04:52 +02:00
otec = True
2019-07-16 23:27:14 +02:00
cisla = [ ]
2019-06-11 00:25:25 +02:00
cisel = rnd . randint ( 4 , 8 )
node = None
2019-05-11 01:15:05 +02:00
for ci in range ( 1 , cisel + 1 ) :
2019-05-24 02:31:15 +02:00
# 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
2019-06-21 00:50:55 +02:00
vydano = datetime . date ( rocnik . prvni_rok + mesic_vydani / / 12 ,
( mesic_vydani - 1 ) % 12 + 1 ,
2019-05-24 02:31:15 +02:00
rnd . randint ( 1 , 28 ) )
2019-06-21 00:50:55 +02:00
deadline = datetime . date ( rocnik . prvni_rok + ( mesic_vydani + 2 ) / / 12 ,
( mesic_vydani + 1 ) % 12 + 1 ,
2019-05-24 02:31:15 +02:00
rnd . randint ( 1 , 28 ) )
# posledni 2 cisla v rocniku nemaji deadline
if ( ci + 2 > cisel ) :
deadline = None
2019-05-29 02:39:04 +02:00
cislo = Cislo . objects . create (
2019-06-11 00:25:25 +02:00
rocnik = rocnik ,
2019-11-20 21:17:15 +01:00
poradi = str ( ci ) ,
2019-05-29 02:39:04 +02:00
datum_vydani = vydano ,
datum_deadline = deadline ,
verejne_db = True
)
2019-06-11 00:25:25 +02:00
node2 = CisloNode . objects . create ( cislo = cislo , succ = node )
2019-06-21 01:59:48 +02:00
cislo . save ( )
2019-06-11 00:25:25 +02:00
node = node2
2019-06-11 02:04:52 +02:00
if otec :
otec = False
2019-06-21 00:50:55 +02:00
rocnik . rocniknode . first_child = node
2019-06-11 02:04:52 +02:00
rocnik . save ( )
2019-06-11 00:25:25 +02:00
2019-07-16 23:27:14 +02:00
cisla . append ( cislo )
rocnik_cisla . append ( cisla )
return rocnik_cisla
2019-05-11 01:15:05 +02:00
2019-07-16 23:27:14 +02:00
def gen_temata ( rnd , rocniky , rocnik_cisla , organizatori ) :
2019-08-14 03:34:49 +02:00
logger . info ( ' Generuji témata... ' )
2019-06-20 23:15:09 +02:00
jake = [ " Hravé " , " Fyzikální " , " Nejlepší " , " Totálně masakrální " ,
2019-05-23 21:34:37 +02:00
" Šokující " , " Magnetické " , " Modré " , " Překvapivé " ,
" Plasmatické " , " Novoroční " ]
2019-06-11 02:04:52 +02:00
co = [ " téma " , " záření " , " stavení " , " jiskření " , " jelito " ,
2019-06-20 23:15:09 +02:00
" drama " , " kuře " , " moře " , " klání " , " proudění " , " čekání " ]
2019-06-11 02:04:52 +02:00
poc_oboru = rnd . randint ( 1 , 2 )
2019-06-20 23:15:09 +02:00
2019-07-16 23:27:14 +02:00
rocnik_temata = [ ]
2020-02-26 21:10:54 +01:00
# Věříme, že rocnik_cisla je pole polí čísel podle ročníků, tak si necháme dát vždycky jeden ročník a k němu příslušná čísla.
for rocnik , cisla in zip ( rocniky , rocnik_cisla ) :
kod = 1
2020-02-26 23:40:02 +01:00
letosni_temata = [ ]
2020-02-26 21:10:54 +01:00
# Do každého ročníku vymyslíme tři (zatím) témata, v každém z prvních čísel jedno
for zacatek_tematu in range ( 1 , 3 ) :
# Vygenerujeme téma
2019-07-16 23:27:14 +02:00
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 ) ,
2020-02-26 21:10:54 +01:00
kod = str ( kod ) ,
2019-07-16 23:27:14 +02:00
# atributy třídy Téma
2019-08-14 04:41:12 +02:00
tema_typ = rnd . choice ( Tema . TEMA_CHOICES ) [ 0 ] ,
2019-12-05 00:50:04 +01:00
rocnik = rocnik ,
2020-02-26 21:10:54 +01:00
abstrakt = " Abstrakt tematka {} " . format ( kod )
2019-07-16 23:27:14 +02:00
)
2020-02-26 21:10:54 +01:00
kod + = 1
# Vymyslíme, kdy skončí
konec_tematu = min ( rnd . randint ( zacatek_tematu , 7 ) , len ( cisla ) )
# Vyrobíme TemaVCisleNody pro obsah
for i in range ( zacatek_tematu , konec_tematu + 1 ) :
2019-07-16 23:27:14 +02:00
node = TemaVCisleNode . objects . create ( tema = t )
2020-02-26 23:40:02 +01:00
# FIXME: Není to off-by-one?
2019-07-16 23:27:14 +02:00
otec = cisla [ i - 1 ] . cislonode
otec_syn ( otec , node )
2019-05-24 02:31:15 +02:00
2020-02-26 21:10:54 +01:00
# Vymyslíme, kdo to bude opravovat
poc_opravovatelu = rnd . randint ( 1 , 3 )
t . opravovatele . set ( rnd . sample ( organizatori , poc_opravovatelu ) )
# Uložíme všechno
2019-07-16 23:27:14 +02:00
t . save ( )
2020-02-26 23:40:02 +01:00
letosni_temata . append ( ( zacatek_tematu , konec_tematu , t ) )
rocnik_temata . append ( letosni_temata )
2019-07-16 23:27:14 +02:00
return rocnik_temata
2019-06-11 00:25:25 +02:00
2019-06-11 02:04:52 +02:00
2019-07-16 23:27:14 +02:00
def gen_ulohy_k_tematum ( rnd , rocniky , rocnik_cisla , rocnik_temata , organizatori ) :
2019-08-14 03:34:49 +02:00
logger . info ( ' Generuji úlohy k tématům... ' )
2019-06-11 02:04:52 +02:00
# ulohy resene v cisle
jaka = [ " Šachová " , " Černá " , " Větrná " , " Dlouhá " , " Křehká " , " Rychlá " ,
" Zákeřná " , " Fyzikální " ]
co = [ " kostka " , " smršť " , " díra " , " zrada " , " toulka " , " tyč " ,
" úloha " , " blecha " ]
sloveso = [ " Najděte " , " Spočítejte " , " Zapište " , " Změřte " , " Odhadněte " ]
koho = [ " délku " , " počet " , " množství " , " dílky " ]
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 " ]
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 " ,
" jednoduše pomocí látky z druhého semestru na matfyzu " ,
" 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í " ]
2020-02-26 23:40:02 +01:00
# Ke každému ročníku si vezmeme příslušná čísla a témata
for rocnik , cisla , temata in zip ( rocniky , rocnik_cisla , rocnik_temata ) :
# Do každého čísla nagenerujeme ke každému témátku pár úložek
for cislo in cisla :
print ( " Generuji úložky do {} -tého čísla " . format ( cislo . poradi ) )
# Vzorák bude o dvě čísla dál
cislo_se_vzorakem = Cislo . objects . filter (
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í.
if len ( cislo_se_vzorakem ) == 0 :
cislo_se_vzorakem = cisla [ - 1 ]
else :
cislo_se_vzorakem = cislo_se_vzorakem . first ( )
# FIXME: Tenhle generátor dát asi někam jinam
def potomci ( node ) :
if not isinstance ( node , TreeNode ) :
raise ValueError ( " Typ {} nemá potomky " , type ( node ) )
current_child = node . first_child
while current_child is not None :
yield current_child
current_child = current_child . succ
for mozna_tema_node in potomci ( cislo . cislonode ) :
if not isinstance ( mozna_tema_node , TemaVCisleNode ) :
2019-06-21 00:50:55 +02:00
continue
2020-02-26 23:40:02 +01:00
tema_node = mozna_tema_node
tema = tema_node . tema
2019-06-21 00:50:55 +02:00
2020-02-26 23:40:02 +01:00
# 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)
if not temata [ int ( tema . kod ) - 1 ] [ 1 ] > = int ( cislo_se_vzorakem . poradi ) :
2019-06-21 00:50:55 +02:00
continue
2020-02-26 23:40:02 +01:00
# Generujeme 1 až 4 úložky k tomuto témátku do tohoto čísla
for kod in range ( 1 , rnd . randint ( 1 , 4 ) ) :
u = Uloha . objects . create (
2019-06-21 00:50:55 +02:00
nazev = " : " . join ( [ tema . nazev ,
2020-02-26 23:40:02 +01:00
" úloha {} . " . format ( kod ) ] ) ,
2019-06-21 00:50:55 +02:00
nadproblem = tema ,
stav = Problem . STAV_ZADANY ,
zamereni = tema . zamereni ,
autor = tema . autor ,
garant = tema . garant ,
2020-02-26 23:40:02 +01:00
kod = str ( kod ) ,
2019-06-21 00:50:55 +02:00
cislo_zadani = cislo ,
2020-02-26 23:40:02 +01:00
cislo_reseni = cislo_se_vzorakem ,
cislo_deadline = cislo_se_vzorakem ,
2019-06-21 00:50:55 +02:00
max_body = rnd . randint ( 1 , 8 )
)
2019-07-16 23:27:14 +02:00
2020-02-26 23:40:02 +01:00
poc_opravovatelu = rnd . randint ( 1 , 4 )
u . opravovatele . set ( rnd . sample ( organizatori , poc_opravovatelu ) )
2019-07-16 23:27:14 +02:00
2020-02-26 23:40:02 +01:00
# Samotný obsah následně vzniklého Textu zadání
obsah = " " . join (
2019-07-16 23:27:14 +02:00
[ rnd . choice ( sloveso ) ,
rnd . choice ( koho ) ,
rnd . choice ( ceho ) ,
rnd . choice ( jmeno ) ,
rnd . choice ( kde ) ]
)
2020-02-26 23:40:02 +01:00
text_zadani = Text . objects . create (
na_web = obsah ,
do_cisla = obsah ,
)
2019-07-16 23:27:14 +02:00
zad = TextNode . objects . create ( text = text_zadani )
2020-02-26 23:40:02 +01:00
uloha_zadani = UlohaZadaniNode . objects . create ( uloha = u , first_child = zad )
u . ulohazadaninode = uloha_zadani
# FIXME: Tohle dává zadání vždy jako prvního potomka témátka, spec. se naskládají v opačném pořadí a nemůže mezi nimi vzniknout žádný (orgo-)text
otec_syn ( tema_node , uloha_zadani )
2019-06-21 00:50:55 +02:00
2020-02-26 23:40:02 +01:00
# Text vzoráku stejně
obsah = rnd . choice ( reseni )
2019-06-21 00:50:55 +02:00
text_vzoraku = Text . objects . create (
2020-02-26 23:40:02 +01:00
na_web = obsah ,
do_cisla = obsah ,
2019-06-21 00:50:55 +02:00
)
vzorak = TextNode . objects . create ( text = text_vzoraku )
2020-02-26 23:40:02 +01:00
uloha_vzorak = UlohaVzorakNode . objects . create ( uloha = u , first_child = vzorak )
u . UlohaVzorakNode = uloha_vzorak
# Najdeme správný TemaVCisleNode pro vložení vzoráku
res_tema_node = None ;
for node in potomci ( cislo_se_vzorakem . cislonode ) :
if isinstance ( node , TemaVCisleNode ) and node . tema == tema :
res_tema_node = node
if res_tema_node is None :
raise LookupError ( " Nenalezen Node pro vložení vzoráku " )
# FIXME: Stejný problém jako výše: vzoráky se dají na začátek v opačném pořadí.
otec_syn ( res_tema_node , uloha_vzorak )
2019-06-21 00:50:55 +02:00
2020-02-26 23:40:02 +01:00
u . save ( )
2019-07-16 23:27:14 +02:00
return
2019-07-25 23:09:31 +02:00
def gen_novinky ( rnd , organizatori ) :
2019-08-14 03:34:49 +02:00
logger . info ( ' Generuji novinky... ' )
2019-07-25 23:09:31 +02:00
jake = [ " zábavné " , " veselé " , " dobrodružné " , " skvělé " ]
co = [ " soustředění " , " Fyziklání " , " víkendové setkání " ]
kde = [ " na Šumavě " , " v Praze " , " u Plzně " , " na Marsu " ]
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 ] ) )
novinka . save ( )
return
2019-06-21 00:50:55 +02:00
2019-06-20 23:15:09 +02:00
def otec_syn ( otec , syn ) :
bratr = otec . first_child
2020-02-26 23:40:02 +01:00
syn . succ = bratr
2019-06-20 23:15:09 +02:00
otec . first_child = syn
syn . save ( )
otec . save ( )
2019-06-11 00:25:25 +02:00
@transaction.atomic
def create_test_data ( size = 6 , rnd = None ) :
2019-08-14 03:34:49 +02:00
logger . info ( ' Vyrábím testovací data (size= {} )... ' . format ( size ) )
2019-06-11 00:25:25 +02:00
assert size > = 1
# pevna pseudo-nahodnost
rnd = rnd or random . Random ( x = 42 )
# static URL stranky
# FIXME: nakopirovat sem vsechny z produkcni databaze
s = Site . objects . filter ( name = " example.com " )
f = FlatPage . objects . create ( url = " / " , title = " Seminář M&M " ,
content = " <p>Vítejte na stránce semináře MaM!</p> " )
2019-07-16 23:27:14 +02:00
print ( s )
2019-06-11 00:25:25 +02:00
f . sites . add ( s [ 0 ] )
f . save ( )
# users
admin = User . objects . create_superuser ( username = ' admin ' , email = ' ' , password = ' admin ' )
usernames = [ ' anet ' , ' bara ' , ' cyril ' , ' david ' , ' eva ' , ' filip ' ]
users = [ ]
for usr in usernames [ : size ] :
u = User . objects . create ( username = usr , password = usr )
u . first_name = usr . capitalize ( )
u . save ( )
users . append ( u )
print ( users )
# skoly
skoly = gen_skoly ( )
# osoby
osoby = gen_osoby ( rnd , size )
# resitele a organizatori
last_rocnik = 25
resitele = gen_resitele ( rnd , osoby , skoly )
organizatori = gen_organizatori ( rnd , osoby , last_rocnik , users )
2019-07-25 23:09:31 +02:00
#generování novinek
novinky = gen_novinky ( rnd , organizatori )
2019-06-11 00:25:25 +02:00
# prijemci
prijemci = gen_prijemci ( rnd , osoby )
global zlinska
zlinska . kontaktni_osoba = rnd . choice ( osoby )
zlinska . save ( )
# rocniky
rocniky = gen_rocniky ( last_rocnik , size )
# cisla
2020-02-26 20:19:10 +01:00
# rocnik_cisla je pole polí čísel (typ Cislo), vnitřní pole odpovídají jednotlivým ročníkům.
2019-07-16 23:27:14 +02:00
rocnik_cisla = gen_cisla ( rnd , rocniky )
2019-06-11 00:25:25 +02:00
# generování obyčejných úloh do čísel
2019-07-16 23:27:14 +02:00
gen_ulohy_do_cisla ( rnd , organizatori , resitele , rocnik_cisla , rocniky , size )
2019-06-11 00:25:25 +02:00
# generování témat, zatím v prvních třech číslech po jednom
# FIXME: více témat
2020-02-26 20:08:35 +01:00
# rocnik_temata je pole polí trojic (první číslo :int, poslední číslo :int, téma:Tema), přičemž každé vnitřní pole odpovídá ročníku a FIXME: je to takhle fuj a když to někdo vidí poprvé, tak je z toho smutný, protože vůbec neví, co se děje a co má čekat.
2019-07-16 23:27:14 +02:00
rocnik_temata = gen_temata ( rnd , rocniky , rocnik_cisla , organizatori )
2019-06-11 00:25:25 +02:00
# generování úloh k tématům ve všech číslech
2019-07-16 23:27:14 +02:00
gen_ulohy_k_tematum ( rnd , rocniky , rocnik_cisla , rocnik_temata , organizatori )
2019-07-24 16:05:01 +02:00
#generování soustředění
soustredeni = gen_soustredeni ( rnd , resitele , organizatori )
#generování konfer
konfery = gen_konfery ( size , rnd , organizatori , resitele , soustredeni )
# TODO: nastavi správně, kolik se čeho generuje, aby rozsahy přibližně odpovídaly
# FIXME: misto typu ruzne typy objektu a vnoreni do sebe (Tom nechápe, co je tímto fixme míněno)
2019-05-23 21:34:37 +02:00
# TODO: vytvorit temata s ruznymi vlakny
# TODO: nagenerovat starsim rocnikum pohadku
2019-05-29 02:39:04 +02:00
# TODO: nagenerovat články
# TODO: vecpat obrázky všude, kde to jde
2019-06-20 23:15:09 +02:00
# TODO: mezičíslo node
2019-07-24 16:05:01 +02:00
# TODO: přidat ke konferám řešení a dát je do čísel
2019-05-10 23:19:43 +02:00
2019-07-25 23:09:31 +02:00
2019-05-24 02:31:15 +02:00
# obecné nastavení semináře, musí být už přidané ročníky a čísla, jinak se nastaví divně
2019-11-21 18:37:53 +01:00
nastaveni = Nastaveni . objects . create (
2019-05-24 02:31:15 +02:00
aktualni_cislo = Cislo . objects . all ( ) [ 1 ] )