Add variant transaction logic per zope.sqlalchemy 1.1 changes
without this we can't use zope.sqlalchemy 1.1 due to error
This commit is contained in:
parent
db7d021133
commit
a3cbb24892
|
@ -1,8 +1,8 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8; -*-
|
||||||
################################################################################
|
################################################################################
|
||||||
#
|
#
|
||||||
# Rattail -- Retail Software Framework
|
# Rattail -- Retail Software Framework
|
||||||
# Copyright © 2010-2017 Lance Edgar
|
# Copyright © 2010-2021 Lance Edgar
|
||||||
#
|
#
|
||||||
# This file is part of Rattail.
|
# This file is part of Rattail.
|
||||||
#
|
#
|
||||||
|
@ -30,6 +30,7 @@ import sqlalchemy as sa
|
||||||
from zope.sqlalchemy import datamanager
|
from zope.sqlalchemy import datamanager
|
||||||
import sqlalchemy_continuum as continuum
|
import sqlalchemy_continuum as continuum
|
||||||
from sqlalchemy.orm import sessionmaker, scoped_session
|
from sqlalchemy.orm import sessionmaker, scoped_session
|
||||||
|
from pkg_resources import get_distribution, parse_version
|
||||||
|
|
||||||
from rattail.db import SessionBase
|
from rattail.db import SessionBase
|
||||||
from rattail.db.continuum import versioning_manager
|
from rattail.db.continuum import versioning_manager
|
||||||
|
@ -44,6 +45,11 @@ TrainwreckSession = scoped_session(sessionmaker())
|
||||||
# empty dict for now, this must populated on app startup (if needed)
|
# empty dict for now, this must populated on app startup (if needed)
|
||||||
ExtraTrainwreckSessions = {}
|
ExtraTrainwreckSessions = {}
|
||||||
|
|
||||||
|
# some of the logic below may need to vary somewhat, based on which version of
|
||||||
|
# zope.sqlalchemy we have installed
|
||||||
|
zope_sqlalchemy_version = get_distribution('zope.sqlalchemy').version
|
||||||
|
zope_sqlalchemy_version_parsed = parse_version(zope_sqlalchemy_version)
|
||||||
|
|
||||||
|
|
||||||
class TailboneSessionDataManager(datamanager.SessionDataManager):
|
class TailboneSessionDataManager(datamanager.SessionDataManager):
|
||||||
"""Integrate a top level sqlalchemy session transaction into a zope transaction
|
"""Integrate a top level sqlalchemy session transaction into a zope transaction
|
||||||
|
@ -85,6 +91,18 @@ def join_transaction(session, initial_state=datamanager.STATUS_ACTIVE, transacti
|
||||||
This function is copied from upstream, and tweaked so that our custom
|
This function is copied from upstream, and tweaked so that our custom
|
||||||
:class:`TailboneSessionDataManager` will be used.
|
:class:`TailboneSessionDataManager` will be used.
|
||||||
"""
|
"""
|
||||||
|
# the upstream internals of this function has changed a little over time.
|
||||||
|
# unfortunately for us, that means we must include each variant here.
|
||||||
|
|
||||||
|
if zope_sqlalchemy_version_parsed >= parse_version('1.1'): # 1.1+
|
||||||
|
if datamanager._SESSION_STATE.get(session, None) is None:
|
||||||
|
if session.twophase:
|
||||||
|
DataManager = datamanager.TwoPhaseSessionDataManager
|
||||||
|
else:
|
||||||
|
DataManager = TailboneSessionDataManager
|
||||||
|
DataManager(session, initial_state, transaction_manager, keep_session=keep_session)
|
||||||
|
|
||||||
|
else: # pre-1.1
|
||||||
if datamanager._SESSION_STATE.get(id(session), None) is None:
|
if datamanager._SESSION_STATE.get(id(session), None) is None:
|
||||||
if session.twophase:
|
if session.twophase:
|
||||||
DataManager = datamanager.TwoPhaseSessionDataManager
|
DataManager = datamanager.TwoPhaseSessionDataManager
|
||||||
|
|
Loading…
Reference in a new issue