Add support to fully delete documents from trash can. Rename previous delete link and related code to 'move to trash'. gh-issue #188.

This commit is contained in:
Roberto Rosario
2015-07-03 18:35:10 -04:00
parent 98b988038e
commit 3e299f030a
7 changed files with 95 additions and 39 deletions

View File

@@ -32,7 +32,8 @@ from .links import (
link_document_events_view, link_document_multiple_document_type_edit,
link_document_download, link_document_edit, link_document_list,
link_document_list_deleted, link_document_list_recent,
link_document_multiple_delete, link_document_multiple_clear_transformations,
link_document_multiple_delete, link_document_multiple_trash,
link_document_multiple_clear_transformations,
link_document_multiple_download, link_document_multiple_restore,
link_document_multiple_update_page_count,
link_document_page_navigation_first, link_document_page_navigation_last,
@@ -42,7 +43,7 @@ from .links import (
link_document_page_view_reset, link_document_page_zoom_in,
link_document_page_zoom_out, link_document_pages, link_document_preview,
link_document_print, link_document_properties, link_document_restore,
link_document_type_create, link_document_type_delete,
link_document_trash, link_document_type_create, link_document_type_delete,
link_document_type_edit, link_document_type_filename_create,
link_document_type_filename_delete, link_document_type_filename_edit,
link_document_type_filename_list, link_document_type_list,
@@ -58,7 +59,8 @@ from .permissions import (
permission_document_delete, permission_document_download,
permission_document_edit, permission_document_new_version,
permission_document_print, permission_document_properties_edit,
permission_document_version_revert, permission_document_view
permission_document_trash, permission_document_version_revert,
permission_document_view
)
from .settings import setting_thumbnail_size
from .statistics import DocumentStatistics, DocumentUsageStatistics
@@ -84,10 +86,11 @@ class DocumentsApp(MayanAppConfig):
permission_document_delete, permission_document_download,
permission_document_edit, permission_document_new_version,
permission_document_print, permission_document_properties_edit,
permission_document_version_revert, permission_document_view,
permission_events_view, permission_transformation_create,
permission_transformation_delete, permission_transformation_edit,
permission_transformation_view,
permission_document_trash, permission_document_version_revert,
permission_document_view, permission_events_view,
permission_transformation_create,
permission_transformation_delete,
permission_transformation_edit, permission_transformation_view,
)
)
@@ -102,8 +105,8 @@ class DocumentsApp(MayanAppConfig):
menu_sidebar.bind_links(links=[link_document_type_filename_create], sources=[DocumentTypeFilename, 'documents:document_type_filename_list', 'documents:document_type_filename_create'])
# Document object links
menu_object.bind_links(links=[link_document_edit, link_document_document_type_edit, link_document_print, link_document_delete, link_document_download, link_document_clear_transformations, link_document_update_page_count], sources=[Document])
menu_object.bind_links(links=[link_document_restore], sources=[DeletedDocument])
menu_object.bind_links(links=[link_document_edit, link_document_document_type_edit, link_document_print, link_document_trash, link_document_download, link_document_clear_transformations, link_document_update_page_count], sources=[Document])
menu_object.bind_links(links=[link_document_restore, link_document_delete], sources=[DeletedDocument])
# Document facet links
menu_facet.bind_links(links=[link_acl_list], sources=[Document])
@@ -114,8 +117,8 @@ class DocumentsApp(MayanAppConfig):
# Document actions
menu_object.bind_links(links=[link_document_version_revert, link_document_version_download], sources=[DocumentVersion])
menu_multi_item.bind_links(links=[link_document_multiple_clear_transformations, link_document_multiple_delete, link_document_multiple_download, link_document_multiple_update_page_count, link_document_multiple_document_type_edit], sources=[Document])
menu_multi_item.bind_links(links=[link_document_multiple_restore], sources=[DeletedDocument])
menu_multi_item.bind_links(links=[link_document_multiple_clear_transformations, link_document_multiple_trash, link_document_multiple_download, link_document_multiple_update_page_count, link_document_multiple_document_type_edit], sources=[Document])
menu_multi_item.bind_links(links=[link_document_multiple_restore, link_document_multiple_delete], sources=[DeletedDocument])
# Document pages
menu_facet.bind_links(links=[link_document_page_rotate_left, link_document_page_rotate_right, link_document_page_zoom_in, link_document_page_zoom_out, link_document_page_view_reset], sources=['documents:document_page_view'])

