Merged in [13017] from rcross@amsl.com:

Add placeholders and validations to secretariat non-session time input fields.  Fixes #2208.
 - Legacy-Id: 13019
Note: SVN reference [13017] has been migrated to Git commit 4f5933ae20
This commit is contained in:
Henrik Levkowetz 2017-03-17 16:32:42 +00:00
commit 1abb631c61
3 changed files with 35 additions and 4 deletions

View file

@ -22,7 +22,9 @@ SESSION_DAYS = ((2,'Monday'),
(4,'Wednesday'),
(5,'Thursday'),
(6,'Friday'))
SESSION_DURATION_RE = re.compile(r'^\d{2}:\d{2}')
#----------------------------------------------------------
# Helper Functions
#----------------------------------------------------------
@ -186,6 +188,13 @@ class TimeSlotForm(forms.Form):
duration = ietf.utils.fields.DurationField()
name = forms.CharField(help_text='Name that appears on the agenda')
def clean_duration(self):
'''Limit to HH:MM format'''
duration = self.data['duration']
if not SESSION_DURATION_RE.match(duration):
raise forms.ValidationError('{} value has an invalid format. It must be in HH:MM format'.format(duration))
return self.cleaned_data['duration']
class NonSessionForm(TimeSlotForm):
short = forms.CharField(max_length=32,label='Short Name',help_text='Enter an abbreviated session name (used for material file names)',required=False)
type = forms.ModelChoiceField(queryset=TimeSlotTypeName.objects.filter(used=True).exclude(slug__in=('session',)),empty_label=None)
@ -195,6 +204,11 @@ class NonSessionForm(TimeSlotForm):
required=False)
show_location = forms.BooleanField(required=False)
def __init__(self,*args,**kwargs):
super(NonSessionForm, self).__init__(*args,**kwargs)
self.fields["time"].widget.attrs["placeholder"] = "HH:MM"
self.fields["duration"].widget.attrs["placeholder"] = "HH:MM"
def clean(self):
super(NonSessionForm, self).clean()
if any(self.errors):

View file

@ -238,7 +238,7 @@ class SecrMeetingTestCase(TestCase):
response = self.client.post(url, {
'day':'1',
'time':'08:00',
'duration':'1 0:0:0',
'duration':'09:00',
'name':'Testing'
})
self.assertEqual(response.status_code, 302)
@ -251,6 +251,23 @@ class SecrMeetingTestCase(TestCase):
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
def test_meetings_nonsession_add_invalid(self):
make_meeting_test_data()
group = Group.objects.get(acronym='secretariat')
url = reverse('ietf.secr.meetings.views.non_session',kwargs={'meeting_id':42,'schedule_name':'test-agenda'})
self.client.login(username="secretary", password="secretary+password")
response = self.client.post(url, {
'day':'1',
'time':'08:00',
'duration':'10',
'name':'Testing',
'short':'test',
'type':'reg',
'group':group.pk,
})
self.assertEqual(response.status_code, 200)
self.assertTrue('invalid format' in response.content)
def test_meetings_select_group(self):
make_meeting_test_data()
url = reverse('ietf.secr.meetings.views.select_group',kwargs={'meeting_id':42,'schedule_name':'test-agenda'})

View file

@ -99,7 +99,7 @@ def build_nonsession(meeting,schedule):
return None
delta = meeting.date - last_meeting.date
system = Person.objects.get(name='(system)')
system = Person.objects.get(name='(System)')
secretariat = Group.objects.get(acronym='secretariat')
for slot in TimeSlot.objects.filter(meeting=last_meeting,type__in=('break','reg','other','plenary','lead')):
@ -487,7 +487,7 @@ def non_session(request, meeting_id, schedule_name):
name=name,
short=short,
group=group,
requested_by=Person.objects.get(name='(system)'),
requested_by=Person.objects.get(name='(System)'),
status_id='sched',
type=type,
)