diff --git a/mayan/apps/control_codes/apps.py b/mayan/apps/control_codes/apps.py index 4f6d16fd8b..0f0614f1ee 100644 --- a/mayan/apps/control_codes/apps.py +++ b/mayan/apps/control_codes/apps.py @@ -13,10 +13,6 @@ from mayan.apps.common.html_widgets import TwoStateWidget from mayan.apps.common.menus import ( menu_list_facet, menu_object, menu_secondary, menu_setup ) -from mayan.apps.events.classes import ModelEventType -from mayan.apps.events.links import ( - link_events_for_object, link_object_event_types_user_subcriptions_list -) from mayan.apps.navigation.classes import SourceColumn from .control_codes import * @@ -70,6 +66,7 @@ class ControlCodesApp(MayanAppConfig): ModelPermission.register( model=ControlSheet, permissions=( + permission_acl_edit, permission_acl_view, permission_control_sheet_delete, permission_control_sheet_edit, permission_control_sheet_view diff --git a/mayan/apps/control_codes/classes.py b/mayan/apps/control_codes/classes.py index 6a217359c4..7f84c254ff 100644 --- a/mayan/apps/control_codes/classes.py +++ b/mayan/apps/control_codes/classes.py @@ -6,10 +6,8 @@ from PIL import Image from pyzbar.pyzbar import decode import qrcode -from django.apps import apps -from django.db import transaction from django.utils.encoding import force_text, python_2_unicode_compatible -from django.utils.translation import string_concat, ugettext_lazy as _ +from django.utils.translation import string_concat from mayan.apps.common.serialization import yaml_dump, yaml_load from mayan.apps.documents.literals import DOCUMENT_IMAGE_TASK_TIMEOUT diff --git a/mayan/apps/control_codes/icons.py b/mayan/apps/control_codes/icons.py index d127361b42..1bd8501d4a 100644 --- a/mayan/apps/control_codes/icons.py +++ b/mayan/apps/control_codes/icons.py @@ -7,7 +7,7 @@ icon_control_sheet = Icon( {'class': 'far fa-file ', 'transform': 'grow-4'}, {'class': 'fas fa-barcode', 'transform': 'shrink-6'}, ], - # shadow_class='far fa-file', + #shadow_class='far fa-file', ) icon_control_sheet_create = Icon( driver_name='fontawesome-layers', data=[ diff --git a/mayan/apps/control_codes/serializers.py b/mayan/apps/control_codes/serializers.py index 51898cef84..7dbdb6c8a5 100644 --- a/mayan/apps/control_codes/serializers.py +++ b/mayan/apps/control_codes/serializers.py @@ -2,16 +2,12 @@ from __future__ import unicode_literals from rest_framework import serializers -from mayan.apps.documents.serializers import DocumentTypeSerializer -from mayan.apps.rest_api.relations import ( - FilteredPrimaryKeyRelatedField, MultiKwargHyperlinkedIdentityField -) +from mayan.apps.rest_api.relations import MultiKwargHyperlinkedIdentityField from .models import ControlSheet, ControlSheetCode class ControlSheetSerializer(serializers.HyperlinkedModelSerializer): - #codes = ControlSheetCodeSerializer(many=True, required=False) code_list_url = serializers.HyperlinkedIdentityField( lookup_url_kwarg='control_sheet_id', view_name='rest_api:controlsheet-code-list' diff --git a/mayan/apps/control_codes/tests/literals.py b/mayan/apps/control_codes/tests/literals.py index ae8b3acd9b..b919467f6f 100644 --- a/mayan/apps/control_codes/tests/literals.py +++ b/mayan/apps/control_codes/tests/literals.py @@ -1,3 +1,6 @@ from __future__ import unicode_literals +TEST_CONTROL_SHEET_CODE_ARGUMENTS = '{"argument_1": ""}' +TEST_CONTROL_SHEET_CODE_ARGUMENTS_EDITED = '{"argument_1": "edited"}' TEST_CONTROL_SHEET_LABEL = 'test control sheet' +TEST_CONTROL_SHEET_LABEL_EDITED = 'test control sheet edited' diff --git a/mayan/apps/control_codes/tests/mixins.py b/mayan/apps/control_codes/tests/mixins.py index 5db12ed894..502c0cea63 100644 --- a/mayan/apps/control_codes/tests/mixins.py +++ b/mayan/apps/control_codes/tests/mixins.py @@ -1,25 +1,40 @@ from __future__ import unicode_literals +from ..classes import ControlCode from ..models import ControlSheet -from .literals import TEST_CONTROL_SHEET_LABEL +from .literals import ( + TEST_CONTROL_SHEET_CODE_ARGUMENTS, + TEST_CONTROL_SHEET_CODE_ARGUMENTS_EDITED, TEST_CONTROL_SHEET_LABEL, + TEST_CONTROL_SHEET_LABEL_EDITED +) + + +class ControlCodeTest(ControlCode): + arguments = ('argument_1',) + label = 'Test' + name = 'test' + + def execute(self): + pass class ControlSheetAPIViewTestMixin(object): - def _request_test_tag_create_api_view(self): + def _request_test_control_sheet_create_api_view(self): return self.post( - viewname='rest_api:tag-list', data={ - 'label': TEST_CONTROL_SHEET_LABEL, 'color': TEST_CONTROL_SHEET_COLOR + viewname='rest_api:control_sheet-list', data={ + 'label': TEST_CONTROL_SHEET_LABEL, } ) - 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} + viewname='rest_api:control_sheet-detail', kwargs={ + 'control_sheet_id': self.test_control_sheet.pk + } ) - def _request_control_sheet_edit_view(self, extra_data=None, verb='patch'): + def _request_test_control_sheet_edit_api_view(self, extra_data=None, verb='patch'): data = { 'label': TEST_CONTROL_SHEET_LABEL_EDITED, } @@ -41,6 +56,17 @@ class ControlSheetTestMixin(object): ) +class ControlSheetCodeTestMixin(object): + _test_control_code_class = ControlCodeTest + + def _create_test_control_sheet_code(self): + self.test_control_sheet_code = self.test_control_sheet.codes.create( + control_sheet=self.test_control_sheet, + name=self._test_control_code_class.name, + arguments=TEST_CONTROL_SHEET_CODE_ARGUMENTS + ) + + class ControlSheetViewTestMixin(object): def _request_test_control_sheet_create_view(self): return self.post( @@ -51,23 +77,94 @@ class ControlSheetViewTestMixin(object): 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} + 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}, + 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={ + 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') + return self.get(viewname='control_codes:control_sheet_list') + + def _request_test_control_sheet_preview_view(self): + return self.get( + viewname='control_codes:control_sheet_preview', kwargs={ + 'control_sheet_id': self.test_control_sheet.pk + } + ) + + def _request_test_control_sheet_print_view(self): + return self.get( + viewname='control_codes:control_sheet_print', kwargs={ + 'control_sheet_id': self.test_control_sheet.pk + } + ) + + +class ControlSheetCodeViewTestMixin(object): + def _request_test_control_sheet_code_select_get_view(self): + return self.get( + viewname='control_codes:control_sheet_code_select', kwargs={ + 'control_sheet_id': self.test_control_sheet.pk, + } + ) + + def _request_test_control_sheet_code_select_post_view(self): + return self.post( + viewname='control_codes:control_sheet_code_select', kwargs={ + 'control_sheet_id': self.test_control_sheet.pk, + }, data={'control_code_class_name': self._test_control_code_class.name} + ) + + def _request_test_control_sheet_code_create_view(self): + return self.post( + viewname='control_codes:control_sheet_code_create', kwargs={ + 'control_sheet_id': self.test_control_sheet.pk, + 'control_code_class_name': self._test_control_code_class.name + } + + ) + + def _request_test_control_sheet_code_delete_view(self): + return self.post( + viewname='control_codes:control_sheet_code_delete', + kwargs={ + 'control_sheet_id': self.test_control_sheet_code.control_sheet.pk, + 'control_sheet_code_id': self.test_control_sheet_code.pk + } + ) + + def _request_test_control_sheet_code_edit_view(self): + return self.post( + viewname='control_codes:control_sheet_code_edit', kwargs={ + 'control_sheet_id': self.test_control_sheet_code.control_sheet.pk, + 'control_sheet_code_id': self.test_control_sheet_code.pk + }, data={ + 'arguments': TEST_CONTROL_SHEET_CODE_ARGUMENTS_EDITED, + } + ) + + def _request_test_control_sheet_code_list_view(self): + return self.get( + viewname='control_codes:control_sheet_code_list', kwargs={ + 'control_sheet_id': self.test_control_sheet.pk + } + ) + + +ControlCode.register(control_code=ControlCodeTest) diff --git a/mayan/apps/control_codes/tests/test_models.py b/mayan/apps/control_codes/tests/test_models.py index f6c26afde1..5797288d51 100644 --- a/mayan/apps/control_codes/tests/test_models.py +++ b/mayan/apps/control_codes/tests/test_models.py @@ -1,36 +1,22 @@ from __future__ import unicode_literals -from django.test import override_settings - from mayan.apps.common.tests.base import BaseTestCase 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 .mixins import ControlSheetCodeTestMixin TEST_CONTROL_CODE_DOCUMENT_PATH = '/tmp/test_control_code.png' -class ControlCodeTest(ControlCode): - arguments = ('argument_1',) - label = 'Test' - name = 'test' - - def execute(self): - pass - - -ControlCode.register(control_code=ControlCodeTest) - - -class ControlCodeTestCase(GenericDocumentTestCase): +class ControlCodeTestCase(ControlSheetCodeTestMixin, GenericDocumentTestCase): auto_upload_document = False 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 = self._test_control_code_class( + argument_1='test argument value' + ) control_code.image.save(file_object) self.upload_document() diff --git a/mayan/apps/control_codes/tests/test_views.py b/mayan/apps/control_codes/tests/test_views.py index 1aba92d101..7c0c656284 100644 --- a/mayan/apps/control_codes/tests/test_views.py +++ b/mayan/apps/control_codes/tests/test_views.py @@ -1,66 +1,310 @@ from __future__ import unicode_literals -from django.test import override_settings +from mayan.apps.common.tests.base import GenericViewTestCase -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 ..models import ControlSheet, ControlSheetCode from ..permissions import ( permission_control_sheet_create, permission_control_sheet_delete, permission_control_sheet_edit, permission_control_sheet_view ) -from .mixins import ControlSheetTestMixin, ControlSheetViewTestMixin +from .mixins import ( + ControlSheetCodeTestMixin, ControlSheetCodeViewTestMixin, + ControlSheetTestMixin, ControlSheetViewTestMixin +) class ControlSheetViewTestCase( ControlSheetTestMixin, ControlSheetViewTestMixin, GenericViewTestCase ): - test_model = ControlSheet - test_permission_create = permission_control_sheet_create - test_permission_delete = permission_control_sheet_delete + _test_model = ControlSheet + _test_permission_create = permission_control_sheet_create + _test_permission_delete = permission_control_sheet_delete + _test_permission_edit = permission_control_sheet_edit + _test_permission_view = permission_control_sheet_view def test_control_sheet_create_view_no_permissions(self): - object_count = self.test_model.objects.count() + 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) + 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) + self.grant_permission(permission=self._test_permission_create) - object_count = self.test_model.objects.count() + 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) + 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() + 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) + 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 + obj=self.test_control_sheet, permission=self._test_permission_delete ) - object_count = self.test_model.objects.count() + 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) + self.assertEqual(self._test_model.objects.count(), object_count - 1) + + def test_control_sheet_edit_view_no_permissions(self): + self._create_test_control_sheet() + + control_sheet_label = self.test_control_sheet.label + + response = self._request_test_control_sheet_edit_view() + self.assertEqual(response.status_code, 404) + + self.test_control_sheet.refresh_from_db() + self.assertEqual(self.test_control_sheet.label, control_sheet_label) + + def test_control_sheet_edit_view_with_access(self): + self._create_test_control_sheet() + + self.grant_access( + obj=self.test_control_sheet, permission=self._test_permission_edit + ) + + control_sheet_label = self.test_control_sheet.label + + response = self._request_test_control_sheet_edit_view() + self.assertEqual(response.status_code, 302) + + self.test_control_sheet.refresh_from_db() + self.assertNotEqual(self.test_control_sheet.label, control_sheet_label) + + def test_control_sheet_list_view_no_permission(self): + self._create_test_control_sheet() + + response = self._request_test_control_sheet_list_view() + self.assertNotContains( + response, text=self.test_control_sheet.label, status_code=200 + ) + + def test_control_sheet_list_view_with_access(self): + self._create_test_control_sheet() + self.grant_access( + obj=self.test_control_sheet, + permission=self._test_permission_view + ) + + response = self._request_test_control_sheet_list_view() + self.assertContains( + response, text=self.test_control_sheet.label, status_code=200 + ) + + def test_control_sheet_preview_view_no_permissions(self): + self._create_test_control_sheet() + + response = self._request_test_control_sheet_preview_view() + self.assertEqual(response.status_code, 404) + + def test_control_sheet_preview_view_with_access(self): + self._create_test_control_sheet() + + self.grant_access( + obj=self.test_control_sheet, permission=self._test_permission_view + ) + + response = self._request_test_control_sheet_preview_view() + self.assertContains( + response=response, text=self.test_control_sheet.label, + status_code=200 + ) + + def test_control_sheet_print_view_no_permissions(self): + self._create_test_control_sheet() + + response = self._request_test_control_sheet_print_view() + self.assertEqual(response.status_code, 404) + + def test_control_sheet_print_view_with_access(self): + self._create_test_control_sheet() + + self.grant_access( + obj=self.test_control_sheet, permission=self._test_permission_view + ) + + response = self._request_test_control_sheet_print_view() + self.assertContains( + response=response, text=self.test_control_sheet.label, + status_code=200 + ) + + +class ControlSheetCodeViewTestCase( + ControlSheetTestMixin, ControlSheetCodeTestMixin, + ControlSheetCodeViewTestMixin, GenericViewTestCase +): + _test_model = ControlSheetCode + _test_permission_create = permission_control_sheet_create + _test_permission_delete = permission_control_sheet_delete + _test_permission_edit = permission_control_sheet_edit + _test_permission_view = permission_control_sheet_view + + def test_control_sheet_code_select_get_view_no_permissions(self): + self._create_test_control_sheet() + + response = self._request_test_control_sheet_code_select_get_view() + self.assertEqual(response.status_code, 404) + + def test_control_sheet_code_select_get_view_with_access(self): + self._create_test_control_sheet() + + self.grant_access( + obj=self.test_control_sheet, + permission=self._test_permission_edit + ) + + response = self._request_test_control_sheet_code_select_get_view() + + self.assertContains( + response=response, text=self._test_control_code_class.label, + status_code=200 + ) + + def test_control_sheet_code_select_post_view_no_permissions(self): + self._create_test_control_sheet() + + response = self._request_test_control_sheet_code_select_post_view() + self.assertEqual(response.status_code, 404) + + def test_control_sheet_code_select_post_view_with_access(self): + self._create_test_control_sheet() + + self.grant_access( + obj=self.test_control_sheet, + permission=self._test_permission_edit + ) + + response = self._request_test_control_sheet_code_select_post_view() + self.assertEqual(response.status_code, 302) + + def test_control_sheet_code_create_view_no_permissions(self): + self._create_test_control_sheet() + + object_count = self._test_model.objects.count() + + response = self._request_test_control_sheet_code_create_view() + self.assertEqual(response.status_code, 404) + + self.assertEqual(self._test_model.objects.count(), object_count) + + def test_control_sheet_code_create_view_with_access(self): + self._create_test_control_sheet() + + self.grant_access( + obj=self.test_control_sheet, + permission=self._test_permission_edit + ) + + object_count = self._test_model.objects.count() + + response = self._request_test_control_sheet_code_create_view() + self.assertEqual(response.status_code, 302) + + self.assertEqual(self._test_model.objects.count(), object_count + 1) + + def test_control_sheet_code_delete_view_no_permissions(self): + self._create_test_control_sheet() + self._create_test_control_sheet_code() + + object_count = self._test_model.objects.count() + + response = self._request_test_control_sheet_code_delete_view() + self.assertEqual(response.status_code, 404) + + self.assertEqual(self._test_model.objects.count(), object_count) + + def test_control_sheet_code_delete_view_with_access(self): + self._create_test_control_sheet() + self._create_test_control_sheet_code() + + self.grant_access( + obj=self.test_control_sheet, + permission=self._test_permission_edit + ) + + object_count = self._test_model.objects.count() + + response = self._request_test_control_sheet_code_delete_view() + self.assertEqual(response.status_code, 302) + + self.assertEqual(self._test_model.objects.count(), object_count - 1) + + def test_control_sheet_code_edit_view_no_permissions(self): + self._create_test_control_sheet() + self._create_test_control_sheet_code() + + control_sheet_code_arguments = self.test_control_sheet_code.arguments + + response = self._request_test_control_sheet_code_edit_view() + self.assertEqual(response.status_code, 404) + + self.test_control_sheet_code.refresh_from_db() + self.assertEqual( + self.test_control_sheet_code.arguments, + control_sheet_code_arguments + ) + + def test_control_sheet_code_edit_view_with_access(self): + self._create_test_control_sheet() + self._create_test_control_sheet_code() + + self.grant_access( + obj=self.test_control_sheet, + permission=self._test_permission_edit + ) + + control_sheet_code_arguments = self.test_control_sheet_code.arguments + + response = self._request_test_control_sheet_code_edit_view() + self.assertEqual(response.status_code, 302) + + self.test_control_sheet_code.refresh_from_db() + self.assertNotEqual( + self.test_control_sheet_code.arguments, + control_sheet_code_arguments + ) + + def test_control_sheet_code_list_view_no_permission(self): + self._create_test_control_sheet() + self._create_test_control_sheet_code() + + response = self._request_test_control_sheet_code_list_view() + self.assertNotContains( + response, text=self.test_control_sheet_code.get_label(), + status_code=404 + ) + + def test_control_sheet_code_list_view_with_access(self): + self._create_test_control_sheet() + self._create_test_control_sheet_code() + self.grant_access( + obj=self.test_control_sheet, + permission=self._test_permission_view + ) + + response = self._request_test_control_sheet_code_list_view() + self.assertContains( + response, text=self.test_control_sheet_code.get_label(), + status_code=200 + ) diff --git a/mayan/apps/control_codes/views.py b/mayan/apps/control_codes/views.py index fe62620ba1..ec3a25857f 100644 --- a/mayan/apps/control_codes/views.py +++ b/mayan/apps/control_codes/views.py @@ -163,7 +163,7 @@ class ControlSheetCodeCreate(ExternalObjectMixin, SingleObjectCreateView): class ControlSheetCodeDeleteView(ExternalObjectMixin, SingleObjectDeleteView): form_class = ControlSheetCodeForm external_object_class = ControlSheet - external_object_permission = permission_control_sheet_delete + external_object_permission = permission_control_sheet_edit external_object_pk_url_kwarg = 'control_sheet_id' pk_url_kwarg = 'control_sheet_code_id'