diff --git a/mayan/apps/acls/apps.py b/mayan/apps/acls/apps.py index a35278d1c1..e774138c14 100644 --- a/mayan/apps/acls/apps.py +++ b/mayan/apps/acls/apps.py @@ -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, diff --git a/mayan/apps/acls/classes.py b/mayan/apps/acls/classes.py index 4aba2f9b59..d7ffae9b28 100644 --- a/mayan/apps/acls/classes.py +++ b/mayan/apps/acls/classes.py @@ -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() diff --git a/mayan/apps/acls/models.py b/mayan/apps/acls/models.py index a39886d279..1c6939c32e 100644 --- a/mayan/apps/acls/models.py +++ b/mayan/apps/acls/models.py @@ -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 ) diff --git a/mayan/apps/acls/permissions.py b/mayan/apps/acls/permissions.py index ada2ec8c36..cd4bd07446 100644 --- a/mayan/apps/acls/permissions.py +++ b/mayan/apps/acls/permissions.py @@ -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' ) diff --git a/mayan/apps/acls/views.py b/mayan/apps/acls/views.py index 69e1133ed0..aa6025f335 100644 --- a/mayan/apps/acls/views.py +++ b/mayan/apps/acls/views.py @@ -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) diff --git a/mayan/apps/appearance/settings.py b/mayan/apps/appearance/settings.py index 5a53ef6719..5b93d43525 100644 --- a/mayan/apps/appearance/settings.py +++ b/mayan/apps/appearance/settings.py @@ -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=_( diff --git a/mayan/apps/appearance/templates/appearance/base.html b/mayan/apps/appearance/templates/appearance/base.html index 7df87700c8..2a0c0a5362 100644 --- a/mayan/apps/appearance/templates/appearance/base.html +++ b/mayan/apps/appearance/templates/appearance/base.html @@ -25,8 +25,8 @@
- {% check_sqlite as check_sqlite %} - {% if check_sqlite %} + {% common_check_sqlite as check_sqlite %} + {% if common_check_sqlite %}

{% trans 'Warning' %} {{ check_sqlite }}

