in experimenter/experimenter/experiments/changelog_utils.py [0:0]
def get_formatted_change_object(field_name, field_diff, changelog, timestamp):
event_name = ChangeEventType.GENERAL.name
try:
field_instance = NimbusExperiment._meta.get_field(field_name)
except FieldDoesNotExist:
return None
field_display_name = getattr(field_instance, "verbose_name", field_name)
old_value = field_diff.get("old_value")
new_value = field_diff.get("new_value")
if isinstance(
field_instance,
(models.ManyToManyField, models.OneToOneField, models.ManyToOneRel),
):
event_name = ChangeEventType.DETAILED.name
# Values of some fields are stored in the form of reference keys in
# NimbusChangeLog and the NATIVE_MODELS here is a list of the
# database models to which those fields belong to. We use this list
# to query the actual values of those fields using the reference keys
if field_name in RelationalFields.NATIVE_MODELS:
field_model = field_instance.related_model
data = field_model.objects.all()
if old_value is not None:
values = list(
data.filter(pk__in=old_value).values_list("name", flat=True)
)
old_value = values
else:
old_value = []
values = list(data.filter(pk__in=new_value).values_list("name", flat=True))
new_value = values
old_value = json.dumps(old_value, indent=2)
new_value = json.dumps(new_value, indent=2)
elif isinstance(field_instance, (models.JSONField, ArrayField)):
event_name = ChangeEventType.DETAILED.name
if old_value is not None:
old_value = json.dumps(old_value, indent=2)
if new_value is not None:
new_value = json.dumps(new_value, indent=2)
elif isinstance(field_instance, models.BooleanField):
event_name = ChangeEventType.BOOLEAN.name
if field_name == "status" or field_name == "publish_status":
event_name = ChangeEventType.STATE.name
if event_name == ChangeEventType.DETAILED.name:
change_message = f"{changelog.changed_by} changed value of {field_display_name}"
elif event_name == ChangeEventType.BOOLEAN.name:
change_message = (
f"{changelog.changed_by} set the {field_display_name} as {new_value}"
)
else:
change_message = (
f"{changelog.changed_by} changed value of {field_display_name} from "
f"{old_value} to {new_value}"
)
return {
"id": str(uuid.uuid4()),
"event": event_name,
"event_message": change_message,
"changed_by": changelog.changed_by,
"timestamp": timestamp,
"old_value": old_value,
"new_value": new_value,
}