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):
super(ACLsApp, self).ready()
AccessControlList = self.get_model('AccessControlList')
AccessControlList = self.get_model(model_name='AccessControlList')
SourceColumn(
attribute='role', is_sortable=True, source=AccessControlList,

View File

@@ -8,9 +8,9 @@ logger = logging.getLogger(__name__)
class ModelPermission(object):
_registry = {}
_proxies = {}
_inheritances = {}
_proxies = {}
_registry = {}
@classmethod
def register(cls, model, permissions):
@@ -36,7 +36,7 @@ class ModelPermission(object):
if as_content_type:
content_type_dictionary = ContentType.objects.get_for_models(
*cls._registry.keys()
models=cls._registry.keys()
)
content_type_ids = [
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):
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
namespace = PermissionNamespace(name='acls', label=_('Access control lists'))
namespace = PermissionNamespace(label=_('Access control lists'), name='acls')
permission_acl_edit = namespace.add_permission(
name='acl_edit', label=_('Edit ACLs')
label=_('Edit ACLs'), name='acl_edit'
)
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
AccessControlList.objects.check_access(
permissions=permission_acl_edit, user=request.user,
obj=self.content_object
obj=self.content_object, permissions=permission_acl_edit,
user=request.user
)
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'])
AccessControlList.objects.check_access(
permissions=permission_acl_edit, user=request.user,
obj=acl.content_object
obj=acl.content_object, permissions=permission_acl_edit,
user=request.user
)
return super(ACLDeleteView, self).dispatch(request, *args, **kwargs)
@@ -126,8 +126,8 @@ class ACLListView(SingleObjectListView):
raise Http404
AccessControlList.objects.check_access(
permissions=permission_acl_view, user=request.user,
obj=self.content_object
obj=self.content_object, permissions=permission_acl_view,
user=request.user
)
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
namespace = Namespace(name='appearance', label=_('Appearance'))
namespace = Namespace(label=_('Appearance'), name='appearance')
setting_max_title_length = namespace.add_setting(
default=DEFAULT_MAXIMUM_TITLE_LENGTH,
global_name='APPEARANCE_MAXIMUM_TITLE_LENGTH', help_text=_(

View File

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

View File

@@ -24,4 +24,4 @@ def get_form_media_js(form):
@register.simple_tag
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
def check_for_test_cookie(self):
warnings.warn('check_for_test_cookie is deprecated; ensure your login '
'view is CSRF-protected.', DeprecationWarning)
warnings.warn(
'check_for_test_cookie is deprecated; ensure your login '
'view is CSRF-protected.', DeprecationWarning
)
def get_user_id(self):
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
namespace = Namespace(name='authentication', label=_('Authentication'))
namespace = Namespace(label=_('Authentication'), name='authentication')
setting_login_method = namespace.add_setting(
global_name='AUTHENTICATION_LOGIN_METHOD', default=DEFAULT_LOGIN_METHOD,
help_text=_(

View File

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

View File

@@ -4,7 +4,7 @@ from django.utils.translation import ugettext_lazy as _
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(
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
namespace = PermissionNamespace(name='cabinets', label=_('Cabinets'))
namespace = PermissionNamespace(label=_('Cabinets'), name='cabinets')
# Translators: this refers to the permission that will allow users to add
# documents to cabinets.
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(
name='cabinet_create', label=_('Create cabinets')
label=_('Create cabinets'), name='cabinet_create'
)
permission_cabinet_delete = namespace.add_permission(
name='cabinet_delete', label=_('Delete cabinets')
label=_('Delete cabinets'), name='cabinet_delete'
)
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(
name='cabinet_remove_document', label=_('Remove documents from cabinets')
label=_('Remove documents from cabinets'), name='cabinet_remove_document'
)
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(
app_label='cabinets', model_name='Cabinet',
permission=permission_cabinet_view,
serializer_string='mayan.apps.cabinets.serializers.CabinetSerializer'
serializer_path='mayan.apps.cabinets.serializers.CabinetSerializer'
)
cabinet_search.add_model_field(

View File

@@ -41,9 +41,7 @@ class CabinetAPITestCase(CabinetTestMixin, BaseAPITestCase):
response = self._request_cabinet_create_api_view()
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
cabinet = Cabinet.objects.first()
self.assertEqual(response.data['id'], cabinet.pk)
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.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):

View File

@@ -127,7 +127,9 @@ class CabinetDocumentViewTestCase(CabinetTestMixin, GenericDocumentViewTestCase)
def test_cabinet_add_document_view_with_access(self):
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(
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):
return self.post(
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.grant_access(
obj=self.test_cabinet, permission=permission_cabinet_remove_document
obj=self.test_cabinet,
permission=permission_cabinet_remove_document
)
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()
@@ -236,7 +241,9 @@ class CabinetDocumentViewTestCase(CabinetTestMixin, GenericDocumentViewTestCase)
def test_cabinet_list_view_with_access(self):
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()
self.assertContains(

View File

@@ -45,12 +45,14 @@ class CabinetDocumentUploadTestCase(CabinetTestMixin, GenericDocumentViewTestCas
def test_upload_interactive_view_with_access(self):
self._create_test_cabinet()
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()
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):
return self.get(viewname='sources:document_create_multiple')
@@ -64,5 +66,6 @@ class CabinetDocumentUploadTestCase(CabinetTestMixin, GenericDocumentViewTestCas
permission=permission_document_create, obj=self.document_type
)
response = self._request_wizard_view()
self.assertEqual(response.status_code, 200)

View File

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

View File

@@ -43,7 +43,8 @@ def widget_document_cabinets(document, user):
)
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(

View File

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

View File

@@ -20,7 +20,7 @@ from .events import (
event_document_auto_check_in, event_document_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 (
link_check_in_document, link_check_out_document, link_check_out_info,
link_check_out_list
@@ -114,7 +114,9 @@ class CheckoutsApp(MayanAppConfig):
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_secondary.bind_links(
links=(link_check_out_document, link_check_in_document),
@@ -125,7 +127,7 @@ class CheckoutsApp(MayanAppConfig):
)
pre_save.connect(
check_new_version_creation,
dispatch_uid='check_new_version_creation',
dispatch_uid='checkouts_handler_check_new_version_creation',
receiver=handler_check_new_version_creation,
sender=DocumentVersion
)

View File

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

View File

@@ -4,19 +4,19 @@ from django.utils.translation import ugettext_lazy as _
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(
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(
name='document_check_in', label=_('Document checked in')
label=_('Document checked in'), name='document_check_in'
)
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(
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
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
"""

View File

@@ -66,11 +66,15 @@ class DocumentCheckout(models.Model):
def delete(self, *args, **kwargs):
# TODO: enclose in transaction
NewVersionBlock.objects.unblock(self.document)
NewVersionBlock.objects.unblock(document=self.document)
super(DocumentCheckout, self).delete(*args, **kwargs)
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):
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
namespace = PermissionNamespace(name='checkouts', label=_('Document checkout'))
namespace = PermissionNamespace(label=_('Document checkout'), name='checkouts')
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(
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(
name='checkout_document', label=_('Check out documents')
label=_('Check out documents'), name='checkout_document'
)
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
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(
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'))
AccessControlList.objects.check_access(
permissions=permission_document_check_out,
user=self.context['request'].user, obj=document
obj=document, permissions=permission_document_check_out,
user=self.context['request'].user
)
validated_data['document'] = document

View File

@@ -19,7 +19,7 @@ def task_check_expired_check_outs():
app_label='checkouts', model_name='DocumentCheckout'
)
logger.debug('executing...')
logger.debug(msg='executing...')
lock_id = 'task_expired_check_outs'
try:
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()
lock.release()
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(
document=self.test_document,
block_new_version=True, document=self.test_document,
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):
# auto
def test_document_check_out(self):
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'])
AccessControlList.objects.check_access(
permissions=permission_document_check_out, user=request.user,
obj=self.document
obj=self.document, permissions=permission_document_check_out,
user=request.user
)
return super(
@@ -57,7 +57,7 @@ class CheckoutDocumentView(SingleObjectCreateView):
) % self.document, request=self.request
)
return HttpResponseRedirect(self.get_success_url())
return HttpResponseRedirect(redirect_to=self.get_success_url())
def get_extra_context(self):
return {
@@ -77,8 +77,8 @@ class CheckoutListView(DocumentListView):
def get_document_queryset(self):
return AccessControlList.objects.filter_by_access(
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):
@@ -168,13 +168,14 @@ class DocumentCheckinView(ConfirmView):
if document.get_check_out_info().user == self.request.user:
AccessControlList.objects.check_access(
permissions=permission_document_check_in,
user=self.request.user, obj=document
obj=document, permissions=permission_document_check_in,
user=self.request.user
)
else:
AccessControlList.objects.check_access(
obj=document,
permissions=permission_document_check_in_override,
user=self.request.user, obj=document
user=self.request.user
)
try:

View File

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

View File

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

View File

@@ -63,7 +63,7 @@ class Archive(object):
def get_members(self):
return (
SimpleUploadedFile(
name=filename, content=self.member_contents(filename)
content=self.member_contents(filename=filename), name=filename
) for filename in self.members()
)
@@ -161,14 +161,14 @@ class ZipArchive(Archive):
Archive.register(
mime_types=('application/zip',), archive_classes=(ZipArchive,)
archive_classes=(ZipArchive,), mime_types=('application/zip',)
)
Archive.register(
mime_types=('application/x-tar',), archive_classes=(TarArchive,)
archive_classes=(TarArchive,), mime_types=('application/x-tar',)
)
Archive.register(
mime_types=('application/gzip',), archive_classes=(TarArchive,)
archive_classes=(TarArchive,), mime_types=('application/gzip',)
)
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):
management.call_command('migrate', interactive=False)
management.call_command(command_name='migrate', interactive=False)
def handler_pre_upgrade(sender, **kwargs):
management.call_command('migrate', fake_initial=True, interactive=False)
management.call_command('purgeperiodictasks', interactive=False)
management.call_command(
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(
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(
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(
'dumpdata', *app_labels, all=True,
@@ -89,7 +89,7 @@ class Command(management.BaseCommand):
)
management.call_command(
'loaddata', convertdb_file_path, database=options['to'],
interactive=False, verbosity=3
'loaddata', convertdb_file_path, database=options['to'], interactive=False,
verbosity=3
)
fs_cleanup(convertdb_file_path)

View File

@@ -89,7 +89,11 @@ class Command(management.BaseCommand):
pre_initial_setup.send(sender=self)
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)

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:
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
namespace = PermissionNamespace(name='common', label=_('Common'))
namespace = PermissionNamespace(label=_('Common'), name='common')
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
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(
name='common_periodic', label=_('Common periodic'), transient=True
label=_('Common periodic'), name='common_periodic', transient=True
)
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
namespace = Namespace(name='common', label=_('Common'))
namespace = Namespace(label=_('Common'), name='common')
setting_auto_logging = namespace.add_setting(
global_name='COMMON_AUTO_LOGGING',
@@ -80,7 +80,7 @@ setting_shared_storage_arguments = namespace.add_setting(
), quoted=True
)
namespace = Namespace(name='django', label=_('Django'))
namespace = Namespace(label=_('Django'), name='django')
setting_django_allowed_hosts = namespace.add_setting(
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(
global_name='BROKER_URL', default=settings.BROKER_URL,

View File

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

View File

@@ -84,14 +84,14 @@ class CurrentUserLocaleProfileEditView(SingleObjectEditView):
}
form_class = LocaleProfileForm
post_action_redirect = reverse_lazy(
'common:current_user_locale_profile_details'
viewname='common:current_user_locale_profile_details'
)
def form_valid(self, form):
form.save()
timezone.activate(form.cleaned_data['timezone'])
translation.activate(form.cleaned_data['language'])
timezone.activate(timezone=form.cleaned_data['timezone'])
translation.activate(language=form.cleaned_data['language'])
if hasattr(self.request, 'session'):
self.request.session[
@@ -108,7 +108,9 @@ class CurrentUserLocaleProfileEditView(SingleObjectEditView):
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):
return self.request.user.locale_profile
@@ -123,7 +125,7 @@ class FaviconRedirectView(RedirectView):
processors
"""
from django.contrib.staticfiles.templatetags.staticfiles import static
return static('appearance/images/favicon.ico')
return static(path='appearance/images/favicon.ico')
class HomeView(SimpleView):
@@ -292,7 +294,7 @@ def multi_object_action_view(request):
message=_('No action selected.'), request=request
)
return HttpResponseRedirect(
request.META.get(
redirect_to=request.META.get(
'HTTP_REFERER', resolve_url(settings.LOGIN_REDIRECT_URL)
)
)
@@ -303,7 +305,7 @@ def multi_object_action_view(request):
request=request
)
return HttpResponseRedirect(
request.META.get(
redirect_to=request.META.get(
'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
if items_property_list:
return HttpResponseRedirect(
'%s?%s' % (
redirect_to='%s?%s' % (
action,
urlencode(
{
@@ -323,7 +325,8 @@ def multi_object_action_view(request):
)
)
else:
return HttpResponseRedirect('%s?%s' % (
action,
urlencode({'id_list': id_list, 'next': next}))
return HttpResponseRedirect(
redirect_to='%s?%s' % (
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):
if attrs is None:
attrs = {}
attrs.update(dict(autocorrect='off',
autocapitalize='off',
spellcheck='false'))
attrs.update(
{
'autocorrect': 'off',
'autocapitalize': 'off',
'spellcheck': 'false'
}
)
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
"""
def render(self, name, value, attrs=None):
return mark_safe('%s' % value)
return mark_safe(s='%s' % value)
class TextAreaDiv(forms.widgets.Widget):

View File

@@ -24,15 +24,15 @@ class ConverterApp(MayanAppConfig):
def ready(self):
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(
source=Transformation, label=_('Transformation'),
func=lambda context: force_text(context['object'])
)
SourceColumn(
source=Transformation, label=_('Arguments'), attribute='arguments'
attribute='arguments', source=Transformation
)
menu_object.bind_links(

View File

@@ -4,17 +4,17 @@ from django.utils.translation import ugettext_lazy as _
from mayan.apps.permissions import PermissionNamespace
namespace = PermissionNamespace(name='converter', label=_('Converter'))
namespace = PermissionNamespace(label=_('Converter'), name='converter')
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(
name='transformation_delete', label=_('Delete transformations')
label=_('Delete transformations'), name='transformation_delete'
)
permission_transformation_edit = namespace.add_permission(
name='transformation_edit', label=_('Edit transformations')
label=_('Edit transformations'), name='transformation_edit'
)
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
import logging
from django.utils.module_loading import import_string
from .settings import setting_graphics_backend
logger = logging.getLogger(__name__)
backend = converter_class = import_string(setting_graphics_backend.value)
backend = converter_class = import_string(
dotted_path=setting_graphics_backend.value
)

View File

@@ -9,7 +9,8 @@ from .literals import (
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(
default='mayan.apps.converter.backends.python.Python',
help_text=_('Graphics conversion backend to use.'),

View File

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

View File

@@ -27,54 +27,6 @@ from .permissions import (
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):
form_class = TransformationForm
@@ -92,8 +44,8 @@ class TransformationCreateView(SingleObjectCreateView):
raise Http404
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(
@@ -134,6 +86,54 @@ class TransformationCreateView(SingleObjectCreateView):
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):
form_class = TransformationForm
model = Transformation
@@ -144,8 +144,8 @@ class TransformationEditView(SingleObjectEditView):
)
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(
@@ -159,9 +159,9 @@ class TransformationEditView(SingleObjectEditView):
instance.save()
except Exception as exception:
logger.debug('Invalid form, exception: %s', exception)
return super(TransformationEditView, self).form_invalid(form)
return super(TransformationEditView, self).form_invalid(form=form)
else:
return super(TransformationEditView, self).form_valid(form)
return super(TransformationEditView, self).form_valid(form=form)
def get_extra_context(self):
return {
@@ -201,8 +201,8 @@ class TransformationListView(SingleObjectListView):
raise Http404
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(
@@ -231,4 +231,4 @@ class TransformationListView(SingleObjectListView):
}
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):
super(DjangoGPGApp, self).ready()
Key = self.get_model('Key')
Key = self.get_model(model_name='Key')
ModelPermission.register(
model=Key, permissions=(
@@ -45,22 +45,22 @@ class DjangoGPGApp(MayanAppConfig):
)
)
SourceColumn(source=Key, label=_('Key ID'), attribute='key_id')
SourceColumn(source=Key, label=_('User ID'), attribute='user_id')
SourceColumn(attribute='key_id', label=_('Key ID'), source=Key)
SourceColumn(attribute='user_id', source=Key)
SourceColumn(source=KeyStub, label=_('Key ID'), attribute='key_id')
SourceColumn(source=KeyStub, label=_('Type'), attribute='key_type')
SourceColumn(attribute='key_id', label=_('Key ID'), source=KeyStub)
SourceColumn(attribute='key_type', label=_('Type'), source=KeyStub)
SourceColumn(
source=KeyStub, label=_('Creation date'), attribute='date'
attribute='date', label=_('Creation date'), source=KeyStub
)
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(
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,))

View File

@@ -23,7 +23,7 @@ class KeyManager(models.Manager):
def _preload_keys(self, all_keys=False, key_fingerprint=None, key_id=None):
# Preload keys
if all_keys:
logger.debug('preloading all keys')
logger.debug(msg='preloading all keys')
keys = self.values()
elif key_fingerprint:
logger.debug('preloading key fingerprint: %s', key_fingerprint)
@@ -121,17 +121,17 @@ class KeyManager(models.Manager):
if verify_result:
# Signed and key present
logger.debug('signed and key present')
logger.debug(msg='signed and key present')
return SignatureVerification(verify_result.__dict__)
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
logger.debug('no public key')
logger.debug(msg='no public key')
file_object.seek(0)
return self.verify_file(file_object=file_object, signature_file=signature_file, key_id=verify_result.key_id)
elif verify_result.key_id:
# 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__)
else:
logger.debug('file not signed')
logger.debug(msg='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
namespace = PermissionNamespace(name='django_gpg', label=_('Key management'))
namespace = PermissionNamespace(label=_('Key management'), name='django_gpg')
permission_key_delete = namespace.add_permission(
name='key_delete', label=_('Delete keys')
label=_('Delete keys'), name='key_delete'
)
permission_key_download = namespace.add_permission(
name='key_download', label=_('Download keys')
label=_('Download keys'), name='key_download'
)
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(
name='key_sign', label=_('Use keys to sign content')
label=_('Use keys to sign content'), name='key_sign'
)
permission_key_upload = namespace.add_permission(
name='key_upload', label=_('Upload keys')
label=_('Upload keys'), name='key_upload'
)
permission_key_view = namespace.add_permission(
name='key_view', label=_('View keys')
label=_('View keys'), name='key_view'
)
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
namespace = Namespace(name='django_gpg', label=_('Signatures'))
namespace = Namespace(label=_('Signatures'), name='django_gpg')
setting_gpg_home = namespace.add_setting(
global_name='SIGNATURES_GPG_HOME',
default=os.path.join(settings.MEDIA_ROOT, 'gpg_home'),

View File

@@ -31,15 +31,15 @@ class KeyDeleteView(SingleObjectDeleteView):
model = Key
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):
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):
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):
view_permission = permission_keyserver_query
@@ -142,6 +120,28 @@ class KeyQueryResultView(SingleObjectListView):
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):
fields = ('key_data',)
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):
object_permission = permission_key_view
queryset = Key.objects.public_keys()
@@ -176,26 +199,3 @@ class PublicKeyListView(SingleObjectListView):
),
'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(
permissions=permission_required, user=self.request.user,
obj=document
obj=document, permissions=permission_required,
user=self.request.user
)
return document
@@ -85,8 +85,8 @@ class APICommentView(generics.RetrieveDestroyAPIView):
)
AccessControlList.objects.check_access(
permissions=permission_required, user=self.request.user,
obj=document
obj=document, permissions=permission_required,
user=self.request.user
)
return document

View File

@@ -37,7 +37,7 @@ class DocumentCommentsApp(MayanAppConfig):
app_label='documents', model_name='Document'
)
Comment = self.get_model('Comment')
Comment = self.get_model(model_name='Comment')
ModelEventType.register(
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(
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(
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
namespace = PermissionNamespace(name='comments', label=_('Comments'))
namespace = PermissionNamespace(label=_('Comments'), name='comments')
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(
name='comment_delete', label=_('Delete comments')
label=_('Delete comments'), name='comment_delete'
)
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):
AccessControlList.objects.check_access(
permissions=permission_comment_create, user=request.user,
obj=self.get_document()
obj=self.get_document(), permissions=permission_comment_create,
user=request.user
)
return super(
@@ -66,8 +66,8 @@ class DocumentCommentDeleteView(SingleObjectDeleteView):
def dispatch(self, request, *args, **kwargs):
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(
@@ -116,8 +116,8 @@ class DocumentCommentListView(SingleObjectListView):
def get_object_list(self):
AccessControlList.objects.check_access(
permissions=permission_comment_view, user=self.request.user,
obj=self.get_document()
obj=self.get_document(), permissions=permission_comment_view,
user=self.request.user
)
return self.get_document().comments.all()

View File

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

View File

@@ -20,7 +20,7 @@ from mayan.apps.navigation import SourceColumn
from mayan.celery import app
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_post_save_index_document
)
@@ -64,12 +64,14 @@ class DocumentIndexingApp(MayanAppConfig):
app_label='documents', model_name='DocumentType'
)
DocumentIndexInstanceNode = self.get_model('DocumentIndexInstanceNode')
DocumentIndexInstanceNode = self.get_model(
model_name='DocumentIndexInstanceNode'
)
Index = self.get_model('Index')
IndexInstance = self.get_model('IndexInstance')
IndexInstanceNode = self.get_model('IndexInstanceNode')
IndexTemplateNode = self.get_model('IndexTemplateNode')
Index = self.get_model(model_name='Index')
IndexInstance = self.get_model(model_name='IndexInstance')
IndexInstanceNode = self.get_model(model_name='IndexInstanceNode')
IndexTemplateNode = self.get_model(model_name='IndexTemplateNode')
ModelPermission.register(
model=Index, permissions=(
@@ -96,23 +98,22 @@ class DocumentIndexingApp(MayanAppConfig):
)
SourceColumn(
source=IndexInstance, label=_('Total levels'),
func=lambda context: context[
'object'
].instance_root.get_descendants_count()
].instance_root.get_descendants_count(), label=_('Total levels'),
source=IndexInstance
)
SourceColumn(
source=IndexInstance, label=_('Total documents'),
func=lambda context: context[
'object'
].instance_root.get_descendants_document_count(
user=context['request'].user
)
), label=_('Total documents'), source=IndexInstance
)
SourceColumn(
source=IndexTemplateNode, label=_('Level'),
func=lambda context: node_level(context['object'])
func=lambda context: node_level(context['object']),
label=_('Level'), source=IndexTemplateNode
)
SourceColumn(
attribute='enabled', is_sortable=True, source=IndexTemplateNode,
@@ -123,39 +124,36 @@ class DocumentIndexingApp(MayanAppConfig):
widget=TwoStateWidget
)
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(
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(
source=IndexInstanceNode, label=_('Documents'),
func=lambda context: context[
'object'
].get_descendants_document_count(
user=context['request'].user
)
), label=_('Documents'), source=IndexInstanceNode
)
SourceColumn(
label=_('Level'),
func=lambda context: get_instance_link(
index_instance_node=context['object'],
), source=DocumentIndexInstanceNode,
), label=_('Level'), source=DocumentIndexInstanceNode
)
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(
source=DocumentIndexInstanceNode, label=_('Documents'),
func=lambda context: context[
'object'
].get_descendants_document_count(
user=context['request'].user
)
), label=_('Documents'), source=DocumentIndexInstanceNode
)
app.conf.CELERY_QUEUES.append(
@@ -221,8 +219,8 @@ class DocumentIndexingApp(MayanAppConfig):
sender=Document
)
post_initial_document_type.connect(
dispatch_uid='document_indexing_create_default_document_index',
receiver=create_default_document_index,
dispatch_uid='document_indexing_handler_create_default_document_index',
receiver=handler_create_default_document_index,
sender=DocumentType
)
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(
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 mark_safe(
'<a href="{url}">{text}</a>'.format(
s='<a href="{url}">{text}</a>'.format(
url=index_instance_node.get_absolute_url(),
text=escape(index_instance_node.get_full_path())
)
@@ -35,7 +35,7 @@ def index_instance_item_link(index_instance_item):
icon = ''
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(),
'icon': icon,
'text': index_instance_item
@@ -48,7 +48,7 @@ def node_level(node):
Render an indented tree like output for a specific node
"""
return mark_safe(
''.join(
s=''.join(
[
'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' * node.get_level(),
'' 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):
try:
return reverse(
'indexing:index_instance_node_view',
args=(self.instance_root.pk,)
viewname='indexing:index_instance_node_view',
kwargs={'pk': self.instance_root.pk}
)
except IndexInstanceNode.DoesNotExist:
return '#'
@@ -357,7 +357,11 @@ class IndexInstanceNode(MPTTModel):
lock.release()
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):
return self.get_children().count()
@@ -367,12 +371,12 @@ class IndexInstanceNode(MPTTModel):
def get_descendants_document_count(self, user):
return AccessControlList.objects.filter_by_access(
permission=permission_document_view, user=user,
permission=permission_document_view,
queryset=Document.objects.filter(
index_instance_nodes__in=self.get_descendants(
include_self=True
)
)
), user=user
).count()
def get_full_path(self):
@@ -388,7 +392,8 @@ class IndexInstanceNode(MPTTModel):
def get_item_count(self, user):
if self.index_template_node.link_documents:
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()

View File

@@ -4,24 +4,24 @@ from django.utils.translation import ugettext_lazy as _
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(
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(
name='document_index_edit', label=_('Edit document indexes')
label=_('Edit document indexes'), name='document_index_edit'
)
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(
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(
name='document_index_view', label=_('View document indexes')
label=_('View document indexes'), name='document_index_view'
)
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.task_manager.classes import CeleryQueue
queue_indexing = CeleryQueue(name='indexing', label=_('Indexing'))
queue_indexing = CeleryQueue(label=_('Indexing'), name='indexing')
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(
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(
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(
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):
model = Index
object_permission = permission_document_indexing_delete
post_action_redirect = reverse_lazy(
viewname='indexing:index_setup_list'
)
object_permission = permission_document_indexing_delete
def get_extra_context(self):
return {
@@ -61,10 +61,10 @@ class SetupIndexDeleteView(SingleObjectDeleteView):
class SetupIndexEditView(SingleObjectEditView):
fields = ('label', 'slug', 'enabled')
model = Index
object_permission = permission_document_indexing_edit
post_action_redirect = reverse_lazy(
viewname='indexing:index_setup_list'
)
object_permission = permission_document_indexing_edit
def get_extra_context(self):
return {
@@ -106,8 +106,9 @@ class SetupIndexDocumentTypesView(AssignRemoveView):
def get_document_queryset(self):
return AccessControlList.objects.filter_by_access(
permission_document_view, self.request.user,
queryset=DocumentType.objects.all()
permission=permission_document_view,
queryset=DocumentType.objects.all(),
user=self.request.user
)
def get_extra_context(self):
@@ -168,8 +169,8 @@ class TemplateNodeCreateView(SingleObjectCreateView):
def dispatch(self, request, *args, **kwargs):
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(
@@ -261,7 +262,9 @@ class IndexListView(SingleObjectListView):
def get_object_list(self):
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):
@@ -273,8 +276,9 @@ class IndexInstanceNodeView(DocumentListView):
)
AccessControlList.objects.check_access(
obj=self.index_instance_node.index(),
permissions=permission_document_indexing_instance_view,
user=request.user, obj=self.index_instance_node.index()
user=request.user
)
if self.index_instance_node:
@@ -340,8 +344,8 @@ class DocumentIndexNodeListView(SingleObjectListView):
def dispatch(self, request, *args, **kwargs):
AccessControlList.objects.check_access(
permissions=permission_document_view, user=request.user,
obj=self.get_document()
obj=self.get_document(), permissions=permission_document_view,
user=request.user
)
return super(

View File

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

View File

@@ -23,12 +23,18 @@ class Parser(object):
_registry = {}
@classmethod
def register(cls, mimetypes, parser_classes):
for mimetype in mimetypes:
for parser_class in parser_classes:
cls._registry.setdefault(
mimetype, []
).append(parser_class)
def parse_document_page(cls, document_page):
for parser_class in cls._registry.get(document_page.document_version.mimetype, ()):
try:
parser = parser_class()
parser.process_document_page(document_page)
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
def parse_document_version(cls, document_version):
@@ -45,18 +51,12 @@ class Parser(object):
return
@classmethod
def parse_document_page(cls, document_page):
for parser_class in cls._registry.get(document_page.document_version.mimetype, ()):
try:
parser = parser_class()
parser.process_document_page(document_page)
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
def register(cls, mimetypes, parser_classes):
for mimetype in mimetypes:
for parser_class in parser_classes:
cls._registry.setdefault(
mimetype, []
).append(parser_class)
def process_document_version(self, document_version):
logger.info(

View File

@@ -5,16 +5,16 @@ from django.utils.translation import ugettext_lazy as _
from mayan.apps.permissions import PermissionNamespace
namespace = PermissionNamespace(
name='document_parsing', label=_('Document parsing')
label=_('Document parsing'), name='document_parsing'
)
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(
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(
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
namespace = Namespace(name='document_parsing', label=_('Document parsing'))
namespace = Namespace(label=_('Document parsing'), name='document_parsing')
setting_auto_parsing = namespace.add_setting(
global_name='DOCUMENT_PARSING_AUTO_PARSING', default=True,

View File

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

View File

@@ -16,7 +16,9 @@ from mayan.apps.common.menus import (
from mayan.apps.navigation import SourceColumn
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 (
link_document_version_all_signature_verify,
link_document_signature_list,
@@ -63,9 +65,9 @@ class DocumentSignaturesApp(MayanAppConfig):
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(
order=1, func=EmbeddedSignature.objects.create
@@ -111,10 +113,10 @@ class DocumentSignaturesApp(MayanAppConfig):
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'
},
'mayan.apps.document_signatures.tasks.task_unverify_key_signatures': {
'mayan.apps.document_signatures.tasks.task_handler_unhandler_verify_key_signatures': {
'queue': 'signatures'
},
'mayan.apps.document_signatures.tasks.task_verify_document_version': {
@@ -158,12 +160,12 @@ class DocumentSignaturesApp(MayanAppConfig):
)
post_delete.connect(
unverify_key_signatures,
dispatch_uid='unverify_key_signatures',
dispatch_uid='signatures_handler_unverify_key_signatures',
receiver=handler_unverify_key_signatures,
sender=Key
)
post_save.connect(
verify_key_signatures,
dispatch_uid='verify_key_signatures',
dispatch_uid='signatures_handler_verify_key_signatures',
receiver=handler_verify_key_signatures,
sender=Key
)

View File

@@ -1,22 +1,23 @@
from __future__ import unicode_literals
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
)
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(
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(
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):
return reverse(
'document_signatures:document_version_signature_detail',
args=(self.pk,)
viewname='document_signatures:document_version_signature_detail',
kwargs={'pk': self.pk}
)
def get_key_id(self):
@@ -98,7 +98,7 @@ class EmbeddedSignature(SignatureBaseModel):
verbose_name_plural = _('Document version embedded signatures')
def save(self, *args, **kwargs):
logger.debug('checking for embedded signature')
logger.debug(msg='checking for embedded signature')
if self.pk:
raw = True

View File

@@ -5,34 +5,34 @@ from django.utils.translation import ugettext_lazy as _
from mayan.apps.permissions import PermissionNamespace
namespace = PermissionNamespace(
name='document_signatures', label=_('Document signatures')
label=_('Document signatures'), name='document_signatures'
)
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(
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(
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(
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(
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(
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(
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.task_manager.classes import CeleryQueue
queue_signatures = CeleryQueue(name='signatures', label=_('Signatures'))
queue_signatures = CeleryQueue(label=_('Signatures'), name='signatures')
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(
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(
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(
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
namespace = Namespace(name='signatures', label=_('Document signatures'))
namespace = Namespace(label=_('Document signatures'), name='signatures')
setting_storage_backend = namespace.add_setting(
default='django.core.files.storage.FileSystemStorage',
global_name='SIGNATURES_STORAGE_BACKEND', help_text=_(

View File

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

View File

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

View File

@@ -23,7 +23,7 @@ class DashboardWidgetDocumentPagesTotal(DashboardWidgetNumeric):
icon_class = icon_dashboard_pages_per_month
label = _('Total pages')
link = reverse_lazy(
'statistics:statistic_detail',
viewname='statistics:statistic_detail',
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
namespace = EventTypeNamespace(name='documents', label=_('Documents'))
namespace = EventTypeNamespace(label=_('Documents'), name='documents')
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(
name='document_download', label=_('Document downloaded')
label=_('Document downloaded'), name='document_download'
)
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(
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
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
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
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(
name='document_version_revert', label=_('Document version reverted')
label=_('Document version reverted'), name='document_version_revert'
)
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
def create_default_document_type(sender, **kwargs):
def handler_create_default_document_type(sender, **kwargs):
DocumentType = apps.get_model(
app_label='documents', model_name='DocumentType'
)

View File

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

View File

@@ -1,8 +1,6 @@
from __future__ import absolute_import, unicode_literals
import hashlib
import logging
import uuid
from furl import furl
@@ -33,15 +31,6 @@ __all__ = ('DocumentPage', 'DocumentPageCachedImage', 'DocumentPageResult')
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
class DocumentPage(models.Model):
"""

View File

@@ -1,13 +1,11 @@
from __future__ import absolute_import, unicode_literals
import hashlib
import logging
import uuid
from django.apps import apps
from django.db import models, transaction
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 mayan.apps.acls.models import AccessControlList
@@ -23,15 +21,6 @@ __all__ = ('DocumentType', 'DocumentTypeFilename')
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
class DocumentType(models.Model):
"""

View File

@@ -1,8 +1,6 @@
from __future__ import absolute_import, unicode_literals
import hashlib
import logging
import uuid
from django.conf import settings
from django.db import models
@@ -23,15 +21,6 @@ __all__ = (
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):
objects = TrashCanManager()

View File

@@ -4,65 +4,66 @@ from django.utils.translation import ugettext_lazy as _
from mayan.apps.permissions import PermissionNamespace
namespace = PermissionNamespace(name='documents', label=_('Documents'))
namespace = PermissionNamespace(label=_('Documents'), name='documents')
permission_document_create = namespace.add_permission(
name='document_create', label=_('Create documents')
label=_('Create documents'), name='document_create'
)
permission_document_delete = namespace.add_permission(
name='document_delete', label=_('Delete documents')
label=_('Delete documents'), name='document_delete'
)
permission_document_trash = namespace.add_permission(
name='document_trash', label=_('Trash documents')
label=_('Trash documents'), name='document_trash'
)
permission_document_download = namespace.add_permission(
name='document_download', label=_('Download documents')
label=_('Download documents'), name='document_download'
)
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(
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(
name='document_properties_edit', label=_('Edit document properties')
label=_('Edit document properties'), name='document_properties_edit'
)
permission_document_print = namespace.add_permission(
name='document_print', label=_('Print documents')
label=_('Print documents'), name='document_print'
)
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(
name='document_tools', label=_('Execute document modifying tools')
label=_('Execute document modifying tools'), name='document_tools'
)
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(
name='document_version_view',
label=_('View documents\' versions list')
label=_('View documents\' versions list'),
name='document_version_view'
)
permission_document_view = namespace.add_permission(
name='document_view', label=_('View documents')
label=_('View documents'), name='document_view'
)
permission_empty_trash = namespace.add_permission(
name='document_empty_trash', label=_('Empty trash')
label=_('Empty trash'), name='document_empty_trash'
)
setup_namespace = PermissionNamespace(
name='documents_types', label=_('Document types')
label=_('Document types'), name='documents_types'
)
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(
name='document_type_delete', label=_('Delete document types')
label=_('Delete document types'), name='document_type_delete'
)
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(
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(
app_label='documents', model_name='Document',
permission=permission_document_view,
serializer_string='mayan.apps.documents.serializers.DocumentSerializer'
serializer_path='mayan.apps.documents.serializers.DocumentSerializer'
)
document_search.add_model_field(
@@ -27,7 +27,7 @@ document_search.add_model_field(
document_page_search = SearchModel(
app_label='documents', model_name='DocumentPageResult',
permission=permission_document_view,
serializer_string='mayan.apps.documents.serializers.DocumentPageSerializer'
serializer_path='mayan.apps.documents.serializers.DocumentPageSerializer'
)
document_page_search.add_model_field(

View File

@@ -26,14 +26,14 @@ class DocumentPageSerializer(serializers.HyperlinkedModelSerializer):
def get_document_version_url(self, instance):
return reverse(
'rest_api:documentversion-detail', args=(
viewname='rest_api:documentversion-detail', args=(
instance.document.pk, instance.document_version.pk,
), request=self.context['request'], format=self.context['format']
)
def get_image_url(self, instance):
return reverse(
'rest_api:documentpage-image', args=(
viewname='rest_api:documentpage-image', args=(
instance.document.pk, instance.document_version.pk,
instance.pk,
), request=self.context['request'], format=self.context['format']
@@ -41,7 +41,7 @@ class DocumentPageSerializer(serializers.HyperlinkedModelSerializer):
def get_url(self, instance):
return reverse(
'rest_api:documentpage-detail', args=(
viewname='rest_api:documentpage-detail', args=(
instance.document.pk, instance.document_version.pk,
instance.pk,
), request=self.context['request'], format=self.context['format']
@@ -121,28 +121,28 @@ class DocumentVersionSerializer(serializers.HyperlinkedModelSerializer):
def get_document_url(self, instance):
return reverse(
'rest_api:document-detail', args=(
viewname='rest_api:document-detail', args=(
instance.document.pk,
), request=self.context['request'], format=self.context['format']
)
def get_download_url(self, instance):
return reverse(
'rest_api:documentversion-download', args=(
viewname='rest_api:documentversion-download', args=(
instance.document.pk, instance.pk,
), request=self.context['request'], format=self.context['format']
)
def get_pages_url(self, instance):
return reverse(
'rest_api:documentversion-page-list', args=(
viewname='rest_api:documentversion-page-list', args=(
instance.document.pk, instance.pk,
), request=self.context['request'], format=self.context['format']
)
def get_url(self, instance):
return reverse(
'rest_api:documentversion-detail', args=(
viewname='rest_api:documentversion-detail', args=(
instance.document.pk, instance.pk,
), request=self.context['request'], format=self.context['format']
)
@@ -167,28 +167,28 @@ class WritableDocumentVersionSerializer(serializers.ModelSerializer):
def get_document_url(self, instance):
return reverse(
'rest_api:document-detail', args=(
viewname='rest_api:document-detail', args=(
instance.document.pk,
), request=self.context['request'], format=self.context['format']
)
def get_download_url(self, instance):
return reverse(
'rest_api:documentversion-download', args=(
viewname='rest_api:documentversion-download', args=(
instance.document.pk, instance.pk,
), request=self.context['request'], format=self.context['format']
)
def get_pages_url(self, instance):
return reverse(
'rest_api:documentversion-page-list', args=(
viewname='rest_api:documentversion-page-list', args=(
instance.document.pk, instance.pk,
), request=self.context['request'], format=self.context['format']
)
def get_url(self, instance):
return reverse(
'rest_api:documentversion-detail', args=(
viewname='rest_api:documentversion-detail', args=(
instance.document.pk, instance.pk,
), 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
)
namespace = Namespace(name='documents', label=_('Documents'))
namespace = Namespace(label=_('Documents'), name='documents')
setting_documentimagecache_storage = namespace.add_setting(
global_name='DOCUMENTS_CACHE_STORAGE_BACKEND',

View File

@@ -10,7 +10,8 @@ except ImportError:
from django.utils.module_loading import import_string
from .settings import (
setting_documentimagecache_storage, setting_documentimagecache_storage_arguments,
setting_documentimagecache_storage,
setting_documentimagecache_storage_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'
)
logger.debug('Executing')
logger.debug(msg='Executing')
deleted_document = DeletedDocument.objects.get(pk=deleted_document_id)
deleted_document.delete()
logger.debug('Finshed')
logger.debug(msg='Finshed')
@app.task(ignore_result=True)
@@ -70,9 +70,9 @@ def task_delete_stubs():
app_label='documents', model_name='Document'
)
logger.info('Executing')
logger.info(msg='Executing')
Document.passthrough.delete_stubs()
logger.info('Finshed')
logger.info(msg='Finshed')
@app.task()

View File

@@ -18,23 +18,23 @@ class DocumentSearchTestCase(DocumentTestMixin, BaseTestCase):
)
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)
def test_document_page_search_with_access(self):
self.grant_access(
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)
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)
def test_document_search_with_access(self):
self.grant_access(
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)

View File

@@ -93,13 +93,13 @@ class SearchModel(object):
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.model_name = model_name
self.search_fields = []
self._model = None # Lazy
self._label = label
self.serializer_path = serializer_string
self.serializer_path = serializer_path
self.permission = permission
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 .icons import icon_search_submit
from .mixins import SearchModelMixin
from .settings import setting_limit
logger = logging.getLogger(__name__)
@@ -27,7 +26,6 @@ class ResultsView(SearchModelMixin, SingleObjectListView):
),
'no_results_title': _('No search results'),
'search_model': self.search_model,
'search_results_limit': setting_limit.value,
'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')
StoredEventType = self.get_model(model_name='StoredEventType')
# Add labels to Action model, they are not marked translatable in the
# upstream package.
SourceColumn(
attribute='timestamp', is_identifier=True,
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
namespace = PermissionNamespace(name='events', label=_('Events'))
namespace = PermissionNamespace(label=_('Events'), name='events')
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'
)

View File

@@ -26,7 +26,7 @@ class EventTypeNamespaceSerializer(serializers.Serializer):
def get_url(self, instance):
return reverse(
'rest_api:event-type-namespace-detail', args=(
viewname='rest_api:event-type-namespace-detail', args=(
instance.name,
), request=self.context['request'], format=self.context['format']
)
@@ -40,7 +40,7 @@ class EventTypeSerializer(serializers.Serializer):
def get_event_type_namespace_url(self, instance):
return reverse(
'rest_api:event-type-namespace-detail', args=(
viewname='rest_api:event-type-namespace-detail', args=(
instance.namespace.name,
), request=self.context['request'], format=self.context['format']
)

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