[PATCH 1/4] REST: move StateField to a new 'field' module
Philippe Pepiot
phil at philpep.org
Mon Jul 17 05:32:09 AEST 2017
So it can be reused in multiple modules avoiding circular imports.
Signed-off-by: Philippe Pepiot <phil at philpep.org>
---
patchwork/api/embedded.py | 1 +
patchwork/api/fields.py | 61 +++++++++++++++++++++++++++++++++++++++++++++++
patchwork/api/patch.py | 42 +-------------------------------
3 files changed, 63 insertions(+), 41 deletions(-)
create mode 100644 patchwork/api/fields.py
diff --git a/patchwork/api/embedded.py b/patchwork/api/embedded.py
index 122422a..ada8ad5 100644
--- a/patchwork/api/embedded.py
+++ b/patchwork/api/embedded.py
@@ -28,6 +28,7 @@ from rest_framework.serializers import HyperlinkedModelSerializer
from rest_framework.serializers import SerializerMethodField
from patchwork.api.base import CheckHyperlinkedIdentityField
+from patchwork.api.fields import StateField
from patchwork import models
diff --git a/patchwork/api/fields.py b/patchwork/api/fields.py
new file mode 100644
index 0000000..36095bc
--- /dev/null
+++ b/patchwork/api/fields.py
@@ -0,0 +1,61 @@
+# Patchwork - automated patch tracking system
+# Copyright (C) 2017 Linaro Corporation
+#
+# 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.utils.translation import ugettext_lazy as _
+from rest_framework.relations import RelatedField
+
+from patchwork.models import State
+
+
+def format_state_name(state):
+ return ' '.join(state.split('-'))
+
+
+class StateField(RelatedField):
+ """Avoid the need for a state endpoint.
+
+ NOTE(stephenfin): This field will only function for State names consisting
+ of alphanumeric characters, underscores and single spaces. In Patchwork
+ 2.0+, we should consider adding a slug field to the State object and make
+ use of the SlugRelatedField in DRF.
+ """
+ default_error_messages = {
+ 'required': _('This field is required.'),
+ 'invalid_choice': _('Invalid state {name}. Expected one of: '
+ '{choices}.'),
+ 'incorrect_type': _('Incorrect type. Expected string value, received '
+ '{data_type}.'),
+ }
+ queryset = '' # django 1.6, rest_framework 3.2 require this
+
+ def to_internal_value(self, data):
+ try:
+ data = format_state_name(data)
+ return self.get_queryset().get(name__iexact=data)
+ except State.DoesNotExist:
+ self.fail('invalid_choice', name=data, choices=', '.join([
+ format_state_name(x.name) for x in self.get_queryset()]))
+ except (TypeError, ValueError):
+ self.fail('incorrect_type', data_type=type(data).__name__)
+
+ def to_representation(self, obj):
+ return obj.slug
+
+ def get_queryset(self):
+ return State.objects.all()
diff --git a/patchwork/api/patch.py b/patchwork/api/patch.py
index 1f0ead1..1d0f86c 100644
--- a/patchwork/api/patch.py
+++ b/patchwork/api/patch.py
@@ -19,63 +19,23 @@
import email.parser
-from django.utils.translation import ugettext_lazy as _
from rest_framework.generics import ListAPIView
from rest_framework.generics import RetrieveUpdateAPIView
-from rest_framework.relations import RelatedField
from rest_framework.reverse import reverse
from rest_framework.serializers import HyperlinkedModelSerializer
from rest_framework.serializers import SerializerMethodField
from patchwork.api.base import PatchworkPermission
+from patchwork.api.fields import StateField
from patchwork.api.filters import PatchFilter
from patchwork.api.embedded import PersonSerializer
from patchwork.api.embedded import ProjectSerializer
from patchwork.api.embedded import SeriesSerializer
from patchwork.api.embedded import UserSerializer
from patchwork.models import Patch
-from patchwork.models import State
from patchwork.parser import clean_subject
-def format_state_name(state):
- return ' '.join(state.split('-'))
-
-
-class StateField(RelatedField):
- """Avoid the need for a state endpoint.
-
- NOTE(stephenfin): This field will only function for State names consisting
- of alphanumeric characters, underscores and single spaces. In Patchwork
- 2.0+, we should consider adding a slug field to the State object and make
- use of the SlugRelatedField in DRF.
- """
- default_error_messages = {
- 'required': _('This field is required.'),
- 'invalid_choice': _('Invalid state {name}. Expected one of: '
- '{choices}.'),
- 'incorrect_type': _('Incorrect type. Expected string value, received '
- '{data_type}.'),
- }
- queryset = '' # django 1.6, rest_framework 3.2 require this
-
- def to_internal_value(self, data):
- try:
- data = format_state_name(data)
- return self.get_queryset().get(name__iexact=data)
- except State.DoesNotExist:
- self.fail('invalid_choice', name=data, choices=', '.join([
- format_state_name(x.name) for x in self.get_queryset()]))
- except (TypeError, ValueError):
- self.fail('incorrect_type', data_type=type(data).__name__)
-
- def to_representation(self, obj):
- return obj.slug
-
- def get_queryset(self):
- return State.objects.all()
-
-
class PatchListSerializer(HyperlinkedModelSerializer):
project = ProjectSerializer(read_only=True)
--
2.11.0
More information about the Patchwork
mailing list