Author: mtredinnick
Date: 2008-11-16 02:50:06 -0600 (Sun, 16 Nov 2008)
New Revision: 9467

Modified:
   django/trunk/django/db/backends/mysql/base.py
   django/trunk/tests/modeltests/field_defaults/models.py
Log:
Fixed #6052 -- Worked around a bug in MySQLdb with regards to handling
SafeUnicode (handle SafeString similarly, just to be safe). Based on a patch
from sfllaw.


Modified: django/trunk/django/db/backends/mysql/base.py
===================================================================
--- django/trunk/django/db/backends/mysql/base.py       2008-11-16 08:48:24 UTC 
(rev 9466)
+++ django/trunk/django/db/backends/mysql/base.py       2008-11-16 08:50:06 UTC 
(rev 9467)
@@ -29,6 +29,7 @@
 from django.db.backends.mysql.creation import DatabaseCreation
 from django.db.backends.mysql.introspection import DatabaseIntrospection
 from django.db.backends.mysql.validation import DatabaseValidation
+from django.utils.safestring import SafeString, SafeUnicode
 
 # Raise exceptions for database warnings if DEBUG is on
 from django.conf import settings
@@ -39,12 +40,11 @@
 DatabaseError = Database.DatabaseError
 IntegrityError = Database.IntegrityError
 
-# MySQLdb-1.2.1 supports the Python boolean type, and only uses datetime
-# module for time-related columns; older versions could have used mx.DateTime
-# or strings if there were no datetime module. However, MySQLdb still returns
-# TIME columns as timedelta -- they are more like timedelta in terms of actual
-# behavior as they are signed and include days -- and Django expects time, so
-# we still need to override that.
+# MySQLdb-1.2.1 returns TIME columns as timedelta -- they are more like
+# timedelta in terms of actual behavior as they are signed and include days --
+# and Django expects time, so we still need to override that. We also need to
+# add special handling for SafeUnicode and SafeString as MySQLdb's type
+# checking is too tight to catch those (see Django ticket #6052).
 django_conversions = conversions.copy()
 django_conversions.update({
     FIELD_TYPE.TIME: util.typecast_time,
@@ -174,7 +174,7 @@
     def value_to_db_datetime(self, value):
         if value is None:
             return None
-        
+
         # MySQL doesn't support tz-aware datetimes
         if value.tzinfo is not None:
             raise ValueError("MySQL backend does not support timezone-aware 
datetimes.")
@@ -185,11 +185,11 @@
     def value_to_db_time(self, value):
         if value is None:
             return None
-            
+
         # MySQL doesn't support tz-aware datetimes
         if value.tzinfo is not None:
             raise ValueError("MySQL backend does not support timezone-aware 
datetimes.")
-        
+
         # MySQL doesn't support microseconds
         return unicode(value.replace(microsecond=0))
 
@@ -260,6 +260,8 @@
                 kwargs['port'] = int(settings.DATABASE_PORT)
             kwargs.update(self.options)
             self.connection = Database.connect(**kwargs)
+            self.connection.encoders[SafeUnicode] = 
self.connection.encoders[unicode]
+            self.connection.encoders[SafeString] = 
self.connection.encoders[str]
         cursor = CursorWrapper(self.connection.cursor())
         return cursor
 

Modified: django/trunk/tests/modeltests/field_defaults/models.py
===================================================================
--- django/trunk/tests/modeltests/field_defaults/models.py      2008-11-16 
08:48:24 UTC (rev 9466)
+++ django/trunk/tests/modeltests/field_defaults/models.py      2008-11-16 
08:50:06 UTC (rev 9467)
@@ -1,3 +1,4 @@
+# coding: utf-8
 """
 32. Callable defaults
 
@@ -19,7 +20,7 @@
     def __unicode__(self):
         return self.headline
 
-__test__ = {'API_TESTS':"""
+__test__ = {'API_TESTS': u"""
 >>> from datetime import datetime
 
 # No articles are in the system yet.
@@ -51,8 +52,8 @@
 
 # make sure that SafeString/SafeUnicode fields work
 >>> from django.utils.safestring import SafeUnicode, SafeString
->>> a.headline = SafeUnicode(u'SafeUnicode Headline')
+>>> a.headline = SafeUnicode(u'Iñtërnâtiônàlizætiøn1')
 >>> a.save()
->>> a.headline = SafeString(u'SafeString Headline')
+>>> a.headline = SafeString(u'Iñtërnâtiônàlizætiøn1'.encode('utf-8'))
 >>> a.save()
 """}


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to