Add cabinet created and edited events

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
This commit is contained in:
Roberto Rosario
2019-05-14 21:03:15 -04:00
parent 1ae1804f5d
commit 1982c9920f
7 changed files with 141 additions and 15 deletions

View File

@@ -261,6 +261,7 @@
* Allow setting the Docker user UID and GUID.
* Add task path validation.
* Increase dropzone upload file size limit to 2GB.
* Add cabinet created and edited events.
3.1.11 (2019-04-XX)
===================

View File

@@ -571,6 +571,7 @@ Other changes
* Allow setting the Docker user UID and GUID.
* Add task path validation.
* Increase dropzone upload file size limit to 2GB
* Add cabinet created and edited events.
Removals

View File

@@ -10,10 +10,19 @@ from mayan.apps.common.menus import (
menu_facet, menu_list_facet, menu_main, menu_multi_item, menu_object,
menu_secondary
)
from mayan.apps.events.classes import ModelEventType
from mayan.apps.events.links import (
link_events_for_object, link_object_event_types_user_subcriptions_list,
)
from mayan.apps.events.permissions import permission_events_view
from mayan.apps.documents.search import document_page_search, document_search
from mayan.apps.navigation.classes import SourceColumn
from .dependencies import * # NOQA
from .events import (
event_cabinet_edited, event_cabinet_add_document,
event_cabinet_remove_document
)
from .links import (
link_cabinet_list, link_document_cabinet_list,
link_document_cabinet_remove, link_document_cabinet_add,
@@ -58,10 +67,18 @@ class CabinetsApp(MayanAppConfig):
name='document_cabinets', value=method_get_document_cabinets
)
ModelEventType.register(
model=Cabinet, event_types=(
event_cabinet_edited, event_cabinet_add_document,
event_cabinet_remove_document
)
)
ModelPermission.register(
model=Document, permissions=(
permission_cabinet_add_document,
permission_cabinet_remove_document
permission_cabinet_remove_document,
permission_events_view
)
)
@@ -115,7 +132,11 @@ class CabinetsApp(MayanAppConfig):
)
)
menu_list_facet.bind_links(
links=(link_cabinet_view, link_custom_acl_list),
links=(
link_cabinet_view, link_custom_acl_list,
link_events_for_object,
link_object_event_types_user_subcriptions_list,
),
sources=(Cabinet,)
)

View File

