314 lines
9.1 KiB
Python
314 lines
9.1 KiB
Python
"""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(primary_key=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)
|
|
registration = models.ForeignKey(
|
|
'Registration', on_delete=models.CASCADE, null=True)
|
|
|
|
def __str__(self):
|
|
return _('Event: {}').format(self.title)
|
|
|
|
class Meta:
|
|
verbose_name = _('Event')
|
|
verbose_name_plural = _('Events')
|
|
|
|
|
|
class Registration(models.Model):
|
|
"""Model for event registration."""
|
|
|
|
name = models.CharField(max_length=255)
|
|
email = models.EmailField()
|
|
options = JSONField()
|
|
|
|
def __str__(self):
|
|
return _('Registration: {}').format(self.name)
|
|
|
|
class Meta:
|
|
verbose_name = _('Registration')
|
|
verbose_name_plural = _('Registrations')
|
|
|
|
|
|
class BaseRole(models.Model):
|
|
"""Base model for occupations/roles."""
|
|
|
|
CATEGORIES = (
|
|
('corporate', _('Corporate affairs')),
|
|
('freshman', _('Freshmen')),
|
|
('international', _('International')),
|
|
('external', _('External affairs')),
|
|
('media', _('Media')),
|
|
('tech', _('Technology')),
|
|
('wellbeing', _('Wellbeing')),
|
|
('elepaja', _('Elepaja')),
|
|
('ceremonies', _('Ceremonies')),
|
|
('culture', _('Culture')),
|
|
('studies', _('Studies')),
|
|
('sosso', _('Sössö magazine')),
|
|
('alumni', _('Alumni relations')),
|
|
('others', _('Others')),
|
|
)
|
|
|
|
name = models.CharField(_('Name'), max_length=255)
|
|
is_board = models.BooleanField(_('Board member'))
|
|
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 representing a preset occupation in the guild."""
|
|
|
|
description = models.TextField(_('Description'))
|
|
|
|
|
|
class PresetKaehmyRole(PresetRole):
|
|
"""Model for kaehmy role."""
|
|
|
|
class Meta:
|
|
verbose_name = _('Preset kaehmy role')
|
|
verbose_name_plural = _('Preset kaehmy roles')
|
|
|
|
|
|
class CustomKaehmyRole(BaseRole):
|
|
"""Model representing a user-specified custom occupation."""
|
|
|
|
class Meta:
|
|
verbose_name = _('Custom kaehmy role')
|
|
verbose_name_plural = _('Custom kaehmy roles')
|
|
|
|
|
|
class MessageParent(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 KaehmyMessage(MessageParent):
|
|
"""
|
|
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('MessageParent', related_name='messages')
|
|
|
|
|
|
class KaehmyForm(MessageParent):
|
|
"""
|
|
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(
|
|
'CustomKaehmyRole', related_name='forms', blank=True)
|
|
preset_roles = models.ManyToManyField(
|
|
'PresetKaehmyRole', 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)
|
|
|
|
|
|
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'))
|
|
official = models.ForeignKey('Official', related_name='roles')
|
|
|
|
|
|
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'))
|
|
|
|
|
|
# Ohlhafv
|
|
class OhlhafvChallenge(models.Model):
|
|
"""Model containing all info about ohlhafv challenge."""
|
|
|
|
class Meta:
|
|
verbose_name = _('Ohlhafv challenge')
|
|
verbose_name_plural = _('Ohlhafv challenges')
|
|
|
|
SERIES_CHOICES = (
|
|
('0.33 L', '0.33 L'),
|
|
('0.5 L', '0.5 L'),
|
|
('1.0 L', '1.0 L'),
|
|
('Team', _('Team Challenge (1 x 0.33 L, 2 x 0.5 L, 1 x 1.0 L)'))
|
|
)
|
|
|
|
challenger = models.CharField(_('Challenger'), max_length=255)
|
|
victim = models.CharField(_('Victim'), max_length=255)
|
|
challenger_email = models.EmailField(_('Challenger email'))
|
|
victim_email = models.EmailField(_('Victim email'))
|
|
series = models.CharField(_('Series'), choices=SERIES_CHOICES, max_length=10)
|
|
message = models.TextField(_('Message'), blank=True, null=False)
|
|
|
|
|
|
# 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)
|
|
|
|
|
|
auditlog.register(Tag)
|
|
auditlog.register(Feed)
|
|
auditlog.register(Event)
|
|
auditlog.register(PresetRole)
|
|
auditlog.register(Role)
|
|
auditlog.register(Official)
|