Add keyword arguments to checkouts app

Add keyword arguments to calls and view parameters. Add missing icons.

Signed-off-by: Roberto Rosario <Roberto.Rosario@mayan-edms.com>
This commit is contained in:
Roberto Rosario
2019-01-02 14:19:32 -04:00
parent 3e53ce0c43
commit 92e615ce4c
14 changed files with 134 additions and 83 deletions

View File

@@ -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
)

View File

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

View File

@@ -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

View File

@@ -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'

View File

@@ -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',

View File

@@ -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

View File

@@ -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()

View File

@@ -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'
)

View File

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

View File

@@ -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

View File

@@ -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)

View File

@@ -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(

View File

@@ -9,28 +9,32 @@ from .views import (
)
urlpatterns = [
url(r'^list/$', CheckoutListView.as_view(), name='checkout_list'),
url(
r'^(?P<pk>\d+)/check/out/$', CheckoutDocumentView.as_view(),
name='checkout_document'
regex=r'^documents/$', name='checkout_list',
view=CheckoutListView.as_view()
),
url(
r'^(?P<pk>\d+)/check/in/$', DocumentCheckinView.as_view(),
name='checkin_document'
regex=r'^documents/(?P<document_pk>\d+)/check/out/$',
name='checkout_document', view=CheckoutDocumentView.as_view()
),
url(
r'^(?P<pk>\d+)/check/info/$', CheckoutDetailView.as_view(),
name='checkout_info'
regex=r'^documents/(?P<document_pk>\d+)/check/in/$',
name='checkin_document', view=DocumentCheckinView.as_view()
),
url(
regex=r'^documents/(?P<document_pk>\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<pk>[0-9]+)/checkout_info/$', APICheckedoutDocumentView.as_view(),
name='checkedout-document-view'
regex=r'^checkouts/(?P<document_pk>[0-9]+)/checkout_info/$',
name='checkedout-document-view',
view=APICheckedoutDocumentView.as_view()
),
]

View File

@@ -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
)