diff --git a/conservancy/assignment/forms.py b/conservancy/assignment/forms.py new file mode 100644 index 0000000000000000000000000000000000000000..1f69062fb394a5970f42dbccbc7aa12c68d5a422 --- /dev/null +++ b/conservancy/assignment/forms.py @@ -0,0 +1,73 @@ +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): + period_begins = self.cleaned_data.get('period_begins') + period_ends = self.cleaned_data.get('period_ends') + period_end_type = self.cleaned_data.get('period_end_type') + if period_begins and period_ends and period_begins > period_ends: + raise ValidationError('End of period is before start') + if period_end_type == 'a specific past date' and not period_ends: + raise ValidationError('This field is required') + return period_ends