"""Webapp app models.""" from django.db import models from django.utils import timezone from datetime import timedelta from django.contrib.auth.models import User from webapp.utils import month_from_now from django.utils.translation import ugettext_lazy as _ from django.contrib.auth.models import User from auditlog.registry import auditlog from phonenumber_field.modelfields import PhoneNumberField from django.contrib.postgres.fields import JSONField import logging import webapp.models VERBOSE_NAME = _('Kaehmy') class PresetRole(webapp.models.PresetRole): """Model for kaehmy role.""" class Meta: verbose_name = _('Preset kaehmy role') verbose_name_plural = _('Preset kaehmy roles') class CustomRole(webapp.models.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): 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) # Telegram channel entry for Kaehmys class TelegramChannel(models.Model): """Model containing the channel id of a Telegram chat""" class Meta: verbose_name = _('Telegram channel') verbose_name_plural = _('Telegram channels') name = models.CharField(max_length=255) channel_id = models.CharField(max_length=255, unique=True) def __str__(self): return 'Telegram channel: "{}"'.format(self.name)