update wrapped models according to changeset
This commit is contained in:
parent
fb91af07e0
commit
164fe5d892
2 changed files with 40 additions and 2 deletions
|
@ -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:
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue