Fixed #8210 and #8664: moved `USStateField` and `PhoneNumberField` to `django.contrib.localflavor.us`. This is a backwards-incompatible change, albeit a minor one; just add an aditional `import` and go on your way.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@8819 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Jacob Kaplan-Moss 2008-09-01 22:15:35 +00:00
parent 4f225d44ce
commit 3a18002bbd
14 changed files with 53 additions and 48 deletions

View File

@ -1,4 +1,5 @@
from django.contrib.gis.db import models from django.contrib.gis.db import models
from django.contrib.localflavor.us.models import USStateField
class Location(models.Model): class Location(models.Model):
name = models.CharField(max_length=50) name = models.CharField(max_length=50)
@ -7,6 +8,6 @@ class Location(models.Model):
class City(models.Model): class City(models.Model):
name = models.CharField(max_length=50) name = models.CharField(max_length=50)
state = models.USStateField() state = USStateField()
location = models.ForeignKey(Location) location = models.ForeignKey(Location)
objects = models.GeoManager() objects = models.GeoManager()

View File

@ -118,6 +118,7 @@ from django.contrib.gis.gdal.field import \
OFTDate, OFTDateTime, OFTInteger, OFTReal, OFTString, OFTTime OFTDate, OFTDateTime, OFTInteger, OFTReal, OFTString, OFTTime
from django.contrib.gis.models import GeometryColumns, SpatialRefSys from django.contrib.gis.models import GeometryColumns, SpatialRefSys
from django.db import models, transaction from django.db import models, transaction
from django.contrib.localflavor.us.models import USStateField
# LayerMapping exceptions. # LayerMapping exceptions.
class LayerMapError(Exception): pass class LayerMapError(Exception): pass
@ -150,7 +151,7 @@ class LayerMapping(object):
models.SlugField : OFTString, models.SlugField : OFTString,
models.TextField : OFTString, models.TextField : OFTString,
models.URLField : OFTString, models.URLField : OFTString,
models.USStateField : OFTString, USStateField : OFTString,
models.XMLField : OFTString, models.XMLField : OFTString,
models.SmallIntegerField : (OFTInteger, OFTReal, OFTString), models.SmallIntegerField : (OFTInteger, OFTReal, OFTString),
models.PositiveSmallIntegerField : (OFTInteger, OFTReal, OFTString), models.PositiveSmallIntegerField : (OFTInteger, OFTReal, OFTString),

View File

@ -0,0 +1,35 @@
from django.conf import settings
from django.db.models.fields import Field
class USStateField(Field):
def get_internal_type(self):
return "USStateField"
def db_type(self):
if settings.DATABASE_ENGINE == 'oracle':
return 'CHAR(2)'
else:
return 'varchar(2)'
def formfield(self, **kwargs):
from django.contrib.localflavor.us.forms import USStateSelect
defaults = {'widget': USStateSelect}
defaults.update(kwargs)
return super(USStateField, self).formfield(**defaults)
class PhoneNumberField(Field):
def get_internal_type(self):
return "PhoneNumberField"
def db_type(self):
if settings.DATABASE_ENGINE == 'oracle':
return 'VARCHAR2(20)'
else:
return 'varchar(20)'
def formfield(self, **kwargs):
from django.contrib.localflavor.us.forms import USPhoneNumberField
defaults = {'form_class': USPhoneNumberField}
defaults.update(kwargs)
return super(PhoneNumberField, self).formfield(**defaults)

View File

@ -21,14 +21,12 @@ class DatabaseCreation(BaseDatabaseCreation):
'IPAddressField': 'char(15)', 'IPAddressField': 'char(15)',
'NullBooleanField': 'bool', 'NullBooleanField': 'bool',
'OneToOneField': 'integer', 'OneToOneField': 'integer',
'PhoneNumberField': 'varchar(20)',
'PositiveIntegerField': 'integer UNSIGNED', 'PositiveIntegerField': 'integer UNSIGNED',
'PositiveSmallIntegerField': 'smallint UNSIGNED', 'PositiveSmallIntegerField': 'smallint UNSIGNED',
'SlugField': 'varchar(%(max_length)s)', 'SlugField': 'varchar(%(max_length)s)',
'SmallIntegerField': 'smallint', 'SmallIntegerField': 'smallint',
'TextField': 'longtext', 'TextField': 'longtext',
'TimeField': 'time', 'TimeField': 'time',
'USStateField': 'varchar(2)',
} }
def sql_table_creation_suffix(self): def sql_table_creation_suffix(self):

View File

