import datetime
import random
import logging
import django . contrib . auth
from django . contrib . flatpages . models import FlatPage
from django . contrib . sites . models import Site
from django . db import transaction
from personalni . models import Osoba , Organizator
from tvorba . models import Rocnik , Cislo
from various . models import Nastaveni
from korektury . testutils import create_test_pdf
from novinky . testutils import gen_novinky
from personalni . testutils import gen_organizatori , gen_osoby , gen_prijemci , gen_resitele , gen_skoly
from soustredeni . testutils import gen_soustredeni , gen_konfery
from tvorba . testutils import gen_cisla , gen_clanek , gen_dlouhe_tema , gen_rocniky , gen_temata , gen_ulohy_do_cisla , gen_ulohy_k_tematum
logger = logging . getLogger ( __name__ )
User = django . contrib . auth . get_user_model ( )
@transaction . atomic
def create_test_data ( size = 6 , rnd = None ) :
logger . info ( ' Vyrábím testovací data (size= {} )... ' . format ( size ) )
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> " ,
)
print ( s )
f . sites . add ( s [ 0 ] )
f . save ( )
# users
admin = User . objects . create_superuser (
username = ' admin ' , email = ' ' , password = ' admin ' ,
)
os_admin = Osoba . objects . create (
user = admin , jmeno = ' admin ' , prijmeni = ' admin ' ,
prezdivka = ' admin ' , osloveni = ' ' , email = ' admin@admin.admin ' ,
telefon = ' 123 456 789 ' , datum_narozeni = datetime . date ( 2000 , 1 , 1 ) ,
ulice = ' admin ' , mesto = ' admin ' , psc = ' 100 00 ' ,
datum_registrace = datetime . date ( 2020 , 9 , 6 ) ,
)
or_admin = Organizator . objects . create (
osoba = os_admin , organizuje_od = None , organizuje_do = None ,
strucny_popis_organizatora = " Organizátor k uživateli Admin " ,
)
usernames = [ ' anet ' , ' bara ' , ' cyril ' , ' david ' , ' eva ' , ' filip ' ]
users = [ ]
for usr in usernames [ : size ] :
u = User . objects . create_user ( 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
organizatori = gen_organizatori ( rnd , osoby , last_rocnik )
resitele = gen_resitele ( rnd , osoby , skoly )
# generování novinek
novinky = gen_novinky ( rnd , organizatori )
# prijemci
prijemci = gen_prijemci ( rnd , osoby )
# rocniky
rocniky = gen_rocniky ( last_rocnik , size )
# cisla
# rocnik_cisla je pole polí čísel (typ Cislo), vnitřní pole odpovídají jednotlivým ročníkům.
rocnik_cisla = gen_cisla ( rnd , rocniky )
# generování obyčejných úloh do čísel
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
# 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.
rocnik_temata = gen_temata ( rnd , rocniky , rocnik_cisla , organizatori )
rocnik = Rocnik . objects . filter ( rocnik = 23 ) . first ( )
dlouhe_tema = gen_dlouhe_tema (
rnd , organizatori , rocnik , " Strašně dlouhé téma " ,
" MFI " , 8 ,
)
# generování úloh k tématům ve všech číslech
gen_ulohy_k_tematum ( rnd , rocniky , rocnik_cisla , rocnik_temata , organizatori , resitele )
# generování soustředění
soustredeni = gen_soustredeni ( size , resitele , organizatori , rnd = rnd )
# generování konfer
konfery = gen_konfery ( size , organizatori , soustredeni , rnd = rnd )
# vytvoreni pdf ke korekturam
create_test_pdf ( rnd , organizatori )
# 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)
# TODO: vytvorit temata s ruznymi vlakny
# TODO: nagenerovat starsim rocnikum pohadku
# TODO: nagenerovat články
# TODO: vecpat obrázky všude, kde to jde
# TODO: mezičíslo node
# TODO: přidat ke konferám řešení a dát je do čísel
# Dohackované vytvoření jednoho článku
gen_clanek ( rnd , organizatori , resitele )
# TODO: přidat články včetně zařazení do struktury treenodů,
# a následně otestovat konsistency check databáze z utils.py
# pomocí stránky /stav
# obecné nastavení semináře, musí být už přidané ročníky a čísla, jinak se nastaví divně
nastaveni = Nastaveni . objects . create (
aktualni_cislo = Cislo . objects . all ( ) [ 1 ] )