Source code for sqlalchemy_utils.types.country
from sqlalchemy import types
import six
from .scalar_coercible import ScalarCoercible
from sqlalchemy_utils import i18n
class Country(object):
def __init__(self, code_or_country):
if isinstance(code_or_country, Country):
self.code = code_or_country.code
else:
self.code = code_or_country
@property
def name(self):
return i18n.get_locale().territories[self.code]
def __eq__(self, other):
if isinstance(other, Country):
return self.code == other.code
elif isinstance(other, six.string_types):
return self.code == other
else:
return NotImplemented
def __ne__(self, other):
return not (self == other)
def __repr__(self):
return '%s(%r)' % (self.__class__.__name__, self.code)
def __unicode__(self):
return self.name
[docs]class CountryType(types.TypeDecorator, ScalarCoercible):
"""
Changes Country objects to a string representation on the way in and
changes them back to Country objects on the way out.
In order to use CountryType you need to install Babel_ first.
.. _Babel: http://babel.pocoo.org/
::
from sqlalchemy_utils import CountryType, Country
class User(Base):
__tablename__ = 'user'
id = sa.Column(sa.Integer, autoincrement=True)
name = sa.Column(sa.Unicode(255))
country = sa.Column(CountryType)
user = User()
user.country = Country('FI')
session.add(user)
session.commit()
user.country # Country('FI')
user.country.name # Finland
print user.country # Finland
CountryType is scalar coercible::
user.country = 'US'
user.country # Country('US')
"""
impl = types.String(2)
python_type = Country
def process_bind_param(self, value, dialect):
if isinstance(value, Country):
return value.code
if isinstance(value, six.string_types):
return value
def process_result_value(self, value, dialect):
if value is not None:
return Country(value)
def _coerce(self, value):
if value is not None and not isinstance(value, Country):
return Country(value)
return value