From eb48909399f1e9adfd99df8bfa5bd525b223d18f Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Mon, 6 Oct 2014 03:43:51 -0400 Subject: [PATCH] Don't include the documents contained in the tags or folders results, instead provide a separate, paginates tag and folder endpoint --- mayan/apps/folders/api_views.py | 23 ++++++++++++++++++++++- mayan/apps/folders/serializers.py | 11 ++--------- mayan/apps/folders/urls.py | 7 ++++--- mayan/apps/tags/api_views.py | 24 +++++++++++++++++++++++- mayan/apps/tags/serializers.py | 12 ++---------- mayan/apps/tags/urls.py | 4 +++- 6 files changed, 56 insertions(+), 25 deletions(-) diff --git a/mayan/apps/folders/api_views.py b/mayan/apps/folders/api_views.py index 87c0cbc68a..722271170a 100644 --- a/mayan/apps/folders/api_views.py +++ b/mayan/apps/folders/api_views.py @@ -49,6 +49,28 @@ class APIFolderView(generics.RetrieveUpdateDestroyAPIView): } +class APIFolderDocumentListView(generics.ListAPIView): + """ + Returns a list of all the documents contained in a particular folder. + """ + + filter_backends = (MayanObjectPermissionsFilter,) + mayan_object_permissions = {'GET': [PERMISSION_DOCUMENT_VIEW]} + + def get_serializer_class(self): + from documents.serializers import DocumentSerializer + return DocumentSerializer + + def get_queryset(self): + folder = get_object_or_404(Folder, pk=self.kwargs['pk']) + try: + Permission.objects.check_permissions(self.request.user, [PERMISSION_FOLDER_VIEW]) + except PermissionDenied: + AccessEntry.objects.check_access(PERMISSION_FOLDER_VIEW, self.request.user, folder) + + queryset = folder.documents.all() + return queryset + class APIDocumentFolderListView(generics.ListAPIView): """ Returns a list of all the folders to which a document belongs. @@ -56,7 +78,6 @@ class APIDocumentFolderListView(generics.ListAPIView): serializer_class = FolderSerializer - permission_classes = (MayanPermission,) filter_backends = (MayanObjectPermissionsFilter,) mayan_object_permissions = {'GET': [PERMISSION_FOLDER_VIEW]} diff --git a/mayan/apps/folders/serializers.py b/mayan/apps/folders/serializers.py index 100fb91b91..3a7a9dae2a 100644 --- a/mayan/apps/folders/serializers.py +++ b/mayan/apps/folders/serializers.py @@ -6,15 +6,8 @@ from .models import Folder class FolderSerializer(serializers.HyperlinkedModelSerializer): - # FIXME: Doing a: from documents.serializers import DocumentSerializer - # causes an unexplained ImportError, so we import it hidden until the issue - # is resolved - - def __init__(self, *args, **kwargs): - from documents.serializers import DocumentSerializer - super(FolderSerializer, self).__init__(*args, **kwargs) - self.fields['documents'] = DocumentSerializer() + documents = serializers.HyperlinkedIdentityField(view_name='folder-document-list') class Meta: - fields = ('id', 'url', 'title', 'user', 'datetime_created') + fields = ('id', 'url', 'title', 'user', 'datetime_created', 'documents') model = Folder diff --git a/mayan/apps/folders/urls.py b/mayan/apps/folders/urls.py index 9ce888c2f2..0bff9f4feb 100644 --- a/mayan/apps/folders/urls.py +++ b/mayan/apps/folders/urls.py @@ -1,7 +1,7 @@ from django.conf.urls import patterns, url -from .api_views import (APIDocumentFolderListView, APIFolderListView, - APIFolderView) +from .api_views import (APIDocumentFolderListView, APIFolderDocumentListView, + APIFolderListView, APIFolderView) from .views import FolderDetailView, FolderListView urlpatterns = patterns('folders.views', @@ -20,7 +20,8 @@ urlpatterns = patterns('folders.views', ) api_urls = patterns('', - url(r'^folders/$', APIFolderListView.as_view(), name='folder-list'), + url(r'^folders/(?P[0-9]+)/documents/$', APIFolderDocumentListView.as_view(), name='folder-document-list'), url(r'^folders/(?P[0-9]+)/$', APIFolderView.as_view(), name='folder-detail'), + url(r'^folders/$', APIFolderListView.as_view(), name='folder-list'), url(r'^document/(?P[0-9]+)/folders/$', APIDocumentFolderListView.as_view(), name='document-folder-list'), ) diff --git a/mayan/apps/tags/api_views.py b/mayan/apps/tags/api_views.py index 602d36f43b..d94f4f12b9 100644 --- a/mayan/apps/tags/api_views.py +++ b/mayan/apps/tags/api_views.py @@ -39,6 +39,29 @@ class APITagListView(generics.ListAPIView): mayan_object_permissions = {'GET': [PERMISSION_TAG_VIEW]} +class APITagDocumentListView(generics.ListAPIView): + """ + Returns a list of all the documents tagged by a particular tag. + """ + + filter_backends = (MayanObjectPermissionsFilter,) + mayan_object_permissions = {'GET': [PERMISSION_DOCUMENT_VIEW]} + + def get_serializer_class(self): + from documents.serializers import DocumentSerializer + return DocumentSerializer + + def get_queryset(self): + tag = get_object_or_404(Tag, pk=self.kwargs['pk']) + try: + Permission.objects.check_permissions(self.request.user, [PERMISSION_TAG_VIEW]) + except PermissionDenied: + AccessEntry.objects.check_access(PERMISSION_TAG_VIEW, self.request.user, tag) + + queryset = tag.documents.all() + return queryset + + class APIDocumentTagListView(generics.ListAPIView): """ Returns a list of all the tags attached to a document. @@ -46,7 +69,6 @@ class APIDocumentTagListView(generics.ListAPIView): serializer_class = TagSerializer - permission_classes = (MayanPermission,) filter_backends = (MayanObjectPermissionsFilter,) mayan_object_permissions = {'GET': [PERMISSION_TAG_VIEW]} diff --git a/mayan/apps/tags/serializers.py b/mayan/apps/tags/serializers.py index 9bba498440..bb5748c62f 100644 --- a/mayan/apps/tags/serializers.py +++ b/mayan/apps/tags/serializers.py @@ -5,17 +5,9 @@ from taggit.models import Tag class TagSerializer(serializers.HyperlinkedModelSerializer): - # FIXME: Doing a: from documents.serializers import DocumentSerializer - # causes an unexplained ImportError, so we import it hidden until the issue - # is resolved - - def __init__(self, *args, **kwargs): - from documents.serializers import DocumentSerializer - super(TagSerializer, self).__init__(*args, **kwargs) - self.fields['documents'] = DocumentSerializer() - color = serializers.CharField(source='properties.get.color') + documents = serializers.HyperlinkedIdentityField(view_name='tag-document-list') class Meta: - fields = ('id', 'url', 'name', 'color', 'slug') + fields = ('id', 'url', 'name', 'color', 'slug', 'documents') model = Tag diff --git a/mayan/apps/tags/urls.py b/mayan/apps/tags/urls.py index 90673f6418..cfd0195df8 100644 --- a/mayan/apps/tags/urls.py +++ b/mayan/apps/tags/urls.py @@ -2,7 +2,8 @@ from __future__ import absolute_import from django.conf.urls import patterns, url -from .api_views import APIDocumentTagListView, APITagListView, APITagView +from .api_views import (APIDocumentTagListView, APITagDocumentListView, + APITagListView, APITagView) from .views import TagTaggedItemListView urlpatterns = patterns('tags.views', @@ -25,6 +26,7 @@ urlpatterns = patterns('tags.views', ) api_urls = patterns('', + url(r'^tags/(?P[0-9]+)/documents/$', APITagDocumentListView.as_view(), name='tag-document-list'), url(r'^tags/(?P[0-9]+)/$', APITagView.as_view(), name='tag-detail'), url(r'^tags/$', APITagListView.as_view(), name='tag-list'), url(r'^document/(?P[0-9]+)/tags/$', APIDocumentTagListView.as_view(), name='document-tag-list'),