Convert the checkout detail view to use the DetailView CBV. Update usage the DetailView CBV in the DocumentProperties view. Add checkout details view permission.

This commit is contained in:
Roberto Rosario
2016-03-09 23:27:02 -04:00
parent 6f02d96212
commit 45e90da219
7 changed files with 119 additions and 99 deletions

View File

@@ -19,7 +19,7 @@ from .links import (
from .literals import CHECK_EXPIRED_CHECK_OUTS_INTERVAL
from .permissions import (
permission_document_checkin, permission_document_checkin_override,
permission_document_checkout
permission_document_checkout, permission_document_checkout_detail_view
)
from .tasks import task_check_expired_check_outs # NOQA
# This import is required so that celerybeat can find the task
@@ -69,6 +69,7 @@ class CheckoutsApp(MayanAppConfig):
permission_document_checkout,
permission_document_checkin,
permission_document_checkin_override,
permission_document_checkout_detail_view
)
)

View File

@@ -1,7 +1,11 @@
from __future__ import unicode_literals
from django import forms
from django.utils.translation import ugettext_lazy as _
from common.forms import DetailForm
from .literals import STATE_LABELS
from .models import DocumentCheckout
from .widgets import SplitTimeDeltaWidget
@@ -13,3 +17,45 @@ class DocumentCheckoutForm(forms.ModelForm):
widgets = {
'expiration_datetime': SplitTimeDeltaWidget()
}
class DocumentCheckoutDefailForm(DetailForm):
def __init__(self, *args, **kwargs):
instance = kwargs['instance']
extra_fields = (
{
'label': _('Document status'),
'field': lambda instance: STATE_LABELS[instance.checkout_state()]
},
)
if instance.is_checked_out():
checkout_info = instance.checkout_info()
extra_fields += (
{
'label': _('User'),
'field': lambda instance: checkout_info.user.get_full_name() or checkout_info.user
},
{
'label': _('Check out time'),
'field': lambda instance: checkout_info.checkout_datetime,
'widget': forms.widgets.DateTimeInput
},
{
'label': _('Check out expiration'),
'field': lambda instance: checkout_info.expiration_datetime,
'widget': forms.widgets.DateTimeInput
},
{
'label': _('New versions allowed?'),
'field': lambda instance: _('Yes') if not checkout_info.block_new_version else _('No')
},
)
kwargs['extra_fields'] = extra_fields
super(DocumentCheckoutDefailForm, self).__init__(*args, **kwargs)
class Meta:
fields = ()
model = DocumentCheckout

View File

