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:
@@ -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,
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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'
|
||||
)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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=_(
|
||||
|
||||
@@ -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">×</button>
|
||||
<p><strong>{% trans 'Warning' %}</strong> {{ check_sqlite }}</p>
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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=_(
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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'
|
||||
)
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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'
|
||||
)
|
||||
|
||||
@@ -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
|
||||
"""
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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'
|
||||
)
|
||||
|
||||
@@ -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'
|
||||
)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -16,8 +16,6 @@ from .mixins import DocumentCheckoutTestMixin
|
||||
|
||||
|
||||
class DocumentCheckoutTestCase(DocumentCheckoutTestMixin, GenericDocumentTestCase):
|
||||
# auto
|
||||
|
||||
def test_document_check_out(self):
|
||||
self._check_out_test_document()
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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',)
|
||||
)
|
||||
|
||||
@@ -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'
|
||||
)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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'
|
||||
)
|
||||
|
||||
@@ -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'
|
||||
)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -17,7 +17,7 @@ register = Library()
|
||||
|
||||
|
||||
@register.simple_tag
|
||||
def check_sqlite():
|
||||
def common_check_sqlite():
|
||||
if check_for_sqlite():
|
||||
return MESSAGE_SQLITE_WARNING
|
||||
|
||||
|
||||
@@ -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})
|
||||
)
|
||||
)
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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'
|
||||
)
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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.'),
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,))
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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'
|
||||
)
|
||||
|
||||
@@ -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'),
|
||||
|
||||
@@ -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')
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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'
|
||||
)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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'
|
||||
)
|
||||
|
||||
@@ -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 <a href="%(url)s">%(text)s</a>' % {
|
||||
s='%(icon)s <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(
|
||||
[
|
||||
' ' * node.get_level(),
|
||||
'' if node.is_root_node() else icon_index_level_up.render(),
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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'
|
||||
)
|
||||
|
||||
@@ -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'
|
||||
)
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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'
|
||||
)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'
|
||||
)
|
||||
|
||||
@@ -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'
|
||||
)
|
||||
|
||||
@@ -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=_(
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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',)
|
||||
)
|
||||
|
||||
|
||||
@@ -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'
|
||||
)
|
||||
|
||||
@@ -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'
|
||||
)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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):
|
||||
"""
|
||||
|
||||
@@ -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):
|
||||
"""
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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'
|
||||
)
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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']
|
||||
)
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'
|
||||
)
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user