Jonas Havelka
3 months ago
6 changed files with 443 additions and 368 deletions
@ -0,0 +1,27 @@ |
|||
import logging |
|||
|
|||
from .models import Novinky |
|||
|
|||
logger = logging.getLogger(__name__) |
|||
|
|||
|
|||
def gen_novinky(rnd, organizatori): |
|||
logger.info('Generuji novinky...') |
|||
|
|||
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 |
@ -0,0 +1,40 @@ |
|||
import datetime |
|||
import random |
|||
|
|||
from seminar.models.odevzdavatko import Reseni, Hodnoceni |
|||
|
|||
|
|||
def gen_reseni_ulohy(rnd, cisla, uloha, pocet_resitelu, poradi_cisla, resitele_cisla, resitele): |
|||
pocet_reseni = rnd.randint(pocet_resitelu//4, pocet_resitelu * 4) |
|||
# generujeme náhodný počet řešení vzhledem k počtu řešitelů čísla |
|||
for _ in range(pocet_reseni): |
|||
#print("Generuji {}-té řešení".format(reseni)) |
|||
if rnd.randint(1, 10) == 1: |
|||
# cca desetina řešení od více řešitelů |
|||
res_vyber = rnd.sample(resitele_cisla, rnd.randint(2, 5)) |
|||
else: |
|||
res_vyber = rnd.sample(resitele_cisla, 1) |
|||
if resitele[0] in res_vyber: # speciální řešitel, který nemá žádné body |
|||
res_vyber.remove(resitele[0]) |
|||
|
|||
# Vytvoření řešení. |
|||
if uloha.cislo_zadani.zlomovy_deadline_pro_papirove_cislo() is not None: |
|||
# combine, abychom dostali plný čas a ne jen datum |
|||
cas_doruceni = uloha.cislo_zadani.deadline_v_cisle.first().deadline - datetime.timedelta(days=random.randint(0, 40)) - datetime.timedelta(minutes=random.randint(0, 60*24)) |
|||
# astimezone, protože jinak vyhazuje warning o nenastavené TZ |
|||
res = Reseni.objects.create(forma=rnd.choice(Reseni.FORMA_CHOICES)[0], cas_doruceni=cas_doruceni.astimezone(datetime.timezone.utc)) |
|||
else: |
|||
res = Reseni.objects.create(forma=rnd.choice(Reseni.FORMA_CHOICES)[0]) |
|||
# Problém a řešitele přiřadíme později, ManyToManyField |
|||
# se nedá vyplnit v create(). |
|||
res.resitele.set(res_vyber) |
|||
res.save() |
|||
|
|||
# Vytvoření hodnocení. |
|||
hod = Hodnoceni.objects.create( |
|||
body=rnd.randint(0, uloha.max_body), |
|||
cislo_body=cisla[poradi_cisla - 1], |
|||
reseni=res, |
|||
problem=uloha |
|||
) |
|||
return |
@ -0,0 +1,235 @@ |
|||
import datetime |
|||
import logging |
|||
import unidecode |
|||
|
|||
from django.contrib.auth.models import Permission |
|||
from django.contrib.auth.models import Group |
|||
import django.contrib.auth |
|||
|
|||
from .models import Osoba, Skola, Organizator, Resitel, Prijemce |
|||
|
|||
logger = logging.getLogger(__name__) |
|||
|
|||
User = django.contrib.auth.get_user_model() |
|||
|
|||
zlinska = None # tohle bude speciální škola, které později dodáme kontaktní osobu |
|||
|
|||
|
|||
# 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 |
|||
|
|||
|
|||
def gen_osoby(rnd, size): |
|||
logger.info('Generuji osoby (size={})...'.format(size)) |
|||
|
|||
jmena_m = ['Aleš', 'Tomáš', 'Martin', 'Jakub', 'Petr', 'Lukáš', 'Cyril', 'Pavel Karel'] |
|||
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', "Nováčková Tydlitátová"] |
|||
prezdivky = ['Kaki', 'Hurdur', 'Maracuja', 'Bobbo', "", "", "", "", "", "", "", 'Riki', 'Sapa', "", '', '---', 'Koko'] |
|||
domain = ['example.com', 'dolujeme.eu', 'mff.cuni.cz', 'strcprstskrzkrk.cz', 'british.co.uk', 'splachni.to', 'haha.org'] |
|||
seznam_ulic = ['Krátká', 'Vlhká', 'Jungmanova', '17. listopadu', '4. října', 'Roztocká', '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ří'] |
|||
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 = [] |
|||
# 30 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(30 * size): |
|||
pohlavi_idx = rnd.randint(0, 2) # 2 = nebinární |
|||
osloveni = [Osoba.OSLOVENI_MUZSKE, Osoba.OSLOVENI_ZENSKE, Osoba.OSLOVENI_ZADNE][pohlavi_idx] |
|||
jmeno = rnd.choice([jmena_m, jmena_f, jmena_m + jmena_f][pohlavi_idx]) |
|||
prijmeni = rnd.choice([prijmeni_m, prijmeni_f, prijmeni_m + prijmeni_f][pohlavi_idx]) |
|||
if pohlavi_idx == 2: logger.debug(f'Testdata: nebinární osoba: {jmeno} {prijmeni}.') |
|||
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, jmena_m + jmena_f][pohlavi_idx]) |
|||
prijmeni = rnd.choice([prijmeni_m, prijmeni_f, prijmeni_m + prijmeni_f][pohlavi_idx]) |
|||
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() |
|||
prezdivka = rnd.choice(prezdivky) |
|||
email = "@".join([unidecode.unidecode(jmeno), rnd.choice(domain)]) |
|||
telefon = "".join([str(rnd.choice([k for k in range(10)])) for _ in range(9)]) |
|||
narozeni = datetime.date( |
|||
rnd.randint(1980, datetime.datetime.now().year), |
|||
rnd.randint(1, 12), |
|||
rnd.randint(1, 28) |
|||
) |
|||
ulic = rnd.choice(seznam_ulic) |
|||
cp = rnd.randint(1, 99) |
|||
ulice = " ".join([ulic, str(cp)]) |
|||
mesto = rnd.choice(seznam_mest) |
|||
psc = "".join([str(rnd.choice([k for k in range(10)])) for _ in range(5)]) |
|||
|
|||
osoby.append(Osoba.objects.create( |
|||
jmeno=jmeno, prijmeni=prijmeni, |
|||
prezdivka=prezdivka, osloveni=osloveni, |
|||
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) |
|||
) |
|||
)) |
|||
|
|||
# TODO pridat foto male a velke. Jak? |
|||
# Pavel tvrdí, že to necháme a přidáme až do adminu |
|||
|
|||
return osoby |
|||
|
|||
|
|||
def gen_skoly(): # TODO někdy to přepsat, aby jich bylo více |
|||
logger.info('Generuji školy...') |
|||
|
|||
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, |
|||
)) |
|||
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, |
|||
) |
|||
skoly.append(zlinska) |
|||
return skoly |
|||
|
|||
|
|||
def gen_resitele(rnd, osoby, skoly): |
|||
logger.info('Generuji řešitele...') |
|||
|
|||
resitele = [] |
|||
x = 0 |
|||
resitel_perm = Permission.objects.filter(codename__exact='resitel').first() |
|||
resitel_group = Group.objects.filter(name__exact='resitel').first() |
|||
for os in osoby: |
|||
rand = rnd.randint(0, 8) |
|||
if not (rand % 8 == 0): |
|||
if not os.user: |
|||
if x: |
|||
user = User.objects.create_user( |
|||
username='r'+str(x), email=os.email, password='r', |
|||
) |
|||
else: |
|||
user = User.objects.create_user( |
|||
username='r', email=os.email, password='r', |
|||
) |
|||
x += 1 |
|||
os.user = user |
|||
os.save() |
|||
os.user.user_permissions.add(resitel_perm) |
|||
os.user.groups.add(resitel_group) |
|||
resitele.append(Resitel.objects.create( |
|||
osoba=os, skola=rnd.choice(skoly), |
|||
rok_maturity=os.datum_narozeni.year + rnd.randint(18, 21), |
|||
zasilat=rnd.choice(Resitel.ZASILAT_CHOICES)[0], |
|||
)) |
|||
return resitele |
|||
|
|||
|
|||
def gen_prijemci(rnd, osoby, kolik=10): |
|||
logger.info('Generuji příjemce (kolik={})...'.format(kolik)) |
|||
prijemci = [] |
|||
for i in rnd.sample(osoby, kolik): |
|||
prijemci.append(Prijemce.objects.create(osoba=i)) |
|||
|
|||
global zlinska |
|||
if zlinska is not None: |
|||
zlinska.kontaktni_osoba=rnd.choice(osoby) |
|||
zlinska.save() |
|||
|
|||
return prijemci |
|||
|
|||
|
|||
def gen_organizatori(rnd, osoby, last_rocnik): |
|||
logger.info('Generuji organizátory...') |
|||
organizatori = [] |
|||
|
|||
|
|||
seznam_konicku = ["vařím", "jezdím na kole", "řeším diferenciální rovnice", "koukám z okna", "tancuji", "programuji", "jezdím vlakem", "nedělám nic"] |
|||
seznam_oboru = ["matematiku", "matematiku", "matematiku", "fyziku", "literaturu", "informatiku", "informatiku", "běhání dokolečka"] |
|||
|
|||
x = 0 |
|||
org_perm = Permission.objects.filter(codename__exact='org').first() |
|||
org_group = Group.objects.filter(name__exact='org').first() |
|||
for os in osoby: |
|||
rand = rnd.randint(0, 8) |
|||
if rand % 8 == 0: |
|||
pusobnost = rnd.randint(1, last_rocnik) |
|||
od = datetime.datetime( |
|||
year=1993 + pusobnost, |
|||
month=rnd.randint(1, 12), |
|||
day=rnd.randint(1, 28), |
|||
tzinfo=datetime.timezone.utc, |
|||
) |
|||
do = datetime.datetime( |
|||
year=od.year + rnd.randint(1, 6), |
|||
month=rnd.randint(1, 12), |
|||
day=rnd.randint(1, 28), |
|||
tzinfo=datetime.timezone.utc, |
|||
) |
|||
# aktualni organizatori jeste nemaji vyplnene organizuje_do |
|||
|
|||
# popis orga |
|||
konicek1 = rnd.choice(seznam_konicku) |
|||
konicek2 = rnd.choice(seznam_konicku) |
|||
obor = rnd.choice(seznam_oboru) |
|||
popis_orga = "Ve volném čase " + konicek1 + " a také " + konicek2 + ". Studuji " + obor + " a moc mě to baví." |
|||
|
|||
if do.year > datetime.datetime.now().year: |
|||
do = None |
|||
if not os.user: |
|||
if x: |
|||
user = User.objects.create_user( |
|||
username='o'+str(x), email=os.email, password='o', |
|||
) |
|||
else: |
|||
user = User.objects.create_user( |
|||
username='o', email=os.email, password='o', |
|||
) |
|||
x += 1 |
|||
os.user = user |
|||
os.save() |
|||
os.user.user_permissions.add(org_perm) |
|||
os.user.groups.add(org_group) |
|||
os.user.is_staff = True |
|||
os.user.save() |
|||
organizatori.append(Organizator.objects.create( |
|||
osoba=os, |
|||
organizuje_od=od, organizuje_do=do, |
|||
strucny_popis_organizatora=popis_orga, |
|||
)) |
|||
return organizatori |
@ -0,0 +1,135 @@ |
|||
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 seminar.models import Rocnik, Cislo, Nastaveni, Osoba, Organizator |
|||
|
|||
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]) |
Loading…
Reference in new issue