class ChangeLogMixin(object): def __init__(self, request, *args, **kwargs): self.request = request super().__init__(*args, **kwargs) if self.instance.id: self.old_serialized_vals = ChangeLogSerializer(self.instance).data def get_changelog_message(self): return "" def save(self, *args, **kwargs): experiment = super().save(*args, **kwargs) old_values = {} new_values = {} old_status = None self.new_serialized_vals = ChangeLogSerializer(self.instance).data latest_change = experiment.changes.latest() # account for changes in variant values if latest_change: old_status = latest_change.new_status if (self.old_serialized_vals["variants"] != self.new_serialized_vals["variants"]): old_values["variants"] = self.old_serialized_vals["variants"] new_values["variants"] = self.new_serialized_vals["variants"] elif self.new_serialized_vals.get("variants"): old_values["variants"] = None new_values["variants"] = self.new_serialized_vals["variants"] if self.changed_data: if latest_change: old_status = latest_change.new_status for field in self.changed_data: if field in self.old_serialized_vals: old_values[field] = self.old_serialized_vals[field] else: prev_values = {field: None for field in self.changed_data} old_values.update(prev_values) for field in self.changed_data: if field in self.new_serialized_vals: new_values[field] = self.new_serialized_vals[field] ExperimentChangeLog.objects.create( experiment=experiment, changed_by=self.request.user, old_status=old_status, new_status=experiment.status, old_values=old_values, new_values=new_values, message=self.get_changelog_message(), ) return experiment
class ChangeLogMixin(object): def __init__(self, request, *args, **kwargs): self.request = request super().__init__(*args, **kwargs) if self.instance.id: self.old_serialized_vals = ChangeLogSerializer(self.instance).data def get_changelog_message(self): return "" def save(self, *args, **kwargs): experiment = super().save(*args, **kwargs) changed_values = {} old_status = None self.new_serialized_vals = ChangeLogSerializer(self.instance).data latest_change = experiment.changes.latest() # account for changes in variant values if latest_change: old_status = latest_change.new_status if (self.old_serialized_vals["variants"] != self.new_serialized_vals["variants"]): old_value = self.old_serialized_vals["variants"] new_value = self.new_serialized_vals["variants"] display_name = "Branches" changed_values["variants"] = { "old_value": old_value, "new_value": new_value, "display_name": display_name, } elif self.new_serialized_vals.get("variants"): old_value = None new_value = self.new_serialized_vals["variants"] display_name = "Branches" changed_values["variants"] = { "old_value": old_value, "new_value": new_value, "display_name": display_name, } if self.changed_data: if latest_change: old_status = latest_change.new_status for field in self.changed_data: old_val = None new_val = None if field in self.old_serialized_vals: if field in ("countries", "locales"): old_field_values = self.old_serialized_vals[field] codes = [obj["code"] for obj in old_field_values] old_val = codes else: old_val = self.old_serialized_vals[field] if field in self.new_serialized_vals: if field in ("countries", "locales"): new_field_values = self.new_serialized_vals[field] codes = [obj["code"] for obj in new_field_values] new_val = codes else: new_val = self.new_serialized_vals[field] display_name = self._get_display_name(field) if new_val or old_val: changed_values[field] = { "old_value": old_val, "new_value": new_val, "display_name": display_name, } else: for field in self.changed_data: old_val = None new_val = None if field in self.new_serialized_vals: if field in ("countries", "locales"): new_field_values = self.new_serialized_vals[field] codes = [obj["code"] for obj in new_field_values] new_val = codes else: new_val = self.new_serialized_vals[field] display_name = self._get_display_name(field) changed_values[field] = { "old_value": old_val, "new_value": new_val, "display_name": display_name, } ExperimentChangeLog.objects.create( experiment=experiment, changed_by=self.request.user, old_status=old_status, new_status=experiment.status, changed_values=changed_values, message=self.get_changelog_message(), ) return experiment def _get_display_name(self, field): if self.fields[field].label: return self.fields[field].label return field.replace("_", " ").title()