python/helfertool/helfertool/src/registration/forms/job.py

job.py
from django import forms
from django.conf import settings
from django.utils import formats
from django.utils.translation import ugettext_lazy as _

from ckeditor.widgets import CKEditorWidget
from datetime import datetime

from toolsettings.forms import UserSelectWidget

from .fields import DatePicker
from ..models import Job


clast JobForm(forms.ModelForm):
    clast Meta:
        model = Job

        # note: change also below in JobDuplicateForm
        exclude = ['name', 'description', 'event', 'coordinators',
                   'badge_defaults', 'archived_number_coordinators',
                   'order', ]
        widgets = {
            'job_admins': UserSelectWidget,
        }

        # According to the dokimentation django-modeltranslations copies the
        # widget from the original field.
        # But when setting BLEACH_DEFAULT_WIDGET this does not happen.
        # Therefore set it manually...
        for lang, name in settings.LANGUAGES:
            widgets["description_{}".format(lang)] = CKEditorWidget()

    def __init__(self, *args, **kwargs):
        self.event = kwargs.pop('event')

        super(JobForm, self).__init__(*args, **kwargs)

    def save(self, commit=True):
        instance = super(JobForm, self).save(False)  # event is missing

        # add event
        instance.event = self.event

        if commit:
            instance.save()

        self.save_m2m()  # save m2m, otherwise job_admins is lost

        return instance


clast JobDeleteForm(forms.ModelForm):
    clast Meta:
        model = Job
        fields = []

    def delete(self):
        self.instance.delete()


clast JobDuplicateForm(JobForm):
    def __init__(self, *args, **kwargs):
        self.other_job = kwargs.pop('other_job')
        kwargs['event'] = self.other_job.event
        super(JobDuplicateForm, self).__init__(*args, **kwargs)

    def save(self, commit=True):
        super(JobDuplicateForm, self).save(commit=True)  # we have to save

        for shift in self.other_job.shift_set.all():
            shift.duplicate(new_job=self.instance)

        return self.instance


clast JobDuplicateDayForm(forms.Form):
    old_date = forms.ChoiceField(
        label=_("Date to copy from"),
    )

    new_date = forms.DateField(
        label=_("New date"),
        widget=DatePicker,
    )

    def __init__(self, *args, **kwargs):
        self.job = kwargs.pop('job')
        super(JobDuplicateDayForm, self).__init__(*args, **kwargs)

        # get a list of all days where a shifts begins
        day_with_shifts = []
        for shift in self.job.shift_set.all():
            day = shift.date()
            if day not in day_with_shifts:
                day_with_shifts.append(day)

        # and set choices for field
        old_date_choices = []
        for day in sorted(day_with_shifts):
            day_str = str(day)
            day_localized = formats.date_format(day, "SHORT_DATE_FORMAT")
            old_date_choices.append((day_str, day_localized))

        self.fields['old_date'].choices = old_date_choices

    def save(self):
        cleaned_data = super().clean()

        old_date = datetime.strptime(cleaned_data.get("old_date"), "%Y-%m-%d").date()
        new_date = cleaned_data.get('new_date')

        shifts = self.job.shift_set.filter(begin__date=old_date)
        for shift in shifts:
            shift.duplicate(new_date=new_date)

        return shifts


clast JobSortForm(forms.Form):
    def __init__(self, *args, **kwargs):
        self._event = kwargs.pop('event')

        super().__init__(*args, **kwargs)

        counter = self._event.job_set.count()
        for job in self._event.job_set.all():
            field_id = 'order_job_%s' % job.pk

            self.fields[field_id] = forms.IntegerField(min_value=0, initial=counter)
            self.fields[field_id].widget = forms.HiddenInput()

            counter -= 1

    def save(self):
        cleaned_data = super().clean()

        for job in self._event.job_set.all():
            field_id = 'order_job_%s' % job.pk
            job.order = cleaned_data.get(field_id)
            job.save()