Skip to content

Does not seem to work with a minimal pyramid application #39

@mateus-geru

Description

@mateus-geru

Hi!

I've been failing to make PostgreSQL-Audit work with a small pyramid application I've built to test their integration: the application declares a Customer model and exposes an endpoint which updates the versioned table by suffixing an s to the customer's name... it should be enough to trigger the due listeners and populate the transaction and activity tables, but no such thing happens.

Given the documentation, there shouldn't be much setup to use this lib.

My actual goal is to use PostgreSQL-Audit in a pyramid application using pyramid-tm to back the commit/rollback at request time and a ZopeTransactionExtension to back the db sessions with a transaction, but it doesn't seem to work with a way simpler setup.

Am I missing something? Any thoughts?

Thanks!

some dependencies:

python: 3.6.7
PostgreSQL-Audit==0.11.1
SQLAlchemy==1.3.8 
SQLAlchemy-Utils==0.34.2
psycopg2==2.8.3
pyramid==1.10.4

Application structure:

├── alembic.ini
├── app.py
├── conf.ini
├── migrations
│   ├── env.py
│   └── versions
│       ├── 9c2b8f5f3aca_first.py
│       └── a9a328ebaaaa_add_versioning.py
└── setup.py

app.py (it can be ran with gunicorn --paste conf.ini)

from pyramid.config import Configurator
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import scoped_session, sessionmaker


DBSession = scoped_session(sessionmaker(autoflush=False))
Base = declarative_base()


from postgresql_audit import versioning_manager
versioning_manager.init(Base)


class Customer(Base):

    __tablename__ = 'customer'
    __versioned__ = {}

    id = Column(Integer, primary_key=True)
    name = Column(String)

    def json(self):
        return {'id': self.id, 'name': self.name}


def main(global_config, **settings):

    config = Configurator()

    engine = create_engine(name_or_url=settings['sqlalchemy.url'])
    DBSession.configure(bind=engine)
    Base.metadata.bind = engine

    def customer(request):
        customers = []
        for c in DBSession.query(Customer).all():
            customers.append(c.json())

        return customers

    config.add_route('customer', '/')
    config.add_view(customer, route_name='customer', renderer='json')

    def update(request):
        c = DBSession.query(Customer).first()
        c.name = c.name + 's'

        DBSession.flush()
        DBSession.commit()

        return {'id': c.id, 'name': c.name}

    config.add_route('update', '/update')
    config.add_view(update, route_name='update', renderer='json')

    return config.make_wsgi_app()

conf.ini

[app:main]
use = egg:test_pg_audit

sqlalchemy.url = postgres+psycopg2://dev:dev@localhost:5432/test_pg_audit

[server:main]
use = egg:gunicorn#main
workers = 4
preload = true
reload = false
accesslog = -
loglevel = debug
host = 127.0.0.1
port = 6543

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions