diff --git a/cassandra/cqlengine/columns.py b/cassandra/cqlengine/columns.py index 49d84ff0..ec6a468f 100644 --- a/cassandra/cqlengine/columns.py +++ b/cassandra/cqlengine/columns.py @@ -859,6 +859,16 @@ class Map(BaseContainerColumn): return [self.key_col, self.value_col] +class UDTValueManager(BaseValueManager): + @property + def changed(self): + return self.value != self.previous_value or self.value.has_changed_fields() + + def reset_previous_value(self): + self.value.reset_changed_fields() + self.previous_value = copy(self.value) + + class UserDefinedType(Column): """ User Defined Type column @@ -870,6 +880,8 @@ class UserDefinedType(Column): Please see :ref:`user_types` for examples and discussion. """ + value_manager = UDTValueManager + def __init__(self, user_type, **kwargs): """ :param type user_type: specifies the :class:`~.UserType` model of the column diff --git a/cassandra/cqlengine/usertype.py b/cassandra/cqlengine/usertype.py index 849eac09..bcff9c97 100644 --- a/cassandra/cqlengine/usertype.py +++ b/cassandra/cqlengine/usertype.py @@ -59,6 +59,13 @@ class BaseUserType(object): def __str__(self): return "{{{}}}".format(', '.join("'{}': {}".format(k, getattr(self, k)) for k, v in six.iteritems(self._values))) + def has_changed_fields(self): + return any(v.changed for v in self._values.values()) + + def reset_changed_fields(self): + for v in self._values.values(): + v.reset_previous_value() + @classmethod def register_for_keyspace(cls, keyspace): connection.register_udt(keyspace, cls.type_name(), cls)