from django.forms import ModelMultipleChoiceField as BaseMultipleChoiceField
from django.forms.widgets import MultipleHiddenInput
+from patchwork.api import utils
from patchwork.compat import NAME_FIELD
from patchwork.models import Bundle
from patchwork.models import Check
# filter sets
-class TimestampMixin(FilterSet):
+
+class BaseFilterSet(FilterSet):
+
+ @property
+ def form(self):
+ form = super(BaseFilterSet, self).form
+
+ for version in getattr(self.Meta, 'versioned_fields', {}):
+ if utils.has_version(self.request, version):
+ continue
+
+ for field in self.Meta.versioned_fields[version]:
+ if field in form.fields:
+ del form.fields[field]
+
+ return form
+
+
+class TimestampMixin(BaseFilterSet):
# TODO(stephenfin): These should filter on a 'updated_at' field instead
before = IsoDateTimeFilter(lookup_expr='lt', **{NAME_FIELD: 'date'})
since = IsoDateTimeFilter(lookup_expr='gte', **{NAME_FIELD: 'date'})
-class SeriesFilterSet(TimestampMixin, FilterSet):
+class SeriesFilterSet(TimestampMixin, BaseFilterSet):
submitter = PersonFilter(queryset=Person.objects.all())
project = ProjectFilter(queryset=Project.objects.all())
fields = ('submitter', 'project')
-class CoverLetterFilterSet(TimestampMixin, FilterSet):
+class CoverLetterFilterSet(TimestampMixin, BaseFilterSet):
project = ProjectFilter(queryset=Project.objects.all())
# NOTE(stephenfin): We disable the select-based HTML widgets for these
fields = ('project', 'series', 'submitter')
-class PatchFilterSet(TimestampMixin, FilterSet):
+class PatchFilterSet(TimestampMixin, BaseFilterSet):
project = ProjectFilter(queryset=Project.objects.all())
# NOTE(stephenfin): We disable the select-based HTML widgets for these
# which seems to rather defeat the point of using django-filters.
fields = ('project', 'series', 'submitter', 'delegate',
'state', 'archived', 'hash')
+ versioned_fields = {
+ '1.2': ('hash', ),
+ }
-class CheckFilterSet(TimestampMixin, FilterSet):
+class CheckFilterSet(TimestampMixin, BaseFilterSet):
user = UserFilter(queryset=User.objects.all())
fields = ('user', 'state', 'context')
-class EventFilterSet(TimestampMixin, FilterSet):
+class EventFilterSet(TimestampMixin, BaseFilterSet):
# NOTE(stephenfin): We disable the select-based HTML widgets for these
# filters as the resulting query is _huge_
fields = ('project', 'category', 'series', 'patch', 'cover')
-class BundleFilterSet(FilterSet):
+class BundleFilterSet(BaseFilterSet):
project = ProjectFilter(queryset=Project.objects.all())
owner = UserFilter(queryset=User.objects.all())
'hash': 'da638d0746a115000bf890fada1f02679aa282e8'})
self.assertEqual(0, len(resp.data))
+ def test_list_filter_hash_version_1_1(self):
+ """Filter patches by hash using API v1.1."""
+ self._create_patch()
+
+ # we still see the patch since the hash field is ignored
+ resp = self.client.get(self.api_url(version='1.1'),
+ {'hash': 'garbagevalue'})
+ self.assertEqual(1, len(resp.data))
+
@utils.store_samples('patch-list-1-0')
def test_list_version_1_0(self):
"""List patches using API v1.0."""