in lemur/schemas.py [0:0]
def get_object(self, data, many=False):
try:
data["plugin_object"] = plugins.get(data["slug"])
except KeyError as e:
raise ValidationError(
"Unable to find plugin. Slug: {} Reason: {}".format(data["slug"], e)
)
plugin_options_validated = []
# parse any sub-plugins
for option in data.get("plugin_options", []):
server_options_user_value = None
if not option:
continue # Angular sometimes generates empty option objects.
try:
option_name = option["name"]
option_value = option.get("value", "")
except KeyError as e:
raise ValidationError(
f"Unable to get plugin options. Slug: {data['slug']} Option: {option!r}"
)
if "plugin" in option.get("type", []):
# for plugins, sub-plugin options are validated in a recursive call to schema.load() below
sub_data, errors = PluginInputSchema().load(option_value)
if errors:
raise ValidationError(
f"Unable to load plugin options. Slug: {data['slug']} Option {option_name}"
)
option["value"] = sub_data
plugin_options_validated.append(option)
elif data["plugin_object"]:
# validate user inputs for sub-plugin options and only accept "value" field from user
try:
# Run regex validation rule on user input
data["plugin_object"].validate_option_value(option_name, option_value)
# Only accept the "value" field from the user - keep server default options for all other fields
server_options_with_user_value = data["plugin_object"].get_server_options(option_name)
if server_options_with_user_value is None: # no server options discovered
plugin_options_validated.append(option)
continue
server_options_with_user_value["value"] = option_value
plugin_options_validated.append(server_options_with_user_value)
except (ValueError, ValidationError) as e:
raise ValidationError(
f"Unable to validate plugin options. Slug: {data['slug']} Option {option_name}: {e}"
)
data["plugin_options"] = plugin_options_validated
return data