Add permissions, setup views, icons

Signed-off-by: Roberto Rosario <roberto.rosario@mayan-edms.com>
This commit is contained in:
Roberto Rosario
2019-09-02 01:20:03 -04:00
parent 4ed36e0114
commit 8c6812203c
10 changed files with 287 additions and 92 deletions

View File

@@ -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

View File

@@ -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,

View File

@@ -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')

View File

@@ -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'
)

View File

@@ -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'
)

View File

@@ -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'
)

View File

@@ -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)

View File

@@ -5,18 +5,33 @@
{% block title %}{{ title }}{% endblock title %}
{% block content_plain %}
<p class="text-center">
Mayan EDMS control sheet: {{ object }}
</p>
<style>
.img-responsive {
display: block;
max-width: 100%;
height: auto;
}
.list-inline {
padding-left: 0;
list-style: none;
margin-left: -5px;
}
.text-center {
text-align: center;
}
.list-inline > li {
display: inline-block;
padding-right: 5px;
padding-left: 5px;
}
</style>
<h1 class="text-center">{{ title }}</h1>
<ul class="list-inline text-center">
{% for code in object.codes.all %}
<li class="list-inline-item">
<img
class="img-responsive"
src="{{ code.get_api_image_url }}"
style=""
/>
<img class="img-responsive" src="{{ code.get_api_image_url }}" />
<p>{{ code.get_display }}</p>
</li>
{% endfor %}

View File

@@ -7,12 +7,31 @@ from .api_views import (
APIControlSheetListView, APIControlSheetView,
APIControlSheetCodeImageView
)
from .views import ControlSheetDetailView
from .views import (
ControlSheetCreateView, ControlSheetDeleteView, ControlSheetEditView,
ControlSheetListView, ControlSheetPreviewView
)
urlpatterns = [
url(
regex=r'^control_sheets/(?P<control_sheet_id>\d+)/$',
view=ControlSheetDetailView.as_view(), name='control_sheet_detail'
regex=r'^control_sheets/$',
view=ControlSheetListView.as_view(), name='control_sheet_list'
),
url(
regex=r'^control_sheets/create/$',
view=ControlSheetCreateView.as_view(), name='control_sheet_create'
),
url(
regex=r'^control_sheets/(?P<control_sheet_id>\d+)/delete/$',
view=ControlSheetDeleteView.as_view(), name='control_sheet_delete'
),
url(
regex=r'^control_sheets/(?P<control_sheet_id>\d+)/edit/$',
view=ControlSheetEditView.as_view(), name='control_sheet_edit'
),
url(
regex=r'^control_sheets/(?P<control_sheet_id>\d+)/preview/$',
view=ControlSheetPreviewView.as_view(), name='control_sheet_preview'
),
]

View File

@@ -14,28 +14,100 @@ from mayan.apps.common.generics import (
from mayan.apps.common.mixins import ExternalContentTypeObjectMixin
from .forms import ControlCodeClassSelectionForm
#from .links import link_transformation_select
from .links import link_control_sheet_create
from .models import ControlSheet
#from .transformations import BaseTransformation
from .permissions import (
permission_control_sheet_create, permission_control_sheet_delete,
permission_control_sheet_edit, permission_control_sheet_view
)
logger = logging.getLogger(__name__)
class ControlSheetDetailView(SingleObjectDetailView):
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
# }
class ControlSheetDeleteView(SingleObjectDeleteView):
model = ControlSheet
object_permission = permission_control_sheet_delete
pk_url_kwarg = 'control_sheet_id'
def get_extra_context(self):
return {
'object': self.object,
'title': _(
'Delete control sheet: %s?'
) % self.object
}
class ControlSheetEditView(SingleObjectEditView):
fields = ('label',)
model = ControlSheet
object_permission = permission_control_sheet_edit
pk_url_kwarg = 'control_sheet_id'
def get_extra_context(self):
return {
'object': self.object,
'title': _(
'Edit control sheet: %s'
) % self.object
}
class ControlSheetListView(SingleObjectListView):
model = ControlSheet
object_permission = permission_control_sheet_view
def get_extra_context(self):
return {
'hide_object': True,
#'no_results_icon': self.layer.get_icon(),
'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'],
#}
)
),
#'no_results_text': self.layer.get_empty_results_text(),
'no_results_title': _('There are no control sheets'),
'title': _('Control sheets')
}
class ControlSheetPreviewView(SingleObjectDetailView):
fields = ('label',)
pk_url_kwarg = 'control_sheet_id'
model = ControlSheet
object_permission = permission_control_sheet_view
template_name = 'control_codes/control_sheet_print.html'
def get_extra_context(self):
return {
'object': self.object,
'title': _(
'Print preview for control sheet: %s'
'Control sheet: %s'
) % self.object
}
"""
class TransformationCreateView(
LayerViewMixin, ExternalContentTypeObjectMixin, SingleObjectCreateView