Files
fet2020/fet2020/members/models.py

244 lines
6.4 KiB
Python

import logging
from django.conf import settings
from django.contrib.auth.models import User
from django.core.validators import ValidationError, validate_email
from django.db import models
from django.db.models import F
from django.urls import reverse
from django.utils.text import slugify
from easy_thumbnails.fields import ThumbnailerImageField
from .managers import (
ActiveJobMemberManager,
InactiveJobMemberManager,
JobMemberManager,
MemberManager,
)
from .validators import (
PhoneNumberValidator,
validate_domainonly_email,
validate_file_size,
validate_image_dimension,
)
logger = logging.getLogger(__name__)
class Member(models.Model):
firstname = models.CharField("Vorname", max_length=128)
surname = models.CharField("Nachname", max_length=128)
nickname = models.CharField("Spitzname", max_length=128)
# LDAP Username
username = models.CharField(max_length=128)
# fet mail account
mailaccount = models.CharField(
"Mailadresse",
unique=True,
max_length=128,
validators=[validate_email, validate_domainonly_email],
error_messages={
"unique": "Diese Mailadresse existiert schon.",
},
)
class MemberRole(models.TextChoices):
ACTIVE = "A", "Active"
PENSION = "P", "Pension"
role = models.CharField(
"Rolle",
max_length=1,
choices=MemberRole.choices,
default=MemberRole.ACTIVE,
)
description = models.TextField(null=True, blank=True)
image = ThumbnailerImageField(
upload_to="uploads/members/image/",
validators=[validate_file_size, validate_image_dimension],
)
birthday = models.DateField(null=True, blank=True)
phone = models.CharField(
max_length=17,
blank=True,
validators=[PhoneNumberValidator()],
)
address = models.TextField(null=True, blank=True)
date_modified = models.DateTimeField(auto_now=True)
date_created = models.DateTimeField(auto_now_add=True)
# Managers
objects = models.Manager()
all_members = MemberManager()
class Meta:
verbose_name = "Mitglied"
verbose_name_plural = "Mitglieder"
def __str__(self):
return self.firstname + " " + self.surname
# need to have 'View on site' link in admin app
def get_absolute_url(self):
return reverse("members:member", kwargs={"member_id": self.id})
def clean(self):
if not self.image:
raise ValidationError("Es fehlt das Profilbild.")
if self.username:
try:
user = User.objects.get(username=self.username.lower())
except User.DoesNotExist as e:
logger.info("Username does not exist. Error: {}".format(e))
else:
user.first_name = self.firstname
user.save()
def get_model_name(self):
return self._meta.model_name
@property
def image_url(self):
if self.image:
return self.image.url
# return default image
return settings.STATIC_URL + "img/FET-Logo-2014-quadrat.png"
@property
def avatar_url(self):
if self.image:
return self.image["avatar"].url
# return default image
return settings.STATIC_URL + "img/FET-Logo-2014-quadrat.png"
@property
def portrait_url(self):
if self.image:
return self.image["portrait"].url
# return default image
return settings.STATIC_URL + "img/FET-Logo-2014-quadrat.png"
@property
def thumb_url(self):
if self.image:
return self.image["thumb"].url
# return default image
return settings.STATIC_URL + "img/FET-Logo-2014-quadrat.png"
class JobGroup(models.Model):
name = models.CharField(max_length=128)
shortterm = models.CharField(max_length=128, unique=True, blank=True)
slug = models.SlugField(unique=True, null=True, blank=True)
description = models.TextField(null=True, blank=True)
# Managers
objects = models.Manager()
class Meta:
verbose_name = "Tätigkeitsbereich"
verbose_name_plural = "Tätigkeitsbereiche"
def __str__(self):
return self.name
# need to have 'View on site' link in admin app
def get_absolute_url(self):
return reverse("members:jobs", kwargs={"slug": self.slug})
def clean(self):
if not self.shortterm:
self.shortterm = slugify(self.name)
self.slug = slugify(self.shortterm)
class Job(models.Model):
name = models.CharField(max_length=128)
shortterm = models.CharField(max_length=128, unique=True, blank=True)
slug = models.SlugField(unique=True, null=True, blank=True)
order = models.PositiveSmallIntegerField(null=True, blank=True)
job_group = models.ForeignKey(
JobGroup,
on_delete=models.CASCADE,
verbose_name="Job Gruppe",
)
# Managers
objects = models.Manager()
class Meta:
ordering = (F("order").asc(nulls_last=True), "name")
verbose_name = "Tätigkeit"
verbose_name_plural = "Tätigkeiten"
def __str__(self):
return self.name
def get_absolute_url(self):
return (
reverse("members:jobs", kwargs={"slug": self.job_group.slug})
+ "#"
+ self.slug
)
def clean(self):
if not self.shortterm:
self.shortterm = slugify(self.name)
self.slug = slugify(self.shortterm)
class JobMember(models.Model):
member = models.ForeignKey(
Member,
on_delete=models.CASCADE,
verbose_name="Mitglied",
)
job = models.ForeignKey(
Job,
on_delete=models.CASCADE,
verbose_name="Tätigkeit",
)
job_start = models.DateField("Job Start")
job_end = models.DateField("Job Ende", null=True, blank=True)
class JobRole(models.TextChoices):
PRESIDENT = ("10", "Vorsitz")
VICE_PRESIDENT = ("20", "Stv. Vorsitz")
SECOND_VICE_PRESIDENT = ("30", "2. Stv. Vorsitz")
PERSON_RESPONSIBLE = ("40", "Verantwortliche_r")
MEMBER = ("50", "Mitglied")
SUBSTITUTE_MEMBER = ("60", "Ersatzmitglied")
job_role = models.CharField(
max_length=2, choices=JobRole.choices, default=JobRole.MEMBER
)
objects = models.Manager()
members = JobMemberManager()
active_member = ActiveJobMemberManager()
inactive_member = InactiveJobMemberManager()
def __str__(self):
return self.job.name