diff --git a/mayan/apps/documents/apps.py b/mayan/apps/documents/apps.py index 26d62cd113..23ddaaf816 100644 --- a/mayan/apps/documents/apps.py +++ b/mayan/apps/documents/apps.py @@ -22,6 +22,7 @@ from converter.permissions import ( permission_transformation_delete, permission_transformation_edit, permission_transformation_view, ) +from events.links import link_events_for_object from events.permissions import permission_events_view from mayan.celery import app from navigation import SourceColumn @@ -32,11 +33,10 @@ from .handlers import create_default_document_type from .links import ( link_clear_image_cache, link_document_clear_transformations, link_document_delete, link_document_document_type_edit, - link_document_events_view, link_document_multiple_document_type_edit, - link_document_download, link_document_edit, link_document_list, - link_document_list_deleted, link_document_list_recent, - link_document_multiple_delete, link_document_multiple_trash, - link_document_multiple_clear_transformations, + link_document_multiple_document_type_edit, link_document_download, + link_document_edit, link_document_list, link_document_list_deleted, + link_document_list_recent, link_document_multiple_delete, + link_document_multiple_trash, link_document_multiple_clear_transformations, link_document_multiple_download, link_document_multiple_restore, link_document_multiple_update_page_count, link_document_page_navigation_first, link_document_page_navigation_last, @@ -147,7 +147,7 @@ class DocumentsApp(MayanAppConfig): menu_facet.bind_links(links=[link_acl_list], sources=[Document]) menu_facet.bind_links(links=[link_document_preview], sources=[Document], position=0) menu_facet.bind_links(links=[link_document_properties], sources=[Document], position=2) - menu_facet.bind_links(links=[link_document_events_view, link_document_version_list], sources=[Document], position=2) + menu_facet.bind_links(links=[link_events_for_object, link_document_version_list], sources=[Document], position=2) menu_facet.bind_links(links=[link_document_pages], sources=[Document]) # Document actions diff --git a/mayan/apps/documents/links.py b/mayan/apps/documents/links.py index 9df9a91d33..bb12cf2706 100644 --- a/mayan/apps/documents/links.py +++ b/mayan/apps/documents/links.py @@ -3,7 +3,6 @@ from __future__ import absolute_import, unicode_literals from django.utils.translation import ugettext_lazy as _ from converter.permissions import permission_transformation_delete -from events.permissions import permission_events_view from navigation import Link from .permissions import ( @@ -39,7 +38,6 @@ def is_min_zoom(context): # Facet -link_document_events_view = Link(permissions=[permission_events_view], text=_('Events'), view='events:events_for_object', args=['"documents"', '"document"', 'object.id']) link_document_preview = Link(permissions=[permission_document_view], text=_('Preview'), view='documents:document_preview', args='object.id') link_document_properties = Link(permissions=[permission_document_view], text=_('Properties'), view='documents:document_properties', args='object.id') link_document_version_list = Link(permissions=[permission_document_view], text=_('Versions'), view='documents:document_version_list', args='object.pk') diff --git a/mayan/apps/events/links.py b/mayan/apps/events/links.py index 4980f44185..412ebbd947 100644 --- a/mayan/apps/events/links.py +++ b/mayan/apps/events/links.py @@ -1,7 +1,20 @@ from __future__ import unicode_literals +from django.contrib.contenttypes.models import ContentType from django.utils.translation import ugettext_lazy as _ from navigation import Link -link_events_list = Link(icon='fa fa-list-ol', text=_('Events'), view='events:events_list') +from .permissions import permission_events_view + + +def get_kwargs_factory(variable_name): + def get_kwargs(context): + content_type = ContentType.objects.get_for_model(context[variable_name]) + return {'app_label': '"{}"'.format(content_type.app_label), 'model': '"{}"'.format(content_type.model), 'object_id': '{}.pk'.format(variable_name)} + + return get_kwargs + + +link_events_list = Link(icon='fa fa-list-ol', permissions=[permission_events_view], text=_('Events'), view='events:events_list') +link_events_for_object = Link(permissions=[permission_events_view], text=_('Events'), view='events:events_for_object', kwargs=get_kwargs_factory('resolved_object')) diff --git a/mayan/apps/events/urls.py b/mayan/apps/events/urls.py index 820e84743b..b45abfc062 100644 --- a/mayan/apps/events/urls.py +++ b/mayan/apps/events/urls.py @@ -2,9 +2,11 @@ from __future__ import unicode_literals from django.conf.urls import patterns, url +from .views import EventListView, ObjectEventListView, VerbEventListView + urlpatterns = patterns( 'events.views', - url(r'^all/$', 'events_list', name='events_list'), - url(r'^for_object/(?P[\w\-]+)/(?P[\w\-]+)/(?P\d+)/$', 'events_list', name='events_for_object'), - url(r'^by_verb/(?P[\w\-]+)/$', 'events_list', name='events_by_verb'), + url(r'^all/$', EventListView.as_view(), name='events_list'), + url(r'^for/(?P[-\w]+)/(?P[-\w]+)/(?P\d+)/$', ObjectEventListView.as_view(), name='events_for_object'), + url(r'^by_verb/(?P[\w\-]+)/$', VerbEventListView.as_view(), name='events_by_verb'), ) diff --git a/mayan/apps/events/views.py b/mayan/apps/events/views.py index e2373249a2..b7e4641a0c 100644 --- a/mayan/apps/events/views.py +++ b/mayan/apps/events/views.py @@ -1,5 +1,6 @@ from __future__ import absolute_import, unicode_literals +from django.contrib.contenttypes.models import ContentType from django.core.exceptions import PermissionDenied from django.db.models.loading import get_model from django.http import Http404 @@ -11,6 +12,7 @@ from actstream.models import Action, any_stream from acls.models import AccessControlList from common.utils import encapsulate +from common.views import SingleObjectListView from permissions import Permission from .classes import Event @@ -18,71 +20,66 @@ from .permissions import permission_events_view from .widgets import event_object_link -def events_list(request, app_label=None, module_name=None, object_id=None, verb=None): - extra_columns = [] +class EventListView(SingleObjectListView): + view_permission = permission_events_view - context = { - 'extra_columns': extra_columns, - 'hide_object': True, - } + def get_queryset(self): + return Action.objects.all() - if app_label and module_name and object_id: - model = get_model(app_label, module_name) - if not model: - raise Http404 - content_object = get_object_or_404(model, pk=object_id) - - try: - Permission.check_permissions(request.user, [permission_events_view]) - except PermissionDenied: - AccessControlList.objects.check_access(permission_events_view, request.user, content_object) - - context.update({ - 'object_list': any_stream(content_object), - 'title': _('Events for: %s') % content_object, - 'object': content_object - }) - elif verb: - pre_object_list = Action.objects.filter(verb=verb) - - try: - Permission.check_permissions(request.user, [permission_events_view]) - except PermissionDenied: - # If user doesn't have global permission, get a list of document - # for which he/she does hace access use it to filter the - # provided object_list - object_list = AccessControlList.objects.filter_by_access(permission_events_view, request.user, pre_object_list, related='content_object') - else: - object_list = pre_object_list - - context.update({ - 'title': _('Events of type: %s') % Event.get_label(verb), - 'object_list': object_list - }) - else: - pre_object_list = Action.objects.all() - - try: - Permission.check_permissions(request.user, [permission_events_view]) - except PermissionDenied: - # If user doesn't have global permission, get a list of document - # for which he/she does hace access use it to filter the - # provided object_list - object_list = AccessControlList.objects.filter_by_access(permission_events_view, request.user, pre_object_list, related='content_object') - else: - object_list = pre_object_list - - context.update({ + def get_extra_context(self): + return { + 'extra_columns': [ + { + 'name': _('Target'), + 'attribute': encapsulate(lambda entry: event_object_link(entry)) + } + ], + 'hide_object': True, 'title': _('Events'), - 'object_list': object_list - }) + } - if not (app_label and module_name and object_id): - extra_columns.append( - { - 'name': _('Target'), - 'attribute': encapsulate(lambda entry: event_object_link(entry)) - } - ) - return render_to_response('appearance/generic_list.html', context, - context_instance=RequestContext(request)) + +class ObjectEventListView(EventListView): + view_permissions = None + + def dispatch(self, request, *args, **kwargs): + self.content_type = get_object_or_404(ContentType, app_label=self.kwargs['app_label'], model=self.kwargs['model']) + + try: + self.content_object = self.content_type.get_object_for_this_type(pk=self.kwargs['object_id']) + except self.content_type.model_class().DoesNotExist: + raise Http404 + + try: + Permission.check_permissions(request.user, permissions=(permission_events_view,)) + except PermissionDenied: + AccessControlList.objects.check_access(permission_events_view, request.user, self.content_object) + + return super(ObjectEventListView, self).dispatch(request, *args, **kwargs) + + def get_queryset(self): + return any_stream(self.content_object) + + def extra_context(self): + return { + 'hide_object': True, + 'object': self.content_object, + 'title': _('Events for: %s') % self.content_object, + } + + +class VerbEventListView(SingleObjectListView): + def get_queryset(self): + return Action.objects.filter(verb=self.kwargs['verb']) + + def get_extra_context(self): + return { + 'extra_columns': [ + { + 'name': _('Target'), + 'attribute': encapsulate(lambda entry: event_object_link(entry)) + } + ], + 'hide_object': True, + 'title': _('Events of type: %s') % Event.get_label(self.kwargs['verb']), + }