import reversion from django.db import models from django.utils import timezone from django.core.exceptions import ValidationError from mamweb.models.base import SeminarModelBase from .osoba import Osoba class _OrganizatorManager(models.Manager): def aktivni(self, datum=timezone.now()): return self.exclude( organizuje_do__isnull=False, organizuje_do__lt=datum ).order_by('osoba__jmeno') def neaktivni(self, datum=timezone.now()): return self.exclude( id__in=self.aktivni(datum) ).order_by('-organizuje_do') @reversion.register(ignore_duplicates=True) class Organizator(SeminarModelBase): objects = _OrganizatorManager() osoba = models.OneToOneField( Osoba, verbose_name='osoba', related_name='org', help_text='osobní údaje organizátora', null=False, blank=False, on_delete=models.PROTECT, ) vytvoreno = models.DateTimeField( 'Vytvořeno', default=timezone.now, blank=True, editable=False, ) # Ne, date to nebude: # SQLite: invalid literal for int() with base 10: b'17 23:00:00' organizuje_od = models.DateTimeField('Organizuje od', blank=True, null=True) organizuje_do = models.DateTimeField('Organizuje do', blank=True, null=True) studuje = models.CharField( 'Studium aj.', max_length=256, null=True, blank=True, help_text="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( 'Stručný popis organizátora', null=True, blank=True, ) skola = models.CharField( 'Škola, kterou studuje', max_length=256, null=True, blank=True, help_text="Škola, např. MFF, VŠCHT, VUT, ... prostě aby se nemuselo psát do studuje školu, ale jen obor, možnost zobrazit zvlášť", ) def clean(self): if ( self.organizuje_od and self.organizuje_do and (self.organizuje_od > self.organizuje_do) ): raise ValidationError( "Organizátor nemůže skončit s organizováním dříve než začal!" ) super().clean() def __str__(self): if self.osoba.prezdivka: return "{} '{}' {}".format( self.osoba.jmeno, self.osoba.prezdivka, self.osoba.prijmeni, ) else: return "{} {}".format(self.osoba.jmeno, self.osoba.prijmeni) class Meta: verbose_name = 'Organizátor' verbose_name_plural = 'Organizátoři' # Řadí aktivní orgy na začátek, pod tím v pořadí od nejstarších neaktivní orgy. # TODO: Chtěl bych spíš mít nejstarší orgy dole. # TODO: Zohledňovat přezdívky? # TODO: Sjednotit s tím, jak se řadí organizátoři v seznau orgů na webu ordering = ['-organizuje_do', 'osoba__jmeno', 'osoba__prijmeni']