Files @ 7374c9f91528
Branch filter:

Location: website/www/conservancy/apps/assignment/forms.py

bsturmfels
assignment: Accept current date anywhere on earth.
import datetime

from django import forms
from django.core.validators import ValidationError
from django.utils import timezone

from .models import Assignment
from .terms import TERMS


def validate_in_past(value):
    # Adding a day to allow the current date anywhere on earth, regardless of
    # the server timezone.
    if value > timezone.now().date() + datetime.timedelta(days=1):
        raise ValidationError('Enter a date in the past')


class AssignmentForm(forms.ModelForm):
    period_begins = forms.DateField(
        label='Assign the copyright in my above contributions starting on',
        help_text='You can use the day you first started contributing (or, equivalently, your date of birth), or any later date.',
        required=True,
        widget=forms.DateInput(attrs={'type': 'date'}),
        validators=[validate_in_past],
    )
    period_end_type = forms.ChoiceField(
        label='and ending on',
        choices=[
            ('all future contributions', 'all future contributions (no end date)'),
            ('a specific past date', 'a specific past date (specify below)'),
        ],
        widget=forms.RadioSelect(),
        initial='all future contributions',
    )
    period_ends = forms.DateField(
        label='Specific past date (if applicable)',
        required=False,
        widget=forms.DateInput(attrs={'type': 'date'}),
        validators=[validate_in_past],
    )
    agreement_terms = forms.CharField(
        widget=forms.Textarea(attrs={'readonly': 'readonly'}),
        initial=TERMS,
    )

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['attestation_of_copyright'].required = True

    class Meta:
        model = Assignment
        fields = [
            'full_name',
            'email',
            'country_of_residence',
            'repositories',
            'all_emails',
            'period_begins',
            'period_end_type',
            'period_ends',
            'agreement_terms',
            'attestation_of_copyright',
        ]

    def clean_period_ends(self):
        if 'period_begins' in self.cleaned_data and 'period_ends' in self.cleaned_data and self.cleaned_data['period_begins'] and self.cleaned_data['period_ends'] and self.cleaned_data['period_begins'] > self.cleaned_data['period_ends']:
            raise ValidationError('End of period is before start')

        if self.cleaned_data['period_end_type'] == 'a specific past date' and not self.cleaned_data['period_ends']:
            raise ValidationError('This field is required')

        return self.cleaned_data['period_ends']