def create(self, properties, commit=True): # noinspection properties item = self.model() for key, value in properties.items(): setattr(item, key, value) before_create.send(self.resource, item=item) session = self._get_session() try: session.add(item) if commit: session.commit() except IntegrityError as e: session.rollback() if hasattr(e.orig, 'pgcode'): if e.orig.pgcode == "23505": # duplicate key raise DuplicateKey(detail=e.orig.diag.message_detail) if current_app.debug: raise BackendConflict(debug_info=dict(exception_message=str(e), statement=e.statement, params=e.params)) raise BackendConflict() after_create.send(self.resource, item=item) return item
def update(self, item, changes, commit=True): actual_changes = { key: value for key, value in changes.items() if get_value(key, item, None) != value } signals.before_update.send(self.resource, item=item, changes=actual_changes) for key, value in changes.items(): setattr(item, key, value) try: item.save() except pw.IntegrityError as e: if current_app.debug: raise BackendConflict(debug_info=e.args) raise BackendConflict() signals.after_update.send(self.resource, item=item, changes=actual_changes) return item
def update(self, item, changes, commit=True): session = self._get_session() actual_changes = { key: value for key, value in changes.items() if self._is_change(get_value(key, item, None), value) } try: before_update.send(self.resource, item=item, changes=actual_changes) for key, value in changes.items(): setattr(item, key, value) if commit: session.commit() except IntegrityError as e: session.rollback() # XXX need some better way to detect postgres engine. if hasattr(e.orig, 'pgcode'): if e.orig.pgcode == '23505': # duplicate key raise DuplicateKey(detail=e.orig.diag.message_detail) if current_app.debug: raise BackendConflict(debug_info=dict(exception_message=str(e), statement=e.statement, params=e.params)) raise BackendConflict() after_update.send(self.resource, item=item, changes=actual_changes) return item
def update(self, item, changes): session = self._get_session() with session.begin_nested(): actual_changes = { key: value for key, value in changes.items() if self._is_change(get_value(key, item, None), value) } before_update.send(self.resource, item=item, changes=actual_changes) try: for key, value in changes.items(): setattr(item, key, value) session.flush() except IntegrityError as exc: # XXX need some better way to detect postgres engine. if hasattr(exc.orig, 'pgcode'): if exc.orig.pgcode == '23505': # duplicate key raise DuplicateKey(detail=exc.orig.diag.message_detail) from exc if current_app.debug: raise BackendConflict( debug_info=dict( exception_message=str(exc), statement=exc.statement, params=exc.params, ) ) from exc raise BackendConflict() from exc after_update.send(self.resource, item=item, changes=actual_changes) return item
def create(self, properties): session = self._get_session() with session.begin_nested(): # noinspection properties item = self.model(**properties) before_create.send(self.resource, item=item) try: session.add(item) session.flush() except IntegrityError as exc: if hasattr(exc.orig, 'pgcode'): if exc.orig.pgcode == "23505": # duplicate key raise DuplicateKey(detail=exc.orig.diag.message_detail) from exc if current_app.debug: raise BackendConflict( debug_info=dict( exception_message=str(exc), statement=exc.statement, params=exc.params, ) ) from exc raise BackendConflict() from exc after_create.send(self.resource, item=item) return item
def integrity_error_handler(self, exception): if hasattr(exception.orig, POSTGRES_ERROR_ATTRIBUTE): # duplicate key if getattr(exception.orig, POSTGRES_ERROR_ATTRIBUTE) == UNIQUE_VIOLATION: raise BackendConflict( message=exception.orig.diag.message_detail) if self.debug_mode: raise BackendConflict(debug_info=dict( exception_message=str(exception), statement=exception.statement, params=exception.params, )) raise BackendConflict()
def delete(self, item, commit=True): session = self._get_session() before_delete.send(self.resource, item=item) try: session.delete(item) self.commit_or_flush(commit) except IntegrityError as e: session.rollback() if current_app.debug: raise BackendConflict(debug_info=dict(exception_message=str(e), statement=e.statement, params=e.params)) raise BackendConflict() after_delete.send(self.resource, item=item)
def create(self, properties, commit=True): item = self.model() for key, value in properties.items(): setattr(item, key, value) before_create.send(self.resource, item=item) try: item.save() except OperationError as e: if current_app.debug: raise BackendConflict(debug_info=dict(statement=e.args)) raise BackendConflict() after_create.send(self.resource, item=item) return item
def create(self, properties, commit=True): item = self.model() for key, value in properties.items(): setattr(item, key, value) signals.before_create.send(self.resource, item=item) try: item.save() except pw.IntegrityError as e: if current_app.debug: raise BackendConflict(debug_info=e.args) raise BackendConflict() signals.after_create.send(self.resource, item=item) return item
def delete(self, item): session = self._get_session() with session.begin_nested(): before_delete.send(self.resource, item=item) try: session.delete(item) session.flush() except IntegrityError as exc: if current_app.debug: raise BackendConflict( debug_info=dict( exception_message=str(exc), statement=exc.statement, params=exc.params, ) ) from exc raise BackendConflict() from exc after_delete.send(self.resource, item=item)