Add the tag created and tag edited events.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
This commit is contained in:
Roberto Rosario
2018-08-26 05:38:21 -04:00
parent e7279a391e
commit de000735ba
7 changed files with 149 additions and 3 deletions

View File

@@ -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)
==================

View File

@@ -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
)
)

View File

@@ -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'
)

View File

@@ -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:

View File

@@ -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
}
)

View File

@@ -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)

View File

@@ -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