Compare commits
1 Commits
releases/a
...
features/t
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
adf47646bf |
@@ -18,6 +18,9 @@ event_document_new_version = namespace.add_event_type(
|
|||||||
event_document_properties_edit = namespace.add_event_type(
|
event_document_properties_edit = namespace.add_event_type(
|
||||||
label=_('Document properties edited'), name='document_edit'
|
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
|
# The type of an existing document is changed to another type
|
||||||
event_document_type_change = namespace.add_event_type(
|
event_document_type_change = namespace.add_event_type(
|
||||||
label=_('Document type changed'), name='document_type_change'
|
label=_('Document type changed'), name='document_type_change'
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import uuid
|
|||||||
|
|
||||||
from django.apps import apps
|
from django.apps import apps
|
||||||
from django.core.files import File
|
from django.core.files import File
|
||||||
from django.db import models
|
from django.db import models, transaction
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.utils.encoding import python_2_unicode_compatible
|
from django.utils.encoding import python_2_unicode_compatible
|
||||||
from django.utils.timezone import now
|
from django.utils.timezone import now
|
||||||
@@ -13,7 +13,7 @@ from django.utils.translation import ugettext, ugettext_lazy as _
|
|||||||
|
|
||||||
from ..events import (
|
from ..events import (
|
||||||
event_document_create, event_document_properties_edit,
|
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 ..managers import DocumentManager, PassthroughManager, TrashCanManager
|
||||||
from ..settings import setting_language
|
from ..settings import setting_language
|
||||||
@@ -104,11 +104,14 @@ class Document(models.Model):
|
|||||||
|
|
||||||
def delete(self, *args, **kwargs):
|
def delete(self, *args, **kwargs):
|
||||||
to_trash = kwargs.pop('to_trash', True)
|
to_trash = kwargs.pop('to_trash', True)
|
||||||
|
_user = kwargs.pop('_user', None)
|
||||||
|
|
||||||
if not self.in_trash and to_trash:
|
if not self.in_trash and to_trash:
|
||||||
self.in_trash = True
|
with transaction.atomic():
|
||||||
self.deleted_date_time = now()
|
self.in_trash = True
|
||||||
self.save()
|
self.deleted_date_time = now()
|
||||||
|
self.save()
|
||||||
|
event_document_trashed.commit(actor=_user, target=self)
|
||||||
else:
|
else:
|
||||||
for version in self.versions.all():
|
for version in self.versions.all():
|
||||||
version.delete()
|
version.delete()
|
||||||
@@ -177,21 +180,23 @@ class Document(models.Model):
|
|||||||
user = kwargs.pop('_user', None)
|
user = kwargs.pop('_user', None)
|
||||||
_commit_events = kwargs.pop('_commit_events', True)
|
_commit_events = kwargs.pop('_commit_events', True)
|
||||||
new_document = not self.pk
|
new_document = not self.pk
|
||||||
super(Document, self).save(*args, **kwargs)
|
|
||||||
|
|
||||||
if new_document:
|
with transaction.atomic():
|
||||||
if user:
|
super(Document, self).save(*args, **kwargs)
|
||||||
self.add_as_recent_document_for_user(user)
|
|
||||||
event_document_create.commit(
|
if new_document:
|
||||||
actor=user, target=self, action_object=self.document_type
|
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:
|
else:
|
||||||
event_document_create.commit(
|
if _commit_events:
|
||||||
target=self, action_object=self.document_type
|
event_document_properties_edit.commit(actor=user, target=self)
|
||||||
)
|
|
||||||
else:
|
|
||||||
if _commit_events:
|
|
||||||
event_document_properties_edit.commit(actor=user, target=self)
|
|
||||||
|
|
||||||
def save_to_file(self, *args, **kwargs):
|
def save_to_file(self, *args, **kwargs):
|
||||||
return self.latest_version.save_to_file(*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
|
has_changed = self.document_type != document_type
|
||||||
|
|
||||||
self.document_type = document_type
|
self.document_type = document_type
|
||||||
self.save()
|
with transaction.atomic():
|
||||||
if has_changed or force:
|
self.save()
|
||||||
post_document_type_change.send(
|
if has_changed or force:
|
||||||
sender=self.__class__, instance=self
|
post_document_type_change.send(
|
||||||
)
|
sender=self.__class__, instance=self
|
||||||
|
)
|
||||||
|
|
||||||
event_document_type_change.commit(actor=_user, target=self)
|
event_document_type_change.commit(actor=_user, target=self)
|
||||||
if _user:
|
if _user:
|
||||||
self.add_as_recent_document_for_user(user=_user)
|
self.add_as_recent_document_for_user(user=_user)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def size(self):
|
def size(self):
|
||||||
|
|||||||
@@ -228,9 +228,6 @@ class DocumentViewTestMixin(object):
|
|||||||
data={'id_list': self.test_document.pk}
|
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):
|
def _request_document_print_view(self):
|
||||||
return self.get(
|
return self.get(
|
||||||
viewname='documents:document_print', kwargs={
|
viewname='documents:document_print', kwargs={
|
||||||
@@ -239,3 +236,52 @@ class DocumentViewTestMixin(object):
|
|||||||
'page_group': PAGE_RANGE_ALL
|
'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
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|||||||
@@ -3,12 +3,16 @@ from __future__ import unicode_literals
|
|||||||
from actstream.models import Action
|
from actstream.models import Action
|
||||||
from django_downloadview import assert_download_response
|
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 (
|
from ..permissions import (
|
||||||
permission_document_download, permission_document_view
|
permission_document_download, permission_document_trash,
|
||||||
|
permission_document_view
|
||||||
)
|
)
|
||||||
|
|
||||||
from .base import GenericDocumentViewTestCase
|
from .base import GenericDocumentViewTestCase
|
||||||
|
from .mixins import DocumentTrashViewMixin
|
||||||
|
|
||||||
|
|
||||||
TEST_DOCUMENT_TYPE_EDITED_LABEL = 'test document type edited label'
|
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.actor, self._test_case_user)
|
||||||
self.assertEqual(event.target, self.test_document)
|
self.assertEqual(event.target, self.test_document)
|
||||||
self.assertEqual(event.verb, event_document_view.id)
|
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)
|
||||||
|
|||||||
@@ -7,16 +7,10 @@ from ..permissions import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
from .base import GenericDocumentViewTestCase
|
from .base import GenericDocumentViewTestCase
|
||||||
|
from .mixins import DocumentTrashViewMixin
|
||||||
|
|
||||||
|
|
||||||
class TrashedDocumentTestCase(GenericDocumentViewTestCase):
|
class TrashedDocumentTestCase(DocumentTrashViewMixin, GenericDocumentViewTestCase):
|
||||||
def _request_document_restore_get_view(self):
|
|
||||||
return self.get(
|
|
||||||
viewname='documents:document_restore', kwargs={
|
|
||||||
'pk': self.test_document.pk
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_document_restore_get_view_no_permission(self):
|
def test_document_restore_get_view_no_permission(self):
|
||||||
self.test_document.delete()
|
self.test_document.delete()
|
||||||
self.assertEqual(Document.objects.count(), 0)
|
self.assertEqual(Document.objects.count(), 0)
|
||||||
@@ -43,13 +37,6 @@ class TrashedDocumentTestCase(GenericDocumentViewTestCase):
|
|||||||
|
|
||||||
self.assertEqual(Document.objects.count(), document_count)
|
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):
|
def test_document_restore_post_view_no_permission(self):
|
||||||
self.test_document.delete()
|
self.test_document.delete()
|
||||||
self.assertEqual(Document.objects.count(), 0)
|
self.assertEqual(Document.objects.count(), 0)
|
||||||
@@ -74,13 +61,6 @@ class TrashedDocumentTestCase(GenericDocumentViewTestCase):
|
|||||||
self.assertEqual(DeletedDocument.objects.count(), 0)
|
self.assertEqual(DeletedDocument.objects.count(), 0)
|
||||||
self.assertEqual(Document.objects.count(), 1)
|
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):
|
def test_document_trash_get_view_no_permissions(self):
|
||||||
document_count = Document.objects.count()
|
document_count = Document.objects.count()
|
||||||
|
|
||||||
@@ -101,13 +81,6 @@ class TrashedDocumentTestCase(GenericDocumentViewTestCase):
|
|||||||
|
|
||||||
self.assertEqual(Document.objects.count(), document_count)
|
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):
|
def test_document_trash_post_view_no_permissions(self):
|
||||||
response = self._request_document_trash_post_view()
|
response = self._request_document_trash_post_view()
|
||||||
self.assertEqual(response.status_code, 404)
|
self.assertEqual(response.status_code, 404)
|
||||||
@@ -126,13 +99,6 @@ class TrashedDocumentTestCase(GenericDocumentViewTestCase):
|
|||||||
self.assertEqual(DeletedDocument.objects.count(), 1)
|
self.assertEqual(DeletedDocument.objects.count(), 1)
|
||||||
self.assertEqual(Document.objects.count(), 0)
|
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):
|
def test_document_delete_get_view_no_permissions(self):
|
||||||
self.test_document.delete()
|
self.test_document.delete()
|
||||||
self.assertEqual(Document.objects.count(), 0)
|
self.assertEqual(Document.objects.count(), 0)
|
||||||
@@ -165,13 +131,6 @@ class TrashedDocumentTestCase(GenericDocumentViewTestCase):
|
|||||||
DeletedDocument.objects.count(), trashed_document_count
|
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):
|
def test_document_delete_post_view_no_permissions(self):
|
||||||
self.test_document.delete()
|
self.test_document.delete()
|
||||||
self.assertEqual(Document.objects.count(), 0)
|
self.assertEqual(Document.objects.count(), 0)
|
||||||
@@ -198,9 +157,6 @@ class TrashedDocumentTestCase(GenericDocumentViewTestCase):
|
|||||||
self.assertEqual(DeletedDocument.objects.count(), 0)
|
self.assertEqual(DeletedDocument.objects.count(), 0)
|
||||||
self.assertEqual(Document.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):
|
def test_deleted_document_list_view_no_permissions(self):
|
||||||
self.test_document.delete()
|
self.test_document.delete()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user