You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kompass/jdav_web/members/models/group.py

84 lines
3.7 KiB
Python

from django.db import models
from django.utils.translation import gettext_lazy as _
from django.conf import settings
from django.urls import reverse
from mailer.mailutils import prepend_base_url
from .constants import WEEKDAYS
class Group(models.Model):
"""
Represents one group of the association
e.g: J1, J2, Jugendleiter, etc.
"""
name = models.CharField(max_length=50, verbose_name=_('name')) # e.g: J1
description = models.TextField(verbose_name=_('description'), default='', blank=True)
show_website = models.BooleanField(verbose_name=_('show on website'), default=False)
year_from = models.IntegerField(verbose_name=_('lowest year'), default=2010)
year_to = models.IntegerField(verbose_name=_('highest year'), default=2011)
leiters = models.ManyToManyField('members.Member', verbose_name=_('youth leaders'),
related_name='leited_groups', blank=True)
weekday = models.IntegerField(verbose_name=_('week day'), choices=WEEKDAYS, null=True, blank=True)
start_time = models.TimeField(verbose_name=_('Starting time'), null=True, blank=True)
end_time = models.TimeField(verbose_name=_('Ending time'), null=True, blank=True)
contact_email = models.ForeignKey('mailer.EmailAddress',
verbose_name=_('Contact email'),
null=True,
blank=True,
on_delete=models.SET_NULL)
def __str__(self):
"""String representation"""
return self.name
class Meta:
verbose_name = _('group')
verbose_name_plural = _('groups')
@property
def sorted_members(self):
"""Returns the members of this group sorted by their last name."""
return self.member_set.all().order_by('lastname')
def has_time_info(self):
# return if the group has all relevant time slot information filled
return self.weekday and self.start_time and self.end_time
def get_time_info(self):
if self.has_time_info():
return settings.GROUP_TIME_AVAILABLE_TEXT.format(weekday=WEEKDAYS[self.weekday][1],
start_time=self.start_time.strftime('%H:%M'),
end_time=self.end_time.strftime('%H:%M'))
else:
return ""
def has_age_info(self):
return self.year_from and self.year_to
def get_age_info(self):
if self.has_age_info():
return _("years %(from)s to %(to)s") % {'from':self.year_from, 'to':self.year_to}
return ""
def get_invitation_text_template(self):
"""The text template used to invite waiters to this group. This contains
placeholders for the name of the waiter and personalized links."""
if self.show_website:
group_link = '({url}) '.format(url=prepend_base_url(reverse('startpage:gruppe_detail', args=[self.name])))
else:
group_link = ''
if self.has_time_info():
group_time = self.get_time_info()
else:
group_time = settings.GROUP_TIME_UNAVAILABLE_TEXT.format(contact_email=self.contact_email)
if self.has_age_info():
group_age = self.get_age_info()
else:
group_age = _("no information available")
return settings.INVITE_TEXT.format(group_time=group_time,
group_name=self.name,
group_age=group_age,
group_link=group_link,
contact_email=self.contact_email)