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 @@ + + diff --git a/mayan/apps/control_codes/templates/control_codes/control_sheet_preview.html b/mayan/apps/control_codes/templates/control_codes/control_sheet_preview.html new file mode 100644 index 0000000000..672f642417 --- /dev/null +++ b/mayan/apps/control_codes/templates/control_codes/control_sheet_preview.html @@ -0,0 +1,5 @@ +{% extends 'appearance/base.html' %} + +{% block content %} + {% include 'control_codes/control_sheet_content.html' %} +{% endblock %} 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 2c9b48befa..8a408c5ed0 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 @@ -25,12 +25,5 @@

{{ title }}

- + {% include 'control_codes/control_sheet_content.html' %} {% endblock %} diff --git a/mayan/apps/control_codes/templates/control_codes/forms/widgets/control_sheet_code_image.html b/mayan/apps/control_codes/templates/control_codes/forms/widgets/control_sheet_code_image.html deleted file mode 100644 index 6aa520bc92..0000000000 --- a/mayan/apps/control_codes/templates/control_codes/forms/widgets/control_sheet_code_image.html +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/mayan/apps/control_codes/tests/literals.py b/mayan/apps/control_codes/tests/literals.py index 76232389bc..baffc48825 100644 --- a/mayan/apps/control_codes/tests/literals.py +++ b/mayan/apps/control_codes/tests/literals.py @@ -1,2 +1 @@ from __future__ import unicode_literals - diff --git a/mayan/apps/control_codes/tests/mixins.py b/mayan/apps/control_codes/tests/mixins.py index 3b5ac19ca6..baffc48825 100644 --- a/mayan/apps/control_codes/tests/mixins.py +++ b/mayan/apps/control_codes/tests/mixins.py @@ -1,5 +1 @@ from __future__ import unicode_literals - - - - diff --git a/mayan/apps/control_codes/urls.py b/mayan/apps/control_codes/urls.py index 668c2491d9..2b52d2aabb 100644 --- a/mayan/apps/control_codes/urls.py +++ b/mayan/apps/control_codes/urls.py @@ -9,9 +9,10 @@ from .api_views import ( ) from .views import ( ControlSheetCreateView, ControlSheetDeleteView, ControlSheetEditView, - ControlSheetListView, ControlSheetPreviewView, - - ControlSheetCodeDeleteView, ControlSheetCodeEditView, ControlSheetCodeListView + ControlSheetListView, ControlSheetPreviewView, ControlSheetPrintView, + ControlSheetCodeCreate, ControlSheetCodeDeleteView, + ControlSheetCodeEditView, ControlSheetCodeListView, + ControlSheetCodeSelectView ) urlpatterns = [ @@ -27,6 +28,14 @@ urlpatterns = [ regex=r'^control_sheets/(?P\d+)/codes/$', view=ControlSheetCodeListView.as_view(), name='control_sheet_code_list' ), + url( + regex=r'^control_sheets/(?P\d+)/codes/select/$', + view=ControlSheetCodeSelectView.as_view(), name='control_sheet_code_select' + ), + url( + regex=r'^control_sheets/(?P\d+)/codes/(?P[-_\w]+)/create/$', + view=ControlSheetCodeCreate.as_view(), name='control_sheet_code_create' + ), url( regex=r'^control_sheets/(?P\d+)/codes/(?P\d+)/edit/$', view=ControlSheetCodeEditView.as_view(), name='control_sheet_code_edit' @@ -47,6 +56,10 @@ urlpatterns = [ regex=r'^control_sheets/(?P\d+)/preview/$', view=ControlSheetPreviewView.as_view(), name='control_sheet_preview' ), + url( + regex=r'^control_sheets/(?P\d+)/print/$', + view=ControlSheetPrintView.as_view(), name='control_sheet_print' + ), ] api_urls = [ diff --git a/mayan/apps/control_codes/views.py b/mayan/apps/control_codes/views.py index 52c08f5756..67081406df 100644 --- a/mayan/apps/control_codes/views.py +++ b/mayan/apps/control_codes/views.py @@ -8,13 +8,15 @@ from django.urls import reverse from django.utils.translation import ugettext_lazy as _ from mayan.apps.common.generics import ( - FormView, SimpleView, SingleObjectCreateView, SingleObjectDeleteView, + FormView, SingleObjectCreateView, SingleObjectDeleteView, SingleObjectDetailView, SingleObjectEditView, SingleObjectListView ) from mayan.apps.common.mixins import ExternalObjectMixin +from .classes import ControlCode from .forms import ControlSheetCodeClassSelectionForm, ControlSheetCodeForm -from .links import link_control_sheet_create +from .icons import icon_control_sheet, icon_control_sheet_code +from .links import link_control_sheet_create, link_control_sheet_code_select from .models import ControlSheet from .permissions import ( permission_control_sheet_create, permission_control_sheet_delete, @@ -26,18 +28,13 @@ logger = logging.getLogger(__name__) class ControlSheetCreateView(SingleObjectCreateView): fields = ('label',) - model = ControlSheet object_permission = permission_control_sheet_create - #template_name = 'control_codes/control_sheet_print.html' - #def get_extra_context(self): - # return { - # 'object': self.object, - # 'title': _( - # 'Control sheet: %s' - # ) % self.object - # } + def get_extra_context(self): + return { + 'title': _('Create new control sheet') + } class ControlSheetDeleteView(SingleObjectDeleteView): @@ -76,16 +73,15 @@ class ControlSheetListView(SingleObjectListView): def get_extra_context(self): return { 'hide_object': True, - #'no_results_icon': self.layer.get_icon(), + 'no_results_icon': icon_control_sheet, 'no_results_main_link': link_control_sheet_create.resolve( - context=RequestContext( - request=self.request, #dict_={ - #'resolved_object': self.external_object, - #'layer_name': self.kwargs['layer_name'], - #} - ) + context=RequestContext(request=self.request,) + ), + 'no_results_text': _( + 'Control sheets contain barcodes that are scanned together ' + 'with the document to automate how that document will be ' + 'processed.' ), - #'no_results_text': self.layer.get_empty_results_text(), 'no_results_title': _('There are no control sheets'), 'title': _('Control sheets') } @@ -96,6 +92,18 @@ class ControlSheetPreviewView(SingleObjectDetailView): pk_url_kwarg = 'control_sheet_id' model = ControlSheet object_permission = permission_control_sheet_view + template_name = 'control_codes/control_sheet_preview.html' + + def get_extra_context(self): + return { + 'object': self.object, + 'title': _( + 'Preview of control sheet: %s' + ) % self.object + } + + +class ControlSheetPrintView(ControlSheetPreviewView): template_name = 'control_codes/control_sheet_print.html' def get_extra_context(self): @@ -107,6 +115,51 @@ class ControlSheetPreviewView(SingleObjectDetailView): } +class ControlSheetCodeCreate(ExternalObjectMixin, SingleObjectCreateView): + external_object_class = ControlSheet + external_object_permission = permission_control_sheet_edit + external_object_pk_url_kwarg = 'control_sheet_id' + form_class = ControlSheetCodeForm + + def form_valid(self, form): + instance = form.save(commit=False) + instance.control_sheet = self.external_object + instance.name = self.kwargs['control_code_class_name'] + try: + instance.full_clean() + instance.save() + except Exception as exception: + logger.debug('Invalid form, exception: %s', exception) + return super(ControlSheetCodeCreate, self).form_invalid(form) + else: + return super(ControlSheetCodeCreate, self).form_valid(form) + + def get_extra_context(self): + return { + 'control_sheet': self.external_object, + 'navigation_object_list': ('control_sheet',), + 'title': _( + 'Create code "%(control_code)s" for: %(control_sheet)s' + ) % { + 'control_code': self.get_control_code_class(), + 'control_sheet': self.external_object, + } + } + + def get_post_action_redirect(self): + return reverse( + viewname='control_codes:control_sheet_code_list', kwargs={ + 'control_sheet_id': self.external_object.pk, + } + ) + + def get_source_queryset(self): + return self.external_object.codes.all() + + def get_control_code_class(self): + return ControlCode.get(name=self.kwargs['control_code_class_name']) + + class ControlSheetCodeDeleteView(ExternalObjectMixin, SingleObjectDeleteView): form_class = ControlSheetCodeForm external_object_class = ControlSheet @@ -157,7 +210,19 @@ class ControlSheetCodeListView(ExternalObjectMixin, SingleObjectListView): 'control_sheet': self.external_object, 'hide_object': True, 'navigation_object_list': ('control_sheet',), - #'object': self.external_object, + 'no_results_icon': icon_control_sheet_code, + 'no_results_main_link': link_control_sheet_code_select.resolve( + context=RequestContext( + request=self.request, dict_={ + 'control_sheet': self.external_object, + } + ) + ), + 'no_results_text': _( + 'Control sheet codes are barcodes that trigger a specific ' + 'process when they are scanned.' + ), + 'no_results_title': _('There are no control sheet codes'), 'title': _('Codes of control sheet: %s') % self.external_object, } @@ -165,238 +230,21 @@ class ControlSheetCodeListView(ExternalObjectMixin, SingleObjectListView): return self.external_object.codes.all() - -""" -class TransformationCreateView( - LayerViewMixin, ExternalContentTypeObjectMixin, SingleObjectCreateView -): - form_class = LayerTransformationForm - - def form_valid(self, form): - layer = self.layer - content_type = self.get_content_type() - object_layer, created = ObjectLayer.objects.get_or_create( - content_type=content_type, object_id=self.external_object.pk, - stored_layer=layer.stored_layer - ) - - instance = form.save(commit=False) - instance.content_object = self.external_object - instance.name = self.kwargs['transformation_name'] - instance.object_layer = object_layer - try: - instance.full_clean() - instance.save() - except Exception as exception: - logger.debug('Invalid form, exception: %s', exception) - return super(TransformationCreateView, self).form_invalid(form) - else: - return super(TransformationCreateView, self).form_valid(form) - - def get_extra_context(self): - return { - 'content_object': self.external_object, - 'form_field_css_classes': 'hidden' if hasattr( - self.get_transformation_class(), 'template_name' - ) else '', - 'layer': self.layer, - 'layer_name': self.layer.name, - 'navigation_object_list': ('content_object',), - 'title': _( - 'Create layer "%(layer)s" transformation ' - '"%(transformation)s" for: %(object)s' - ) % { - 'layer': self.layer, - 'transformation': self.get_transformation_class(), - 'object': self.external_object, - } - } - - def get_form_extra_kwargs(self): - return { - 'transformation_name': self.kwargs['transformation_name'] - } - - def get_external_object_permission(self): - return self.layer.permissions.get('create', None) - - def get_post_action_redirect(self): - return reverse( - viewname='converter:transformation_list', kwargs={ - 'app_label': self.kwargs['app_label'], - 'model': self.kwargs['model'], - 'object_id': self.kwargs['object_id'], - 'layer_name': self.kwargs['layer_name'] - } - ) - - def get_queryset(self): - return self.layer.get_transformations_for( - obj=self.content_object - ) - - def get_template_names(self): - return [ - getattr( - self.get_transformation_class(), 'template_name', - self.template_name - ) - ] - - def get_transformation_class(self): - return BaseTransformation.get(name=self.kwargs['transformation_name']) - - -class TransformationDeleteView(LayerViewMixin, SingleObjectDeleteView): - model = LayerTransformation - - def get_extra_context(self): - return { - 'content_object': self.object.object_layer.content_object, - 'layer_name': self.layer.name, - 'navigation_object_list': ('content_object', 'transformation'), - 'previous': reverse( - viewname='converter:transformation_list', kwargs={ - 'app_label': self.object.object_layer.content_type.app_label, - 'model': self.object.object_layer.content_type.model, - 'object_id': self.object.object_layer.object_id, - 'layer_name': self.object.object_layer.stored_layer.name - } - ), - 'title': _( - 'Delete transformation "%(transformation)s" for: ' - '%(content_object)s?' - ) % { - 'transformation': self.object, - 'content_object': self.object.object_layer.content_object - }, - 'transformation': self.object, - } - - def get_object_permission(self): - return self.layer.permissions.get('delete', None) - - def get_post_action_redirect(self): - return reverse( - viewname='converter:transformation_list', kwargs={ - 'app_label': self.object.object_layer.content_type.app_label, - 'model': self.object.object_layer.content_type.model, - 'object_id': self.object.object_layer.object_id, - 'layer_name': self.object.object_layer.stored_layer.name - } - ) - - -class TransformationEditView(LayerViewMixin, SingleObjectEditView): - form_class = LayerTransformationForm - model = LayerTransformation - - def form_valid(self, form): - instance = form.save(commit=False) - try: - instance.full_clean() - instance.save() - except Exception as exception: - logger.debug('Invalid form, exception: %s', exception) - return super(TransformationEditView, self).form_invalid(form=form) - else: - return super(TransformationEditView, self).form_valid(form=form) - - def get_extra_context(self): - return { - 'content_object': self.object.object_layer.content_object, - 'form_field_css_classes': 'hidden' if hasattr( - self.object.get_transformation_class(), 'template_name' - ) else '', - 'layer': self.layer, - 'layer_name': self.layer.name, - 'navigation_object_list': ('content_object', 'transformation'), - 'title': _( - 'Edit transformation "%(transformation)s" ' - 'for: %(content_object)s' - ) % { - 'transformation': self.object, - 'content_object': self.object.object_layer.content_object - }, - 'transformation': self.object, - } - - def get_object_permission(self): - return self.layer.permissions.get('edit', None) - - def get_post_action_redirect(self): - return reverse( - viewname='converter:transformation_list', kwargs={ - 'app_label': self.object.object_layer.content_type.app_label, - 'model': self.object.object_layer.content_type.model, - 'object_id': self.object.object_layer.object_id, - 'layer_name': self.object.object_layer.stored_layer.name - } - ) - - def get_template_names(self): - return [ - getattr( - self.object.get_transformation_class(), 'template_name', - self.template_name - ) - ] - - -class TransformationListView( - LayerViewMixin, ExternalContentTypeObjectMixin, SingleObjectListView -): - def get_external_object_permission(self): - return self.layer.permissions.get('view', None) - - def get_extra_context(self): - return { - 'object': self.external_object, - 'hide_link': True, - 'hide_object': True, - 'layer_name': self.layer.name, - 'no_results_icon': self.layer.get_icon(), - 'no_results_main_link': link_transformation_select.resolve( - context=RequestContext( - request=self.request, dict_={ - 'resolved_object': self.external_object, - 'layer_name': self.kwargs['layer_name'], - } - ) - ), - 'no_results_text': self.layer.get_empty_results_text(), - 'no_results_title': _( - 'There are no entries for layer "%(layer_name)s"' - ) % {'layer_name': self.layer.label}, - 'title': _( - 'Layer "%(layer)s" transformations for: %(object)s' - ) % { - 'layer': self.layer, - 'object': self.external_object, - } - } - - def get_source_queryset(self): - return self.layer.get_transformations_for(obj=self.external_object) - - -class TransformationSelectView( - ExternalContentTypeObjectMixin, LayerViewMixin, FormView -): - form_class = LayerTransformationSelectForm +class ControlSheetCodeSelectView(ExternalObjectMixin, FormView): + external_object_class = ControlSheet + external_object_permission = permission_control_sheet_edit + external_object_pk_url_kwarg = 'control_sheet_id' + form_class = ControlSheetCodeClassSelectionForm template_name = 'appearance/generic_form.html' def form_valid(self, form): return HttpResponseRedirect( redirect_to=reverse( - viewname='converter:transformation_create', + viewname='control_codes:control_sheet_code_create', kwargs={ - 'app_label': self.kwargs['app_label'], - 'model': self.kwargs['model'], - 'object_id': self.kwargs['object_id'], - 'layer_name': self.kwargs['layer_name'], - 'transformation_name': form.cleaned_data[ - 'transformation' + 'control_sheet_id': self.external_object.pk, + 'control_code_class_name': form.cleaned_data[ + 'control_code_class_name' ] } ) @@ -404,22 +252,13 @@ class TransformationSelectView( def get_extra_context(self): return { - 'layer': self.layer, - 'layer_name': self.kwargs['layer_name'], - 'navigation_object_list': ('content_object',), - 'content_object': self.external_object, + 'control_sheet': self.external_object, + 'navigation_object_list': ('control_sheet',), 'submit_label': _('Select'), 'title': _( - 'Select new layer "%(layer)s" transformation ' - 'for: %(object)s' + 'Select new control sheet code ' + 'for: %(control_sheet)s' ) % { - 'layer': self.layer, - 'object': self.external_object, + 'control_sheet': self.external_object, } } - - def get_form_extra_kwargs(self): - return { - 'layer': self.layer - } -""" diff --git a/mayan/apps/control_codes/widgets.py b/mayan/apps/control_codes/widgets.py deleted file mode 100644 index 1b97bcbd8a..0000000000 --- a/mayan/apps/control_codes/widgets.py +++ /dev/null @@ -1,12 +0,0 @@ -from __future__ import unicode_literals - -from django import forms - - -class ControlSheetCodeImageWidget(forms.widgets.Widget): - template_name = 'control_codes/forms/widgets/control_sheet_code_image.html' - - def format_value(self, value): - if value == '' or value is None: - return None - return value