diff --git a/mayan/apps/appearance/templatetags/appearance_tags.py b/mayan/apps/appearance/templatetags/appearance_tags.py index d51fd040c8..05c3ba043d 100644 --- a/mayan/apps/appearance/templatetags/appearance_tags.py +++ b/mayan/apps/appearance/templatetags/appearance_tags.py @@ -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() diff --git a/mayan/apps/authentication/forms.py b/mayan/apps/authentication/forms.py index ebc7e5233d..c7c0663148 100644 --- a/mayan/apps/authentication/forms.py +++ b/mayan/apps/authentication/forms.py @@ -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: diff --git a/mayan/apps/authentication/settings.py b/mayan/apps/authentication/settings.py index f0b7c0f409..e15f2f083b 100644 --- a/mayan/apps/authentication/settings.py +++ b/mayan/apps/authentication/settings.py @@ -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=_( diff --git a/mayan/apps/cabinets/apps.py b/mayan/apps/cabinets/apps.py index 32c8f8fc84..bb28d4a238 100644 --- a/mayan/apps/cabinets/apps.py +++ b/mayan/apps/cabinets/apps.py @@ -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. diff --git a/mayan/apps/cabinets/events.py b/mayan/apps/cabinets/events.py index bca867bd2a..998ceddabd 100644 --- a/mayan/apps/cabinets/events.py +++ b/mayan/apps/cabinets/events.py @@ -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' diff --git a/mayan/apps/cabinets/permissions.py b/mayan/apps/cabinets/permissions.py index f2a2636479..e712a63da5 100644 --- a/mayan/apps/cabinets/permissions.py +++ b/mayan/apps/cabinets/permissions.py @@ -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' ) diff --git a/mayan/apps/cabinets/search.py b/mayan/apps/cabinets/search.py index 24107d6f69..ed1194341c 100644 --- a/mayan/apps/cabinets/search.py +++ b/mayan/apps/cabinets/search.py @@ -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( diff --git a/mayan/apps/cabinets/tests/test_api.py b/mayan/apps/cabinets/tests/test_api.py index 102ad11f7d..643fa31d98 100644 --- a/mayan/apps/cabinets/tests/test_api.py +++ b/mayan/apps/cabinets/tests/test_api.py @@ -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): diff --git a/mayan/apps/cabinets/tests/test_views.py b/mayan/apps/cabinets/tests/test_views.py index 2a32fec145..27ef31208b 100644 --- a/mayan/apps/cabinets/tests/test_views.py +++ b/mayan/apps/cabinets/tests/test_views.py @@ -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( diff --git a/mayan/apps/cabinets/tests/test_wizard_steps.py b/mayan/apps/cabinets/tests/test_wizard_steps.py index 058579f1d9..f03298813a 100644 --- a/mayan/apps/cabinets/tests/test_wizard_steps.py +++ b/mayan/apps/cabinets/tests/test_wizard_steps.py @@ -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) diff --git a/mayan/apps/cabinets/views.py b/mayan/apps/cabinets/views.py index 135c8c8ebb..8c199bfb67 100644 --- a/mayan/apps/cabinets/views.py +++ b/mayan/apps/cabinets/views.py @@ -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( diff --git a/mayan/apps/cabinets/widgets.py b/mayan/apps/cabinets/widgets.py index 166789dc74..da4ee6d594 100644 --- a/mayan/apps/cabinets/widgets.py +++ b/mayan/apps/cabinets/widgets.py @@ -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( diff --git a/mayan/apps/checkouts/api_views.py b/mayan/apps/checkouts/api_views.py index 4fba58e77b..ada9aa493d 100644 --- a/mayan/apps/checkouts/api_views.py +++ b/mayan/apps/checkouts/api_views.py @@ -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( diff --git a/mayan/apps/checkouts/apps.py b/mayan/apps/checkouts/apps.py index 6c82248b3d..4966803dfc 100644 --- a/mayan/apps/checkouts/apps.py +++ b/mayan/apps/checkouts/apps.py @@ -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 ) diff --git a/mayan/apps/checkouts/dashboard_widgets.py b/mayan/apps/checkouts/dashboard_widgets.py index 0d8dc9de99..b1f0b8cf85 100644 --- a/mayan/apps/checkouts/dashboard_widgets.py +++ b/mayan/apps/checkouts/dashboard_widgets.py @@ -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( diff --git a/mayan/apps/checkouts/events.py b/mayan/apps/checkouts/events.py index 69036d2a29..aad73d1fbb 100644 --- a/mayan/apps/checkouts/events.py +++ b/mayan/apps/checkouts/events.py @@ -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' ) diff --git a/mayan/apps/checkouts/handlers.py b/mayan/apps/checkouts/handlers.py index e304eb58be..1916d2d828 100644 --- a/mayan/apps/checkouts/handlers.py +++ b/mayan/apps/checkouts/handlers.py @@ -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 """ diff --git a/mayan/apps/checkouts/models.py b/mayan/apps/checkouts/models.py index dba9f398b8..bfc551c06a 100644 --- a/mayan/apps/checkouts/models.py +++ b/mayan/apps/checkouts/models.py @@ -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() diff --git a/mayan/apps/checkouts/permissions.py b/mayan/apps/checkouts/permissions.py index 0eb24c4b41..8ea7610a0d 100644 --- a/mayan/apps/checkouts/permissions.py +++ b/mayan/apps/checkouts/permissions.py @@ -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' ) diff --git a/mayan/apps/checkouts/queues.py b/mayan/apps/checkouts/queues.py index 3792211019..9ef477bdc8 100644 --- a/mayan/apps/checkouts/queues.py +++ b/mayan/apps/checkouts/queues.py @@ -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' ) diff --git a/mayan/apps/checkouts/serializers.py b/mayan/apps/checkouts/serializers.py index f0760b1ed5..c3ef6145c5 100644 --- a/mayan/apps/checkouts/serializers.py +++ b/mayan/apps/checkouts/serializers.py @@ -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 diff --git a/mayan/apps/checkouts/tasks.py b/mayan/apps/checkouts/tasks.py index 68f17b4865..ea7a844d75 100644 --- a/mayan/apps/checkouts/tasks.py +++ b/mayan/apps/checkouts/tasks.py @@ -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') diff --git a/mayan/apps/checkouts/tests/mixins.py b/mayan/apps/checkouts/tests/mixins.py index e73b941d12..fa8d601a4b 100644 --- a/mayan/apps/checkouts/tests/mixins.py +++ b/mayan/apps/checkouts/tests/mixins.py @@ -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 ) diff --git a/mayan/apps/checkouts/tests/test_models.py b/mayan/apps/checkouts/tests/test_models.py index 4186a98fb6..cd2ea0202f 100644 --- a/mayan/apps/checkouts/tests/test_models.py +++ b/mayan/apps/checkouts/tests/test_models.py @@ -16,8 +16,6 @@ from .mixins import DocumentCheckoutTestMixin class DocumentCheckoutTestCase(DocumentCheckoutTestMixin, GenericDocumentTestCase): - # auto - def test_document_check_out(self): self._check_out_test_document() diff --git a/mayan/apps/checkouts/views.py b/mayan/apps/checkouts/views.py index 2f33f8cfa7..723b6187a3 100644 --- a/mayan/apps/checkouts/views.py +++ b/mayan/apps/checkouts/views.py @@ -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: diff --git a/mayan/apps/common/apps.py b/mayan/apps/common/apps.py index c6bc65f084..72acab10ad 100644 --- a/mayan/apps/common/apps.py +++ b/mayan/apps/common/apps.py @@ -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() diff --git a/mayan/apps/common/classes.py b/mayan/apps/common/classes.py index 8a957de734..9c5564fd66 100644 --- a/mayan/apps/common/classes.py +++ b/mayan/apps/common/classes.py @@ -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) diff --git a/mayan/apps/common/compressed_files.py b/mayan/apps/common/compressed_files.py index eccf7f2fec..4bef477028 100644 --- a/mayan/apps/common/compressed_files.py +++ b/mayan/apps/common/compressed_files.py @@ -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',) ) diff --git a/mayan/apps/common/handlers.py b/mayan/apps/common/handlers.py index 45485e5729..2131380193 100644 --- a/mayan/apps/common/handlers.py +++ b/mayan/apps/common/handlers.py @@ -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' ) diff --git a/mayan/apps/common/management/commands/convertdb.py b/mayan/apps/common/management/commands/convertdb.py index 3d4fe0c063..8327fae9a6 100644 --- a/mayan/apps/common/management/commands/convertdb.py +++ b/mayan/apps/common/management/commands/convertdb.py @@ -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) diff --git a/mayan/apps/common/management/commands/initialsetup.py b/mayan/apps/common/management/commands/initialsetup.py index 456983279c..0b9755f145 100644 --- a/mayan/apps/common/management/commands/initialsetup.py +++ b/mayan/apps/common/management/commands/initialsetup.py @@ -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) diff --git a/mayan/apps/common/management/commands/performupgrade.py b/mayan/apps/common/management/commands/performupgrade.py index d2ba4999c8..5f358566f7 100644 --- a/mayan/apps/common/management/commands/performupgrade.py +++ b/mayan/apps/common/management/commands/performupgrade.py @@ -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) diff --git a/mayan/apps/common/permissions_runtime.py b/mayan/apps/common/permissions_runtime.py index 7113393edd..20df80407a 100644 --- a/mayan/apps/common/permissions_runtime.py +++ b/mayan/apps/common/permissions_runtime.py @@ -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' ) diff --git a/mayan/apps/common/queues.py b/mayan/apps/common/queues.py index bf649abb48..01569efe9e 100644 --- a/mayan/apps/common/queues.py +++ b/mayan/apps/common/queues.py @@ -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' ) diff --git a/mayan/apps/common/settings.py b/mayan/apps/common/settings.py index 209498b713..ec1727cccd 100644 --- a/mayan/apps/common/settings.py +++ b/mayan/apps/common/settings.py @@ -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, diff --git a/mayan/apps/common/templatetags/common_tags.py b/mayan/apps/common/templatetags/common_tags.py index 059c6f1e43..8b8d82f712 100644 --- a/mayan/apps/common/templatetags/common_tags.py +++ b/mayan/apps/common/templatetags/common_tags.py @@ -17,7 +17,7 @@ register = Library() @register.simple_tag -def check_sqlite(): +def common_check_sqlite(): if check_for_sqlite(): return MESSAGE_SQLITE_WARNING diff --git a/mayan/apps/common/views.py b/mayan/apps/common/views.py index e0aec0267b..3f21723f21 100644 --- a/mayan/apps/common/views.py +++ b/mayan/apps/common/views.py @@ -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}) + ) ) diff --git a/mayan/apps/common/widgets.py b/mayan/apps/common/widgets.py index c6567a6c1a..f95552fa4e 100644 --- a/mayan/apps/common/widgets.py +++ b/mayan/apps/common/widgets.py @@ -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): diff --git a/mayan/apps/converter/apps.py b/mayan/apps/converter/apps.py index e0df3d274f..1ab7e4108b 100644 --- a/mayan/apps/converter/apps.py +++ b/mayan/apps/converter/apps.py @@ -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( diff --git a/mayan/apps/converter/permissions.py b/mayan/apps/converter/permissions.py index 4135d03949..a111b9de1b 100644 --- a/mayan/apps/converter/permissions.py +++ b/mayan/apps/converter/permissions.py @@ -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' ) diff --git a/mayan/apps/converter/runtime.py b/mayan/apps/converter/runtime.py index acfc7d1e7f..1af7f31380 100644 --- a/mayan/apps/converter/runtime.py +++ b/mayan/apps/converter/runtime.py @@ -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 +) diff --git a/mayan/apps/converter/settings.py b/mayan/apps/converter/settings.py index b75f8689d8..14ce07a295 100644 --- a/mayan/apps/converter/settings.py +++ b/mayan/apps/converter/settings.py @@ -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.'), diff --git a/mayan/apps/converter/transformations.py b/mayan/apps/converter/transformations.py index 2aad214b62..e9eada168a 100644 --- a/mayan/apps/converter/transformations.py +++ b/mayan/apps/converter/transformations.py @@ -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) diff --git a/mayan/apps/converter/views.py b/mayan/apps/converter/views.py index 60c85be028..239b2ad37b 100644 --- a/mayan/apps/converter/views.py +++ b/mayan/apps/converter/views.py @@ -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) diff --git a/mayan/apps/django_gpg/apps.py b/mayan/apps/django_gpg/apps.py index f88572d746..ae3c97de9b 100644 --- a/mayan/apps/django_gpg/apps.py +++ b/mayan/apps/django_gpg/apps.py @@ -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,)) diff --git a/mayan/apps/django_gpg/managers.py b/mayan/apps/django_gpg/managers.py index d565e8ae2a..604410049c 100644 --- a/mayan/apps/django_gpg/managers.py +++ b/mayan/apps/django_gpg/managers.py @@ -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') diff --git a/mayan/apps/django_gpg/permissions.py b/mayan/apps/django_gpg/permissions.py index cc2fb04a3d..c2a2ab2cb9 100644 --- a/mayan/apps/django_gpg/permissions.py +++ b/mayan/apps/django_gpg/permissions.py @@ -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' ) diff --git a/mayan/apps/django_gpg/settings.py b/mayan/apps/django_gpg/settings.py index 0f7aff18aa..b7c763f45f 100644 --- a/mayan/apps/django_gpg/settings.py +++ b/mayan/apps/django_gpg/settings.py @@ -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'), diff --git a/mayan/apps/django_gpg/views.py b/mayan/apps/django_gpg/views.py index 10106203bb..8cac032ac1 100644 --- a/mayan/apps/django_gpg/views.py +++ b/mayan/apps/django_gpg/views.py @@ -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') - } diff --git a/mayan/apps/document_comments/api_views.py b/mayan/apps/document_comments/api_views.py index 04ea5b0897..1a56b501af 100644 --- a/mayan/apps/document_comments/api_views.py +++ b/mayan/apps/document_comments/api_views.py @@ -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 diff --git a/mayan/apps/document_comments/apps.py b/mayan/apps/document_comments/apps.py index a5bb9fb974..cdad80c8a6 100644 --- a/mayan/apps/document_comments/apps.py +++ b/mayan/apps/document_comments/apps.py @@ -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', diff --git a/mayan/apps/document_comments/permissions.py b/mayan/apps/document_comments/permissions.py index c18b082ef0..a5fa60a7d2 100644 --- a/mayan/apps/document_comments/permissions.py +++ b/mayan/apps/document_comments/permissions.py @@ -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' ) diff --git a/mayan/apps/document_comments/views.py b/mayan/apps/document_comments/views.py index 18a26baf9f..04815d62db 100644 --- a/mayan/apps/document_comments/views.py +++ b/mayan/apps/document_comments/views.py @@ -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() diff --git a/mayan/apps/document_indexing/api_views.py b/mayan/apps/document_indexing/api_views.py index 095a1bdd23..cb803bd4a7 100644 --- a/mayan/apps/document_indexing/api_views.py +++ b/mayan/apps/document_indexing/api_views.py @@ -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() diff --git a/mayan/apps/document_indexing/apps.py b/mayan/apps/document_indexing/apps.py index 3c2a1d56bf..671abe4bd4 100644 --- a/mayan/apps/document_indexing/apps.py +++ b/mayan/apps/document_indexing/apps.py @@ -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( diff --git a/mayan/apps/document_indexing/handlers.py b/mayan/apps/document_indexing/handlers.py index 572095b43b..76fa0772ae 100644 --- a/mayan/apps/document_indexing/handlers.py +++ b/mayan/apps/document_indexing/handlers.py @@ -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' ) diff --git a/mayan/apps/document_indexing/html_widgets.py b/mayan/apps/document_indexing/html_widgets.py index bdaa1ba37c..d0715fcfc6 100644 --- a/mayan/apps/document_indexing/html_widgets.py +++ b/mayan/apps/document_indexing/html_widgets.py @@ -14,7 +14,7 @@ def get_instance_link(index_instance_node): Return an HTML anchor to an index node instance """ return mark_safe( - '{text}'.format( + s='{text}'.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 %(text)s' % { + s='%(icon)s %(text)s' % { '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(), diff --git a/mayan/apps/document_indexing/models.py b/mayan/apps/document_indexing/models.py index 7b67064d0f..5a9e923ffc 100644 --- a/mayan/apps/document_indexing/models.py +++ b/mayan/apps/document_indexing/models.py @@ -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() diff --git a/mayan/apps/document_indexing/permissions.py b/mayan/apps/document_indexing/permissions.py index 1bab21761a..39fddadf1a 100644 --- a/mayan/apps/document_indexing/permissions.py +++ b/mayan/apps/document_indexing/permissions.py @@ -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' ) diff --git a/mayan/apps/document_indexing/queues.py b/mayan/apps/document_indexing/queues.py index 96347ba0ef..f8749d9235 100644 --- a/mayan/apps/document_indexing/queues.py +++ b/mayan/apps/document_indexing/queues.py @@ -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' ) diff --git a/mayan/apps/document_indexing/views.py b/mayan/apps/document_indexing/views.py index 0e7c07487e..ab185879a7 100644 --- a/mayan/apps/document_indexing/views.py +++ b/mayan/apps/document_indexing/views.py @@ -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( diff --git a/mayan/apps/document_parsing/apps.py b/mayan/apps/document_parsing/apps.py index fb81906fa6..4ef5e4467d 100644 --- a/mayan/apps/document_parsing/apps.py +++ b/mayan/apps/document_parsing/apps.py @@ -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, diff --git a/mayan/apps/document_parsing/parsers.py b/mayan/apps/document_parsing/parsers.py index 7b64f886d5..2ffd900a44 100644 --- a/mayan/apps/document_parsing/parsers.py +++ b/mayan/apps/document_parsing/parsers.py @@ -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( diff --git a/mayan/apps/document_parsing/permissions.py b/mayan/apps/document_parsing/permissions.py index 3031daac19..053ec933f5 100644 --- a/mayan/apps/document_parsing/permissions.py +++ b/mayan/apps/document_parsing/permissions.py @@ -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' ) diff --git a/mayan/apps/document_parsing/settings.py b/mayan/apps/document_parsing/settings.py index 1e9dd9f368..c6626fbbd1 100644 --- a/mayan/apps/document_parsing/settings.py +++ b/mayan/apps/document_parsing/settings.py @@ -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, diff --git a/mayan/apps/document_parsing/views.py b/mayan/apps/document_parsing/views.py index a81811df81..67baeb71e4 100644 --- a/mayan/apps/document_parsing/views.py +++ b/mayan/apps/document_parsing/views.py @@ -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): diff --git a/mayan/apps/document_signatures/apps.py b/mayan/apps/document_signatures/apps.py index af62bf1784..aecd132358 100644 --- a/mayan/apps/document_signatures/apps.py +++ b/mayan/apps/document_signatures/apps.py @@ -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 ) diff --git a/mayan/apps/document_signatures/handlers.py b/mayan/apps/document_signatures/handlers.py index 988f4da513..f55d7de538 100644 --- a/mayan/apps/document_signatures/handlers.py +++ b/mayan/apps/document_signatures/handlers.py @@ -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() diff --git a/mayan/apps/document_signatures/models.py b/mayan/apps/document_signatures/models.py index 47e226f5ed..524fb893ee 100644 --- a/mayan/apps/document_signatures/models.py +++ b/mayan/apps/document_signatures/models.py @@ -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 diff --git a/mayan/apps/document_signatures/permissions.py b/mayan/apps/document_signatures/permissions.py index d570776a0a..c225acb170 100644 --- a/mayan/apps/document_signatures/permissions.py +++ b/mayan/apps/document_signatures/permissions.py @@ -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' ) diff --git a/mayan/apps/document_signatures/queues.py b/mayan/apps/document_signatures/queues.py index 50f431d401..a10d60caac 100644 --- a/mayan/apps/document_signatures/queues.py +++ b/mayan/apps/document_signatures/queues.py @@ -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' ) diff --git a/mayan/apps/document_signatures/settings.py b/mayan/apps/document_signatures/settings.py index 3c61f5a916..6e0b75ec23 100644 --- a/mayan/apps/document_signatures/settings.py +++ b/mayan/apps/document_signatures/settings.py @@ -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=_( diff --git a/mayan/apps/document_signatures/views.py b/mayan/apps/document_signatures/views.py index 47dfab001a..5500b0fa4e 100644 --- a/mayan/apps/document_signatures/views.py +++ b/mayan/apps/document_signatures/views.py @@ -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( diff --git a/mayan/apps/documents/apps.py b/mayan/apps/documents/apps.py index ad684e2d18..81f4d365e1 100644 --- a/mayan/apps/documents/apps.py +++ b/mayan/apps/documents/apps.py @@ -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) diff --git a/mayan/apps/documents/dashboard_widgets.py b/mayan/apps/documents/dashboard_widgets.py index 244a44fa2d..518c3b4acb 100644 --- a/mayan/apps/documents/dashboard_widgets.py +++ b/mayan/apps/documents/dashboard_widgets.py @@ -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',) ) diff --git a/mayan/apps/documents/events.py b/mayan/apps/documents/events.py index 817970f27d..b841730d62 100644 --- a/mayan/apps/documents/events.py +++ b/mayan/apps/documents/events.py @@ -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' ) diff --git a/mayan/apps/documents/handlers.py b/mayan/apps/documents/handlers.py index 62fa444a0e..597a38c40d 100644 --- a/mayan/apps/documents/handlers.py +++ b/mayan/apps/documents/handlers.py @@ -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' ) diff --git a/mayan/apps/documents/managers.py b/mayan/apps/documents/managers.py index f26dd5fff0..b047b9d5e9 100644 --- a/mayan/apps/documents/managers.py +++ b/mayan/apps/documents/managers.py @@ -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) diff --git a/mayan/apps/documents/models/document_page_models.py b/mayan/apps/documents/models/document_page_models.py index 75a3452311..4c6f42fdd6 100644 --- a/mayan/apps/documents/models/document_page_models.py +++ b/mayan/apps/documents/models/document_page_models.py @@ -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): """ diff --git a/mayan/apps/documents/models/document_type_models.py b/mayan/apps/documents/models/document_type_models.py index 1c07146f75..877567edee 100644 --- a/mayan/apps/documents/models/document_type_models.py +++ b/mayan/apps/documents/models/document_type_models.py @@ -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): """ diff --git a/mayan/apps/documents/models/misc_models.py b/mayan/apps/documents/models/misc_models.py index 922bfa1c96..67db70769f 100644 --- a/mayan/apps/documents/models/misc_models.py +++ b/mayan/apps/documents/models/misc_models.py @@ -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() diff --git a/mayan/apps/documents/permissions.py b/mayan/apps/documents/permissions.py index 0d7ecfdae6..5abcbb9176 100644 --- a/mayan/apps/documents/permissions.py +++ b/mayan/apps/documents/permissions.py @@ -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' ) diff --git a/mayan/apps/documents/search.py b/mayan/apps/documents/search.py index e418c7d48a..8694fec75a 100644 --- a/mayan/apps/documents/search.py +++ b/mayan/apps/documents/search.py @@ -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( diff --git a/mayan/apps/documents/serializers.py b/mayan/apps/documents/serializers.py index fcda698ce4..9632a546cb 100644 --- a/mayan/apps/documents/serializers.py +++ b/mayan/apps/documents/serializers.py @@ -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'] ) diff --git a/mayan/apps/documents/settings.py b/mayan/apps/documents/settings.py index c1f63d249f..b70235a44a 100644 --- a/mayan/apps/documents/settings.py +++ b/mayan/apps/documents/settings.py @@ -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', diff --git a/mayan/apps/documents/storages.py b/mayan/apps/documents/storages.py index f29ebd17bb..95405e9242 100644 --- a/mayan/apps/documents/storages.py +++ b/mayan/apps/documents/storages.py @@ -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 ) diff --git a/mayan/apps/documents/tasks.py b/mayan/apps/documents/tasks.py index 8e230846d4..55dd75150c 100644 --- a/mayan/apps/documents/tasks.py +++ b/mayan/apps/documents/tasks.py @@ -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() diff --git a/mayan/apps/documents/tests/test_search.py b/mayan/apps/documents/tests/test_search.py index 13d2eff0f4..fa594063ba 100644 --- a/mayan/apps/documents/tests/test_search.py +++ b/mayan/apps/documents/tests/test_search.py @@ -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) diff --git a/mayan/apps/documents/views/document_views.py b/mayan/apps/documents/views/document_views.py index 5f05d7a81f..b5c0c68f28 100644 --- a/mayan/apps/documents/views/document_views.py +++ b/mayan/apps/documents/views/document_views.py @@ -714,7 +714,7 @@ class RecentAddedDocumentListView(DocumentListView): pk__in=Document.objects.order_by('-date_added')[ :setting_recent_added_count.value ].values('pk') - ). order_by('-date_added') + ).order_by('-date_added') def get_extra_context(self): context = super(RecentAddedDocumentListView, self).get_extra_context() diff --git a/mayan/apps/dynamic_search/classes.py b/mayan/apps/dynamic_search/classes.py index 43d9d88566..2f4965f332 100644 --- a/mayan/apps/dynamic_search/classes.py +++ b/mayan/apps/dynamic_search/classes.py @@ -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 diff --git a/mayan/apps/dynamic_search/views.py b/mayan/apps/dynamic_search/views.py index 38c68f65db..13fb7a545f 100644 --- a/mayan/apps/dynamic_search/views.py +++ b/mayan/apps/dynamic_search/views.py @@ -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, } diff --git a/mayan/apps/events/apps.py b/mayan/apps/events/apps.py index 0fad6b1bde..986d83c65d 100644 --- a/mayan/apps/events/apps.py +++ b/mayan/apps/events/apps.py @@ -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 diff --git a/mayan/apps/events/permissions.py b/mayan/apps/events/permissions.py index c0953352d5..49fbeafcb4 100644 --- a/mayan/apps/events/permissions.py +++ b/mayan/apps/events/permissions.py @@ -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' ) diff --git a/mayan/apps/events/serializers.py b/mayan/apps/events/serializers.py index c15a853bd8..b9ade3ed8a 100644 --- a/mayan/apps/events/serializers.py +++ b/mayan/apps/events/serializers.py @@ -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'] ) diff --git a/mayan/apps/events/views.py b/mayan/apps/events/views.py index 4c3680fc04..cc4aabb5e8 100644 --- a/mayan/apps/events/views.py +++ b/mayan/apps/events/views.py @@ -128,7 +128,9 @@ class NotificationListView(SingleObjectListView): class NotificationMarkRead(SimpleView): def dispatch(self, *args, **kwargs): self.get_queryset().filter(pk=self.kwargs['pk']).update(read=True) - return HttpResponseRedirect(reverse('events:user_notifications_list')) + return HttpResponseRedirect( + redirect_to=reverse(viewname='events:user_notifications_list') + ) def get_queryset(self): return self.request.user.notifications.all() @@ -137,7 +139,9 @@ class NotificationMarkRead(SimpleView): class NotificationMarkReadAll(SimpleView): def dispatch(self, *args, **kwargs): self.get_queryset().update(read=True) - return HttpResponseRedirect(reverse('events:user_notifications_list')) + return HttpResponseRedirect( + redirect_to=reverse(viewname='events:user_notifications_list') + ) def get_queryset(self): return self.request.user.notifications.all() @@ -191,7 +195,9 @@ class ObjectEventTypeSubscriptionListView(FormView): def dispatch(self, *args, **kwargs): EventType.refresh() - return super(ObjectEventTypeSubscriptionListView, self).dispatch(*args, **kwargs) + return super(ObjectEventTypeSubscriptionListView, self).dispatch( + *args, **kwargs + ) def form_valid(self, form): try: @@ -228,8 +234,8 @@ class ObjectEventTypeSubscriptionListView(FormView): raise Http404 AccessControlList.objects.check_access( - permissions=permission_events_view, user=self.request.user, - obj=content_object + obj=content_object, permissions=permission_events_view, + user=self.request.user ) return content_object @@ -248,11 +254,13 @@ class ObjectEventTypeSubscriptionListView(FormView): initial = [] for element in self.get_queryset(): - initial.append({ - 'user': self.request.user, - 'object': obj, - 'stored_event_type': element, - }) + initial.append( + { + 'user': self.request.user, + 'object': obj, + 'stored_event_type': element, + } + ) return initial def get_queryset(self): diff --git a/mayan/apps/linking/api_views.py b/mayan/apps/linking/api_views.py index dec9bab408..66d2cac738 100644 --- a/mayan/apps/linking/api_views.py +++ b/mayan/apps/linking/api_views.py @@ -35,8 +35,8 @@ class APIResolvedSmartLinkDocumentListView(generics.ListAPIView): 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 @@ -58,7 +58,9 @@ class APIResolvedSmartLinkDocumentListView(generics.ListAPIView): """ Extra context provided to the serializer class. """ - context = super(APIResolvedSmartLinkDocumentListView, self).get_serializer_context() + context = super( + APIResolvedSmartLinkDocumentListView, self + ).get_serializer_context() if self.kwargs: context.update( { @@ -89,8 +91,8 @@ class APIResolvedSmartLinkView(generics.RetrieveAPIView): 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 @@ -126,8 +128,8 @@ class APIResolvedSmartLinkListView(generics.ListAPIView): 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 @@ -185,8 +187,8 @@ class APISmartLinkConditionListView(generics.ListCreateAPIView): smart_link = get_object_or_404(klass=SmartLink, pk=self.kwargs['pk']) AccessControlList.objects.check_access( - permissions=permission_required, user=self.request.user, - obj=smart_link + obj=smart_link, permissions=permission_required, + user=self.request.user ) return smart_link @@ -228,8 +230,8 @@ class APISmartLinkConditionView(generics.RetrieveUpdateDestroyAPIView): smart_link = get_object_or_404(klass=SmartLink, pk=self.kwargs['pk']) AccessControlList.objects.check_access( - permissions=permission_required, user=self.request.user, - obj=smart_link + obj=smart_link, permissions=permission_required, + user=self.request.user ) return smart_link diff --git a/mayan/apps/linking/apps.py b/mayan/apps/linking/apps.py index aaffed74c0..59ff8f0020 100644 --- a/mayan/apps/linking/apps.py +++ b/mayan/apps/linking/apps.py @@ -42,9 +42,9 @@ class LinkingApp(MayanAppConfig): app_label='documents', model_name='Document' ) - ResolvedSmartLink = self.get_model('ResolvedSmartLink') - SmartLink = self.get_model('SmartLink') - SmartLinkCondition = self.get_model('SmartLinkCondition') + ResolvedSmartLink = self.get_model(model_name='ResolvedSmartLink') + SmartLink = self.get_model(model_name='SmartLink') + SmartLinkCondition = self.get_model(model_name='SmartLinkCondition') ModelPermission.register( model=SmartLink, permissions=( @@ -62,16 +62,14 @@ class LinkingApp(MayanAppConfig): ) SourceColumn( - source=SmartLink, label=_('Dynamic label'), - attribute='dynamic_label' + attribute='dynamic_label', source=SmartLink ) SourceColumn( - attribute='enabled', label=_('Enabled'), source=SmartLink, - widget=TwoStateWidget + attribute='enabled', source=SmartLink, widget=TwoStateWidget ) SourceColumn( - attribute='enabled', label=_('Enabled'), source=SmartLinkCondition, + attribute='enabled', source=SmartLinkCondition, widget=TwoStateWidget ) diff --git a/mayan/apps/linking/permissions.py b/mayan/apps/linking/permissions.py index 4111e42c5a..3bae121d04 100644 --- a/mayan/apps/linking/permissions.py +++ b/mayan/apps/linking/permissions.py @@ -4,17 +4,17 @@ from django.utils.translation import ugettext_lazy as _ from mayan.apps.permissions import PermissionNamespace -namespace = PermissionNamespace(name='linking', label=_('Smart links')) +namespace = PermissionNamespace(label=_('Smart links'), name='linking') -permission_smart_link_view = namespace.add_permission( - name='smart_link_view', label=_('View existing smart links') -) permission_smart_link_create = namespace.add_permission( - name='smart_link_create', label=_('Create new smart links') + label=_('Create new smart links'), name='smart_link_create' ) permission_smart_link_delete = namespace.add_permission( - name='smart_link_delete', label=_('Delete smart links') + label=_('Delete smart links'), name='smart_link_delete' ) permission_smart_link_edit = namespace.add_permission( - name='smart_link_edit', label=_('Edit smart links') + label=_('Edit smart links'), name='smart_link_edit' +) +permission_smart_link_view = namespace.add_permission( + label=_('View existing smart links'), name='smart_link_view' ) diff --git a/mayan/apps/linking/serializers.py b/mayan/apps/linking/serializers.py index 03b18d0eb4..229c30f37a 100644 --- a/mayan/apps/linking/serializers.py +++ b/mayan/apps/linking/serializers.py @@ -31,13 +31,13 @@ class SmartLinkConditionSerializer(serializers.HyperlinkedModelSerializer): def get_smart_link_url(self, instance): return reverse( - 'rest_api:smartlink-detail', args=(instance.smart_link.pk,), + viewname='rest_api:smartlink-detail', args=(instance.smart_link.pk,), request=self.context['request'], format=self.context['format'] ) def get_url(self, instance): return reverse( - 'rest_api:smartlinkcondition-detail', args=( + viewname='rest_api:smartlinkcondition-detail', args=( instance.smart_link.pk, instance.pk, ), request=self.context['request'], format=self.context['format'] ) @@ -71,7 +71,7 @@ class ResolvedSmartLinkDocumentSerializer(DocumentSerializer): def get_resolved_smart_link_url(self, instance): return reverse( - 'rest_api:resolvedsmartlink-detail', args=( + viewname='rest_api:resolvedsmartlink-detail', args=( self.context['document'].pk, self.context['smart_link'].pk ), request=self.context['request'], format=self.context['format'] @@ -92,7 +92,7 @@ class ResolvedSmartLinkSerializer(SmartLinkSerializer): def get_resolved_documents_url(self, instance): return reverse( - 'rest_api:resolvedsmartlinkdocument-list', + viewname='rest_api:resolvedsmartlinkdocument-list', args=(self.context['document'].pk, instance.pk,), request=self.context['request'], format=self.context['format'] ) @@ -102,7 +102,7 @@ class ResolvedSmartLinkSerializer(SmartLinkSerializer): def get_resolved_smart_link_url(self, instance): return reverse( - 'rest_api:resolvedsmartlink-detail', + viewname='rest_api:resolvedsmartlink-detail', args=(self.context['document'].pk, instance.pk,), request=self.context['request'], format=self.context['format'] ) diff --git a/mayan/apps/linking/views.py b/mayan/apps/linking/views.py index 7c9114e10d..c4b5e4c5f0 100644 --- a/mayan/apps/linking/views.py +++ b/mayan/apps/linking/views.py @@ -40,13 +40,13 @@ class ResolvedSmartLinkView(DocumentListView): ) AccessControlList.objects.check_access( - permissions=permission_document_view, user=request.user, - obj=self.document + obj=self.document, permissions=permission_document_view, + user=request.user ) AccessControlList.objects.check_access( - permissions=permission_smart_link_view, user=request.user, - obj=self.smart_link + obj=self.smart_link, permissions=permission_smart_link_view, + user=request.user ) return super( @@ -61,8 +61,8 @@ class ResolvedSmartLinkView(DocumentListView): try: AccessControlList.objects.check_access( - permissions=permission_smart_link_edit, user=self.request.user, - obj=self.smart_link + obj=self.smart_link, permissions=permission_smart_link_edit, + user=self.request.user, ) except PermissionDenied: pass @@ -170,8 +170,8 @@ class DocumentSmartLinkListView(SmartLinkListView): 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( @@ -277,8 +277,8 @@ class SmartLinkConditionCreateView(SingleObjectCreateView): def dispatch(self, request, *args, **kwargs): AccessControlList.objects.check_access( - permissions=permission_smart_link_edit, user=request.user, - obj=self.get_smart_link() + obj=self.get_smart_link(), permissions=permission_smart_link_edit, + user=request.user ) return super( @@ -316,8 +316,8 @@ class SmartLinkConditionEditView(SingleObjectEditView): def dispatch(self, request, *args, **kwargs): AccessControlList.objects.check_access( - permissions=permission_smart_link_edit, user=request.user, - obj=self.get_object().smart_link + obj=self.get_object().smart_link, + permissions=permission_smart_link_edit, user=request.user ) return super( @@ -345,8 +345,8 @@ class SmartLinkConditionDeleteView(SingleObjectDeleteView): def dispatch(self, request, *args, **kwargs): AccessControlList.objects.check_access( - permissions=permission_smart_link_edit, user=request.user, - obj=self.get_object().smart_link + obj=self.get_object().smart_link, + permissions=permission_smart_link_edit, user=request.user ) return super( diff --git a/mayan/apps/lock_manager/backends/file_lock.py b/mayan/apps/lock_manager/backends/file_lock.py index 16a8fd96c3..6630c5ba0c 100644 --- a/mayan/apps/lock_manager/backends/file_lock.py +++ b/mayan/apps/lock_manager/backends/file_lock.py @@ -23,7 +23,9 @@ lock = threading.Lock() logger = logging.getLogger(__name__) lock_file = os.path.join( - setting_temporary_directory.value, hashlib.sha256(force_bytes(settings.SECRET_KEY)).hexdigest() + setting_temporary_directory.value, hashlib.sha256( + force_bytes(settings.SECRET_KEY) + ).hexdigest() ) open(lock_file, 'a').close() logger.debug('lock_file: %s', lock_file) diff --git a/mayan/apps/lock_manager/literals.py b/mayan/apps/lock_manager/literals.py new file mode 100644 index 0000000000..fa84c33e02 --- /dev/null +++ b/mayan/apps/lock_manager/literals.py @@ -0,0 +1,4 @@ +from __future__ import unicode_literals + +DEFAULT_BACKEND = 'mayan.apps.lock_manager.backends.file_lock.FileLock' +DEFAULT_LOCK_TIMEOUT_VALUE = 30 diff --git a/mayan/apps/lock_manager/runtime.py b/mayan/apps/lock_manager/runtime.py index 3c4a54de02..27e8d636b5 100644 --- a/mayan/apps/lock_manager/runtime.py +++ b/mayan/apps/lock_manager/runtime.py @@ -2,4 +2,4 @@ from django.utils.module_loading import import_string from .settings import setting_backend -locking_backend = import_string(setting_backend.value) +locking_backend = import_string(dotted_path=setting_backend.value) diff --git a/mayan/apps/lock_manager/settings.py b/mayan/apps/lock_manager/settings.py index defbc79a99..d401b4c462 100644 --- a/mayan/apps/lock_manager/settings.py +++ b/mayan/apps/lock_manager/settings.py @@ -4,10 +4,9 @@ from django.utils.translation import ugettext_lazy as _ from mayan.apps.smart_settings import Namespace -DEFAULT_BACKEND = 'mayan.apps.lock_manager.backends.file_lock.FileLock' -DEFAULT_LOCK_TIMEOUT_VALUE = 30 +from .literals import DEFAULT_BACKEND, DEFAULT_LOCK_TIMEOUT_VALUE -namespace = Namespace(name='lock_manager', label=_('Lock manager')) +namespace = Namespace(label=_('Lock manager'), name='lock_manager') setting_backend = namespace.add_setting( default=DEFAULT_BACKEND, diff --git a/mayan/apps/metadata/queues.py b/mayan/apps/metadata/queues.py index 16775657fb..c57d66cc4c 100644 --- a/mayan/apps/metadata/queues.py +++ b/mayan/apps/metadata/queues.py @@ -5,13 +5,13 @@ from django.utils.translation import ugettext_lazy as _ from mayan.apps.task_manager.classes import CeleryQueue queue_metadata = CeleryQueue( - name='metadata', label=_('Metadata') + label=_('Metadata'), name='metadata' ) queue_metadata.add_task_type( - name='mayan.apps.metadata.tasks.task_remove_metadata_type', - label=_('Remove metadata type') + label=_('Remove metadata type'), + name='mayan.apps.metadata.tasks.task_remove_metadata_type' ) queue_metadata.add_task_type( - name='mayan.apps.metadata.tasks.task_add_required_metadata_type', - label=_('Add required metadata type') + label=_('Add required metadata type'), + name='mayan.apps.metadata.tasks.task_add_required_metadata_type' ) diff --git a/mayan/apps/metadata/search.py b/mayan/apps/metadata/search.py index ba11ff1ca2..37023357ea 100644 --- a/mayan/apps/metadata/search.py +++ b/mayan/apps/metadata/search.py @@ -9,7 +9,7 @@ from .permissions import permission_metadata_type_view metadata_type_search = SearchModel( app_label='metadata', model_name='MetadataType', permission=permission_metadata_type_view, - serializer_string='mayan.apps.metadata.serializers.MetadataTypeSerializer' + serializer_path='mayan.apps.metadata.serializers.MetadataTypeSerializer' ) metadata_type_search.add_model_field( diff --git a/mayan/apps/metadata/settings.py b/mayan/apps/metadata/settings.py index bb40bca391..ce7aa6de35 100644 --- a/mayan/apps/metadata/settings.py +++ b/mayan/apps/metadata/settings.py @@ -7,7 +7,8 @@ from mayan.apps.smart_settings import Namespace from .parsers import MetadataParser from .validators import MetadataValidator -namespace = Namespace(name='metadata', label=_('Metadata')) +namespace = Namespace(label=_('Metadata'), name='metadata') + setting_available_validators = namespace.add_setting( global_name='METADATA_AVAILABLE_VALIDATORS', default=MetadataValidator.get_import_paths() diff --git a/mayan/apps/metadata/tests/test_api.py b/mayan/apps/metadata/tests/test_api.py index 7b48afcae6..763529453f 100644 --- a/mayan/apps/metadata/tests/test_api.py +++ b/mayan/apps/metadata/tests/test_api.py @@ -488,7 +488,7 @@ class DocumentMetadataAPITestCase(DocumentTestMixin, BaseAPITestCase): viewname='rest_api:documentmetadata-detail', kwargs={ 'document_pk': self.test_document.pk, - 'metadata_type': self.test_document_metadata.pk + 'metadata_pk': self.test_document_metadata.pk }, data={ 'value': TEST_METADATA_VALUE_EDITED } diff --git a/mayan/apps/metadata/validators.py b/mayan/apps/metadata/validators.py index 702c70f8d9..1c16ac3bee 100644 --- a/mayan/apps/metadata/validators.py +++ b/mayan/apps/metadata/validators.py @@ -32,6 +32,6 @@ class TimeValidator(MetadataValidator): return parse(input_data).time().isoformat() -MetadataValidator.register(DateAndTimeValidator) -MetadataValidator.register(DateValidator) -MetadataValidator.register(TimeValidator) +MetadataValidator.register(parser=DateAndTimeValidator) +MetadataValidator.register(parser=DateValidator) +MetadataValidator.register(parser=TimeValidator) diff --git a/mayan/apps/metadata/views.py b/mayan/apps/metadata/views.py index f50b783d1f..178a39c784 100644 --- a/mayan/apps/metadata/views.py +++ b/mayan/apps/metadata/views.py @@ -69,7 +69,7 @@ class DocumentMetadataAddView(MultipleObjectFormActionView): 'Selected documents must be of the same type.' ), request=request ) - return HttpResponseRedirect(self.previous_url) + return HttpResponseRedirect(redirect_to=self.previous_url) return result diff --git a/mayan/apps/metadata/wizard_steps.py b/mayan/apps/metadata/wizard_steps.py index 0d76500fb0..b36db7c8a5 100644 --- a/mayan/apps/metadata/wizard_steps.py +++ b/mayan/apps/metadata/wizard_steps.py @@ -67,4 +67,4 @@ class WizardStepMetadata(WizardStep): ) -WizardStep.register(WizardStepMetadata) +WizardStep.register(step=WizardStepMetadata) diff --git a/mayan/apps/mirroring/settings.py b/mayan/apps/mirroring/settings.py index 2dfb4d6ee0..aa16aa1335 100644 --- a/mayan/apps/mirroring/settings.py +++ b/mayan/apps/mirroring/settings.py @@ -4,7 +4,7 @@ from django.utils.translation import ugettext_lazy as _ from mayan.apps.smart_settings import Namespace -namespace = Namespace(name='mirroring', label=_('Mirroring')) +namespace = Namespace(label=_('Mirroring'), name='mirroring') setting_document_lookup_cache_timeout = namespace.add_setting( global_name='MIRRORING_DOCUMENT_CACHE_LOOKUP_TIMEOUT', default=10, diff --git a/mayan/apps/motd/apps.py b/mayan/apps/motd/apps.py index c0c14d1a81..090309d041 100644 --- a/mayan/apps/motd/apps.py +++ b/mayan/apps/motd/apps.py @@ -37,7 +37,7 @@ class MOTDApp(MayanAppConfig): def ready(self): super(MOTDApp, self).ready() - Message = self.get_model('Message') + Message = self.get_model(model_name='Message') ModelPermission.register( model=Message, permissions=( permission_acl_edit, permission_acl_view, diff --git a/mayan/apps/motd/permissions.py b/mayan/apps/motd/permissions.py index da60db4e8d..6c22706a74 100644 --- a/mayan/apps/motd/permissions.py +++ b/mayan/apps/motd/permissions.py @@ -4,17 +4,17 @@ from django.utils.translation import ugettext_lazy as _ from mayan.apps.permissions import PermissionNamespace -namespace = PermissionNamespace(name='motd', label=_('Message of the day')) +namespace = PermissionNamespace(label=_('Message of the day'), name='motd') permission_message_create = namespace.add_permission( - name='message_create', label=_('Create messages') + label=_('Create messages'), name='message_create' ) permission_message_delete = namespace.add_permission( - name='message_delete', label=_('Delete messages') + label=_('Delete messages'), name='message_delete' ) permission_message_edit = namespace.add_permission( - name='message_edit', label=_('Edit messages') + label=_('Edit messages'), name='message_edit' ) permission_message_view = namespace.add_permission( - name='message_view', label=_('View messages') + label=_('View messages'), name='message_view' ) diff --git a/mayan/apps/ocr/apps.py b/mayan/apps/ocr/apps.py index 1db19025f7..0cfd5ba9ff 100644 --- a/mayan/apps/ocr/apps.py +++ b/mayan/apps/ocr/apps.py @@ -71,7 +71,9 @@ class OCRApp(MayanAppConfig): app_label='documents', model_name='DocumentVersion' ) - DocumentVersionOCRError = self.get_model('DocumentVersionOCRError') + DocumentVersionOCRError = self.get_model( + model_name='DocumentVersionOCRError' + ) Document.add_to_class( name='submit_for_ocr', value=method_document_ocr_submit @@ -84,7 +86,7 @@ class OCRApp(MayanAppConfig): ) ModelField( - Document, name='versions__pages__ocr_content__content' + model=Document, name='versions__pages__ocr_content__content' ) ModelPermission.register( diff --git a/mayan/apps/ocr/events.py b/mayan/apps/ocr/events.py index a77827bb47..c793b6edee 100644 --- a/mayan/apps/ocr/events.py +++ b/mayan/apps/ocr/events.py @@ -4,7 +4,7 @@ from django.utils.translation import ugettext_lazy as _ from mayan.apps.events import EventTypeNamespace -namespace = EventTypeNamespace(name='ocr', label=_('OCR')) +namespace = EventTypeNamespace(label=_('OCR'), name='ocr') event_ocr_document_version_submit = namespace.add_event_type( label=_('Document version submitted for OCR'), diff --git a/mayan/apps/ocr/permissions.py b/mayan/apps/ocr/permissions.py index d27eedc56e..b5121fd779 100644 --- a/mayan/apps/ocr/permissions.py +++ b/mayan/apps/ocr/permissions.py @@ -4,16 +4,16 @@ from django.utils.translation import ugettext_lazy as _ from mayan.apps.permissions import PermissionNamespace -namespace = PermissionNamespace(name='ocr', label=_('OCR')) +namespace = PermissionNamespace(label=_('OCR'), name='ocr') permission_ocr_document = namespace.add_permission( - name='ocr_document', label=_('Submit documents for OCR') + label=_('Submit documents for OCR'), name='ocr_document' ) permission_ocr_content_view = namespace.add_permission( - name='ocr_content_view', - label=_('View the transcribed text from document') + label=_('View the transcribed text from document'), + name='ocr_content_view' ) permission_document_type_ocr_setup = namespace.add_permission( - name='ocr_document_type_setup', - label=_('Change document type OCR settings') + label=_('Change document type OCR settings'), + name='ocr_document_type_setup' ) diff --git a/mayan/apps/ocr/runtime.py b/mayan/apps/ocr/runtime.py index 06d20559a8..1d8643819b 100644 --- a/mayan/apps/ocr/runtime.py +++ b/mayan/apps/ocr/runtime.py @@ -12,7 +12,7 @@ from django.utils.module_loading import import_string from .settings import setting_ocr_backend, setting_ocr_backend_arguments ocr_backend = import_string( - setting_ocr_backend.value + dotted_path=setting_ocr_backend.value )( **yaml.load( stream=setting_ocr_backend_arguments.value or '{}', Loader=SafeLoader diff --git a/mayan/apps/ocr/settings.py b/mayan/apps/ocr/settings.py index 19f6e6e5cd..b13ad70111 100644 --- a/mayan/apps/ocr/settings.py +++ b/mayan/apps/ocr/settings.py @@ -4,7 +4,7 @@ from django.utils.translation import ugettext_lazy as _ from mayan.apps.smart_settings import Namespace -namespace = Namespace(name='ocr', label=_('OCR')) +namespace = Namespace(label=_('OCR'), name='ocr') setting_ocr_backend = namespace.add_setting( global_name='OCR_BACKEND', default='mayan.apps.ocr.backends.pyocr.PyOCR', diff --git a/mayan/apps/ocr/views.py b/mayan/apps/ocr/views.py index 9ff9f2b4e6..8174f2b267 100644 --- a/mayan/apps/ocr/views.py +++ b/mayan/apps/ocr/views.py @@ -76,9 +76,9 @@ class DocumentSubmitView(MultipleObjectConfirmActionView): result = { 'title': ungettext( - 'Submit the selected document to the OCR queue?', - 'Submit the selected documents to the OCR queue?', - queryset.count() + singular='Submit the selected document to the OCR queue?', + plural='Submit the selected documents to the OCR queue?', + number=queryset.count() ) } diff --git a/mayan/apps/permissions/permissions.py b/mayan/apps/permissions/permissions.py index af5b345485..986b5b5485 100644 --- a/mayan/apps/permissions/permissions.py +++ b/mayan/apps/permissions/permissions.py @@ -4,17 +4,17 @@ from django.utils.translation import ugettext_lazy as _ from . import PermissionNamespace -namespace = PermissionNamespace(name='permissions', label=_('Permissions')) +namespace = PermissionNamespace(label=_('Permissions'), name='permissions') -permission_role_view = namespace.add_permission( - name='role_view', label=_('View roles') -) -permission_role_edit = namespace.add_permission( - name='role_edit', label=_('Edit roles') -) permission_role_create = namespace.add_permission( - name='role_create', label=_('Create roles') + label=_('Create roles'), name='role_create' ) permission_role_delete = namespace.add_permission( - name='role_delete', label=_('Delete roles') + label=_('Delete roles'), name='role_delete' +) +permission_role_edit = namespace.add_permission( + label=_('Edit roles'), name='role_edit' +) +permission_role_view = namespace.add_permission( + label=_('View roles'), name='role_view' ) diff --git a/mayan/apps/permissions/search.py b/mayan/apps/permissions/search.py index 21ac3f9c52..a5aca3473f 100644 --- a/mayan/apps/permissions/search.py +++ b/mayan/apps/permissions/search.py @@ -9,7 +9,7 @@ from .permissions import permission_role_view role_search = SearchModel( app_label='permissions', model_name='Role', permission=permission_role_view, - serializer_string='mayan.apps.permissions.serializers.RoleSerializer' + serializer_path='mayan.apps.permissions.serializers.RoleSerializer' ) role_search.add_model_field( diff --git a/mayan/apps/permissions/tests/test_views.py b/mayan/apps/permissions/tests/test_views.py index 2c803a6c19..0dbb610aff 100644 --- a/mayan/apps/permissions/tests/test_views.py +++ b/mayan/apps/permissions/tests/test_views.py @@ -127,7 +127,7 @@ class GroupRoleViewTestCase(GroupTestMixin, GroupRoleViewTestMixin, RoleTestMixi self._create_test_group() response = self._request_test_group_roles_view() - self.assertEqual(response.status_code, 403) + self.assertEqual(response.status_code, 404) def test_group_roles_view_with_access(self): self._create_test_group() diff --git a/mayan/apps/smart_settings/permissions.py b/mayan/apps/smart_settings/permissions.py index b1426603f0..1f49f411ea 100644 --- a/mayan/apps/smart_settings/permissions.py +++ b/mayan/apps/smart_settings/permissions.py @@ -5,12 +5,12 @@ from django.utils.translation import ugettext_lazy as _ from mayan.apps.permissions import PermissionNamespace namespace = PermissionNamespace( - name='smart_settings', label=_('Smart settings') + label=_('Smart settings'), name='smart_settings' ) permission_settings_edit = namespace.add_permission( - name='permission_settings_edit', label=_('Edit settings') + label=_('Edit settings'), name='permission_settings_edit' ) permission_settings_view = namespace.add_permission( - name='permission_settings_view', label=_('View settings') + label=_('View settings'), name='permission_settings_view' ) diff --git a/mayan/apps/smart_settings/views.py b/mayan/apps/smart_settings/views.py index 44d768f4c6..5669cd1076 100644 --- a/mayan/apps/smart_settings/views.py +++ b/mayan/apps/smart_settings/views.py @@ -12,17 +12,6 @@ from .forms import SettingForm from .permissions import permission_settings_edit, permission_settings_view -class NamespaceListView(SingleObjectListView): - extra_context = { - 'hide_link': True, - 'title': _('Setting namespaces'), - } - view_permission = permission_settings_view - - def get_object_list(self): - return Namespace.get_all() - - class NamespaceDetailView(SingleObjectListView): view_permission = permission_settings_view @@ -39,7 +28,7 @@ class NamespaceDetailView(SingleObjectListView): def get_namespace(self): try: - return Namespace.get(self.kwargs['namespace_name']) + return Namespace.get(name=self.kwargs['namespace_name']) except KeyError: raise Http404( _('Namespace: %s, not found') % self.kwargs['namespace_name'] @@ -49,6 +38,17 @@ class NamespaceDetailView(SingleObjectListView): return self.get_namespace().settings +class NamespaceListView(SingleObjectListView): + extra_context = { + 'hide_link': True, + 'title': _('Setting namespaces'), + } + view_permission = permission_settings_view + + def get_object_list(self): + return Namespace.get_all() + + class SettingEditView(FormView): form_class = SettingForm view_permission = permission_settings_edit diff --git a/mayan/apps/sources/apps.py b/mayan/apps/sources/apps.py index 676b6b7a74..78a7241dd6 100644 --- a/mayan/apps/sources/apps.py +++ b/mayan/apps/sources/apps.py @@ -19,8 +19,8 @@ from mayan.celery import app from .classes import StagingFile from .handlers import ( - copy_transformations_to_version, create_default_document_source, - initialize_periodic_tasks + handler_copy_transformations_to_version, handler_create_default_document_source, + handler_initialize_periodic_tasks ) from .links import ( link_document_create_multiple, link_setup_sources, @@ -46,14 +46,14 @@ class SourcesApp(MayanAppConfig): def ready(self): super(SourcesApp, self).ready() - POP3Email = self.get_model('POP3Email') - IMAPEmail = self.get_model('IMAPEmail') - Source = self.get_model('Source') - SourceLog = self.get_model('SourceLog') - SaneScanner = self.get_model('SaneScanner') - StagingFolderSource = self.get_model('StagingFolderSource') - WatchFolderSource = self.get_model('WatchFolderSource') - WebFormSource = self.get_model('WebFormSource') + POP3Email = self.get_model(model_name='POP3Email') + IMAPEmail = self.get_model(model_name='IMAPEmail') + Source = self.get_model(model_name='Source') + SourceLog = self.get_model(model_name='SourceLog') + SaneScanner = self.get_model(model_name='SaneScanner') + StagingFolderSource = self.get_model(model_name='StagingFolderSource') + WatchFolderSource = self.get_model(model_name='WatchFolderSource') + WebFormSource = self.get_model(model_name='WebFormSource') MissingItem( label=_('Create a document source'), @@ -186,14 +186,14 @@ class SourcesApp(MayanAppConfig): ) post_upgrade.connect( - initialize_periodic_tasks, - dispatch_uid='initialize_periodic_tasks' + receiver=handler_initialize_periodic_tasks, + dispatch_uid='sources_handler_initialize_periodic_tasks' ) post_initial_setup.connect( - create_default_document_source, - dispatch_uid='create_default_document_source' + receiver=handler_create_default_document_source, + dispatch_uid='sources_handler_create_default_document_source' ) post_version_upload.connect( - copy_transformations_to_version, - dispatch_uid='copy_transformations_to_version' + receiver=handler_copy_transformations_to_version, + dispatch_uid='sources_handler_copy_transformations_to_version' ) diff --git a/mayan/apps/sources/handlers.py b/mayan/apps/sources/handlers.py index 59f09f0ca5..522031e405 100644 --- a/mayan/apps/sources/handlers.py +++ b/mayan/apps/sources/handlers.py @@ -6,18 +6,7 @@ from django.utils.translation import ugettext_lazy as _ from .literals import SOURCE_UNCOMPRESS_CHOICE_ASK -def create_default_document_source(sender, **kwargs): - WebFormSource = apps.get_model( - app_label='sources', model_name='WebFormSource' - ) - - if not WebFormSource.objects.count(): - WebFormSource.objects.create( - label=_('Default'), uncompress=SOURCE_UNCOMPRESS_CHOICE_ASK - ) - - -def copy_transformations_to_version(sender, **kwargs): +def handler_copy_transformations_to_version(sender, **kwargs): Transformation = apps.get_model( app_label='converter', model_name='Transformation' ) @@ -31,7 +20,18 @@ def copy_transformations_to_version(sender, **kwargs): ) -def initialize_periodic_tasks(sender, **kwargs): +def handler_create_default_document_source(sender, **kwargs): + WebFormSource = apps.get_model( + app_label='sources', model_name='WebFormSource' + ) + + if not WebFormSource.objects.count(): + WebFormSource.objects.create( + label=_('Default'), uncompress=SOURCE_UNCOMPRESS_CHOICE_ASK + ) + + +def handler_initialize_periodic_tasks(sender, **kwargs): POP3Email = apps.get_model(app_label='sources', model_name='POP3Email') IMAPEmail = apps.get_model(app_label='sources', model_name='IMAPEmail') WatchFolderSource = apps.get_model( diff --git a/mayan/apps/sources/links.py b/mayan/apps/sources/links.py index ee4ae783b4..54005bc39b 100644 --- a/mayan/apps/sources/links.py +++ b/mayan/apps/sources/links.py @@ -27,8 +27,8 @@ def condition_check_document_creation_acls(context): ) queryset = AccessControlList.objects.filter_by_access( - permission=permission_document_create, user=context['user'], - queryset=DocumentType.objects.all() + permission=permission_document_create, + queryset=DocumentType.objects.all(), user=context['user'] ) if queryset: diff --git a/mayan/apps/sources/models/base.py b/mayan/apps/sources/models/base.py index 8ef6bf32a4..aa87a4efae 100644 --- a/mayan/apps/sources/models/base.py +++ b/mayan/apps/sources/models/base.py @@ -52,7 +52,10 @@ class Source(models.Model): def fullname(self): return ' '.join([self.class_fullname(), '"%s"' % self.label]) - def handle_upload(self, file_object, description=None, document_type=None, expand=False, label=None, language=None, user=None): + def handle_upload( + self, file_object, description=None, document_type=None, expand=False, + label=None, language=None, user=None + ): """ Handle an upload request from a file object which may be an individual document or a compressed file containing multiple documents. @@ -80,7 +83,7 @@ class Source(models.Model): ) ) except NoMIMETypeMatch: - logging.debug('Exception: NoMIMETypeMatch') + logging.debug(msg='Exception: NoMIMETypeMatch') documents.append( self.upload_document(file_object=file_object, **kwargs) ) @@ -97,7 +100,10 @@ class Source(models.Model): pass # TODO: Should raise NotImplementedError? - def upload_document(self, file_object, document_type, description=None, label=None, language=None, querystring=None, user=None): + def upload_document( + self, file_object, document_type, description=None, label=None, + language=None, querystring=None, user=None + ): """ Upload an individual document """ @@ -123,7 +129,7 @@ class Source(models.Model): ) if user: - document.add_as_recent_document_for_user(user) + document.add_as_recent_document_for_user(user=user) Transformation.objects.copy( source=self, targets=document_version.pages.all() diff --git a/mayan/apps/sources/models/email_sources.py b/mayan/apps/sources/models/email_sources.py index c0c5758408..7b9f8b67d5 100644 --- a/mayan/apps/sources/models/email_sources.py +++ b/mayan/apps/sources/models/email_sources.py @@ -137,7 +137,8 @@ class EmailBaseModel(IntervalBaseModel): stream=file_object.read(), Loader=SafeLoader ) logger.debug( - 'Got metadata dictionary: %s', metadata_dictionary + 'Got metadata dictionary: %s', + metadata_dictionary ) else: documents = source.handle_upload( @@ -164,8 +165,8 @@ class EmailBaseModel(IntervalBaseModel): with ContentFile(content=force_bytes(message.body), name=label) as file_object: documents = source.handle_upload( document_type=source.document_type, - file_object=file_object, - expand=SOURCE_UNCOMPRESS_CHOICE_N + expand=SOURCE_UNCOMPRESS_CHOICE_N, + file_object=file_object ) if metadata_dictionary: for document in documents: @@ -221,17 +222,17 @@ class IMAPEmail(EmailBaseModel): # http://www.doughellmann.com/PyMOTW/imaplib/ def check_source(self, test=False): - logger.debug('Starting IMAP email fetch') + logger.debug(msg='Starting IMAP email fetch') logger.debug('host: %s', self.host) logger.debug('ssl: %s', self.ssl) if self.ssl: - mailbox = imaplib.IMAP4_SSL(self.host, self.port) + mailbox = imaplib.IMAP4_SSL(host=self.host, port=self.port) else: - mailbox = imaplib.IMAP4(self.host, self.port) + mailbox = imaplib.IMAP4(host=self.host, port=self.port) - mailbox.login(self.username, self.password) - mailbox.select(self.mailbox) + mailbox.login(user=self.username, password=self.password) + mailbox.select(mailbox=self.mailbox) status, data = mailbox.search(None, 'NOT', 'DELETED') if data: @@ -240,12 +241,17 @@ class IMAPEmail(EmailBaseModel): for message_number in messages_info: logger.debug('message_number: %s', message_number) - status, data = mailbox.fetch(message_number, '(RFC822)') + status, data = mailbox.fetch( + message_set=message_number, message_parts='(RFC822)' + ) EmailBaseModel.process_message( source=self, message_text=data[0][1] ) if not test: - mailbox.store(message_number, '+FLAGS', '\\Deleted') + mailbox.store( + message_set=message_number, command='+FLAGS', + flag_list='\\Deleted' + ) mailbox.expunge() mailbox.close() @@ -266,22 +272,24 @@ class POP3Email(EmailBaseModel): verbose_name_plural = _('POP email') def check_source(self, test=False): - logger.debug('Starting POP3 email fetch') + logger.debug(msg='Starting POP3 email fetch') logger.debug('host: %s', self.host) logger.debug('ssl: %s', self.ssl) if self.ssl: - mailbox = poplib.POP3_SSL(self.host, self.port) + mailbox = poplib.POP3_SSL(host=self.host, post=self.port) else: - mailbox = poplib.POP3(self.host, self.port, timeout=self.timeout) + mailbox = poplib.POP3( + host=self.host, post=self.port, timeout=self.timeout + ) mailbox.getwelcome() - mailbox.user(self.username) - mailbox.pass_(self.password) + mailbox.user(username=self.username) + mailbox.pass_(password=self.password) messages_info = mailbox.list() - logger.debug('messages_info:') - logger.debug(messages_info) + logger.debug(msg='messages_info:') + logger.debug(msg=messages_info) logger.debug('messages count: %s', len(messages_info[1])) for message_info in messages_info[1]: @@ -295,6 +303,6 @@ class POP3Email(EmailBaseModel): source=self, message_text=complete_message ) if not test: - mailbox.dele(message_number) + mailbox.dele(which=message_number) mailbox.quit() diff --git a/mayan/apps/sources/models/staging_folder_sources.py b/mayan/apps/sources/models/staging_folder_sources.py index 35d3222bb5..819001af55 100644 --- a/mayan/apps/sources/models/staging_folder_sources.py +++ b/mayan/apps/sources/models/staging_folder_sources.py @@ -75,8 +75,8 @@ class StagingFolderSource(InteractiveSource): upload_file_object.extra_data.delete() except Exception as exception: logger.error( - 'Error deleting staging file: %s; %s', upload_file_object, - exception + 'Error deleting staging file: %s; %s', + upload_file_object, exception ) raise Exception( _('Error deleting staging file; %s') % exception @@ -91,8 +91,8 @@ class StagingFolderSource(InteractiveSource): yield self.get_file(filename=entry) except OSError as exception: logger.error( - 'Unable get list of staging files from source: %s; %s', self, - exception + 'Unable get list of staging files from source: %s; %s', + self, exception ) raise Exception( _('Unable get list of staging files: %s') % exception diff --git a/mayan/apps/sources/models/watch_folder_sources.py b/mayan/apps/sources/models/watch_folder_sources.py index 4addda6075..8f65c20faa 100644 --- a/mayan/apps/sources/models/watch_folder_sources.py +++ b/mayan/apps/sources/models/watch_folder_sources.py @@ -50,9 +50,9 @@ class WatchFolderSource(IntervalBaseModel): path = Path(self.folder_path) if self.include_subdirectories: - iterator = path.rglob('*') + iterator = path.rglob(pattern='*') else: - iterator = path.glob('*') + iterator = path.glob(pattern='*') for entry in iterator: if entry.is_file() or entry.is_symlink(): diff --git a/mayan/apps/sources/permissions.py b/mayan/apps/sources/permissions.py index a6d35ec03d..d7b1cdcc6c 100644 --- a/mayan/apps/sources/permissions.py +++ b/mayan/apps/sources/permissions.py @@ -4,20 +4,20 @@ from django.utils.translation import ugettext_lazy as _ from mayan.apps.permissions import PermissionNamespace -namespace = PermissionNamespace(name='sources_setup', label=_('Sources setup')) +namespace = PermissionNamespace(label=_('Sources setup'), name='sources_setup') permission_sources_setup_create = namespace.add_permission( - name='sources_setup_create', label=_('Create new document sources') + label=_('Create new document sources'), name='sources_setup_create' ) permission_sources_setup_delete = namespace.add_permission( - name='sources_setup_delete', label=_('Delete document sources') + label=_('Delete document sources'), name='sources_setup_delete' ) permission_sources_setup_edit = namespace.add_permission( - name='sources_setup_edit', label=_('Edit document sources') + label=_('Edit document sources'), name='sources_setup_edit' ) permission_sources_setup_view = namespace.add_permission( - name='sources_setup_view', label=_('View existing document sources') + label=_('View existing document sources'), name='sources_setup_view' ) permission_staging_file_delete = namespace.add_permission( - name='sources_staging_file_delete', label=_('Delete staging files') + label=_('Delete staging files'), name='sources_staging_file_delete' ) diff --git a/mayan/apps/sources/queues.py b/mayan/apps/sources/queues.py index eebc52c0e4..8793292a97 100644 --- a/mayan/apps/sources/queues.py +++ b/mayan/apps/sources/queues.py @@ -5,28 +5,28 @@ from django.utils.translation import ugettext_lazy as _ from mayan.apps.task_manager.classes import CeleryQueue queue_sources = CeleryQueue( - name='sources', label=_('Sources') + label=_('Sources'), name='sources' ) queue_sources_periodic = CeleryQueue( - name='sources_periodic', label=_('Sources periodic'), transient=True + label=_('Sources periodic'), name='sources_periodic', transient=True ) queue_sources_fast = CeleryQueue( - name='sources_fast', label=_('Sources fast'), transient=True + label=_('Sources fast'), name='sources_fast', transient=True ) queue_sources_fast.add_task_type( - name='mayan.apps.sources.tasks.task_generate_staging_file_image', - label=_('Generate staging file image') + label=_('Generate staging file image'), + name='mayan.apps.sources.tasks.task_generate_staging_file_image' ) queue_sources_periodic.add_task_type( - name='mayan.apps.sources.tasks.task_check_interval_source', - label=_('Check interval source') + label=_('Check interval source'), + name='mayan.apps.sources.tasks.task_check_interval_source' ) queue_sources.add_task_type( - name='mayan.apps.sources.tasks.task_source_handle_upload', - label=_('Handle upload') + label=_('Handle upload'), + name='mayan.apps.sources.tasks.task_source_handle_upload' ) queue_sources.add_task_type( - name='mayan.apps.sources.tasks.task_upload_document', - label=_('Upload document') + label=_('Upload document'), + name='mayan.apps.sources.tasks.task_upload_document' ) diff --git a/mayan/apps/sources/serializers.py b/mayan/apps/sources/serializers.py index 5da2f6af0a..b01d88df5a 100644 --- a/mayan/apps/sources/serializers.py +++ b/mayan/apps/sources/serializers.py @@ -17,14 +17,14 @@ class StagingFolderFileSerializer(serializers.Serializer): def get_image_url(self, obj): return reverse( - 'stagingfolderfile-image-view', + viewname='stagingfolderfile-image-view', args=(obj.staging_folder.pk, obj.encoded_filename,), request=self.context.get('request') ) def get_url(self, obj): return reverse( - 'stagingfolderfile-detail', + viewname='stagingfolderfile-detail', args=(obj.staging_folder.pk, obj.encoded_filename,), request=self.context.get('request') ) diff --git a/mayan/apps/sources/settings.py b/mayan/apps/sources/settings.py index ff9385be8c..8f0156d427 100644 --- a/mayan/apps/sources/settings.py +++ b/mayan/apps/sources/settings.py @@ -7,7 +7,7 @@ from django.utils.translation import ugettext_lazy as _ from mayan.apps.smart_settings import Namespace -namespace = Namespace(name='sources', label=_('Sources')) +namespace = Namespace(label=_('Sources'), name='sources') setting_scanimage_path = namespace.add_setting( global_name='SOURCES_SCANIMAGE_PATH', default='/usr/bin/scanimage', diff --git a/mayan/apps/sources/tests/test_views.py b/mayan/apps/sources/tests/test_views.py index c9f141fe5c..d2b7f00c7e 100644 --- a/mayan/apps/sources/tests/test_views.py +++ b/mayan/apps/sources/tests/test_views.py @@ -203,23 +203,27 @@ class NewDocumentVersionViewTestCase(GenericDocumentViewTestCase): NewVersionBlock.objects.block(self.test_document) response = self.post( - viewname='sources:upload_version', args=(self.document.pk,), - follow=True + viewname='sources:upload_version', kwargs={ + 'document_pk': self.document.pk + }, follow=True ) self.assertContains( - response, text='blocked from uploading', + response=response, text='blocked from uploading', status_code=200 ) response = self.get( - 'documents:document_version_list', args=(self.document.pk,), - follow=True + viewname='documents:document_version_list', kwargs={ + 'pk': self.document.pk + }, follow=True ) # Needed by the url view resolver response.context.current_app = None - resolved_link = link_document_version_upload.resolve(context=response.context) + resolved_link = link_document_version_upload.resolve( + context=response.context + ) self.assertEqual(resolved_link, None) @@ -228,7 +232,7 @@ class StagingFolderViewTestCase(GenericViewTestCase): def setUp(self): super(StagingFolderViewTestCase, self).setUp() self.temporary_directory = mkdtemp() - shutil.copy(TEST_SMALL_DOCUMENT_PATH, self.temporary_directory) + shutil.copy(src=TEST_SMALL_DOCUMENT_PATH, dst=self.temporary_directory) self.filename = os.path.basename(TEST_SMALL_DOCUMENT_PATH) @@ -238,9 +242,10 @@ class StagingFolderViewTestCase(GenericViewTestCase): def _request_staging_file_delete_view(self, staging_folder, staging_file): return self.post( - viewname='sources:staging_file_delete', args=( - staging_folder.pk, staging_file.encoded_filename - ) + viewname='sources:staging_file_delete', kwargs={ + 'pk': staging_folder.pk, + 'encoded_filename': staging_file.encoded_filename + } ) def test_staging_folder_delete_no_permission(self): @@ -259,6 +264,7 @@ class StagingFolderViewTestCase(GenericViewTestCase): staging_folder=staging_folder, staging_file=staging_file ) self.assertEqual(response.status_code, 403) + self.assertEqual(len(list(staging_folder.get_files())), 1) def test_staging_folder_delete_with_permission(self): @@ -279,6 +285,7 @@ class StagingFolderViewTestCase(GenericViewTestCase): staging_folder=staging_folder, staging_file=staging_file ) self.assertEqual(response.status_code, 302) + self.assertEqual(len(list(staging_folder.get_files())), 0) diff --git a/mayan/apps/sources/views.py b/mayan/apps/sources/views.py index c27a8fb02b..66b71811da 100644 --- a/mayan/apps/sources/views.py +++ b/mayan/apps/sources/views.py @@ -126,7 +126,7 @@ class UploadBaseView(MultiFormView): ), request=request ) return HttpResponseRedirect( - reverse(viewname='sources:setup_source_list') + redirect_to=reverse(viewname='sources:setup_source_list') ) return super(UploadBaseView, self).dispatch(request, *args, **kwargs) @@ -184,9 +184,11 @@ class UploadBaseView(MultiFormView): menu_facet.bound_links['sources:upload_interactive'] = self.tab_links menu_facet.bound_links['sources:upload_version'] = self.tab_links - context.update({ - 'subtemplates_list': subtemplates_list, - }) + context.update( + { + 'subtemplates_list': subtemplates_list, + } + ) return context @@ -203,8 +205,8 @@ class UploadInteractiveView(UploadBaseView): ) AccessControlList.objects.check_access( - permissions=permission_document_create, user=request.user, - obj=self.document_type + obj=self.document_type, permissions=permission_document_create, + user=request.user ) self.tab_links = UploadBaseView.get_active_tab_links() @@ -282,9 +284,7 @@ class UploadInteractiveView(UploadBaseView): 'exception': exception, 'exception_class': type(exception), } - logger.critical( - message, exc_info=True - ) + logger.critical(msg=message, exc_info=True) raise type(exception)(message) else: messages.success( @@ -295,7 +295,7 @@ class UploadInteractiveView(UploadBaseView): ) return HttpResponseRedirect( - '{}?{}'.format( + redirect_to='{}?{}'.format( reverse( viewname=self.request.resolver_match.view_name, kwargs=self.request.resolver_match.kwargs @@ -378,7 +378,7 @@ class UploadInteractiveVersionView(UploadBaseView): ) % self.document, request=self.request ) return HttpResponseRedirect( - reverse( + redirect_to=reverse( viewname='documents:document_version_list', kwargs={ 'pk': self.document.pk } @@ -386,8 +386,8 @@ class UploadInteractiveVersionView(UploadBaseView): ) AccessControlList.objects.check_access( - permissions=permission_document_new_version, - user=self.request.user, obj=self.document + obj=self.document, permissions=permission_document_new_version, + user=self.request.user ) self.tab_links = UploadBaseView.get_active_tab_links(self.document) @@ -433,7 +433,7 @@ class UploadInteractiveVersionView(UploadBaseView): ) return HttpResponseRedirect( - reverse( + redirect_to=reverse( viewname='documents:document_version_list', kwargs={ 'pk': self.document.pk } diff --git a/mayan/apps/sources/wizards.py b/mayan/apps/sources/wizards.py index 8b8f7549b8..df6093279c 100644 --- a/mayan/apps/sources/wizards.py +++ b/mayan/apps/sources/wizards.py @@ -18,8 +18,8 @@ from .icons import icon_wizard_submit class WizardStep(object): - _registry = {} _deregistry = {} + _registry = {} @classmethod def deregister(cls, step): @@ -104,7 +104,7 @@ class WizardStepDocumentType(WizardStep): @classmethod def done(cls, wizard): - cleaned_data = wizard.get_cleaned_data_for_step(cls.name) + cleaned_data = wizard.get_cleaned_data_for_step(step=cls.name) if cleaned_data: return { 'document_type_id': cleaned_data['document_type'].pk @@ -127,7 +127,9 @@ class DocumentCreateWizard(SessionWizardView): @classonlymethod def as_view(cls, *args, **kwargs): cls.form_list = WizardStep.get_choices(attribute_name='form_class') - cls.condition_dict = dict(WizardStep.get_choices(attribute_name='condition')) + cls.condition_dict = dict( + WizardStep.get_choices(attribute_name='condition') + ) return super(DocumentCreateWizard, cls).as_view(*args, **kwargs) def dispatch(self, request, *args, **kwargs): @@ -136,21 +138,27 @@ class DocumentCreateWizard(SessionWizardView): ) form_list = WizardStep.get_choices(attribute_name='form_class') - condition_dict = dict(WizardStep.get_choices(attribute_name='condition')) + condition_dict = dict( + WizardStep.get_choices(attribute_name='condition') + ) - result = self.__class__.get_initkwargs(form_list=form_list, condition_dict=condition_dict) + result = self.__class__.get_initkwargs( + condition_dict=condition_dict, form_list=form_list + ) self.form_list = result['form_list'] self.condition_dict = result['condition_dict'] if not InteractiveSource.objects.filter(enabled=True).exists(): messages.error( - request, - _( + message=_( 'No interactive document sources have been defined or ' 'none have been enabled, create one before proceeding.' - ) + ), + request=request + ) + return HttpResponseRedirect( + redirect_to=reverse(viewname='sources:setup_source_list') ) - return HttpResponseRedirect(reverse('sources:setup_source_list')) return super( DocumentCreateWizard, self @@ -163,20 +171,22 @@ class DocumentCreateWizard(SessionWizardView): wizard_step = WizardStep.get(name=self.steps.current) - context.update({ - 'form_css_classes': 'form-hotkey-double-click', - 'step_title': _( - 'Step %(step)d of %(total_steps)d: %(step_label)s' - ) % { - 'step': self.steps.step1, 'total_steps': len(self.form_list), - 'step_label': wizard_step.label, - }, - 'submit_label': _('Next step'), - 'submit_icon_class': icon_wizard_submit, - 'title': _('Document upload wizard'), - 'wizard_step': wizard_step, - 'wizard_steps': WizardStep.get_all(), - }) + context.update( + { + 'form_css_classes': 'form-hotkey-double-click', + 'step_title': _( + 'Step %(step)d of %(total_steps)d: %(step_label)s' + ) % { + 'step': self.steps.step1, 'total_steps': len(self.form_list), + 'step_label': wizard_step.label, + }, + 'submit_label': _('Next step'), + 'submit_icon_class': icon_wizard_submit, + 'title': _('Document upload wizard'), + 'wizard_step': wizard_step, + 'wizard_steps': WizardStep.get_all(), + } + ) return context def get_form_initial(self, step): @@ -196,4 +206,4 @@ class DocumentCreateWizard(SessionWizardView): # urlencode(doseq=True) url.args = query_dict - return HttpResponseRedirect(url) + return HttpResponseRedirect(redirect_to=url) diff --git a/mayan/apps/tags/apps.py b/mayan/apps/tags/apps.py index 14e18ace68..49fa63b9c0 100644 --- a/mayan/apps/tags/apps.py +++ b/mayan/apps/tags/apps.py @@ -64,8 +64,8 @@ class TagsApp(MayanAppConfig): app_label='documents', model_name='DocumentPageResult' ) - DocumentTag = self.get_model('DocumentTag') - Tag = self.get_model('Tag') + DocumentTag = self.get_model(model_name='DocumentTag') + Tag = self.get_model(model_name='Tag') Document.add_to_class( name='attached_tags', value=method_document_get_tags @@ -78,12 +78,8 @@ class TagsApp(MayanAppConfig): ) ) - ModelField( - Document, name='tags__label' - ) - ModelField( - Document, name='tags__color' - ) + ModelField(model=Document, name='tags__label') + ModelField(model=Document, name='tags__color') ModelPermission.register( model=Document, permissions=( @@ -106,7 +102,7 @@ class TagsApp(MayanAppConfig): source=DocumentTag ) SourceColumn( - source=DocumentTag, attribute='get_preview_widget' + attribute='get_preview_widget', source=DocumentTag ) SourceColumn( @@ -129,7 +125,7 @@ class TagsApp(MayanAppConfig): source=Tag ) SourceColumn( - source=Tag, attribute='get_preview_widget' + attribute='get_preview_widget', source=Tag ) SourceColumn( source=Tag, label=_('Documents'), @@ -191,13 +187,13 @@ class TagsApp(MayanAppConfig): # Index update m2m_changed.connect( - handler_index_document, dispatch_uid='tags_handler_index_document', + receiver=handler_index_document, sender=Tag.documents.through ) pre_delete.connect( - handler_tag_pre_delete, dispatch_uid='tags_handler_tag_pre_delete', + receiver=handler_tag_pre_delete, sender=Tag ) diff --git a/mayan/apps/tags/events.py b/mayan/apps/tags/events.py index 44f5793802..8f753bbbe9 100644 --- a/mayan/apps/tags/events.py +++ b/mayan/apps/tags/events.py @@ -4,7 +4,7 @@ from django.utils.translation import ugettext_lazy as _ from mayan.apps.events import EventTypeNamespace -namespace = EventTypeNamespace(name='tags', label=_('Tags')) +namespace = EventTypeNamespace(label=_('Tags'), name='tags') event_tag_attach = namespace.add_event_type( label=_('Tag attached to document'), name='attach' diff --git a/mayan/apps/tags/permissions.py b/mayan/apps/tags/permissions.py index aa4b895def..2d3476edcb 100644 --- a/mayan/apps/tags/permissions.py +++ b/mayan/apps/tags/permissions.py @@ -4,23 +4,23 @@ from django.utils.translation import ugettext_lazy as _ from mayan.apps.permissions import PermissionNamespace -namespace = PermissionNamespace(name='tags', label=_('Tags')) +namespace = PermissionNamespace(label=_('Tags'), name='tags') permission_tag_create = namespace.add_permission( - name='tag_create', label=_('Create new tags') + label=_('Create new tags'), name='tag_create' ) permission_tag_delete = namespace.add_permission( - name='tag_delete', label=_('Delete tags') + label=_('Delete tags'), name='tag_delete' ) permission_tag_view = namespace.add_permission( - name='tag_view', label=_('View tags') + label=_('View tags'), name='tag_view' ) permission_tag_edit = namespace.add_permission( - name='tag_edit', label=_('Edit tags') + label=_('Edit tags'), name='tag_edit' ) permission_tag_attach = namespace.add_permission( - name='tag_attach', label=_('Attach tags to documents') + label=_('Attach tags to documents'), name='tag_attach' ) permission_tag_remove = namespace.add_permission( - name='tag_remove', label=_('Remove tags from documents') + label=_('Remove tags from documents'), name='tag_remove' ) diff --git a/mayan/apps/tags/search.py b/mayan/apps/tags/search.py index f16b8e75c1..d728dd4520 100644 --- a/mayan/apps/tags/search.py +++ b/mayan/apps/tags/search.py @@ -9,7 +9,7 @@ from .permissions import permission_tag_view tag_search = SearchModel( app_label='tags', model_name='Tag', permission=permission_tag_view, - serializer_string='mayan.apps.tags.serializers.TagSerializer' + serializer_path='mayan.apps.tags.serializers.TagSerializer' ) tag_search.add_model_field( diff --git a/mayan/apps/tags/serializers.py b/mayan/apps/tags/serializers.py index 64c3c01ded..ddaac4d0e1 100644 --- a/mayan/apps/tags/serializers.py +++ b/mayan/apps/tags/serializers.py @@ -95,7 +95,7 @@ class DocumentTagSerializer(TagSerializer): def get_document_tag_url(self, instance): return reverse( - 'rest_api:document-tag-detail', args=( + viewname='rest_api:document-tag-detail', args=( self.context['document'].pk, instance.pk ), request=self.context['request'], format=self.context['format'] ) @@ -112,8 +112,8 @@ class NewDocumentTagSerializer(serializers.Serializer): try: AccessControlList.objects.check_access( - permissions=permission_tag_attach, - user=self.context['request'].user, obj=tag + obj=tag, permissions=permission_tag_attach, + user=self.context['request'].user ) except PermissionDenied: pass diff --git a/mayan/apps/tags/tests/test_api.py b/mayan/apps/tags/tests/test_api.py index f0602adc81..cb7a1ca4dd 100644 --- a/mayan/apps/tags/tests/test_api.py +++ b/mayan/apps/tags/tests/test_api.py @@ -166,7 +166,6 @@ class TagDocumentAPIViewTestCase(DocumentTestMixin, TagAPIViewTestMixin, TagTest force_text(self.test_document.uuid) ) - ### def test_document_attach_tag_view_no_access(self): self._create_test_tag() self.upload_document() diff --git a/mayan/apps/tags/views.py b/mayan/apps/tags/views.py index b1d80f05c0..47b40c043f 100644 --- a/mayan/apps/tags/views.py +++ b/mayan/apps/tags/views.py @@ -76,7 +76,9 @@ class TagAttachActionView(MultipleObjectFormActionView): if queryset.count() == 1: result.update( { - 'queryset': Tag.objects.exclude(pk__in=queryset.first().tags.all()) + 'queryset': Tag.objects.exclude( + pk__in=queryset.first().tags.all() + ) } ) @@ -249,8 +251,8 @@ class DocumentTagListView(TagListView): 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(DocumentTagListView, self).dispatch( diff --git a/mayan/apps/tags/wizard_steps.py b/mayan/apps/tags/wizard_steps.py index 9961b5b1a0..8026a2a60b 100644 --- a/mayan/apps/tags/wizard_steps.py +++ b/mayan/apps/tags/wizard_steps.py @@ -58,4 +58,4 @@ class WizardStepTags(WizardStep): tag.documents.add(document) -WizardStep.register(WizardStepTags) +WizardStep.register(step=WizardStepTags) diff --git a/mayan/apps/task_manager/permissions.py b/mayan/apps/task_manager/permissions.py index bb6d7bcf6d..64c4ac745d 100644 --- a/mayan/apps/task_manager/permissions.py +++ b/mayan/apps/task_manager/permissions.py @@ -4,8 +4,8 @@ from django.utils.translation import ugettext_lazy as _ from mayan.apps.permissions import PermissionNamespace -namespace = PermissionNamespace(name='task_manager', label=_('Task manager')) +namespace = PermissionNamespace(label=_('Task manager'), name='task_manager') permission_task_view = namespace.add_permission( - name='task_view', label=_('View tasks') + label=_('View tasks'), name='task_view' ) diff --git a/mayan/apps/task_manager/tests/test_views.py b/mayan/apps/task_manager/tests/test_views.py index 6d2f35458b..f3506f969a 100644 --- a/mayan/apps/task_manager/tests/test_views.py +++ b/mayan/apps/task_manager/tests/test_views.py @@ -14,7 +14,6 @@ class TaskManagerViewTestCase(GenericViewTestCase): self.test_queue = CeleryQueue( label=TEST_QUEUE_LABEL, name=TEST_QUEUE_NAME ) - self.login_user() def _request_active_task_list(self): return self.get( @@ -48,43 +47,36 @@ class TaskManagerViewTestCase(GenericViewTestCase): self.grant_permission(permission=permission_task_view) response = self._request_queue_list() - self.assertContains( response, text=self.test_queue.name, status_code=200 ) def test_active_task_list_view_no_permissions(self): response = self._request_active_task_list() - self.assertEqual(response.status_code, 403) def test_active_task_list_view_with_permissions(self): self.grant_permission(permission=permission_task_view) response = self._request_active_task_list() - self.assertEqual(response.status_code, 200) def test_reserved_task_list_view_no_permissions(self): response = self._request_reserved_task_list() - self.assertEqual(response.status_code, 403) def test_reserved_task_list_view_with_permissions(self): self.grant_permission(permission=permission_task_view) response = self._request_reserved_task_list() - self.assertEqual(response.status_code, 200) def test_scheduled_task_list_view_no_permissions(self): response = self._request_scheduled_task_list() - self.assertEqual(response.status_code, 403) def test_scheduled_task_list_view_with_permissions(self): self.grant_permission(permission=permission_task_view) response = self._request_scheduled_task_list() - self.assertEqual(response.status_code, 200) diff --git a/mayan/apps/user_management/permissions.py b/mayan/apps/user_management/permissions.py index a6be8ae190..08328a0d24 100644 --- a/mayan/apps/user_management/permissions.py +++ b/mayan/apps/user_management/permissions.py @@ -5,30 +5,30 @@ from django.utils.translation import ugettext_lazy as _ from mayan.apps.permissions import PermissionNamespace namespace = PermissionNamespace( - name='user_management', label=_('User management') + label=_('User management'), name='user_management' ) permission_group_create = namespace.add_permission( - name='group_create', label=_('Create new groups') + label=_('Create new groups'), name='group_create' ) permission_group_delete = namespace.add_permission( - name='group_delete', label=_('Delete existing groups') + label=_('Delete existing groups'), name='group_delete' ) permission_group_edit = namespace.add_permission( - name='group_edit', label=_('Edit existing groups') + label=_('Edit existing groups'), name='group_edit' ) permission_group_view = namespace.add_permission( - name='group_view', label=_('View existing groups') + label=_('View existing groups'), name='group_view' ) permission_user_create = namespace.add_permission( - name='user_create', label=_('Create new users') + label=_('Create new users'), name='user_create' ) permission_user_delete = namespace.add_permission( - name='user_delete', label=_('Delete existing users') + label=_('Delete existing users'), name='user_delete' ) permission_user_edit = namespace.add_permission( - name='user_edit', label=_('Edit existing users') + label=_('Edit existing users'), name='user_edit' ) permission_user_view = namespace.add_permission( - name='user_view', label=_('View existing users') + label=_('View existing users'), name='user_view' ) diff --git a/mayan/apps/user_management/search.py b/mayan/apps/user_management/search.py index 54e7a26dc2..6ebf50546b 100644 --- a/mayan/apps/user_management/search.py +++ b/mayan/apps/user_management/search.py @@ -12,7 +12,7 @@ user_app, user_model = settings.AUTH_USER_MODEL.split('.') user_search = SearchModel( app_label=user_app, model_name=user_model, permission=permission_user_view, - serializer_string='mayan.apps.user_management.serializers.UserSerializer' + serializer_path='mayan.apps.user_management.serializers.UserSerializer' ) user_search.add_model_field( @@ -34,7 +34,7 @@ user_search.add_model_field( group_search = SearchModel( app_label='auth', model_name='Group', permission=permission_group_view, - serializer_string='user_management.serializers.GroupSerializer' + serializer_path='user_management.serializers.GroupSerializer' ) group_search.add_model_field( diff --git a/mayan/apps/user_management/serializers.py b/mayan/apps/user_management/serializers.py index 559b2c6969..1f5b5e4411 100644 --- a/mayan/apps/user_management/serializers.py +++ b/mayan/apps/user_management/serializers.py @@ -44,8 +44,8 @@ class UserGroupListSerializer(serializers.Serializer): for group in Group.objects.filter(pk__in=pk_list): try: AccessControlList.objects.check_access( - permissions=(permission_group_view,), - user=self.context['request'].user, obj=group + obj=group, permissions=(permission_group_view,), + user=self.context['request'].user ) except PermissionDenied: pass diff --git a/mayan/apps/user_management/views.py b/mayan/apps/user_management/views.py index 843205d5e9..1af125bfea 100644 --- a/mayan/apps/user_management/views.py +++ b/mayan/apps/user_management/views.py @@ -35,15 +35,15 @@ class CurrentUserDetailsView(SingleObjectDetailView): 'date_joined', 'groups' ) - def get_object(self): - return self.request.user - def get_extra_context(self, **kwargs): return { 'object': None, 'title': _('Current user details'), } + def get_object(self): + return self.request.user + class CurrentUserEditView(SingleObjectEditView): extra_context = {'object': None, 'title': _('Edit current user details')} @@ -69,6 +69,20 @@ class GroupCreateView(SingleObjectCreateView): return {'_user': self.request.user} +class GroupDeleteView(SingleObjectDeleteView): + model = Group + object_permission = permission_group_delete + post_action_redirect = reverse_lazy( + viewname='user_management:group_list' + ) + + def get_extra_context(self): + return { + 'object': self.get_object(), + 'title': _('Delete the group: %s?') % self.get_object(), + } + + class GroupEditView(SingleObjectEditView): fields = ('name',) model = Group @@ -111,20 +125,6 @@ class GroupListView(SingleObjectListView): } -class GroupDeleteView(SingleObjectDeleteView): - model = Group - object_permission = permission_group_delete - post_action_redirect = reverse_lazy( - viewname='user_management:group_list' - ) - - def get_extra_context(self): - return { - 'object': self.get_object(), - 'title': _('Delete the group: %s?') % self.get_object(), - } - - class GroupUsersView(AddRemoveView): action_add_method = 'users_add' action_remove_method = 'users_remove'