def _load_data(self, data):
self._data = data
+ # We need to use a copy for original data, so that changes
+ # are not propagated
+ self._original_data = data.copy()
def __getitem__(self, key):
+ # This is a workaround to make TaskResource non-iterable
+ # over simple index-based iteration
+ try:
+ int(key)
+ raise StopIteration
+ except ValueError:
+ pass
+
hydrate_func = getattr(self, 'deserialize_{0}'.format(key),
lambda x: x)
return hydrate_func(self._data.get(key))
dehydrate_func = getattr(self, 'serialize_{0}'.format(key),
lambda x: x)
self._data[key] = dehydrate_func(value)
- self._modified_fields.add(key)
def __str__(self):
s = six.text_type(self.__unicode__())
kwargs.update(data)
self._load_data(kwargs)
- self._modified_fields = set()
def __unicode__(self):
return self['description']
def __hash__(self):
return self['uuid'].__hash__()
+ @property
+ def _modified_fields(self):
+ for key in self._data.keys():
+ if self._data.get(key) != self._original_data.get(key):
+ yield key
+
@property
def completed(self):
return self['status'] == six.text_type('completed')
# Circumvent the ID storage, since ID is considered read-only
self._data['id'] = int(id_lines[0].split(' ')[2].rstrip('.'))
- self._modified_fields.clear()
self.refresh()
def add_annotation(self, annotation):
to_update = dict(
[(k, new_data.get(k)) for k in only_fields])
self._data.update(to_update)
+ self._original_data.update(to_update)
else:
self._data = new_data
+ # We need to create a clone for original_data though
+ # Shallow copy is alright, since data dict uses only
+ # primitive data types
+ self._original_data = new_data.copy()
class TaskFilter(object):