mamweb/personalni/models/osoba.py

126 lines
3.6 KiB
Python

import reversion
from imagekit.models import ImageSpecField, ProcessedImageField
from imagekit.processors import ResizeToFit, Transpose
from django.db import models
from django.utils import timezone
from django.conf import settings
from django_countries.fields import CountryField
from mamweb.models.base import SeminarModelBase
@reversion.register(ignore_duplicates=True)
class Osoba(SeminarModelBase):
class Meta:
db_table = 'seminar_osoby'
verbose_name = 'Osoba'
verbose_name_plural = 'Osoby'
ordering = ['prijmeni', 'jmeno']
id = models.AutoField(primary_key=True)
jmeno = models.CharField('jméno', max_length=256)
prijmeni = models.CharField('příjmení', max_length=256)
prezdivka = models.CharField(
'přezdívka', blank=True, null=True, max_length=256
)
# User, pokud má na webu účet
user = models.OneToOneField(
settings.AUTH_USER_MODEL, blank=True, null=True,
verbose_name='uživatel', on_delete=models.DO_NOTHING,
)
# Pohlaví. Že ho neznáme se snad nestane (a ušetří to práci při programování)
pohlavi_muz = models.BooleanField('pohlaví (muž)', default=False)
email = models.EmailField('e-mail', max_length=256, blank=True, default='')
telefon = models.CharField('telefon', max_length=256, blank=True, default='')
datum_narozeni = models.DateField('datum narození', blank=True, null=True)
# NULL dokud nedali souhlas
datum_souhlasu_udaje = models.DateField(
'datum souhlasu (údaje)', blank=True, null=True,
help_text='Datum souhlasu se zpracováním osobních údajů',
)
# NULL dokud nedali souhlas
datum_souhlasu_zasilani = models.DateField(
'datum souhlasu (spam)', blank=True, null=True,
help_text='Datum souhlasu se zasíláním MFF materiálů',
)
# Alespoň odhad (rok či i měsíc)
datum_registrace = models.DateField(
'datum registrace do semináře', default=timezone.now,
)
# Ulice může být i jen číslo
ulice = models.CharField('ulice', max_length=256, blank=True, default='')
mesto = models.CharField('město', max_length=256, blank=True, default='')
psc = models.CharField('PSČ', max_length=32, blank=True, default='')
# ISO 3166-1 dvojznakovy kod zeme velkym pismem (CZ, SK)
# Ekvivalentní s CharField(max_length=2, default='CZ', ...)
stat = CountryField(
'stát', default='CZ',
help_text='ISO 3166-1 kód země velkými písmeny (CZ, SK, ...)',
)
jak_se_dozvedeli = models.TextField('Jak se dozvěděli', blank=True)
poznamka = models.TextField(
'neveřejná poznámka', blank=True,
help_text='Neveřejná poznámka k osobě (plain text)',
)
foto = ProcessedImageField(
verbose_name='Fotografie osoby',
upload_to='image_osoby/velke/%Y/', null=True, blank=True,
help_text='Vlož fotografii osoby o libovolné velikosti',
processors=[
Transpose(Transpose.AUTO),
ResizeToFit(500, 500, upscale=False),
],
options={'quality': 95}
)
foto_male = ImageSpecField(
source='foto',
processors=[ResizeToFit(200, 200, upscale=False)],
options={'quality': 95},
)
# má OneToOneField nejvýše s:
# Resitel
# Prijemce
# Organizator
def plne_jmeno(self):
return '{} {}'.format(self.jmeno, self.prijmeni)
def inicial_krestni(self):
jmena = self.jmeno.split()
return " ".join(['{}.'.format(jmeno[0]) for jmeno in jmena])
def __str__(self):
return self.plne_jmeno()
# Overridujeme save Osoby, aby když si změní e-mail, aby se projevil i v
# Userovi (a tak se dal poslat mail s resetem hesla)
def save(self, *args, **kwargs):
if self.user is not None:
u = self.user
# U svatého tučňáka, prosím ať tohle funguje.
# (Takhle se kódit asi nemá...)
u.email = self.email
u.save()
super().save()