summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2014-03-19 11:09:38 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2014-03-19 11:09:38 -0400
commitb9a2b58dd74757184ef94206f09e9db1f536e4cb (patch)
tree58dd9631ac97aa1b0d5e335f3f3eab5c7c872625 /lib
parentfd8dbf8e78981187d091dcc25e63ddfb4e56a5f8 (diff)
downloadsqlalchemy-b9a2b58dd74757184ef94206f09e9db1f536e4cb.tar.gz
- Fixed bug in mutable extension as well as
:func:`.attributes.flag_modified` where the change event would not be propagated if the attribute had been reassigned to itself. fixes #2997
Diffstat (limited to 'lib')
-rw-r--r--lib/sqlalchemy/ext/mutable.py3
-rw-r--r--lib/sqlalchemy/orm/attributes.py2
-rw-r--r--lib/sqlalchemy/orm/state.py4
3 files changed, 6 insertions, 3 deletions
diff --git a/lib/sqlalchemy/ext/mutable.py b/lib/sqlalchemy/ext/mutable.py
index 4e574935d..7869e888c 100644
--- a/lib/sqlalchemy/ext/mutable.py
+++ b/lib/sqlalchemy/ext/mutable.py
@@ -437,6 +437,9 @@ class MutableBase(object):
outgoing.
"""
+ if value is oldvalue:
+ return value
+
if not isinstance(value, cls):
value = cls.coerce(key, value)
if value is not None:
diff --git a/lib/sqlalchemy/orm/attributes.py b/lib/sqlalchemy/orm/attributes.py
index 7647bf9d0..3a786c73d 100644
--- a/lib/sqlalchemy/orm/attributes.py
+++ b/lib/sqlalchemy/orm/attributes.py
@@ -1538,4 +1538,4 @@ def flag_modified(instance, key):
"""
state, dict_ = instance_state(instance), instance_dict(instance)
impl = state.manager[key].impl
- state._modified_event(dict_, impl, NO_VALUE)
+ state._modified_event(dict_, impl, NO_VALUE, force=True)
diff --git a/lib/sqlalchemy/orm/state.py b/lib/sqlalchemy/orm/state.py
index 9712dd055..fb5db1fc9 100644
--- a/lib/sqlalchemy/orm/state.py
+++ b/lib/sqlalchemy/orm/state.py
@@ -414,10 +414,10 @@ class InstanceState(interfaces._InspectionAttr):
def _instance_dict(self):
return None
- def _modified_event(self, dict_, attr, previous, collection=False):
+ def _modified_event(self, dict_, attr, previous, collection=False, force=False):
if not attr.send_modified_events:
return
- if attr.key not in self.committed_state:
+ if attr.key not in self.committed_state or force:
if collection:
if previous is NEVER_SET:
if attr.key in dict_: