diff --git a/mayan/apps/documents/apps.py b/mayan/apps/documents/apps.py index 1e43fb6749..bebe7db02b 100644 --- a/mayan/apps/documents/apps.py +++ b/mayan/apps/documents/apps.py @@ -97,6 +97,7 @@ class DocumentsApp(MayanAppConfig): SourceColumn(source=Document, label=_('Thumbnail'), attribute=encapsulate(lambda document: document_thumbnail(document, gallery_name='documents:document_list', title=getattr(document, 'label', None), size=setting_thumbnail_size.value))) SourceColumn(source=Document, label=_('Type'), attribute='document_type') SourceColumn(source=DeletedDocument, label=_('Type'), attribute='document_type') + SourceColumn(source=DeletedDocument, label=_('Date time deleted'), attribute='deleted_date_time') menu_front_page.bind_links(links=[link_document_list_recent, link_document_list, link_document_list_deleted]) menu_setup.bind_links(links=[link_document_type_setup]) diff --git a/mayan/apps/documents/migrations/0010_auto_20150704_0054.py b/mayan/apps/documents/migrations/0010_auto_20150704_0054.py new file mode 100644 index 0000000000..4ac6f6ba96 --- /dev/null +++ b/mayan/apps/documents/migrations/0010_auto_20150704_0054.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import datetime +from django.utils.timezone import utc + + +class Migration(migrations.Migration): + + dependencies = [ + ('documents', '0009_document_in_trash'), + ] + + operations = [ + migrations.CreateModel( + name='DeletedDocument', + fields=[ + ], + options={ + 'proxy': True, + }, + bases=('documents.document',), + ), + migrations.AddField( + model_name='document', + name='deleted_date_time', + field=models.DateTimeField(default=datetime.datetime(2015, 7, 4, 0, 54, 7, 910642, tzinfo=utc), verbose_name='Date and time deleted', blank=True), + preserve_default=False, + ), + ] diff --git a/mayan/apps/documents/models.py b/mayan/apps/documents/models.py index 915c878440..1891bd5d45 100644 --- a/mayan/apps/documents/models.py +++ b/mayan/apps/documents/models.py @@ -10,6 +10,7 @@ from django.contrib.auth.models import User from django.core.urlresolvers import reverse from django.db import models, transaction from django.utils.encoding import python_2_unicode_compatible +from django.utils.timezone import now from django.utils.translation import ugettext_lazy as _ from common.settings import setting_temporary_directory @@ -81,6 +82,7 @@ class Document(models.Model): date_added = models.DateTimeField(verbose_name=_('Added'), auto_now_add=True) language = models.CharField(choices=setting_language_choices.value, default=setting_language.value, max_length=8, verbose_name=_('Language')) in_trash = models.BooleanField(default=False, editable=False, verbose_name=_('In trash?')) + deleted_date_time = models.DateTimeField(blank=True, editable=True, verbose_name=_('Date and time deleted')) objects = DocumentManager() passthrough = PassthroughManager() @@ -127,6 +129,7 @@ class Document(models.Model): def delete(self, *args, **kwargs): if not self.in_trash and kwargs.get('to_trash', True): self.in_trash = True + self.deleted_date_time = now() self.save() else: for version in self.versions.all(): diff --git a/mayan/apps/documents/views.py b/mayan/apps/documents/views.py index 7fc4ba2c5f..f047abaedd 100644 --- a/mayan/apps/documents/views.py +++ b/mayan/apps/documents/views.py @@ -98,34 +98,29 @@ class DeletedDocumentListView(DocumentListView): return DeletedDocument.objects.filter(pk__in=queryset.values_list('pk', flat=True)) -class DocumentPageListView(ParentChildListView): - object_permission = permission_document_view - parent_queryset = Document.objects.all() - - def get_queryset(self): - return self.get_object().pages.all() - - def get_context_data(self, **kwargs): - context = super(DocumentPageListView, self).get_context_data(**kwargs) - - context.update( - { - 'title': _('Pages for document: %s') % self.get_object(), - } - ) - - return context - - -class RecentDocumentListView(DocumentListView): +class DeletedDocumentDeleteView(ConfirmView): extra_context = { - 'hide_links': True, - 'recent_count': setting_recent_count.value, # TODO: used for something? - 'title': _('Recent documents'), + 'title': _('Delete the selected document?') } - def get_document_queryset(self): - return RecentDocument.objects.get_for_user(self.request.user) + 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 DocumentRestoreView(ConfirmView): @@ -153,6 +148,13 @@ class DocumentRestoreView(ConfirmView): return HttpResponseRedirect(self.get_success_url()) +class DocumentManyDeleteView(MultipleInstanceActionMixin, DeletedDocumentDeleteView): + extra_context = { + 'title': _('Delete the selected documents?') + } + model = DeletedDocument + + class DocumentManyRestoreView(MultipleInstanceActionMixin, DocumentRestoreView): extra_context = { 'title': _('Restore the selected documents?') @@ -160,36 +162,23 @@ class DocumentManyRestoreView(MultipleInstanceActionMixin, DocumentRestoreView): model = DeletedDocument -class DeletedDocumentDeleteView(ConfirmView): - extra_context = { - 'title': _('Delete the selected document?') - } +class DocumentPageListView(ParentChildListView): + object_permission = permission_document_view + parent_queryset = Document.objects.all() - def object_action(self, request, instance): - source_document = get_object_or_404(Document.passthrough, pk=instance.pk) + def get_queryset(self): + return self.get_object().pages.all() - try: - Permission.check_permissions(request.user, [permission_document_delete]) - except PermissionDenied: - AccessControlList.objects.check_access(permission_document_delete, request.user, source_document) + def get_context_data(self, **kwargs): + context = super(DocumentPageListView, self).get_context_data(**kwargs) - instance.delete() - messages.success(request, _('Document: %(document)s deleted.') % { - 'document': instance} + context.update( + { + 'title': _('Pages for document: %s') % self.get_object(), + } ) - 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 + return context class EmptyTrashCanView(ConfirmView): @@ -208,6 +197,17 @@ class EmptyTrashCanView(ConfirmView): return HttpResponseRedirect(self.get_success_url()) +class RecentDocumentListView(DocumentListView): + extra_context = { + 'hide_links': True, + 'recent_count': setting_recent_count.value, # TODO: used for something? + 'title': _('Recent documents'), + } + + def get_document_queryset(self): + return RecentDocument.objects.get_for_user(self.request.user) + + def document_properties(request, document_id): document = get_object_or_404(Document, pk=document_id)