summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLoic Bistuer <loic.bistuer@sixmedia.com>2013-10-19 00:14:01 +0700
committerTim Graham <timograham@gmail.com>2013-10-19 12:10:18 -0400
commit8d6953d55c3aba04bbaf0f268499d6e405c653ff (patch)
tree4efe24777591fb1d71c62a104b246818af8b5de8
parent584110417f6a3c16cc0c6723825a21940a9a2bc4 (diff)
Added support for serializing class methods. - Refs #21290.
The new handling allows us to do away with the whitelisting that was required to support date and datetime objects.
-rw-r--r--django/db/migrations/writer.py15
-rw-r--r--tests/migrations/test_writer.py2
2 files changed, 5 insertions, 12 deletions
diff --git a/django/db/migrations/writer.py b/django/db/migrations/writer.py
index 333f39d6e0..0ee737811d 100644
--- a/django/db/migrations/writer.py
+++ b/django/db/migrations/writer.py
@@ -148,18 +148,9 @@ class MigrationWriter(object):
return cls.serialize_deconstructed(path, args, kwargs)
# Functions
elif isinstance(value, (types.FunctionType, types.BuiltinFunctionType)):
- # Special-cases, as these don't have im_class
- special_cases = [
- (datetime.datetime.now, "datetime.datetime.now", ["import datetime"]),
- (datetime.datetime.utcnow, "datetime.datetime.utcnow", ["import datetime"]),
- (datetime.date.today, "datetime.date.today", ["import datetime"]),
- ]
- for func, string, imports in special_cases:
- if func == value: # For some reason "utcnow is not utcnow"
- return string, set(imports)
- # Method?
- if hasattr(value, "im_class"):
- klass = value.im_class
+ # @classmethod?
+ if getattr(value, "__self__", None) and isinstance(value.__self__, type):
+ klass = value.__self__
module = klass.__module__
return "%s.%s.%s" % (module, klass.__name__, value.__name__), set(["import %s" % module])
elif hasattr(value, 'deconstruct'):
diff --git a/tests/migrations/test_writer.py b/tests/migrations/test_writer.py
index dbee0d1130..3e6fe50793 100644
--- a/tests/migrations/test_writer.py
+++ b/tests/migrations/test_writer.py
@@ -73,6 +73,8 @@ class WriterTests(TestCase):
# Datetime stuff
self.assertSerializedEqual(datetime.datetime.utcnow())
self.assertSerializedEqual(datetime.datetime.utcnow)
+ self.assertSerializedEqual(datetime.datetime.today())
+ self.assertSerializedEqual(datetime.datetime.today)
self.assertSerializedEqual(datetime.date.today())
self.assertSerializedEqual(datetime.date.today)
# Django fields