From 92e615ce4ce5733a267ad2bfba4591d9e4d08173 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Wed, 2 Jan 2019 14:19:32 -0400 Subject: [PATCH] Add keyword arguments to checkouts app Add keyword arguments to calls and view parameters. Add missing icons. Signed-off-by: Roberto Rosario --- mayan/apps/checkouts/dashboard_widgets.py | 12 +++-- mayan/apps/checkouts/events.py | 14 ++--- mayan/apps/checkouts/handlers.py | 2 +- mayan/apps/checkouts/icons.py | 8 +++ mayan/apps/checkouts/links.py | 12 +++-- mayan/apps/checkouts/managers.py | 10 ++-- mayan/apps/checkouts/models.py | 4 +- mayan/apps/checkouts/permissions.py | 8 +-- mayan/apps/checkouts/queues.py | 6 +-- mayan/apps/checkouts/serializers.py | 2 +- mayan/apps/checkouts/tests/test_api.py | 30 +++++++---- mayan/apps/checkouts/tests/test_views.py | 20 ++++--- mayan/apps/checkouts/urls.py | 26 ++++++---- mayan/apps/checkouts/views.py | 63 ++++++++++++++--------- 14 files changed, 134 insertions(+), 83 deletions(-) diff --git a/mayan/apps/checkouts/dashboard_widgets.py b/mayan/apps/checkouts/dashboard_widgets.py index 53bcd6eb08..27a85d752d 100644 --- a/mayan/apps/checkouts/dashboard_widgets.py +++ b/mayan/apps/checkouts/dashboard_widgets.py @@ -14,7 +14,7 @@ from .permissions import permission_document_checkout_detail_view class DashboardWidgetTotalCheckouts(DashboardWidgetNumeric): icon_class = icon_dashboard_checkouts label = _('Checkedout documents') - link = reverse_lazy('checkouts:checkout_list') + link = reverse_lazy(viewname='checkouts:checkout_list') def render(self, request): AccessControlList = apps.get_model( @@ -25,12 +25,14 @@ class DashboardWidgetTotalCheckouts(DashboardWidgetNumeric): ) queryset = AccessControlList.objects.filter_by_access( permission=permission_document_checkout_detail_view, + queryset=DocumentCheckout.objects.checked_out_documents(), user=request.user, - queryset=DocumentCheckout.objects.checked_out_documents() ) queryset = AccessControlList.objects.filter_by_access( - permission=permission_document_view, user=request.user, - queryset=queryset + permission=permission_document_view, queryset=queryset, + user=request.user ) self.count = queryset.count() - return super(DashboardWidgetTotalCheckouts, self).render(request) + return super(DashboardWidgetTotalCheckouts, self).render( + request=request + ) 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 b3f6b9d712..ca8a1e95e2 100644 --- a/mayan/apps/checkouts/handlers.py +++ b/mayan/apps/checkouts/handlers.py @@ -13,6 +13,6 @@ def handler_check_new_version_creation(sender, instance, **kwargs): app_label='checkouts', model_name='NewVersionBlock' ) - if NewVersionBlock.objects.is_blocked(instance.document) and not instance.pk: + if NewVersionBlock.objects.is_blocked(document=instance.document) and not instance.pk: # Block only new versions (no pk), not existing version being updated. raise NewDocumentVersionNotAllowed diff --git a/mayan/apps/checkouts/icons.py b/mayan/apps/checkouts/icons.py index 8fedf84d7e..a0553346f8 100644 --- a/mayan/apps/checkouts/icons.py +++ b/mayan/apps/checkouts/icons.py @@ -2,6 +2,14 @@ from __future__ import absolute_import, unicode_literals from mayan.apps.appearance.classes import Icon +icon_checkin_document = Icon( + driver_name='fontawesome-dual', primary_symbol='shopping-cart', + secondary_symbol='minus' +) +icon_checkout_document = Icon( + driver_name='fontawesome-dual', primary_symbol='shopping-cart', + secondary_symbol='plus' +) icon_checkout_info = Icon(driver_name='fontawesome', symbol='shopping-cart') icon_dashboard_checkouts = Icon( driver_name='fontawesome', symbol='shopping-cart' diff --git a/mayan/apps/checkouts/links.py b/mayan/apps/checkouts/links.py index 61bfc99f1d..1ed63fc666 100644 --- a/mayan/apps/checkouts/links.py +++ b/mayan/apps/checkouts/links.py @@ -4,7 +4,9 @@ from django.utils.translation import ugettext_lazy as _ from mayan.apps.navigation import Link -from .icons import icon_checkout_info +from .icons import ( + icon_checkin_document, icon_checkout_document, icon_checkout_info +) from .permissions import ( permission_document_checkin, permission_document_checkin_override, permission_document_checkout @@ -33,11 +35,13 @@ link_checkout_list = Link( ) link_checkout_document = Link( args='object.pk', condition=is_not_checked_out, - permissions=(permission_document_checkout,), - text=_('Check out document'), view='checkouts:checkout_document', + icon_class=icon_checkout_document, + permissions=(permission_document_checkout,), text=_('Check out document'), + view='checkouts:checkout_document', ) link_checkin_document = Link( - args='object.pk', condition=is_checked_out, permissions=( + args='object.pk', condition=is_checked_out, + icon_class=icon_checkin_document, permissions=( permission_document_checkin, permission_document_checkin_override ), text=_('Check in document'), view='checkouts:checkin_document', diff --git a/mayan/apps/checkouts/managers.py b/mayan/apps/checkouts/managers.py index db858fff5d..6fd071e959 100644 --- a/mayan/apps/checkouts/managers.py +++ b/mayan/apps/checkouts/managers.py @@ -21,7 +21,7 @@ logger = logging.getLogger(__name__) class DocumentCheckoutManager(models.Manager): def are_document_new_versions_allowed(self, document, user=None): try: - checkout_info = self.document_checkout_info(document) + checkout_info = self.document_checkout_info(document=document) except DocumentNotCheckedOut: return True else: @@ -34,7 +34,7 @@ class DocumentCheckoutManager(models.Manager): raise DocumentNotCheckedOut else: if user: - if self.get_document_checkout_info(document).user != user: + if self.get_document_checkout_info(document=document).user != user: event_document_forceful_check_in.commit( actor=user, target=document ) @@ -51,8 +51,8 @@ class DocumentCheckoutManager(models.Manager): def checkout_document(self, document, expiration_datetime, user, block_new_version=True): return self.create( - document=document, expiration_datetime=expiration_datetime, - user=user, block_new_version=block_new_version + block_new_version=block_new_version, document=document, + expiration_datetime=expiration_datetime, user=user ) def checked_out_documents(self): @@ -80,7 +80,7 @@ class DocumentCheckoutManager(models.Manager): raise DocumentNotCheckedOut def get_document_checkout_state(self, document): - if self.is_document_checked_out(document): + if self.is_document_checked_out(document=document): return STATE_CHECKED_OUT else: return STATE_CHECKED_IN diff --git a/mayan/apps/checkouts/models.py b/mayan/apps/checkouts/models.py index aa43338d01..fa9e621855 100644 --- a/mayan/apps/checkouts/models.py +++ b/mayan/apps/checkouts/models.py @@ -73,7 +73,9 @@ class DocumentCheckout(models.Model): 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 6122f54e9c..882993d6d0 100644 --- a/mayan/apps/checkouts/permissions.py +++ b/mayan/apps/checkouts/permissions.py @@ -7,14 +7,14 @@ from mayan.apps.permissions import PermissionNamespace namespace = PermissionNamespace(label=_('Document checkout'), name='checkouts') permission_document_checkin = namespace.add_permission( - name='checkin_document', label=_('Check in documents') + label=_('Check in documents'), name='checkin_document' ) permission_document_checkin_override = namespace.add_permission( - name='checkin_document_override', label=_('Forcefully check in documents') + label=_('Forcefully check in documents'), name='checkin_document_override' ) permission_document_checkout = namespace.add_permission( - name='checkout_document', label=_('Check out documents') + label=_('Check out documents'), name='checkout_document' ) permission_document_checkout_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 4a5c1c4478..5e51e1f582 100644 --- a/mayan/apps/checkouts/serializers.py +++ b/mayan/apps/checkouts/serializers.py @@ -43,7 +43,7 @@ class NewDocumentCheckoutSerializer(serializers.ModelSerializer): AccessControlList.objects.check_access( permissions=permission_document_checkout, - user=self.context['request'].user, obj=document + obj=document, user=self.context['request'].user ) validated_data['document'] = document diff --git a/mayan/apps/checkouts/tests/test_api.py b/mayan/apps/checkouts/tests/test_api.py index b4b8ace27e..df0fabbcc2 100644 --- a/mayan/apps/checkouts/tests/test_api.py +++ b/mayan/apps/checkouts/tests/test_api.py @@ -25,7 +25,7 @@ class CheckoutsAPITestCase(DocumentTestMixin, BaseAPITestCase): def _request_checkedout_document_view(self): return self.get( viewname='rest_api:checkedout-document-view', - args=(self.checkout.pk,) + kwargs={'document_pk': self.checkout.pk} ) def _checkout_document(self): @@ -44,7 +44,8 @@ class CheckoutsAPITestCase(DocumentTestMixin, BaseAPITestCase): def test_checkedout_document_view_with_checkout_access(self): self._checkout_document() self.grant_access( - permission=permission_document_checkout_detail_view, obj=self.document + obj=self.document, + permission=permission_document_checkout_detail_view ) response = self._request_checkedout_document_view() self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) @@ -52,7 +53,7 @@ class CheckoutsAPITestCase(DocumentTestMixin, BaseAPITestCase): def test_checkedout_document_view_with_document_access(self): self._checkout_document() self.grant_access( - permission=permission_document_view, obj=self.document + obj=self.document, permission=permission_document_view ) response = self._request_checkedout_document_view() self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) @@ -60,14 +61,17 @@ class CheckoutsAPITestCase(DocumentTestMixin, BaseAPITestCase): def test_checkedout_document_view_with_access(self): self._checkout_document() self.grant_access( - permission=permission_document_view, obj=self.document + obj=self.document, permission=permission_document_view ) self.grant_access( - permission=permission_document_checkout_detail_view, obj=self.document + obj=self.document, + permission=permission_document_checkout_detail_view ) response = self._request_checkedout_document_view() self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data['document']['uuid'], force_text(self.document.uuid)) + self.assertEqual( + response.data['document']['uuid'], force_text(self.document.uuid) + ) def _request_document_checkout_view(self): return self.post( @@ -83,7 +87,9 @@ class CheckoutsAPITestCase(DocumentTestMixin, BaseAPITestCase): self.assertEqual(DocumentCheckout.objects.count(), 0) def test_document_checkout_with_access(self): - self.grant_access(permission=permission_document_checkout, obj=self.document) + self.grant_access( + obj=self.document, permission=permission_document_checkout + ) response = self._request_document_checkout_view() self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertEqual( @@ -102,7 +108,7 @@ class CheckoutsAPITestCase(DocumentTestMixin, BaseAPITestCase): def test_checkout_list_view_with_document_access(self): self._checkout_document() self.grant_access( - permission=permission_document_view, obj=self.document + obj=self.document, permission=permission_document_view ) response = self._request_checkout_list_view() self.assertEqual(response.status_code, status.HTTP_200_OK) @@ -111,7 +117,8 @@ class CheckoutsAPITestCase(DocumentTestMixin, BaseAPITestCase): def test_checkout_list_view_with_checkout_access(self): self._checkout_document() self.grant_access( - permission=permission_document_checkout_detail_view, obj=self.document + obj=self.document, + permission=permission_document_checkout_detail_view ) response = self._request_checkout_list_view() self.assertEqual(response.status_code, status.HTTP_200_OK) @@ -120,10 +127,11 @@ class CheckoutsAPITestCase(DocumentTestMixin, BaseAPITestCase): def test_checkout_list_view_with_access(self): self._checkout_document() self.grant_access( - permission=permission_document_view, obj=self.document + obj=self.document, permission=permission_document_view ) self.grant_access( - permission=permission_document_checkout_detail_view, obj=self.document + obj=self.document, + permission=permission_document_checkout_detail_view ) response = self._request_checkout_list_view() self.assertEqual(response.status_code, status.HTTP_200_OK) diff --git a/mayan/apps/checkouts/tests/test_views.py b/mayan/apps/checkouts/tests/test_views.py index 9293baa644..9e49b0cfc1 100644 --- a/mayan/apps/checkouts/tests/test_views.py +++ b/mayan/apps/checkouts/tests/test_views.py @@ -23,7 +23,8 @@ from ..permissions import ( class DocumentCheckoutViewTestCase(GenericDocumentViewTestCase): def _request_document_check_in_view(self): return self.post( - viewname='checkouts:checkin_document', args=(self.document.pk,), + viewname='checkouts:checkin_document', + kwargs={'document_pk': self.document.pk} ) def test_checkin_document_view_no_permission(self): @@ -72,7 +73,8 @@ class DocumentCheckoutViewTestCase(GenericDocumentViewTestCase): def _request_document_checkout_view(self): return self.post( - viewname='checkouts:checkout_document', args=(self.document.pk,), + viewname='checkouts:checkout_document', + kwargs={'document_pk': self.document.pk}, data={ 'expiration_datetime_0': 2, 'expiration_datetime_1': TIME_DELTA_UNIT_DAYS, @@ -125,7 +127,8 @@ class DocumentCheckoutViewTestCase(GenericDocumentViewTestCase): self.assertTrue(self.document.is_checked_out()) response = self.post( - 'sources:upload_version', args=(self.document.pk,), + viewname='sources:upload_version', + kwargs={'document_pk': self.document.pk}, follow=True ) @@ -135,7 +138,8 @@ class DocumentCheckoutViewTestCase(GenericDocumentViewTestCase): ) response = self.get( - 'documents:document_version_list', args=(self.document.pk,), + viewname='documents:document_version_list', + kwargs={'document_pk': self.document.pk}, follow=True ) @@ -176,7 +180,9 @@ class DocumentCheckoutViewTestCase(GenericDocumentViewTestCase): ) response = self.post( - 'checkouts:checkin_document', args=(self.document.pk,), follow=True + viewname='checkouts:checkin_document', + kwargs={'document_pk': self.document.pk}, + follow=True ) self.assertContains( @@ -212,7 +218,9 @@ class DocumentCheckoutViewTestCase(GenericDocumentViewTestCase): permission_document_checkout_detail_view.stored_permission ) response = self.post( - 'checkouts:checkin_document', args=(self.document.pk,), follow=True + viewname='checkouts:checkin_document', + kwargs={'document_pk': self.document.pk}, + follow=True ) self.assertContains( diff --git a/mayan/apps/checkouts/urls.py b/mayan/apps/checkouts/urls.py index 0e2dba3d32..e3360ce8b3 100644 --- a/mayan/apps/checkouts/urls.py +++ b/mayan/apps/checkouts/urls.py @@ -9,28 +9,32 @@ from .views import ( ) urlpatterns = [ - url(r'^list/$', CheckoutListView.as_view(), name='checkout_list'), url( - r'^(?P\d+)/check/out/$', CheckoutDocumentView.as_view(), - name='checkout_document' + regex=r'^documents/$', name='checkout_list', + view=CheckoutListView.as_view() ), url( - r'^(?P\d+)/check/in/$', DocumentCheckinView.as_view(), - name='checkin_document' + regex=r'^documents/(?P\d+)/check/out/$', + name='checkout_document', view=CheckoutDocumentView.as_view() ), url( - r'^(?P\d+)/check/info/$', CheckoutDetailView.as_view(), - name='checkout_info' + regex=r'^documents/(?P\d+)/check/in/$', + name='checkin_document', view=DocumentCheckinView.as_view() + ), + url( + regex=r'^documents/(?P\d+)/check/info/$', + name='checkout_info', view=CheckoutDetailView.as_view() ), ] api_urls = [ url( - r'^checkouts/$', APICheckedoutDocumentListView.as_view(), - name='checkout-document-list' + regex=r'^checkouts/$', name='checkout-document-list', + view=APICheckedoutDocumentListView.as_view() ), url( - r'^checkouts/(?P[0-9]+)/checkout_info/$', APICheckedoutDocumentView.as_view(), - name='checkedout-document-view' + regex=r'^checkouts/(?P[0-9]+)/checkout_info/$', + name='checkedout-document-view', + view=APICheckedoutDocumentView.as_view() ), ] diff --git a/mayan/apps/checkouts/views.py b/mayan/apps/checkouts/views.py index 2f7c7a9579..a9e00d5e6d 100644 --- a/mayan/apps/checkouts/views.py +++ b/mayan/apps/checkouts/views.py @@ -28,11 +28,13 @@ class CheckoutDocumentView(SingleObjectCreateView): form_class = DocumentCheckoutForm def dispatch(self, request, *args, **kwargs): - self.document = get_object_or_404(klass=Document, pk=self.kwargs['pk']) + self.document = get_object_or_404( + klass=Document, pk=self.kwargs['document_pk'] + ) AccessControlList.objects.check_access( - permissions=permission_document_checkout, user=request.user, - obj=self.document + obj=self.document, permissions=permission_document_checkout, + user=request.user ) return super( @@ -46,19 +48,24 @@ class CheckoutDocumentView(SingleObjectCreateView): instance.document = self.document instance.save() except DocumentAlreadyCheckedOut: - messages.error(self.request, _('Document already checked out.')) + messages.error( + request=self.request, + message=_('Document already checked out.') + ) except Exception as exception: messages.error( - self.request, - _('Error trying to check out document; %s') % exception + request=self.request, + message=_('Error trying to check out document; %s') % exception ) else: messages.success( - self.request, - _('Document "%s" checked out successfully.') % self.document + request=self.request, + message=_( + 'Document "%s" checked out successfully.' + ) % self.document ) - return HttpResponseRedirect(self.get_success_url()) + return HttpResponseRedirect(redirect_to=self.get_success_url()) def get_extra_context(self): return { @@ -67,15 +74,18 @@ class CheckoutDocumentView(SingleObjectCreateView): } def get_post_action_redirect(self): - return reverse('checkouts:checkout_info', args=(self.document.pk,)) + return reverse( + viewname='checkouts:checkout_info', + kwargs={'document_pk': self.document.pk} + ) class CheckoutListView(DocumentListView): def get_document_queryset(self): return AccessControlList.objects.filter_by_access( permission=permission_document_checkout_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): @@ -129,7 +139,7 @@ class CheckoutDetailView(SingleObjectDetailView): } def get_object(self): - return get_object_or_404(klass=Document, pk=self.kwargs['pk']) + return get_object_or_404(klass=Document, pk=self.kwargs['document_pk']) class DocumentCheckinView(ConfirmView): @@ -151,38 +161,43 @@ class DocumentCheckinView(ConfirmView): return context def get_object(self): - return get_object_or_404(klass=Document, pk=self.kwargs['pk']) + return get_object_or_404(klass=Document, pk=self.kwargs['document_pk']) def get_post_action_redirect(self): - return reverse('checkouts:checkout_info', args=(self.get_object().pk,)) + return reverse( + viewname='checkouts:checkout_info', + kwargs={'document_pk': self.get_object().pk} + ) def view_action(self): document = self.get_object() if document.get_checkout_info().user == self.request.user: AccessControlList.objects.check_access( - permissions=permission_document_checkin, - user=self.request.user, obj=document + obj=document, permissions=permission_document_checkin, + user=self.request.user ) else: AccessControlList.objects.check_access( - permissions=permission_document_checkin_override, - user=self.request.user, obj=document + obj=document, permissions=permission_document_checkin_override, + user=self.request.user ) try: document.check_in(user=self.request.user) except DocumentNotCheckedOut: messages.error( - self.request, _('Document has not been checked out.') + request=self.request, message=_( + 'Document has not been checked out.' + ) ) except Exception as exception: messages.error( - self.request, - _('Error trying to check in document; %s') % exception + request=self.request, + message=_('Error trying to check in document; %s') % exception ) else: messages.success( - self.request, - _('Document "%s" checked in successfully.') % document + request=self.request, + message=_('Document "%s" checked in successfully.') % document )