from django.db import models from django.utils import timezone from django.utils.translation import gettext_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)