166 lines
4.9 KiB
Python
166 lines
4.9 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 = (
|
|
("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")),
|
|
("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)
|