|
@@ -25,9 +25,11 @@ from django.utils.encoding import smart_text, force_text, force_bytes
|
|
|
from django.utils.ipv6 import clean_ipv6_address
|
|
|
from django.utils import six
|
|
|
|
|
|
+
|
|
|
class Empty(object):
|
|
|
pass
|
|
|
|
|
|
+
|
|
|
class NOT_PROVIDED:
|
|
|
pass
|
|
|
|
|
@@ -35,12 +37,15 @@ class NOT_PROVIDED:
|
|
|
|
|
|
BLANK_CHOICE_DASH = [("", "---------")]
|
|
|
|
|
|
+
|
|
|
def _load_field(app_label, model_name, field_name):
|
|
|
return get_model(app_label, model_name)._meta.get_field_by_name(field_name)[0]
|
|
|
|
|
|
+
|
|
|
class FieldDoesNotExist(Exception):
|
|
|
pass
|
|
|
|
|
|
+
|
|
|
|
|
|
|
|
|
|
|
@@ -61,6 +66,7 @@ def _empty(of_cls):
|
|
|
new.__class__ = of_cls
|
|
|
return new
|
|
|
|
|
|
+
|
|
|
@total_ordering
|
|
|
class Field(object):
|
|
|
"""Base class for all field types"""
|
|
@@ -444,12 +450,12 @@ class Field(object):
|
|
|
if hasattr(value, '_prepare'):
|
|
|
return value._prepare()
|
|
|
|
|
|
- if lookup_type in (
|
|
|
- 'iexact', 'contains', 'icontains',
|
|
|
- 'startswith', 'istartswith', 'endswith', 'iendswith',
|
|
|
- 'month', 'day', 'week_day', 'hour', 'minute', 'second',
|
|
|
- 'isnull', 'search', 'regex', 'iregex',
|
|
|
- ):
|
|
|
+ if lookup_type in {
|
|
|
+ 'iexact', 'contains', 'icontains',
|
|
|
+ 'startswith', 'istartswith', 'endswith', 'iendswith',
|
|
|
+ 'month', 'day', 'week_day', 'hour', 'minute', 'second',
|
|
|
+ 'isnull', 'search', 'regex', 'iregex',
|
|
|
+ }:
|
|
|
return value
|
|
|
elif lookup_type in ('exact', 'gt', 'gte', 'lt', 'lte'):
|
|
|
return self.get_prep_value(value)
|
|
@@ -593,7 +599,7 @@ class Field(object):
|
|
|
if isinstance(value, (list, tuple)):
|
|
|
flat.extend(value)
|
|
|
else:
|
|
|
- flat.append((choice,value))
|
|
|
+ flat.append((choice, value))
|
|
|
return flat
|
|
|
flatchoices = property(_get_flatchoices)
|
|
|
|
|
@@ -712,6 +718,7 @@ class AutoField(Field):
|
|
|
def formfield(self, **kwargs):
|
|
|
return None
|
|
|
|
|
|
+
|
|
|
class BooleanField(Field):
|
|
|
empty_strings_allowed = False
|
|
|
default_error_messages = {
|
|
@@ -766,13 +773,13 @@ class BooleanField(Field):
|
|
|
if self.choices:
|
|
|
include_blank = (self.null or
|
|
|
not (self.has_default() or 'initial' in kwargs))
|
|
|
- defaults = {'choices': self.get_choices(
|
|
|
- include_blank=include_blank)}
|
|
|
+ defaults = {'choices': self.get_choices(include_blank=include_blank)}
|
|
|
else:
|
|
|
defaults = {'form_class': forms.BooleanField}
|
|
|
defaults.update(kwargs)
|
|
|
return super(BooleanField, self).formfield(**defaults)
|
|
|
|
|
|
+
|
|
|
class CharField(Field):
|
|
|
description = _("String (up to %(max_length)s)")
|
|
|
|
|
@@ -799,6 +806,7 @@ class CharField(Field):
|
|
|
defaults.update(kwargs)
|
|
|
return super(CharField, self).formfield(**defaults)
|
|
|
|
|
|
+
|
|
|
|
|
|
class CommaSeparatedIntegerField(CharField):
|
|
|
default_validators = [validators.validate_comma_separated_integer_list]
|
|
@@ -813,6 +821,7 @@ class CommaSeparatedIntegerField(CharField):
|
|
|
defaults.update(kwargs)
|
|
|
return super(CommaSeparatedIntegerField, self).formfield(**defaults)
|
|
|
|
|
|
+
|
|
|
class DateField(Field):
|
|
|
empty_strings_allowed = False
|
|
|
default_error_messages = {
|
|
@@ -885,7 +894,7 @@ class DateField(Field):
|
|
|
return super(DateField, self).pre_save(model_instance, add)
|
|
|
|
|
|
def contribute_to_class(self, cls, name):
|
|
|
- super(DateField,self).contribute_to_class(cls, name)
|
|
|
+ super(DateField, self).contribute_to_class(cls, name)
|
|
|
if not self.null:
|
|
|
setattr(cls, 'get_next_by_%s' % self.name,
|
|
|
curry(cls._get_next_or_previous_by_FIELD, field=self,
|
|
@@ -919,6 +928,7 @@ class DateField(Field):
|
|
|
defaults.update(kwargs)
|
|
|
return super(DateField, self).formfield(**defaults)
|
|
|
|
|
|
+
|
|
|
class DateTimeField(DateField):
|
|
|
empty_strings_allowed = False
|
|
|
default_error_messages = {
|
|
@@ -1025,6 +1035,7 @@ class DateTimeField(DateField):
|
|
|
defaults.update(kwargs)
|
|
|
return super(DateTimeField, self).formfield(**defaults)
|
|
|
|
|
|
+
|
|
|
class DecimalField(Field):
|
|
|
empty_strings_allowed = False
|
|
|
default_error_messages = {
|
|
@@ -1096,6 +1107,7 @@ class DecimalField(Field):
|
|
|
defaults.update(kwargs)
|
|
|
return super(DecimalField, self).formfield(**defaults)
|
|
|
|
|
|
+
|
|
|
class EmailField(CharField):
|
|
|
default_validators = [validators.validate_email]
|
|
|
description = _("Email address")
|
|
@@ -1122,13 +1134,14 @@ class EmailField(CharField):
|
|
|
defaults.update(kwargs)
|
|
|
return super(EmailField, self).formfield(**defaults)
|
|
|
|
|
|
+
|
|
|
class FilePathField(Field):
|
|
|
description = _("File path")
|
|
|
|
|
|
def __init__(self, verbose_name=None, name=None, path='', match=None,
|
|
|
recursive=False, allow_files=True, allow_folders=False, **kwargs):
|
|
|
self.path, self.match, self.recursive = path, match, recursive
|
|
|
- self.allow_files, self.allow_folders = allow_files, allow_folders
|
|
|
+ self.allow_files, self.allow_folders = allow_files, allow_folders
|
|
|
kwargs['max_length'] = kwargs.get('max_length', 100)
|
|
|
Field.__init__(self, verbose_name, name, **kwargs)
|
|
|
|
|
@@ -1163,6 +1176,7 @@ class FilePathField(Field):
|
|
|
def get_internal_type(self):
|
|
|
return "FilePathField"
|
|
|
|
|
|
+
|
|
|
class FloatField(Field):
|
|
|
empty_strings_allowed = False
|
|
|
default_error_messages = {
|
|
@@ -1195,6 +1209,7 @@ class FloatField(Field):
|
|
|
defaults.update(kwargs)
|
|
|
return super(FloatField, self).formfield(**defaults)
|
|
|
|
|
|
+
|
|
|
class IntegerField(Field):
|
|
|
empty_strings_allowed = False
|
|
|
default_error_messages = {
|
|
@@ -1233,6 +1248,7 @@ class IntegerField(Field):
|
|
|
defaults.update(kwargs)
|
|
|
return super(IntegerField, self).formfield(**defaults)
|
|
|
|
|
|
+
|
|
|
class BigIntegerField(IntegerField):
|
|
|
empty_strings_allowed = False
|
|
|
description = _("Big (8 byte) integer")
|
|
@@ -1247,6 +1263,7 @@ class BigIntegerField(IntegerField):
|
|
|
defaults.update(kwargs)
|
|
|
return super(BigIntegerField, self).formfield(**defaults)
|
|
|
|
|
|
+
|
|
|
class IPAddressField(Field):
|
|
|
empty_strings_allowed = False
|
|
|
description = _("IPv4 address")
|
|
@@ -1268,6 +1285,7 @@ class IPAddressField(Field):
|
|
|
defaults.update(kwargs)
|
|
|
return super(IPAddressField, self).formfield(**defaults)
|
|
|
|
|
|
+
|
|
|
class GenericIPAddressField(Field):
|
|
|
empty_strings_allowed = True
|
|
|
description = _("IP address")
|
|
@@ -1383,6 +1401,7 @@ class NullBooleanField(Field):
|
|
|
defaults.update(kwargs)
|
|
|
return super(NullBooleanField, self).formfield(**defaults)
|
|
|
|
|
|
+
|
|
|
class PositiveIntegerField(IntegerField):
|
|
|
description = _("Positive integer")
|
|
|
|
|
@@ -1394,6 +1413,7 @@ class PositiveIntegerField(IntegerField):
|
|
|
defaults.update(kwargs)
|
|
|
return super(PositiveIntegerField, self).formfield(**defaults)
|
|
|
|
|
|
+
|
|
|
class PositiveSmallIntegerField(IntegerField):
|
|
|
description = _("Positive small integer")
|
|
|
|
|
@@ -1405,6 +1425,7 @@ class PositiveSmallIntegerField(IntegerField):
|
|
|
defaults.update(kwargs)
|
|
|
return super(PositiveSmallIntegerField, self).formfield(**defaults)
|
|
|
|
|
|
+
|
|
|
class SlugField(CharField):
|
|
|
default_validators = [validators.validate_slug]
|
|
|
description = _("Slug (up to %(max_length)s)")
|
|
@@ -1434,12 +1455,14 @@ class SlugField(CharField):
|
|
|
defaults.update(kwargs)
|
|
|
return super(SlugField, self).formfield(**defaults)
|
|
|
|
|
|
+
|
|
|
class SmallIntegerField(IntegerField):
|
|
|
description = _("Small integer")
|
|
|
|
|
|
def get_internal_type(self):
|
|
|
return "SmallIntegerField"
|
|
|
|
|
|
+
|
|
|
class TextField(Field):
|
|
|
description = _("Text")
|
|
|
|
|
@@ -1456,6 +1479,7 @@ class TextField(Field):
|
|
|
defaults.update(kwargs)
|
|
|
return super(TextField, self).formfield(**defaults)
|
|
|
|
|
|
+
|
|
|
class TimeField(Field):
|
|
|
empty_strings_allowed = False
|
|
|
default_error_messages = {
|
|
@@ -1539,6 +1563,7 @@ class TimeField(Field):
|
|
|
defaults.update(kwargs)
|
|
|
return super(TimeField, self).formfield(**defaults)
|
|
|
|
|
|
+
|
|
|
class URLField(CharField):
|
|
|
default_validators = [validators.URLValidator()]
|
|
|
description = _("URL")
|
|
@@ -1562,6 +1587,7 @@ class URLField(CharField):
|
|
|
defaults.update(kwargs)
|
|
|
return super(URLField, self).formfield(**defaults)
|
|
|
|
|
|
+
|
|
|
class BinaryField(Field):
|
|
|
description = _("Raw binary data")
|
|
|
empty_values = [None, b'']
|