From adf47646bfae8dac7ac2e49dd88d20d462aa1d75 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Mon, 24 Jun 2019 08:29:45 -0400 Subject: [PATCH] Initial commit for the document trashed event Signed-off-by: Roberto Rosario --- mayan/apps/documents/events.py | 3 + .../apps/documents/models/document_models.py | 58 ++++++++++--------- mayan/apps/documents/tests/mixins.py | 52 ++++++++++++++++- mayan/apps/documents/tests/test_events.py | 25 +++++++- .../tests/test_trashed_document_views.py | 48 +-------------- 5 files changed, 109 insertions(+), 77 deletions(-) diff --git a/mayan/apps/documents/events.py b/mayan/apps/documents/events.py index 77a7b8136e..f322533a2e 100644 --- a/mayan/apps/documents/events.py +++ b/mayan/apps/documents/events.py @@ -18,6 +18,9 @@ event_document_new_version = namespace.add_event_type( event_document_properties_edit = namespace.add_event_type( label=_('Document properties edited'), name='document_edit' ) +event_document_trashed = namespace.add_event_type( + label=_('Document moved to trash'), name='document_trashed' +) # The type of an existing document is changed to another type event_document_type_change = namespace.add_event_type( label=_('Document type changed'), name='document_type_change' diff --git a/mayan/apps/documents/models/document_models.py b/mayan/apps/documents/models/document_models.py index 9f205226c8..709a777692 100644 --- a/mayan/apps/documents/models/document_models.py +++ b/mayan/apps/documents/models/document_models.py @@ -5,7 +5,7 @@ import uuid from django.apps import apps from django.core.files import File -from django.db import models +from django.db import models, transaction from django.urls import reverse from django.utils.encoding import python_2_unicode_compatible from django.utils.timezone import now @@ -13,7 +13,7 @@ from django.utils.translation import ugettext, ugettext_lazy as _ from ..events import ( event_document_create, event_document_properties_edit, - event_document_type_change, + event_document_trashed, event_document_type_change, ) from ..managers import DocumentManager, PassthroughManager, TrashCanManager from ..settings import setting_language @@ -104,11 +104,14 @@ class Document(models.Model): def delete(self, *args, **kwargs): to_trash = kwargs.pop('to_trash', True) + _user = kwargs.pop('_user', None) if not self.in_trash and to_trash: - self.in_trash = True - self.deleted_date_time = now() - self.save() + with transaction.atomic(): + self.in_trash = True + self.deleted_date_time = now() + self.save() + event_document_trashed.commit(actor=_user, target=self) else: for version in self.versions.all(): version.delete() @@ -177,21 +180,23 @@ class Document(models.Model): user = kwargs.pop('_user', None) _commit_events = kwargs.pop('_commit_events', True) new_document = not self.pk - super(Document, self).save(*args, **kwargs) - if new_document: - if user: - self.add_as_recent_document_for_user(user) - event_document_create.commit( - actor=user, target=self, action_object=self.document_type - ) + with transaction.atomic(): + super(Document, self).save(*args, **kwargs) + + if new_document: + if user: + self.add_as_recent_document_for_user(user) + event_document_create.commit( + actor=user, target=self, action_object=self.document_type + ) + else: + event_document_create.commit( + target=self, action_object=self.document_type + ) else: - event_document_create.commit( - target=self, action_object=self.document_type - ) - else: - if _commit_events: - event_document_properties_edit.commit(actor=user, target=self) + if _commit_events: + event_document_properties_edit.commit(actor=user, target=self) def save_to_file(self, *args, **kwargs): return self.latest_version.save_to_file(*args, **kwargs) @@ -200,15 +205,16 @@ class Document(models.Model): has_changed = self.document_type != document_type self.document_type = document_type - self.save() - if has_changed or force: - post_document_type_change.send( - sender=self.__class__, instance=self - ) + with transaction.atomic(): + self.save() + if has_changed or force: + post_document_type_change.send( + sender=self.__class__, instance=self + ) - event_document_type_change.commit(actor=_user, target=self) - if _user: - self.add_as_recent_document_for_user(user=_user) + event_document_type_change.commit(actor=_user, target=self) + if _user: + self.add_as_recent_document_for_user(user=_user) @property def size(self): diff --git a/mayan/apps/documents/tests/mixins.py b/mayan/apps/documents/tests/mixins.py index 220453529a..c67f59fe36 100644 --- a/mayan/apps/documents/tests/mixins.py +++ b/mayan/apps/documents/tests/mixins.py @@ -228,9 +228,6 @@ class DocumentViewTestMixin(object): data={'id_list': self.test_document.pk} ) - def _request_empty_trash_view(self): - return self.post(viewname='documents:trash_can_empty') - def _request_document_print_view(self): return self.get( viewname='documents:document_print', kwargs={ @@ -239,3 +236,52 @@ class DocumentViewTestMixin(object): 'page_group': PAGE_RANGE_ALL } ) + + +class DocumentTrashViewMixin(object): + def _request_document_delete_get_view(self): + return self.get( + viewname='documents:document_delete', kwargs={ + 'pk': self.test_document.pk + } + ) + + def _request_document_delete_post_view(self): + return self.post( + viewname='documents:document_delete', kwargs={ + 'pk': self.test_document.pk + } + ) + + def _request_document_list_deleted_view(self): + return self.get(viewname='documents:document_list_deleted') + + def _request_document_restore_get_view(self): + return self.get( + viewname='documents:document_restore', kwargs={ + 'pk': self.test_document.pk + } + ) + def _request_document_restore_post_view(self): + return self.post( + viewname='documents:document_restore', kwargs={ + 'pk': self.test_document.pk + } + ) + + def _request_document_trash_get_view(self): + return self.get( + viewname='documents:document_trash', kwargs={ + 'pk': self.test_document.pk + } + ) + + def _request_empty_trash_view(self): + return self.post(viewname='documents:trash_can_empty') + + def _request_document_trash_post_view(self): + return self.post( + viewname='documents:document_trash', kwargs={ + 'pk': self.test_document.pk + } + ) diff --git a/mayan/apps/documents/tests/test_events.py b/mayan/apps/documents/tests/test_events.py index 2f9428054b..b10c50739f 100644 --- a/mayan/apps/documents/tests/test_events.py +++ b/mayan/apps/documents/tests/test_events.py @@ -3,12 +3,16 @@ from __future__ import unicode_literals from actstream.models import Action from django_downloadview import assert_download_response -from ..events import event_document_download, event_document_view +from ..events import ( + event_document_download, event_document_trashed, event_document_view +) from ..permissions import ( - permission_document_download, permission_document_view + permission_document_download, permission_document_trash, + permission_document_view ) from .base import GenericDocumentViewTestCase +from .mixins import DocumentTrashViewMixin TEST_DOCUMENT_TYPE_EDITED_LABEL = 'test document type edited label' @@ -84,3 +88,20 @@ class DocumentEventsTestCase(GenericDocumentViewTestCase): self.assertEqual(event.actor, self._test_case_user) self.assertEqual(event.target, self.test_document) self.assertEqual(event.verb, event_document_view.id) + + +class DocumentTrashEventsTestCase(DocumentTrashViewMixin, GenericDocumentViewTestCase): + def test_document_trash_event_with_permissions(self): + Action.objects.all().delete() + + self.grant_access( + obj=self.test_document, permission=permission_document_trash + ) + + response = self._request_document_trash_post_view() + self.assertEqual(response.status_code, 302) + + event = Action.objects.any(obj=self.test_document).first() + #self.assertEqual(event.actor, self._test_case_user) + self.assertEqual(event.target, self.test_document) + self.assertEqual(event.verb, event_document_trashed.id) diff --git a/mayan/apps/documents/tests/test_trashed_document_views.py b/mayan/apps/documents/tests/test_trashed_document_views.py index 8be806f36e..778c575dab 100644 --- a/mayan/apps/documents/tests/test_trashed_document_views.py +++ b/mayan/apps/documents/tests/test_trashed_document_views.py @@ -7,16 +7,10 @@ from ..permissions import ( ) from .base import GenericDocumentViewTestCase +from .mixins import DocumentTrashViewMixin -class TrashedDocumentTestCase(GenericDocumentViewTestCase): - def _request_document_restore_get_view(self): - return self.get( - viewname='documents:document_restore', kwargs={ - 'pk': self.test_document.pk - } - ) - +class TrashedDocumentTestCase(DocumentTrashViewMixin, GenericDocumentViewTestCase): def test_document_restore_get_view_no_permission(self): self.test_document.delete() self.assertEqual(Document.objects.count(), 0) @@ -43,13 +37,6 @@ class TrashedDocumentTestCase(GenericDocumentViewTestCase): self.assertEqual(Document.objects.count(), document_count) - def _request_document_restore_post_view(self): - return self.post( - viewname='documents:document_restore', kwargs={ - 'pk': self.test_document.pk - } - ) - def test_document_restore_post_view_no_permission(self): self.test_document.delete() self.assertEqual(Document.objects.count(), 0) @@ -74,13 +61,6 @@ class TrashedDocumentTestCase(GenericDocumentViewTestCase): self.assertEqual(DeletedDocument.objects.count(), 0) self.assertEqual(Document.objects.count(), 1) - def _request_document_trash_get_view(self): - return self.get( - viewname='documents:document_trash', kwargs={ - 'pk': self.test_document.pk - } - ) - def test_document_trash_get_view_no_permissions(self): document_count = Document.objects.count() @@ -101,13 +81,6 @@ class TrashedDocumentTestCase(GenericDocumentViewTestCase): self.assertEqual(Document.objects.count(), document_count) - def _request_document_trash_post_view(self): - return self.post( - viewname='documents:document_trash', kwargs={ - 'pk': self.test_document.pk - } - ) - def test_document_trash_post_view_no_permissions(self): response = self._request_document_trash_post_view() self.assertEqual(response.status_code, 404) @@ -126,13 +99,6 @@ class TrashedDocumentTestCase(GenericDocumentViewTestCase): self.assertEqual(DeletedDocument.objects.count(), 1) self.assertEqual(Document.objects.count(), 0) - def _request_document_delete_get_view(self): - return self.get( - viewname='documents:document_delete', kwargs={ - 'pk': self.test_document.pk - } - ) - def test_document_delete_get_view_no_permissions(self): self.test_document.delete() self.assertEqual(Document.objects.count(), 0) @@ -165,13 +131,6 @@ class TrashedDocumentTestCase(GenericDocumentViewTestCase): DeletedDocument.objects.count(), trashed_document_count ) - def _request_document_delete_post_view(self): - return self.post( - viewname='documents:document_delete', kwargs={ - 'pk': self.test_document.pk - } - ) - def test_document_delete_post_view_no_permissions(self): self.test_document.delete() self.assertEqual(Document.objects.count(), 0) @@ -198,9 +157,6 @@ class TrashedDocumentTestCase(GenericDocumentViewTestCase): self.assertEqual(DeletedDocument.objects.count(), 0) self.assertEqual(Document.objects.count(), 0) - def _request_document_list_deleted_view(self): - return self.get(viewname='documents:document_list_deleted') - def test_deleted_document_list_view_no_permissions(self): self.test_document.delete()