@@ -6,9 +6,16 @@ from mayan.apps.events.classes import EventTypeNamespace
namespace = EventTypeNamespace(label=_('Cabinets'), name='cabinets')
event_cabinets_add_document = namespace.add_event_type(
event_cabinet_created = namespace.add_event_type(
label=_('Cabinet created'), name='cabinet_created'
)
event_cabinet_edited = namespace.add_event_type(
label=_('Cabinet edited'), name='cabinet_edited'
)
event_cabinet_add_document = namespace.add_event_type(
label=_('Document added to cabinet'), name='add_document'
)
event_cabinets_remove_document = namespace.add_event_type(
event_cabinet_remove_document = namespace.add_event_type(
label=_('Document removed from cabinet'), name='remove_document'
)

View File

@@ -13,7 +13,10 @@ from mayan.apps.acls.models import AccessControlList
from mayan.apps.documents.models import Document
from mayan.apps.documents.permissions import permission_document_view
from .events import event_cabinets_add_document, event_cabinets_remove_document
from .events import (
event_cabinet_created, event_cabinet_edited, event_cabinet_add_document,
event_cabinet_remove_document
)
from .search import cabinet_search # NOQA
@@ -52,7 +55,7 @@ class Cabinet(MPTTModel):
method but this method provides the event commit already coded.
"""
self.documents.add(document)
event_cabinets_add_document.commit(
event_cabinet_add_document.commit(
action_object=self, actor=user, target=document
)
@@ -93,10 +96,25 @@ class Cabinet(MPTTModel):
corresponding event commit.
"""
self.documents.remove(document)
event_cabinets_remove_document.commit(
event_cabinet_remove_document.commit(
action_object=self, actor=user, target=document
)
def save(self, *args, **kwargs):
_user = kwargs.pop('_user', None)
with transaction.atomic():
is_new = not self.pk
super(Cabinet, self).save(*args, **kwargs)
if is_new:
event_cabinet_created.commit(
actor=_user, target=self
)
else:
event_cabinet_edited.commit(
actor=_user, target=self
)
def validate_unique(self, exclude=None):
"""
Explicit validation of uniqueness of parent+label as the provided

View File

@@ -2,31 +2,97 @@ from __future__ import unicode_literals
from actstream.models import Action
from mayan.apps.common.tests import GenericViewTestCase
from mayan.apps.documents.tests.test_models import GenericDocumentTestCase
from ..events import (
event_cabinets_add_document, event_cabinets_remove_document
event_cabinet_created, event_cabinet_edited, event_cabinet_add_document,
event_cabinet_remove_document
)
from ..models import Cabinet
from ..permissions import permission_cabinet_create, permission_cabinet_edit
from .mixins import CabinetTestMixin
from .mixins import CabinetTestMixin, CabinetViewTestMixin
class CabinetsEventsTestCase(CabinetTestMixin, GenericDocumentTestCase):
def setUp(self):
super(CabinetsEventsTestCase, self).setUp()
class CabinetsEventsTestCase(
CabinetTestMixin, CabinetViewTestMixin, GenericViewTestCase
):
def test_cabinet_create_event_no_permissions(self):
action_count = Action.objects.count()
response = self._request_test_cabinet_create_view()
self.assertEqual(response.status_code, 403)
self.assertEqual(Action.objects.count(), action_count)
def test_cabinet_create_event_with_permissions(self):
self.grant_permission(permission=permission_cabinet_create)
action_count = Action.objects.count()
response = self._request_test_cabinet_create_view()
self.assertEqual(response.status_code, 302)
self.assertEqual(Action.objects.count(), action_count + 1)
event = Action.objects.first()
cabinet = Cabinet.objects.first()
self.assertEqual(event.verb, event_cabinet_created.id)
self.assertEqual(event.target, cabinet)
self.assertEqual(event.actor, self._test_case_user)
def test_cabinet_edit_event_no_permissions(self):
self._create_test_cabinet()
action_count = Action.objects.count()
response = self._request_test_cabinet_edit_view()
self.assertEqual(response.status_code, 404)
self.assertEqual(Action.objects.count(), action_count)
def test_cabinet_edit_event_with_access(self):
self._create_test_cabinet()
self.grant_access(
obj=self.test_cabinet, permission=permission_cabinet_edit
)
action_count = Action.objects.count()
response = self._request_test_cabinet_edit_view()
self.assertEqual(response.status_code, 302)
self.assertEqual(Action.objects.count(), action_count + 1)
event = Action.objects.first()
self.assertEqual(event.verb, event_cabinet_edited.id)
self.assertEqual(event.target, self.test_cabinet)
self.assertEqual(event.actor, self._test_case_user)
class CabinetDocumentsEventsTestCase(
CabinetTestMixin, CabinetViewTestMixin, GenericDocumentTestCase
):
def test_document_cabinet_add_event(self):
self._create_test_cabinet()
Action.objects.all().delete()
self.test_cabinet.add_document(document=self.test_document)
self.assertEqual(Action.objects.last().target, self.test_document)
self.assertEqual(
Action.objects.last().verb,
event_cabinets_add_document.id
event_cabinet_add_document.id
)
def test_document_cabinet_remove_event(self):
self._create_test_cabinet()
self.test_cabinet.add_document(document=self.test_document)
Action.objects.all().delete()
self.test_cabinet.remove_document(document=self.test_document)
@@ -34,5 +100,5 @@ class CabinetsEventsTestCase(CabinetTestMixin, GenericDocumentTestCase):
self.assertEqual(Action.objects.first().target, self.test_document)
self.assertEqual(
Action.objects.first().verb,
event_cabinets_remove_document.id
event_cabinet_remove_document.id
)

View File

@@ -45,6 +45,9 @@ class CabinetCreateView(SingleObjectCreateView):
'title': _('Create cabinet'),
}
def get_save_extra_data(self):
return {'_user': self.request.user}
class CabinetChildAddView(ExternalObjectMixin, SingleObjectCreateView):
fields = ('label',)
@@ -63,7 +66,10 @@ class CabinetChildAddView(ExternalObjectMixin, SingleObjectCreateView):
return self.external_object.get_descendants()
def get_save_extra_data(self):
return {'parent': self.external_object}
return {
'parent': self.external_object,
'_user': self.request.user
}
class CabinetDeleteView(SingleObjectDeleteView):
@@ -123,6 +129,9 @@ class CabinetDetailView(ExternalObjectMixin, DocumentListView):
return context
def get_save_extra_data(self):
return {'_user': self.request.user}
class CabinetEditView(SingleObjectEditView):
fields = ('label',)
@@ -136,6 +145,9 @@ class CabinetEditView(SingleObjectEditView):
'title': _('Edit cabinet: %s') % self.get_object(),
}
def get_save_extra_data(self):
return {'_user': self.request.user}
class CabinetListView(SingleObjectListView):
object_permission = permission_cabinet_view