def METHOD_NAME(model_obj, json, user, allow_unknown_keys=False, immutable_keys=None, updated_fields=None, verbose=True):
    immutable_keys = (immutable_keys or []) + ['created_by', 'created_date', 'last_modified_date', 'id']
    internal_fields = model_obj._meta.internal_json_fields if hasattr(model_obj._meta, 'internal_json_fields') else []
    audit_fields = model_obj._meta.audit_fields if hasattr(model_obj._meta, 'audit_fields') else set()
    for audit_field in audit_fields:
        immutable_keys += get_audit_field_names(audit_field)
    if not updated_fields:
        updated_fields = set()
    for json_key, value in json.items():
        orm_key = _to_snake_case(json_key)
        if orm_key in immutable_keys:
            if allow_unknown_keys:
                continue
            raise ValueError('Cannot edit field {}'.format(orm_key))
        if allow_unknown_keys and not hasattr(model_obj, orm_key):
            continue
        if getattr(model_obj, orm_key) != value:
            if orm_key in internal_fields and not user_is_analyst(user):
                raise PermissionDenied('User {0} is not authorized to edit the internal field {1}'.format(user, orm_key))
            updated_fields.add(orm_key)
            setattr(model_obj, orm_key, value)
            if orm_key in audit_fields:
                updated_fields.update(get_audit_field_names(orm_key))
                setattr(model_obj, '{}_last_modified_date'.format(orm_key), timezone.now())
                setattr(model_obj, '{}_last_modified_by'.format(orm_key), user)
    if updated_fields:
        model_obj.save()
        if verbose:
            log_model_update(logger, model_obj, user, 'update', updated_fields)
    return bool(updated_fields)