Skip to content

Commit 334d118

Browse files
committed
Merged in [8614] from harald@alvestrand.no:
Second try on ietf-tools#1425. Returns to agenda and uses message. Builds on [8604]. Fixes issue ietf-tools#1425, agenda view save-as. - Legacy-Id: 8621 Note: SVN reference [8604] has been migrated to Git commit c0c608a Note: SVN reference [8614] has been migrated to Git commit 502dede
2 parents 52d4ae5 + 502dede commit 334d118

2 files changed

Lines changed: 53 additions & 4 deletions

File tree

ietf/meeting/tests_views.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import os
22
import shutil
33
import datetime
4+
import urlparse
45

56
from django.core.urlresolvers import reverse as urlreverse
67
from django.conf import settings
@@ -179,6 +180,8 @@ def test_save_agenda_as_and_read_permissions(self):
179180
'saveas': "saveas",
180181
})
181182
self.assertEqual(r.status_code, 302)
183+
# Verify that we actually got redirected to a new place.
184+
self.assertNotEqual(urlparse.urlparse(r.url).path, url)
182185

183186
# get
184187
schedule = meeting.get_schedule_by_name("foo")
@@ -211,6 +214,40 @@ def test_save_agenda_as_and_read_permissions(self):
211214
r = self.client.get(url)
212215
self.assertEqual(r.status_code, 200)
213216

217+
def test_save_agenda_broken_names(self):
218+
meeting = make_meeting_test_data()
219+
220+
# save as new name (requires valid existing agenda)
221+
url = urlreverse("ietf.meeting.views.edit_agenda", kwargs=dict(num=meeting.number,
222+
owner=meeting.agenda.owner_email(),
223+
name=meeting.agenda.name))
224+
self.client.login(username="ad", password="ad+password")
225+
r = self.client.post(url, {
226+
'savename': "/no/this/should/not/work/it/is/too/long",
227+
'saveas': "saveas",
228+
})
229+
self.assertEqual(r.status_code, 302)
230+
self.assertEqual(urlparse.urlparse(r.url).path, url)
231+
# TODO: Verify that an error message was in fact returned.
232+
233+
r = self.client.post(url, {
234+
'savename': "/invalid/chars/",
235+
'saveas': "saveas",
236+
})
237+
# TODO: Verify that an error message was in fact returned.
238+
self.assertEqual(r.status_code, 302)
239+
self.assertEqual(urlparse.urlparse(r.url).path, url)
240+
241+
# Non-ASCII alphanumeric characters
242+
r = self.client.post(url, {
243+
'savename': u"f\u00E9ling",
244+
'saveas': "saveas",
245+
})
246+
# TODO: Verify that an error message was in fact returned.
247+
self.assertEqual(r.status_code, 302)
248+
self.assertEqual(urlparse.urlparse(r.url).path, url)
249+
250+
214251
def test_edit_timeslots(self):
215252
meeting = make_meeting_test_data()
216253

ietf/meeting/views.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from django import forms
1313
from django.shortcuts import render_to_response, redirect
1414
from django.http import HttpResponse, HttpResponseRedirect, HttpResponseForbidden, Http404
15+
from django.contrib import messages
1516
from django.core.urlresolvers import reverse
1617
from django.db.models import Q
1718
from django.template import RequestContext
@@ -88,8 +89,11 @@ def get_user_agent(request):
8889
user_agent = ""
8990
return user_agent
9091

92+
def ascii_alphanumeric(string):
93+
return re.match(r'^[a-zA-Z0-9]*$', string)
94+
9195
class SaveAsForm(forms.Form):
92-
savename = forms.CharField(max_length=100)
96+
savename = forms.CharField(max_length=16)
9397

9498
@role_required('Area Director','Secretariat')
9599
def agenda_create(request, num=None, owner=None, name=None):
@@ -99,22 +103,30 @@ def agenda_create(request, num=None, owner=None, name=None):
99103

100104
if schedule is None:
101105
# here we have to return some ajax to display an error.
102-
raise Http404("No meeting information for meeting %s owner %s schedule %s available" % (num, owner, name))
106+
messages.error("Error: No meeting information for meeting %s owner %s schedule %s available" % (num, owner, name))
107+
return redirect(edit_agenda, num=num, owner=owner, name=name)
103108

104109
# authorization was enforced by the @group_require decorator above.
105110

106111
saveasform = SaveAsForm(request.POST)
107112
if not saveasform.is_valid():
108-
return HttpResponse(status=404)
113+
messages.info(request, "This name is not valid. Please choose another one.")
114+
return redirect(edit_agenda, num=num, owner=owner, name=name)
109115

110116
savedname = saveasform.cleaned_data['savename']
111117

118+
if not ascii_alphanumeric(savedname):
119+
messages.info(request, "This name contains illegal characters. Please choose another one.")
120+
return redirect(edit_agenda, num=num, owner=owner, name=name)
121+
112122
# create the new schedule, and copy the scheduledsessions
113123
try:
114124
sched = meeting.schedule_set.get(name=savedname, owner=request.user.person)
115125
if sched:
116-
# XXX needs to record a session error and redirect to where?
117126
return redirect(edit_agenda, meeting.number, sched.name)
127+
else:
128+
messages.info(request, "Agenda creation failed. Please try again.")
129+
return redirect(edit_agenda, num=num, owner=owner, name=name)
118130

119131
except Schedule.DoesNotExist:
120132
pass

0 commit comments

Comments
 (0)