From 1bddac37b69152d919a3af29f2844ae3e34c7237 Mon Sep 17 00:00:00 2001 From: Malcolm Tredinnick Date: Wed, 4 Apr 2007 06:34:19 +0000 Subject: [PATCH] Moved smart_unicode and StrAndUnicode to django.utils.encoding. They are useful outside of newforms. This is backwards compatible as far as smart_unicode goes (since newforms.util still imports it). All imports of smart_unicode and StrAndUnicode have also been updated. git-svn-id: http://code.djangoproject.com/svn/django/trunk@4918 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/contrib/localflavor/br/forms.py | 2 +- django/contrib/localflavor/fr/forms.py | 2 +- django/contrib/localflavor/it/forms.py | 1 - django/contrib/localflavor/usa/forms.py | 6 ++--- django/newforms/fields.py | 3 ++- django/newforms/forms.py | 3 ++- django/newforms/util.py | 31 +------------------------ django/newforms/widgets.py | 3 ++- django/utils/encoding.py | 28 ++++++++++++++++++++++ tests/regressiontests/forms/tests.py | 2 +- 10 files changed, 41 insertions(+), 40 deletions(-) create mode 100644 django/utils/encoding.py diff --git a/django/contrib/localflavor/br/forms.py b/django/contrib/localflavor/br/forms.py index 8e3285729d..29ad4df53d 100644 --- a/django/contrib/localflavor/br/forms.py +++ b/django/contrib/localflavor/br/forms.py @@ -5,7 +5,7 @@ BR-specific Form helpers from django.newforms import ValidationError from django.newforms.fields import Field, RegexField, Select, EMPTY_VALUES -from django.newforms.util import smart_unicode +from django.utils.encoding import smart_unicode from django.utils.translation import gettext import re diff --git a/django/contrib/localflavor/fr/forms.py b/django/contrib/localflavor/fr/forms.py index ee87c5cda2..550596b880 100644 --- a/django/contrib/localflavor/fr/forms.py +++ b/django/contrib/localflavor/fr/forms.py @@ -4,7 +4,7 @@ FR-specific Form helpers from django.newforms import ValidationError from django.newforms.fields import Field, RegexField, Select, EMPTY_VALUES -from django.newforms.util import smart_unicode +from django.utils.encoding import smart_unicode from django.utils.translation import gettext import re diff --git a/django/contrib/localflavor/it/forms.py b/django/contrib/localflavor/it/forms.py index 6760d91799..8e9d8bc11d 100644 --- a/django/contrib/localflavor/it/forms.py +++ b/django/contrib/localflavor/it/forms.py @@ -4,7 +4,6 @@ IT-specific Form helpers from django.newforms import ValidationError from django.newforms.fields import Field, RegexField, Select, EMPTY_VALUES -from django.newforms.util import smart_unicode from django.utils.translation import gettext import re diff --git a/django/contrib/localflavor/usa/forms.py b/django/contrib/localflavor/usa/forms.py index 8d76a9269e..feda68291b 100644 --- a/django/contrib/localflavor/usa/forms.py +++ b/django/contrib/localflavor/usa/forms.py @@ -4,7 +4,7 @@ USA-specific Form helpers from django.newforms import ValidationError from django.newforms.fields import Field, RegexField, Select, EMPTY_VALUES -from django.newforms.util import smart_unicode +from django.utils.encoding import smart_unicode from django.utils.translation import gettext import re @@ -32,9 +32,9 @@ class USPhoneNumberField(Field): class USSocialSecurityNumberField(Field): """ A United States Social Security number. - + Checks the following rules to determine whether the number is valid: - + * Conforms to the XXX-XX-XXXX format. * No group consists entirely of zeroes. * The leading group is not "666" (block "666" will never be allocated). diff --git a/django/newforms/fields.py b/django/newforms/fields.py index 72c5047030..c3b74e93f7 100644 --- a/django/newforms/fields.py +++ b/django/newforms/fields.py @@ -3,7 +3,8 @@ Field classes """ from django.utils.translation import gettext -from util import ErrorList, ValidationError, smart_unicode +from django.utils.encoding import smart_unicode +from util import ErrorList, ValidationError from widgets import TextInput, PasswordInput, HiddenInput, MultipleHiddenInput, CheckboxInput, Select, NullBooleanSelect, SelectMultiple import datetime import re diff --git a/django/newforms/forms.py b/django/newforms/forms.py index 2b3aa97428..9affe2fc82 100644 --- a/django/newforms/forms.py +++ b/django/newforms/forms.py @@ -4,9 +4,10 @@ Form classes from django.utils.datastructures import SortedDict, MultiValueDict from django.utils.html import escape +from django.utils.encoding import StrAndUnicode from fields import Field from widgets import TextInput, Textarea, HiddenInput, MultipleHiddenInput -from util import flatatt, StrAndUnicode, ErrorDict, ErrorList, ValidationError +from util import flatatt, ErrorDict, ErrorList, ValidationError import copy __all__ = ('BaseForm', 'Form') diff --git a/django/newforms/util.py b/django/newforms/util.py index f98027c2e3..5fc0223f5b 100644 --- a/django/newforms/util.py +++ b/django/newforms/util.py @@ -1,41 +1,12 @@ from django.conf import settings from django.utils.html import escape from django.utils.functional import Promise, lazy +from django.utils.encoding import smart_unicode # Converts a dictionary to a single string with key="value", XML-style with # a leading space. Assumes keys do not need to be XML-escaped. flatatt = lambda attrs: u''.join([u' %s="%s"' % (k, escape(v)) for k, v in attrs.items()]) -def smart_unicode(s): - if isinstance(s, Promise): - # The input is something from gettext_lazy or similar. We don't want to - # translate it until render time, so defer the conversion. - return smart_unicode_lazy(s) - else: - return smart_unicode_immediate(s) - -def smart_unicode_immediate(s): - if not isinstance(s, basestring): - if hasattr(s, '__unicode__'): - s = unicode(s) - else: - s = unicode(str(s), settings.DEFAULT_CHARSET) - elif not isinstance(s, unicode): - s = unicode(s, settings.DEFAULT_CHARSET) - return s - -smart_unicode_lazy = lazy(smart_unicode_immediate, unicode) - -class StrAndUnicode(object): - """ - A class whose __str__ returns its __unicode__ as a bytestring - according to settings.DEFAULT_CHARSET. - - Useful as a mix-in. - """ - def __str__(self): - return self.__unicode__().encode(settings.DEFAULT_CHARSET) - class ErrorDict(dict): """ A collection of errors that knows how to display itself in various formats. diff --git a/django/newforms/widgets.py b/django/newforms/widgets.py index 58d8ab1322..8d292673a5 100644 --- a/django/newforms/widgets.py +++ b/django/newforms/widgets.py @@ -9,10 +9,11 @@ __all__ = ( 'MultiWidget', 'SplitDateTimeWidget', ) -from util import flatatt, StrAndUnicode, smart_unicode +from util import flatatt from django.utils.datastructures import MultiValueDict from django.utils.html import escape from django.utils.translation import gettext +from django.utils.encoding import StrAndUnicode, smart_unicode from itertools import chain try: diff --git a/django/utils/encoding.py b/django/utils/encoding.py new file mode 100644 index 0000000000..bf59f44e31 --- /dev/null +++ b/django/utils/encoding.py @@ -0,0 +1,28 @@ +from django.conf import settings +from django.utils.functional import Promise + +def smart_unicode(s): + if isinstance(s, Promise): + # The input is the result of a gettext_lazy() call, or similar. It will + # already be encoded in DEFAULT_CHARSET on evaluation and we don't want + # to evaluate it until render time. + return s + if not isinstance(s, basestring,): + if hasattr(s, '__unicode__'): + s = unicode(s) + else: + s = unicode(str(s), settings.DEFAULT_CHARSET) + elif not isinstance(s, unicode): + s = unicode(s, settings.DEFAULT_CHARSET) + return s + +class StrAndUnicode(object): + """ + A class whose __str__ returns its __unicode__ as a bytestring + according to settings.DEFAULT_CHARSET. + + Useful as a mix-in. + """ + def __str__(self): + return self.__unicode__().encode(settings.DEFAULT_CHARSET) + diff --git a/tests/regressiontests/forms/tests.py b/tests/regressiontests/forms/tests.py index 8ecc9f0205..864e7aa39c 100644 --- a/tests/regressiontests/forms/tests.py +++ b/tests/regressiontests/forms/tests.py @@ -3276,7 +3276,7 @@ True ################################# # smart_unicode tests ->>> from django.newforms.util import smart_unicode +>>> from django.utils.encoding import smart_unicode >>> class Test: ... def __str__(self): ... return 'ŠĐĆŽćžšđ'