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 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) 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