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 changed files with 26 additions and 8 deletions
				
			
		| 
						 | 
				
			
			@ -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,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
 | 
			
		||||
       :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 session.twophase:
 | 
			
		||||
                DataManager = datamanager.TwoPhaseSessionDataManager
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue