diff --git a/mayan/apps/control_codes/api_views.py b/mayan/apps/control_codes/api_views.py index f8e7485557..75c8981939 100644 --- a/mayan/apps/control_codes/api_views.py +++ b/mayan/apps/control_codes/api_views.py @@ -7,8 +7,6 @@ from django.views.decorators.cache import cache_control, patch_cache_control from rest_framework import generics from mayan.apps.acls.models import AccessControlList -from mayan.apps.documents.models import Document, DocumentType -from mayan.apps.documents.permissions import permission_document_type_view from mayan.apps.rest_api.filters import MayanObjectPermissionsFilter from mayan.apps.rest_api.permissions import MayanPermission @@ -63,12 +61,6 @@ class APIControlSheetListView(generics.ListCreateAPIView): *args, **kwargs ) - #def get_serializer_class(self): - # if self.request.method == 'GET': - # return ControlSheetSerializer - # else: - # return WritableControlSheetSerializer - class APIControlSheetView(generics.RetrieveUpdateDestroyAPIView): """ @@ -96,12 +88,6 @@ class APIControlSheetView(generics.RetrieveUpdateDestroyAPIView): *args, **kwargs ) - #def get_serializer_class(self): - # if self.request.method == 'GET': - # return ControlSheetSerializer - # else: - # return WritableControlSheetSerializer - class APIControlSheetCodeListView( ControlSheetAPIViewMixin, generics.ListCreateAPIView @@ -169,11 +155,7 @@ class APIControlSheetCodeImageView( get: Returns an image representation of the selected control_sheet. """ filter_backends = (MayanObjectPermissionsFilter,) - #mayan_object_permissions = { - # 'GET': (permission_control_sheet_view,), - #} lookup_url_kwarg = 'control_sheet_code_id' - #queryset = ControlSheetCode.objects.all() def get_queryset(self): return self.get_control_sheet().codes.all() diff --git a/mayan/apps/control_codes/apps.py b/mayan/apps/control_codes/apps.py index 45554e886a..6166e7ac2f 100644 --- a/mayan/apps/control_codes/apps.py +++ b/mayan/apps/control_codes/apps.py @@ -1,7 +1,7 @@ from __future__ import unicode_literals from django.apps import apps -from django.db.models.signals import post_migrate, post_save +from django.db.models.signals import post_migrate from django.utils.translation import ugettext_lazy as _ from mayan.apps.acls.classes import ModelPermission @@ -11,7 +11,7 @@ from mayan.apps.documents.signals import post_version_upload from mayan.apps.common.apps import MayanAppConfig from mayan.apps.common.html_widgets import TwoStateWidget from mayan.apps.common.menus import ( - menu_facet, menu_list_facet, menu_object, menu_secondary, menu_setup + menu_list_facet, menu_object, menu_secondary, menu_setup ) from mayan.apps.events.classes import ModelEventType from mayan.apps.events.links import ( @@ -28,10 +28,9 @@ from .handlers import ( from .links import ( link_control_sheet_create, link_control_sheet_delete, link_control_sheet_edit, link_control_sheet_list, - link_control_sheet_preview, - + link_control_sheet_preview, link_control_sheet_print, link_control_sheet_code_delete, link_control_sheet_code_edit, - link_control_sheet_code_list + link_control_sheet_code_list, link_control_sheet_code_select ) from .methods import method_document_submit, method_document_version_submit from .permissions import ( @@ -50,16 +49,12 @@ class ControlCodesApp(MayanAppConfig): def ready(self): 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' ) - DocumentType = apps.get_model( - app_label='documents', model_name='DocumentType' - ) DocumentVersion = apps.get_model( app_label='documents', model_name='DocumentVersion' ) @@ -89,36 +84,33 @@ class ControlCodesApp(MayanAppConfig): attribute='label', is_identifier=True, is_sortable=True, source=ControlSheet ) - SourceColumn( - attribute='get_label', is_identifier=True,# is_sortable=True, + attribute='get_label', is_identifier=True, source=ControlSheetCode ) SourceColumn( - attribute='order', is_sortable=True, - source=ControlSheetCode + attribute='order', is_sortable=True, source=ControlSheetCode ) SourceColumn( - attribute='arguments', - source=ControlSheetCode + attribute='arguments', source=ControlSheetCode + ) + SourceColumn( + attribute='enabled', source=ControlSheetCode ) menu_list_facet.bind_links( - links=( - link_acl_list, #link_events_for_object, - #link_object_event_types_user_subcriptions_list, - ), sources=(ControlSheet,) + links=(link_acl_list,), sources=(ControlSheet,) ) menu_list_facet.bind_links( links=( - link_control_sheet_code_list, + link_control_sheet_preview, link_control_sheet_code_list, ), sources=(ControlSheet,) ) menu_object.bind_links( links=( link_control_sheet_edit, link_control_sheet_delete, - link_control_sheet_preview, + link_control_sheet_print, ), sources=(ControlSheet,) ) @@ -131,8 +123,16 @@ class ControlCodesApp(MayanAppConfig): 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' + ControlSheet, 'control_codes:control_sheet_list', + 'control_codes:control_sheet_create' + ) + ) + menu_secondary.bind_links( + links=(link_control_sheet_code_select,), + sources=( + 'control_codes:control_sheet_code_create', + 'control_codes:control_sheet_code_list', + 'control_codes:control_sheet_code_select', ControlSheetCode ) ) menu_setup.bind_links( diff --git a/mayan/apps/control_codes/classes.py b/mayan/apps/control_codes/classes.py index aa313c58d7..a8e98418e1 100644 --- a/mayan/apps/control_codes/classes.py +++ b/mayan/apps/control_codes/classes.py @@ -9,9 +9,7 @@ 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 ( - force_text, string_concat, ugettext_lazy as _ -) +from django.utils.translation import string_concat, ugettext_lazy as _ 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/dependencies.py b/mayan/apps/control_codes/dependencies.py index 9b5e6dd1b8..08fe2ac122 100644 --- a/mayan/apps/control_codes/dependencies.py +++ b/mayan/apps/control_codes/dependencies.py @@ -2,7 +2,7 @@ from __future__ import unicode_literals from django.utils.translation import ugettext_lazy as _ -from mayan.apps.dependencies.classes import BinaryDependency, PythonDependency +from mayan.apps.dependencies.classes import PythonDependency PythonDependency( copyright_text=''' diff --git a/mayan/apps/control_codes/forms.py b/mayan/apps/control_codes/forms.py index 12a31dad7d..d8ac14f0e0 100644 --- a/mayan/apps/control_codes/forms.py +++ b/mayan/apps/control_codes/forms.py @@ -6,15 +6,14 @@ from django import forms from django.core.exceptions import ValidationError from django.utils.translation import ugettext_lazy as _ -from mayan.apps.common.forms import DetailForm from mayan.apps.common.serialization import yaml_load from .classes import ControlCode -from .models import ControlSheet, ControlSheetCode +from .models import ControlSheetCode class ControlSheetCodeClassSelectionForm(forms.Form): - control_code = forms.ChoiceField( + control_code_class_name = forms.ChoiceField( choices=(), help_text=_('Available control codes.'), label=_('Control code'), ) @@ -23,37 +22,15 @@ class ControlSheetCodeClassSelectionForm(forms.Form): super(ControlSheetCodeClassSelectionForm, self).__init__(*args, **kwargs) self.fields[ - 'control_code' + 'control_code_class_name' ].choices = ControlCode.get_choices() class ControlSheetCodeForm(forms.ModelForm): class Meta: - fields = ('arguments', 'order') + fields = ('arguments', 'order', 'enabled') model = ControlSheetCode - def __init__(self, *args, **kwargs): - #control_code_name = kwargs.pop('control_code_name', None) - super(ControlSheetCodeForm, self).__init__(*args, **kwargs) - - """ - if not control_code_name: - # Get the template name when the control_code is being edited. - template_name = getattr( - self.instance.get_control_code_class(), 'template_name', - None - ) - else: - # Get the template name when the control_code is being created - template_name = getattr( - BaseTransformation.get(name=control_code_name), - 'template_name', None - ) - """ - #if template_name: - # self.fields['arguments'].widget.attrs['class'] = 'hidden' - # self.fields['order'].widget.attrs['class'] = 'hidden' - def clean(self): try: yaml_load(stream=self.cleaned_data['arguments']) diff --git a/mayan/apps/control_codes/icons.py b/mayan/apps/control_codes/icons.py index 75b8c1ae03..d127361b42 100644 --- a/mayan/apps/control_codes/icons.py +++ b/mayan/apps/control_codes/icons.py @@ -1,17 +1,29 @@ 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='qrcode') -icon_control_code_create = Icon( - driver_name='fontawesome-dual', primary_symbol='qrcode', - secondary_symbol='plus' +icon_control_sheet = Icon( + driver_name='fontawesome-layers', data=[ + {'class': 'far fa-file ', 'transform': 'grow-4'}, + {'class': 'fas fa-barcode', 'transform': 'shrink-6'}, + ], + # shadow_class='far fa-file', ) -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') +icon_control_sheet_create = Icon( + driver_name='fontawesome-layers', data=[ + {'class': 'far fa-file ', 'transform': 'grow-4'}, + {'class': 'fas fa-barcode', 'transform': 'shrink-6'}, + {'class': 'far fa-circle', 'transform': 'down-5 right-10'}, + {'class': 'fas fa-plus', 'transform': 'shrink-4 down-5 right-10'}, + ], +) +icon_control_sheet_delete = Icon(driver_name='fontawesome', symbol='times') +icon_control_sheet_edit = Icon(driver_name='fontawesome', symbol='pencil-alt') +icon_control_sheet_list = icon_control_sheet +icon_control_sheet_preview = Icon(driver_name='fontawesome', symbol='eye') +icon_control_sheet_print = Icon(driver_name='fontawesome', symbol='print') + +icon_control_sheet_code = Icon(driver_name='fontawesome', symbol='qrcode') icon_control_sheet_code_delete = Icon( driver_name='fontawesome', symbol='times' ) @@ -21,3 +33,7 @@ icon_control_sheet_code_edit = Icon( icon_control_sheet_code_list = Icon( driver_name='fontawesome', symbol='qrcode' ) +icon_control_sheet_code_select = Icon( + driver_name='fontawesome-dual', primary_symbol='qrcode', + secondary_symbol='plus' +) diff --git a/mayan/apps/control_codes/links.py b/mayan/apps/control_codes/links.py index 136ebc7048..6578086b29 100644 --- a/mayan/apps/control_codes/links.py +++ b/mayan/apps/control_codes/links.py @@ -2,43 +2,53 @@ from __future__ import unicode_literals from django.utils.translation import ugettext_lazy as _ -from mayan.apps.documents.permissions import permission_document_type_edit from mayan.apps.navigation.classes import Link -from .icons import icon_control_code from .permissions import ( permission_control_sheet_create, permission_control_sheet_delete, permission_control_sheet_edit, permission_control_sheet_view, ) link_control_sheet_create = Link( - icon_class_path='mayan.apps.control_codes.icons.icon_control_code_create', + icon_class_path='mayan.apps.control_codes.icons.icon_control_sheet_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', + icon_class_path='mayan.apps.control_codes.icons.icon_control_sheet_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', + icon_class_path='mayan.apps.control_codes.icons.icon_control_sheet_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', + icon_class_path='mayan.apps.control_codes.icons.icon_control_sheet_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', + icon_class_path='mayan.apps.control_codes.icons.icon_control_sheet_preview', kwargs={'control_sheet_id': 'resolved_object.pk'}, text=_('Preview'), permissions=(permission_control_sheet_view,), view='control_codes:control_sheet_preview' ) +link_control_sheet_print = Link( + icon_class_path='mayan.apps.control_codes.icons.icon_control_sheet_print', + kwargs={'control_sheet_id': 'resolved_object.pk'}, + text=_('Print'), permissions=(permission_control_sheet_view,), + view='control_codes:control_sheet_print' +) +link_control_sheet_code_select = Link( + icon_class_path='mayan.apps.control_codes.icons.icon_control_sheet_code_select', + kwargs={'control_sheet_id': 'control_sheet.pk'}, text=_('Add new code'), + permissions=(permission_control_sheet_edit,), + view='control_codes:control_sheet_code_select' +) link_control_sheet_code_delete = Link( icon_class_path='mayan.apps.control_codes.icons.icon_control_sheet_code_delete', kwargs={ diff --git a/mayan/apps/control_codes/methods.py b/mayan/apps/control_codes/methods.py index 8103489075..bcc464a0c7 100644 --- a/mayan/apps/control_codes/methods.py +++ b/mayan/apps/control_codes/methods.py @@ -1,7 +1,5 @@ from __future__ import unicode_literals -from django.utils.translation import ugettext_lazy as _ - from .tasks import task_process_document_version diff --git a/mayan/apps/control_codes/models.py b/mayan/apps/control_codes/models.py index 1bd98ab943..de64c51573 100644 --- a/mayan/apps/control_codes/models.py +++ b/mayan/apps/control_codes/models.py @@ -1,15 +1,11 @@ from __future__ import unicode_literals import hashlib -import json import logging from furl import furl from django.apps import apps -from django.conf import settings -from django.contrib.contenttypes.fields import GenericForeignKey -from django.contrib.contenttypes.models import ContentType from django.core import serializers from django.db import models from django.db.models import Max @@ -32,9 +28,15 @@ logger = logging.getLogger(__name__) @python_2_unicode_compatible class ControlSheet(models.Model): label = models.CharField( + help_text=_('Short text to describe the control sheet.'), max_length=196, unique=True, verbose_name=_('Label') ) + class Meta: + ordering = ('label',) + verbose_name = _('Control sheet') + verbose_name_plural = _('Control sheets') + def __str__(self): return self.label @@ -45,10 +47,10 @@ class ControlSheet(models.Model): } ) - class Meta: - ordering = ('label',) - verbose_name = _('Control sheet') - verbose_name_plural = _('Control sheets') + +class ControlSheetCodeBusinessLogicManager(models.Manager): + def enabled(self): + return self.filter(enabled=True) @python_2_unicode_compatible @@ -59,8 +61,8 @@ class ControlSheetCode(models.Model): ) order = models.PositiveIntegerField( blank=True, db_index=True, default=0, help_text=_( - 'Order in which the control codes will be interpreted. If left ' - 'unchanged, an automatic order value will be assigned.' + 'Order in which the control sheet codes will be interpreted. ' + 'If left unchanged, an automatic order value will be assigned.' ), verbose_name=_('Order') ) name = models.CharField( @@ -69,12 +71,15 @@ class ControlSheetCode(models.Model): ) arguments = models.TextField( blank=True, help_text=_( - 'The arguments for the control code as a YAML ' + 'The arguments for the control sheet code as a YAML ' 'dictionary.' ), validators=[YAMLValidator()], verbose_name=_('Arguments') ) enabled = models.BooleanField(default=True, verbose_name=_('Enabled')) + business_logic = ControlSheetCodeBusinessLogicManager() + objects = models.Manager() + class Meta: ordering = ('order',) verbose_name = _('Control sheet code') @@ -97,7 +102,7 @@ class ControlSheetCode(models.Model): def delete(self, *args, **kwargs): self.cache_partition.delete() - return super(Workflow, self).delete(*args, **kwargs) + return super(ControlSheetCode, self).delete(*args, **kwargs) def generate_image(self): cache_filename = '{}'.format(self.get_hash()) diff --git a/mayan/apps/control_codes/serializers.py b/mayan/apps/control_codes/serializers.py index 63b4892c3c..51898cef84 100644 --- a/mayan/apps/control_codes/serializers.py +++ b/mayan/apps/control_codes/serializers.py @@ -1,25 +1,17 @@ from __future__ import unicode_literals -from django.core.exceptions import ValidationError as DjangoValidationError -from django.utils.translation import ugettext_lazy as _ - from rest_framework import serializers -from rest_framework.exceptions import ValidationError -from rest_framework.reverse import reverse -from mayan.apps.documents.models import DocumentType from mayan.apps.documents.serializers import DocumentTypeSerializer from mayan.apps.rest_api.relations import ( FilteredPrimaryKeyRelatedField, MultiKwargHyperlinkedIdentityField ) -from mayan.apps.user_management.serializers import UserSerializer from .models import ControlSheet, ControlSheetCode class ControlSheetSerializer(serializers.HyperlinkedModelSerializer): - #states = ControlSheetStateSerializer(many=True, required=False) - + #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/templates/control_codes/control_sheet_content.html b/mayan/apps/control_codes/templates/control_codes/control_sheet_content.html new file mode 100644 index 0000000000..03e1ea589b --- /dev/null +++ b/mayan/apps/control_codes/templates/control_codes/control_sheet_content.html @@ -0,0 +1,9 @@ +
{{ code.get_label }}
+{{ code.get_label }}
-