Example #1
0
 class Meta:
     verbose_name = Config.assignment_string()
     verbose_name_plural = Config.assignments_string()
Example #2
0
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'