Use latest zope.sqlalchemy package
session / transaction registration modified per upstream changes, but previous logic kept to support older versions of zope.sqlalchemy - for now, although probably should require minimum version soon?
This commit is contained in:
parent
9263dd4ddb
commit
5f70a524e9
6
setup.py
6
setup.py
|
@ -62,11 +62,6 @@ requires = [
|
||||||
#
|
#
|
||||||
# package # low high
|
# package # low high
|
||||||
|
|
||||||
# TODO: previously was capping this to pre-1.0 although i'm not sure why.
|
|
||||||
# however the 1.2 release has some breaking changes which require refactor.
|
|
||||||
# cf. https://pypi.org/project/zope.sqlalchemy/#id3
|
|
||||||
'zope.sqlalchemy<1.2', # 0.7 1.1
|
|
||||||
|
|
||||||
# TODO: apparently they jumped from 0.1 to 0.9 and that broke us...
|
# TODO: apparently they jumped from 0.1 to 0.9 and that broke us...
|
||||||
# (0.1 was released on 2014-09-14 and then 0.9 came out on 2018-09-27)
|
# (0.1 was released on 2014-09-14 and then 0.9 came out on 2018-09-27)
|
||||||
# (i've cached 0.1 at pypi.rattailproject.org just in case it disappears)
|
# (i've cached 0.1 at pypi.rattailproject.org just in case it disappears)
|
||||||
|
@ -106,6 +101,7 @@ requires = [
|
||||||
'waitress', # 0.8.1
|
'waitress', # 0.8.1
|
||||||
'WebHelpers2', # 2.0
|
'WebHelpers2', # 2.0
|
||||||
'WTForms', # 2.1
|
'WTForms', # 2.1
|
||||||
|
'zope.sqlalchemy', # 0.7 2.0
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
################################################################################
|
################################################################################
|
||||||
#
|
#
|
||||||
# Rattail -- Retail Software Framework
|
# Rattail -- Retail Software Framework
|
||||||
# Copyright © 2010-2021 Lance Edgar
|
# Copyright © 2010-2023 Lance Edgar
|
||||||
#
|
#
|
||||||
# This file is part of Rattail.
|
# This file is part of Rattail.
|
||||||
#
|
#
|
||||||
|
@ -24,8 +24,6 @@
|
||||||
Database Stuff
|
Database Stuff
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from __future__ import unicode_literals, absolute_import
|
|
||||||
|
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
from zope.sqlalchemy import datamanager
|
from zope.sqlalchemy import datamanager
|
||||||
import sqlalchemy_continuum as continuum
|
import sqlalchemy_continuum as continuum
|
||||||
|
@ -111,20 +109,51 @@ def join_transaction(session, initial_state=datamanager.STATUS_ACTIVE, transacti
|
||||||
DataManager(session, initial_state, transaction_manager, keep_session=keep_session)
|
DataManager(session, initial_state, transaction_manager, keep_session=keep_session)
|
||||||
|
|
||||||
|
|
||||||
class ZopeTransactionExtension(datamanager.ZopeTransactionExtension):
|
if zope_sqlalchemy_version_parsed >= parse_version('1.2'): # 1.2+
|
||||||
"""Record that a flush has occurred on a session's connection. This allows
|
|
||||||
the DataManager to rollback rather than commit on read only transactions.
|
|
||||||
|
|
||||||
.. note::
|
class ZopeTransactionEvents(datamanager.ZopeTransactionEvents):
|
||||||
This class is copied from upstream, and tweaked so that our custom
|
"""
|
||||||
:func:`join_transaction()` will be used.
|
Record that a flush has occurred on a session's
|
||||||
"""
|
connection. This allows the DataManager to rollback rather
|
||||||
|
than commit on read only transactions.
|
||||||
|
|
||||||
def after_begin(self, session, transaction, connection):
|
.. note::
|
||||||
join_transaction(session, self.initial_state, self.transaction_manager, self.keep_session)
|
This class is copied from upstream, and tweaked so that our
|
||||||
|
custom :func:`join_transaction()` will be used.
|
||||||
|
"""
|
||||||
|
|
||||||
def after_attach(self, session, instance):
|
def after_begin(self, session, transaction, connection):
|
||||||
join_transaction(session, self.initial_state, self.transaction_manager, self.keep_session)
|
join_transaction(session, self.initial_state,
|
||||||
|
self.transaction_manager, self.keep_session)
|
||||||
|
|
||||||
|
def after_attach(self, session, instance):
|
||||||
|
join_transaction(session, self.initial_state,
|
||||||
|
self.transaction_manager, self.keep_session)
|
||||||
|
|
||||||
|
def join_transaction(self, session):
|
||||||
|
join_transaction(session, self.initial_state,
|
||||||
|
self.transaction_manager, self.keep_session)
|
||||||
|
|
||||||
|
else: # pre-1.2
|
||||||
|
|
||||||
|
class ZopeTransactionExtension(datamanager.ZopeTransactionExtension):
|
||||||
|
"""
|
||||||
|
Record that a flush has occurred on a session's
|
||||||
|
connection. This allows the DataManager to rollback rather
|
||||||
|
than commit on read only transactions.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
This class is copied from upstream, and tweaked so that our
|
||||||
|
custom :func:`join_transaction()` will be used.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def after_begin(self, session, transaction, connection):
|
||||||
|
join_transaction(session, self.initial_state,
|
||||||
|
self.transaction_manager, self.keep_session)
|
||||||
|
|
||||||
|
def after_attach(self, session, instance):
|
||||||
|
join_transaction(session, self.initial_state,
|
||||||
|
self.transaction_manager, self.keep_session)
|
||||||
|
|
||||||
|
|
||||||
def register(session, initial_state=datamanager.STATUS_ACTIVE,
|
def register(session, initial_state=datamanager.STATUS_ACTIVE,
|
||||||
|
@ -147,11 +176,21 @@ def register(session, initial_state=datamanager.STATUS_ACTIVE,
|
||||||
"""
|
"""
|
||||||
from sqlalchemy import event
|
from sqlalchemy import event
|
||||||
|
|
||||||
ext = ZopeTransactionExtension(
|
if zope_sqlalchemy_version_parsed >= parse_version('1.2'): # 1.2+
|
||||||
initial_state=initial_state,
|
|
||||||
transaction_manager=transaction_manager,
|
ext = ZopeTransactionEvents(
|
||||||
keep_session=keep_session,
|
initial_state=initial_state,
|
||||||
)
|
transaction_manager=transaction_manager,
|
||||||
|
keep_session=keep_session,
|
||||||
|
)
|
||||||
|
|
||||||
|
else: # pre-1.2
|
||||||
|
|
||||||
|
ext = ZopeTransactionExtension(
|
||||||
|
initial_state=initial_state,
|
||||||
|
transaction_manager=transaction_manager,
|
||||||
|
keep_session=keep_session,
|
||||||
|
)
|
||||||
|
|
||||||
event.listen(session, "after_begin", ext.after_begin)
|
event.listen(session, "after_begin", ext.after_begin)
|
||||||
event.listen(session, "after_attach", ext.after_attach)
|
event.listen(session, "after_attach", ext.after_attach)
|
||||||
|
@ -160,6 +199,10 @@ def register(session, initial_state=datamanager.STATUS_ACTIVE,
|
||||||
event.listen(session, "after_bulk_delete", ext.after_bulk_delete)
|
event.listen(session, "after_bulk_delete", ext.after_bulk_delete)
|
||||||
event.listen(session, "before_commit", ext.before_commit)
|
event.listen(session, "before_commit", ext.before_commit)
|
||||||
|
|
||||||
|
if zope_sqlalchemy_version_parsed >= parse_version('1.5'): # 1.5+
|
||||||
|
if datamanager.SA_GE_14:
|
||||||
|
event.listen(session, "do_orm_execute", ext.do_orm_execute)
|
||||||
|
|
||||||
|
|
||||||
register(Session)
|
register(Session)
|
||||||
register(TempmonSession)
|
register(TempmonSession)
|
||||||
|
|
Loading…
Reference in a new issue