Refactor the events app API

Use viewsets for the events app API.

Use new link badge support for the unread notification
count display.

Remove AJAX workers support now that it is now needed
anymore.

Signed-off-by: Roberto Rosario <Roberto.Rosario@mayan-edms.com>
This commit is contained in:
Roberto Rosario
2019-02-22 03:57:07 -04:00
parent 5a8e691388
commit ef415ef826
5 changed files with 91 additions and 92 deletions

View File

@@ -1,17 +1,14 @@
from __future__ import absolute_import, unicode_literals
from django.contrib.contenttypes.models import ContentType
from django.http import Http404
from django.shortcuts import get_object_or_404
from actstream.models import Action, any_stream
from rest_framework import generics, viewsets
from actstream.models import any_stream
from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework.decorators import action
from mayan.apps.acls.models import AccessControlList
from mayan.apps.common.mixins import ContentTypeViewMixin, ExternalObjectMixin
from mayan.apps.rest_api.viewsets import MayanAPIReadOnlyModelViewSet
from .classes import EventType, EventTypeNamespace
from .classes import EventTypeNamespace
from .models import Notification
from .permissions import permission_events_view
from .serializers import (
@@ -20,7 +17,6 @@ from .serializers import (
)
class EventTypeNamespaceAPIViewSet(viewsets.ReadOnlyModelViewSet):
lookup_field = 'name'
lookup_url_kwarg = 'event_type_namespace_name'
@@ -64,46 +60,12 @@ class EventTypeAPIViewSet(viewsets.ReadOnlyModelViewSet):
return event_types.get(self.kwargs['event_type_id'])
'''
class APIObjectEventListView(generics.ListAPIView):
"""
get: Return a list of events for the specified object.
"""
serializer_class = EventSerializer
def get_object(self):
content_type = get_object_or_404(
klass=ContentType, app_label=self.kwargs['app_label'],
model=self.kwargs['model']
)
try:
return content_type.get_object_for_this_type(
pk=self.kwargs['object_id']
)
except content_type.model_class().DoesNotExist:
raise Http404
def get_queryset(self):
obj = self.get_object()
AccessControlList.objects.check_access(
permissions=permission_events_view, user=self.request.user,
obj=obj
)
return any_stream(obj)
class APINotificationListView(generics.ListAPIView):
"""
get: Return a list of notifications for the current user.
"""
class NotificationAPIViewSet(MayanAPIReadOnlyModelViewSet):
serializer_class = NotificationSerializer
def get_queryset(self):
parameter_read = self.request.GET.get('read')
query_parameter = 'read'
parameter_read = self.request.GET.get(query_parameter)
if self.request.user.is_authenticated:
queryset = Notification.objects.filter(user=self.request.user)
@@ -116,4 +78,24 @@ class APINotificationListView(generics.ListAPIView):
queryset = queryset.filter(read=False)
return queryset
'''
class ObjectEventAPIViewSet(ContentTypeViewMixin, ExternalObjectMixin, MayanAPIReadOnlyModelViewSet):
content_type_url_kw_args = {
'app_label': 'app_label',
'model': 'model_name'
}
external_object_permission = permission_events_view
external_object_pk_url_kwarg = 'object_id'
serializer_class = EventSerializer
def get_external_object_queryset(self):
# Here we get a queryset the object model for which the event
# will be accessed.
return self.get_content_type().get_all_objects_for_this_type()
def get_queryset(self):
obj = self.get_external_object()
return any_stream(obj)

View File

@@ -31,6 +31,13 @@ def get_kwargs_factory(variable_name):
return get_kwargs
def get_unread_notification_count(context):
Notification = apps.get_model(
app_label='events', model_name='Notification'
)
return Notification.objects.filter(user=context.request.user).filter(read=False).count()
link_current_user_events = Link(
icon_class=icon_events_list, text=_('My events'),
view='events:current_user_events'
@@ -67,10 +74,7 @@ link_object_event_types_user_subcriptions_list = Link(
view='events:object_event_types_user_subcriptions_list',
)
link_user_notifications_list = Link(
html_data={
'apw-attribute': 'count', 'apw-interval': '5000',
'apw-url': '/api/notifications/?read=False',
'apw-callback': 'MayanAppClass.mayanNotificationBadge'
}, icon_class=icon_user_notifications_list, text='',
badge_text=get_unread_notification_count,
icon_class=icon_user_notifications_list,
view='events:user_notifications_list'
)

View File

@@ -4,4 +4,3 @@ TEST_EVENT_TYPE_NAMESPACE_LABEL = 'test event type namespace label'
TEST_EVENT_TYPE_NAMESPACE_NAME = 'test_event_type_namespace_name'
TEST_EVENT_TYPE_LABEL = 'test event type label'
TEST_EVENT_TYPE_NAME = 'test_event_type_name'

View File

@@ -1,7 +1,14 @@
from __future__ import unicode_literals
from django.contrib.contenttypes.models import ContentType
from rest_framework import status
from mayan.apps.documents.tests.mixins import DocumentTestMixin
from mayan.apps.rest_api.tests import BaseAPITestCase
from ..permissions import permission_events_view
from .mixins import EventTypeTestMixin
@@ -12,7 +19,7 @@ class EventTypeNamespaceAPITestCase(EventTypeTestMixin, BaseAPITestCase):
def test_event_type_namespace_list_view(self):
response = self.get(viewname='rest_api:event_type_namespace-list')
self.assertEqual(response.status_code, 200)
self.assertEqual(response.status_code, status.HTTP_200_OK)
def test_event_type_namespace_event_type_list_view(self):
response = self.get(
@@ -22,7 +29,7 @@ class EventTypeNamespaceAPITestCase(EventTypeTestMixin, BaseAPITestCase):
}
)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.status_code, status.HTTP_200_OK)
def test_event_type_list_view(self):
response = self.get(
@@ -32,4 +39,35 @@ class EventTypeNamespaceAPITestCase(EventTypeTestMixin, BaseAPITestCase):
'event_type_id': self.test_event_type.id
}
)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.status_code, status.HTTP_200_OK)
class DocumentEventAPITestCase(DocumentTestMixin, BaseAPITestCase):
def setUp(self):
super(DocumentEventAPITestCase, self).setUp()
self.test_object = self.test_document
def _request_object_event_list_api_view(self):
content_type = ContentType.objects.get_for_model(
model=self.test_object
)
return self.get(
viewname='rest_api:object-event-list',
kwargs={
'app_label': content_type.app_label,
'model_name': content_type.model,
'object_id': self.test_object.pk
}
)
def test_object_event_list_view_no_permission(self):
response = self._request_object_event_list_api_view()
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
def test_object_event_list_view_with_access(self):
self.grant_access(
obj=self.test_object, permission=permission_events_view
)
response = self._request_object_event_list_api_view()
self.assertEqual(response.status_code, status.HTTP_200_OK)

