Add document download and document preview event logging. Add corresponding tests. Closes GitLab issue #261.
This commit is contained in:
@@ -7,6 +7,10 @@ from events.classes import Event
|
|||||||
event_document_create = Event(
|
event_document_create = Event(
|
||||||
name='documents_document_create', label=_('Document created')
|
name='documents_document_create', label=_('Document created')
|
||||||
)
|
)
|
||||||
|
event_document_download = Event(
|
||||||
|
name='documents_document_download',
|
||||||
|
label=_('Document download')
|
||||||
|
)
|
||||||
event_document_properties_edit = Event(
|
event_document_properties_edit = Event(
|
||||||
name='documents_document_edit', label=_('Document properties edited')
|
name='documents_document_edit', label=_('Document properties edited')
|
||||||
)
|
)
|
||||||
@@ -20,3 +24,7 @@ event_document_version_revert = Event(
|
|||||||
name='documents_document_version_revert',
|
name='documents_document_version_revert',
|
||||||
label=_('Document version reverted')
|
label=_('Document version reverted')
|
||||||
)
|
)
|
||||||
|
event_document_view = Event(
|
||||||
|
name='documents_document_view',
|
||||||
|
label=_('Document viewed')
|
||||||
|
)
|
||||||
|
|||||||
@@ -0,0 +1,114 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.contrib.contenttypes.models import ContentType
|
||||||
|
from django.test import override_settings
|
||||||
|
from django.utils.six import BytesIO
|
||||||
|
|
||||||
|
from actstream.models import Action
|
||||||
|
|
||||||
|
from common.tests.test_views import GenericViewTestCase
|
||||||
|
from converter.models import Transformation
|
||||||
|
from converter.permissions import permission_transformation_delete
|
||||||
|
from user_management.tests.literals import (
|
||||||
|
TEST_USER_PASSWORD, TEST_USER_USERNAME
|
||||||
|
)
|
||||||
|
|
||||||
|
from ..events import event_document_download, event_document_view
|
||||||
|
from ..literals import DEFAULT_DELETE_PERIOD, DEFAULT_DELETE_TIME_UNIT
|
||||||
|
from ..models import (
|
||||||
|
DeletedDocument, Document, DocumentType, HASH_FUNCTION
|
||||||
|
)
|
||||||
|
from ..permissions import (
|
||||||
|
permission_document_create, permission_document_delete,
|
||||||
|
permission_document_download, permission_document_properties_edit,
|
||||||
|
permission_document_restore, permission_document_tools,
|
||||||
|
permission_document_trash, permission_document_type_create,
|
||||||
|
permission_document_type_delete, permission_document_type_edit,
|
||||||
|
permission_document_type_view, permission_document_version_revert,
|
||||||
|
permission_document_view, permission_empty_trash
|
||||||
|
)
|
||||||
|
|
||||||
|
from .literals import (
|
||||||
|
TEST_DOCUMENT_TYPE, TEST_DOCUMENT_TYPE_QUICK_LABEL,
|
||||||
|
TEST_SMALL_DOCUMENT_CHECKSUM, TEST_SMALL_DOCUMENT_PATH
|
||||||
|
)
|
||||||
|
from .test_views import GenericDocumentViewTestCase
|
||||||
|
|
||||||
|
|
||||||
|
TEST_DOCUMENT_TYPE_EDITED_LABEL = 'test document type edited label'
|
||||||
|
TEST_DOCUMENT_TYPE_2_LABEL = 'test document type 2 label'
|
||||||
|
TEST_TRANSFORMATION_NAME = 'rotate'
|
||||||
|
TEST_TRANSFORMATION_ARGUMENT = 'degrees: 180'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class DocumentEventsTestCase(GenericDocumentViewTestCase):
|
||||||
|
def test_document_download_event_no_permissions(self):
|
||||||
|
self.login(
|
||||||
|
username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD
|
||||||
|
)
|
||||||
|
|
||||||
|
Action.objects.all().delete()
|
||||||
|
|
||||||
|
response = self.post(
|
||||||
|
'documents:document_download', args=(self.document.pk,)
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(response.status_code, 302)
|
||||||
|
self.assertEqual(list(Action.objects.any(obj=self.document)), [])
|
||||||
|
|
||||||
|
def test_document_download_event_with_permissions(self):
|
||||||
|
self.login(
|
||||||
|
username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD
|
||||||
|
)
|
||||||
|
|
||||||
|
Action.objects.all().delete()
|
||||||
|
|
||||||
|
self.role.permissions.add(
|
||||||
|
permission_document_download.stored_permission
|
||||||
|
)
|
||||||
|
response = self.post(
|
||||||
|
'documents:document_download', args=(self.document.pk,),
|
||||||
|
)
|
||||||
|
|
||||||
|
event = Action.objects.any(obj=self.document).first()
|
||||||
|
|
||||||
|
self.assertEqual(event.verb, event_document_download.name)
|
||||||
|
self.assertEqual(event.target, self.document)
|
||||||
|
self.assertEqual(event.actor, self.user)
|
||||||
|
|
||||||
|
def test_document_view_event_no_permissions(self):
|
||||||
|
self.login(
|
||||||
|
username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD
|
||||||
|
)
|
||||||
|
|
||||||
|
Action.objects.all().delete()
|
||||||
|
|
||||||
|
response = self.get(
|
||||||
|
'documents:document_preview', args=(self.document.pk,)
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(response.status_code, 403)
|
||||||
|
self.assertEqual(list(Action.objects.any(obj=self.document)), [])
|
||||||
|
|
||||||
|
def test_document_view_event_with_permissions(self):
|
||||||
|
self.login(
|
||||||
|
username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD
|
||||||
|
)
|
||||||
|
|
||||||
|
Action.objects.all().delete()
|
||||||
|
|
||||||
|
self.role.permissions.add(
|
||||||
|
permission_document_view.stored_permission
|
||||||
|
)
|
||||||
|
response = self.get(
|
||||||
|
'documents:document_preview', args=(self.document.pk,),
|
||||||
|
)
|
||||||
|
|
||||||
|
event = Action.objects.any(obj=self.document).first()
|
||||||
|
|
||||||
|
self.assertEqual(event.verb, event_document_view.name)
|
||||||
|
self.assertEqual(event.target, self.document)
|
||||||
|
self.assertEqual(event.actor, self.user)
|
||||||
@@ -30,6 +30,7 @@ from converter.permissions import permission_transformation_delete
|
|||||||
from filetransfers.api import serve_file
|
from filetransfers.api import serve_file
|
||||||
from permissions import Permission
|
from permissions import Permission
|
||||||
|
|
||||||
|
from .events import event_document_download, event_document_view
|
||||||
from .forms import (
|
from .forms import (
|
||||||
DocumentDownloadForm, DocumentForm, DocumentPageForm, DocumentPreviewForm,
|
DocumentDownloadForm, DocumentForm, DocumentPageForm, DocumentPreviewForm,
|
||||||
DocumentPropertiesForm, DocumentTypeSelectForm,
|
DocumentPropertiesForm, DocumentTypeSelectForm,
|
||||||
@@ -316,6 +317,10 @@ class DocumentPreviewView(SingleObjectDetailView):
|
|||||||
DocumentPreviewView, self
|
DocumentPreviewView, self
|
||||||
).dispatch(request, *args, **kwargs)
|
).dispatch(request, *args, **kwargs)
|
||||||
self.get_object().add_as_recent_document_for_user(request.user)
|
self.get_object().add_as_recent_document_for_user(request.user)
|
||||||
|
event_document_view.commit(
|
||||||
|
actor=request.user, target=self.get_object()
|
||||||
|
)
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def get_extra_context(self):
|
def get_extra_context(self):
|
||||||
@@ -841,6 +846,10 @@ def document_download(request, document_id=None, document_id_list=None, document
|
|||||||
arcname=document_version.document.label
|
arcname=document_version.document.label
|
||||||
)
|
)
|
||||||
descriptor.close()
|
descriptor.close()
|
||||||
|
event_document_download.commit(
|
||||||
|
actor=request.user,
|
||||||
|
target=document_version.document
|
||||||
|
)
|
||||||
|
|
||||||
compressed_file.close()
|
compressed_file.close()
|
||||||
|
|
||||||
@@ -865,6 +874,9 @@ def document_download(request, document_id=None, document_id_list=None, document
|
|||||||
# Test permissions and trigger exception
|
# Test permissions and trigger exception
|
||||||
fd = queryset.first().open()
|
fd = queryset.first().open()
|
||||||
fd.close()
|
fd.close()
|
||||||
|
event_document_download.commit(
|
||||||
|
actor=request.user, target=queryset.first().document
|
||||||
|
)
|
||||||
return serve_file(
|
return serve_file(
|
||||||
request,
|
request,
|
||||||
queryset.first().file,
|
queryset.first().file,
|
||||||
|
|||||||
Reference in New Issue
Block a user