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
+14 -11
View File
@@ -32,7 +32,8 @@ from .links import (
link_document_events_view, link_document_multiple_document_type_edit, link_document_events_view, link_document_multiple_document_type_edit,
link_document_download, link_document_edit, link_document_list, link_document_download, link_document_edit, link_document_list,
link_document_list_deleted, link_document_list_recent, 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_download, link_document_multiple_restore,
link_document_multiple_update_page_count, link_document_multiple_update_page_count,
link_document_page_navigation_first, link_document_page_navigation_last, 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_view_reset, link_document_page_zoom_in,
link_document_page_zoom_out, link_document_pages, link_document_preview, link_document_page_zoom_out, link_document_pages, link_document_preview,
link_document_print, link_document_properties, link_document_restore, 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_edit, link_document_type_filename_create,
link_document_type_filename_delete, link_document_type_filename_edit, link_document_type_filename_delete, link_document_type_filename_edit,
link_document_type_filename_list, link_document_type_list, link_document_type_filename_list, link_document_type_list,
@@ -58,7 +59,8 @@ from .permissions import (
permission_document_delete, permission_document_download, permission_document_delete, permission_document_download,
permission_document_edit, permission_document_new_version, permission_document_edit, permission_document_new_version,
permission_document_print, permission_document_properties_edit, 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 .settings import setting_thumbnail_size
from .statistics import DocumentStatistics, DocumentUsageStatistics from .statistics import DocumentStatistics, DocumentUsageStatistics
@@ -84,10 +86,11 @@ class DocumentsApp(MayanAppConfig):
permission_document_delete, permission_document_download, permission_document_delete, permission_document_download,
permission_document_edit, permission_document_new_version, permission_document_edit, permission_document_new_version,
permission_document_print, permission_document_properties_edit, permission_document_print, permission_document_properties_edit,
permission_document_version_revert, permission_document_view, permission_document_trash, permission_document_version_revert,
permission_events_view, permission_transformation_create, permission_document_view, permission_events_view,
permission_transformation_delete, permission_transformation_edit, permission_transformation_create,
permission_transformation_view, 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']) 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 # 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_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], sources=[DeletedDocument]) menu_object.bind_links(links=[link_document_restore, link_document_delete], sources=[DeletedDocument])
# Document facet links # Document facet links
menu_facet.bind_links(links=[link_acl_list], sources=[Document]) menu_facet.bind_links(links=[link_acl_list], sources=[Document])
@@ -114,8 +117,8 @@ class DocumentsApp(MayanAppConfig):
# Document actions # Document actions
menu_object.bind_links(links=[link_document_version_revert, link_document_version_download], sources=[DocumentVersion]) 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_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], sources=[DeletedDocument]) menu_multi_item.bind_links(links=[link_document_multiple_restore, link_document_multiple_delete], sources=[DeletedDocument])
# Document pages # 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']) 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'])
+5 -2
View File
@@ -11,8 +11,9 @@ from .permissions import (
permission_document_properties_edit, permission_document_print, permission_document_properties_edit, permission_document_print,
permission_document_restore, permission_document_tools, permission_document_restore, permission_document_tools,
permission_document_version_revert, permission_document_view, permission_document_version_revert, permission_document_view,
permission_document_type_create, permission_document_type_delete, permission_document_trash, permission_document_type_create,
permission_document_type_edit, permission_document_type_view permission_document_type_delete, permission_document_type_edit,
permission_document_type_view
) )
from .settings import setting_zoom_max_level, setting_zoom_min_level 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 # Actions
link_document_clear_transformations = Link(permissions=[permission_transformation_delete], text=_('Clear transformations'), view='documents:document_clear_transformations', args='object.id') 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_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_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_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') 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_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_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_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_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_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') link_document_multiple_download = Link(permissions=[permission_document_download], text=_('Download'), view='documents:document_multiple_download')
+4 -6
View File
@@ -78,6 +78,10 @@ class DocumentManager(models.Manager):
return version return version
class PassthroughManager(models.Manager):
pass
class TrashCanManager(models.Manager): class TrashCanManager(models.Manager):
def get_queryset(self): def get_queryset(self):
return super(TrashCanManager, self).get_queryset().filter(in_trash=True) return super(TrashCanManager, self).get_queryset().filter(in_trash=True)
@@ -87,9 +91,3 @@ class TrashCanQuerySet(models.QuerySet):
def delete(self, to_trash=True): def delete(self, to_trash=True):
for instance in self: for instance in self:
instance.delete(to_trash=to_trash) instance.delete(to_trash=to_trash)
#if to_trash:
# for instance in self:
# instance.delete(to_trash=to_trash)
#else:
# super(TrashCanQuerySet, self).delete()
+5 -2
View File
@@ -28,7 +28,8 @@ from .events import (
event_document_version_revert event_document_version_revert
) )
from .managers import ( from .managers import (
DocumentManager, DocumentTypeManager, RecentDocumentManager, TrashCanManager DocumentManager, DocumentTypeManager, PassthroughManager,
RecentDocumentManager, TrashCanManager
) )
from .runtime import storage_backend from .runtime import storage_backend
from .settings import ( from .settings import (
@@ -82,6 +83,8 @@ class Document(models.Model):
in_trash = models.BooleanField(default=False, editable=False, verbose_name=_('In trash?')) in_trash = models.BooleanField(default=False, editable=False, verbose_name=_('In trash?'))
objects = DocumentManager() objects = DocumentManager()
passthrough = PassthroughManager()
trash = TrashCanManager()
class Meta: class Meta:
verbose_name = _('Document') verbose_name = _('Document')
@@ -502,7 +505,7 @@ class DocumentPage(models.Model):
return self.document_version.document return self.document_version.document
def invalidate_cache(self): def invalidate_cache(self):
fs_cleanup(self.get_cache_filename()) fs_cleanup(self.cache_filename)
@property @property
def uuid(self): def uuid(self):
+1
View File
@@ -8,6 +8,7 @@ namespace = PermissionNamespace('documents', _('Documents'))
permission_document_create = namespace.add_permission(name='document_create', label=_('Create 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_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_download = namespace.add_permission(name='document_download', label=_('Download documents'))
permission_document_edit = namespace.add_permission(name='document_edit', label=_('Edit 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')) permission_document_new_version = namespace.add_permission(name='document_new_version', label=_('Create new document versions'))
+7 -4
View File
@@ -11,8 +11,9 @@ from .api_views import (
) )
from .settings import setting_print_size, setting_display_size from .settings import setting_print_size, setting_display_size
from .views import ( from .views import (
DeletedDocumentListView, DocumentListView, DocumentManyRestoreView, DeletedDocumentDeleteView, DeletedDocumentListView, DocumentListView,
DocumentPageListView, DocumentRestoreView, RecentDocumentListView DocumentManyDeleteView, DocumentManyRestoreView, DocumentPageListView,
DocumentRestoreView, RecentDocumentListView
) )
urlpatterns = patterns( urlpatterns = patterns(
@@ -25,10 +26,12 @@ urlpatterns = patterns(
url(r'^(?P<document_id>\d+)/properties/$', 'document_properties', name='document_properties'), 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'^(?P<pk>\d+)/restore/$', DocumentRestoreView.as_view(), name='document_restore'),
url(r'^multiple/restore/$', DocumentManyRestoreView.as_view(), name='document_multiple_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'^(?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'^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'^(?P<document_id>\d+)/trash/$', 'document_trash', name='document_trash'),
url(r'^multiple/delete/$', 'document_multiple_delete', name='document_multiple_delete'), 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+)/edit/$', 'document_edit', name='document_edit'),
url(r'^(?P<document_id>\d+)/print/$', 'document_print', name='document_print'), 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'), url(r'^(?P<document_id>\d+)/reset_page_count/$', 'document_update_page_count', name='document_update_page_count'),
+59 -14
View File
@@ -45,9 +45,10 @@ from .permissions import (
permission_document_delete, permission_document_download, permission_document_delete, permission_document_download,
permission_document_print, permission_document_properties_edit, permission_document_print, permission_document_properties_edit,
permission_document_restore, permission_document_tools, permission_document_restore, permission_document_tools,
permission_document_type_create, permission_document_type_delete, permission_document_trash, permission_document_type_create,
permission_document_type_edit, permission_document_type_view, permission_document_type_delete, permission_document_type_edit,
permission_document_version_revert, permission_document_view, permission_document_type_view, permission_document_version_revert,
permission_document_view,
) )
from .settings import ( from .settings import (
setting_preview_size, setting_recent_count, setting_rotation_step, setting_preview_size, setting_recent_count, setting_rotation_step,
@@ -67,6 +68,7 @@ class DocumentListView(SingleObjectListView):
'hide_links': True, 'hide_links': True,
'title': _('All documents'), 'title': _('All documents'),
} }
object_permission = permission_document_view object_permission = permission_document_view
def get_document_queryset(self): def get_document_queryset(self):
@@ -78,13 +80,22 @@ class DocumentListView(SingleObjectListView):
class DeletedDocumentListView(DocumentListView): class DeletedDocumentListView(DocumentListView):
object_permission = None
extra_context = { extra_context = {
'hide_link': True, 'hide_link': True,
'title': _('Deleted documents'), 'title': _('Deleted documents'),
} }
def get_document_queryset(self): 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): class DocumentPageListView(ParentChildListView):
@@ -123,10 +134,12 @@ class DocumentRestoreView(ConfirmView):
} }
def object_action(self, request, instance): def object_action(self, request, instance):
source_document = get_object_or_404(Document.passthrough, pk=instance.pk)
try: try:
Permission.check_permissions(request.user, [permission_document_restore]) Permission.check_permissions(request.user, [permission_document_restore])
except PermissionDenied: 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() instance.restore()
messages.success(request, _('Document: %(document)s restored.') % { messages.success(request, _('Document: %(document)s restored.') % {
@@ -147,6 +160,38 @@ class DocumentManyRestoreView(MultipleInstanceActionMixin, DocumentRestoreView):
model = DeletedDocument 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): def document_properties(request, document_id):
document = get_object_or_404(Document, pk=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)) }, 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 post_action_redirect = None
if document_id: 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))) return HttpResponseRedirect(request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)))
try: try:
Permission.check_permissions(request.user, [permission_document_delete]) Permission.check_permissions(request.user, [permission_document_trash])
except PermissionDenied: 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)))) 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)))) 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: for document in documents:
try: try:
document.delete() document.delete()
messages.success(request, _('Document deleted successfully.')) messages.success(request, _('Document moved to trash successfully.'))
except Exception as exception: 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 'document': document, 'error': exception
}) })
@@ -243,8 +288,8 @@ def document_delete(request, document_id=None, document_id_list=None):
'previous': previous, 'previous': previous,
'next': next, 'next': next,
'title': ungettext( 'title': ungettext(
'Are you sure you wish to delete the selected document?', 'Move the selected document to the trash ?',
'Are you sure you wish to delete the selected documents?', 'Move the selected documents to the trash ?',
len(documents) len(documents)
) )
} }
@@ -256,8 +301,8 @@ def document_delete(request, document_id=None, document_id_list=None):
context_instance=RequestContext(request)) context_instance=RequestContext(request))
def document_multiple_delete(request): def document_multiple_trash(request):
return document_delete( return document_trash(
request, document_id_list=request.GET.get('id_list', []) request, document_id_list=request.GET.get('id_list', [])
) )