Пример #1
0
    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
Пример #2
0
    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
Пример #3
0
    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
Пример #4
0
    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
Пример #5
0
    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
Пример #6
0
    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)
Пример #8
0
    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
Пример #9
0
    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
Пример #10
0
    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)