Commit 8d6953d5 authored by Loic Bistuer's avatar Loic Bistuer Committed by Tim Graham
Browse files

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.
parent 58411041
Loading
Loading
Loading
Loading
+3 −12
Original line number Diff line number Diff line
@@ -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'):
+2 −0
Original line number Diff line number Diff line
@@ -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