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
|
||||
# Copyright © 2010-2017 Lance Edgar
|
||||
# Copyright © 2010-2021 Lance Edgar
|
||||
#
|
||||
# This file is part of Rattail.
|
||||
#
|
||||
|
@ -30,6 +30,7 @@ import sqlalchemy as sa
|
|||
from zope.sqlalchemy import datamanager
|
||||
import sqlalchemy_continuum as continuum
|
||||
from sqlalchemy.orm import sessionmaker, scoped_session
|
||||
from pkg_resources import get_distribution, parse_version
|
||||
|
||||
from rattail.db import SessionBase
|
||||
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)
|
||||
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):
|
||||
"""Integrate a top level sqlalchemy session transaction into a zope transaction
|
||||
|
@ -85,12 +91,24 @@ def join_transaction(session, initial_state=datamanager.STATUS_ACTIVE, transacti
|
|||
This function is copied from upstream, and tweaked so that our custom
|
||||
:class:`TailboneSessionDataManager` will be used.
|
||||
"""
|
||||
if datamanager._SESSION_STATE.get(id(session), None) is None:
|
||||
if session.twophase:
|
||||
DataManager = datamanager.TwoPhaseSessionDataManager
|
||||
else:
|
||||
DataManager = TailboneSessionDataManager
|
||||
DataManager(session, initial_state, transaction_manager, keep_session=keep_session)
|
||||
# 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 session.twophase:
|
||||
DataManager = datamanager.TwoPhaseSessionDataManager
|
||||
else:
|
||||
DataManager = TailboneSessionDataManager
|
||||
DataManager(session, initial_state, transaction_manager, keep_session=keep_session)
|
||||
|
||||
|
||||
class ZopeTransactionExtension(datamanager.ZopeTransactionExtension):
|
||||
|
|
Loading…
Reference in a new issue