Code style cleanups

Add keyword arguments. Sort arguments and models.
Move literals to their own module. Prepend handler_ to
signal handlers.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
This commit is contained in:
Roberto Rosario
2019-04-26 03:32:35 -04:00
parent 20acc24c7f
commit 74c97314d7
160 changed files with 1029 additions and 972 deletions

View File

@@ -20,7 +20,7 @@ class ACLsApp(MayanAppConfig):
def ready(self): def ready(self):
super(ACLsApp, self).ready() super(ACLsApp, self).ready()
AccessControlList = self.get_model('AccessControlList') AccessControlList = self.get_model(model_name='AccessControlList')
SourceColumn( SourceColumn(
attribute='role', is_sortable=True, source=AccessControlList, attribute='role', is_sortable=True, source=AccessControlList,

View File

@@ -8,9 +8,9 @@ logger = logging.getLogger(__name__)
class ModelPermission(object): class ModelPermission(object):
_registry = {}
_proxies = {}
_inheritances = {} _inheritances = {}
_proxies = {}
_registry = {}
@classmethod @classmethod
def register(cls, model, permissions): def register(cls, model, permissions):
@@ -36,7 +36,7 @@ class ModelPermission(object):
if as_content_type: if as_content_type:
content_type_dictionary = ContentType.objects.get_for_models( content_type_dictionary = ContentType.objects.get_for_models(
*cls._registry.keys() models=cls._registry.keys()
) )
content_type_ids = [ content_type_ids = [
content_type.pk for content_type in content_type_dictionary.values() content_type.pk for content_type in content_type_dictionary.values()

View File

@@ -71,5 +71,5 @@ class AccessControlList(models.Model):
def get_inherited_permissions(self): def get_inherited_permissions(self):
return AccessControlList.objects.get_inherited_permissions( return AccessControlList.objects.get_inherited_permissions(
role=self.role, obj=self.content_object obj=self.content_object, role=self.role
) )

View File

@@ -4,11 +4,11 @@ from django.utils.translation import ugettext_lazy as _
from mayan.apps.permissions import PermissionNamespace from mayan.apps.permissions import PermissionNamespace
namespace = PermissionNamespace(name='acls', label=_('Access control lists')) namespace = PermissionNamespace(label=_('Access control lists'), name='acls')
permission_acl_edit = namespace.add_permission( permission_acl_edit = namespace.add_permission(
name='acl_edit', label=_('Edit ACLs') label=_('Edit ACLs'), name='acl_edit'
) )
permission_acl_view = namespace.add_permission( permission_acl_view = namespace.add_permission(
name='acl_view', label=_('View ACLs') label=_('View ACLs'), name='acl_view'
) )

View File

@@ -46,8 +46,8 @@ class ACLCreateView(SingleObjectCreateView):
raise Http404 raise Http404
AccessControlList.objects.check_access( AccessControlList.objects.check_access(
permissions=permission_acl_edit, user=request.user, obj=self.content_object, permissions=permission_acl_edit,
obj=self.content_object user=request.user
) )
return super(ACLCreateView, self).dispatch(request, *args, **kwargs) return super(ACLCreateView, self).dispatch(request, *args, **kwargs)
@@ -88,8 +88,8 @@ class ACLDeleteView(SingleObjectDeleteView):
acl = get_object_or_404(klass=AccessControlList, pk=self.kwargs['pk']) acl = get_object_or_404(klass=AccessControlList, pk=self.kwargs['pk'])
AccessControlList.objects.check_access( AccessControlList.objects.check_access(
permissions=permission_acl_edit, user=request.user, obj=acl.content_object, permissions=permission_acl_edit,
obj=acl.content_object user=request.user
) )
return super(ACLDeleteView, self).dispatch(request, *args, **kwargs) return super(ACLDeleteView, self).dispatch(request, *args, **kwargs)
@@ -126,8 +126,8 @@ class ACLListView(SingleObjectListView):
raise Http404 raise Http404
AccessControlList.objects.check_access( AccessControlList.objects.check_access(
permissions=permission_acl_view, user=request.user, obj=self.content_object, permissions=permission_acl_view,
obj=self.content_object user=request.user
) )
return super(ACLListView, self).dispatch(request, *args, **kwargs) return super(ACLListView, self).dispatch(request, *args, **kwargs)

View File

@@ -6,7 +6,8 @@ from mayan.apps.smart_settings import Namespace
from .literals import DEFAULT_MAXIMUM_TITLE_LENGTH from .literals import DEFAULT_MAXIMUM_TITLE_LENGTH
namespace = Namespace(name='appearance', label=_('Appearance')) namespace = Namespace(label=_('Appearance'), name='appearance')
setting_max_title_length = namespace.add_setting( setting_max_title_length = namespace.add_setting(
default=DEFAULT_MAXIMUM_TITLE_LENGTH, default=DEFAULT_MAXIMUM_TITLE_LENGTH,
global_name='APPEARANCE_MAXIMUM_TITLE_LENGTH', help_text=_( global_name='APPEARANCE_MAXIMUM_TITLE_LENGTH', help_text=_(

View File

@@ -25,8 +25,8 @@
<div class=""> <div class="">
<div class="row no-gutters"> <div class="row no-gutters">
<div class="col-xs-12"> <div class="col-xs-12">
{% check_sqlite as check_sqlite %} {% common_check_sqlite as check_sqlite %}
{% if check_sqlite %} {% if common_check_sqlite %}
<div class="alert alert-dismissible alert-warning"> <div class="alert alert-dismissible alert-warning">
<button type="button" class="close" data-dismiss="alert">&times;</button> <button type="button" class="close" data-dismiss="alert">&times;</button>
<p><strong>{% trans 'Warning' %}</strong> {{ check_sqlite }}</p> <p><strong>{% trans 'Warning' %}</strong> {{ check_sqlite }}</p>

View File

@@ -24,4 +24,4 @@ def get_form_media_js(form):
@register.simple_tag @register.simple_tag
def get_icon(icon_path): def get_icon(icon_path):
return import_string(icon_path).render() return import_string(dotted_path=icon_path).render()

View File

@@ -56,8 +56,10 @@ class EmailAuthenticationForm(forms.Form):
return self.cleaned_data return self.cleaned_data
def check_for_test_cookie(self): def check_for_test_cookie(self):
warnings.warn('check_for_test_cookie is deprecated; ensure your login ' warnings.warn(
'view is CSRF-protected.', DeprecationWarning) 'check_for_test_cookie is deprecated; ensure your login '
'view is CSRF-protected.', DeprecationWarning
)
def get_user_id(self): def get_user_id(self):
if self.user_cache: if self.user_cache:

View File

@@ -6,7 +6,7 @@ from mayan.apps.smart_settings import Namespace
from .literals import DEFAULT_LOGIN_METHOD, DEFAULT_MAXIMUM_SESSION_LENGTH from .literals import DEFAULT_LOGIN_METHOD, DEFAULT_MAXIMUM_SESSION_LENGTH
namespace = Namespace(name='authentication', label=_('Authentication')) namespace = Namespace(label=_('Authentication'), name='authentication')
setting_login_method = namespace.add_setting( setting_login_method = namespace.add_setting(
global_name='AUTHENTICATION_LOGIN_METHOD', default=DEFAULT_LOGIN_METHOD, global_name='AUTHENTICATION_LOGIN_METHOD', default=DEFAULT_LOGIN_METHOD,
help_text=_( help_text=_(

View File

@@ -48,8 +48,8 @@ class CabinetsApp(MayanAppConfig):
app_label='documents', model_name='Document' app_label='documents', model_name='Document'
) )
DocumentCabinet = self.get_model('DocumentCabinet') DocumentCabinet = self.get_model(model_name='DocumentCabinet')
Cabinet = self.get_model('Cabinet') Cabinet = self.get_model(model_name='Cabinet')
# Add explicit order_by as DocumentCabinet ordering Meta option has no # Add explicit order_by as DocumentCabinet ordering Meta option has no
# effect. # effect.

View File

@@ -4,7 +4,7 @@ from django.utils.translation import ugettext_lazy as _
from mayan.apps.events import EventTypeNamespace from mayan.apps.events import EventTypeNamespace
namespace = EventTypeNamespace(name='cabinets', label=_('Cabinets')) namespace = EventTypeNamespace(label=_('Cabinets'), name='cabinets')
event_cabinets_add_document = namespace.add_event_type( event_cabinets_add_document = namespace.add_event_type(
label=_('Document added to cabinet'), name='add_document' label=_('Document added to cabinet'), name='add_document'

View File

@@ -4,25 +4,25 @@ from django.utils.translation import ugettext_lazy as _
from mayan.apps.permissions import PermissionNamespace from mayan.apps.permissions import PermissionNamespace
namespace = PermissionNamespace(name='cabinets', label=_('Cabinets')) namespace = PermissionNamespace(label=_('Cabinets'), name='cabinets')
# Translators: this refers to the permission that will allow users to add # Translators: this refers to the permission that will allow users to add
# documents to cabinets. # documents to cabinets.
permission_cabinet_add_document = namespace.add_permission( permission_cabinet_add_document = namespace.add_permission(
name='cabinet_add_document', label=_('Add documents to cabinets') label=_('Add documents to cabinets'), name='cabinet_add_document'
) )
permission_cabinet_create = namespace.add_permission( permission_cabinet_create = namespace.add_permission(
name='cabinet_create', label=_('Create cabinets') label=_('Create cabinets'), name='cabinet_create'
) )
permission_cabinet_delete = namespace.add_permission( permission_cabinet_delete = namespace.add_permission(
name='cabinet_delete', label=_('Delete cabinets') label=_('Delete cabinets'), name='cabinet_delete'
) )
permission_cabinet_edit = namespace.add_permission( permission_cabinet_edit = namespace.add_permission(
name='cabinet_edit', label=_('Edit cabinets') label=_('Edit cabinets'), name='cabinet_edit'
) )
permission_cabinet_remove_document = namespace.add_permission( permission_cabinet_remove_document = namespace.add_permission(
name='cabinet_remove_document', label=_('Remove documents from cabinets') label=_('Remove documents from cabinets'), name='cabinet_remove_document'
) )
permission_cabinet_view = namespace.add_permission( permission_cabinet_view = namespace.add_permission(
name='cabinet_view', label=_('View cabinets') label=_('View cabinets'), name='cabinet_view'
) )

View File

@@ -9,7 +9,7 @@ from .permissions import permission_cabinet_view
cabinet_search = SearchModel( cabinet_search = SearchModel(
app_label='cabinets', model_name='Cabinet', app_label='cabinets', model_name='Cabinet',
permission=permission_cabinet_view, permission=permission_cabinet_view,
serializer_string='mayan.apps.cabinets.serializers.CabinetSerializer' serializer_path='mayan.apps.cabinets.serializers.CabinetSerializer'
) )
cabinet_search.add_model_field( cabinet_search.add_model_field(

View File

@@ -41,9 +41,7 @@ class CabinetAPITestCase(CabinetTestMixin, BaseAPITestCase):
response = self._request_cabinet_create_api_view() response = self._request_cabinet_create_api_view()
self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertEqual(response.status_code, status.HTTP_201_CREATED)
cabinet = Cabinet.objects.first() cabinet = Cabinet.objects.first()
self.assertEqual(response.data['id'], cabinet.pk) self.assertEqual(response.data['id'], cabinet.pk)
self.assertEqual(response.data['label'], TEST_CABINET_LABEL) self.assertEqual(response.data['label'], TEST_CABINET_LABEL)
@@ -300,7 +298,8 @@ class CabinetDocumentAPITestCase(CabinetTestMixin, DocumentTestMixin, BaseAPITes
self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual( self.assertEqual(
response.data['results'][0]['uuid'], force_text(self.test_document.uuid) response.data['results'][0]['uuid'],
force_text(self.test_document.uuid)
) )
def test_cabinet_add_document_api_view(self): def test_cabinet_add_document_api_view(self):

View File

@@ -127,7 +127,9 @@ class CabinetDocumentViewTestCase(CabinetTestMixin, GenericDocumentViewTestCase)
def test_cabinet_add_document_view_with_access(self): def test_cabinet_add_document_view_with_access(self):
self._create_test_cabinet() self._create_test_cabinet()
self.grant_access(obj=self.test_cabinet, permission=permission_cabinet_view) self.grant_access(
obj=self.test_cabinet, permission=permission_cabinet_view
)
self.grant_access( self.grant_access(
obj=self.test_cabinet, permission=permission_cabinet_add_document obj=self.test_cabinet, permission=permission_cabinet_add_document
) )
@@ -147,7 +149,8 @@ class CabinetDocumentViewTestCase(CabinetTestMixin, GenericDocumentViewTestCase)
def _request_add_multiple_documents_to_cabinet(self): def _request_add_multiple_documents_to_cabinet(self):
return self.post( return self.post(
viewname='cabinets:document_multiple_cabinet_add', data={ viewname='cabinets:document_multiple_cabinet_add', data={
'id_list': (self.test_document.pk,), 'cabinets': self.test_cabinet.pk 'id_list': (self.test_document.pk,),
'cabinets': self.test_cabinet.pk
} }
) )
@@ -211,10 +214,12 @@ class CabinetDocumentViewTestCase(CabinetTestMixin, GenericDocumentViewTestCase)
self.test_cabinet.documents.add(self.test_document) self.test_cabinet.documents.add(self.test_document)
self.grant_access( self.grant_access(
obj=self.test_cabinet, permission=permission_cabinet_remove_document obj=self.test_cabinet,
permission=permission_cabinet_remove_document
) )
self.grant_access( self.grant_access(
obj=self.test_document, permission=permission_cabinet_remove_document obj=self.test_document,
permission=permission_cabinet_remove_document
) )
response = self._request_remove_document_from_cabinet() response = self._request_remove_document_from_cabinet()
@@ -236,7 +241,9 @@ class CabinetDocumentViewTestCase(CabinetTestMixin, GenericDocumentViewTestCase)
def test_cabinet_list_view_with_access(self): def test_cabinet_list_view_with_access(self):
self._create_test_cabinet() self._create_test_cabinet()
self.grant_access(obj=self.test_cabinet, permission=permission_cabinet_view) self.grant_access(
obj=self.test_cabinet, permission=permission_cabinet_view
)
response = self._request_cabinet_list() response = self._request_cabinet_list()
self.assertContains( self.assertContains(

View File

@@ -45,12 +45,14 @@ class CabinetDocumentUploadTestCase(CabinetTestMixin, GenericDocumentViewTestCas
def test_upload_interactive_view_with_access(self): def test_upload_interactive_view_with_access(self):
self._create_test_cabinet() self._create_test_cabinet()
self.grant_access( self.grant_access(
permission=permission_document_create, obj=self.document_type obj=self.document_type, permission=permission_document_create
) )
response = self._request_upload_interactive_document_create_view() response = self._request_upload_interactive_document_create_view()
self.assertEqual(response.status_code, 302) self.assertEqual(response.status_code, 302)
self.assertTrue(self.test_cabinet in Document.objects.first().cabinets.all()) self.assertTrue(
self.test_cabinet in Document.objects.first().cabinets.all()
)
def _request_wizard_view(self): def _request_wizard_view(self):
return self.get(viewname='sources:document_create_multiple') return self.get(viewname='sources:document_create_multiple')
@@ -64,5 +66,6 @@ class CabinetDocumentUploadTestCase(CabinetTestMixin, GenericDocumentViewTestCas
permission=permission_document_create, obj=self.document_type permission=permission_document_create, obj=self.document_type
) )
response = self._request_wizard_view() response = self._request_wizard_view()
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)

View File

@@ -36,7 +36,7 @@ logger = logging.getLogger(__name__)
class CabinetCreateView(SingleObjectCreateView): class CabinetCreateView(SingleObjectCreateView):
fields = ('label',) fields = ('label',)
model = Cabinet model = Cabinet
post_action_redirect = reverse_lazy('cabinets:cabinet_list') post_action_redirect = reverse_lazy(viewname='cabinets:cabinet_list')
view_permission = permission_cabinet_create view_permission = permission_cabinet_create
def get_extra_context(self): def get_extra_context(self):
@@ -57,14 +57,14 @@ class CabinetChildAddView(SingleObjectCreateView):
self.object.parent = self.get_object() self.object.parent = self.get_object()
self.object.save() self.object.save()
return super(CabinetChildAddView, self).form_valid(form) return super(CabinetChildAddView, self).form_valid(form=form)
def get_object(self, *args, **kwargs): def get_object(self, *args, **kwargs):
cabinet = super(CabinetChildAddView, self).get_object(*args, **kwargs) cabinet = super(CabinetChildAddView, self).get_object(*args, **kwargs)
AccessControlList.objects.check_access( AccessControlList.objects.check_access(
permissions=permission_cabinet_edit, user=self.request.user, obj=cabinet.get_root(), permissions=permission_cabinet_edit,
obj=cabinet.get_root() user=self.request.user
) )
return cabinet return cabinet
@@ -81,7 +81,7 @@ class CabinetChildAddView(SingleObjectCreateView):
class CabinetDeleteView(SingleObjectDeleteView): class CabinetDeleteView(SingleObjectDeleteView):
model = Cabinet model = Cabinet
object_permission = permission_cabinet_delete object_permission = permission_cabinet_delete
post_action_redirect = reverse_lazy('cabinets:cabinet_list') post_action_redirect = reverse_lazy(viewname='cabinets:cabinet_list')
def get_extra_context(self): def get_extra_context(self):
return { return {
@@ -95,8 +95,8 @@ class CabinetDetailView(DocumentListView):
def get_document_queryset(self): def get_document_queryset(self):
queryset = AccessControlList.objects.filter_by_access( queryset = AccessControlList.objects.filter_by_access(
permission=permission_document_view, user=self.request.user, permission=permission_document_view,
queryset=self.get_object().documents.all() queryset=self.get_object().documents.all(), user=self.request.user
) )
return queryset return queryset
@@ -142,8 +142,8 @@ class CabinetDetailView(DocumentListView):
permission_object = cabinet.get_root() permission_object = cabinet.get_root()
AccessControlList.objects.check_access( AccessControlList.objects.check_access(
permissions=permission_cabinet_view, user=self.request.user, obj=permission_object, permissions=permission_cabinet_view,
obj=permission_object user=self.request.user
) )
return cabinet return cabinet
@@ -153,7 +153,7 @@ class CabinetEditView(SingleObjectEditView):
fields = ('label',) fields = ('label',)
model = Cabinet model = Cabinet
object_permission = permission_cabinet_edit object_permission = permission_cabinet_edit
post_action_redirect = reverse_lazy('cabinets:cabinet_list') post_action_redirect = reverse_lazy(viewname='cabinets:cabinet_list')
def get_extra_context(self): def get_extra_context(self):
return { return {
@@ -193,8 +193,8 @@ class DocumentCabinetListView(CabinetListView):
self.document = get_object_or_404(klass=Document, pk=self.kwargs['pk']) self.document = get_object_or_404(klass=Document, pk=self.kwargs['pk'])
AccessControlList.objects.check_access( AccessControlList.objects.check_access(
permissions=permission_document_view, user=request.user, obj=self.document, permissions=permission_document_view,
obj=self.document user=request.user
) )
return super(DocumentCabinetListView, self).dispatch( return super(DocumentCabinetListView, self).dispatch(

View File

@@ -43,7 +43,8 @@ def widget_document_cabinets(document, user):
) )
cabinets = AccessControlList.objects.filter_by_access( cabinets = AccessControlList.objects.filter_by_access(
permission_cabinet_view, user, queryset=document.document_cabinets() permission_cabinet_view, queryset=document.document_cabinets(),
user=user
) )
return format_html_join( return format_html_join(

View File

@@ -57,12 +57,13 @@ class APICheckedoutDocumentView(generics.RetrieveDestroyAPIView):
def get_queryset(self): def get_queryset(self):
if self.request.method == 'GET': if self.request.method == 'GET':
filtered_documents = AccessControlList.objects.filter_by_access( filtered_documents = AccessControlList.objects.filter_by_access(
permission=permission_document_view, user=self.request.user, permission=permission_document_view,
queryset=DocumentCheckout.objects.checked_out_documents() queryset=DocumentCheckout.objects.checked_out_documents(),
user=self.request.user
) )
filtered_documents = AccessControlList.objects.filter_by_access( filtered_documents = AccessControlList.objects.filter_by_access(
permission=permission_document_check_out_detail_view, user=self.request.user, permission=permission_document_check_out_detail_view,
queryset=filtered_documents queryset=filtered_documents, user=self.request.user
) )
return DocumentCheckout.objects.filter( return DocumentCheckout.objects.filter(
@@ -78,13 +79,13 @@ class APICheckedoutDocumentView(generics.RetrieveDestroyAPIView):
if document.checkout_info().user == request.user: if document.checkout_info().user == request.user:
AccessControlList.objects.check_access( AccessControlList.objects.check_access(
permissions=permission_document_check_in, user=request.user, obj=document, permissions=permission_document_check_in,
obj=document user=request.user
) )
else: else:
AccessControlList.objects.check_access( AccessControlList.objects.check_access(
permissions=permission_document_check_in_override, obj=document, permissions=permission_document_check_in_override,
user=request.user, obj=document user=request.user
) )
return super( return super(

View File

@@ -20,7 +20,7 @@ from .events import (
event_document_auto_check_in, event_document_check_in, event_document_auto_check_in, event_document_check_in,
event_document_check_out, event_document_forceful_check_in event_document_check_out, event_document_forceful_check_in
) )
from .handlers import check_new_version_creation from .handlers import handler_check_new_version_creation
from .links import ( from .links import (
link_check_in_document, link_check_out_document, link_check_out_info, link_check_in_document, link_check_out_document, link_check_out_info,
link_check_out_list link_check_out_list
@@ -114,7 +114,9 @@ class CheckoutsApp(MayanAppConfig):
widget=DashboardWidgetTotalCheckouts, order=-1 widget=DashboardWidgetTotalCheckouts, order=-1
) )
menu_facet.bind_links(links=(link_check_out_info,), sources=(Document,)) menu_facet.bind_links(
links=(link_check_out_info,), sources=(Document,)
)
menu_main.bind_links(links=(link_check_out_list,), position=98) menu_main.bind_links(links=(link_check_out_list,), position=98)
menu_secondary.bind_links( menu_secondary.bind_links(
links=(link_check_out_document, link_check_in_document), links=(link_check_out_document, link_check_in_document),
@@ -125,7 +127,7 @@ class CheckoutsApp(MayanAppConfig):
) )
pre_save.connect( pre_save.connect(
check_new_version_creation, dispatch_uid='checkouts_handler_check_new_version_creation',
dispatch_uid='check_new_version_creation', receiver=handler_check_new_version_creation,
sender=DocumentVersion sender=DocumentVersion
) )

View File

@@ -14,7 +14,7 @@ from .permissions import permission_document_check_out_detail_view
class DashboardWidgetTotalCheckouts(DashboardWidgetNumeric): class DashboardWidgetTotalCheckouts(DashboardWidgetNumeric):
icon_class = icon_dashboard_check_outs icon_class = icon_dashboard_check_outs
label = _('Checked out documents') label = _('Checked out documents')
link = reverse_lazy('checkouts:check_out_list') link = reverse_lazy(viewname='checkouts:check_out_list')
def render(self, request): def render(self, request):
AccessControlList = apps.get_model( AccessControlList = apps.get_model(

View File

@@ -4,19 +4,19 @@ from django.utils.translation import ugettext_lazy as _
from mayan.apps.events import EventTypeNamespace from mayan.apps.events import EventTypeNamespace
namespace = EventTypeNamespace(name='checkouts', label=_('Checkouts')) namespace = EventTypeNamespace(label=_('Checkouts'), name='checkouts')
event_document_auto_check_in = namespace.add_event_type( event_document_auto_check_in = namespace.add_event_type(
name='document_auto_check_in', label=_('Document automatically checked in'),
label=_('Document automatically checked in') name='document_auto_check_in'
) )
event_document_check_in = namespace.add_event_type( event_document_check_in = namespace.add_event_type(
name='document_check_in', label=_('Document checked in') label=_('Document checked in'), name='document_check_in'
) )
event_document_check_out = namespace.add_event_type( event_document_check_out = namespace.add_event_type(
name='document_check_out', label=_('Document checked out') label=_('Document checked out'), name='document_check_out'
) )
event_document_forceful_check_in = namespace.add_event_type( event_document_forceful_check_in = namespace.add_event_type(
name='document_forceful_check_in', label=_('Document forcefully checked in'),
label=_('Document forcefully checked in') name='document_forceful_check_in'
) )

View File

@@ -5,7 +5,7 @@ from django.apps import apps
from .exceptions import NewDocumentVersionNotAllowed from .exceptions import NewDocumentVersionNotAllowed
def check_new_version_creation(sender, instance, **kwargs): def handler_check_new_version_creation(sender, instance, **kwargs):
""" """
Make sure that new version creation is allowed for this document Make sure that new version creation is allowed for this document
""" """

View File

@@ -66,11 +66,15 @@ class DocumentCheckout(models.Model):
def delete(self, *args, **kwargs): def delete(self, *args, **kwargs):
# TODO: enclose in transaction # TODO: enclose in transaction
NewVersionBlock.objects.unblock(self.document) NewVersionBlock.objects.unblock(document=self.document)
super(DocumentCheckout, self).delete(*args, **kwargs) super(DocumentCheckout, self).delete(*args, **kwargs)
def get_absolute_url(self): def get_absolute_url(self):
return reverse('checkout:checkout_info', args=(self.document.pk,)) return reverse(
viewname='checkout:checkout_info', kwargs={
'pk': self.document.pk
}
)
def natural_key(self): def natural_key(self):
return self.document.natural_key() return self.document.natural_key()

View File

@@ -4,17 +4,17 @@ from django.utils.translation import ugettext_lazy as _
from mayan.apps.permissions import PermissionNamespace from mayan.apps.permissions import PermissionNamespace
namespace = PermissionNamespace(name='checkouts', label=_('Document checkout')) namespace = PermissionNamespace(label=_('Document checkout'), name='checkouts')
permission_document_check_in = namespace.add_permission( permission_document_check_in = namespace.add_permission(
name='checkin_document', label=_('Check in documents') label=_('Check in documents'), name='checkin_document'
) )
permission_document_check_in_override = namespace.add_permission( permission_document_check_in_override = namespace.add_permission(
name='checkin_document_override', label=_('Forcefully check in documents') label=_('Forcefully check in documents'), name='checkin_document_override'
) )
permission_document_check_out = namespace.add_permission( permission_document_check_out = namespace.add_permission(
name='checkout_document', label=_('Check out documents') label=_('Check out documents'), name='checkout_document'
) )
permission_document_check_out_detail_view = namespace.add_permission( permission_document_check_out_detail_view = namespace.add_permission(
name='checkout_detail_view', label=_('Check out details view') label=_('Check out details view'), name='checkout_detail_view'
) )

View File

@@ -5,9 +5,9 @@ from django.utils.translation import ugettext_lazy as _
from mayan.apps.task_manager.classes import CeleryQueue from mayan.apps.task_manager.classes import CeleryQueue
queue_checkouts_periodic = CeleryQueue( queue_checkouts_periodic = CeleryQueue(
name='checkouts_periodic', label=_('Checkouts periodic'), transient=True label=_('Checkouts periodic'), name='checkouts_periodic', transient=True
) )
queue_checkouts_periodic.add_task_type( queue_checkouts_periodic.add_task_type(
name='mayan.apps.task_check_expired_check_outs', label=_('Check expired checkouts'),
label=_('Check expired checkouts') name='mayan.apps.task_check_expired_check_outs'
) )

View File

@@ -42,8 +42,8 @@ class NewDocumentCheckoutSerializer(serializers.ModelSerializer):
document = Document.objects.get(pk=validated_data.pop('document_pk')) document = Document.objects.get(pk=validated_data.pop('document_pk'))
AccessControlList.objects.check_access( AccessControlList.objects.check_access(
permissions=permission_document_check_out, obj=document, permissions=permission_document_check_out,
user=self.context['request'].user, obj=document user=self.context['request'].user
) )
validated_data['document'] = document validated_data['document'] = document

View File

@@ -19,7 +19,7 @@ def task_check_expired_check_outs():
app_label='checkouts', model_name='DocumentCheckout' app_label='checkouts', model_name='DocumentCheckout'
) )
logger.debug('executing...') logger.debug(msg='executing...')
lock_id = 'task_expired_check_outs' lock_id = 'task_expired_check_outs'
try: try:
logger.debug('trying to acquire lock: %s', lock_id) logger.debug('trying to acquire lock: %s', lock_id)
@@ -30,4 +30,4 @@ def task_check_expired_check_outs():
DocumentCheckout.objects.check_in_expired_check_outs() DocumentCheckout.objects.check_in_expired_check_outs()
lock.release() lock.release()
except LockError: except LockError:
logger.debug('unable to obtain lock') logger.debug(msg='unable to obtain lock')

View File

@@ -19,7 +19,7 @@ class DocumentCheckoutTestMixin(object):
) )
self.test_check_out = DocumentCheckout.objects.check_out_document( self.test_check_out = DocumentCheckout.objects.check_out_document(
document=self.test_document, block_new_version=True, document=self.test_document,
expiration_datetime=self._check_out_expiration_datetime, expiration_datetime=self._check_out_expiration_datetime,
block_new_version=True, user=user user=user
) )

View File

@@ -16,8 +16,6 @@ from .mixins import DocumentCheckoutTestMixin
class DocumentCheckoutTestCase(DocumentCheckoutTestMixin, GenericDocumentTestCase): class DocumentCheckoutTestCase(DocumentCheckoutTestMixin, GenericDocumentTestCase):
# auto
def test_document_check_out(self): def test_document_check_out(self):
self._check_out_test_document() self._check_out_test_document()

View File

@@ -31,8 +31,8 @@ class CheckoutDocumentView(SingleObjectCreateView):
self.document = get_object_or_404(klass=Document, pk=self.kwargs['pk']) self.document = get_object_or_404(klass=Document, pk=self.kwargs['pk'])
AccessControlList.objects.check_access( AccessControlList.objects.check_access(
permissions=permission_document_check_out, user=request.user, obj=self.document, permissions=permission_document_check_out,
obj=self.document user=request.user
) )
return super( return super(
@@ -57,7 +57,7 @@ class CheckoutDocumentView(SingleObjectCreateView):
) % self.document, request=self.request ) % self.document, request=self.request
) )
return HttpResponseRedirect(self.get_success_url()) return HttpResponseRedirect(redirect_to=self.get_success_url())
def get_extra_context(self): def get_extra_context(self):
return { return {
@@ -77,8 +77,8 @@ class CheckoutListView(DocumentListView):
def get_document_queryset(self): def get_document_queryset(self):
return AccessControlList.objects.filter_by_access( return AccessControlList.objects.filter_by_access(
permission=permission_document_check_out_detail_view, permission=permission_document_check_out_detail_view,
user=self.request.user, queryset=DocumentCheckout.objects.checked_out_documents(),
queryset=DocumentCheckout.objects.checked_out_documents() user=self.request.user
) )
def get_extra_context(self): def get_extra_context(self):
@@ -168,13 +168,14 @@ class DocumentCheckinView(ConfirmView):
if document.get_check_out_info().user == self.request.user: if document.get_check_out_info().user == self.request.user:
AccessControlList.objects.check_access( AccessControlList.objects.check_access(
permissions=permission_document_check_in, obj=document, permissions=permission_document_check_in,
user=self.request.user, obj=document user=self.request.user
) )
else: else:
AccessControlList.objects.check_access( AccessControlList.objects.check_access(
obj=document,
permissions=permission_document_check_in_override, permissions=permission_document_check_in_override,
user=self.request.user, obj=document user=self.request.user
) )
try: try:

View File

@@ -22,7 +22,7 @@ from mayan.celery import app
from .classes import Template from .classes import Template
from .handlers import ( from .handlers import (
handler_pre_initial_setup, handler_pre_upgrade, handler_pre_initial_setup, handler_pre_upgrade,
user_locale_profile_session_config, user_locale_profile_create handler_user_locale_profile_session_config, handler_user_locale_profile_create
) )
from .links import ( from .links import (
link_about, link_check_version, link_current_user_locale_profile_edit, link_about, link_check_version, link_current_user_locale_profile_edit,
@@ -94,7 +94,8 @@ class CommonApp(MayanAppConfig):
super(CommonApp, self).ready() super(CommonApp, self).ready()
if check_for_sqlite(): if check_for_sqlite():
warnings.warn( warnings.warn(
category=DatabaseWarning, message=force_text(MESSAGE_SQLITE_WARNING) category=DatabaseWarning,
message=force_text(MESSAGE_SQLITE_WARNING)
) )
Template( Template(
@@ -153,22 +154,22 @@ class CommonApp(MayanAppConfig):
) )
post_save.connect( post_save.connect(
user_locale_profile_create, dispatch_uid='common_handler_user_locale_profile_create',
dispatch_uid='user_locale_profile_create', receiver=handler_user_locale_profile_create,
sender=settings.AUTH_USER_MODEL sender=settings.AUTH_USER_MODEL
) )
pre_initial_setup.connect( pre_initial_setup.connect(
handler_pre_initial_setup, dispatch_uid='common_handler_pre_initial_setup',
dispatch_uid='common_handler_pre_initial_setup' receiver=handler_pre_initial_setup
) )
pre_upgrade.connect( pre_upgrade.connect(
handler_pre_upgrade,
dispatch_uid='common_handler_pre_upgrade', dispatch_uid='common_handler_pre_upgrade',
receiver=handler_pre_upgrade
) )
user_logged_in.connect( user_logged_in.connect(
user_locale_profile_session_config, dispatch_uid='common_handler_user_locale_profile_session_config',
dispatch_uid='user_locale_profile_session_config' receiver=handler_user_locale_profile_session_config
) )
self.setup_auto_logging() self.setup_auto_logging()

View File

@@ -35,6 +35,13 @@ class Collection(object):
def __str__(self): def __str__(self):
return force_text(self.label) return force_text(self.label)
def _get_children(self):
if self._queryset:
return self._queryset
else:
if self._model:
return self._model.objects.all()
def resolve(self): def resolve(self):
self.children = self._get_children() self.children = self._get_children()
self.icon = self._icon self.icon = self._icon
@@ -45,13 +52,6 @@ class Collection(object):
self.url = reverse(viewname=self._link.view, args=self._link.args) self.url = reverse(viewname=self._link.view, args=self._link.args)
return '' return ''
def _get_children(self):
if self._queryset:
return self._queryset
else:
if self._model:
return self._model.objects.all()
@python_2_unicode_compatible @python_2_unicode_compatible
class ErrorLogNamespace(object): class ErrorLogNamespace(object):
@@ -62,9 +62,6 @@ class ErrorLogNamespace(object):
def __str__(self): def __str__(self):
return force_text(self.label) return force_text(self.label)
def create(self, obj, result):
obj.error_logs.create(namespace=self.name, result=result)
def all(self): def all(self):
ErrorLogEntry = apps.get_model( ErrorLogEntry = apps.get_model(
app_label='common', model_name='ErrorLogEntry' app_label='common', model_name='ErrorLogEntry'
@@ -72,6 +69,9 @@ class ErrorLogNamespace(object):
return ErrorLogEntry.objects.filter(namespace=self.name) return ErrorLogEntry.objects.filter(namespace=self.name)
def create(self, obj, result):
obj.error_logs.create(namespace=self.name, result=result)
class MissingItem(object): class MissingItem(object):
_registry = [] _registry = []
@@ -92,6 +92,12 @@ class MissingItem(object):
class ModelAttribute(object): class ModelAttribute(object):
_registry = {} _registry = {}
@classmethod
def get_choices_for(cls, model):
return [
(attribute.name, attribute) for attribute in cls.get_for(model=model)
]
@classmethod @classmethod
def get_for(cls, model): def get_for(cls, model):
try: try:
@@ -106,12 +112,6 @@ class ModelAttribute(object):
return cls.get_for(model=type(model)) return cls.get_for(model=type(model))
@classmethod
def get_choices_for(cls, model):
return [
(attribute.name, attribute) for attribute in cls.get_for(model)
]
@classmethod @classmethod
def get_help_text_for(cls, model, show_name=False): def get_help_text_for(cls, model, show_name=False):
result = [] result = []
@@ -208,15 +208,6 @@ class ModelField(ModelAttribute):
class ModelProperty(object): class ModelProperty(object):
_registry = [] _registry = []
@classmethod
def get_for(cls, model):
result = []
for klass in cls._registry:
result.extend(klass.get_for(model=model))
return result
@classmethod @classmethod
def get_choices_for(cls, model): def get_choices_for(cls, model):
result = [] result = []
@@ -226,6 +217,15 @@ class ModelProperty(object):
return result return result
@classmethod
def get_for(cls, model):
result = []
for klass in cls._registry:
result.extend(klass.get_for(model=model))
return result
@classmethod @classmethod
def get_help_text_for(cls, model, show_name=False): def get_help_text_for(cls, model, show_name=False):
result = [] result = []
@@ -324,5 +324,5 @@ class Template(object):
return self return self
ModelProperty.register(ModelAttribute) ModelProperty.register(klass=ModelAttribute)
ModelProperty.register(ModelField) ModelProperty.register(klass=ModelField)

View File

@@ -63,7 +63,7 @@ class Archive(object):
def get_members(self): def get_members(self):
return ( return (
SimpleUploadedFile( SimpleUploadedFile(
name=filename, content=self.member_contents(filename) content=self.member_contents(filename=filename), name=filename
) for filename in self.members() ) for filename in self.members()
) )
@@ -161,14 +161,14 @@ class ZipArchive(Archive):
Archive.register( Archive.register(
mime_types=('application/zip',), archive_classes=(ZipArchive,) archive_classes=(ZipArchive,), mime_types=('application/zip',)
) )
Archive.register( Archive.register(
mime_types=('application/x-tar',), archive_classes=(TarArchive,) archive_classes=(TarArchive,), mime_types=('application/x-tar',)
) )
Archive.register( Archive.register(
mime_types=('application/gzip',), archive_classes=(TarArchive,) archive_classes=(TarArchive,), mime_types=('application/gzip',)
) )
Archive.register( Archive.register(
mime_types=('application/x-bzip2',), archive_classes=(TarArchive,) archive_classes=(TarArchive,), mime_types=('application/x-bzip2',)
) )

View File

@@ -7,15 +7,19 @@ from django.utils import timezone, translation
def handler_pre_initial_setup(sender, **kwargs): def handler_pre_initial_setup(sender, **kwargs):
management.call_command('migrate', interactive=False) management.call_command(command_name='migrate', interactive=False)
def handler_pre_upgrade(sender, **kwargs): def handler_pre_upgrade(sender, **kwargs):
management.call_command('migrate', fake_initial=True, interactive=False) management.call_command(
management.call_command('purgeperiodictasks', interactive=False) command_name='migrate', fake_initial=True, interactive=False
)
management.call_command(
command_name='purgeperiodictasks', interactive=False
)
def user_locale_profile_session_config(sender, request, user, **kwargs): def handler_user_locale_profile_session_config(sender, request, user, **kwargs):
UserLocaleProfile = apps.get_model( UserLocaleProfile = apps.get_model(
app_label='common', model_name='UserLocaleProfile' app_label='common', model_name='UserLocaleProfile'
) )
@@ -46,7 +50,7 @@ def user_locale_profile_session_config(sender, request, user, **kwargs):
) )
def user_locale_profile_create(sender, instance, created, **kwargs): def handler_user_locale_profile_create(sender, instance, created, **kwargs):
UserLocaleProfile = apps.get_model( UserLocaleProfile = apps.get_model(
app_label='common', model_name='UserLocaleProfile' app_label='common', model_name='UserLocaleProfile'
) )

View File

@@ -71,7 +71,7 @@ class Command(management.BaseCommand):
) )
) )
management.call_command('purgeperiodictasks') management.call_command(command_name='purgeperiodictasks')
management.call_command( management.call_command(
'dumpdata', *app_labels, all=True, 'dumpdata', *app_labels, all=True,
@@ -89,7 +89,7 @@ class Command(management.BaseCommand):
) )
management.call_command( management.call_command(
'loaddata', convertdb_file_path, database=options['to'], 'loaddata', convertdb_file_path, database=options['to'], interactive=False,
interactive=False, verbosity=3 verbosity=3
) )
fs_cleanup(convertdb_file_path) fs_cleanup(convertdb_file_path)

View File

@@ -89,7 +89,11 @@ class Command(management.BaseCommand):
pre_initial_setup.send(sender=self) pre_initial_setup.send(sender=self)
if not options.get('no_javascript', False): if not options.get('no_javascript', False):
management.call_command('installjavascript', interactive=False) management.call_command(
command_name='installjavascript', interactive=False
)
management.call_command('createautoadmin', interactive=False) management.call_command(
command_name='createautoadmin', interactive=False
)
post_initial_setup.send(sender=self) post_initial_setup.send(sender=self)

View File

@@ -19,7 +19,9 @@ class Command(management.BaseCommand):
) )
) )
management.call_command('installjavascript', interactive=False) management.call_command(
command_name='installjavascript', interactive=False
)
try: try:
perform_upgrade.send(sender=self) perform_upgrade.send(sender=self)

View File

@@ -4,8 +4,8 @@ from django.utils.translation import ugettext_lazy as _
from mayan.apps.permissions import PermissionNamespace from mayan.apps.permissions import PermissionNamespace
namespace = PermissionNamespace(name='common', label=_('Common')) namespace = PermissionNamespace(label=_('Common'), name='common')
permission_error_log_view = namespace.add_permission( permission_error_log_view = namespace.add_permission(
name='error_log_view', label=_('View error log') label=_('View error log'), name='error_log_view'
) )

View File

@@ -5,13 +5,13 @@ from django.utils.translation import ugettext_lazy as _
from mayan.apps.task_manager.classes import CeleryQueue from mayan.apps.task_manager.classes import CeleryQueue
queue_default = CeleryQueue( queue_default = CeleryQueue(
name='default', label=_('Default'), is_default_queue=True is_default_queue=True, label=_('Default'), name='default'
) )
queue_tools = CeleryQueue(name='tools', label=_('Tools')) queue_tools = CeleryQueue(label=_('Tools'), name='tools')
queue_common_periodic = CeleryQueue( queue_common_periodic = CeleryQueue(
name='common_periodic', label=_('Common periodic'), transient=True label=_('Common periodic'), name='common_periodic', transient=True
) )
queue_common_periodic.add_task_type( queue_common_periodic.add_task_type(
name='mayan.apps.common.tasks.task_delete_stale_uploads', label=_('Delete stale uploads'),
label=_('Delete stale uploads') name='mayan.apps.common.tasks.task_delete_stale_uploads'
) )

View File

@@ -11,7 +11,7 @@ from mayan.apps.smart_settings import Namespace
from .literals import DEFAULT_COMMON_HOME_VIEW from .literals import DEFAULT_COMMON_HOME_VIEW
namespace = Namespace(name='common', label=_('Common')) namespace = Namespace(label=_('Common'), name='common')
setting_auto_logging = namespace.add_setting( setting_auto_logging = namespace.add_setting(
global_name='COMMON_AUTO_LOGGING', global_name='COMMON_AUTO_LOGGING',
@@ -80,7 +80,7 @@ setting_shared_storage_arguments = namespace.add_setting(
), quoted=True ), quoted=True
) )
namespace = Namespace(name='django', label=_('Django')) namespace = Namespace(label=_('Django'), name='django')
setting_django_allowed_hosts = namespace.add_setting( setting_django_allowed_hosts = namespace.add_setting(
global_name='ALLOWED_HOSTS', default=settings.ALLOWED_HOSTS, global_name='ALLOWED_HOSTS', default=settings.ALLOWED_HOSTS,
@@ -391,7 +391,7 @@ setting_django_wsgi_application = namespace.add_setting(
), ),
) )
namespace = Namespace(name='celery', label=_('Celery')) namespace = Namespace(label=_('Celery'), name='celery')
setting_celery_broker_url = namespace.add_setting( setting_celery_broker_url = namespace.add_setting(
global_name='BROKER_URL', default=settings.BROKER_URL, global_name='BROKER_URL', default=settings.BROKER_URL,

View File

@@ -17,7 +17,7 @@ register = Library()
@register.simple_tag @register.simple_tag
def check_sqlite(): def common_check_sqlite():
if check_for_sqlite(): if check_for_sqlite():
return MESSAGE_SQLITE_WARNING return MESSAGE_SQLITE_WARNING

View File

@@ -84,14 +84,14 @@ class CurrentUserLocaleProfileEditView(SingleObjectEditView):
} }
form_class = LocaleProfileForm form_class = LocaleProfileForm
post_action_redirect = reverse_lazy( post_action_redirect = reverse_lazy(
'common:current_user_locale_profile_details' viewname='common:current_user_locale_profile_details'
) )
def form_valid(self, form): def form_valid(self, form):
form.save() form.save()
timezone.activate(form.cleaned_data['timezone']) timezone.activate(timezone=form.cleaned_data['timezone'])
translation.activate(form.cleaned_data['language']) translation.activate(language=form.cleaned_data['language'])
if hasattr(self.request, 'session'): if hasattr(self.request, 'session'):
self.request.session[ self.request.session[
@@ -108,7 +108,9 @@ class CurrentUserLocaleProfileEditView(SingleObjectEditView):
settings.TIMEZONE_COOKIE_NAME, form.cleaned_data['timezone'] settings.TIMEZONE_COOKIE_NAME, form.cleaned_data['timezone']
) )
return super(CurrentUserLocaleProfileEditView, self).form_valid(form) return super(CurrentUserLocaleProfileEditView, self).form_valid(
form=form
)
def get_object(self): def get_object(self):
return self.request.user.locale_profile return self.request.user.locale_profile
@@ -123,7 +125,7 @@ class FaviconRedirectView(RedirectView):
processors processors
""" """
from django.contrib.staticfiles.templatetags.staticfiles import static from django.contrib.staticfiles.templatetags.staticfiles import static
return static('appearance/images/favicon.ico') return static(path='appearance/images/favicon.ico')
class HomeView(SimpleView): class HomeView(SimpleView):
@@ -292,7 +294,7 @@ def multi_object_action_view(request):
message=_('No action selected.'), request=request message=_('No action selected.'), request=request
) )
return HttpResponseRedirect( return HttpResponseRedirect(
request.META.get( redirect_to=request.META.get(
'HTTP_REFERER', resolve_url(settings.LOGIN_REDIRECT_URL) 'HTTP_REFERER', resolve_url(settings.LOGIN_REDIRECT_URL)
) )
) )
@@ -303,7 +305,7 @@ def multi_object_action_view(request):
request=request request=request
) )
return HttpResponseRedirect( return HttpResponseRedirect(
request.META.get( redirect_to=request.META.get(
'HTTP_REFERER', resolve_url(settings.LOGIN_REDIRECT_URL) 'HTTP_REFERER', resolve_url(settings.LOGIN_REDIRECT_URL)
) )
) )
@@ -312,7 +314,7 @@ def multi_object_action_view(request):
# functions that don't expect a properties_list parameter # functions that don't expect a properties_list parameter
if items_property_list: if items_property_list:
return HttpResponseRedirect( return HttpResponseRedirect(
'%s?%s' % ( redirect_to='%s?%s' % (
action, action,
urlencode( urlencode(
{ {
@@ -323,7 +325,8 @@ def multi_object_action_view(request):
) )
) )
else: else:
return HttpResponseRedirect('%s?%s' % ( return HttpResponseRedirect(
action, redirect_to='%s?%s' % (
urlencode({'id_list': id_list, 'next': next})) action, urlencode({'id_list': id_list, 'next': next})
)
) )

View File

@@ -31,9 +31,15 @@ class EmailInput(forms.widgets.Input):
def render(self, name, value, attrs=None): def render(self, name, value, attrs=None):
if attrs is None: if attrs is None:
attrs = {} attrs = {}
attrs.update(dict(autocorrect='off',
autocapitalize='off', attrs.update(
spellcheck='false')) {
'autocorrect': 'off',
'autocapitalize': 'off',
'spellcheck': 'false'
}
)
return super(EmailInput, self).render(name, value, attrs=attrs) return super(EmailInput, self).render(name, value, attrs=attrs)
@@ -43,7 +49,7 @@ class PlainWidget(forms.widgets.Widget):
widget and reduces the output to only it's value widget and reduces the output to only it's value
""" """
def render(self, name, value, attrs=None): def render(self, name, value, attrs=None):
return mark_safe('%s' % value) return mark_safe(s='%s' % value)
class TextAreaDiv(forms.widgets.Widget): class TextAreaDiv(forms.widgets.Widget):

View File

@@ -24,15 +24,15 @@ class ConverterApp(MayanAppConfig):
def ready(self): def ready(self):
super(ConverterApp, self).ready() super(ConverterApp, self).ready()
Transformation = self.get_model('Transformation') Transformation = self.get_model(model_name='Transformation')
SourceColumn(source=Transformation, label=_('Order'), attribute='order') SourceColumn(attribute='order', source=Transformation)
SourceColumn( SourceColumn(
source=Transformation, label=_('Transformation'), source=Transformation, label=_('Transformation'),
func=lambda context: force_text(context['object']) func=lambda context: force_text(context['object'])
) )
SourceColumn( SourceColumn(
source=Transformation, label=_('Arguments'), attribute='arguments' attribute='arguments', source=Transformation
) )
menu_object.bind_links( menu_object.bind_links(

View File

@@ -4,17 +4,17 @@ from django.utils.translation import ugettext_lazy as _
from mayan.apps.permissions import PermissionNamespace from mayan.apps.permissions import PermissionNamespace
namespace = PermissionNamespace(name='converter', label=_('Converter')) namespace = PermissionNamespace(label=_('Converter'), name='converter')
permission_transformation_create = namespace.add_permission( permission_transformation_create = namespace.add_permission(
name='transformation_create', label=_('Create new transformations') label=_('Create new transformations'), name='transformation_create'
) )
permission_transformation_delete = namespace.add_permission( permission_transformation_delete = namespace.add_permission(
name='transformation_delete', label=_('Delete transformations') label=_('Delete transformations'), name='transformation_delete'
) )
permission_transformation_edit = namespace.add_permission( permission_transformation_edit = namespace.add_permission(
name='transformation_edit', label=_('Edit transformations') label=_('Edit transformations'), name='transformation_edit'
) )
permission_transformation_view = namespace.add_permission( permission_transformation_view = namespace.add_permission(
name='transformation_view', label=_('View existing transformations') label=_('View existing transformations'), name='transformation_view'
) )

View File

@@ -1,10 +1,9 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import logging
from django.utils.module_loading import import_string from django.utils.module_loading import import_string
from .settings import setting_graphics_backend from .settings import setting_graphics_backend
logger = logging.getLogger(__name__) backend = converter_class = import_string(
backend = converter_class = import_string(setting_graphics_backend.value) dotted_path=setting_graphics_backend.value
)

View File

@@ -9,7 +9,8 @@ from .literals import (
DEFAULT_PDFTOPPM_PATH, DEFAULT_PDFINFO_PATH, DEFAULT_PILLOW_FORMAT DEFAULT_PDFTOPPM_PATH, DEFAULT_PDFINFO_PATH, DEFAULT_PILLOW_FORMAT
) )
namespace = Namespace(name='converter', label=_('Converter')) namespace = Namespace(label=_('Converter'), name='converter')
setting_graphics_backend = namespace.add_setting( setting_graphics_backend = namespace.add_setting(
default='mayan.apps.converter.backends.python.Python', default='mayan.apps.converter.backends.python.Python',
help_text=_('Graphics conversion backend to use.'), help_text=_('Graphics conversion backend to use.'),

View File

@@ -315,15 +315,15 @@ class TransformationZoom(BaseTransformation):
) )
BaseTransformation.register(TransformationCrop) BaseTransformation.register(transformation=TransformationCrop)
BaseTransformation.register(TransformationFlip) BaseTransformation.register(transformation=TransformationFlip)
BaseTransformation.register(TransformationGaussianBlur) BaseTransformation.register(transformation=TransformationGaussianBlur)
BaseTransformation.register(TransformationLineArt) BaseTransformation.register(transformation=TransformationLineArt)
BaseTransformation.register(TransformationMirror) BaseTransformation.register(transformation=TransformationMirror)
BaseTransformation.register(TransformationResize) BaseTransformation.register(transformation=TransformationResize)
BaseTransformation.register(TransformationRotate) BaseTransformation.register(transformation=TransformationRotate)
BaseTransformation.register(TransformationRotate90) BaseTransformation.register(transformation=TransformationRotate90)
BaseTransformation.register(TransformationRotate180) BaseTransformation.register(transformation=TransformationRotate180)
BaseTransformation.register(TransformationRotate270) BaseTransformation.register(transformation=TransformationRotate270)
BaseTransformation.register(TransformationUnsharpMask) BaseTransformation.register(transformation=TransformationUnsharpMask)
BaseTransformation.register(TransformationZoom) BaseTransformation.register(transformation=TransformationZoom)

View File

@@ -27,54 +27,6 @@ from .permissions import (
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class TransformationDeleteView(SingleObjectDeleteView):
model = Transformation
def dispatch(self, request, *args, **kwargs):
self.transformation = get_object_or_404(
klass=Transformation, pk=self.kwargs['pk']
)
AccessControlList.objects.check_access(
permissions=permission_transformation_delete, user=request.user,
obj=self.transformation.content_object
)
return super(TransformationDeleteView, self).dispatch(
request, *args, **kwargs
)
def get_post_action_redirect(self):
return reverse(
viewname='converter:transformation_list', kwargs={
'app_label': self.transformation.content_type.app_label,
'model': self.transformation.content_type.model,
'object_id': self.transformation.object_id
}
)
def get_extra_context(self):
return {
'content_object': self.transformation.content_object,
'navigation_object_list': ('content_object', 'transformation'),
'previous': reverse(
viewname='converter:transformation_list', kwargs={
'app_label': self.transformation.content_type.app_label,
'model': self.transformation.content_type.model,
'object_id': self.transformation.object_id
}
),
'title': _(
'Delete transformation "%(transformation)s" for: '
'%(content_object)s?'
) % {
'transformation': self.transformation,
'content_object': self.transformation.content_object
},
'transformation': self.transformation,
}
class TransformationCreateView(SingleObjectCreateView): class TransformationCreateView(SingleObjectCreateView):
form_class = TransformationForm form_class = TransformationForm
@@ -92,8 +44,8 @@ class TransformationCreateView(SingleObjectCreateView):
raise Http404 raise Http404
AccessControlList.objects.check_access( AccessControlList.objects.check_access(
permissions=permission_transformation_create, user=request.user, obj=self.content_object,
obj=self.content_object permissions=permission_transformation_create, user=request.user
) )
return super(TransformationCreateView, self).dispatch( return super(TransformationCreateView, self).dispatch(
@@ -134,6 +86,54 @@ class TransformationCreateView(SingleObjectCreateView):
return Transformation.objects.get_for_model(self.content_object) return Transformation.objects.get_for_model(self.content_object)
class TransformationDeleteView(SingleObjectDeleteView):
model = Transformation
def dispatch(self, request, *args, **kwargs):
self.transformation = get_object_or_404(
klass=Transformation, pk=self.kwargs['pk']
)
AccessControlList.objects.check_access(
obj=self.transformation.content_object,
permissions=permission_transformation_delete, user=request.user
)
return super(TransformationDeleteView, self).dispatch(
request, *args, **kwargs
)
def get_post_action_redirect(self):
return reverse(
viewname='converter:transformation_list', kwargs={
'app_label': self.transformation.content_type.app_label,
'model': self.transformation.content_type.model,
'object_id': self.transformation.object_id
}
)
def get_extra_context(self):
return {
'content_object': self.transformation.content_object,
'navigation_object_list': ('content_object', 'transformation'),
'previous': reverse(
viewname='converter:transformation_list', kwargs={
'app_label': self.transformation.content_type.app_label,
'model': self.transformation.content_type.model,
'object_id': self.transformation.object_id
}
),
'title': _(
'Delete transformation "%(transformation)s" for: '
'%(content_object)s?'
) % {
'transformation': self.transformation,
'content_object': self.transformation.content_object
},
'transformation': self.transformation,
}
class TransformationEditView(SingleObjectEditView): class TransformationEditView(SingleObjectEditView):
form_class = TransformationForm form_class = TransformationForm
model = Transformation model = Transformation
@@ -144,8 +144,8 @@ class TransformationEditView(SingleObjectEditView):
) )
AccessControlList.objects.check_access( AccessControlList.objects.check_access(
permissions=permission_transformation_edit, user=request.user, obj=self.transformation.content_object,
obj=self.transformation.content_object permissions=permission_transformation_edit, user=request.user
) )
return super(TransformationEditView, self).dispatch( return super(TransformationEditView, self).dispatch(
@@ -159,9 +159,9 @@ class TransformationEditView(SingleObjectEditView):
instance.save() instance.save()
except Exception as exception: except Exception as exception:
logger.debug('Invalid form, exception: %s', exception) logger.debug('Invalid form, exception: %s', exception)
return super(TransformationEditView, self).form_invalid(form) return super(TransformationEditView, self).form_invalid(form=form)
else: else:
return super(TransformationEditView, self).form_valid(form) return super(TransformationEditView, self).form_valid(form=form)
def get_extra_context(self): def get_extra_context(self):
return { return {
@@ -201,8 +201,8 @@ class TransformationListView(SingleObjectListView):
raise Http404 raise Http404
AccessControlList.objects.check_access( AccessControlList.objects.check_access(
permissions=permission_transformation_view, user=request.user, obj=self.content_object,
obj=self.content_object permissions=permission_transformation_view, user=request.user
) )
return super(TransformationListView, self).dispatch( return super(TransformationListView, self).dispatch(
@@ -231,4 +231,4 @@ class TransformationListView(SingleObjectListView):
} }
def get_object_list(self): def get_object_list(self):
return Transformation.objects.get_for_model(self.content_object) return Transformation.objects.get_for_model(obj=self.content_object)

View File

@@ -35,7 +35,7 @@ class DjangoGPGApp(MayanAppConfig):
def ready(self): def ready(self):
super(DjangoGPGApp, self).ready() super(DjangoGPGApp, self).ready()
Key = self.get_model('Key') Key = self.get_model(model_name='Key')
ModelPermission.register( ModelPermission.register(
model=Key, permissions=( model=Key, permissions=(
@@ -45,22 +45,22 @@ class DjangoGPGApp(MayanAppConfig):
) )
) )
SourceColumn(source=Key, label=_('Key ID'), attribute='key_id') SourceColumn(attribute='key_id', label=_('Key ID'), source=Key)
SourceColumn(source=Key, label=_('User ID'), attribute='user_id') SourceColumn(attribute='user_id', source=Key)
SourceColumn(source=KeyStub, label=_('Key ID'), attribute='key_id') SourceColumn(attribute='key_id', label=_('Key ID'), source=KeyStub)
SourceColumn(source=KeyStub, label=_('Type'), attribute='key_type') SourceColumn(attribute='key_type', label=_('Type'), source=KeyStub)
SourceColumn( SourceColumn(
source=KeyStub, label=_('Creation date'), attribute='date' attribute='date', label=_('Creation date'), source=KeyStub
) )
SourceColumn( SourceColumn(
source=KeyStub, label=_('Expiration date'), func=lambda context: context['object'].expires or _('No expiration'),
func=lambda context: context['object'].expires or _('No expiration') label=_('Expiration date'), source=KeyStub
) )
SourceColumn(source=KeyStub, label=_('Length'), attribute='length') SourceColumn(attribute='length', label=_('Length'), source=KeyStub)
SourceColumn( SourceColumn(
source=KeyStub, label=_('User ID'), func=lambda context: ', '.join(context['object'].user_id),
func=lambda context: ', '.join(context['object'].user_id) label=_('User ID'), source=KeyStub
) )
menu_object.bind_links(links=(link_key_detail,), sources=(Key,)) menu_object.bind_links(links=(link_key_detail,), sources=(Key,))

View File

@@ -23,7 +23,7 @@ class KeyManager(models.Manager):
def _preload_keys(self, all_keys=False, key_fingerprint=None, key_id=None): def _preload_keys(self, all_keys=False, key_fingerprint=None, key_id=None):
# Preload keys # Preload keys
if all_keys: if all_keys:
logger.debug('preloading all keys') logger.debug(msg='preloading all keys')
keys = self.values() keys = self.values()
elif key_fingerprint: elif key_fingerprint:
logger.debug('preloading key fingerprint: %s', key_fingerprint) logger.debug('preloading key fingerprint: %s', key_fingerprint)
@@ -121,17 +121,17 @@ class KeyManager(models.Manager):
if verify_result: if verify_result:
# Signed and key present # Signed and key present
logger.debug('signed and key present') logger.debug(msg='signed and key present')
return SignatureVerification(verify_result.__dict__) return SignatureVerification(verify_result.__dict__)
elif verify_result.status == 'no public key' and not (key_fingerprint or all_keys or key_id): elif verify_result.status == 'no public key' and not (key_fingerprint or all_keys or key_id):
# Signed but key not present, retry with key fetch # Signed but key not present, retry with key fetch
logger.debug('no public key') logger.debug(msg='no public key')
file_object.seek(0) file_object.seek(0)
return self.verify_file(file_object=file_object, signature_file=signature_file, key_id=verify_result.key_id) return self.verify_file(file_object=file_object, signature_file=signature_file, key_id=verify_result.key_id)
elif verify_result.key_id: elif verify_result.key_id:
# Signed, retried and key still not found # Signed, retried and key still not found
logger.debug('signed, retried and key still not found') logger.debug(msg='signed, retried and key still not found')
return SignatureVerification(verify_result.__dict__) return SignatureVerification(verify_result.__dict__)
else: else:
logger.debug('file not signed') logger.debug(msg='file not signed')
raise VerificationError('File not signed') raise VerificationError('File not signed')

View File

@@ -4,26 +4,26 @@ from django.utils.translation import ugettext_lazy as _
from mayan.apps.permissions import PermissionNamespace from mayan.apps.permissions import PermissionNamespace
namespace = PermissionNamespace(name='django_gpg', label=_('Key management')) namespace = PermissionNamespace(label=_('Key management'), name='django_gpg')
permission_key_delete = namespace.add_permission( permission_key_delete = namespace.add_permission(
name='key_delete', label=_('Delete keys') label=_('Delete keys'), name='key_delete'
) )
permission_key_download = namespace.add_permission( permission_key_download = namespace.add_permission(
name='key_download', label=_('Download keys') label=_('Download keys'), name='key_download'
) )
permission_key_receive = namespace.add_permission( permission_key_receive = namespace.add_permission(
name='key_receive', label=_('Import keys from keyservers') label=_('Import keys from keyservers'), name='key_receive'
) )
permission_key_sign = namespace.add_permission( permission_key_sign = namespace.add_permission(
name='key_sign', label=_('Use keys to sign content') label=_('Use keys to sign content'), name='key_sign'
) )
permission_key_upload = namespace.add_permission( permission_key_upload = namespace.add_permission(
name='key_upload', label=_('Upload keys') label=_('Upload keys'), name='key_upload'
) )
permission_key_view = namespace.add_permission( permission_key_view = namespace.add_permission(
name='key_view', label=_('View keys') label=_('View keys'), name='key_view'
) )
permission_keyserver_query = namespace.add_permission( permission_keyserver_query = namespace.add_permission(
name='keyserver_query', label=_('Query keyservers') label=_('Query keyservers'), name='keyserver_query'
) )

View File

@@ -7,7 +7,8 @@ from django.utils.translation import ugettext_lazy as _
from mayan.apps.smart_settings import Namespace from mayan.apps.smart_settings import Namespace
namespace = Namespace(name='django_gpg', label=_('Signatures')) namespace = Namespace(label=_('Signatures'), name='django_gpg')
setting_gpg_home = namespace.add_setting( setting_gpg_home = namespace.add_setting(
global_name='SIGNATURES_GPG_HOME', global_name='SIGNATURES_GPG_HOME',
default=os.path.join(settings.MEDIA_ROOT, 'gpg_home'), default=os.path.join(settings.MEDIA_ROOT, 'gpg_home'),

View File

@@ -31,15 +31,15 @@ class KeyDeleteView(SingleObjectDeleteView):
model = Key model = Key
object_permission = permission_key_delete object_permission = permission_key_delete
def get_post_action_redirect(self):
if self.get_object().key_type == KEY_TYPE_PUBLIC:
return reverse_lazy('django_gpg:key_public_list')
else:
return reverse_lazy('django_gpg:key_private_list')
def get_extra_context(self): def get_extra_context(self):
return {'title': _('Delete key: %s') % self.get_object()} return {'title': _('Delete key: %s') % self.get_object()}
def get_post_action_redirect(self):
if self.get_object().key_type == KEY_TYPE_PUBLIC:
return reverse_lazy(viewname='django_gpg:key_public_list')
else:
return reverse_lazy(viewname='django_gpg:key_private_list')
class KeyDetailView(SingleObjectDetailView): class KeyDetailView(SingleObjectDetailView):
form_class = KeyDetailForm form_class = KeyDetailForm
@@ -92,28 +92,6 @@ class KeyReceive(ConfirmView):
) )
class KeyQueryView(SimpleView):
template_name = 'appearance/generic_form.html'
view_permission = permission_keyserver_query
def get_form(self):
if ('term' in self.request.GET) and self.request.GET['term'].strip():
term = self.request.GET['term']
return KeySearchForm(initial={'term': term})
else:
return KeySearchForm()
def get_extra_context(self):
return {
'form': self.get_form(),
'form_action': reverse('django_gpg:key_query_results'),
'submit_icon_class': icon_keyserver_search,
'submit_label': _('Search'),
'submit_method': 'GET',
'title': _('Query key server'),
}
class KeyQueryResultView(SingleObjectListView): class KeyQueryResultView(SingleObjectListView):
view_permission = permission_keyserver_query view_permission = permission_keyserver_query
@@ -142,6 +120,28 @@ class KeyQueryResultView(SingleObjectListView):
return () return ()
class KeyQueryView(SimpleView):
template_name = 'appearance/generic_form.html'
view_permission = permission_keyserver_query
def get_extra_context(self):
return {
'form': self.get_form(),
'form_action': reverse('django_gpg:key_query_results'),
'submit_icon_class': icon_keyserver_search,
'submit_label': _('Search'),
'submit_method': 'GET',
'title': _('Query key server'),
}
def get_form(self):
if ('term' in self.request.GET) and self.request.GET['term'].strip():
term = self.request.GET['term']
return KeySearchForm(initial={'term': term})
else:
return KeySearchForm()
class KeyUploadView(SingleObjectCreateView): class KeyUploadView(SingleObjectCreateView):
fields = ('key_data',) fields = ('key_data',)
model = Key model = Key
@@ -154,6 +154,29 @@ class KeyUploadView(SingleObjectCreateView):
} }
class PrivateKeyListView(SingleObjectListView):
object_permission = permission_key_view
queryset = Key.objects.private_keys()
def get_extra_context(self):
return {
'hide_object': True,
'no_results_icon': icon_key_setup,
'no_results_main_link': link_key_upload.resolve(
context=RequestContext(request=self.request)
),
'no_results_text': _(
'Private keys are used to signed documents. '
'Private keys can only be uploaded by the user.'
'The view to upload private and public keys is the same.'
),
'no_results_title': _(
'There no private keys'
),
'title': _('Private keys')
}
class PublicKeyListView(SingleObjectListView): class PublicKeyListView(SingleObjectListView):
object_permission = permission_key_view object_permission = permission_key_view
queryset = Key.objects.public_keys() queryset = Key.objects.public_keys()
@@ -176,26 +199,3 @@ class PublicKeyListView(SingleObjectListView):
), ),
'title': _('Public keys') 'title': _('Public keys')
} }
class PrivateKeyListView(SingleObjectListView):
object_permission = permission_key_view
queryset = Key.objects.private_keys()
def get_extra_context(self):
return {
'hide_object': True,
'no_results_icon': icon_key_setup,
'no_results_main_link': link_key_upload.resolve(
context=RequestContext(request=self.request)
),
'no_results_text': _(
'Private keys are used to signed documents. '
'Private keys can only be uploaded by the user.'
'The view to upload private and public keys is the same.'
),
'no_results_title': _(
'There no private keys'
),
'title': _('Private keys')
}

View File

@@ -30,8 +30,8 @@ class APICommentListView(generics.ListCreateAPIView):
) )
AccessControlList.objects.check_access( AccessControlList.objects.check_access(
permissions=permission_required, user=self.request.user, obj=document, permissions=permission_required,
obj=document user=self.request.user
) )
return document return document
@@ -85,8 +85,8 @@ class APICommentView(generics.RetrieveDestroyAPIView):
) )
AccessControlList.objects.check_access( AccessControlList.objects.check_access(
permissions=permission_required, user=self.request.user, obj=document, permissions=permission_required,
obj=document user=self.request.user
) )
return document return document

View File

@@ -37,7 +37,7 @@ class DocumentCommentsApp(MayanAppConfig):
app_label='documents', model_name='Document' app_label='documents', model_name='Document'
) )
Comment = self.get_model('Comment') Comment = self.get_model(model_name='Comment')
ModelEventType.register( ModelEventType.register(
model=Document, event_types=( model=Document, event_types=(
@@ -52,12 +52,12 @@ class DocumentCommentsApp(MayanAppConfig):
) )
) )
SourceColumn(source=Comment, label=_('Date'), attribute='submit_date') SourceColumn(attribute='submit_date', source=Comment)
SourceColumn( SourceColumn(
source=Comment, label=_('User'), func=lambda context: context['object'].user.get_full_name() if context['object'].user.get_full_name() else context['object'].user,
func=lambda context: context['object'].user.get_full_name() if context['object'].user.get_full_name() else context['object'].user source=Comment
) )
SourceColumn(source=Comment, label=_('Comment'), attribute='comment') SourceColumn(attribute='comment', source=Comment)
document_page_search.add_model_field( document_page_search.add_model_field(
field='document_version__document__comments__comment', field='document_version__document__comments__comment',

View File

@@ -4,14 +4,14 @@ from django.utils.translation import ugettext_lazy as _
from mayan.apps.permissions import PermissionNamespace from mayan.apps.permissions import PermissionNamespace
namespace = PermissionNamespace(name='comments', label=_('Comments')) namespace = PermissionNamespace(label=_('Comments'), name='comments')
permission_comment_create = namespace.add_permission( permission_comment_create = namespace.add_permission(
name='comment_create', label=_('Create new comments') label=_('Create new comments'), name='comment_create'
) )
permission_comment_delete = namespace.add_permission( permission_comment_delete = namespace.add_permission(
name='comment_delete', label=_('Delete comments') label=_('Delete comments'), name='comment_delete'
) )
permission_comment_view = namespace.add_permission( permission_comment_view = namespace.add_permission(
name='comment_view', label=_('View comments') label=_('View comments'), name='comment_view'
) )

View File

@@ -26,8 +26,8 @@ class DocumentCommentCreateView(SingleObjectCreateView):
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
AccessControlList.objects.check_access( AccessControlList.objects.check_access(
permissions=permission_comment_create, user=request.user, obj=self.get_document(), permissions=permission_comment_create,
obj=self.get_document() user=request.user
) )
return super( return super(
@@ -66,8 +66,8 @@ class DocumentCommentDeleteView(SingleObjectDeleteView):
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
AccessControlList.objects.check_access( AccessControlList.objects.check_access(
permissions=permission_comment_delete, user=request.user, obj=self.get_object().document,
obj=self.get_object().document permissions=permission_comment_delete, user=request.user
) )
return super( return super(
@@ -116,8 +116,8 @@ class DocumentCommentListView(SingleObjectListView):
def get_object_list(self): def get_object_list(self):
AccessControlList.objects.check_access( AccessControlList.objects.check_access(
permissions=permission_comment_view, user=self.request.user, obj=self.get_document(), permissions=permission_comment_view,
obj=self.get_document() user=self.request.user
) )
return self.get_document().comments.all() return self.get_document().comments.all()

View File

@@ -66,8 +66,9 @@ class APIIndexNodeInstanceDocumentListView(generics.ListAPIView):
klass=IndexInstanceNode, pk=self.kwargs['pk'] klass=IndexInstanceNode, pk=self.kwargs['pk']
) )
AccessControlList.objects.check_access( AccessControlList.objects.check_access(
obj=index_node_instance.index,
permissions=permission_document_indexing_view, permissions=permission_document_indexing_view,
user=self.request.user, obj=index_node_instance.index user=self.request.user
) )
return index_node_instance.documents.all() return index_node_instance.documents.all()
@@ -112,8 +113,8 @@ class APIDocumentIndexListView(generics.ListAPIView):
def get_queryset(self): def get_queryset(self):
document = get_object_or_404(klass=Document, pk=self.kwargs['pk']) document = get_object_or_404(klass=Document, pk=self.kwargs['pk'])
AccessControlList.objects.check_access( AccessControlList.objects.check_access(
permissions=permission_document_view, user=self.request.user, obj=document, permissions=permission_document_view,
obj=document user=self.request.user
) )
return document.index_instance_nodes.all() return document.index_instance_nodes.all()

View File

@@ -20,7 +20,7 @@ from mayan.apps.navigation import SourceColumn
from mayan.celery import app from mayan.celery import app
from .handlers import ( from .handlers import (
create_default_document_index, handler_delete_empty, handler_create_default_document_index, handler_delete_empty,
handler_index_document, handler_remove_document, handler_index_document, handler_remove_document,
handler_post_save_index_document handler_post_save_index_document
) )
@@ -64,12 +64,14 @@ class DocumentIndexingApp(MayanAppConfig):
app_label='documents', model_name='DocumentType' app_label='documents', model_name='DocumentType'
) )
DocumentIndexInstanceNode = self.get_model('DocumentIndexInstanceNode') DocumentIndexInstanceNode = self.get_model(
model_name='DocumentIndexInstanceNode'
)
Index = self.get_model('Index') Index = self.get_model(model_name='Index')
IndexInstance = self.get_model('IndexInstance') IndexInstance = self.get_model(model_name='IndexInstance')
IndexInstanceNode = self.get_model('IndexInstanceNode') IndexInstanceNode = self.get_model(model_name='IndexInstanceNode')
IndexTemplateNode = self.get_model('IndexTemplateNode') IndexTemplateNode = self.get_model(model_name='IndexTemplateNode')
ModelPermission.register( ModelPermission.register(
model=Index, permissions=( model=Index, permissions=(
@@ -96,23 +98,22 @@ class DocumentIndexingApp(MayanAppConfig):
) )
SourceColumn( SourceColumn(
source=IndexInstance, label=_('Total levels'),
func=lambda context: context[ func=lambda context: context[
'object' 'object'
].instance_root.get_descendants_count() ].instance_root.get_descendants_count(), label=_('Total levels'),
source=IndexInstance
) )
SourceColumn( SourceColumn(
source=IndexInstance, label=_('Total documents'),
func=lambda context: context[ func=lambda context: context[
'object' 'object'
].instance_root.get_descendants_document_count( ].instance_root.get_descendants_document_count(
user=context['request'].user user=context['request'].user
) ), label=_('Total documents'), source=IndexInstance
) )
SourceColumn( SourceColumn(
source=IndexTemplateNode, label=_('Level'), func=lambda context: node_level(context['object']),
func=lambda context: node_level(context['object']) label=_('Level'), source=IndexTemplateNode
) )
SourceColumn( SourceColumn(
attribute='enabled', is_sortable=True, source=IndexTemplateNode, attribute='enabled', is_sortable=True, source=IndexTemplateNode,
@@ -123,39 +124,36 @@ class DocumentIndexingApp(MayanAppConfig):
widget=TwoStateWidget widget=TwoStateWidget
) )
SourceColumn( SourceColumn(
source=IndexInstanceNode, label=_('Level'), func=lambda context: index_instance_item_link(context['object']),
func=lambda context: index_instance_item_link(context['object']) label=_('Level'), source=IndexInstanceNode
) )
SourceColumn( SourceColumn(
source=IndexInstanceNode, label=_('Levels'), func=lambda context: context['object'].get_descendants_count(),
func=lambda context: context['object'].get_descendants_count() label=_('Levels'), source=IndexInstanceNode
) )
SourceColumn( SourceColumn(
source=IndexInstanceNode, label=_('Documents'),
func=lambda context: context[ func=lambda context: context[
'object' 'object'
].get_descendants_document_count( ].get_descendants_document_count(
user=context['request'].user user=context['request'].user
) ), label=_('Documents'), source=IndexInstanceNode
) )
SourceColumn( SourceColumn(
label=_('Level'),
func=lambda context: get_instance_link( func=lambda context: get_instance_link(
index_instance_node=context['object'], index_instance_node=context['object'],
), source=DocumentIndexInstanceNode, ), label=_('Level'), source=DocumentIndexInstanceNode
) )
SourceColumn( SourceColumn(
source=DocumentIndexInstanceNode, label=_('Levels'), func=lambda context: context['object'].get_descendants_count(),
func=lambda context: context['object'].get_descendants_count() label=_('Levels'), source=DocumentIndexInstanceNode
) )
SourceColumn( SourceColumn(
source=DocumentIndexInstanceNode, label=_('Documents'),
func=lambda context: context[ func=lambda context: context[
'object' 'object'
].get_descendants_document_count( ].get_descendants_document_count(
user=context['request'].user user=context['request'].user
) ), label=_('Documents'), source=DocumentIndexInstanceNode
) )
app.conf.CELERY_QUEUES.append( app.conf.CELERY_QUEUES.append(
@@ -221,8 +219,8 @@ class DocumentIndexingApp(MayanAppConfig):
sender=Document sender=Document
) )
post_initial_document_type.connect( post_initial_document_type.connect(
dispatch_uid='document_indexing_create_default_document_index', dispatch_uid='document_indexing_handler_create_default_document_index',
receiver=create_default_document_index, receiver=handler_create_default_document_index,
sender=DocumentType sender=DocumentType
) )
post_save.connect( post_save.connect(

View File

@@ -8,7 +8,7 @@ from .tasks import (
) )
def create_default_document_index(sender, **kwargs): def handler_create_default_document_index(sender, **kwargs):
DocumentType = apps.get_model( DocumentType = apps.get_model(
app_label='documents', model_name='DocumentType' app_label='documents', model_name='DocumentType'
) )

View File

@@ -14,7 +14,7 @@ def get_instance_link(index_instance_node):
Return an HTML anchor to an index node instance Return an HTML anchor to an index node instance
""" """
return mark_safe( return mark_safe(
'<a href="{url}">{text}</a>'.format( s='<a href="{url}">{text}</a>'.format(
url=index_instance_node.get_absolute_url(), url=index_instance_node.get_absolute_url(),
text=escape(index_instance_node.get_full_path()) text=escape(index_instance_node.get_full_path())
) )
@@ -35,7 +35,7 @@ def index_instance_item_link(index_instance_item):
icon = '' icon = ''
return mark_safe( return mark_safe(
'%(icon)s&nbsp;<a href="%(url)s">%(text)s</a>' % { s='%(icon)s&nbsp;<a href="%(url)s">%(text)s</a>' % {
'url': index_instance_item.get_absolute_url(), 'url': index_instance_item.get_absolute_url(),
'icon': icon, 'icon': icon,
'text': index_instance_item 'text': index_instance_item
@@ -48,7 +48,7 @@ def node_level(node):
Render an indented tree like output for a specific node Render an indented tree like output for a specific node
""" """
return mark_safe( return mark_safe(
''.join( s=''.join(
[ [
'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' * node.get_level(), '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' * node.get_level(),
'' if node.is_root_node() else icon_index_level_up.render(), '' if node.is_root_node() else icon_index_level_up.render(),

View File

@@ -63,8 +63,8 @@ class Index(models.Model):
def get_absolute_url(self): def get_absolute_url(self):
try: try:
return reverse( return reverse(
'indexing:index_instance_node_view', viewname='indexing:index_instance_node_view',
args=(self.instance_root.pk,) kwargs={'pk': self.instance_root.pk}
) )
except IndexInstanceNode.DoesNotExist: except IndexInstanceNode.DoesNotExist:
return '#' return '#'
@@ -357,7 +357,11 @@ class IndexInstanceNode(MPTTModel):
lock.release() lock.release()
def get_absolute_url(self): def get_absolute_url(self):
return reverse('indexing:index_instance_node_view', args=(self.pk,)) return reverse(
viewname='indexing:index_instance_node_view', kwargs={
'pk': self.pk
}
)
def get_children_count(self): def get_children_count(self):
return self.get_children().count() return self.get_children().count()
@@ -367,12 +371,12 @@ class IndexInstanceNode(MPTTModel):
def get_descendants_document_count(self, user): def get_descendants_document_count(self, user):
return AccessControlList.objects.filter_by_access( return AccessControlList.objects.filter_by_access(
permission=permission_document_view, user=user, permission=permission_document_view,
queryset=Document.objects.filter( queryset=Document.objects.filter(
index_instance_nodes__in=self.get_descendants( index_instance_nodes__in=self.get_descendants(
include_self=True include_self=True
) )
) ), user=user
).count() ).count()
def get_full_path(self): def get_full_path(self):
@@ -388,7 +392,8 @@ class IndexInstanceNode(MPTTModel):
def get_item_count(self, user): def get_item_count(self, user):
if self.index_template_node.link_documents: if self.index_template_node.link_documents:
queryset = AccessControlList.objects.filter_by_access( queryset = AccessControlList.objects.filter_by_access(
permission_document_view, user, queryset=self.documents permission=permission_document_view, queryset=self.documents,
user=user
) )
return queryset.count() return queryset.count()

View File

@@ -4,24 +4,24 @@ from django.utils.translation import ugettext_lazy as _
from mayan.apps.permissions import PermissionNamespace from mayan.apps.permissions import PermissionNamespace
namespace = PermissionNamespace(name='document_indexing', label=_('Indexing')) namespace = PermissionNamespace(label=_('Indexing'), name='document_indexing')
permission_document_indexing_create = namespace.add_permission( permission_document_indexing_create = namespace.add_permission(
name='document_index_create', label=_('Create new document indexes') label=_('Create new document indexes'), name='document_index_create'
) )
permission_document_indexing_edit = namespace.add_permission( permission_document_indexing_edit = namespace.add_permission(
name='document_index_edit', label=_('Edit document indexes') label=_('Edit document indexes'), name='document_index_edit'
) )
permission_document_indexing_delete = namespace.add_permission( permission_document_indexing_delete = namespace.add_permission(
name='document_index_delete', label=_('Delete document indexes') label=_('Delete document indexes'), name='document_index_delete'
) )
permission_document_indexing_instance_view = namespace.add_permission( permission_document_indexing_instance_view = namespace.add_permission(
name='document_index_instance_view', label=_('View document index instances'),
label=_('View document index instances') name='document_index_instance_view'
) )
permission_document_indexing_view = namespace.add_permission( permission_document_indexing_view = namespace.add_permission(
name='document_index_view', label=_('View document indexes') label=_('View document indexes'), name='document_index_view'
) )
permission_document_indexing_rebuild = namespace.add_permission( permission_document_indexing_rebuild = namespace.add_permission(
name='document_rebuild_indexes', label=_('Rebuild document indexes') label=_('Rebuild document indexes'), name='document_rebuild_indexes'
) )

View File

@@ -5,21 +5,21 @@ from django.utils.translation import ugettext_lazy as _
from mayan.apps.common.queues import queue_tools from mayan.apps.common.queues import queue_tools
from mayan.apps.task_manager.classes import CeleryQueue from mayan.apps.task_manager.classes import CeleryQueue
queue_indexing = CeleryQueue(name='indexing', label=_('Indexing')) queue_indexing = CeleryQueue(label=_('Indexing'), name='indexing')
queue_indexing.add_task_type( queue_indexing.add_task_type(
name='mayan.apps.document_indexing.tasks.task_delete_empty', label=_('Delete empty index nodes'),
label=_('Delete empty index nodes') name='mayan.apps.document_indexing.tasks.task_delete_empty'
) )
queue_indexing.add_task_type( queue_indexing.add_task_type(
name='mayan.apps.document_indexing.tasks.task_remove_document', label=_('Remove document'),
label=_('Remove document') name='mayan.apps.document_indexing.tasks.task_remove_document'
) )
queue_indexing.add_task_type( queue_indexing.add_task_type(
name='mayan.apps.document_indexing.tasks.task_index_document', label=_('Index document'),
label=_('Index document') name='mayan.apps.document_indexing.tasks.task_index_document'
) )
queue_tools.add_task_type( queue_tools.add_task_type(
name='mayan.apps.document_indexing.tasks.task_rebuild_index', label=_('Rebuild index'),
label=_('Rebuild index') name='mayan.apps.document_indexing.tasks.task_rebuild_index'
) )

View File

@@ -46,10 +46,10 @@ class SetupIndexCreateView(SingleObjectCreateView):
class SetupIndexDeleteView(SingleObjectDeleteView): class SetupIndexDeleteView(SingleObjectDeleteView):
model = Index model = Index
object_permission = permission_document_indexing_delete
post_action_redirect = reverse_lazy( post_action_redirect = reverse_lazy(
viewname='indexing:index_setup_list' viewname='indexing:index_setup_list'
) )
object_permission = permission_document_indexing_delete
def get_extra_context(self): def get_extra_context(self):
return { return {
@@ -61,10 +61,10 @@ class SetupIndexDeleteView(SingleObjectDeleteView):
class SetupIndexEditView(SingleObjectEditView): class SetupIndexEditView(SingleObjectEditView):
fields = ('label', 'slug', 'enabled') fields = ('label', 'slug', 'enabled')
model = Index model = Index
object_permission = permission_document_indexing_edit
post_action_redirect = reverse_lazy( post_action_redirect = reverse_lazy(
viewname='indexing:index_setup_list' viewname='indexing:index_setup_list'
) )
object_permission = permission_document_indexing_edit
def get_extra_context(self): def get_extra_context(self):
return { return {
@@ -106,8 +106,9 @@ class SetupIndexDocumentTypesView(AssignRemoveView):
def get_document_queryset(self): def get_document_queryset(self):
return AccessControlList.objects.filter_by_access( return AccessControlList.objects.filter_by_access(
permission_document_view, self.request.user, permission=permission_document_view,
queryset=DocumentType.objects.all() queryset=DocumentType.objects.all(),
user=self.request.user
) )
def get_extra_context(self): def get_extra_context(self):
@@ -168,8 +169,8 @@ class TemplateNodeCreateView(SingleObjectCreateView):
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
AccessControlList.objects.check_access( AccessControlList.objects.check_access(
permissions=permission_document_indexing_edit, user=request.user, obj=self.get_parent_node().index,
obj=self.get_parent_node().index permissions=permission_document_indexing_edit, user=request.user
) )
return super( return super(
@@ -261,7 +262,9 @@ class IndexListView(SingleObjectListView):
def get_object_list(self): def get_object_list(self):
queryset = IndexInstance.objects.filter(enabled=True) queryset = IndexInstance.objects.filter(enabled=True)
return queryset.filter(node_templates__index_instance_nodes__isnull=False).distinct() return queryset.filter(
node_templates__index_instance_nodes__isnull=False
).distinct()
class IndexInstanceNodeView(DocumentListView): class IndexInstanceNodeView(DocumentListView):
@@ -273,8 +276,9 @@ class IndexInstanceNodeView(DocumentListView):
) )
AccessControlList.objects.check_access( AccessControlList.objects.check_access(
obj=self.index_instance_node.index(),
permissions=permission_document_indexing_instance_view, permissions=permission_document_indexing_instance_view,
user=request.user, obj=self.index_instance_node.index() user=request.user
) )
if self.index_instance_node: if self.index_instance_node:
@@ -340,8 +344,8 @@ class DocumentIndexNodeListView(SingleObjectListView):
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
AccessControlList.objects.check_access( AccessControlList.objects.check_access(
permissions=permission_document_view, user=request.user, obj=self.get_document(), permissions=permission_document_view,
obj=self.get_document() user=request.user
) )
return super( return super(

View File

@@ -88,7 +88,7 @@ class DocumentParsingApp(MayanAppConfig):
) )
ModelField( ModelField(
Document, name='versions__pages__content__content' model=Document, name='versions__pages__content__content'
) )
ModelPermission.register( ModelPermission.register(
@@ -107,8 +107,8 @@ class DocumentParsingApp(MayanAppConfig):
SourceColumn( SourceColumn(
attribute='document_version__document', attribute='document_version__document',
is_attribute_absolute_url=True, is_identifier=True, is_sortable=True, is_attribute_absolute_url=True, is_identifier=True,
source=DocumentVersionParseError is_sortable=True, source=DocumentVersionParseError
) )
SourceColumn( SourceColumn(
attribute='datetime_submitted', is_sortable=True, attribute='datetime_submitted', is_sortable=True,

View File

@@ -23,12 +23,18 @@ class Parser(object):
_registry = {} _registry = {}
@classmethod @classmethod
def register(cls, mimetypes, parser_classes): def parse_document_page(cls, document_page):
for mimetype in mimetypes: for parser_class in cls._registry.get(document_page.document_version.mimetype, ()):
for parser_class in parser_classes: try:
cls._registry.setdefault( parser = parser_class()
mimetype, [] parser.process_document_page(document_page)
).append(parser_class) except ParserError:
# If parser raises error, try next parser in the list
pass
else:
# If parser was successfull there is no need to try
# others in the list for this mimetype
return
@classmethod @classmethod
def parse_document_version(cls, document_version): def parse_document_version(cls, document_version):
@@ -45,18 +51,12 @@ class Parser(object):
return return
@classmethod @classmethod
def parse_document_page(cls, document_page): def register(cls, mimetypes, parser_classes):
for parser_class in cls._registry.get(document_page.document_version.mimetype, ()): for mimetype in mimetypes:
try: for parser_class in parser_classes:
parser = parser_class() cls._registry.setdefault(
parser.process_document_page(document_page) mimetype, []
except ParserError: ).append(parser_class)
# If parser raises error, try next parser in the list
pass
else:
# If parser was successfull there is no need to try
# others in the list for this mimetype
return
def process_document_version(self, document_version): def process_document_version(self, document_version):
logger.info( logger.info(

View File

@@ -5,16 +5,16 @@ from django.utils.translation import ugettext_lazy as _
from mayan.apps.permissions import PermissionNamespace from mayan.apps.permissions import PermissionNamespace
namespace = PermissionNamespace( namespace = PermissionNamespace(
name='document_parsing', label=_('Document parsing') label=_('Document parsing'), name='document_parsing'
) )
permission_content_view = namespace.add_permission( permission_content_view = namespace.add_permission(
name='content_view', label=_('View the content of a document') label=_('View the content of a document'), name='content_view'
) )
permission_document_type_parsing_setup = namespace.add_permission( permission_document_type_parsing_setup = namespace.add_permission(
name='document_type_setup', label=_('Change document type parsing settings'),
label=_('Change document type parsing settings') name='document_type_setup'
) )
permission_parse_document = namespace.add_permission( permission_parse_document = namespace.add_permission(
name='parse_document', label=_('Parse the content of a document') label=_('Parse the content of a document'), name='parse_document'
) )

View File

@@ -4,7 +4,7 @@ from django.utils.translation import ugettext_lazy as _
from mayan.apps.smart_settings import Namespace from mayan.apps.smart_settings import Namespace
namespace = Namespace(name='document_parsing', label=_('Document parsing')) namespace = Namespace(label=_('Document parsing'), name='document_parsing')
setting_auto_parsing = namespace.add_setting( setting_auto_parsing = namespace.add_setting(
global_name='DOCUMENT_PARSING_AUTO_PARSING', default=True, global_name='DOCUMENT_PARSING_AUTO_PARSING', default=True,

View File

@@ -178,14 +178,14 @@ class DocumentTypeSubmitView(FormView):
count += 1 count += 1
messages.success( messages.success(
self.request, _( message=_(
'%(count)d documents added to the parsing queue.' '%(count)d documents added to the parsing queue.'
) % { ) % {
'count': count, 'count': count,
} }, requrest=self.request
) )
return HttpResponseRedirect(self.get_success_url()) return HttpResponseRedirect(redirect_to=self.get_success_url())
class ParseErrorListView(SingleObjectListView): class ParseErrorListView(SingleObjectListView):

View File

@@ -16,7 +16,9 @@ from mayan.apps.common.menus import (
from mayan.apps.navigation import SourceColumn from mayan.apps.navigation import SourceColumn
from mayan.celery import app from mayan.celery import app
from .handlers import unverify_key_signatures, verify_key_signatures from .handlers import (
handler_unverify_key_signatures, handler_verify_key_signatures
)
from .links import ( from .links import (
link_document_version_all_signature_verify, link_document_version_all_signature_verify,
link_document_signature_list, link_document_signature_list,
@@ -63,9 +65,9 @@ class DocumentSignaturesApp(MayanAppConfig):
app_label='django_gpg', model_name='Key' app_label='django_gpg', model_name='Key'
) )
EmbeddedSignature = self.get_model('EmbeddedSignature') EmbeddedSignature = self.get_model(model_name='EmbeddedSignature')
SignatureBaseModel = self.get_model('SignatureBaseModel') SignatureBaseModel = self.get_model(model_name='SignatureBaseModel')
DocumentVersion.register_post_save_hook( DocumentVersion.register_post_save_hook(
order=1, func=EmbeddedSignature.objects.create order=1, func=EmbeddedSignature.objects.create
@@ -111,10 +113,10 @@ class DocumentSignaturesApp(MayanAppConfig):
app.conf.CELERY_ROUTES.update( app.conf.CELERY_ROUTES.update(
{ {
'mayan.apps.document_signatures.tasks.task_verify_key_signatures': { 'mayan.apps.document_signatures.tasks.task_handler_verify_key_signatures': {
'queue': 'signatures' 'queue': 'signatures'
}, },
'mayan.apps.document_signatures.tasks.task_unverify_key_signatures': { 'mayan.apps.document_signatures.tasks.task_handler_unhandler_verify_key_signatures': {
'queue': 'signatures' 'queue': 'signatures'
}, },
'mayan.apps.document_signatures.tasks.task_verify_document_version': { 'mayan.apps.document_signatures.tasks.task_verify_document_version': {
@@ -158,12 +160,12 @@ class DocumentSignaturesApp(MayanAppConfig):
) )
post_delete.connect( post_delete.connect(
unverify_key_signatures, dispatch_uid='signatures_handler_unverify_key_signatures',
dispatch_uid='unverify_key_signatures', receiver=handler_unverify_key_signatures,
sender=Key sender=Key
) )
post_save.connect( post_save.connect(
verify_key_signatures, dispatch_uid='signatures_handler_verify_key_signatures',
dispatch_uid='verify_key_signatures', receiver=handler_verify_key_signatures,
sender=Key sender=Key
) )

View File

@@ -1,22 +1,23 @@
from __future__ import unicode_literals from __future__ import unicode_literals
from .tasks import ( from .tasks import (
task_unverify_key_signatures, task_verify_missing_embedded_signature, task_unverify_key_signatures,
task_verify_missing_embedded_signature,
task_verify_key_signatures task_verify_key_signatures
) )
def unverify_key_signatures(sender, **kwargs): def handler_verify_missing_embedded_signature(sender, **kwargs):
task_verify_missing_embedded_signature.delay()
def handler_unverify_key_signatures(sender, **kwargs):
task_unverify_key_signatures.apply_async( task_unverify_key_signatures.apply_async(
kwargs=dict(key_id=kwargs['instance'].key_id) kwargs=dict(key_id=kwargs['instance'].key_id)
) )
def verify_key_signatures(sender, **kwargs): def handler_verify_key_signatures(sender, **kwargs):
task_verify_key_signatures.apply_async( task_verify_key_signatures.apply_async(
kwargs=dict(key_pk=kwargs['instance'].pk) kwargs=dict(key_pk=kwargs['instance'].pk)
) )
def verify_missing_embedded_signature(sender, **kwargs):
task_verify_missing_embedded_signature.delay()

View File

@@ -65,8 +65,8 @@ class SignatureBaseModel(models.Model):
def get_absolute_url(self): def get_absolute_url(self):
return reverse( return reverse(
'document_signatures:document_version_signature_detail', viewname='document_signatures:document_version_signature_detail',
args=(self.pk,) kwargs={'pk': self.pk}
) )
def get_key_id(self): def get_key_id(self):
@@ -98,7 +98,7 @@ class EmbeddedSignature(SignatureBaseModel):
verbose_name_plural = _('Document version embedded signatures') verbose_name_plural = _('Document version embedded signatures')
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
logger.debug('checking for embedded signature') logger.debug(msg='checking for embedded signature')
if self.pk: if self.pk:
raw = True raw = True

View File

@@ -5,34 +5,34 @@ from django.utils.translation import ugettext_lazy as _
from mayan.apps.permissions import PermissionNamespace from mayan.apps.permissions import PermissionNamespace
namespace = PermissionNamespace( namespace = PermissionNamespace(
name='document_signatures', label=_('Document signatures') label=_('Document signatures'), name='document_signatures'
) )
permission_document_version_sign_detached = namespace.add_permission( permission_document_version_sign_detached = namespace.add_permission(
name='document_version_sign_detached', label=_('Sign documents with detached signatures'),
label=_('Sign documents with detached signatures') name='document_version_sign_detached'
) )
permission_document_version_sign_embedded = namespace.add_permission( permission_document_version_sign_embedded = namespace.add_permission(
name='document_version_sign_embedded', label=_('Sign documents with embedded signatures'),
label=_('Sign documents with embedded signatures') name='document_version_sign_embedded'
) )
permission_document_version_signature_delete = namespace.add_permission( permission_document_version_signature_delete = namespace.add_permission(
name='document_version_signature_delete', label=_('Delete detached signatures'),
label=_('Delete detached signatures') name='document_version_signature_delete'
) )
permission_document_version_signature_download = namespace.add_permission( permission_document_version_signature_download = namespace.add_permission(
name='document_version_signature_download', label=_('Download detached document signatures'),
label=_('Download detached document signatures') name='document_version_signature_download'
) )
permission_document_version_signature_upload = namespace.add_permission( permission_document_version_signature_upload = namespace.add_permission(
name='document_version_signature_upload', label=_('Upload detached document signatures'),
label=_('Upload detached document signatures') name='document_version_signature_upload'
) )
permission_document_version_signature_verify = namespace.add_permission( permission_document_version_signature_verify = namespace.add_permission(
name='document_version_signature_verify', label=_('Verify document signatures'),
label=_('Verify document signatures') name='document_version_signature_verify'
) )
permission_document_version_signature_view = namespace.add_permission( permission_document_version_signature_view = namespace.add_permission(
name='document_version_signature_view', label=_('View details of document signatures'),
label=_('View details of document signatures') name='document_version_signature_view'
) )

View File

@@ -5,21 +5,22 @@ from django.utils.translation import ugettext_lazy as _
from mayan.apps.common.queues import queue_tools from mayan.apps.common.queues import queue_tools
from mayan.apps.task_manager.classes import CeleryQueue from mayan.apps.task_manager.classes import CeleryQueue
queue_signatures = CeleryQueue(name='signatures', label=_('Signatures')) queue_signatures = CeleryQueue(label=_('Signatures'), name='signatures')
queue_signatures.add_task_type( queue_signatures.add_task_type(
name='mayan.apps.document_signatures.tasks.task_verify_key_signatures', label=_('Verify key signatures'),
label=_('Verify key signatures') name='mayan.apps.document_signatures.tasks.task_verify_key_signatures'
) )
queue_signatures.add_task_type( queue_signatures.add_task_type(
name='mayan.apps.document_signatures.tasks.task_unverify_key_signatures', label=_('Unverify key signatures'),
label=_('Unverify key signatures') name='mayan.apps.document_signatures.tasks.task_unverify_key_signatures'
) )
queue_signatures.add_task_type( queue_signatures.add_task_type(
name='mayan.apps.document_signatures.tasks.task_verify_document_version', label=_('Verify document version'),
label=_('Verify document version') name='mayan.apps.document_signatures.tasks.task_verify_document_version'
) )
queue_tools.add_task_type( queue_tools.add_task_type(
name='mayan.apps.document_signatures.tasks.task_verify_missing_embedded_signature', label=_('Verify missing embedded signature'),
label=_('Verify missing embedded signature') name='mayan.apps.document_signatures.tasks.task_verify_missing_embedded_signature'
) )

View File

@@ -7,7 +7,8 @@ from django.utils.translation import ugettext_lazy as _
from mayan.apps.smart_settings import Namespace from mayan.apps.smart_settings import Namespace
namespace = Namespace(name='signatures', label=_('Document signatures')) namespace = Namespace(label=_('Document signatures'), name='signatures')
setting_storage_backend = namespace.add_setting( setting_storage_backend = namespace.add_setting(
default='django.core.files.storage.FileSystemStorage', default='django.core.files.storage.FileSystemStorage',
global_name='SIGNATURES_STORAGE_BACKEND', help_text=_( global_name='SIGNATURES_STORAGE_BACKEND', help_text=_(

View File

@@ -69,7 +69,7 @@ class DocumentVersionDetachedSignatureCreateView(FormView):
request=self.request request=self.request
) )
return HttpResponseRedirect( return HttpResponseRedirect(
reverse( redirect_to=reverse(
viewname='signatures:document_version_signature_detached_create', viewname='signatures:document_version_signature_detached_create',
kwargs={'pk': self.get_document_version().pk} kwargs={'pk': self.get_document_version().pk}
) )
@@ -80,7 +80,7 @@ class DocumentVersionDetachedSignatureCreateView(FormView):
request=self.request request=self.request
) )
return HttpResponseRedirect( return HttpResponseRedirect(
reverse( redirect_to=reverse(
viewname='signatures:document_version_signature_detached_create', viewname='signatures:document_version_signature_detached_create',
kwargs={'pk': self.get_document_version().pk} kwargs={'pk': self.get_document_version().pk}
) )
@@ -108,8 +108,9 @@ class DocumentVersionDetachedSignatureCreateView(FormView):
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
AccessControlList.objects.check_access( AccessControlList.objects.check_access(
obj=self.get_document_version().document,
permissions=permission_document_version_sign_detached, permissions=permission_document_version_sign_detached,
user=request.user, obj=self.get_document_version().document user=request.user
) )
return super( return super(
@@ -145,7 +146,7 @@ class DocumentVersionEmbeddedSignatureCreateView(FormView):
passphrase = form.cleaned_data['passphrase'] or None passphrase = form.cleaned_data['passphrase'] or None
AccessControlList.objects.check_access( AccessControlList.objects.check_access(
permissions=permission_key_sign, user=self.request.user, obj=key obj=key, permissions=permission_key_sign, user=self.request.user
) )
try: try:
@@ -159,7 +160,7 @@ class DocumentVersionEmbeddedSignatureCreateView(FormView):
request=self.request request=self.request
) )
return HttpResponseRedirect( return HttpResponseRedirect(
reverse( redirect_to=reverse(
viewname='signatures:document_version_signature_embedded_create', viewname='signatures:document_version_signature_embedded_create',
kwargs={'pk': self.get_document_version().pk} kwargs={'pk': self.get_document_version().pk}
) )
@@ -170,7 +171,7 @@ class DocumentVersionEmbeddedSignatureCreateView(FormView):
request=self.request request=self.request
) )
return HttpResponseRedirect( return HttpResponseRedirect(
reverse( redirect_to=reverse(
viewname='signatures:document_version_signature_embedded_create', viewname='signatures:document_version_signature_embedded_create',
kwargs={'pk': self.get_document_version().pk} kwargs={'pk': self.get_document_version().pk}
) )
@@ -192,7 +193,7 @@ class DocumentVersionEmbeddedSignatureCreateView(FormView):
) )
return HttpResponseRedirect( return HttpResponseRedirect(
reverse( redirect_to=reverse(
viewname='signatures:document_version_signature_list', viewname='signatures:document_version_signature_list',
kwargs={'pk': new_version.pk} kwargs={'pk': new_version.pk}
) )
@@ -204,8 +205,9 @@ class DocumentVersionEmbeddedSignatureCreateView(FormView):
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
AccessControlList.objects.check_access( AccessControlList.objects.check_access(
obj=self.get_document_version().document,
permissions=permission_document_version_sign_embedded, permissions=permission_document_version_sign_embedded,
user=request.user, obj=self.get_document_version().document user=request.user
) )
return super( return super(
@@ -336,8 +338,9 @@ class DocumentVersionSignatureUploadView(SingleObjectCreateView):
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
AccessControlList.objects.check_access( AccessControlList.objects.check_access(
obj=self.get_document_version(),
permissions=permission_document_version_signature_upload, permissions=permission_document_version_signature_upload,
user=request.user, obj=self.get_document_version() user=request.user
) )
return super( return super(

View File

@@ -48,7 +48,7 @@ from .events import (
event_document_view event_document_view
) )
from .handlers import ( from .handlers import (
create_default_document_type, handler_remove_empty_duplicates_lists, handler_create_default_document_type, handler_remove_empty_duplicates_lists,
handler_scan_duplicates_for, handler_scan_duplicates_for,
) )
from .links import ( from .links import (
@@ -121,14 +121,14 @@ class DocumentsApp(MayanAppConfig):
super(DocumentsApp, self).ready() super(DocumentsApp, self).ready()
from actstream import registry from actstream import registry
DeletedDocument = self.get_model('DeletedDocument') DeletedDocument = self.get_model(model_name='DeletedDocument')
Document = self.get_model('Document') Document = self.get_model(model_name='Document')
DocumentPage = self.get_model('DocumentPage') DocumentPage = self.get_model(model_name='DocumentPage')
DocumentPageResult = self.get_model('DocumentPageResult') DocumentPageResult = self.get_model(model_name='DocumentPageResult')
DocumentType = self.get_model('DocumentType') DocumentType = self.get_model(model_name='DocumentType')
DocumentTypeFilename = self.get_model('DocumentTypeFilename') DocumentTypeFilename = self.get_model(model_name='DocumentTypeFilename')
DocumentVersion = self.get_model('DocumentVersion') DocumentVersion = self.get_model(model_name='DocumentVersion')
DuplicatedDocument = self.get_model('DuplicatedDocument') DuplicatedDocument = self.get_model(model_name='DuplicatedDocument')
DynamicSerializerField.add_serializer( DynamicSerializerField.add_serializer(
klass=Document, klass=Document,
@@ -144,29 +144,33 @@ class DocumentsApp(MayanAppConfig):
view='documents:document_type_list' view='documents:document_type_list'
) )
ModelField(Document, name='description') ModelField(model=Document, name='description')
ModelField(Document, name='date_added') ModelField(model=Document, name='date_added')
ModelField(Document, name='deleted_date_time') ModelField(model=Document, name='deleted_date_time')
ModelField(Document, name='document_type__label') ModelField(model=Document, name='document_type__label')
ModelField(Document, name='in_trash') ModelField(model=Document, name='in_trash')
ModelField(Document, name='is_stub') ModelField(model=Document, name='is_stub')
ModelField(Document, name='label') ModelField(model=Document, name='label')
ModelField(Document, name='language') ModelField(model=Document, name='language')
ModelField(Document, name='uuid') ModelField(model=Document, name='uuid')
ModelField( ModelField(
Document, name='versions__checksum' model=Document, name='versions__checksum'
) )
ModelField( ModelField(
Document, label=_('Versions comment'), name='versions__comment' model=Document, label=_('Versions comment'),
name='versions__comment'
) )
ModelField( ModelField(
Document, label=_('Versions encoding'), name='versions__encoding' model=Document, label=_('Versions encoding'),
name='versions__encoding'
) )
ModelField( ModelField(
Document, label=_('Versions mime type'), name='versions__mimetype' model=Document, label=_('Versions mime type'),
name='versions__mimetype'
) )
ModelField( ModelField(
Document, label=_('Versions timestamp'), name='versions__timestamp' model=Document, label=_('Versions timestamp'),
name='versions__timestamp'
) )
ModelEventType.register( ModelEventType.register(
@@ -245,19 +249,17 @@ class DocumentsApp(MayanAppConfig):
is_sortable=True, source=Document is_sortable=True, source=Document
) )
SourceColumn( SourceColumn(
source=Document, label=_('Thumbnail'),
func=lambda context: document_page_thumbnail_widget.render( func=lambda context: document_page_thumbnail_widget.render(
instance=context['object'] instance=context['object']
) ), label=_('Thumbnail'), source=Document
) )
SourceColumn( SourceColumn(
attribute='document_type', is_sortable=True, source=Document, attribute='document_type', is_sortable=True, source=Document,
) )
SourceColumn( SourceColumn(
source=Document, label=_('Pages'),
func=lambda context: widget_document_page_number( func=lambda context: widget_document_page_number(
document=context['object'] document=context['object']
) ), label=_('Pages'), source=Document
) )
SourceColumn( SourceColumn(
attribute='date_added', include_label=True, is_sortable=True, attribute='date_added', include_label=True, is_sortable=True,
@@ -272,22 +274,20 @@ class DocumentsApp(MayanAppConfig):
# DocumentPage # DocumentPage
SourceColumn( SourceColumn(
source=DocumentPage, label=_('Thumbnail'),
func=lambda context: document_page_thumbnail_widget.render( func=lambda context: document_page_thumbnail_widget.render(
instance=context['object'] instance=context['object']
) ), label=_('Thumbnail'), source=DocumentPage
) )
SourceColumn( SourceColumn(
source=DocumentPageResult, label=_('Thumbnail'),
func=lambda context: document_page_thumbnail_widget.render( func=lambda context: document_page_thumbnail_widget.render(
instance=context['object'] instance=context['object']
) ), label=_('Thumbnail'), source=DocumentPageResult
) )
SourceColumn( SourceColumn(
source=DocumentPageResult, label=_('Type'), attribute='document_version.document.document_type',
attribute='document_version.document.document_type' label=_('Type'), source=DocumentPageResult
) )
# DocumentType # DocumentType
@@ -297,10 +297,9 @@ class DocumentsApp(MayanAppConfig):
) )
SourceColumn( SourceColumn(
source=DocumentType, label=_('Documents'),
func=lambda context: context['object'].get_document_count( func=lambda context: context['object'].get_document_count(
user=context['request'].user user=context['request'].user
) ), label=_('Documents'), source=DocumentType
) )
SourceColumn( SourceColumn(
@@ -318,16 +317,15 @@ class DocumentsApp(MayanAppConfig):
source=DeletedDocument source=DeletedDocument
) )
SourceColumn( SourceColumn(
source=DeletedDocument, label=_('Thumbnail'),
func=lambda context: document_page_thumbnail_widget.render( func=lambda context: document_page_thumbnail_widget.render(
instance=context['object'] instance=context['object']
) ), label=_('Thumbnail'), source=DeletedDocument
) )
SourceColumn( SourceColumn(
attribute='document_type', is_sortable=True, source=DeletedDocument attribute='document_type', is_sortable=True, source=DeletedDocument
) )
SourceColumn( SourceColumn(
source=DeletedDocument, attribute='deleted_date_time' attribute='deleted_date_time', source=DeletedDocument
) )
# DocumentVersion # DocumentVersion
@@ -336,16 +334,14 @@ class DocumentsApp(MayanAppConfig):
is_object_absolute_url=True is_object_absolute_url=True
) )
SourceColumn( SourceColumn(
source=DocumentVersion, label=_('Thumbnail'),
func=lambda context: document_page_thumbnail_widget.render( func=lambda context: document_page_thumbnail_widget.render(
instance=context['object'] instance=context['object']
) ), label=_('Thumbnail'), source=DocumentVersion
) )
SourceColumn( SourceColumn(
source=DocumentVersion, label=_('Pages'),
func=lambda context: widget_document_version_page_number( func=lambda context: widget_document_version_page_number(
document_version=context['object'] document_version=context['object']
) ), label=_('Pages'), source=DocumentVersion
) )
SourceColumn( SourceColumn(
attribute='mimetype', is_sortable=True, source=DocumentVersion attribute='mimetype', is_sortable=True, source=DocumentVersion
@@ -611,15 +607,15 @@ class DocumentsApp(MayanAppConfig):
post_delete.connect( post_delete.connect(
dispatch_uid='handler_remove_empty_duplicates_lists', dispatch_uid='handler_remove_empty_duplicates_lists',
receiver=handler_remove_empty_duplicates_lists, receiver=handler_remove_empty_duplicates_lists,
sender=Document, sender=Document
) )
post_initial_setup.connect( post_initial_setup.connect(
create_default_document_type, dispatch_uid='handler_create_default_document_type',
dispatch_uid='create_default_document_type' receiver=handler_create_default_document_type
) )
post_version_upload.connect( post_version_upload.connect(
handler_scan_duplicates_for,
dispatch_uid='handler_scan_duplicates_for', dispatch_uid='handler_scan_duplicates_for',
receiver=handler_scan_duplicates_for
) )
registry.register(DeletedDocument) registry.register(DeletedDocument)

View File

@@ -23,7 +23,7 @@ class DashboardWidgetDocumentPagesTotal(DashboardWidgetNumeric):
icon_class = icon_dashboard_pages_per_month icon_class = icon_dashboard_pages_per_month
label = _('Total pages') label = _('Total pages')
link = reverse_lazy( link = reverse_lazy(
'statistics:statistic_detail', viewname='statistics:statistic_detail',
args=('total-document-pages-at-each-month',) args=('total-document-pages-at-each-month',)
) )

View File

@@ -4,35 +4,35 @@ from django.utils.translation import ugettext_lazy as _
from mayan.apps.events import EventTypeNamespace from mayan.apps.events import EventTypeNamespace
namespace = EventTypeNamespace(name='documents', label=_('Documents')) namespace = EventTypeNamespace(label=_('Documents'), name='documents')
event_document_create = namespace.add_event_type( event_document_create = namespace.add_event_type(
name='document_create', label=_('Document created') label=_('Document created'), name='document_create'
) )
event_document_download = namespace.add_event_type( event_document_download = namespace.add_event_type(
name='document_download', label=_('Document downloaded') label=_('Document downloaded'), name='document_download'
) )
event_document_new_version = namespace.add_event_type( event_document_new_version = namespace.add_event_type(
name='document_new_version', label=_('New version uploaded') label=_('New version uploaded'), name='document_new_version'
) )
event_document_properties_edit = namespace.add_event_type( event_document_properties_edit = namespace.add_event_type(
name='document_edit', label=_('Document properties edited') label=_('Document properties edited'), name='document_edit'
) )
# The type of an existing document is changed to another type # The type of an existing document is changed to another type
event_document_type_change = namespace.add_event_type( event_document_type_change = namespace.add_event_type(
name='document_type_change', label=_('Document type changed') label=_('Document type changed'), name='document_type_change'
) )
# A document type is created # A document type is created
event_document_type_created = namespace.add_event_type( event_document_type_created = namespace.add_event_type(
name='document_type_created', label=_('Document type created') label=_('Document type created'), name='document_type_created'
) )
# An existing document type is modified # An existing document type is modified
event_document_type_edited = namespace.add_event_type( event_document_type_edited = namespace.add_event_type(
name='document_type_edit', label=_('Document type edited') label=_('Document type edited'), name='document_type_edit'
) )
event_document_version_revert = namespace.add_event_type( event_document_version_revert = namespace.add_event_type(
name='document_version_revert', label=_('Document version reverted') label=_('Document version reverted'), name='document_version_revert'
) )
event_document_view = namespace.add_event_type( event_document_view = namespace.add_event_type(
name='document_view', label=_('Document viewed') label=_('Document viewed'), name='document_view'
) )

View File

@@ -7,7 +7,7 @@ from .signals import post_initial_document_type
from .tasks import task_clean_empty_duplicate_lists, task_scan_duplicates_for from .tasks import task_clean_empty_duplicate_lists, task_scan_duplicates_for
def create_default_document_type(sender, **kwargs): def handler_create_default_document_type(sender, **kwargs):
DocumentType = apps.get_model( DocumentType = apps.get_model(
app_label='documents', model_name='DocumentType' app_label='documents', model_name='DocumentType'
) )

View File

@@ -60,7 +60,7 @@ class DocumentPageManager(models.Manager):
class DocumentTypeManager(models.Manager): class DocumentTypeManager(models.Manager):
def check_delete_periods(self): def check_delete_periods(self):
logger.info('Executing') logger.info(msg='Executing')
for document_type in self.all(): for document_type in self.all():
logger.info( logger.info(
@@ -88,10 +88,10 @@ class DocumentTypeManager(models.Manager):
'Document type: %s, has a no retention delta', document_type 'Document type: %s, has a no retention delta', document_type
) )
logger.info('Finshed') logger.info(msg='Finshed')
def check_trash_periods(self): def check_trash_periods(self):
logger.info('Executing') logger.info(msg='Executing')
for document_type in self.all(): for document_type in self.all():
logger.info( logger.info(
@@ -119,7 +119,7 @@ class DocumentTypeManager(models.Manager):
'Document type: %s, has a no retention delta', document_type 'Document type: %s, has a no retention delta', document_type
) )
logger.info('Finshed') logger.info(msg='Finshed')
def get_by_natural_key(self, label): def get_by_natural_key(self, label):
return self.get(label=label) return self.get(label=label)

View File

@@ -1,8 +1,6 @@
from __future__ import absolute_import, unicode_literals from __future__ import absolute_import, unicode_literals
import hashlib
import logging import logging
import uuid
from furl import furl from furl import furl
@@ -33,15 +31,6 @@ __all__ = ('DocumentPage', 'DocumentPageCachedImage', 'DocumentPageResult')
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
# document image cache name hash function
def hash_function():
return hashlib.sha256()
def UUID_FUNCTION(*args, **kwargs):
return force_text(uuid.uuid4())
@python_2_unicode_compatible @python_2_unicode_compatible
class DocumentPage(models.Model): class DocumentPage(models.Model):
""" """

View File

@@ -1,13 +1,11 @@
from __future__ import absolute_import, unicode_literals from __future__ import absolute_import, unicode_literals
import hashlib
import logging import logging
import uuid
from django.apps import apps from django.apps import apps
from django.db import models, transaction from django.db import models, transaction
from django.urls import reverse from django.urls import reverse
from django.utils.encoding import force_text, python_2_unicode_compatible from django.utils.encoding import python_2_unicode_compatible
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from mayan.apps.acls.models import AccessControlList from mayan.apps.acls.models import AccessControlList
@@ -23,15 +21,6 @@ __all__ = ('DocumentType', 'DocumentTypeFilename')
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
# document image cache name hash function
def hash_function():
return hashlib.sha256()
def UUID_FUNCTION(*args, **kwargs):
return force_text(uuid.uuid4())
@python_2_unicode_compatible @python_2_unicode_compatible
class DocumentType(models.Model): class DocumentType(models.Model):
""" """

View File

@@ -1,8 +1,6 @@
from __future__ import absolute_import, unicode_literals from __future__ import absolute_import, unicode_literals
import hashlib
import logging import logging
import uuid
from django.conf import settings from django.conf import settings
from django.db import models from django.db import models
@@ -23,15 +21,6 @@ __all__ = (
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
# document image cache name hash function
def hash_function():
return hashlib.sha256()
def UUID_FUNCTION(*args, **kwargs):
return force_text(uuid.uuid4())
class DeletedDocument(Document): class DeletedDocument(Document):
objects = TrashCanManager() objects = TrashCanManager()

View File

@@ -4,65 +4,66 @@ from django.utils.translation import ugettext_lazy as _
from mayan.apps.permissions import PermissionNamespace from mayan.apps.permissions import PermissionNamespace
namespace = PermissionNamespace(name='documents', label=_('Documents')) namespace = PermissionNamespace(label=_('Documents'), name='documents')
permission_document_create = namespace.add_permission( permission_document_create = namespace.add_permission(
name='document_create', label=_('Create documents') label=_('Create documents'), name='document_create'
) )
permission_document_delete = namespace.add_permission( permission_document_delete = namespace.add_permission(
name='document_delete', label=_('Delete documents') label=_('Delete documents'), name='document_delete'
) )
permission_document_trash = namespace.add_permission( permission_document_trash = namespace.add_permission(
name='document_trash', label=_('Trash documents') label=_('Trash documents'), name='document_trash'
) )
permission_document_download = namespace.add_permission( permission_document_download = namespace.add_permission(
name='document_download', label=_('Download documents') label=_('Download documents'), name='document_download'
) )
permission_document_edit = namespace.add_permission( permission_document_edit = namespace.add_permission(
name='document_edit', label=_('Edit documents') label=_('Edit documents'), name='document_edit'
) )
permission_document_new_version = namespace.add_permission( permission_document_new_version = namespace.add_permission(
name='document_new_version', label=_('Create new document versions') label=_('Create new document versions'), name='document_new_version'
) )
permission_document_properties_edit = namespace.add_permission( permission_document_properties_edit = namespace.add_permission(
name='document_properties_edit', label=_('Edit document properties') label=_('Edit document properties'), name='document_properties_edit'
) )
permission_document_print = namespace.add_permission( permission_document_print = namespace.add_permission(
name='document_print', label=_('Print documents') label=_('Print documents'), name='document_print'
) )
permission_document_restore = namespace.add_permission( permission_document_restore = namespace.add_permission(
name='document_restore', label=_('Restore trashed document') label=_('Restore trashed document'), name='document_restore'
) )
permission_document_tools = namespace.add_permission( permission_document_tools = namespace.add_permission(
name='document_tools', label=_('Execute document modifying tools') label=_('Execute document modifying tools'), name='document_tools'
) )
permission_document_version_revert = namespace.add_permission( permission_document_version_revert = namespace.add_permission(
name='document_version_revert', label=_('Revert documents to a previous version'),
label=_('Revert documents to a previous version') name='document_version_revert'
) )
permission_document_version_view = namespace.add_permission( permission_document_version_view = namespace.add_permission(
name='document_version_view', label=_('View documents\' versions list'),
label=_('View documents\' versions list') name='document_version_view'
) )
permission_document_view = namespace.add_permission( permission_document_view = namespace.add_permission(
name='document_view', label=_('View documents') label=_('View documents'), name='document_view'
) )
permission_empty_trash = namespace.add_permission( permission_empty_trash = namespace.add_permission(
name='document_empty_trash', label=_('Empty trash') label=_('Empty trash'), name='document_empty_trash'
) )
setup_namespace = PermissionNamespace( setup_namespace = PermissionNamespace(
name='documents_types', label=_('Document types') label=_('Document types'), name='documents_types'
) )
permission_document_type_create = setup_namespace.add_permission( permission_document_type_create = setup_namespace.add_permission(
name='document_type_create', label=_('Create document types') label=_('Create document types'), name='document_type_create'
) )
permission_document_type_delete = setup_namespace.add_permission( permission_document_type_delete = setup_namespace.add_permission(
name='document_type_delete', label=_('Delete document types') label=_('Delete document types'), name='document_type_delete'
) )
permission_document_type_edit = setup_namespace.add_permission( permission_document_type_edit = setup_namespace.add_permission(
name='document_type_edit', label=_('Edit document types') label=_('Edit document types'), name='document_type_edit'
) )
permission_document_type_view = setup_namespace.add_permission( permission_document_type_view = setup_namespace.add_permission(
name='document_type_view', label=_('View document types') label=_('View document types'), name='document_type_view'
) )

View File

@@ -9,7 +9,7 @@ from .permissions import permission_document_view
document_search = SearchModel( document_search = SearchModel(
app_label='documents', model_name='Document', app_label='documents', model_name='Document',
permission=permission_document_view, permission=permission_document_view,
serializer_string='mayan.apps.documents.serializers.DocumentSerializer' serializer_path='mayan.apps.documents.serializers.DocumentSerializer'
) )
document_search.add_model_field( document_search.add_model_field(
@@ -27,7 +27,7 @@ document_search.add_model_field(
document_page_search = SearchModel( document_page_search = SearchModel(
app_label='documents', model_name='DocumentPageResult', app_label='documents', model_name='DocumentPageResult',
permission=permission_document_view, permission=permission_document_view,
serializer_string='mayan.apps.documents.serializers.DocumentPageSerializer' serializer_path='mayan.apps.documents.serializers.DocumentPageSerializer'
) )
document_page_search.add_model_field( document_page_search.add_model_field(

View File

@@ -26,14 +26,14 @@ class DocumentPageSerializer(serializers.HyperlinkedModelSerializer):
def get_document_version_url(self, instance): def get_document_version_url(self, instance):
return reverse( return reverse(
'rest_api:documentversion-detail', args=( viewname='rest_api:documentversion-detail', args=(
instance.document.pk, instance.document_version.pk, instance.document.pk, instance.document_version.pk,
), request=self.context['request'], format=self.context['format'] ), request=self.context['request'], format=self.context['format']
) )
def get_image_url(self, instance): def get_image_url(self, instance):
return reverse( return reverse(
'rest_api:documentpage-image', args=( viewname='rest_api:documentpage-image', args=(
instance.document.pk, instance.document_version.pk, instance.document.pk, instance.document_version.pk,
instance.pk, instance.pk,
), request=self.context['request'], format=self.context['format'] ), request=self.context['request'], format=self.context['format']
@@ -41,7 +41,7 @@ class DocumentPageSerializer(serializers.HyperlinkedModelSerializer):
def get_url(self, instance): def get_url(self, instance):
return reverse( return reverse(
'rest_api:documentpage-detail', args=( viewname='rest_api:documentpage-detail', args=(
instance.document.pk, instance.document_version.pk, instance.document.pk, instance.document_version.pk,
instance.pk, instance.pk,
), request=self.context['request'], format=self.context['format'] ), request=self.context['request'], format=self.context['format']
@@ -121,28 +121,28 @@ class DocumentVersionSerializer(serializers.HyperlinkedModelSerializer):
def get_document_url(self, instance): def get_document_url(self, instance):
return reverse( return reverse(
'rest_api:document-detail', args=( viewname='rest_api:document-detail', args=(
instance.document.pk, instance.document.pk,
), request=self.context['request'], format=self.context['format'] ), request=self.context['request'], format=self.context['format']
) )
def get_download_url(self, instance): def get_download_url(self, instance):
return reverse( return reverse(
'rest_api:documentversion-download', args=( viewname='rest_api:documentversion-download', args=(
instance.document.pk, instance.pk, instance.document.pk, instance.pk,
), request=self.context['request'], format=self.context['format'] ), request=self.context['request'], format=self.context['format']
) )
def get_pages_url(self, instance): def get_pages_url(self, instance):
return reverse( return reverse(
'rest_api:documentversion-page-list', args=( viewname='rest_api:documentversion-page-list', args=(
instance.document.pk, instance.pk, instance.document.pk, instance.pk,
), request=self.context['request'], format=self.context['format'] ), request=self.context['request'], format=self.context['format']
) )
def get_url(self, instance): def get_url(self, instance):
return reverse( return reverse(
'rest_api:documentversion-detail', args=( viewname='rest_api:documentversion-detail', args=(
instance.document.pk, instance.pk, instance.document.pk, instance.pk,
), request=self.context['request'], format=self.context['format'] ), request=self.context['request'], format=self.context['format']
) )
@@ -167,28 +167,28 @@ class WritableDocumentVersionSerializer(serializers.ModelSerializer):
def get_document_url(self, instance): def get_document_url(self, instance):
return reverse( return reverse(
'rest_api:document-detail', args=( viewname='rest_api:document-detail', args=(
instance.document.pk, instance.document.pk,
), request=self.context['request'], format=self.context['format'] ), request=self.context['request'], format=self.context['format']
) )
def get_download_url(self, instance): def get_download_url(self, instance):
return reverse( return reverse(
'rest_api:documentversion-download', args=( viewname='rest_api:documentversion-download', args=(
instance.document.pk, instance.pk, instance.document.pk, instance.pk,
), request=self.context['request'], format=self.context['format'] ), request=self.context['request'], format=self.context['format']
) )
def get_pages_url(self, instance): def get_pages_url(self, instance):
return reverse( return reverse(
'rest_api:documentversion-page-list', args=( viewname='rest_api:documentversion-page-list', args=(
instance.document.pk, instance.pk, instance.document.pk, instance.pk,
), request=self.context['request'], format=self.context['format'] ), request=self.context['request'], format=self.context['format']
) )
def get_url(self, instance): def get_url(self, instance):
return reverse( return reverse(
'rest_api:documentversion-detail', args=( viewname='rest_api:documentversion-detail', args=(
instance.document.pk, instance.pk, instance.document.pk, instance.pk,
), request=self.context['request'], format=self.context['format'] ), request=self.context['request'], format=self.context['format']
) )

View File

@@ -11,7 +11,7 @@ from .literals import (
DEFAULT_DOCUMENTS_HASH_BLOCK_SIZE, DEFAULT_LANGUAGE, DEFAULT_LANGUAGE_CODES DEFAULT_DOCUMENTS_HASH_BLOCK_SIZE, DEFAULT_LANGUAGE, DEFAULT_LANGUAGE_CODES
) )
namespace = Namespace(name='documents', label=_('Documents')) namespace = Namespace(label=_('Documents'), name='documents')
setting_documentimagecache_storage = namespace.add_setting( setting_documentimagecache_storage = namespace.add_setting(
global_name='DOCUMENTS_CACHE_STORAGE_BACKEND', global_name='DOCUMENTS_CACHE_STORAGE_BACKEND',

View File

@@ -10,7 +10,8 @@ except ImportError:
from django.utils.module_loading import import_string from django.utils.module_loading import import_string
from .settings import ( from .settings import (
setting_documentimagecache_storage, setting_documentimagecache_storage_arguments, setting_documentimagecache_storage,
setting_documentimagecache_storage_arguments,
setting_storage_backend, setting_storage_backend_arguments setting_storage_backend, setting_storage_backend_arguments
) )

View File

@@ -58,10 +58,10 @@ def task_delete_document(deleted_document_id):
app_label='documents', model_name='DeletedDocument' app_label='documents', model_name='DeletedDocument'
) )
logger.debug('Executing') logger.debug(msg='Executing')
deleted_document = DeletedDocument.objects.get(pk=deleted_document_id) deleted_document = DeletedDocument.objects.get(pk=deleted_document_id)
deleted_document.delete() deleted_document.delete()
logger.debug('Finshed') logger.debug(msg='Finshed')
@app.task(ignore_result=True) @app.task(ignore_result=True)
@@ -70,9 +70,9 @@ def task_delete_stubs():
app_label='documents', model_name='Document' app_label='documents', model_name='Document'
) )
logger.info('Executing') logger.info(msg='Executing')
Document.passthrough.delete_stubs() Document.passthrough.delete_stubs()
logger.info('Finshed') logger.info(msg='Finshed')
@app.task() @app.task()

View File

@@ -18,23 +18,23 @@ class DocumentSearchTestCase(DocumentTestMixin, BaseTestCase):
) )
def test_document_page_search_no_access(self): def test_document_page_search_no_access(self):
queryset, elapsed_time = self._perform_document_page_search() queryset = self._perform_document_page_search()
self.assertFalse(self.document.pages.first() in queryset) self.assertFalse(self.document.pages.first() in queryset)
def test_document_page_search_with_access(self): def test_document_page_search_with_access(self):
self.grant_access( self.grant_access(
obj=self.test_document, permission=permission_document_view obj=self.test_document, permission=permission_document_view
) )
queryset, elapsed_time = self._perform_document_page_search() queryset = self._perform_document_page_search()
self.assertTrue(self.document.pages.first() in queryset) self.assertTrue(self.document.pages.first() in queryset)
def test_document_search_no_access(self): def test_document_search_no_access(self):
queryset, elapsed_time = self._perform_document_search() queryset = self._perform_document_search()
self.assertFalse(self.document in queryset) self.assertFalse(self.document in queryset)
def test_document_search_with_access(self): def test_document_search_with_access(self):
self.grant_access( self.grant_access(
obj=self.test_document, permission=permission_document_view obj=self.test_document, permission=permission_document_view
) )
queryset, elapsed_time = self._perform_document_search() queryset = self._perform_document_search()
self.assertTrue(self.document in queryset) self.assertTrue(self.document in queryset)

View File

@@ -714,7 +714,7 @@ class RecentAddedDocumentListView(DocumentListView):
pk__in=Document.objects.order_by('-date_added')[ pk__in=Document.objects.order_by('-date_added')[
:setting_recent_added_count.value :setting_recent_added_count.value
].values('pk') ].values('pk')
). order_by('-date_added') ).order_by('-date_added')
def get_extra_context(self): def get_extra_context(self):
context = super(RecentAddedDocumentListView, self).get_extra_context() context = super(RecentAddedDocumentListView, self).get_extra_context()

View File

@@ -93,13 +93,13 @@ class SearchModel(object):
return result return result
def __init__(self, app_label, model_name, serializer_string, label=None, permission=None): def __init__(self, app_label, model_name, serializer_path, label=None, permission=None):
self.app_label = app_label self.app_label = app_label
self.model_name = model_name self.model_name = model_name
self.search_fields = [] self.search_fields = []
self._model = None # Lazy self._model = None # Lazy
self._label = label self._label = label
self.serializer_path = serializer_string self.serializer_path = serializer_path
self.permission = permission self.permission = permission
self.__class__._registry[self.get_full_name()] = self self.__class__._registry[self.get_full_name()] = self

View File

@@ -11,7 +11,6 @@ from mayan.apps.common.generics import SimpleView, SingleObjectListView
from .forms import SearchForm, AdvancedSearchForm from .forms import SearchForm, AdvancedSearchForm
from .icons import icon_search_submit from .icons import icon_search_submit
from .mixins import SearchModelMixin from .mixins import SearchModelMixin
from .settings import setting_limit
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -27,7 +26,6 @@ class ResultsView(SearchModelMixin, SingleObjectListView):
), ),
'no_results_title': _('No search results'), 'no_results_title': _('No search results'),
'search_model': self.search_model, 'search_model': self.search_model,
'search_results_limit': setting_limit.value,
'title': _('Search results for: %s') % self.search_model.label, 'title': _('Search results for: %s') % self.search_model.label,
} }

View File

@@ -35,6 +35,8 @@ class EventsApp(MayanAppConfig):
Notification = self.get_model(model_name='Notification') Notification = self.get_model(model_name='Notification')
StoredEventType = self.get_model(model_name='StoredEventType') StoredEventType = self.get_model(model_name='StoredEventType')
# Add labels to Action model, they are not marked translatable in the
# upstream package.
SourceColumn( SourceColumn(
attribute='timestamp', is_identifier=True, attribute='timestamp', is_identifier=True,
is_sortable=True, label=_('Date and time'), source=Action is_sortable=True, label=_('Date and time'), source=Action

View File

@@ -4,8 +4,8 @@ from django.utils.translation import ugettext_lazy as _
from mayan.apps.permissions import PermissionNamespace from mayan.apps.permissions import PermissionNamespace
namespace = PermissionNamespace(name='events', label=_('Events')) namespace = PermissionNamespace(label=_('Events'), name='events')
permission_events_view = namespace.add_permission( permission_events_view = namespace.add_permission(
name='events_view', label=_('Access the events of an object') label=_('Access the events of an object'), name='events_view'
) )

Some files were not shown because too many files have changed in this diff Show More