diff --git a/twistar/dbobject.py b/twistar/dbobject.py index 2cb883d..4642c0b 100644 --- a/twistar/dbobject.py +++ b/twistar/dbobject.py @@ -58,6 +58,16 @@ class DBObject(Validator): # it will be of the form {'othername': , 'anothername': } RELATIONSHIP_CACHE = None + 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) + + def __init__(self, **kwargs): """ Constructor. DO NOT OVERWRITE. Use the L{DBObject.afterInit} method. @@ -377,7 +387,7 @@ def findOrCreate(klass, **attrs): def _findOrCreate(trans): def handle(result): if len(result) == 0: - return klass(**attrs).save() + return 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 91e7ee1..4763378 100644 --- a/twistar/utils.py +++ b/twistar/utils.py @@ -44,15 +44,13 @@ def createInstances(props, klass): @return: A C{Deferred} that will pass the result to a callback """ if type(props) is list: - ks = [klass(**prop) for prop in props] - ds = [defer.maybeDeferred(k.afterInit) for k in ks] - return defer.DeferredList(ds).addCallback(lambda _: ks) - - if props is not None: - k = klass(**props) - return defer.maybeDeferred(k.afterInit).addCallback(lambda _: k) - - return defer.succeed(None) + return defer.DeferredList( + [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) + else: + return defer.succeed(None) def dictToWhere(attrs, joiner="AND"):