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/training.py

67 lines
3.1 KiB
Python

from django.db import models
from django.utils.translation import gettext_lazy as _
from utils import RestrictedFileField
from contrib.models import CommonModel
from members.rules import is_oneself
from contrib.rules import has_global_perm
from .member import Member
from .activity import ActivityCategory
class TrainingCategory(models.Model):
"""Represents a type of training, e.g. Grundausbildung, Fortbildung, Aufbaumodul, etc."""
name = models.CharField(verbose_name=_('Name'), max_length=50)
permission_needed = models.BooleanField(verbose_name=_('Permission needed'))
class Meta:
verbose_name = _('Training category')
verbose_name_plural = _('Training categories')
def __str__(self):
return self.name
class MemberTraining(CommonModel):
"""Represents a training planned or attended by a member."""
member = models.ForeignKey(Member, on_delete=models.CASCADE, related_name='traininigs', verbose_name=_('Member'))
title = models.CharField(verbose_name=_('Title'), max_length=150)
date = models.DateField(verbose_name=_('Date'), null=True, blank=True)
category = models.ForeignKey(TrainingCategory, on_delete=models.PROTECT, verbose_name=_('Category'))
activity = models.ManyToManyField(ActivityCategory, verbose_name=_('Activity'))
comments = models.TextField(verbose_name=_('Comments'), blank=True)
participated = models.BooleanField(verbose_name=_('Participated'), null=True)
passed = models.BooleanField(verbose_name=_('Passed'), null=True)
certificate = RestrictedFileField(verbose_name=_('certificate of attendance'),
upload_to='training_forms',
blank=True,
max_upload_size=5,
content_types=['application/pdf',
'image/jpeg',
'image/png',
'image/gif'])
def __str__(self):
if self.date:
return self.title + ' ' + self.date.strftime('%d.%m.%Y')
return self.title + ' ' + str(_('(no date)'))
def get_activities(self):
activity_string = ', '.join(a.name for a in self.activity.all())
return activity_string
get_activities.short_description = _('Activities')
class Meta(CommonModel.Meta):
verbose_name = _('Training')
verbose_name_plural = _('Trainings')
permissions = (
('manage_success_trainings', 'Can edit the success status of trainings.'),
)
rules_permissions = {
# sine this is used in an inline, the member and not the training is passed
'add_obj': is_oneself | has_global_perm('members.add_global_membertraining'),
'view_obj': is_oneself | has_global_perm('members.view_global_membertraining'),
'change_obj': is_oneself | has_global_perm('members.change_global_membertraining'),
'delete_obj': is_oneself | has_global_perm('members.delete_global_membertraining'),
}