Ben Sturmfels
531a97a3c9
The directory nesting is unnecessary here and confusing to navigate. I've moved all apps to the project subdirectory, currently called "www", but soon to be renamed "conservancy". I've also moved manage.py to the top-level directory.
73 lines
2.5 KiB
Python
73 lines
2.5 KiB
Python
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
|