diff --git a/twistar/dbobject.py b/twistar/dbobject.py index 4642c0b..3ea9782 100644 --- a/twistar/dbobject.py +++ b/twistar/dbobject.py @@ -61,11 +61,15 @@ class DBObject(Validator): def __new__(cls, *args, **kwargs): try: ret = super(DBObject, cls).__new__(cls, *args, **kwargs) - ret.__init__(*args, **kwargs) except: return defer.fail() else: - return defer.maybeDeferred(ret.afterInit).addCallback(lambda _: ret) + d = ret.afterInit() + if isinstance(d, defer.Deferred): + ret.__init__(*args, **kwargs) + return d.addCallback(lambda _: ret) + else: + return ret def __init__(self, **kwargs): @@ -387,7 +391,7 @@ def findOrCreate(klass, **attrs): def _findOrCreate(trans): def handle(result): if len(result) == 0: - return klass(**attrs).addCallback(lambda inst: inst.save()) + return defer.maybeDeferred(klass, **attrs).addCallback(lambda inst: inst.save()) return result[0] return klass.findBy(**attrs).addCallback(handle) return _findOrCreate() diff --git a/twistar/utils.py b/twistar/utils.py index 4763378..1125a86 100644 --- a/twistar/utils.py +++ b/twistar/utils.py @@ -45,7 +45,7 @@ def createInstances(props, klass): """ if type(props) is list: return defer.DeferredList( - [klass(**prop) for prop in props], fireOnOneErrback=True, consumeErrors=True + [defer.maybeDeferred(klass, **prop) for prop in props], fireOnOneErrback=True, consumeErrors=True ).addCallback(lambda result: [x[1] for x in result]) elif props is not None: return klass(**props)