From 08b211519826febcdba7714ffd5d6fa80282a0c2 Mon Sep 17 00:00:00 2001 From: Stephen Finucane Date: Thu, 18 May 2017 23:25:26 +0100 Subject: [PATCH] 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") --- patchwork/api/filters.py | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) 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): -- 2.47.3