Skip to content

Commit

Permalink
fix: DRF issue #6886 with StableOrderingFilter
Browse files Browse the repository at this point in the history
  • Loading branch information
francesco-filicetti committed Sep 28, 2021
1 parent af75ce5 commit 5ea315b
Show file tree
Hide file tree
Showing 8 changed files with 26 additions and 7 deletions.
Binary file not shown.
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ def get_requirements(fname='requirements.txt'):

setup(
name="unicms",
version='0.26.4',
version='0.26.5',
description="uniCMS is a Django Web Content Management System",
long_description=README,
long_description_content_type='text/markdown',
Expand Down
14 changes: 14 additions & 0 deletions src/cms/api/ordering.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from django.core.exceptions import FieldError
from rest_framework.filters import OrderingFilter


# Work around DRF issue #6886 by always adding the primary key as last order field.
class StableOrderingFilter(OrderingFilter):
def get_ordering(self, request, queryset, view):
ordering = super(StableOrderingFilter, self).get_ordering(request, queryset, view)
pk = queryset.model._meta.pk.name
if ordering is None: return [pk,]
for field in queryset.model._meta.fields:
if field.__dict__['name'] == 'order':
return list(ordering) + ['order', pk,]
return list(ordering) + [pk,]
5 changes: 3 additions & 2 deletions src/cms/api/views/generics.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
# set_lock_to_cache,
LOCK_MESSAGE)
from .. exceptions import LoggedPermissionDenied
from .. ordering import StableOrderingFilter
from .. pagination import UniCmsApiPagination, UniCmsSelectOptionsApiPagination


Expand All @@ -29,7 +30,7 @@ class UniCMSListCreateAPIView(generics.ListCreateAPIView):
permission_classes = [IsAdminUser]
filter_backends = [filters.SearchFilter,
DjangoFilterBackend,
filters.OrderingFilter]
StableOrderingFilter]
filterset_fields = ['is_active', 'created', 'modified', 'created_by']
pagination_class = UniCmsApiPagination

Expand Down Expand Up @@ -102,7 +103,7 @@ class UniCMSListSelectOptionsAPIView(generics.ListAPIView):
permission_classes = [IsAdminUser]
filter_backends = [filters.SearchFilter,
DjangoFilterBackend,
filters.OrderingFilter]
StableOrderingFilter]
pagination_class = UniCmsSelectOptionsApiPagination
ordering = ['id']

Expand Down
3 changes: 2 additions & 1 deletion src/cms/api/views/logs.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from rest_framework import filters, generics
from rest_framework.permissions import IsAdminUser

from .. ordering import StableOrderingFilter
from .. pagination import UniCmsApiPagination


Expand All @@ -14,7 +15,7 @@ class ObjectLogEntriesList(generics.ListAPIView):
description = ""
permission_classes = [IsAdminUser]
filter_backends = [filters.SearchFilter,
filters.OrderingFilter]
StableOrderingFilter]
search_fields = ['user__first_name','user__last_name',
'change_message']
pagination_class = UniCmsApiPagination
Expand Down
1 change: 1 addition & 0 deletions src/cms/api/views/page.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
from . generics import UniCMSCachedRetrieveUpdateDestroyAPIView, UniCMSListCreateAPIView, check_locks
from . logs import ObjectLogEntriesList
from .. exceptions import LoggedPermissionDenied
from .. ordering import StableOrderingFilter
from .. pagination import UniCmsApiPagination
from .. serializers import UniCMSFormSerializer

Expand Down
5 changes: 3 additions & 2 deletions src/cms/api/views/template_block.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from rest_framework.permissions import IsAdminUser
from rest_framework.schemas.openapi import AutoSchema

from .. ordering import StableOrderingFilter
from .. pagination import UniCmsApiPagination


Expand All @@ -19,7 +20,7 @@ class TemplatesBlockList(generics.ListAPIView):
permission_classes = [IsAdminUser]
filter_backends = [filters.SearchFilter,
DjangoFilterBackend,
filters.OrderingFilter]
StableOrderingFilter]
filterset_fields = ['is_active', 'created', 'modified']
pagination_class = UniCmsApiPagination
search_fields = ['name', 'description', 'type']
Expand Down Expand Up @@ -48,7 +49,7 @@ class TemplateBlockList(generics.ListAPIView):
permission_classes = [IsAdminUser]
filter_backends = [filters.SearchFilter,
DjangoFilterBackend,
filters.OrderingFilter]
StableOrderingFilter]
filterset_fields = ['is_active', 'created', 'modified']
pagination_class = None
schema = SingleTemplateBlockListSchema()
Expand Down
3 changes: 2 additions & 1 deletion src/cms/api/views/webpath.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
from . generics import UniCMSCachedRetrieveUpdateDestroyAPIView, UniCMSListCreateAPIView, UniCMSListSelectOptionsAPIView
from . logs import ObjectLogEntriesList
from .. exceptions import LoggedPermissionDenied, LoggedValidationException
from .. ordering import StableOrderingFilter
from .. pagination import UniCmsApiPagination
from .. serializers import UniCMSFormSerializer

Expand Down Expand Up @@ -281,7 +282,7 @@ class WebpathAllList(generics.ListAPIView):
permission_classes = [IsAdminUser]
filter_backends = [filters.SearchFilter,
DjangoFilterBackend,
filters.OrderingFilter]
StableOrderingFilter]
filterset_fields = ['is_active', 'created', 'modified', 'created_by']
pagination_class = UniCmsApiPagination

Expand Down

0 comments on commit 5ea315b

Please sign in to comment.