"""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 VERBOSE_NAME = _('Webapp') class Tag(models.Model): """Model for tag.""" slug = models.SlugField(unique=True) name = models.CharField(max_length=127) icon = models.ImageField() class Meta: verbose_name = _('Tag') verbose_name_plural = _('Tags') def __str__(self): return _('Tag: {}').format(self.slug) class BaseFeed(models.Model): """Model containing something showing on some info feed.""" tags = models.ManyToManyField(Tag, related_name="feeds", blank=True) visible = models.BooleanField(default=True) title = models.CharField(max_length=255) description = models.CharField(max_length=255) content = models.TextField() class Feed(BaseFeed): """Model representing feed.""" publish_time = models.DateTimeField(default=timezone.now) autohide = models.DateTimeField(default=month_from_now) def __str__(self): return _('Feed: {}').format(self.title) class Meta: verbose_name = _('Feed') verbose_name_plural = _('Feeds') class Event(BaseFeed): """Model for event.""" start_time = models.DateTimeField(default=timezone.now) end_time = models.DateTimeField(default=timezone.now) signupForm = models.ManyToManyField( 'SignupForm', blank=True) location = models.CharField(max_length=255, blank=True) def __str__(self): return _('Event: {}').format(self.title) class Meta: verbose_name = _('Event') verbose_name_plural = _('Events') class TemplateQuestion(models.Model): """Stores template questions for signup forms as JSONB""" # question = JSONField() name = models.CharField(max_length=255) question = models.CharField(max_length=255) def __str__(self): return _('Template questions: {}').format(self.name) class Meta: verbose_name = _('Template question') verbose_name_plural = _('Template questions') class SignupForm(models.Model): """Model for event signup form. Stores questions in JSONB.""" start = models.DateTimeField(default=timezone.now) end = models.DateTimeField(default=timezone.now) # question = JSONField() questions = models.CharField(max_length=255) visible = models.BooleanField(default=True) class Meta: verbose_name = _('Signup form') verbose_name_plural = _('Signup forms') class Signup(models.Model): signupForm = models.ForeignKey('SignupForm', on_delete=models.CASCADE) time = models.DateTimeField(default=timezone.now) answer = models.CharField(max_length=255) def __str__(self): return _('Sign-ups: {}').format(self.signupForm) class Meta: verbose_name = _('Sign-up') verbose_name_plural = _('Sign-ups') class BaseRole(models.Model): """Base model for occupations/roles.""" name = models.CharField(_('Name'), max_length=255) is_board = models.BooleanField(_('Board member')) def __str__(self): n = self.name.capitalize() return '{} ({})'.format(n, _('board member')) if self.is_board else n class PresetRole(BaseRole): """Model representing a preset occupation in the guild.""" description = models.TextField(_('Description')) class Committee(models.Model): """ Committee model Has many Roles found under variable roles """ class Meta: """Meta class for Committee class.""" verbose_name = _('Committee') verbose_name_plural = _('Committees') def __str__(self): return _('Committee: {}').format(self.name) name = models.CharField(_("Name"), max_length=255) @property def current_roles(self): return self.roles.all().filter(end_date__gte=timezone.now()).filter(start_date__lte=timezone.now()) class Role(PresetRole): """ Model for Role. Model representing an active or historical occupation in an official's history. """ class Meta: """Meta class for Role model.""" verbose_name = _('Role') verbose_name_plural = _('Roles') start_date = models.DateField(_('Start date')) end_date = models.DateField(_('End date')) committee = models.ForeignKey('Committee', related_name='roles', on_delete=models.SET_NULL, null=True) class Official(User): """Model representing a guild official.""" class Meta: """Meta class for Official class.""" verbose_name = _('Official') verbose_name_plural = _('Officials') phone_number = PhoneNumberField(_('Phone number')) role = models.ManyToManyField('Role', related_name='official') def __str__(self): return '{} {}'.format(self.first_name, self.last_name) auditlog.register(Tag) auditlog.register(Feed) auditlog.register(Event) auditlog.register(Signup) auditlog.register(PresetRole) auditlog.register(Role) auditlog.register(Official)