diff options
Diffstat (limited to 'rest_framework/fields.py')
| -rw-r--r-- | rest_framework/fields.py | 59 |
1 files changed, 31 insertions, 28 deletions
diff --git a/rest_framework/fields.py b/rest_framework/fields.py index cb5f9a40..1534eeca 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -11,7 +11,6 @@ from decimal import Decimal, DecimalException import inspect import re import warnings - from django.core import validators from django.core.exceptions import ValidationError from django.conf import settings @@ -21,7 +20,6 @@ from django.forms import widgets from django.utils.encoding import is_protected_type from django.utils.translation import ugettext_lazy as _ from django.utils.datastructures import SortedDict - from rest_framework import ISO_8601 from rest_framework.compat import (timezone, parse_date, parse_datetime, parse_time) @@ -46,6 +44,7 @@ def is_simple_callable(obj): len_defaults = len(defaults) if defaults else 0 return len_args <= len_defaults + def get_component(obj, attr_name): """ Given an object, and an attribute name, @@ -72,18 +71,6 @@ def readable_date_formats(formats): return humanize_strptime(format) -def humanize_form_fields(form): - """Return a humanized description of all the fields in a form. - - :param form: A Django form. - :return: A dictionary of {field_label: humanized description} - - """ - fields = SortedDict([(name, humanize_field(field)) - for name, field in form.fields.iteritems()]) - return fields - - def readable_time_formats(formats): format = ', '.join(formats).replace(ISO_8601, 'hh:mm[:ss[.uuuuuu]]') return humanize_strptime(format) @@ -122,6 +109,7 @@ class Field(object): partial = False use_files = False form_field_class = forms.CharField + type_label = 'field' def __init__(self, source=None, label=None, help_text=None): self.parent = None @@ -207,18 +195,17 @@ class Field(object): return {'type': self.type_name} return {} - @property - def humanized(self): - humanized = { - 'type': self.type_name, - 'required': getattr(self, 'required', False), - } - optional_attrs = ['read_only', 'help_text', 'label', + def metadata(self): + metadata = SortedDict() + metadata['type'] = self.type_label + metadata['required'] = getattr(self, 'required', False) + optional_attrs = ['read_only', 'label', 'help_text', 'min_length', 'max_length'] for attr in optional_attrs: - if getattr(self, attr, None) is not None: - humanized[attr] = getattr(self, attr) - return humanized + value = getattr(self, attr, None) + if value is not None and value != '': + metadata[attr] = force_text(value, strings_only=True) + return metadata class WritableField(Field): @@ -375,6 +362,7 @@ class ModelField(WritableField): class BooleanField(WritableField): type_name = 'BooleanField' + type_label = 'boolean' form_field_class = forms.BooleanField widget = widgets.CheckboxInput default_error_messages = { @@ -397,6 +385,7 @@ class BooleanField(WritableField): class CharField(WritableField): type_name = 'CharField' + type_label = 'string' form_field_class = forms.CharField def __init__(self, max_length=None, min_length=None, *args, **kwargs): @@ -415,6 +404,7 @@ class CharField(WritableField): class URLField(CharField): type_name = 'URLField' + type_label = 'url' def __init__(self, **kwargs): kwargs['validators'] = [validators.URLValidator()] @@ -423,14 +413,15 @@ class URLField(CharField): class SlugField(CharField): type_name = 'SlugField' + type_label = 'slug' form_field_class = forms.SlugField - + default_error_messages = { 'invalid': _("Enter a valid 'slug' consisting of letters, numbers," " underscores or hyphens."), } default_validators = [validators.validate_slug] - + def __init__(self, *args, **kwargs): super(SlugField, self).__init__(*args, **kwargs) @@ -440,10 +431,11 @@ class SlugField(CharField): #result.widget = copy.deepcopy(self.widget, memo) result.validators = self.validators[:] return result - - + + class ChoiceField(WritableField): type_name = 'ChoiceField' + type_label = 'multiple choice' form_field_class = forms.ChoiceField widget = widgets.Select default_error_messages = { @@ -494,6 +486,7 @@ class ChoiceField(WritableField): class EmailField(CharField): type_name = 'EmailField' + type_label = 'email' form_field_class = forms.EmailField default_error_messages = { @@ -517,6 +510,7 @@ class EmailField(CharField): class RegexField(CharField): type_name = 'RegexField' + type_label = 'regex' form_field_class = forms.RegexField def __init__(self, regex, max_length=None, min_length=None, *args, **kwargs): @@ -546,6 +540,7 @@ class RegexField(CharField): class DateField(WritableField): type_name = 'DateField' + type_label = 'date' widget = widgets.DateInput form_field_class = forms.DateField @@ -609,6 +604,7 @@ class DateField(WritableField): class DateTimeField(WritableField): type_name = 'DateTimeField' + type_label = 'datetime' widget = widgets.DateTimeInput form_field_class = forms.DateTimeField @@ -678,6 +674,7 @@ class DateTimeField(WritableField): class TimeField(WritableField): type_name = 'TimeField' + type_label = 'time' widget = widgets.TimeInput form_field_class = forms.TimeField @@ -734,6 +731,7 @@ class TimeField(WritableField): class IntegerField(WritableField): type_name = 'IntegerField' + type_label = 'integer' form_field_class = forms.IntegerField default_error_messages = { @@ -764,6 +762,7 @@ class IntegerField(WritableField): class FloatField(WritableField): type_name = 'FloatField' + type_label = 'float' form_field_class = forms.FloatField default_error_messages = { @@ -783,6 +782,7 @@ class FloatField(WritableField): class DecimalField(WritableField): type_name = 'DecimalField' + type_label = 'decimal' form_field_class = forms.DecimalField default_error_messages = { @@ -853,6 +853,7 @@ class DecimalField(WritableField): class FileField(WritableField): use_files = True type_name = 'FileField' + type_label = 'file upload' form_field_class = forms.FileField widget = widgets.FileInput @@ -896,6 +897,8 @@ class FileField(WritableField): class ImageField(FileField): use_files = True + type_name = 'ImageField' + type_label = 'image upload' form_field_class = forms.ImageField default_error_messages = { |
