Add check for set state view, fix #1080.

This commit is contained in:
Norman Jäckel 2013-11-19 01:00:27 +01:00
parent 962636f84c
commit 31af5c0ce6
2 changed files with 28 additions and 9 deletions

View File

@ -25,7 +25,7 @@ from .forms import (BaseMotionForm, MotionCategoryMixin,
MotionImportForm, MotionSubmitterMixin, MotionImportForm, MotionSubmitterMixin,
MotionSupporterMixin, MotionWorkflowMixin) MotionSupporterMixin, MotionWorkflowMixin)
from .models import (Category, Motion, MotionPoll, MotionSubmitter, from .models import (Category, Motion, MotionPoll, MotionSubmitter,
MotionSupporter, MotionVersion, WorkflowError) MotionSupporter, MotionVersion, State)
from .pdf import motion_poll_to_pdf, motion_to_pdf, motions_to_pdf from .pdf import motion_poll_to_pdf, motion_to_pdf, motions_to_pdf
@ -647,17 +647,21 @@ class MotionSetStateView(SingleObjectMixin, RedirectView):
Save the new state and write a log message. Save the new state and write a log message.
""" """
self.object = self.get_object() self.object = self.get_object()
try: success = False
if self.reset: if self.reset:
self.object.reset_state() self.object.reset_state()
success = True
elif self.object.state.id == int(kwargs['state']):
messages.error(request, _('You can not set the state of the motion. It is already done.'))
elif int(kwargs['state']) not in [state.id for state in self.object.state.next_states.all()]:
messages.error(request, _('You can not set the state of the motion to %s.') % _(State.objects.get(pk=int(kwargs['state'])).name))
else: else:
self.object.set_state(int(kwargs['state'])) self.object.set_state(int(kwargs['state']))
except WorkflowError, e: # TODO: Is a WorkflowError still possible here? success = True
messages.error(request, e) if success:
else:
self.object.save(update_fields=['state', 'identifier']) self.object.save(update_fields=['state', 'identifier'])
self.object.write_log( self.object.write_log(
message_list=[ugettext_noop('State changed to'), ' %s' % self.object.state.name], message_list=[ugettext_noop('State changed to'), ' %s' % self.object.state.name], # TODO: Change string to 'State set to ...'
person=self.request.user) person=self.request.user)
messages.success(request, messages.success(request,
_('The state of the motion was set to %s.') _('The state of the motion was set to %s.')

View File

@ -459,6 +459,21 @@ class TestVersionDeleteView(MotionViewTestCase):
self.assertEqual(response.status_code, 404) self.assertEqual(response.status_code, 404)
class MotionSetStatusView(MotionViewTestCase):
def test_set_status(self):
self.assertEqual(self.motion1.state, State.objects.get(name='submitted'))
self.check_url('/motion/1/set_state/4/', self.registered_client, 403)
response = self.staff_client.get('/motion/1/set_state/4/')
self.assertRedirects(response, '/motion/1/')
self.assertEqual(Motion.objects.get(pk=1).state, State.objects.get(name='not decided'))
response = self.staff_client.get('/motion/1/set_state/1/')
self.assertTrue('You can not set the state of the motion to submitted.' in response.cookies['messages'].value)
self.assertRedirects(response, '/motion/1/')
response = self.staff_client.get('/motion/1/set_state/4/')
self.assertTrue('You can not set the state of the motion. It is already done.' in response.cookies['messages'].value)
self.assertRedirects(response, '/motion/1/')
class CategoryViewsTest(TestCase): class CategoryViewsTest(TestCase):
def setUp(self): def setUp(self):
self.admin_client = Client() self.admin_client = Client()