diff --git a/mayan/apps/control_codes/api_views.py b/mayan/apps/control_codes/api_views.py index 13bf6ad765..f8e7485557 100644 --- a/mayan/apps/control_codes/api_views.py +++ b/mayan/apps/control_codes/api_views.py @@ -14,10 +14,10 @@ from mayan.apps.rest_api.permissions import MayanPermission from .literals import CONTROL_SHEET_CODE_IMAGE_TASK_TIMEOUT from .models import ControlSheet -#from .permissions import ( -# permission_workflow_create, permission_workflow_delete, -# permission_workflow_edit, permission_workflow_view -#) +from .permissions import ( + permission_control_sheet_create, permission_control_sheet_delete, + permission_control_sheet_edit, permission_control_sheet_view +) from .serializers import ( ControlSheetSerializer, ControlSheetCodeSerializer ) @@ -26,14 +26,31 @@ from .settings import settings_control_sheet_code_image_cache_time from .tasks import task_generate_control_sheet_code_image +class ControlSheetAPIViewMixin(object): + def get_control_sheet(self): + if self.request.method == 'GET': + permission = permission_control_sheet_view + else: + permission = permission_control_sheet_edit + + queryset = AccessControlList.objects.restrict_queryset( + permission=permission, queryset=ControlSheet.objects.all(), + user=self.request.user + ) + + return get_object_or_404( + klass=queryset, pk=self.kwargs['control_sheet_id'] + ) + + class APIControlSheetListView(generics.ListCreateAPIView): """ get: Returns a list of all the control sheets. post: Create a new control sheet. """ filter_backends = (MayanObjectPermissionsFilter,) - #mayan_object_permissions = {'GET': (permission_control_sheet_view,)} - #mayan_view_permissions = {'POST': (permission_control_sheet_create,)} + mayan_object_permissions = {'GET': (permission_control_sheet_view,)} + mayan_view_permissions = {'POST': (permission_control_sheet_create,)} permission_classes = (MayanPermission,) queryset = ControlSheet.objects.all() serializer_class = ControlSheetSerializer @@ -61,12 +78,12 @@ class APIControlSheetView(generics.RetrieveUpdateDestroyAPIView): put: Edit the selected control sheet. """ filter_backends = (MayanObjectPermissionsFilter,) - #mayan_object_permissions = { - # 'DELETE': (permission_control sheet_delete,), - # 'GET': (permission_control sheet_view,), - # 'PATCH': (permission_control sheet_edit,), - # 'PUT': (permission_control sheet_edit,) - #} + mayan_object_permissions = { + 'DELETE': (permission_control_sheet_delete,), + 'GET': (permission_control_sheet_view,), + 'PATCH': (permission_control_sheet_edit,), + 'PUT': (permission_control_sheet_edit,) + } lookup_url_kwarg = 'control_sheet_id' queryset = ControlSheet.objects.all() serializer_class = ControlSheetSerializer @@ -86,8 +103,9 @@ class APIControlSheetView(generics.RetrieveUpdateDestroyAPIView): # return WritableControlSheetSerializer - -class APIControlSheetCodeListView(generics.ListCreateAPIView): +class APIControlSheetCodeListView( + ControlSheetAPIViewMixin, generics.ListCreateAPIView +): """ get: Returns a list of all the control sheet codes. post: Create a new control sheet code. @@ -101,7 +119,9 @@ class APIControlSheetCodeListView(generics.ListCreateAPIView): """ Extra context provided to the serializer class. """ - context = super(APIControlSheetCodeListView, self).get_serializer_context() + context = super( + APIControlSheetCodeListView, self + ).get_serializer_context() if self.kwargs: context.update( { @@ -111,25 +131,10 @@ class APIControlSheetCodeListView(generics.ListCreateAPIView): return context - def get_control_sheet(self): - #if self.request.method == 'GET': - # permission_required = permission_control_sheet_view - #else: - # permission_required = permission_control_sheet_edit - control_sheet = get_object_or_404( - klass=ControlSheet, pk=self.kwargs['control_sheet_id'] - ) - - #AccessControlList.objects.check_access( - # obj=control_sheet, permissions=(permission_required,), - # user=self.request.user - #) - - return control_sheet - - -class APIControlSheetCodeView(generics.RetrieveUpdateDestroyAPIView): +class APIControlSheetCodeView( + ControlSheetAPIViewMixin, generics.RetrieveUpdateDestroyAPIView +): """ delete: Delete the selected control sheet code. get: Return the details of the selected control sheet code. @@ -156,25 +161,10 @@ class APIControlSheetCodeView(generics.RetrieveUpdateDestroyAPIView): return context - def get_control_sheet(self): - #if self.request.method == 'GET': - # permission_required = permission_control_sheet_view - #else: - # permission_required = permission_control_sheet_edit - control_sheet = get_object_or_404( - klass=ControlSheet, pk=self.kwargs['control_sheet_id'] - ) - - #AccessControlList.objects.check_access( - # obj=control_sheet, permissions=(permission_required,), - # user=self.request.user - #) - - return control_sheet - - -class APIControlSheetCodeImageView(generics.RetrieveAPIView): +class APIControlSheetCodeImageView( + ControlSheetAPIViewMixin, generics.RetrieveAPIView +): """ get: Returns an image representation of the selected control_sheet. """ @@ -188,23 +178,6 @@ class APIControlSheetCodeImageView(generics.RetrieveAPIView): def get_queryset(self): return self.get_control_sheet().codes.all() - def get_control_sheet(self): - #if self.request.method == 'GET': - # permission_required = permission_control_sheet_view - #else: - # permission_required = permission_control_sheet_edit - - control_sheet = get_object_or_404( - klass=ControlSheet, pk=self.kwargs['control_sheet_id'] - ) - - #AccessControlList.objects.check_access( - # obj=control_sheet, permissions=(permission_required,), - # user=self.request.user - #) - - return control_sheet - def get_serializer(self, *args, **kwargs): return None diff --git a/mayan/apps/control_codes/apps.py b/mayan/apps/control_codes/apps.py index 50f98f311c..07ac2e7b21 100644 --- a/mayan/apps/control_codes/apps.py +++ b/mayan/apps/control_codes/apps.py @@ -25,7 +25,16 @@ from .handlers import ( handler_create_control_sheet_codes_image_cache, handler_process_document_version ) +from .links import ( + link_control_sheet_create, link_control_sheet_delete, + link_control_sheet_edit, link_control_sheet_list, + link_control_sheet_preview +) from .methods import method_document_submit, method_document_version_submit +from .permissions import ( + permission_control_sheet_delete, permission_control_sheet_edit, + permission_control_sheet_view +) class ControlCodesApp(MayanAppConfig): @@ -40,6 +49,8 @@ class ControlCodesApp(MayanAppConfig): super(ControlCodesApp, self).ready() from actstream import registry + ControlSheet = self.get_model(model_name='ControlSheet') + ControlSheetCode = self.get_model(model_name='ControlSheetCode') Document = apps.get_model( app_label='documents', model_name='Document' ) @@ -59,6 +70,52 @@ class ControlCodesApp(MayanAppConfig): value=method_document_version_submit ) + ModelPermission.register( + model=ControlSheet, permissions=( + permission_control_sheet_delete, + permission_control_sheet_edit, + permission_control_sheet_view + ) + ) + + ModelPermission.register_inheritance( + model=ControlSheetCode, related='control_sheet', + ) + + SourceColumn( + attribute='label', is_identifier=True, is_sortable=True, + source=ControlSheet + ) + + menu_list_facet.bind_links( + links=( + link_acl_list, #link_events_for_object, + #link_object_event_types_user_subcriptions_list, + ), sources=(ControlSheet,) + ) + menu_list_facet.bind_links( + links=( + link_control_sheet_preview, + ), + sources=(ControlSheet,) + ) + menu_object.bind_links( + links=( + link_control_sheet_edit, link_control_sheet_delete, + ), + sources=(ControlSheet,) + ) + menu_secondary.bind_links( + links=(link_control_sheet_list, link_control_sheet_create), + sources=( + ControlSheet, 'control_sheet:control_sheet_list', + 'control_sheet:control_sheet_create' + ) + ) + menu_setup.bind_links( + links=(link_control_sheet_list,), + ) + post_migrate.connect( dispatch_uid='control_codes_handler_create_control_sheet_codes_image_cache', receiver=handler_create_control_sheet_codes_image_cache, diff --git a/mayan/apps/control_codes/icons.py b/mayan/apps/control_codes/icons.py index 75b7c2025b..438ef6da84 100644 --- a/mayan/apps/control_codes/icons.py +++ b/mayan/apps/control_codes/icons.py @@ -3,4 +3,12 @@ from __future__ import absolute_import, unicode_literals from mayan.apps.appearance.classes import Icon from mayan.apps.documents.icons import icon_document_type -icon_control_code = Icon(driver_name='fontawesome', symbol='gear') +icon_control_code = Icon(driver_name='fontawesome', symbol='qrcode') +icon_control_code_create = Icon( + driver_name='fontawesome-dual', primary_symbol='qrcode', + secondary_symbol='plus' +) +icon_control_code_delete = Icon(driver_name='fontawesome', symbol='times') +icon_control_code_edit = Icon(driver_name='fontawesome', symbol='pencil-alt') +icon_control_code_list = Icon(driver_name='fontawesome', symbol='qrcode') +icon_control_code_preview = Icon(driver_name='fontawesome', symbol='print') diff --git a/mayan/apps/control_codes/links.py b/mayan/apps/control_codes/links.py index 0e403f512a..65e60e65a7 100644 --- a/mayan/apps/control_codes/links.py +++ b/mayan/apps/control_codes/links.py @@ -7,11 +7,34 @@ from mayan.apps.navigation.classes import Link from .icons import icon_control_code from .permissions import ( - permission_web_link_create, permission_web_link_delete, - permission_web_link_edit, permission_web_link_instance_view, + permission_control_sheet_create, permission_control_sheet_delete, + permission_control_sheet_edit, permission_control_sheet_view, ) -link_control_code_tools = Link( - icon_class=icon_control_code, text=_('Control codes'), - view='control_codes:control_code_create' +link_control_sheet_create = Link( + icon_class_path='mayan.apps.control_codes.icons.icon_control_code_create', + text=_('Create'), permissions=(permission_control_sheet_create,), + view='control_codes:control_sheet_create' +) +link_control_sheet_delete = Link( + icon_class_path='mayan.apps.control_codes.icons.icon_control_code_delete', + kwargs={'control_sheet_id': 'resolved_object.pk'}, text=_('Delete'), + permissions=(permission_control_sheet_delete,), tags='dangerous', + view='control_codes:control_sheet_delete' +) +link_control_sheet_edit = Link( + icon_class_path='mayan.apps.control_codes.icons.icon_control_code_edit', + kwargs={'control_sheet_id': 'resolved_object.pk'}, text=_('Edit'), + permissions=(permission_control_sheet_edit,), + view='control_codes:control_sheet_edit' +) +link_control_sheet_list = Link( + icon_class_path='mayan.apps.control_codes.icons.icon_control_code_list', + text=_('Control sheets'), view='control_codes:control_sheet_list' +) +link_control_sheet_preview = Link( + icon_class_path='mayan.apps.control_codes.icons.icon_control_code_preview', + kwargs={'control_sheet_id': 'resolved_object.pk'}, + text=_('Preview'), permissions=(permission_control_sheet_view,), + view='control_codes:control_sheet_preview' ) diff --git a/mayan/apps/control_codes/permissions.py b/mayan/apps/control_codes/permissions.py new file mode 100644 index 0000000000..243d0a9421 --- /dev/null +++ b/mayan/apps/control_codes/permissions.py @@ -0,0 +1,21 @@ +from __future__ import absolute_import, unicode_literals + +from django.utils.translation import ugettext_lazy as _ + +from mayan.apps.permissions import PermissionNamespace + +namespace = PermissionNamespace( + label=_('Control codes'), name='control_codes' +) +permission_control_sheet_create = namespace.add_permission( + label=_('Create new control sheets'), name='control_sheet_create' +) +permission_control_sheet_delete = namespace.add_permission( + label=_('Delete control sheets'), name='control_sheet_delete' +) +permission_control_sheet_edit = namespace.add_permission( + label=_('Edit control sheets'), name='control_sheet_edit' +) +permission_control_sheet_view = namespace.add_permission( + label=_('View existing control sheets'), name='control_sheet_view' +) diff --git a/mayan/apps/control_codes/queues.py b/mayan/apps/control_codes/queues.py index bed92fa395..11be4c298f 100644 --- a/mayan/apps/control_codes/queues.py +++ b/mayan/apps/control_codes/queues.py @@ -3,7 +3,7 @@ from __future__ import absolute_import, unicode_literals from django.utils.translation import ugettext_lazy as _ from mayan.apps.task_manager.classes import CeleryQueue -from mayan.apps.task_manager.workers import worker_medium +from mayan.apps.task_manager.workers import worker_fast, worker_medium queue = CeleryQueue( label=_('Control codes'), name='control_codes', worker=worker_medium @@ -12,3 +12,12 @@ queue.add_task_type( label=_('Process document version'), dotted_path='mayan.apps.control_codes.tasks.task_process_document_version' ) + +queue = CeleryQueue( + label=_('Control codes fast'), name='control_codes_fast', + worker=worker_fast +) +queue.add_task_type( + label=_('Generate control sheet code image'), + dotted_path='mayan.apps.control_codes.tasks.task_generate_control_sheet_code_image' +) diff --git a/mayan/apps/control_codes/serializers.py b/mayan/apps/control_codes/serializers.py index b91c9e845b..63b4892c3c 100644 --- a/mayan/apps/control_codes/serializers.py +++ b/mayan/apps/control_codes/serializers.py @@ -19,7 +19,6 @@ from .models import ControlSheet, ControlSheetCode class ControlSheetSerializer(serializers.HyperlinkedModelSerializer): #states = ControlSheetStateSerializer(many=True, required=False) - #transitions = ControlSheetTransitionSerializer(many=True, required=False) code_list_url = serializers.HyperlinkedIdentityField( lookup_url_kwarg='control_sheet_id', @@ -76,4 +75,3 @@ class ControlSheetCodeSerializer(serializers.HyperlinkedModelSerializer): def create(self, validated_data): validated_data['control_sheet'] = self.context['control_sheet'] return super(ControlSheetCodeSerializer, self).create(validated_data) - diff --git a/mayan/apps/control_codes/templates/control_codes/control_sheet_print.html b/mayan/apps/control_codes/templates/control_codes/control_sheet_print.html index 3a1bf80af6..d8f8b1205c 100644 --- a/mayan/apps/control_codes/templates/control_codes/control_sheet_print.html +++ b/mayan/apps/control_codes/templates/control_codes/control_sheet_print.html @@ -5,18 +5,33 @@ {% block title %}{{ title }}{% endblock title %} {% block content_plain %} -

- Mayan EDMS control sheet: {{ object }} -

+ + +

{{ title }}