From 164fe5d892d1652c12b2321c2364dbec3adba8bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Tue, 13 Jun 2017 16:15:28 +0200 Subject: [PATCH] update wrapped models according to changeset --- src/c3nav/editor/models.py | 24 ++++++++++++++++++++++++ src/c3nav/editor/wrappers.py | 18 ++++++++++++++++-- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/c3nav/editor/models.py b/src/c3nav/editor/models.py index 42137fe9..9becce0e 100644 --- a/src/c3nav/editor/models.py +++ b/src/c3nav/editor/models.py @@ -31,6 +31,20 @@ class ChangeSet(models.Model): super().__init__(*args, **kwargs) self.default_author = None + self.parse_changes() + + def parse_changes(self): + self.updated_values = {} + for change in self.changes.all(): + self._parse_change(change) + print(self.updated_values) + + def _parse_change(self, change): + if change.action == 'update': + self.updated_values.setdefault(change.model_class, {}).setdefault(change.obj_pk, {}).update({ + change.field_name: json.loads(change.field_value) + }) + @classmethod def qs_base(cls, hide_applied=True): qs = cls.objects.prefetch_related('changes').select_related('author') @@ -188,6 +202,16 @@ class Change(models.Model): raise ValueError('value is not a mapdata model') self.model_name = value.__name__ + @property + def obj_pk(self) -> typing.Union[int, str]: + if self._set_object is not None: + return self._set_object.pk + if self.existing_object_pk is not None: + return self.existing_object_pk + if self.created_object is not None: + return 'c'+str(self.created_object.changeset_id) + raise TypeError('existing_model_pk or created_object have to be set.') + @property def obj(self) -> ModelInstanceWrapper: if self._set_object is not None: diff --git a/src/c3nav/editor/wrappers.py b/src/c3nav/editor/wrappers.py index e1c14a9b..601d14fc 100644 --- a/src/c3nav/editor/wrappers.py +++ b/src/c3nav/editor/wrappers.py @@ -70,14 +70,28 @@ class ModelInstanceWrapper(BaseWrapper): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) + updates = self._changeset.updated_values.get(type(self._obj), {}).get(self._obj.pk, {}) self._initial_values = {} for field in self._obj._meta.get_fields(): if field.related_model is None: if field.primary_key: continue - self._initial_values[field] = getattr(self, field.name) + + if field.name == 'titles': + for name, value in updates.items(): + if not name.startswith('title_'): + continue + if not value: + self._obj.titles.pop(name[6:], None) + else: + self._obj.titles[name[6:]] = value + elif field.name in updates: + setattr(self._obj, field.name, updates[field.name]) + self._initial_values[field] = getattr(self._obj, field.name) elif (field.many_to_one or field.one_to_one) and not field.primary_key: - self._initial_values[field] = getattr(self, field.name) + if field.name in updates: + self._wrap_model(field.model).get(pk=updates[field.name]) + self._initial_values[field] = getattr(self._obj, field.name) def __eq__(self, other): if type(other) == ModelWrapper: