From 85d74fc86a934309359a437dd487193013055977 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Tue, 14 Jan 2014 11:25:44 +0000 Subject: Added write_only and write_only_fields. Refs #1306 --- rest_framework/fields.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'rest_framework/fields.py') diff --git a/rest_framework/fields.py b/rest_framework/fields.py index f1de447c..258c0f6a 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -114,6 +114,10 @@ def strip_multiple_choice_msg(help_text): return help_text.replace(multiple_choice_msg, '') +class IgnoreFieldException(Exception): + pass + + class Field(object): read_only = True creation_counter = 0 @@ -246,6 +250,7 @@ class WritableField(Field): """ Base for read/write fields. """ + write_only = False default_validators = [] default_error_messages = { 'required': _('This field is required.'), @@ -255,7 +260,7 @@ class WritableField(Field): default = None def __init__(self, source=None, label=None, help_text=None, - read_only=False, required=None, + read_only=False, write_only=False, required=None, validators=[], error_messages=None, widget=None, default=None, blank=None): @@ -269,6 +274,10 @@ class WritableField(Field): super(WritableField, self).__init__(source=source, label=label, help_text=help_text) self.read_only = read_only + self.write_only = write_only + + assert not (read_only and write_only), "Cannot set read_only=True and write_only=True" + if required is None: self.required = not(read_only) else: @@ -318,6 +327,11 @@ class WritableField(Field): if errors: raise ValidationError(errors) + def field_to_native(self, obj, field_name): + if self.write_only: + raise IgnoreFieldException() + return super(WritableField, self).field_to_native(obj, field_name) + def field_from_native(self, data, files, field_name, into): """ Given a dictionary and a field name, updates the dictionary `into`, -- cgit v1.2.3 From e9fda70b4ac86badbd5297f857126121472b7ec6 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Wed, 15 Jan 2014 08:53:23 +0000 Subject: Nicer write_only fields implementation. Closes #1355 --- rest_framework/fields.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) (limited to 'rest_framework/fields.py') diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 258c0f6a..2f475d6e 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -114,10 +114,6 @@ def strip_multiple_choice_msg(help_text): return help_text.replace(multiple_choice_msg, '') -class IgnoreFieldException(Exception): - pass - - class Field(object): read_only = True creation_counter = 0 @@ -329,7 +325,7 @@ class WritableField(Field): def field_to_native(self, obj, field_name): if self.write_only: - raise IgnoreFieldException() + return None return super(WritableField, self).field_to_native(obj, field_name) def field_from_native(self, data, files, field_name, into): -- cgit v1.2.3 From f1016441f5b9f6c95530d2ec306f90aa45762831 Mon Sep 17 00:00:00 2001 From: Carlton Gibson Date: Tue, 11 Feb 2014 19:52:32 +0100 Subject: Test and fix for #1210. World's lowest hanging fruit. --- rest_framework/fields.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'rest_framework/fields.py') diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 2f475d6e..05daaab7 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -477,7 +477,8 @@ class URLField(CharField): type_label = 'url' def __init__(self, **kwargs): - kwargs['validators'] = [validators.URLValidator()] + if not 'validators' in kwargs: + kwargs['validators'] = [validators.URLValidator()] super(URLField, self).__init__(**kwargs) -- cgit v1.2.3 From 1addd09e2b0e26507aada864123f610ead62d8da Mon Sep 17 00:00:00 2001 From: Anton Shutik Date: Thu, 27 Feb 2014 18:34:36 +0300 Subject: RelatedField default value handling fixed --- rest_framework/fields.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'rest_framework/fields.py') diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 05daaab7..68b95682 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -301,6 +301,11 @@ class WritableField(Field): result.validators = self.validators[:] return result + def get_default_value(self): + if is_simple_callable(self.default): + return self.default() + return self.default + def validate(self, value): if value in validators.EMPTY_VALUES and self.required: raise ValidationError(self.error_messages['required']) @@ -349,10 +354,7 @@ class WritableField(Field): except KeyError: if self.default is not None and not self.partial: # Note: partial updates shouldn't set defaults - if is_simple_callable(self.default): - native = self.default() - else: - native = self.default + native = self.get_default_value() else: if self.required: raise ValidationError(self.error_messages['required']) -- cgit v1.2.3 From 2a1571b3bf36ff153af68401f7aefa0620f80807 Mon Sep 17 00:00:00 2001 From: Mauro de Carvalho Date: Mon, 7 Apr 2014 18:27:59 -0300 Subject: Fixed comment. --- rest_framework/fields.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'rest_framework/fields.py') diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 68b95682..946a5954 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -164,7 +164,7 @@ class Field(object): Called to set up a field prior to field_to_native or field_from_native. parent - The parent serializer. - model_field - The model field this field corresponds to, if one exists. + field_name - The name of the field being initialized. """ self.parent = parent self.root = parent.root or parent -- cgit v1.2.3