@ -30,7 +30,6 @@ class DatabaseCreation(BaseDatabaseCreation):
'IPAddressField': 'VARCHAR2(15)', 'IPAddressField': 'VARCHAR2(15)',
'NullBooleanField': 'NUMBER(1) CHECK ((%(qn_column)s IN (0,1)) OR (%(qn_column)s IS NULL))', 'NullBooleanField': 'NUMBER(1) CHECK ((%(qn_column)s IN (0,1)) OR (%(qn_column)s IS NULL))',
'OneToOneField': 'NUMBER(11)', 'OneToOneField': 'NUMBER(11)',
'PhoneNumberField': 'VARCHAR2(20)',
'PositiveIntegerField': 'NUMBER(11) CHECK (%(qn_column)s >= 0)', 'PositiveIntegerField': 'NUMBER(11) CHECK (%(qn_column)s >= 0)',
'PositiveSmallIntegerField': 'NUMBER(11) CHECK (%(qn_column)s >= 0)', 'PositiveSmallIntegerField': 'NUMBER(11) CHECK (%(qn_column)s >= 0)',
'SlugField': 'NVARCHAR2(50)', 'SlugField': 'NVARCHAR2(50)',
@ -38,7 +37,6 @@ class DatabaseCreation(BaseDatabaseCreation):
'TextField': 'NCLOB', 'TextField': 'NCLOB',
'TimeField': 'TIMESTAMP', 'TimeField': 'TIMESTAMP',
'URLField': 'VARCHAR2(%(max_length)s)', 'URLField': 'VARCHAR2(%(max_length)s)',
'USStateField': 'CHAR(2)',
} }
remember = {} remember = {}

View File

@ -21,14 +21,12 @@ class DatabaseCreation(BaseDatabaseCreation):
'IPAddressField': 'inet', 'IPAddressField': 'inet',
'NullBooleanField': 'boolean', 'NullBooleanField': 'boolean',
'OneToOneField': 'integer', 'OneToOneField': 'integer',
'PhoneNumberField': 'varchar(20)',
'PositiveIntegerField': 'integer CHECK ("%(column)s" >= 0)', 'PositiveIntegerField': 'integer CHECK ("%(column)s" >= 0)',
'PositiveSmallIntegerField': 'smallint CHECK ("%(column)s" >= 0)', 'PositiveSmallIntegerField': 'smallint CHECK ("%(column)s" >= 0)',
'SlugField': 'varchar(%(max_length)s)', 'SlugField': 'varchar(%(max_length)s)',
'SmallIntegerField': 'smallint', 'SmallIntegerField': 'smallint',
'TextField': 'text', 'TextField': 'text',
'TimeField': 'time', 'TimeField': 'time',
'USStateField': 'varchar(2)',
} }
def sql_table_creation_suffix(self): def sql_table_creation_suffix(self):

View File

@ -22,14 +22,12 @@ class DatabaseCreation(BaseDatabaseCreation):
'IPAddressField': 'char(15)', 'IPAddressField': 'char(15)',
'NullBooleanField': 'bool', 'NullBooleanField': 'bool',
'OneToOneField': 'integer', 'OneToOneField': 'integer',
'PhoneNumberField': 'varchar(20)',
'PositiveIntegerField': 'integer unsigned', 'PositiveIntegerField': 'integer unsigned',
'PositiveSmallIntegerField': 'smallint unsigned', 'PositiveSmallIntegerField': 'smallint unsigned',
'SlugField': 'varchar(%(max_length)s)', 'SlugField': 'varchar(%(max_length)s)',
'SmallIntegerField': 'smallint', 'SmallIntegerField': 'smallint',
'TextField': 'text', 'TextField': 'text',
'TimeField': 'time', 'TimeField': 'time',
'USStateField': 'varchar(2)',
} }
def sql_for_pending_references(self, model, style, pending_references): def sql_for_pending_references(self, model, style, pending_references):

View File

@ -741,16 +741,6 @@ class NullBooleanField(Field):
defaults.update(kwargs) defaults.update(kwargs)
return super(NullBooleanField, self).formfield(**defaults) return super(NullBooleanField, self).formfield(**defaults)
class PhoneNumberField(Field):
def get_internal_type(self):
return "PhoneNumberField"
def formfield(self, **kwargs):
from django.contrib.localflavor.us.forms import USPhoneNumberField
defaults = {'form_class': USPhoneNumberField}
defaults.update(kwargs)
return super(PhoneNumberField, self).formfield(**defaults)
class PositiveIntegerField(IntegerField): class PositiveIntegerField(IntegerField):
def get_internal_type(self): def get_internal_type(self):
return "PositiveIntegerField" return "PositiveIntegerField"
@ -876,16 +866,6 @@ class URLField(CharField):
defaults.update(kwargs) defaults.update(kwargs)
return super(URLField, self).formfield(**defaults) return super(URLField, self).formfield(**defaults)
class USStateField(Field):
def get_internal_type(self):
return "USStateField"
def formfield(self, **kwargs):
from django.contrib.localflavor.us.forms import USStateSelect
defaults = {'widget': USStateSelect}
defaults.update(kwargs)
return super(USStateField, self).formfield(**defaults)
class XMLField(TextField): class XMLField(TextField):
def __init__(self, verbose_name=None, name=None, schema_path=None, **kwargs): def __init__(self, verbose_name=None, name=None, schema_path=None, **kwargs):
self.schema_path = schema_path self.schema_path = schema_path

View File

