diff -up sqlamp-0.5.2/CHANGES.sa72 sqlamp-0.5.2/CHANGES --- sqlamp-0.5.2/CHANGES.sa72 2011-12-02 13:23:32.887982415 +0100 +++ sqlamp-0.5.2/CHANGES 2011-12-02 13:25:41.049320307 +0100 @@ -2,6 +2,7 @@ ------------------------- - Workaround for bug in sqlite 3.6.x (problems with binding two integer attributes). Initial patch by Josip Delic. +- Backported support for SA 0.7.2 from 0.6 branch of sqlamp 0.5.2: released 2010-09-19 -------------------------- diff -up sqlamp-0.5.2/sqlamp/__init__.py.sa72 sqlamp-0.5.2/sqlamp/__init__.py --- sqlamp-0.5.2/sqlamp/__init__.py.sa72 2011-12-02 13:21:20.813603674 +0100 +++ sqlamp-0.5.2/sqlamp/__init__.py 2011-12-02 13:22:33.311360487 +0100 @@ -77,8 +77,18 @@ ALPHABET = "0123456789ABCDEFGHIJKLMNOPQR PATH_FIELD_LENGTH = 255 -class PathOverflowError(Exception): - "Base class for exceptions in calculations of node's path." +if hasattr(sqlalchemy.exc, 'DontWrapMixin'): + # SQLAlchemy 0.7.2+ allows deriving from this special mixin in order to + # let exceptions raised from types methods during flush pass intact. + class PathOverflowError(Exception, sqlalchemy.exc.DontWrapMixin): + "Base class for exceptions in calculations of node's path." +else: + # SQLAlchemy < 0.7 doesn't need any special base class. + class PathOverflowError(Exception): + "Base class for exceptions in calculations of node's path." + # 0.7 and 0.7.1 wrap exceptions and reraise + # sqlalchemy.exc.StatementError, so are not fully supported. + class TooManyChildrenError(PathOverflowError): "Maximum children limit is exceeded. Raised during flush." @@ -203,10 +213,10 @@ class MPOptions(object): `Query.order_by()`. Used to sort subtree query by `tree_id` and `path`. """ - return sqlalchemy.sql.expression.ClauseList( + return str(sqlalchemy.sql.expression.ClauseList( self.tree_id_field, self.path_field - ) + ).compile()) class _InsertionsParamsSelector(object): @@ -1016,6 +1026,13 @@ class DeclarativeMeta(BaseDeclarativeMet super(DeclarativeMeta, cls).__init__(name, bases, dct) mp_manager = MPManager(cls.__table__, **opts) setattr(cls, mp_manager_name, mp_manager) - mp_class_manager = getattr(cls, mp_manager_name) - cls.__mapper__.extension.append(mp_manager.mapper_extension) + mapper_ext = mp_manager.mapper_extension + if hasattr(cls.__mapper__, 'extension'): + # SQLAlchemy < 0.7 + cls.__mapper__.extension.append(mapper_ext) + else: + # SQLAlchemy 0.7+ + from sqlalchemy import event + event.listen(cls.__mapper__, 'before_insert', mapper_ext.before_insert, propagate=True) + event.listen(cls.__mapper__, 'after_insert', mapper_ext.after_insert, propagate=True)