From: Stephen Finucane Date: Thu, 18 May 2017 22:25:26 +0000 (+0100) Subject: REST: Allow filtering by both project ID and linkname X-Git-Tag: v2.0.0-rc2^0 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=08b211519826febcdba7714ffd5d6fa80282a0c2;p=thirdparty%2Fpatchwork.git REST: Allow filtering by both project ID and linkname In hindsight, it's a bit odd that we would filter project by linkname by everything else by ID. Simply support both. Signed-off-by: Stephen Finucane Fixes: e27b68a ("REST: Filter on Project.linkname - not Project.pk") --- diff --git a/patchwork/api/filters.py b/patchwork/api/filters.py index 00efc999..3dc215c0 100644 --- a/patchwork/api/filters.py +++ b/patchwork/api/filters.py @@ -41,10 +41,34 @@ class TimestampMixin(FilterSet): since = IsoDateTimeFilter(name='date', **{LOOKUP_FIELD: 'gte'}) +class ProjectChoiceField(ModelChoiceField): + + def to_python(self, value): + if value in self.empty_values: + return None + + try: + filters = {'pk': int(value)} + except ValueError: + filters = {'name__iexact': ' '.join(value.split('-'))} + + try: + value = self.queryset.get(**filters) + except (ValueError, TypeError, self.queryset.model.DoesNotExist): + raise ValidationError(self.error_messages['invalid_choice'], + code='invalid_choice') + return value + + +class ProjectFilter(ModelChoiceFilter): + + field_class = ProjectChoiceField + + class ProjectMixin(FilterSet): - project = ModelChoiceFilter(to_field_name='linkname', - queryset=Project.objects.all()) + project = ProjectFilter(to_field_name='linkname', + queryset=Project.objects.all()) class SeriesFilter(ProjectMixin, TimestampMixin, FilterSet):