class Meta: verbose_name = Config.assignment_string() verbose_name_plural = Config.assignments_string()
class Job(PolymorphicModel): slots = models.PositiveIntegerField('Plaetze') time = models.DateTimeField() multiplier = models.PositiveIntegerField(Config.assignments_string() + ' vielfaches', default=1) pinned = models.BooleanField(default=False) reminder_sent = models.BooleanField('Reminder verschickt', default=False) canceled = models.BooleanField('abgesagt', default=False) old_canceled = None old_time = None @property def type(self): raise NotImplementedError def __str__(self): return 'Job #%s' % self.id def weekday_name(self): day = self.time.isoweekday() return weekday_short(day, 2) def time_stamp(self): return int(time.mktime(self.time.timetuple()) * 1000) def freie_plaetze(self): if not (self.slots is None): return self.slots - self.occupied_places() else: return 0 def end_time(self): return self.time + timezone.timedelta(hours=self.type.duration) def start_time(self): return self.time def occupied_places(self): return self.assignment_set.count() def get_status_percentage(self): assignments = AssignmentDao.assignments_for_job(self.id) if self.slots < 1: return get_status_image(100) return get_status_image(assignments.count() * 100 / self.slots) def is_core(self): return self.type.activityarea.core def extras(self): extras_result = [] for extra in self.type.job_extras_set.all(): if extra.empty(self.assignment_set.all()): extras_result.append(extra.extra_type.display_empty) else: extras_result.append(extra.extra_type.display_full) return ' '.join(extras_result) def empty_per_job_extras(self): extras_result = [] for extra in self.type.job_extras_set.filter(per_member=False): if extra.empty(self.assignment_set.all()): extras_result.append(extra) return extras_result def full_per_job_extras(self): extras_result = [] for extra in self.type.job_extras_set.filter(per_member=False): if not extra.empty(self.assignment_set.all()): extras_result.append(extra) return extras_result def per_member_extras(self): return self.type.job_extras_set.filter(per_member=True) def clean(self): if self.old_canceled != self.canceled and self.old_canceled is True: raise ValidationError( 'Abgesagte jobs koennen nicht wieder aktiviert werden', code='invalid') @classmethod def pre_save(cls, sender, instance, **kwds): if instance.old_canceled != instance.canceled and instance.old_canceled is False: assignments = AssignmentDao.assignments_for_job(instance.id) emails = set() for assignment in assignments: emails.add(assignment.member.email) instance.slots = 0 if len(emails) > 0: send_job_canceled(emails, instance) if instance.old_time != instance.time: assignments = AssignmentDao.assignments_for_job(instance.id) emails = set() for assignment in assignments: emails.add(assignment.member.email) if len(emails) > 0: send_job_time_changed(emails, instance) @classmethod def post_init(cls, sender, instance, **kwds): instance.old_time = instance.time instance.old_canceled = instance.canceled if instance.canceled: assignments = AssignmentDao.assignments_for_job(instance.id) assignments.delete() class Meta: verbose_name = 'AbstractJob' verbose_name_plural = 'AbstractJobs'