From c5b4be701ad2bcf79185f6acb192d2f3cc2c86f6 Mon Sep 17 00:00:00 2001 From: Mohit Mittal Date: Thu, 22 Sep 2016 08:42:50 +0000 Subject: [PATCH 1/4] add permission keys to rest framework field object --- rest_framework/fields.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 917a151e5..0847fbddb 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -278,7 +278,8 @@ class Field(object): def __init__(self, read_only=False, write_only=False, required=None, default=empty, initial=empty, source=None, label=None, help_text=None, style=None, - error_messages=None, validators=None, allow_null=False): + error_messages=None, validators=None, allow_null=False, + permission=0, read_permission=0, write_permission=0): self._creation_counter = Field._creation_counter Field._creation_counter += 1 @@ -302,6 +303,9 @@ class Field(object): self.help_text = help_text self.style = {} if style is None else style self.allow_null = allow_null + self.permission = permission + self.read_permission = read_permission + self.write_permission = write_permission if self.default_empty_html is not empty: if default is not empty: From 0e039402b2899b4ae1e92c2a14eadf9777f4b7a8 Mon Sep 17 00:00:00 2001 From: Mohit Mittal Date: Wed, 5 Oct 2016 00:57:01 +0000 Subject: [PATCH 2/4] change router to take base name from model along with queryset --- rest_framework/routers.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/rest_framework/routers.py b/rest_framework/routers.py index 4eec70bda..d813376bb 100644 --- a/rest_framework/routers.py +++ b/rest_framework/routers.py @@ -133,12 +133,14 @@ class SimpleRouter(BaseRouter): it from the viewset. """ queryset = getattr(viewset, 'queryset', None) - - assert queryset is not None, '`base_name` argument not specified, and could ' \ + model = getattr(viewset, 'model', None) + + assert ((queryset is not None) or (model is not None)), '`base_name` argument not specified, and could ' \ 'not automatically determine the name from the viewset, as ' \ 'it does not have a `.queryset` attribute.' - return queryset.model._meta.object_name.lower() + model = model if model is not None else queryset.model + return model._meta.object_name.lower() def get_routes(self, viewset): """ From 39658f1bf46b57918cfbe2a497594e3531aa1614 Mon Sep 17 00:00:00 2001 From: Mohit Mittal Date: Thu, 20 Oct 2016 07:04:54 -0700 Subject: [PATCH 3/4] allow context to be set even after initialization --- rest_framework/serializers.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 4d1ed63ae..55e686efd 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -134,6 +134,14 @@ class BaseSerializer(Field): list_serializer_class = getattr(meta, 'list_serializer_class', ListSerializer) return list_serializer_class(*args, **list_kwargs) + ''' + HACK to pass context down to child serializers in rippling. + The right way might be to remove @cached_property from fields.py + and set self._context here + ''' + def set_context(self, context): + self.context = context; + def to_internal_value(self, data): raise NotImplementedError('`to_internal_value()` must be implemented.') From b506b3161deaeac49c9b9cb16abffe2595b29789 Mon Sep 17 00:00:00 2001 From: Mohit Mittal Date: Fri, 2 Dec 2016 11:02:26 -0800 Subject: [PATCH 4/4] Don't skip fields if there is an error --- rest_framework/fields.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 0847fbddb..12be39d77 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -415,8 +415,6 @@ class Field(object): try: return get_attribute(instance, self.source_attrs) except (KeyError, AttributeError) as exc: - if not self.required and self.default is empty: - raise SkipField() msg = ( 'Got {exc_type} when attempting to get a value for field ' '`{field}` on serializer `{serializer}`.\nThe serializer '