95 lines
2.4 KiB
Python
95 lines
2.4 KiB
Python
from reversion import revisions as reversion
|
|
|
|
from django.db import models
|
|
from django.urls import reverse
|
|
from django.core.cache import cache
|
|
from django.core.exceptions import ObjectDoesNotExist
|
|
|
|
from seminar.utils import roman
|
|
from mamweb.models.base import SeminarModelBase
|
|
|
|
|
|
@reversion.register(ignore_duplicates=True)
|
|
class Rocnik(SeminarModelBase):
|
|
|
|
class Meta:
|
|
db_table = 'seminar_rocniky'
|
|
verbose_name = 'Ročník'
|
|
verbose_name_plural = 'Ročníky'
|
|
ordering = ['-rocnik']
|
|
|
|
# Interní ID
|
|
id = models.AutoField(primary_key=True)
|
|
|
|
prvni_rok = models.IntegerField('první rok', db_index=True, unique=True)
|
|
|
|
rocnik = models.IntegerField('číslo ročníku', db_index=True, unique=True)
|
|
|
|
exportovat = models.BooleanField(
|
|
'export do AESOPa', db_column='exportovat', default=False,
|
|
help_text='Exportuje se jen podle tohoto flagu (ne veřejnosti), a to jen čísla s veřejnou výsledkovkou',
|
|
)
|
|
|
|
# má OneToOneField s:
|
|
# RocnikNode
|
|
|
|
def __str__(self):
|
|
return '{} ({}/{})'.format(self.rocnik, self.prvni_rok, self.prvni_rok+1)
|
|
|
|
# Ročník v římských číslech
|
|
def roman(self):
|
|
return roman(int(self.rocnik))
|
|
|
|
def verejne(self):
|
|
return len(self.verejna_cisla()) > 0
|
|
verejne.boolean = True
|
|
verejne.short_description = 'Veřejný (jen dle čísel)'
|
|
|
|
def neverejna_cisla(self):
|
|
vc = [c for c in self.cisla.all() if not c.verejne()]
|
|
vc.sort(key=lambda c: c.poradi)
|
|
return vc
|
|
|
|
def verejna_cisla(self):
|
|
vc = [c for c in self.cisla.all() if c.verejne()]
|
|
vc.sort(key=lambda c: c.poradi)
|
|
return vc
|
|
|
|
def posledni_verejne_cislo(self):
|
|
vc = self.verejna_cisla()
|
|
return vc[-1] if vc else None
|
|
|
|
def verejne_vysledkovky_cisla(self):
|
|
vc = list(
|
|
self.cisla.filter(deadline_v_cisle__verejna_vysledkovka=True).distinct()
|
|
)
|
|
vc.sort(key=lambda c: c.poradi)
|
|
return vc
|
|
|
|
def posledni_zverejnena_vysledkovka_cislo(self):
|
|
vc = self.verejne_vysledkovky_cisla()
|
|
return vc[-1] if vc else None
|
|
|
|
def druhy_rok(self):
|
|
return self.prvni_rok + 1
|
|
|
|
def verejne_url(self):
|
|
return reverse('seminar_rocnik', kwargs={'rocnik': self.rocnik})
|
|
|
|
@classmethod
|
|
def cached_rocnik(cls, r_id):
|
|
name = 'rocnik_%s' % (r_id, )
|
|
c = cache.get(name)
|
|
if c is None:
|
|
c = cls.objects.get(id=r_id)
|
|
cache.set(name, c, 300)
|
|
return c
|
|
|
|
def save(self, *args, **kwargs):
|
|
super().save(*args, **kwargs)
|
|
# *Node.save() aktualizuje název *Nodu.
|
|
try:
|
|
self.rocniknode.save()
|
|
except ObjectDoesNotExist:
|
|
# Neexistující *Node nemá smysl aktualizovat.
|
|
pass
|