You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

138 lines
4.6 KiB

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&iacute;tejte na str&aacute;nce semin&aacute;ř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])