|
|
@ -9,7 +9,7 @@ from django.conf import settings |
|
|
|
from django.utils.encoding import python_2_unicode_compatible |
|
|
|
from django.utils.encoding import force_text |
|
|
|
from django.utils.text import slugify |
|
|
|
from django.core.urlresolvers import reverse |
|
|
|
from django.urls import reverse |
|
|
|
from django.core.cache import cache |
|
|
|
from django.core.exceptions import ObjectDoesNotExist |
|
|
|
from django.utils.text import get_valid_filename |
|
|
@ -64,7 +64,7 @@ class Osoba(SeminarModelBase): |
|
|
|
|
|
|
|
# User, pokud má na webu účet |
|
|
|
user = models.OneToOneField(settings.AUTH_USER_MODEL, blank=True, null=True, |
|
|
|
verbose_name='uživatel') |
|
|
|
verbose_name='uživatel', on_delete=models.DO_NOTHING) |
|
|
|
|
|
|
|
# Pohlaví. Že ho neznáme se snad nestane (a ušetří to práci při programování) |
|
|
|
pohlavi_muz = models.BooleanField('pohlaví (muž)', default=False) |
|
|
@ -180,7 +180,7 @@ class Skola(SeminarModelBase): |
|
|
|
help_text='Neveřejná poznámka ke škole (plain text)') |
|
|
|
|
|
|
|
kontaktni_osoba = models.ForeignKey(Osoba, verbose_name='Kontaktní osoba', |
|
|
|
blank=True, null=True) |
|
|
|
blank=True, null=True, on_delete=models.SET_NULL) |
|
|
|
|
|
|
|
def __str__(self): |
|
|
|
return '{}, {}, {}'.format(self.nazev, self.ulice, self.mesto) |
|
|
@ -199,7 +199,8 @@ class Prijemce(SeminarModelBase): |
|
|
|
help_text='Neveřejná poznámka k příemci čísel (plain text)') |
|
|
|
|
|
|
|
osoba = models.OneToOneField(Osoba, verbose_name='komu', blank=False, null=False, |
|
|
|
help_text='Které osobě či na jakou adresu se mají zasílat čísla') |
|
|
|
help_text='Které osobě či na jakou adresu se mají zasílat čísla', |
|
|
|
on_delete=models.CASCADE) |
|
|
|
|
|
|
|
# FIXME: možná chceme něco jako vazbu na osobu XOR školu a počet kusů k zaslání |
|
|
|
# FIXME: a možná taky posílání na mail a možná taky přes něj chceme posílat i řešitelům |
|
|
@ -220,9 +221,12 @@ class Resitel(SeminarModelBase): |
|
|
|
# Interní ID |
|
|
|
id = models.AutoField(primary_key = True) |
|
|
|
|
|
|
|
osoba = models.OneToOneField(Osoba, blank=False, null=True, verbose_name='osoba') # FIXME opravit po prvni migraci |
|
|
|
osoba = models.OneToOneField(Osoba, blank=False, null=True, verbose_name='osoba', |
|
|
|
on_delete=models.SET_NULL) # FIXME opravit po prvni migraci |
|
|
|
|
|
|
|
skola = models.ForeignKey(Skola, blank=True, null=True, verbose_name='škola') |
|
|
|
|
|
|
|
skola = models.ForeignKey(Skola, blank=True, null=True, verbose_name='škola', |
|
|
|
on_delete=models.SET_NULL) |
|
|
|
|
|
|
|
# Očekávaný rok maturity a vyřazení z aktivních řešitelů |
|
|
|
rok_maturity = models.IntegerField('rok maturity', blank=True, null=True) |
|
|
@ -378,7 +382,8 @@ class Cislo(SeminarModelBase): |
|
|
|
# Interní ID |
|
|
|
id = models.AutoField(primary_key = True) |
|
|
|
|
|
|
|
rocnik = models.ForeignKey(Rocnik, verbose_name='ročník', related_name='cisla', db_index=True) |
|
|
|
rocnik = models.ForeignKey(Rocnik, verbose_name='ročník', related_name='cisla', |
|
|
|
db_index=True,on_delete=models.PROTECT) |
|
|
|
|
|
|
|
cislo = models.CharField('název čísla', max_length=32, db_index=True, |
|
|
|
help_text='Většinou jen "1", vyjímečně "7-8", lexikograficky určuje pořadí v ročníku!') |
|
|
@ -456,7 +461,8 @@ class Organizator(SeminarModelBase): |
|
|
|
# zmena dedicnosti z models.Model na SeminarModelBase, potencialni vznik bugu |
|
|
|
|
|
|
|
osoba = models.OneToOneField(Osoba, verbose_name='osoba', related_name='org', |
|
|
|
help_text='osobní údaje organizátora', null=True, blank=False) #FIXME opravit po migraci |
|
|
|
help_text='osobní údaje organizátora', null=True, blank=False, |
|
|
|
on_delete=models.SET_NULL) #FIXME opravit po migraci |
|
|
|
|
|
|
|
vytvoreno = models.DateTimeField( |
|
|
|
'Vytvořeno', |
|
|
@ -506,7 +512,8 @@ class Soustredeni(SeminarModelBase): |
|
|
|
# Interní ID |
|
|
|
id = models.AutoField(primary_key = True) |
|
|
|
|
|
|
|
rocnik = models.ForeignKey(Rocnik, verbose_name='ročník', related_name='soustredeni') |
|
|
|
rocnik = models.ForeignKey(Rocnik, verbose_name='ročník', related_name='soustredeni', |
|
|
|
on_delete=models.PROTECT) |
|
|
|
|
|
|
|
datum_zacatku = models.DateField('datum začátku', blank=True, null=True, |
|
|
|
help_text='První den soustředění') |
|
|
@ -575,7 +582,8 @@ class Problem(SeminarModelBase): |
|
|
|
|
|
|
|
# Problém má podproblémy |
|
|
|
nadproblem = models.ForeignKey('self', verbose_name='nadřazený problém', |
|
|
|
related_name='nadproblem_%(class)s', null=True, blank=True) |
|
|
|
related_name='nadproblem_%(class)s', null=True, blank=True, |
|
|
|
on_delete=models.SET_NULL) |
|
|
|
|
|
|
|
STAV_NAVRH = 'navrh' |
|
|
|
STAV_ZADANY = 'zadany' |
|
|
@ -596,10 +604,12 @@ class Problem(SeminarModelBase): |
|
|
|
help_text='Neveřejný návrh úlohy, návrh řešení, text zadání, poznámky ...') |
|
|
|
|
|
|
|
autor = models.ForeignKey(Organizator, verbose_name='autor problému', |
|
|
|
related_name='autor_problemu_%(class)s', null=True, blank=True) |
|
|
|
related_name='autor_problemu_%(class)s', null=True, blank=True, |
|
|
|
on_delete=models.SET_NULL) |
|
|
|
|
|
|
|
garant = models.ForeignKey(Organizator, verbose_name='garant zadaného problému', |
|
|
|
related_name='garant_problemu_%(class)s', null=True, blank=True) |
|
|
|
related_name='garant_problemu_%(class)s', null=True, blank=True, |
|
|
|
on_delete=models.SET_NULL) |
|
|
|
|
|
|
|
opravovatele = models.ManyToManyField(Organizator, verbose_name='opravovatelé', |
|
|
|
blank=True, related_name='opravovatele_%(class)s') |
|
|
@ -662,7 +672,8 @@ class Tema(Problem): |
|
|
|
tema_typ = models.CharField('Typ tématu', max_length=16, choices=TEMA_CHOICES, |
|
|
|
blank=False, default=TEMA_TEMA) |
|
|
|
|
|
|
|
rocnik = models.ForeignKey(Rocnik, verbose_name='ročník',blank=True, null=True) |
|
|
|
rocnik = models.ForeignKey(Rocnik, verbose_name='ročník',blank=True, null=True, |
|
|
|
on_delete=models.PROTECT) |
|
|
|
|
|
|
|
def kod_v_rocniku(self): |
|
|
|
if self.stav == 'zadany': |
|
|
@ -677,7 +688,8 @@ class Clanek(Problem): |
|
|
|
verbose_name = 'Článek' |
|
|
|
verbose_name_plural = 'Články' |
|
|
|
|
|
|
|
cislo = models.ForeignKey(Cislo, verbose_name='číslo', blank=True, null=True) |
|
|
|
cislo = models.ForeignKey(Cislo, verbose_name='číslo', blank=True, null=True, |
|
|
|
on_delete=models.PROTECT) |
|
|
|
def kod_v_rocniku(self): |
|
|
|
if self.stav == 'zadany': |
|
|
|
# Nemělo by být potřeba |
|
|
@ -708,14 +720,15 @@ class Uloha(Problem): |
|
|
|
verbose_name_plural = 'Úlohy' |
|
|
|
|
|
|
|
cislo_zadani = models.ForeignKey(Cislo, verbose_name='číslo zadání', blank=True, |
|
|
|
null=True, related_name='zadane_ulohy') |
|
|
|
null=True, related_name='zadane_ulohy', on_delete=models.PROTECT) |
|
|
|
|
|
|
|
cislo_deadline = models.ForeignKey(Cislo, verbose_name='číslo deadlinu', blank=True, |
|
|
|
null=True, related_name='deadlinove_ulohy') |
|
|
|
null=True, related_name='deadlinove_ulohy', on_delete=models.PROTECT) |
|
|
|
|
|
|
|
cislo_reseni = models.ForeignKey(Cislo, verbose_name='číslo řešení', blank=True, |
|
|
|
null=True, related_name='resene_ulohy', |
|
|
|
help_text='Číslo s řešením úlohy, jen pro úlohy') |
|
|
|
help_text='Číslo s řešením úlohy, jen pro úlohy', |
|
|
|
on_delete=models.PROTECT) |
|
|
|
|
|
|
|
max_body = models.DecimalField(max_digits=8, decimal_places=1, verbose_name='maximum bodů', |
|
|
|
blank=True, null=True) |
|
|
@ -765,7 +778,8 @@ class Reseni(SeminarModelBase): |
|
|
|
default=FORMA_EMAIL) |
|
|
|
|
|
|
|
text_cely = models.OneToOneField(Text, verbose_name='Plná verze textu řešení', |
|
|
|
blank=True, null=True, related_name="reseni_cely_set") |
|
|
|
blank=True, null=True, related_name="reseni_cely_set", |
|
|
|
on_delete=models.SET_NULL) |
|
|
|
|
|
|
|
text_zkraceny = models.ManyToManyField(Text, verbose_name='zkrácené verze řešení', |
|
|
|
help_text='Seznam úryvků z řešení',related_name="reseni_zkraceny_set") |
|
|
@ -801,11 +815,11 @@ class Hodnoceni(SeminarModelBase): |
|
|
|
blank=False, null=False) |
|
|
|
|
|
|
|
cislo_body = models.ForeignKey(Cislo, verbose_name='číslo pro body', |
|
|
|
related_name='hodnoceni', blank=False, null=False) |
|
|
|
related_name='hodnoceni', blank=False, null=False, on_delete=models.PROTECT) |
|
|
|
|
|
|
|
reseni = models.ForeignKey(Reseni, verbose_name='řešení') |
|
|
|
reseni = models.ForeignKey(Reseni, verbose_name='řešení', on_delete=models.CASCADE) |
|
|
|
|
|
|
|
problem = models.ForeignKey(Problem, verbose_name='problém') |
|
|
|
problem = models.ForeignKey(Problem, verbose_name='problém', on_delete=models.PROTECT) |
|
|
|
|
|
|
|
def __str__(self): |
|
|
|
return "{}, {}, {}".format(self.problem, self.reseni, self.body) |
|
|
@ -856,7 +870,8 @@ class PrilohaReseni(SeminarModelBase): |
|
|
|
# Interní ID |
|
|
|
id = models.AutoField(primary_key = True) |
|
|
|
|
|
|
|
reseni = models.ForeignKey(Reseni, verbose_name='řešení', related_name='prilohy') |
|
|
|
reseni = models.ForeignKey(Reseni, verbose_name='řešení', related_name='prilohy', |
|
|
|
on_delete=models.CASCADE) |
|
|
|
|
|
|
|
vytvoreno = models.DateTimeField('vytvořeno', default=timezone.now, blank=True, editable=False) |
|
|
|
|
|
|
@ -887,7 +902,8 @@ class Pohadka(SeminarModelBase): |
|
|
|
|
|
|
|
# Při nahrávání z TeXu není vyplnění vyžadováno, v adminu je |
|
|
|
null=True, |
|
|
|
blank=False |
|
|
|
blank=False, |
|
|
|
on_delete=models.SET_NULL |
|
|
|
) |
|
|
|
|
|
|
|
vytvoreno = models.DateTimeField( |
|
|
@ -915,9 +931,10 @@ class Soustredeni_Ucastnici(SeminarModelBase): |
|
|
|
# Interní ID |
|
|
|
id = models.AutoField(primary_key = True) |
|
|
|
|
|
|
|
resitel = models.ForeignKey(Resitel, verbose_name='řešitel') |
|
|
|
resitel = models.ForeignKey(Resitel, verbose_name='řešitel', on_delete=models.PROTECT) |
|
|
|
|
|
|
|
soustredeni = models.ForeignKey(Soustredeni, verbose_name='soustředění') |
|
|
|
soustredeni = models.ForeignKey(Soustredeni, verbose_name='soustředění', |
|
|
|
on_delete=models.PROTECT) |
|
|
|
|
|
|
|
poznamka = models.TextField('neveřejná poznámka', blank=True, |
|
|
|
help_text='Neveřejná poznámka k účasti (plain text)') |
|
|
@ -939,9 +956,11 @@ class Soustredeni_Organizatori(SeminarModelBase): |
|
|
|
# Interní ID |
|
|
|
id = models.AutoField(primary_key = True) |
|
|
|
|
|
|
|
organizator = models.ForeignKey(Organizator, verbose_name='organizátor') |
|
|
|
organizator = models.ForeignKey(Organizator, verbose_name='organizátor', |
|
|
|
on_delete=models.PROTECT) |
|
|
|
|
|
|
|
soustredeni = models.ForeignKey(Soustredeni, verbose_name='soustředění') |
|
|
|
soustredeni = models.ForeignKey(Soustredeni, verbose_name='soustředění', |
|
|
|
on_delete=models.PROTECT) |
|
|
|
|
|
|
|
poznamka = models.TextField('neveřejná poznámka', blank=True, |
|
|
|
help_text='Neveřejná poznámka k účasti organizátora (plain text)') |
|
|
@ -1018,9 +1037,9 @@ class Reseni_Resitele(models.Model): |
|
|
|
# Interní ID |
|
|
|
id = models.AutoField(primary_key = True) |
|
|
|
|
|
|
|
resitele = models.ForeignKey(Resitel, verbose_name='řešitel') |
|
|
|
resitele = models.ForeignKey(Resitel, verbose_name='řešitel', on_delete=models.PROTECT) |
|
|
|
|
|
|
|
reseni = models.ForeignKey(Reseni, verbose_name='řešení') |
|
|
|
reseni = models.ForeignKey(Reseni, verbose_name='řešení', on_delete=models.CASCADE) |
|
|
|
|
|
|
|
# podil - jakou merou se ktery resitel podilel na danem reseni |
|
|
|
# - pouziti v budoucnu, pokud by resitele nemeli dostat vsichni stejne bodu za spolecne reseni |
|
|
@ -1041,9 +1060,9 @@ class Konfery_Ucastnici(models.Model): |
|
|
|
# Interní ID |
|
|
|
id = models.AutoField(primary_key = True) |
|
|
|
|
|
|
|
resitel = models.ForeignKey(Resitel, verbose_name='řešitel') |
|
|
|
resitel = models.ForeignKey(Resitel, verbose_name='řešitel', on_delete=models.PROTECT) |
|
|
|
|
|
|
|
konfera = models.ForeignKey(Konfera, verbose_name='konfera') |
|
|
|
konfera = models.ForeignKey(Konfera, verbose_name='konfera', on_delete=models.CASCADE) |
|
|
|
|
|
|
|
poznamka = models.TextField('neveřejná poznámka', blank=True, |
|
|
|
help_text='Neveřejná poznámka k účasti (plain text)') |
|
|
@ -1065,7 +1084,8 @@ class Obrazek(SeminarModelBase): |
|
|
|
null=True, blank=True) |
|
|
|
|
|
|
|
text = models.ForeignKey(Text, verbose_name='text', |
|
|
|
help_text='text, ve kterém se obrázek vyskytuje', null=False, blank=False) |
|
|
|
help_text='text, ve kterém se obrázek vyskytuje', |
|
|
|
null=False, blank=False, on_delete=models.CASCADE) |
|
|
|
|
|
|
|
do_cisla_barevny = models.FileField('barevný obrázek do čísla', |
|
|
|
help_text = 'Barevná verze obrázku do čísla', |
|
|
@ -1284,10 +1304,11 @@ class Nastaveni(SingletonModel): |
|
|
|
db_table = 'seminar_nastaveni' |
|
|
|
verbose_name = 'Nastavení semináře' |
|
|
|
|
|
|
|
aktualni_rocnik = models.ForeignKey(Rocnik, verbose_name='aktuální ročník', null=False) |
|
|
|
aktualni_rocnik = models.ForeignKey(Rocnik, verbose_name='aktuální ročník', |
|
|
|
null=False, on_delete=models.PROTECT) |
|
|
|
|
|
|
|
aktualni_cislo = models.ForeignKey(Cislo, verbose_name='poslední vydané číslo', |
|
|
|
null=False) |
|
|
|
null=False, on_delete=models.PROTECT) |
|
|
|
|
|
|
|
def __str__(self): |
|
|
|
return 'Nastavení semináře' |
|
|
@ -1321,7 +1342,8 @@ class Novinky(models.Model): |
|
|
|
], |
|
|
|
options={'quality': 95}) |
|
|
|
|
|
|
|
autor = models.ForeignKey(Organizator, verbose_name='Autor novinky', null=True) |
|
|
|
autor = models.ForeignKey(Organizator, verbose_name='Autor novinky', null=True, |
|
|
|
on_delete=models.SET_NULL) |
|
|
|
|
|
|
|
zverejneno = models.BooleanField('Zveřejněno', default=False) |
|
|
|
|
|
|
|