mamweb/personalni/models/organizator.py

91 lines
2.6 KiB
Python

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']