Added LocaleType
This commit is contained in:
@@ -26,6 +26,7 @@ from .types import (
|
|||||||
instrumented_list,
|
instrumented_list,
|
||||||
InstrumentedList,
|
InstrumentedList,
|
||||||
IPAddressType,
|
IPAddressType,
|
||||||
|
LocaleType,
|
||||||
Password,
|
Password,
|
||||||
PasswordType,
|
PasswordType,
|
||||||
PhoneNumber,
|
PhoneNumber,
|
||||||
@@ -71,6 +72,7 @@ __all__ = (
|
|||||||
ImproperlyConfigured,
|
ImproperlyConfigured,
|
||||||
InstrumentedList,
|
InstrumentedList,
|
||||||
IPAddressType,
|
IPAddressType,
|
||||||
|
LocaleType,
|
||||||
Merger,
|
Merger,
|
||||||
NumberRange,
|
NumberRange,
|
||||||
NumberRangeException,
|
NumberRangeException,
|
||||||
|
@@ -5,6 +5,7 @@ from .color import ColorType
|
|||||||
from .country import CountryType, Country
|
from .country import CountryType, Country
|
||||||
from .email import EmailType
|
from .email import EmailType
|
||||||
from .ip_address import IPAddressType
|
from .ip_address import IPAddressType
|
||||||
|
from .locale import LocaleType
|
||||||
from .number_range import (
|
from .number_range import (
|
||||||
NumberRange,
|
NumberRange,
|
||||||
NumberRangeException,
|
NumberRangeException,
|
||||||
@@ -28,6 +29,7 @@ __all__ = (
|
|||||||
Country,
|
Country,
|
||||||
EmailType,
|
EmailType,
|
||||||
IPAddressType,
|
IPAddressType,
|
||||||
|
LocaleType,
|
||||||
NumberRange,
|
NumberRange,
|
||||||
NumberRangeException,
|
NumberRangeException,
|
||||||
NumberRangeRawType,
|
NumberRangeRawType,
|
||||||
|
40
sqlalchemy_utils/types/locale.py
Normal file
40
sqlalchemy_utils/types/locale.py
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
from sqlalchemy import types
|
||||||
|
import six
|
||||||
|
from .scalar_coercible import ScalarCoercible
|
||||||
|
from ..exceptions import ImproperlyConfigured
|
||||||
|
babel = None
|
||||||
|
try:
|
||||||
|
import babel
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class LocaleType(types.TypeDecorator, ScalarCoercible):
|
||||||
|
"""
|
||||||
|
Changes babel.Locale objects to a string representation on the way in and
|
||||||
|
changes them back to Locale objects on the way out.
|
||||||
|
"""
|
||||||
|
|
||||||
|
impl = types.Unicode(10)
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
if babel is None:
|
||||||
|
raise ImproperlyConfigured(
|
||||||
|
'Babel packaged is required with LocaleType.'
|
||||||
|
)
|
||||||
|
|
||||||
|
def process_bind_param(self, value, dialect):
|
||||||
|
if isinstance(value, babel.Locale):
|
||||||
|
return six.text_type(value)
|
||||||
|
|
||||||
|
if isinstance(value, six.string_types):
|
||||||
|
return value
|
||||||
|
|
||||||
|
def process_result_value(self, value, dialect):
|
||||||
|
if value is not None:
|
||||||
|
return babel.Locale(value)
|
||||||
|
|
||||||
|
def _coerce(self, value):
|
||||||
|
if value is not None and not isinstance(value, babel.Locale):
|
||||||
|
return babel.Locale(value)
|
||||||
|
return value
|
@@ -39,7 +39,7 @@ class TestCountryType(TestCase):
|
|||||||
|
|
||||||
self.User = User
|
self.User = User
|
||||||
|
|
||||||
def test_color_parameter_processing(self):
|
def test_parameter_processing(self):
|
||||||
user = self.User(
|
user = self.User(
|
||||||
country=Country(u'fi')
|
country=Country(u'fi')
|
||||||
)
|
)
|
||||||
|
Reference in New Issue
Block a user