diff --git a/mayan/apps/control_codes/apps.py b/mayan/apps/control_codes/apps.py index 6166e7ac2f..4f6d16fd8b 100644 --- a/mayan/apps/control_codes/apps.py +++ b/mayan/apps/control_codes/apps.py @@ -75,7 +75,6 @@ class ControlCodesApp(MayanAppConfig): permission_control_sheet_view ) ) - ModelPermission.register_inheritance( model=ControlSheetCode, related='control_sheet', ) @@ -95,7 +94,8 @@ class ControlCodesApp(MayanAppConfig): attribute='arguments', source=ControlSheetCode ) SourceColumn( - attribute='enabled', source=ControlSheetCode + attribute='enabled', is_sortable=True, source=ControlSheetCode, + widget=TwoStateWidget ) menu_list_facet.bind_links( diff --git a/mayan/apps/control_codes/classes.py b/mayan/apps/control_codes/classes.py index a8e98418e1..6a217359c4 100644 --- a/mayan/apps/control_codes/classes.py +++ b/mayan/apps/control_codes/classes.py @@ -40,7 +40,9 @@ class ControlCode(object): def get_choices(cls): return sorted( [ - (name, klass.get_label()) for name, klass in cls._registry.items() + ( + name, klass.get_label() + ) for name, klass in cls._registry.items() ] ) @@ -61,6 +63,9 @@ class ControlCode(object): timeout=DOCUMENT_IMAGE_TASK_TIMEOUT, disable_sync_subtasks=False ) + results = [] + + # Collect control codes per page with document_page.cache_partition.get_file(filename=cache_filename).open() as file_object: image = Image.open(file_object) for code in decode(image): @@ -69,7 +74,7 @@ class ControlCode(object): if parts[0] == CONTROL_CODE_MAGIC_NUMBER: try: - control_code_class = ControlCode.get(name=parts[2]) + ControlCode.get(name=parts[2]) except KeyError: # Unknown control code name pass @@ -78,10 +83,23 @@ class ControlCode(object): document_page.save() arguments = CONTROL_CODE_SEPARATOR.join(parts[3:]) - control_code = control_code_class( - **yaml_load(arguments) + results.append( + { + 'order': parts[1], 'name': parts[2], + 'arguments': arguments + } ) - control_code.execute() + + # Sort control codes so that they are executed in the + # specified order after the collection finishes. + results = results.sort(key=lambda x: x['order']) + + for result in results: + control_code_class = ControlCode.get(name=result['name']) + control_code = control_code_class( + **yaml_load(result['arguments']) + ) + control_code.execute() @classmethod def register(cls, control_code): diff --git a/mayan/apps/control_codes/tests/literals.py b/mayan/apps/control_codes/tests/literals.py index baffc48825..ae8b3acd9b 100644 --- a/mayan/apps/control_codes/tests/literals.py +++ b/mayan/apps/control_codes/tests/literals.py @@ -1 +1,3 @@ from __future__ import unicode_literals + +TEST_CONTROL_SHEET_LABEL = 'test control sheet' diff --git a/mayan/apps/control_codes/tests/mixins.py b/mayan/apps/control_codes/tests/mixins.py index baffc48825..5db12ed894 100644 --- a/mayan/apps/control_codes/tests/mixins.py +++ b/mayan/apps/control_codes/tests/mixins.py @@ -1 +1,73 @@ from __future__ import unicode_literals + +from ..models import ControlSheet + +from .literals import TEST_CONTROL_SHEET_LABEL + + +class ControlSheetAPIViewTestMixin(object): + def _request_test_tag_create_api_view(self): + return self.post( + viewname='rest_api:tag-list', data={ + 'label': TEST_CONTROL_SHEET_LABEL, 'color': TEST_CONTROL_SHEET_COLOR + } + ) + + + def _request_test_control_sheet_delete_api_view(self): + return self.delete( + viewname='rest_api:control_sheet-detail', kwargs={'pk': self.test_control_sheet.pk} + ) + + def _request_control_sheet_edit_view(self, extra_data=None, verb='patch'): + data = { + 'label': TEST_CONTROL_SHEET_LABEL_EDITED, + } + + if extra_data: + data.update(extra_data) + + return getattr(self, verb)( + viewname='rest_api:control_sheet-detail', kwargs={ + 'control_sheet_id': self.test_control_sheet.pk + }, data=data + ) + + +class ControlSheetTestMixin(object): + def _create_test_control_sheet(self): + self.test_control_sheet = ControlSheet.objects.create( + label=TEST_CONTROL_SHEET_LABEL + ) + + +class ControlSheetViewTestMixin(object): + def _request_test_control_sheet_create_view(self): + return self.post( + viewname='control_codes:control_sheet_create', data={ + 'label': TEST_CONTROL_SHEET_LABEL + } + ) + + def _request_test_control_sheet_delete_view(self): + return self.post( + viewname='control_codes:control_sheet_delete', + kwargs={'control_sheet_id': self.test_control_sheet.pk} + ) + + def _request_test_control_sheet_delete_multiple_view(self): + return self.post( + viewname='control_codes:control_sheet_multiple_delete', + data={'id_list': self.test_control_sheet.pk}, + ) + + def _request_test_control_sheet_edit_view(self): + return self.post( + viewname='control_codes:control_sheet_edit', + kwargs={'control_sheet_id': self.test_control_sheet.pk}, data={ + 'label': TEST_CONTROL_SHEET_LABEL_EDITED, + } + ) + + def _request_test_control_sheet_list_view(self): + return self.get(viewname='control_sheets:control_sheet_list') diff --git a/mayan/apps/control_codes/tests/test_models.py b/mayan/apps/control_codes/tests/test_models.py index 7bee662dcd..f6c26afde1 100644 --- a/mayan/apps/control_codes/tests/test_models.py +++ b/mayan/apps/control_codes/tests/test_models.py @@ -7,6 +7,7 @@ from mayan.apps.documents.tests.base import GenericDocumentTestCase from mayan.apps.documents.tests.mixins import DocumentTestMixin from ..classes import ControlCode +from ..models import ControlSheet TEST_CONTROL_CODE_DOCUMENT_PATH = '/tmp/test_control_code.png' @@ -28,7 +29,6 @@ class ControlCodeTestCase(GenericDocumentTestCase): test_document_path = TEST_CONTROL_CODE_DOCUMENT_PATH def test_control_code_detection(self): - with open(TEST_CONTROL_CODE_DOCUMENT_PATH, mode='wb') as file_object: control_code = ControlCodeTest(argument_1='test argument value') control_code.image.save(file_object) diff --git a/mayan/apps/control_codes/tests/test_views.py b/mayan/apps/control_codes/tests/test_views.py new file mode 100644 index 0000000000..1aba92d101 --- /dev/null +++ b/mayan/apps/control_codes/tests/test_views.py @@ -0,0 +1,66 @@ +from __future__ import unicode_literals + +from django.test import override_settings + +from mayan.apps.common.tests.base import BaseTestCase, GenericViewTestCase +from mayan.apps.documents.tests.base import GenericDocumentTestCase +from mayan.apps.documents.tests.mixins import DocumentTestMixin + +from ..classes import ControlCode +from ..models import ControlSheet +from ..permissions import ( + permission_control_sheet_create, permission_control_sheet_delete, + permission_control_sheet_edit, permission_control_sheet_view +) + +from .mixins import ControlSheetTestMixin, ControlSheetViewTestMixin + + +class ControlSheetViewTestCase( + ControlSheetTestMixin, ControlSheetViewTestMixin, GenericViewTestCase +): + test_model = ControlSheet + test_permission_create = permission_control_sheet_create + test_permission_delete = permission_control_sheet_delete + + def test_control_sheet_create_view_no_permissions(self): + object_count = self.test_model.objects.count() + + response = self._request_test_control_sheet_create_view() + self.assertEqual(response.status_code, 403) + + self.assertEqual(self.test_model.objects.count(), object_count) + + def test_control_sheet_create_view_with_permissions(self): + self.grant_permission(permission=self.test_permission_create) + + object_count = self.test_model.objects.count() + + response = self._request_test_control_sheet_create_view() + self.assertEqual(response.status_code, 302) + + self.assertEqual(self.test_model.objects.count(), object_count + 1) + + def test_control_sheet_delete_view_no_permissions(self): + self._create_test_control_sheet() + + object_count = self.test_model.objects.count() + + response = self._request_test_control_sheet_delete_view() + self.assertEqual(response.status_code, 404) + + self.assertEqual(self.test_model.objects.count(), object_count) + + def test_control_sheet_delete_view_with_access(self): + self._create_test_control_sheet() + + self.grant_access( + obj=self.test_control_sheet, permission=self.test_permission_delete + ) + + object_count = self.test_model.objects.count() + + response = self._request_test_control_sheet_delete_view() + self.assertEqual(response.status_code, 302) + + self.assertEqual(self.test_model.objects.count(), object_count - 1) diff --git a/mayan/apps/control_codes/views.py b/mayan/apps/control_codes/views.py index 67081406df..fe62620ba1 100644 --- a/mayan/apps/control_codes/views.py +++ b/mayan/apps/control_codes/views.py @@ -29,7 +29,7 @@ logger = logging.getLogger(__name__) class ControlSheetCreateView(SingleObjectCreateView): fields = ('label',) model = ControlSheet - object_permission = permission_control_sheet_create + view_permission = permission_control_sheet_create def get_extra_context(self): return {