@ -649,3 +649,8 @@ United States of America (``us``)
A form ``Select`` widget that uses a list of U.S. states/territories as its A form ``Select`` widget that uses a list of U.S. states/territories as its
choices. choices.
.. class:: us.models.USStateField
A model field that forms represent as a ``forms.USStateField`` field and
stores the two-letter U.S. state abbreviation in the database.

View File

@ -705,14 +705,6 @@ Like all ::class:`CharField` subclasses, :class:`URLField` takes the optional
:attr:`~CharField.max_length`argument. If you don't specify :attr:`~CharField.max_length`argument. If you don't specify
:attr:`~CharField.max_length`, a default of 200 is used. :attr:`~CharField.max_length`, a default of 200 is used.
``USStateField``
----------------
.. class:: USStateField([**options])
A two-letter U.S. state abbreviation. The admin represents this as an ``<input
type="text">`` (a single-line input).
``XMLField`` ``XMLField``
------------ ------------

View File

@ -625,13 +625,14 @@ model.
For example, this model has a few custom methods:: For example, this model has a few custom methods::
from django.contrib.localflavor.us.models import USStateField
class Person(models.Model): class Person(models.Model):
first_name = models.CharField(max_length=50) first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50) last_name = models.CharField(max_length=50)
birth_date = models.DateField() birth_date = models.DateField()
address = models.CharField(max_length=100) address = models.CharField(max_length=100)
city = models.CharField(max_length=50) city = models.CharField(max_length=50)
state = models.USStateField() # Yes, this is America-centric... state = USStateField() # Yes, this is America-centric...
def baby_boomer_status(self): def baby_boomer_status(self):
"Returns the person's baby-boomer status." "Returns the person's baby-boomer status."

View File

@ -73,10 +73,6 @@ the full list of conversions:
``TimeField`` ``TimeField`` ``TimeField`` ``TimeField``
``URLField`` ``URLField`` with ``verify_exists`` set ``URLField`` ``URLField`` with ``verify_exists`` set
to the model field's ``verify_exists`` to the model field's ``verify_exists``
``USStateField`` ``CharField`` with
``widget=USStateSelect``
(``USStateSelect`` is from
``django.contrib.localflavor.us``)
``XMLField`` ``CharField`` with ``widget=Textarea`` ``XMLField`` ``CharField`` with ``widget=Textarea``
=============================== ======================================== =============================== ========================================

View File

@ -82,8 +82,9 @@ class WriterProfile(models.Model):
def __unicode__(self): def __unicode__(self):
return "%s is %s" % (self.writer, self.age) return "%s is %s" % (self.writer, self.age)
from django.contrib.localflavor.us.models import PhoneNumberField
class PhoneNumber(models.Model): class PhoneNumber(models.Model):
phone = models.PhoneNumberField() phone = PhoneNumberField()
description = models.CharField(max_length=20) description = models.CharField(max_length=20)
def __unicode__(self): def __unicode__(self):

View File

@ -8,6 +8,7 @@ This class sets up a model for each model field type
from django.db import models from django.db import models
from django.contrib.contenttypes import generic from django.contrib.contenttypes import generic
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.contrib.localflavor.us.models import USStateField, PhoneNumberField
# The following classes are for testing basic data # The following classes are for testing basic data
# marshalling, including NULL values. # marshalling, including NULL values.
@ -52,7 +53,7 @@ class NullBooleanData(models.Model):
data = models.NullBooleanField(null=True) data = models.NullBooleanField(null=True)
class PhoneData(models.Model): class PhoneData(models.Model):
data = models.PhoneNumberField(null=True) data = PhoneNumberField(null=True)
class PositiveIntegerData(models.Model): class PositiveIntegerData(models.Model):
data = models.PositiveIntegerField(null=True) data = models.PositiveIntegerField(null=True)
@ -73,7 +74,7 @@ class TimeData(models.Model):
data = models.TimeField(null=True) data = models.TimeField(null=True)
class USStateData(models.Model): class USStateData(models.Model):
data = models.USStateField(null=True) data = USStateField(null=True)
class XMLData(models.Model): class XMLData(models.Model):
data = models.XMLField(null=True) data = models.XMLField(null=True)
@ -188,7 +189,7 @@ class IPAddressPKData(models.Model):
# data = models.NullBooleanField(primary_key=True) # data = models.NullBooleanField(primary_key=True)
class PhonePKData(models.Model): class PhonePKData(models.Model):
data = models.PhoneNumberField(primary_key=True) data = PhoneNumberField(primary_key=True)
class PositiveIntegerPKData(models.Model): class PositiveIntegerPKData(models.Model):
data = models.PositiveIntegerField(primary_key=True) data = models.PositiveIntegerField(primary_key=True)
@ -209,7 +210,7 @@ class SmallPKData(models.Model):
# data = models.TimeField(primary_key=True) # data = models.TimeField(primary_key=True)
class USStatePKData(models.Model): class USStatePKData(models.Model):
data = models.USStateField(primary_key=True) data = USStateField(primary_key=True)
# class XMLPKData(models.Model): # class XMLPKData(models.Model):
# data = models.XMLField(primary_key=True) # data = models.XMLField(primary_key=True)