View File

@@ -2,7 +2,10 @@ from __future__ import unicode_literals
from django.conf.urls import url
from .api_views import EventTypeAPIViewSet, EventTypeNamespaceAPIViewSet
from .api_views import (
EventTypeAPIViewSet, EventTypeNamespaceAPIViewSet, NotificationAPIViewSet,
ObjectEventAPIViewSet
)
from .views import (
CurrentUserEventListView, EventListView, EventTypeSubscriptionListView,
NotificationListView, NotificationMarkRead, NotificationMarkReadAll,
@@ -49,7 +52,6 @@ urlpatterns = [
)
]
api_router_entries = (
{
'prefix': r'event_type_namespaces', 'viewset': EventTypeNamespaceAPIViewSet,
@@ -59,38 +61,12 @@ api_router_entries = (
'prefix': r'event_type_namespaces/(?P<event_type_namespace_name>[^/.]+)/event_types',
'viewset': EventTypeAPIViewSet, 'basename': 'event_type'
},
#{'prefix': r'roles', 'viewset': RoleAPIViewSet, 'basename': 'role'},
{
'prefix': r'apps/(?P<app_label>[^/.]+)/models/(?P<model_name>[^/.]+)/objects/(?P<object_id>\d+)/events',
'viewset': ObjectEventAPIViewSet, 'basename': 'object-event'
},
{
'prefix': r'notifications', 'viewset': NotificationAPIViewSet,
'basename': 'notification'
}
)
'''
api_urls = [
url(
regex=r'^event_type_namespaces/(?P<name>[-\w]+)/$',
name='event-type-namespace-detail',
view=APIEventTypeNamespaceDetailView.as_view()
),
url(
regex=r'^event_type_namespaces/(?P<name>[-\w]+)/event_types/$',
name='event-type-namespace-event-type-list',
view=APIEventTypeNamespaceEventTypeListView.as_view()
),
url(
regex=r'^event_type_namespaces/$', name='event-type-namespace-list',
view=APIEventTypeNamespaceListView.as_view()
),
url(
regex=r'^event_types/$', name='event-type-list',
view=APIEventTypeListView.as_view()
),
url(regex=r'^events/$', name='event-list', view=APIEventListView.as_view()),
url(
regex=r'^notifications/$', name='notification-list',
view=APINotificationListView.as_view()
),
url(
regex=r'^objects/(?P<app_label>[-\w]+)/(?P<model>[-\w]+)/(?P<object_id>\d+)/events/$',
name='object-event-list', view=APIObjectEventListView.as_view()
)
]
'''