def save(self, *args, **kwargs): if not self.diff: old = self.old.data if self.old else {} new = self.new.data if self.new else {} self.diff = make_diff(old, new) super().save(*args, **kwargs) Redirect.from_diff(self)
def save(self, *args, **kwargs): if not self.diff: old = self.old.as_resource if self.old else {} new = self.new.as_resource if self.new else {} self.diff = make_diff(old, new) super().save(*args, **kwargs) IdentifierRedirect.from_diff(self)
def patch(self): # Let's try to be smart and patch object if claimed version does not # match with expected but not conflict is detected. claimed_version = max(1, self.data.get('version', 1)) current_version = self.instance.version if self.instance else 0 if self.instance and claimed_version <= current_version > 1: base = self.instance.load_version(claimed_version - 1) current = self.instance.load_version(current_version) diff = make_diff(base.data, current.data) # Those are keys changed between that last know version of the # client and the current version we have. protected = diff.keys() diff = make_diff(base.data, self.data, update=self.update) conflict = any(k in protected for k in diff.keys()) if not conflict: for key in diff.keys(): setattr(self.instance, key, self.data.get(key)) self.instance.increment_version() return super().patch()