Web M&M
https://mam.matfyz.cz
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.
236 lines
8.4 KiB
236 lines
8.4 KiB
5 months ago
|
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
|