aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework/fields.py
diff options
context:
space:
mode:
Diffstat (limited to 'rest_framework/fields.py')
-rw-r--r--rest_framework/fields.py91
1 files changed, 89 insertions, 2 deletions
diff --git a/rest_framework/fields.py b/rest_framework/fields.py
index fc14184c..0f07aaba 100644
--- a/rest_framework/fields.py
+++ b/rest_framework/fields.py
@@ -23,13 +23,44 @@ 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
+from rest_framework.compat import (timezone, parse_date, parse_datetime,
+ parse_time)
from rest_framework.compat import BytesIO
from rest_framework.compat import six
from rest_framework.compat import smart_text
from rest_framework.settings import api_settings
+HUMANIZED_FIELD_TYPES = {
+ 'BooleanField': u'Boolean',
+ 'CharField': u'Single Character',
+ 'ChoiceField': u'Single Choice',
+ 'ComboField': u'Single Choice',
+ 'DateField': u'Date',
+ 'DateTimeField': u'Date and Time',
+ 'DecimalField': u'Decimal',
+ 'EmailField': u'Email',
+ 'Field': u'Field',
+ 'FileField': u'File',
+ 'FilePathField': u'File Path',
+ 'FloatField': u'Float',
+ 'GenericIPAddressField': u'Generic IP Address',
+ 'IPAddressField': u'IP Address',
+ 'ImageField': u'Image',
+ 'IntegerField': u'Integer',
+ 'MultiValueField': u'Multiple Value',
+ 'MultipleChoiceField': u'Multiple Choice',
+ 'NullBooleanField': u'Nullable Boolean',
+ 'RegexField': u'Regular Expression',
+ 'SlugField': u'Slug',
+ 'SplitDateTimeField': u'Split Date and Time',
+ 'TimeField': u'Time',
+ 'TypedChoiceField': u'Typed Single Choice',
+ 'TypedMultipleChoiceField': u'Typed Multiple Choice',
+ 'URLField': u'URL',
+}
+
+
def is_simple_callable(obj):
"""
True if the object is a callable that takes no arguments.
@@ -62,7 +93,8 @@ def get_component(obj, attr_name):
def readable_datetime_formats(formats):
- format = ', '.join(formats).replace(ISO_8601, 'YYYY-MM-DDThh:mm[:ss[.uuuuuu]][+HHMM|-HHMM|Z]')
+ format = ', '.join(formats).replace(ISO_8601,
+ 'YYYY-MM-DDThh:mm[:ss[.uuuuuu]][+HHMM|-HHMM|Z]')
return humanize_strptime(format)
@@ -71,6 +103,61 @@ def readable_date_formats(formats):
return humanize_strptime(format)
+def humanize_field_type(field_type):
+ """Return a human-readable name for a field type.
+
+ :param field_type: Either a field type class (for example
+ django.forms.fields.DateTimeField), or the name of a field type
+ (for example "DateTimeField").
+
+ :return: unicode
+
+ """
+ if isinstance(field_type, basestring):
+ field_type_name = field_type
+ else:
+ field_type_name = field_type.__name__
+ try:
+ return HUMANIZED_FIELD_TYPES[field_type_name]
+ except KeyError:
+ humanized = re.sub('([a-z0-9])([A-Z])', r'\1 \2', field_type_name)
+ return humanized.capitalize()
+
+
+def humanize_field(field):
+ """Return a human-readable description of a field.
+
+ :param field: A Django field.
+
+ :return: A dictionary of the form {type: type name, required: bool,
+ label: field label: read_only: bool,
+ help_text: optional help text}
+
+ """
+ humanized = {
+ 'type': humanize_field_type(field.__class__),
+ 'required': getattr(field, 'required', False),
+ 'label': field.label,
+ }
+ optional_attrs = ['read_only', 'help_text']
+ for attr in optional_attrs:
+ if hasattr(field, attr):
+ humanized[attr] = getattr(field, attr)
+ return humanized
+
+
+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)