Files
fet2020/fet2020/members/models.py
2021-01-15 15:42:30 +00:00

249 lines
7.1 KiB
Python

from django.core.validators import RegexValidator, ValidationError
from django.db import models
from django.db.models import Q
from django.utils import timezone
from django.utils.text import slugify
from django.utils.translation import gettext_lazy as _
from datetime import timedelta
from easy_thumbnails.fields import ThumbnailerImageField
class ActiveJobMemberManager(models.Manager):
"""
return a list of active member, and members who are still working
"""
def get_all_by_slug(self, slug):
return (
self.get_queryset()
.filter(job__job_group__slug=slug)
.order_by("job__slug", "job_role", "member__firstname")
)
def get_queryset(self):
date_today = timezone.now().date()
qs = super().get_queryset().order_by("member__firstname")
return qs.filter(
Q(member__role=Member.MemberRole.ACTIVE)
& (Q(job_end__gt=date_today) | Q(job_end__isnull=True))
)
class InactiveJobMemberManager(models.Manager):
"""
return a list of inactive member
"""
def get_all_by_slug(self, slug):
return (
self.get_queryset()
.filter(job__job_group__slug=slug)
.order_by("job__slug", "job_role", "member__firstname")
)
def get_queryset(self):
date_today = timezone.now().date()
qs = super().get_queryset().order_by("member__firstname")
return qs.filter(
Q(member__role=Member.MemberRole.PENSION)
| (Q(job_end__lt=date_today + timedelta(days=1)) & Q(job_end__isnull=False))
)
class JobMemberManager(models.Manager):
def get_members(self, role):
qs = self.get_queryset().order_by("member__firstname")
return qs.filter(Q(member__role=role))
class JobGroupManager(models.Manager):
def get_active_jobgroup(self):
job_groups = list(self.get_queryset())
# delete job groups which don't have active members
for elem in job_groups:
if not JobMember.active_member.get_all_by_slug(slug=elem.slug):
job_groups.remove(elem)
return job_groups
def get_pinned_active_jobgroups(self):
job_groups = []
for elem in self.get_active_jobgroup():
if elem.is_pinned:
job_groups.append(elem)
return job_groups
def get_unpinned_active_jobgroups(self):
job_groups = []
for elem in self.get_active_jobgroup():
if not elem.is_pinned:
job_groups.append(elem)
return job_groups
class MemberManager(models.Manager):
def get_queryset(self):
return super().get_queryset().order_by("firstname")
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)
username = models.CharField("Benutzername", blank=True, max_length=128)
mailaccount = models.CharField("Mailadresse", unique=True, max_length=128)
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/")
birthday = models.DateField(null=True, blank=True)
phone_error_msg = _(
(
"Phone number must be entered in the format: +999999999'. Up to 15 digits allowed."
)
)
phone_regex = RegexValidator(regex=r"^\+?1?\d{9,15}$", message=phone_error_msg)
phone = models.CharField(validators=[phone_regex], max_length=17, blank=True)
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 clean(self):
if not self.image:
raise ValidationError(_("Es fehlt das Profilbild."))
if self.image.height < 150 or self.image.width < 150:
raise ValidationError(
_("Das Bild ist zu klein. (Höhe: {}, Breite: {})").format(
self.image.height, self.image.width
)
)
if not "@fet.at" in self.mailaccount:
raise ValidationError(_("In der Mailadresse fehlt die Domäne."))
def __str__(self):
return self.firstname + " " + self.surname
class JobGroup(models.Model):
name = models.CharField(max_length=128)
shortterm = models.CharField(max_length=128)
slug = models.SlugField(unique=True, null=True, blank=True)
description = models.TextField(null=True, blank=True)
is_pinned = models.BooleanField(verbose_name="ANGEHEFTET", default=False)
# Managers
objects = models.Manager()
all_jobgroups = JobGroupManager()
class Meta:
verbose_name = "Tätigkeitsbereich"
verbose_name_plural = "Tätigkeitsbereiche"
def __str__(self):
return self.name
def save(self, *args, **kwargs):
if not self.slug:
self.slug = self.shortterm
super().save(*args, **kwargs)
class Job(models.Model):
name = models.CharField(max_length=128)
shortterm = models.CharField(max_length=128)
slug = models.SlugField(unique=True, null=True, blank=True)
job_group = models.ForeignKey(
JobGroup,
on_delete=models.CASCADE,
verbose_name="Job Gruppe",
)
# Managers
objects = models.Manager()
class Meta:
verbose_name = "Tätigkeit"
verbose_name_plural = "Tätigkeiten"
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.shortterm)
# if type(self.job_group) = str:
# self.job_group=JobGroup.objects.filter(slug=self.job)
super().save(*args, **kwargs)
def __str__(self):
return 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", _("VorsitzendeR"))
VICE_PRESIDENT = ("20", _("stv VorsitzendeR"))
SECOND_VICE_PRESIDENT = ("30", _("2. stv VorsitzendeR"))
PERSON_RESPONSIBLE = ("40", _("VerantwortlicheR"))
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()