@@ -15,3 +15,6 @@ permission_document_checkin_override = namespace.add_permission(
permission_document_checkout = namespace.add_permission(
name='checkout_document', label=_('Check out documents')
)
permission_document_checkout_detail_view = namespace.add_permission(
name='checkout_detail_view', label=_('Check out details view')
)

View File

@@ -3,7 +3,10 @@ from __future__ import unicode_literals
from django.conf.urls import patterns, url
from .api_views import APICheckedoutDocumentListView, APICheckedoutDocumentView
from .views import CheckoutDocumentView, CheckoutListView, DocumentCheckinView
from .views import (
CheckoutDocumentView, CheckoutDetailView, CheckoutListView,
DocumentCheckinView
)
urlpatterns = patterns(
'checkouts.views',
@@ -17,7 +20,7 @@ urlpatterns = patterns(
name='checkin_document'
),
url(
r'^(?P<document_pk>\d+)/check/info/$', 'checkout_info',
r'^(?P<pk>\d+)/check/info/$', CheckoutDetailView.as_view(),
name='checkout_info'
),
)

View File

@@ -12,17 +12,19 @@ from documents.models import Document
from documents.views import DocumentListView
from acls.models import AccessControlList
from common.generics import ConfirmView, SingleObjectCreateView
from common.utils import encapsulate, render_date_object
from common.generics import (
ConfirmView, SingleObjectCreateView, SingleObjectDetailView
)
from common.utils import encapsulate
from permissions import Permission
from .exceptions import DocumentAlreadyCheckedOut, DocumentNotCheckedOut
from .forms import DocumentCheckoutForm
from .forms import DocumentCheckoutForm, DocumentCheckoutDefailForm
from .literals import STATE_LABELS
from .models import DocumentCheckout
from .permissions import (
permission_document_checkin, permission_document_checkin_override,
permission_document_checkout
permission_document_checkout, permission_document_checkout_detail_view
)
@@ -106,55 +108,21 @@ class CheckoutListView(DocumentListView):
return DocumentCheckout.objects.checked_out_documents()
def checkout_info(request, document_pk):
document = get_object_or_404(Document, pk=document_pk)
try:
Permission.check_permissions(
request.user, (
permission_document_checkout, permission_document_checkin
)
)
except PermissionDenied:
AccessControlList.objects.check_access(
(permission_document_checkout, permission_document_checkin),
request.user, document
)
class CheckoutDetailView(SingleObjectDetailView):
form_class = DocumentCheckoutDefailForm
model = Document
object_permission = permission_document_checkout_detail_view
paragraphs = [
_('Document status: %s') % STATE_LABELS[document.checkout_state()]
]
def get_extra_context(self):
return {
'object': self.get_object(),
'title': _(
'Check out details for document: %s'
) % self.get_object()
}
if document.is_checked_out():
checkout_info = document.checkout_info()
paragraphs.append(
_('User: %s') % (
checkout_info.user.get_full_name() or checkout_info.user
)
)
paragraphs.append(
_(
'Check out time: %s'
) % render_date_object(checkout_info.checkout_datetime)
)
paragraphs.append(
_(
'Check out expiration: %s'
) % render_date_object(checkout_info.expiration_datetime)
)
paragraphs.append(
_(
'New versions allowed: %s'
) % (_('Yes') if not checkout_info.block_new_version else _('No'))
)
return render_to_response(
'appearance/generic_template.html', {
'paragraphs': paragraphs,
'object': document,
'title': _('Check out details for document: %s') % document
},
context_instance=RequestContext(request)
)
def get_object(self):
return get_object_or_404(Document, pk=self.kwargs['pk'])
class DocumentCheckinView(ConfirmView):

View File

@@ -4,6 +4,7 @@ import logging
from django import forms
from django.core.exceptions import PermissionDenied
from django.template.defaultfilters import filesizeformat
from django.utils.translation import ugettext_lazy as _
from acls.models import AccessControlList
@@ -101,6 +102,48 @@ class DocumentPropertiesForm(DetailForm):
"""
Detail class form to display a document file based properties
"""
def __init__(self, *args, **kwargs):
document = kwargs['instance']
extra_fields = [
{
'label': _('Date added'),
'field': 'date_added',
'widget': forms.widgets.DateTimeInput
},
{'label': _('UUID'), 'field': 'uuid'},
]
if document.latest_version:
extra_fields += (
{
'label': _('File mimetype'),
'field': lambda x: document.file_mimetype or _('None')
},
{
'label': _('File encoding'),
'field': lambda x: document.file_mime_encoding or _(
'None'
)
},
{
'label': _('File size'),
'field': lambda document: filesizeformat(
document.size
) if document.size else '-'
},
{'label': _('Exists in storage'), 'field': 'exists'},
{
'label': _('File path in storage'),
'field': 'latest_version.file'
},
{'label': _('Checksum'), 'field': 'checksum'},
{'label': _('Pages'), 'field': 'page_count'},
)
kwargs['extra_fields'] = extra_fields
super(DocumentPropertiesForm, self).__init__(*args, **kwargs)
class Meta:
fields = ('document_type', 'description', 'language')
model = Document

View File

@@ -22,7 +22,6 @@ from common.generics import (
SingleObjectDetailView, SingleObjectEditView, SingleObjectListView
)
from common.mixins import MultipleInstanceActionMixin
from common.utils import render_date_object
from converter.literals import (
DEFAULT_PAGE_NUMBER, DEFAULT_ROTATION, DEFAULT_ZOOM_LEVEL
)
@@ -533,6 +532,7 @@ class DocumentVersionListView(SingleObjectListView):
class DocumentView(SingleObjectDetailView):
form_class = DocumentPropertiesForm
model = Document
object_permission = permission_document_view
@@ -543,55 +543,11 @@ class DocumentView(SingleObjectDetailView):
def get_extra_context(self):
return {
'form': self.get_form(),
'document': self.get_object(),
'object': self.get_object(),
'title': _('Properties for document: %s') % self.get_object(),
}
def get_form(self):
document = self.get_object()
document_fields = [
{
'label': _('Date added'),
'field': lambda document: render_date_object(
document.date_added
)
},
{'label': _('UUID'), 'field': 'uuid'},
]
if document.latest_version:
document_fields.extend([
{
'label': _('File mimetype'),
'field': lambda x: document.file_mimetype or _('None')
},
{
'label': _('File encoding'),
'field': lambda x: document.file_mime_encoding or _(
'None'
)
},
{
'label': _('File size'),
'field': lambda document: filesizeformat(
document.size
) if document.size else '-'
},
{'label': _('Exists in storage'), 'field': 'exists'},
{
'label': _('File path in storage'),
'field': 'latest_version.file'
},
{'label': _('Checksum'), 'field': 'checksum'},
{'label': _('Pages'), 'field': 'page_count'},
])
return DocumentPropertiesForm(
instance=document, extra_fields=document_fields
)
class EmptyTrashCanView(ConfirmView):
extra_context = {