def get_formatted_change_object()

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,
    }