Files
web2.0-backend/kaehmy/models.py
T
2022-10-05 12:43:52 +03:00

168 lines
5.0 KiB
Python

from django.db import models
from django.utils import timezone
from django.utils.translation import ugettext_lazy as _
VERBOSE_NAME = _("Kaehmy")
class BaseRole(models.Model):
"""Base model for occupations/roles."""
id = models.AutoField(primary_key=True)
name = models.CharField(_("Name"), max_length=255)
is_board = models.BooleanField(_("Board member"))
CATEGORIES = (
("board", _("Board")),
("corporate", _("Corporate affairs")),
("freshman", _("Freshmen")),
("international", _("International")),
("external", _("External affairs")),
("media", _("Media")),
("tech", _("Technology")),
("wellbeing", _("Wellbeing")),
("elepaja", _("Elepaja")),
("ceremonies", _("Ceremonies")),
("studies", _("Studies")),
("sosso", _("Sössö magazine")),
("alumni", _("Alumni relations")),
("n", _("N")),
("others", _("Others")),
)
category = models.CharField(
_("Category"), choices=CATEGORIES, default="others", max_length=255
)
def __str__(self):
n = self.name.capitalize()
return "{} ({})".format(n, _("board member")) if self.is_board else n
class PresetRole(BaseRole):
"""Model for kaehmy role."""
description = models.TextField(_("Description"))
class Meta:
verbose_name = _("Preset kaehmy role")
verbose_name_plural = _("Preset kaehmy roles")
class CustomRole(BaseRole):
"""Model representing a user-specified custom occupation."""
class Meta:
verbose_name = _("Custom kaehmy role")
verbose_name_plural = _("Custom kaehmy roles")
class CommentParent(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(_("Name"), max_length=255, default="")
email = models.EmailField(_("Email"), default="")
timestamp = models.DateTimeField(_("Timestamp"), default=timezone.now)
def __str__(self):
return "Message parent #{}".format(self.id)
class Comment(CommentParent):
"""
Model representing a kaehmymessage.
Every message relates to certain kaehmyform or parent message.
"""
class Meta:
verbose_name = _("Kaehmykommentti")
verbose_name_plural = _("Kaehmykommentit")
message = models.TextField(_("Message"))
parent = models.ForeignKey(
"CommentParent", related_name="messages", on_delete=models.CASCADE
)
class Application(CommentParent):
"""
Model representing a form for kaehmy.
Allows user to choose from existing roles or to create custom ones.
"""
YEAR_CHOICES = (
(1, "1"),
(2, "2"),
(3, "3"),
(4, "4"),
(5, "N"),
)
class Meta:
verbose_name = _("Kaehmylomake")
verbose_name_plural = _("Kaehmylomakkeet")
phone_number = models.CharField(_("Phone number"), max_length=10, default="")
year = models.IntegerField(_("Year"), choices=YEAR_CHOICES)
text = models.TextField(_("Text"), default="", max_length=300)
custom_role_name = models.CharField(
_("Custom role name"), max_length=255, blank=True
)
custom_role_is_board = models.BooleanField(_("Board member"), blank=True)
custom_roles = models.ManyToManyField(
"kaehmy.CustomRole", related_name="forms", blank=True
)
preset_roles = models.ManyToManyField(
"kaehmy.PresetRole", related_name="forms", blank=True
)
def __str__(self):
"""Return model info."""
return _("Kaehmy application: {}").format(self.name)
def comment_count(self):
"""Count comments for kaehmy."""
total = 0
def recurse(message):
count = 0
for msg in message.messages.all():
count += recurse(msg)
return count + 1
for message in self.messages.all():
total += recurse(message)
return total
def board_roles(self):
presets = [r.name.capitalize() for r in self.preset_roles.filter(is_board=True)]
customs = [r.name.capitalize() for r in self.custom_roles.filter(is_board=True)]
combined = presets + customs
return _("Board: {}").format(", ".join(combined)) if len(combined) > 0 else ""
def official_roles(self):
presets = [
r.name.capitalize() for r in self.preset_roles.filter(is_board=False)
]
customs = [
r.name.capitalize() for r in self.custom_roles.filter(is_board=False)
]
combined = presets + customs
return (
_("Official: {}").format(", ".join(combined)) if len(combined) > 0 else ""
)
def all_roles(self):
presets = [r.name.capitalize() for r in self.preset_roles.all()]
customs = [r.name.capitalize() for r in self.custom_roles.all()]
combined = presets + customs
return ", ".join(combined) if len(combined) > 0 else ""
def has_any_board_role(self):
return self.preset_roles.filter(
is_board=True
).exists() or self.custom_roles.filter(is_board=True)