diff --git a/HISTORY.rst b/HISTORY.rst index 39e6b21fea..fa608f38f3 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -117,6 +117,7 @@ - The official config filename is config.yml. - Interpret ALLOWED_HOSTS as YAML. - Don't show the document types of an index instance. +- Add the tag created and tag edited events. 3.0.3 (2018-08-17) ================== diff --git a/mayan/apps/tags/apps.py b/mayan/apps/tags/apps.py index d6c28c3aeb..10770b3010 100644 --- a/mayan/apps/tags/apps.py +++ b/mayan/apps/tags/apps.py @@ -19,7 +19,9 @@ from events.links import ( from events.permissions import permission_events_view from navigation import SourceColumn -from .events import event_tag_attach, event_tag_remove +from .events import ( + event_tag_attach, event_tag_created, event_tag_edited, event_tag_remove +) from .handlers import handler_index_document, handler_tag_pre_delete from .links import ( link_multiple_documents_attach_tag, link_multiple_documents_tag_remove, @@ -66,7 +68,8 @@ class TagsApp(MayanAppConfig): ModelEventType.register( model=Tag, event_types=( - event_tag_attach, event_tag_remove + event_tag_attach, event_tag_created, event_tag_edited, + event_tag_remove ) ) diff --git a/mayan/apps/tags/events.py b/mayan/apps/tags/events.py index 8181f0fcaf..eaca57e4cd 100644 --- a/mayan/apps/tags/events.py +++ b/mayan/apps/tags/events.py @@ -9,6 +9,12 @@ namespace = EventTypeNamespace(name='tags', label=_('Tags')) event_tag_attach = namespace.add_event_type( label=_('Tag attached to document'), name='attach' ) +event_tag_created = namespace.add_event_type( + label=_('Tag created'), name='tag_created' +) +event_tag_edited = namespace.add_event_type( + label=_('Tag edited'), name='tag_edited' +) event_tag_remove = namespace.add_event_type( label=_('Tag removed from document'), name='remove' ) diff --git a/mayan/apps/tags/models.py b/mayan/apps/tags/models.py index 72157ef897..2966a152be 100644 --- a/mayan/apps/tags/models.py +++ b/mayan/apps/tags/models.py @@ -11,7 +11,9 @@ from acls.models import AccessControlList from documents.models import Document from documents.permissions import permission_document_view -from .events import event_tag_attach, event_tag_remove +from .events import ( + event_tag_attach, event_tag_created, event_tag_edited, event_tag_remove +) from .widgets import widget_single_tag @@ -59,6 +61,19 @@ class Tag(models.Model): action_object=self, actor=user, target=document ) + def save(self, *args, **kwargs): + user = kwargs.pop('_user', None) + created = not self.pk + + result = super(Tag, self).save(*args, **kwargs) + + if created: + event_tag_created.commit(actor=user, target=self) + else: + event_tag_edited.commit(actor=user, target=self) + + return result + class DocumentTag(Tag): class Meta: diff --git a/mayan/apps/tags/tests/mixins.py b/mayan/apps/tags/tests/mixins.py new file mode 100644 index 0000000000..04f0a6006a --- /dev/null +++ b/mayan/apps/tags/tests/mixins.py @@ -0,0 +1,42 @@ +from __future__ import unicode_literals + +from documents.permissions import permission_document_view +from documents.tests import GenericDocumentViewTestCase + +from ..models import Tag +from ..permissions import ( + permission_tag_attach, permission_tag_create, permission_tag_delete, + permission_tag_edit, permission_tag_remove, permission_tag_view +) + +from .literals import ( + TEST_TAG_COLOR, TEST_TAG_COLOR_EDITED, TEST_TAG_LABEL, + TEST_TAG_LABEL_EDITED +) + + +class TagTestMixin(object): + def _create_tag(self): + self.tag = Tag.objects.create( + color=TEST_TAG_COLOR, label=TEST_TAG_LABEL + ) + + def _request_tag_create_view(self): + return self.post( + viewname='tags:tag_create', data={ + 'label': TEST_TAG_LABEL, + 'color': TEST_TAG_COLOR + } + ) + + def _request_tag_delete_view(self): + return self.post( + viewname='tags:tag_delete', args=(self.tag.pk,) + ) + + def _request_tag_edit_view(self): + return self.post( + viewname='tags:tag_edit', args=(self.tag.pk,), data={ + 'label': TEST_TAG_LABEL_EDITED, 'color': TEST_TAG_COLOR_EDITED + } + ) diff --git a/mayan/apps/tags/tests/test_events.py b/mayan/apps/tags/tests/test_events.py new file mode 100644 index 0000000000..6ca0744825 --- /dev/null +++ b/mayan/apps/tags/tests/test_events.py @@ -0,0 +1,73 @@ +from __future__ import unicode_literals + +from actstream.models import Action + +from documents.tests import GenericDocumentViewTestCase + +from ..events import event_tag_created, event_tag_edited +from ..models import Tag +from ..permissions import permission_tag_create, permission_tag_edit + +from .mixins import TagTestMixin + + +class TagEventsTestCase(TagTestMixin, GenericDocumentViewTestCase): + def test_tag_create_event_no_permissions(self): + self.login_user() + + Action.objects.all().delete() + + response = self._request_tag_create_view() + self.assertEqual(response.status_code, 403) + self.assertEqual(Action.objects.count(), 0) + + def test_tag_create_event_with_permissions(self): + self.login_user() + + Action.objects.all().delete() + + self.grant_permission(permission=permission_tag_create) + + response = self._request_tag_create_view() + + self.assertEqual(response.status_code, 302) + + event = Action.objects.first() + + tag = Tag.objects.first() + + self.assertEqual(event.verb, event_tag_created.id) + self.assertEqual(event.target, tag) + self.assertEqual(event.actor, self.user) + + def test_tag_edit_event_no_permissions(self): + self._create_tag() + + self.login_user() + + Action.objects.all().delete() + + response = self._request_tag_edit_view() + self.assertEqual(response.status_code, 403) + self.assertEqual(Action.objects.count(), 0) + + def test_tag_edit_event_with_access(self): + self._create_tag() + + self.login_user() + + Action.objects.all().delete() + + self.grant_access( + permission=permission_tag_edit, obj=self.tag + ) + + response = self._request_tag_edit_view() + + self.assertEqual(response.status_code, 302) + + event = Action.objects.first() + + self.assertEqual(event.verb, event_tag_edited.id) + self.assertEqual(event.target, self.tag) + self.assertEqual(event.actor, self.user) diff --git a/mayan/apps/tags/views.py b/mayan/apps/tags/views.py index ced3ca0904..678ec5a606 100644 --- a/mayan/apps/tags/views.py +++ b/mayan/apps/tags/views.py @@ -126,6 +126,9 @@ class TagCreateView(SingleObjectCreateView): post_action_redirect = reverse_lazy('tags:tag_list') view_permission = permission_tag_create + def get_save_extra_data(self): + return {'_user': self.request.user} + class TagDeleteActionView(MultipleObjectConfirmActionView): model = Tag @@ -186,6 +189,9 @@ class TagEditView(SingleObjectEditView): 'title': _('Edit tag: %s') % self.get_object(), } + def get_save_extra_data(self): + return {'_user': self.request.user} + class TagListView(SingleObjectListView): object_permission = permission_tag_view