From 7e6dc50b394521f3f3bc3020291090314a29feb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Norman=20J=C3=A4ckel?= Date: Wed, 13 Jul 2016 01:39:28 +0200 Subject: [PATCH] Added viewpoint to number all motions in a category. --- CHANGELOG | 1 + openslides/motions/views.py | 35 +++++++++++++++++- tests/integration/motions/test_viewset.py | 44 +++++++++++++++++++++++ 3 files changed, 79 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 7dcbd24d3..baaad159b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -17,6 +17,7 @@ Core: Motions: - Added origin field. +- Added button to number all motions in a category. Users: - Added field is_committee and new default group Committees. diff --git a/openslides/motions/views.py b/openslides/motions/views.py index cb10330bd..a895cb8a6 100644 --- a/openslides/motions/views.py +++ b/openslides/motions/views.py @@ -294,13 +294,46 @@ class CategoryViewSet(ModelViewSet): result = self.get_access_permissions().can_retrieve(self.request.user) elif self.action in ('metadata', 'list'): result = self.request.user.has_perm('motions.can_see') - elif self.action in ('create', 'partial_update', 'update', 'destroy'): + elif self.action in ('create', 'partial_update', 'update', 'destroy', 'numbering'): result = (self.request.user.has_perm('motions.can_see') and self.request.user.has_perm('motions.can_manage')) else: result = False return result + @detail_route(methods=['post']) + def numbering(self, request, pk=None): + """ + Special view endpoint to number all motions in this category. + + Only managers can use this view. + """ + category = self.get_object() + number = 0 + if not category.prefix: + prefix = '' + else: + prefix = '%s ' % category.prefix + + with transaction.atomic(): + for motion in category.motion_set.all(): + motion.identifier = None + motion.save() + + for motion in category.motion_set.all(): + if motion.is_amendment(): + parent_identifier = motion.parent.identifier or '' + prefix = '%s %s ' % (parent_identifier, config['motions_amendments_prefix']) + number += 1 + identifier = '%s%d' % (prefix, number) + motion.identifier = identifier + motion.identifier_number = number + motion.save() + + message = _('All motions in category {category} numbered ' + 'successfully.').format(category=category) + return Response({'detail': message}) + class WorkflowViewSet(ModelViewSet): """ diff --git a/tests/integration/motions/test_viewset.py b/tests/integration/motions/test_viewset.py index 96465bdc3..55f10a734 100644 --- a/tests/integration/motions/test_viewset.py +++ b/tests/integration/motions/test_viewset.py @@ -443,3 +443,47 @@ class UpdateMotionPoll(TestCase): {'motion_id': self.motion.pk, 'votesvalid': ''}) self.assertEqual(response.status_code, status.HTTP_200_OK) + + +class NumberMotionsInCategory(TestCase): + """ + Tests numbering motions in a category. + """ + def setUp(self): + self.client = APIClient() + self.client.login(username='admin', password='admin') + self.category = Category.objects.create( + name='test_cateogory_name_zah6Ahd4Ifofaeree6ai', + prefix='test_prefix_ahz6tho2mooH8') + self.motion = Motion( + title='test_title_Eeha8Haf6peulu8ooc0z', + text='test_text_faghaZoov9ooV4Acaquk', + category=self.category) + self.motion.save() + self.motion.identifier = '' + self.motion.save() + self.motion_2 = Motion( + title='test_title_kuheih2eja2Saeshusha', + text='test_text_Ha5ShaeraeSuthooP2Bu', + category=self.category) + self.motion_2.save() + self.motion_2.identifier = '' + self.motion_2.save() + + def test_numbering(self): + response = self.client.post( + reverse('category-numbering', args=[self.category.pk])) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data, {'detail': 'All motions in category test_cateogory_name_zah6Ahd4Ifofaeree6ai numbered successfully.'}) + self.assertEqual(Motion.objects.get(pk=self.motion.pk).identifier, 'test_prefix_ahz6tho2mooH8 1') + self.assertEqual(Motion.objects.get(pk=self.motion_2.pk).identifier, 'test_prefix_ahz6tho2mooH8 2') + + def test_numbering_existing_identifier(self): + self.motion_2.identifier = 'test_prefix_ahz6tho2mooH8 1' + self.motion_2.save() + response = self.client.post( + reverse('category-numbering', args=[self.category.pk])) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data, {'detail': 'All motions in category test_cateogory_name_zah6Ahd4Ifofaeree6ai numbered successfully.'}) + self.assertEqual(Motion.objects.get(pk=self.motion.pk).identifier, 'test_prefix_ahz6tho2mooH8 1') + self.assertEqual(Motion.objects.get(pk=self.motion_2.pk).identifier, 'test_prefix_ahz6tho2mooH8 2')