]> git.ipfire.org Git - thirdparty/patchwork.git/commitdiff
REST: Integrate django-filter support
authorStephen Finucane <stephen@that.guru>
Fri, 11 Nov 2016 23:19:32 +0000 (23:19 +0000)
committerStephen Finucane <stephen@that.guru>
Sun, 22 Jan 2017 21:49:19 +0000 (21:49 +0000)
This mostly works out of the box, thanks to Django REST Framework.
Mostly unique fields, like name or email, are excluded as these will be
handled separately.

Signed-off-by: Stephen Finucane <stephen@that.guru>
patchwork/api/check.py
patchwork/api/cover.py
patchwork/api/filters.py [new file with mode: 0644]
patchwork/api/patch.py
patchwork/api/series.py
patchwork/settings/base.py
requirements-prod.txt
requirements-test.txt

index a66106e814c2a0b23dc9246231ca5dbdcad11363..dcdc5c5df067cb28997fb7009aaa2097affe1931 100644 (file)
@@ -27,6 +27,7 @@ from rest_framework.serializers import HyperlinkedModelSerializer
 from rest_framework.serializers import HyperlinkedIdentityField
 
 from patchwork.api.base import MultipleFieldLookupMixin
+from patchwork.api.filters import CheckFilter
 from patchwork.models import Check
 from patchwork.models import Patch
 
@@ -89,6 +90,7 @@ class CheckMixin(object):
 
     queryset = Check.objects.prefetch_related('patch', 'user')
     serializer_class = CheckSerializer
+    filter_class = CheckFilter
 
 
 class CheckListCreate(CheckMixin, ListCreateAPIView):
index b440d5110ec0f3fc8e70d22ebf3c4968c17f39fa..6374ce9e0ab68a50654b870f96201411d350ea44 100644 (file)
@@ -26,6 +26,7 @@ from rest_framework.serializers import HyperlinkedModelSerializer
 from rest_framework.serializers import HyperlinkedRelatedField
 from rest_framework.serializers import SerializerMethodField
 
+from patchwork.api.filters import CoverLetterFilter
 from patchwork.models import CoverLetter
 
 
@@ -66,6 +67,7 @@ class CoverLetterList(ListAPIView):
     """List cover letters."""
 
     serializer_class = CoverLetterListSerializer
+    filter_class = CoverLetterFilter
 
     def get_queryset(self):
         qs = CoverLetter.objects.all().prefetch_related('series')\
diff --git a/patchwork/api/filters.py b/patchwork/api/filters.py
new file mode 100644 (file)
index 0000000..5f237b4
--- /dev/null
@@ -0,0 +1,62 @@
+# Patchwork - automated patch tracking system
+# Copyright (C) 2017 Stephen Finucane <stephen@that.guru>
+#
+# This file is part of the Patchwork package.
+#
+# Patchwork is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# Patchwork is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Patchwork; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+from django_filters import FilterSet
+from django_filters import IsoDateTimeFilter
+
+from patchwork.models import Check
+from patchwork.models import CoverLetter
+from patchwork.models import Patch
+from patchwork.models import Series
+
+
+class TimestampMixin(object):
+
+    # TODO(stephenfin): These should filter on a 'updated_at' field instead
+    before = IsoDateTimeFilter(name='date', lookup_expr='lt')
+    since = IsoDateTimeFilter(name='date', lookup_expr='gte')
+
+
+class SeriesFilter(TimestampMixin, FilterSet):
+
+    class Meta:
+        model = Series
+        fields = ('submitter',)
+
+
+class CoverLetterFilter(TimestampMixin, FilterSet):
+
+    class Meta:
+        model = CoverLetter
+        fields = ('project', 'series', 'submitter')
+
+
+class PatchFilter(FilterSet):
+
+    class Meta:
+        model = Patch
+        fields = ('project', 'series', 'submitter', 'delegate', 'state',
+                  'archived')
+
+
+class CheckFilter(TimestampMixin, FilterSet):
+
+    class Meta:
+        model = Check
+        fields = ('user', 'state', 'context')
index e78f683d866afe374ec213463ac37a0da882f5e5..d12464f9092b3a06b32e18e150edbfca2042fc2d 100644 (file)
@@ -29,6 +29,7 @@ from rest_framework.serializers import SerializerMethodField
 
 from patchwork.api.base import PatchworkPermission
 from patchwork.api.base import STATE_CHOICES
+from patchwork.api.filters import PatchFilter
 from patchwork.models import Patch
 from patchwork.models import State
 
@@ -117,6 +118,7 @@ class PatchList(ListAPIView):
 
     permission_classes = (PatchworkPermission,)
     serializer_class = PatchListSerializer
+    filter_class = PatchFilter
 
     def get_queryset(self):
         return Patch.objects.all().with_tag_counts()\
index 44cf87f9d9b44bf6362cde5f6021535eb5228e2a..dc360d53bf20c8b44908ae9377d7fd8ccc4917d6 100644 (file)
@@ -22,6 +22,7 @@ from rest_framework.generics import RetrieveAPIView
 from rest_framework.serializers import HyperlinkedModelSerializer
 
 from patchwork.api.base import PatchworkPermission
+from patchwork.api.filters import SeriesFilter
 from patchwork.models import Series
 
 
@@ -56,7 +57,7 @@ class SeriesMixin(object):
 class SeriesList(SeriesMixin, ListAPIView):
     """List series."""
 
-    pass
+    filter_class = SeriesFilter
 
 
 class SeriesDetail(SeriesMixin, RetrieveAPIView):
index b7b10c37dbba89708b2ecb5bf8ae6030b0f8f347..35b85c7d41dfecda9db13fe8997228b86134015a 100644 (file)
@@ -133,7 +133,8 @@ try:
     import rest_framework  # NOQA
 
     INSTALLED_APPS += [
-        'rest_framework'
+        'rest_framework',
+        'django_filters',
     ]
 except ImportError:
     pass
@@ -143,6 +144,9 @@ REST_FRAMEWORK = {
     'DEFAULT_VERSIONING_CLASS':
         'rest_framework.versioning.NamespaceVersioning',
     'DEFAULT_PAGINATION_CLASS': 'patchwork.api.base.LinkHeaderPagination',
+    'DEFAULT_FILTER_BACKENDS': (
+        'django_filters.rest_framework.DjangoFilterBackend',
+    ),
 }
 
 #
index 5f3b814b5911f89b686a99aaf370036e981b600b..a8fb5306c60ee31e9fe27b8ae2e47f16df3c0f89 100644 (file)
@@ -1,4 +1,5 @@
 Django>=1.8,<1.11
 djangorestframework>=3.5,<3.6
+django-filter>=1.0,<1.1
 psycopg2>2.6,<2.7
 sqlparse==0.2.2
index aa756f5ae261d39df252603b41ca609a9948d1db..55713effed46cc0ec0c5e2a9d90a5e8fe702bf8b 100644 (file)
@@ -2,3 +2,4 @@ mysqlclient>=1.3,<1.4  # replace this with psycopg2 for a PostgreSQL backend
 django-debug-toolbar==1.6
 python-dateutil>2.0,<3.0
 selenium>=3.0,<3.1
+django-filter>=1.0,<1.1