From 4e4102f64d0b467649cb372460945a6a7f910884 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Thu, 9 Jul 2009 01:45:44 +0000 Subject: [PATCH] - Fixed bug whereby session.is_modified() would raise an exception if any synonyms were in use. --- CHANGES | 3 +++ lib/sqlalchemy/orm/session.py | 12 ++++++++++-- test/orm/test_session.py | 10 ++++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index cf2f8150d1..16b21f634a 100644 --- a/CHANGES +++ b/CHANGES @@ -31,6 +31,9 @@ CHANGES wouldn't be deserialized correctly when the whole object was serialized. [ticket:1426] + - Fixed bug whereby session.is_modified() would raise an exception + if any synonyms were in use. + - Fixed Query being able to join() from individual columns of a joined-table subclass entity, i.e. query(SubClass.foo, SubcClass.bar).join(). diff --git a/lib/sqlalchemy/orm/session.py b/lib/sqlalchemy/orm/session.py index cbfb0c1d64..a658783c2c 100644 --- a/lib/sqlalchemy/orm/session.py +++ b/lib/sqlalchemy/orm/session.py @@ -1473,10 +1473,18 @@ class Session(object): state = attributes.instance_state(instance) except exc.NO_STATE: raise exc.UnmappedInstanceError(instance) + dict_ = state.dict for attr in state.manager.attributes: - if not include_collections and hasattr(attr.impl, 'get_collection'): + if \ + ( + not include_collections and + hasattr(attr.impl, 'get_collection') + ) or not hasattr(attr.impl, 'get_history'): continue - (added, unchanged, deleted) = attr.get_history(instance, passive=passive) + + (added, unchanged, deleted) = \ + attr.impl.get_history(state, dict_, passive=passive) + if added or deleted: return True return False diff --git a/test/orm/test_session.py b/test/orm/test_session.py index 3020d66e9d..a94b4e7df7 100644 --- a/test/orm/test_session.py +++ b/test/orm/test_session.py @@ -747,6 +747,16 @@ class SessionTest(_fixtures.FixtureTest): assert s.is_modified(user) assert not s.is_modified(user, include_collections=False) + @testing.resolve_artifact_names + def test_is_modified_syn(self): + s = sessionmaker()() + + mapper(User, users, properties={'uname':sa.orm.synonym('name')}) + u = User(uname='fred') + assert s.is_modified(u) + s.add(u) + s.commit() + assert not s.is_modified(u) @testing.resolve_artifact_names def test_weak_ref(self): -- 2.47.2