Add permissions, setup views, icons
Signed-off-by: Roberto Rosario <roberto.rosario@mayan-edms.com>
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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'
|
||||
)
|
||||
|
||||
21
mayan/apps/control_codes/permissions.py
Normal file
21
mayan/apps/control_codes/permissions.py
Normal 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'
|
||||
)
|
||||
@@ -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'
|
||||
)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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 %}
|
||||
|
||||
@@ -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'
|
||||
),
|
||||
]
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user