View File

@@ -11,8 +11,9 @@ from .permissions import (
permission_document_properties_edit, permission_document_print,
permission_document_restore, permission_document_tools,
permission_document_version_revert, permission_document_view,
permission_document_type_create, permission_document_type_delete,
permission_document_type_edit, permission_document_type_view
permission_document_trash, permission_document_type_create,
permission_document_type_delete, permission_document_type_edit,
permission_document_type_view
)
from .settings import setting_zoom_max_level, setting_zoom_min_level
@@ -47,6 +48,7 @@ link_document_pages = Link(permissions=[permission_document_view], text=_('Pages
# Actions
link_document_clear_transformations = Link(permissions=[permission_transformation_delete], text=_('Clear transformations'), view='documents:document_clear_transformations', args='object.id')
link_document_delete = Link(permissions=[permission_document_delete], tags='dangerous', text=_('Delete'), view='documents:document_delete', args='object.id')
link_document_trash = Link(permissions=[permission_document_trash], tags='dangerous', text=_('Move to trash'), view='documents:document_trash', args='object.id')
link_document_edit = Link(permissions=[permission_document_properties_edit], text=_('Edit properties'), view='documents:document_edit', args='object.id')
link_document_document_type_edit = Link(permissions=[permission_document_properties_edit], text=_('Change type'), view='documents:document_document_type_edit', args='object.id')
link_document_download = Link(permissions=[permission_document_download], text=_('Download'), view='documents:document_download', args='object.id')
@@ -54,6 +56,7 @@ link_document_print = Link(permissions=[permission_document_print], text=_('Prin
link_document_update_page_count = Link(permissions=[permission_document_tools], text=_('Reset page count'), view='documents:document_update_page_count', args='object.pk')
link_document_restore = Link(permissions=[permission_document_restore], text=_('Restore'), view='documents:document_restore', args='object.pk')
link_document_multiple_clear_transformations = Link(permissions=[permission_transformation_delete], text=_('Clear transformations'), view='documents:document_multiple_clear_transformations')
link_document_multiple_trash = Link(permissions=[permission_document_trash], tags='dangerous', text=_('Move to trash'), view='documents:document_multiple_trash')
link_document_multiple_delete = Link(permissions=[permission_document_delete], tags='dangerous', text=_('Delete'), view='documents:document_multiple_delete')
link_document_multiple_document_type_edit = Link(permissions=[permission_document_properties_edit], text=_('Change type'), view='documents:document_multiple_document_type_edit')
link_document_multiple_download = Link(permissions=[permission_document_download], text=_('Download'), view='documents:document_multiple_download')

View File

@@ -78,6 +78,10 @@ class DocumentManager(models.Manager):
return version
class PassthroughManager(models.Manager):
pass
class TrashCanManager(models.Manager):
def get_queryset(self):
return super(TrashCanManager, self).get_queryset().filter(in_trash=True)
@@ -87,9 +91,3 @@ class TrashCanQuerySet(models.QuerySet):
def delete(self, to_trash=True):
for instance in self:
instance.delete(to_trash=to_trash)
#if to_trash:
# for instance in self:
# instance.delete(to_trash=to_trash)
#else:
# super(TrashCanQuerySet, self).delete()

View File

@@ -28,7 +28,8 @@ from .events import (
event_document_version_revert
)
from .managers import (
DocumentManager, DocumentTypeManager, RecentDocumentManager, TrashCanManager
DocumentManager, DocumentTypeManager, PassthroughManager,
RecentDocumentManager, TrashCanManager
)
from .runtime import storage_backend
from .settings import (
@@ -82,6 +83,8 @@ class Document(models.Model):
in_trash = models.BooleanField(default=False, editable=False, verbose_name=_('In trash?'))
objects = DocumentManager()
passthrough = PassthroughManager()
trash = TrashCanManager()
class Meta:
verbose_name = _('Document')
@@ -502,7 +505,7 @@ class DocumentPage(models.Model):
return self.document_version.document
def invalidate_cache(self):
fs_cleanup(self.get_cache_filename())
fs_cleanup(self.cache_filename)
@property
def uuid(self):

View File

@@ -8,6 +8,7 @@ namespace = PermissionNamespace('documents', _('Documents'))
permission_document_create = namespace.add_permission(name='document_create', label=_('Create documents'))
permission_document_delete = namespace.add_permission(name='document_delete', label=_('Delete documents'))
permission_document_trash = namespace.add_permission(name='document_trash', label=_('Trash documents'))
permission_document_download = namespace.add_permission(name='document_download', label=_('Download documents'))
permission_document_edit = namespace.add_permission(name='document_edit', label=_('Edit documents'))
permission_document_new_version = namespace.add_permission(name='document_new_version', label=_('Create new document versions'))

View File

@@ -11,8 +11,9 @@ from .api_views import (
)
from .settings import setting_print_size, setting_display_size
from .views import (
DeletedDocumentListView, DocumentListView, DocumentManyRestoreView,
DocumentPageListView, DocumentRestoreView, RecentDocumentListView
DeletedDocumentDeleteView, DeletedDocumentListView, DocumentListView,
DocumentManyDeleteView, DocumentManyRestoreView, DocumentPageListView,
DocumentRestoreView, RecentDocumentListView
)
urlpatterns = patterns(
@@ -25,10 +26,12 @@ urlpatterns = patterns(
url(r'^(?P<document_id>\d+)/properties/$', 'document_properties', name='document_properties'),
url(r'^(?P<pk>\d+)/restore/$', DocumentRestoreView.as_view(), name='document_restore'),
url(r'^multiple/restore/$', DocumentManyRestoreView.as_view(), name='document_multiple_restore'),
url(r'^(?P<pk>\d+)/delete/$', DeletedDocumentDeleteView.as_view(), name='document_delete'),
url(r'^multiple/delete/$', DocumentManyDeleteView.as_view(), name='document_multiple_delete'),
url(r'^(?P<document_id>\d+)/type/$', 'document_document_type_edit', name='document_document_type_edit'),
url(r'^multiple/type/$', 'document_multiple_document_type_edit', name='document_multiple_document_type_edit'),
url(r'^(?P<document_id>\d+)/delete/$', 'document_delete', name='document_delete'),
url(r'^multiple/delete/$', 'document_multiple_delete', name='document_multiple_delete'),
url(r'^(?P<document_id>\d+)/trash/$', 'document_trash', name='document_trash'),
url(r'^multiple/trash/$', 'document_multiple_trash', name='document_multiple_trash'),
url(r'^(?P<document_id>\d+)/edit/$', 'document_edit', name='document_edit'),
url(r'^(?P<document_id>\d+)/print/$', 'document_print', name='document_print'),
url(r'^(?P<document_id>\d+)/reset_page_count/$', 'document_update_page_count', name='document_update_page_count'),

View File

@@ -45,9 +45,10 @@ from .permissions import (
permission_document_delete, permission_document_download,
permission_document_print, permission_document_properties_edit,
permission_document_restore, permission_document_tools,
permission_document_type_create, permission_document_type_delete,
permission_document_type_edit, permission_document_type_view,
permission_document_version_revert, permission_document_view,
permission_document_trash, permission_document_type_create,
permission_document_type_delete, permission_document_type_edit,
permission_document_type_view, permission_document_version_revert,
permission_document_view,
)
from .settings import (
setting_preview_size, setting_recent_count, setting_rotation_step,
@@ -67,6 +68,7 @@ class DocumentListView(SingleObjectListView):
'hide_links': True,
'title': _('All documents'),
}
object_permission = permission_document_view
def get_document_queryset(self):
@@ -78,13 +80,22 @@ class DocumentListView(SingleObjectListView):
class DeletedDocumentListView(DocumentListView):
object_permission = None
extra_context = {
'hide_link': True,
'title': _('Deleted documents'),
}
def get_document_queryset(self):
return DeletedDocument.objects.all()
queryset = Document.trash.all()
try:
Permission.check_permissions(self.request.user, [permission_document_view])
except PermissionDenied:
AccessControlList.objects.check_access(permission_document_view, self.request.user, queryset)
return DeletedDocument.objects.filter(pk__in=queryset.values_list('pk', flat=True))
class DocumentPageListView(ParentChildListView):
@@ -123,10 +134,12 @@ class DocumentRestoreView(ConfirmView):
}
def object_action(self, request, instance):
source_document = get_object_or_404(Document.passthrough, pk=instance.pk)
try:
Permission.check_permissions(request.user, [permission_document_restore])
except PermissionDenied:
AccessControlList.objects.check_access(permission_document_restore, request.user, instance)
AccessControlList.objects.check_access(permission_document_restore, request.user, source_document)
instance.restore()
messages.success(request, _('Document: %(document)s restored.') % {
@@ -147,6 +160,38 @@ class DocumentManyRestoreView(MultipleInstanceActionMixin, DocumentRestoreView):
model = DeletedDocument
class DeletedDocumentDeleteView(ConfirmView):
extra_context = {
'title': _('Delete the selected document?')
}
def object_action(self, request, instance):
source_document = get_object_or_404(Document.passthrough, pk=instance.pk)
try:
Permission.check_permissions(request.user, [permission_document_delete])
except PermissionDenied:
AccessControlList.objects.check_access(permission_document_delete, request.user, source_document)
instance.delete()
messages.success(request, _('Document: %(document)s deleted.') % {
'document': instance}
)
def post(self, request, *args, **kwargs):
document = get_object_or_404(DeletedDocument, pk=self.kwargs['pk'])
self.object_action(request=request, instance=document)
return HttpResponseRedirect(self.get_success_url())
class DocumentManyDeleteView(MultipleInstanceActionMixin, DeletedDocumentDeleteView):
extra_context = {
'title': _('Delete the selected documents?')
}
model = DeletedDocument
def document_properties(request, document_id):
document = get_object_or_404(Document, pk=document_id)
@@ -206,7 +251,7 @@ def document_preview(request, document_id):
}, context_instance=RequestContext(request))
def document_delete(request, document_id=None, document_id_list=None):
def document_trash(request, document_id=None, document_id_list=None):
post_action_redirect = None
if document_id:
@@ -219,9 +264,9 @@ def document_delete(request, document_id=None, document_id_list=None):
return HttpResponseRedirect(request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)))
try:
Permission.check_permissions(request.user, [permission_document_delete])
Permission.check_permissions(request.user, [permission_document_trash])
except PermissionDenied:
documents = AccessControlList.objects.filter_by_access(permission_document_delete, request.user, documents, exception_on_empty=True)
documents = AccessControlList.objects.filter_by_access(permission_document_trash, request.user, documents, exception_on_empty=True)
previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL))))
next = request.POST.get('next', request.GET.get('next', post_action_redirect if post_action_redirect else request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL))))
@@ -230,9 +275,9 @@ def document_delete(request, document_id=None, document_id_list=None):
for document in documents:
try:
document.delete()
messages.success(request, _('Document deleted successfully.'))
messages.success(request, _('Document moved to trash successfully.'))
except Exception as exception:
messages.error(request, _('Document: %(document)s delete error: %(error)s') % {
messages.error(request, _('Document: %(document)s error moving to trash: %(error)s') % {
'document': document, 'error': exception
})
@@ -243,8 +288,8 @@ def document_delete(request, document_id=None, document_id_list=None):
'previous': previous,
'next': next,
'title': ungettext(
'Are you sure you wish to delete the selected document?',
'Are you sure you wish to delete the selected documents?',
'Move the selected document to the trash ?',
'Move the selected documents to the trash ?',
len(documents)
)
}
@@ -256,8 +301,8 @@ def document_delete(request, document_id=None, document_id_list=None):
context_instance=RequestContext(request))
def document_multiple_delete(request):
return document_delete(
def document_multiple_trash(request):
return document_trash(
request, document_id_list=request.GET.get('id_list', [])
)