diff --git a/ietf/meeting/tests_views.py b/ietf/meeting/tests_views.py index f75a4bca6..dbc4da12b 100644 --- a/ietf/meeting/tests_views.py +++ b/ietf/meeting/tests_views.py @@ -1,9 +1,11 @@ import os import shutil import datetime +import urlparse from django.core.urlresolvers import reverse as urlreverse from django.conf import settings +from django.contrib import messages from pyquery import PyQuery @@ -179,6 +181,8 @@ class EditTests(TestCase): 'saveas': "saveas", }) self.assertEqual(r.status_code, 302) + # Verify that we actually got redirected to a new place. + self.assertNotEqual(urlparse.urlparse(r.url).path, url) # get schedule = meeting.get_schedule_by_name("foo") @@ -223,12 +227,26 @@ class EditTests(TestCase): 'savename': "/no/this/should/not/work/it/is/too/long", 'saveas': "saveas", }) - self.assertEqual(r.status_code, 404) - #r = self.client.post(url, { - # 'savename': "/invalid/chars/", - # 'saveas': "saveas", - # }) - #self.assertEqual(r.status_code, 404) + self.assertEqual(r.status_code, 302) + self.assertEqual(urlparse.urlparse(r.url).path, url) + # TODO: Verify that an error message was in fact returned. + + r = self.client.post(url, { + 'savename': "/invalid/chars/", + 'saveas': "saveas", + }) + # TODO: Verify that an error message was in fact returned. + self.assertEqual(r.status_code, 302) + self.assertEqual(urlparse.urlparse(r.url).path, url) + + # Non-ASCII alphanumeric characters + r = self.client.post(url, { + 'savename': u"f\u00E9ling", + 'saveas': "saveas", + }) + # TODO: Verify that an error message was in fact returned. + self.assertEqual(r.status_code, 302) + self.assertEqual(urlparse.urlparse(r.url).path, url) def test_edit_timeslots(self): diff --git a/ietf/meeting/views.py b/ietf/meeting/views.py index 6ce4b859a..62981a1d8 100644 --- a/ietf/meeting/views.py +++ b/ietf/meeting/views.py @@ -1,5 +1,5 @@ # Copyright The IETF Trust 2007, All Rights Reserved - +import curses import datetime import os import re @@ -12,6 +12,7 @@ import debug # pyflakes:ignore from django import forms from django.shortcuts import render_to_response, redirect from django.http import HttpResponse, HttpResponseRedirect, HttpResponseForbidden, Http404 +from django.contrib import messages from django.core.urlresolvers import reverse from django.db.models import Q from django.template import RequestContext @@ -88,6 +89,9 @@ def get_user_agent(request): user_agent = "" return user_agent +def ascii_alphanumeric(string): + return re.match(r'^[a-zA-Z0-9]*$', string) + class SaveAsForm(forms.Form): savename = forms.CharField(max_length=16) @@ -99,25 +103,30 @@ def agenda_create(request, num=None, owner=None, name=None): if schedule is None: # here we have to return some ajax to display an error. - raise Http404("No meeting information for meeting %s owner %s schedule %s available" % (num, owner, name)) + messages.error("Error: No meeting information for meeting %s owner %s schedule %s available" % (num, owner, name)) + return redirect(edit_agenda, num=num, owner=owner, name=name) # authorization was enforced by the @group_require decorator above. saveasform = SaveAsForm(request.POST) if not saveasform.is_valid(): - return HttpResponse(status=404) + messages.info(request, "This name is not valid. Please choose another one.") + return redirect(edit_agenda, num=num, owner=owner, name=name) savedname = saveasform.cleaned_data['savename'] - if not savedname.isalnum(): - return HttpResponse("Asked to save with invalid name", status=404) + if not ascii_alphanumeric(savedname): + messages.info(request, "This name contains illegal characters. Please choose another one.") + return redirect(edit_agenda, num=num, owner=owner, name=name) # create the new schedule, and copy the scheduledsessions try: sched = meeting.schedule_set.get(name=savedname, owner=request.user.person) if sched: - # XXX needs to record a session error and redirect to where? return redirect(edit_agenda, meeting.number, sched.name) + else: + messages.info(request, "Agenda creation failed. Please try again.") + return redirect(edit_agenda, num=num, owner=owner, name=name) except Schedule.DoesNotExist: pass