|
|
@ -45,67 +45,6 @@ class SeminarModelBase(models.Model): |
|
|
|
def verejne_url(self): |
|
|
|
return None |
|
|
|
|
|
|
|
# |
|
|
|
# Mělo by být částečně vytaženo z Aesopa |
|
|
|
# viz https://ovvp.mff.cuni.cz/wiki/aesop/export-skol. |
|
|
|
# |
|
|
|
|
|
|
|
@reversion.register(ignore_duplicates=True) |
|
|
|
@python_2_unicode_compatible |
|
|
|
class Skola(SeminarModelBase): |
|
|
|
|
|
|
|
class Meta: |
|
|
|
db_table = 'seminar_skoly' |
|
|
|
verbose_name = u'Škola' |
|
|
|
verbose_name_plural = u'Školy' |
|
|
|
ordering = ['mesto', 'nazev'] |
|
|
|
|
|
|
|
# Interní ID |
|
|
|
id = models.AutoField(primary_key = True) |
|
|
|
|
|
|
|
# Aesopi ID "izo:..." nebo "aesop:..." |
|
|
|
# NULL znamená v exportu do aesopa "ufo" |
|
|
|
aesop_id = models.CharField(u'Aesop ID', max_length=32, blank=True, default='', |
|
|
|
help_text=u'Aesopi ID typu "izo:..." nebo "aesop:..."') |
|
|
|
|
|
|
|
# IZO školy (jen české školy) |
|
|
|
izo = models.CharField(u'IZO', max_length=32, blank=True, |
|
|
|
help_text=u'IZO školy (jen české školy)') |
|
|
|
|
|
|
|
# Celý název školy |
|
|
|
nazev = models.CharField(u'název', max_length=256, |
|
|
|
help_text=u'Celý název školy') |
|
|
|
|
|
|
|
# Zkraceny nazev pro zobrazení ve výsledkovce, volitelné. |
|
|
|
# Není v Aesopovi, musíme vytvářet sami. |
|
|
|
kratky_nazev = models.CharField(u'zkrácený název', max_length=256, blank=True, |
|
|
|
help_text="Zkrácený název pro zobrazení ve výsledkovce") |
|
|
|
|
|
|
|
# Ulice může být jen číslo |
|
|
|
ulice = models.CharField(u'ulice', max_length=256) |
|
|
|
|
|
|
|
mesto = models.CharField(u'město', max_length=256) |
|
|
|
|
|
|
|
psc = models.CharField(u'PSČ', max_length=32) |
|
|
|
|
|
|
|
# ISO 3166-1 dvojznakovy kod zeme velkym pismem (CZ, SK) |
|
|
|
# Ekvivalentní s CharField(max_length=2, default='CZ', ...) |
|
|
|
stat = CountryField(u'stát', default='CZ', |
|
|
|
help_text=u'ISO 3166-1 kód země velkými písmeny (CZ, SK, ...)') |
|
|
|
|
|
|
|
# Jaké vzdělání škpla poskytuje? |
|
|
|
je_zs = models.BooleanField(u'základní stupeň', default=True) |
|
|
|
je_ss = models.BooleanField(u'střední stupeň', default=True) |
|
|
|
|
|
|
|
poznamka = models.TextField(u'neveřejná poznámka', blank=True, |
|
|
|
help_text=u'Neveřejná poznámka ke škole (plain text)') |
|
|
|
|
|
|
|
kontaktni_osoba = models.ForeignKey(Osoba, verbose_name=u'Kontaktní osoba', |
|
|
|
blank=True, null=True) |
|
|
|
|
|
|
|
def __str__(self): |
|
|
|
return force_unicode(u'%s, %s, %s' % (self.nazev, self.ulice, self.mesto)) |
|
|
|
|
|
|
|
@reversion.register(ignore_duplicates=True) |
|
|
|
@python_2_unicode_compatible |
|
|
|
class Osoba(SeminarModelBase): |
|
|
@ -185,6 +124,68 @@ class Osoba(SeminarModelBase): |
|
|
|
def __str__(self): |
|
|
|
return force_unicode("Osoba({})".format(self.plne_jmeno())) |
|
|
|
|
|
|
|
# |
|
|
|
# Mělo by být částečně vytaženo z Aesopa |
|
|
|
# viz https://ovvp.mff.cuni.cz/wiki/aesop/export-skol. |
|
|
|
# |
|
|
|
|
|
|
|
@reversion.register(ignore_duplicates=True) |
|
|
|
@python_2_unicode_compatible |
|
|
|
class Skola(SeminarModelBase): |
|
|
|
|
|
|
|
class Meta: |
|
|
|
db_table = 'seminar_skoly' |
|
|
|
verbose_name = u'Škola' |
|
|
|
verbose_name_plural = u'Školy' |
|
|
|
ordering = ['mesto', 'nazev'] |
|
|
|
|
|
|
|
# Interní ID |
|
|
|
id = models.AutoField(primary_key = True) |
|
|
|
|
|
|
|
# Aesopi ID "izo:..." nebo "aesop:..." |
|
|
|
# NULL znamená v exportu do aesopa "ufo" |
|
|
|
aesop_id = models.CharField(u'Aesop ID', max_length=32, blank=True, default='', |
|
|
|
help_text=u'Aesopi ID typu "izo:..." nebo "aesop:..."') |
|
|
|
|
|
|
|
# IZO školy (jen české školy) |
|
|
|
izo = models.CharField(u'IZO', max_length=32, blank=True, |
|
|
|
help_text=u'IZO školy (jen české školy)') |
|
|
|
|
|
|
|
# Celý název školy |
|
|
|
nazev = models.CharField(u'název', max_length=256, |
|
|
|
help_text=u'Celý název školy') |
|
|
|
|
|
|
|
# Zkraceny nazev pro zobrazení ve výsledkovce, volitelné. |
|
|
|
# Není v Aesopovi, musíme vytvářet sami. |
|
|
|
kratky_nazev = models.CharField(u'zkrácený název', max_length=256, blank=True, |
|
|
|
help_text="Zkrácený název pro zobrazení ve výsledkovce") |
|
|
|
|
|
|
|
# Ulice může být jen číslo |
|
|
|
ulice = models.CharField(u'ulice', max_length=256) |
|
|
|
|
|
|
|
mesto = models.CharField(u'město', max_length=256) |
|
|
|
|
|
|
|
psc = models.CharField(u'PSČ', max_length=32) |
|
|
|
|
|
|
|
# ISO 3166-1 dvojznakovy kod zeme velkym pismem (CZ, SK) |
|
|
|
# Ekvivalentní s CharField(max_length=2, default='CZ', ...) |
|
|
|
stat = CountryField(u'stát', default='CZ', |
|
|
|
help_text=u'ISO 3166-1 kód země velkými písmeny (CZ, SK, ...)') |
|
|
|
|
|
|
|
# Jaké vzdělání škpla poskytuje? |
|
|
|
je_zs = models.BooleanField(u'základní stupeň', default=True) |
|
|
|
je_ss = models.BooleanField(u'střední stupeň', default=True) |
|
|
|
|
|
|
|
poznamka = models.TextField(u'neveřejná poznámka', blank=True, |
|
|
|
help_text=u'Neveřejná poznámka ke škole (plain text)') |
|
|
|
|
|
|
|
kontaktni_osoba = models.ForeignKey(Osoba, verbose_name=u'Kontaktní osoba', |
|
|
|
blank=True, null=True) |
|
|
|
|
|
|
|
def __str__(self): |
|
|
|
return force_unicode(u'%s, %s, %s' % (self.nazev, self.ulice, self.mesto)) |
|
|
|
|
|
|
|
|
|
|
|
class Prijemce(SeminarModelBase): |
|
|
|
class Meta: |
|
|
|
db_table = 'seminar_prijemce' |
|
|
@ -289,6 +290,8 @@ class Resitel(SeminarModelBase): |
|
|
|
return 'Prof.' |
|
|
|
else: |
|
|
|
return 'Akad.' |
|
|
|
def __str__(): |
|
|
|
return(force_unicode(u"Řešitel ({})".format(self.osoba.plne_jmeno()))) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -448,6 +451,63 @@ class Cislo(SeminarModelBase): |
|
|
|
return None |
|
|
|
return c |
|
|
|
|
|
|
|
@reversion.register(ignore_duplicates=True) |
|
|
|
@python_2_unicode_compatible |
|
|
|
class Organizator(SeminarModelBase): |
|
|
|
# zmena dedicnosti z models.Model na SeminarModelBase, potencialni vznik bugu |
|
|
|
|
|
|
|
osoba = models.ForeignKey(Osoba, verbose_name=u'osoba', related_name='org', |
|
|
|
help_text=u'osobní údaje organizátora', null=False, blank=False) |
|
|
|
|
|
|
|
vytvoreno = models.DateTimeField( |
|
|
|
u'Vytvořeno', |
|
|
|
default=timezone.now, |
|
|
|
blank=True, |
|
|
|
editable=False |
|
|
|
) |
|
|
|
|
|
|
|
organizuje_od = models.DateTimeField('Organizuje od', blank=False, null=False) |
|
|
|
|
|
|
|
organizuje_do = models.DateTimeField('Organizuje do', blank=True, null=True) |
|
|
|
|
|
|
|
studuje = models.CharField('Studium aj.', max_length = 256, |
|
|
|
null = True, blank = True, |
|
|
|
help_text=u"Např. 'Studuje Obecnou fyziku (Bc.), 3. ročník', " |
|
|
|
u"'Vystudovala Diskrétní modely a algoritmy (Mgr.)' nebo " |
|
|
|
u"'Přednáší na MFF'") |
|
|
|
|
|
|
|
strucny_popis_organizatora = models.TextField(u'Stručný popis organizátora', |
|
|
|
null = True, blank = True) |
|
|
|
|
|
|
|
skola = models.CharField(u'Škola, kterou studuje', max_length = 256, null=True, blank=True, |
|
|
|
help_text=u"Škola, např. MFF, VŠCHT, VUT, ... prostě aby se nemuselo psát do studuje" |
|
|
|
u"školu, ale jen obor, možnost zobrazit zvlášť") |
|
|
|
|
|
|
|
def __str__(self): |
|
|
|
if self.osoba.prezdivka: |
|
|
|
return u"%s '%s' %s".format(self.osoba.jmeno, |
|
|
|
self.osoba.prezdivka, |
|
|
|
self.osoba.prijmeni) |
|
|
|
else: |
|
|
|
return u"%s %s".format(self.osoba.jmeno, self.osoba.prijmeni) |
|
|
|
|
|
|
|
class Meta: |
|
|
|
verbose_name = 'Organizátor' |
|
|
|
verbose_name_plural = 'Organizátoři' |
|
|
|
|
|
|
|
class Text(SeminarModelBase): |
|
|
|
class Meta: |
|
|
|
db_table = 'seminar_texty' |
|
|
|
verbose_name = u'text' |
|
|
|
verbose_name_plural = u'texty' |
|
|
|
|
|
|
|
na_web = models.TextField(u'text na web', blank=True, |
|
|
|
help_text=u'Text ke zveřejnění na webu') |
|
|
|
|
|
|
|
do_cisla = models.TextField(u'text do čísla', blank=True, |
|
|
|
help_text=u'Text ke zveřejnění v čísle') |
|
|
|
|
|
|
|
# obrázky mají návaznost opačným směrem (vazba z druhé strany) |
|
|
|
|
|
|
|
@reversion.register(ignore_duplicates=True) |
|
|
|
@python_2_unicode_compatible |
|
|
@ -466,7 +526,7 @@ class Problem(SeminarModelBase): |
|
|
|
nazev = models.CharField(u'název', max_length=256) |
|
|
|
|
|
|
|
# Problém má podproblémy |
|
|
|
nadproblem = models.ForeignKey(Problem, verbose_name=u'nadřazený problém', |
|
|
|
nadproblem = models.ForeignKey('self', verbose_name=u'nadřazený problém', |
|
|
|
related_name='nadproblem', null=True, blank=True) |
|
|
|
|
|
|
|
STAV_NAVRH = 'navrh' |
|
|
@ -621,7 +681,7 @@ class Reseni(SeminarModelBase): |
|
|
|
# Interní ID |
|
|
|
id = models.AutoField(primary_key = True) |
|
|
|
|
|
|
|
# Ke každé dvojici řešní a problém existuje nanejvýš jedno hodnocení, doplnění vazby. |
|
|
|
# Ke každé dvojici řešení a problém existuje nanejvýš jedno hodnocení, doplnění vazby. |
|
|
|
problem = models.ManyToManyField(Problem, verbose_name=u'problém', help_text=u'Problém', |
|
|
|
through='Hodnoceni') |
|
|
|
|
|
|
@ -670,7 +730,7 @@ class Hodnoceni(SeminarModelBase): |
|
|
|
class Meta: |
|
|
|
db_table = 'seminar_hodnoceni' |
|
|
|
verbose_name = u'Hodnocení' |
|
|
|
verbose_name_plular = u'Hodnocení' |
|
|
|
verbose_name_plural = u'Hodnocení' |
|
|
|
|
|
|
|
# Interní ID |
|
|
|
id = models.AutoField(primary_key = True) |
|
|
@ -705,21 +765,17 @@ class Hodnoceni(SeminarModelBase): |
|
|
|
# neprojdou pak migrace. Takže rozlišení funkcí generujících názvy souboru |
|
|
|
# podle adresáře řešíme takto. |
|
|
|
|
|
|
|
## |
|
|
|
## FIXME: Budeme řešit později, pokud to bude potřeba. |
|
|
|
#def generate_filename_konfera(self, filename): |
|
|
|
# return os.path.join( |
|
|
|
# settings.SEMINAR_KONFERY_DIR, |
|
|
|
# aux_generate_filename(self, filename) |
|
|
|
# ) |
|
|
|
def generate_filename_konfera(self, filename): |
|
|
|
return os.path.join( |
|
|
|
settings.SEMINAR_KONFERY_DIR, |
|
|
|
aux_generate_filename(self, filename) |
|
|
|
) |
|
|
|
|
|
|
|
## |
|
|
|
## FIXME: Budeme řešit později, pokud to bude potřeba. |
|
|
|
#def generate_filename(self, filename): |
|
|
|
# return os.path.join( |
|
|
|
# settings.SEMINAR_RESENI_DIR, |
|
|
|
# aux_generate_filename(self, filename) |
|
|
|
# ) |
|
|
|
def generate_filename(self, filename): |
|
|
|
return os.path.join( |
|
|
|
settings.SEMINAR_RESENI_DIR, |
|
|
|
aux_generate_filename(self, filename) |
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
@reversion.register(ignore_duplicates=True) |
|
|
@ -793,49 +849,6 @@ class Pohadka(SeminarModelBase): |
|
|
|
return force_unicode(uryvek) |
|
|
|
|
|
|
|
|
|
|
|
@reversion.register(ignore_duplicates=True) |
|
|
|
@python_2_unicode_compatible |
|
|
|
class Organizator(SeminarModelBase): |
|
|
|
# zmena dedicnosti z models.Model na SeminarModelBase, potencialni vznik bugu |
|
|
|
|
|
|
|
osoba = models.ForeignKey(Osoba, verbose_name=u'osoba', related_name='org' |
|
|
|
help_text=u'osobní údaje organizátora', null=False, blank=False) |
|
|
|
|
|
|
|
vytvoreno = models.DateTimeField( |
|
|
|
u'Vytvořeno', |
|
|
|
default=timezone.now, |
|
|
|
blank=True, |
|
|
|
editable=False |
|
|
|
) |
|
|
|
|
|
|
|
organizuje_od = models.DateTimeField('Organizuje od', blank=False, null=False) |
|
|
|
|
|
|
|
organizuje_do = models.DateTimeField('Organizuje do', blank=True, null=True) |
|
|
|
|
|
|
|
studuje = models.CharField('Studium aj.', max_length = 256, |
|
|
|
null = True, blank = True, |
|
|
|
help_text=u"Např. 'Studuje Obecnou fyziku (Bc.), 3. ročník', " |
|
|
|
"'Vystudovala Diskrétní modely a algoritmy (Mgr.)' nebo " |
|
|
|
"'Přednáší na MFF'") |
|
|
|
|
|
|
|
strucny_popis_organizatora = models.TextField(u'Stručný popis organizátora', |
|
|
|
null = True, blank = True) |
|
|
|
|
|
|
|
skola = models.CharField(u'Škola, kterou studuje', max_length = 256, null=True, blank=True, |
|
|
|
help_text=u"Škola, např. MFF, VŠCHT, VUT, ... prostě aby se nemuselo psát do studuje" |
|
|
|
"školu, ale jen obor, možnost zobrazit zvlášť") |
|
|
|
|
|
|
|
def __str__(self): |
|
|
|
if self.osoba.prezdivka: |
|
|
|
return u"%s '%s' %s".format(self.osoba.jmeno, |
|
|
|
self.osoba.prezdivka, |
|
|
|
self.osoba.prijmeni) |
|
|
|
else: |
|
|
|
return u"%s %s".format(self.osoba.jmeno, self.osoba.prijmeni) |
|
|
|
|
|
|
|
class Meta: |
|
|
|
verbose_name = 'Organizátor' |
|
|
|
verbose_name_plural = 'Organizátoři' |
|
|
|
|
|
|
|
|
|
|
|
@reversion.register(ignore_duplicates=True) |
|
|
@ -1042,8 +1055,9 @@ class Obrazek(SeminarModelBase): |
|
|
|
na_web = models.ImageField(u'obrázek na web', upload_to='obrazky/%Y/%m/%d/', |
|
|
|
null=True, blank=True) |
|
|
|
|
|
|
|
text = models.ForeignKey(Text, verbose_name='text', help_text=u'text, ve kterém |
|
|
|
se obrázek vyskytuje', null=False, blank=False) |
|
|
|
text = models.ForeignKey(Text, verbose_name='text', |
|
|
|
help_text=u'text, ve kterém se obrázek vyskytuje', |
|
|
|
null=False, blank=False) |
|
|
|
|
|
|
|
do_cisla_barevny = models.FileField(u'barevný obrázek do čísla', |
|
|
|
help_text = u'Barevná verze obrázku do čísla', |
|
|
@ -1053,19 +1067,6 @@ class Obrazek(SeminarModelBase): |
|
|
|
help_text = u'Černobílá verze obrázku do čísla', |
|
|
|
upload_to = 'obrazky/%Y/%m/%d/', blank=True, null=True) |
|
|
|
|
|
|
|
class Text(SeminarModelBase): |
|
|
|
class Meta: |
|
|
|
db_table = 'seminar_texty' |
|
|
|
verbose_name = u'text' |
|
|
|
verbose_name_plular = u'texty' |
|
|
|
|
|
|
|
na_web = models.TextField(u'text na web', blank=True, |
|
|
|
help_text=u'Text ke zveřejnění na webu') |
|
|
|
|
|
|
|
do_cisla = models.TextField(u'text do čísla', blank=True, |
|
|
|
help_text=u'Text ke zveřejnění v čísle') |
|
|
|
|
|
|
|
# obrázky mají návaznost opačným směrem (vazba z druhé strany) |
|
|
|
class TreeNode(models.Model): |
|
|
|
class Meta: |
|
|
|
abstract = True |
|
|
@ -1073,6 +1074,7 @@ class TreeNode(models.Model): |
|
|
|
null = True, |
|
|
|
blank = False, |
|
|
|
on_delete = models.SET_NULL, # Vrcholy s null kořenem jsou sirotci bez ročníku |
|
|
|
verbose_name="kořen stromu") |
|
|
|
first_child = models.ForeignKey('self', |
|
|
|
null = True, |
|
|
|
blank = True, |
|
|
|