Removed a Python 3-compatibility hack.

Thanks Preston Holmes for the patch.
This commit is contained in:
Aymeric Augustin 2012-07-23 13:48:04 +02:00
parent ebc89a800a
commit ae4125ffce
1 changed files with 7 additions and 13 deletions

View File

@ -34,7 +34,10 @@ class ModelBase(type):
""" """
def __new__(cls, name, bases, attrs): def __new__(cls, name, bases, attrs):
super_new = super(ModelBase, cls).__new__ super_new = super(ModelBase, cls).__new__
parents = [b for b in bases if isinstance(b, ModelBase)] # six.with_metaclass() inserts an extra class called 'NewBase' in the
# inheritance tree: Model -> NewBase -> object. Ignore this class.
parents = [b for b in bases if isinstance(b, ModelBase) and
not (b.__name__ == 'NewBase' and b.__mro__ == (b, object))]
if not parents: if not parents:
# If this isn't a subclass of Model, don't do anything special. # If this isn't a subclass of Model, don't do anything special.
return super_new(cls, name, bases, attrs) return super_new(cls, name, bases, attrs)
@ -276,8 +279,7 @@ class ModelState(object):
# This impacts validation only; it has no effect on the actual save. # This impacts validation only; it has no effect on the actual save.
self.adding = True self.adding = True
class Model(six.with_metaclass(ModelBase, object)):
class ModelWithoutMeta(object):
_deferred = False _deferred = False
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@ -370,7 +372,7 @@ class ModelWithoutMeta(object):
pass pass
if kwargs: if kwargs:
raise TypeError("'%s' is an invalid keyword argument for this function" % kwargs.keys()[0]) raise TypeError("'%s' is an invalid keyword argument for this function" % kwargs.keys()[0])
super(ModelWithoutMeta, self).__init__() super(Model, self).__init__()
signals.post_init.send(sender=self.__class__, instance=self) signals.post_init.send(sender=self.__class__, instance=self)
def __repr__(self): def __repr__(self):
@ -402,7 +404,7 @@ class ModelWithoutMeta(object):
only module-level classes can be pickled by the default path. only module-level classes can be pickled by the default path.
""" """
if not self._deferred: if not self._deferred:
return super(ModelWithoutMeta, self).__reduce__() return super(Model, self).__reduce__()
data = self.__dict__ data = self.__dict__
defers = [] defers = []
for field in self._meta.fields: for field in self._meta.fields:
@ -877,14 +879,6 @@ class ModelWithoutMeta(object):
raise ValidationError(errors) raise ValidationError(errors)
# For unknown reasons, six.with_metaclass doesn't work correctly for Model.
# Fallback to exec'ing the appropriate syntax for each Python version.
if six.PY3:
six.exec_("class Model(ModelWithoutMeta, metaclass=ModelBase): pass")
else:
six.exec_("class Model(ModelWithoutMeta): __metaclass__ = ModelBase")
############################################ ############################################
# HELPER FUNCTIONS (CURRIED MODEL METHODS) # # HELPER FUNCTIONS (CURRIED MODEL METHODS) #