from datetime import date
from django.conf import settings
from django.db import models
[docs]class TrainingType(models.Model):
name = models.CharField(max_length=64, unique=True)
external = models.BooleanField(default=False)
description = models.TextField()
class Meta:
ordering = ['name']
def __str__(self):
return self.name
[docs]class Training(models.Model):
""" A training event """
training_type = models.ForeignKey(TrainingType, on_delete=models.PROTECT, related_name='trainings')
date = models.DateField()
trainer = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, null=True, blank=True, related_name='trainings_run')
recorded_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, editable=False, related_name='trainings_entered')
recorded_on = models.DateTimeField(auto_now_add=True)
expiration_date = models.DateField(null=True, blank=True)
notes = models.TextField(blank=True)
class Meta:
ordering = ['-date', '-recorded_on']
def __str__(self):
return str(self.training_type) + ' on ' + str(self.date)
[docs] def is_expired(self):
return self.expiration_date is not None and date.today() > self.expiration_date
[docs]class Trainee(models.Model):
""" Record of an individual's completion or revocation of training """
training = models.ForeignKey(Training, on_delete=models.CASCADE, related_name='trainees')
person = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, related_name='trainings')
revoked = models.BooleanField(default=False)
revoked_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, null=True, blank=True, related_name='trainings_revoked')
revoked_on = models.DateTimeField(null=True, blank=True)
notes = models.TextField(blank=True)
class Meta:
order_with_respect_to = 'training'
permissions = (
('revoke_training', 'Revoke a member\'s training'),
('edit_trainee_notes', 'Edit training notes on a person'),
)
def __str__(self):
return str(self.person) + ' for ' + str(self.training)
[docs] def is_valid(self):
return not self.revoked and not self.training.is_expired()
[docs] def was_valid_on(self, date):
return date >= self.training.date \
and (self.training.expiration_date is None or date <= self.training.expiration_date) \
and (not self.revoked or date < self.revoked_on.date())