in mds_plugin/core.py [0:0]
def prompt_for_list_item(item_list, prompt_caption, prompt_default_value='',
item_name_property=None, given_value=None,
print_list=False, allow_multi_select=False):
"""Lets the use choose and item from a list
When prompted, the user can either provide the index of the item or the
name of the item.
If given_value is provided, it will be checked against the items in the list
instead of prompting the user for a new value
Args:
item_list (list): The list of items to choose from
prompt_caption (str): The caption of the prompt that will be displayed
prompt_default_value (str): The default_value for the prompt
item_name_property (str): The name of the property that is used to
compare with the user input
given_value (str): Value that the user provided beforehand.
print_list (bool): Specifies whether the list of items should be printed
allow_multi_select (bool): Whether multiple items can be entered,
separated by ',' and the string '*' is allowed
Returns:
The selected item or the selected item list when allow_multi_select is
True or None when the user cancelled the selection
"""
import mysqlsh
# If a given_value was provided, check this first instead of prompting the
# user
if given_value:
given_value = given_value.lower()
selected_item = None
for item in item_list:
if item_name_property is not None:
if type(item) == dict:
item_name = item.get(item_name_property)
else:
item_name = getattr(item, item_name_property)
else:
item_name = item
if item_name.lower() == given_value:
selected_item = item
break
return selected_item
if print_list:
i = 1
for item in item_list:
if item_name_property:
if type(item) == dict:
item_caption = item.get(item_name_property)
else:
item_caption = getattr(item, item_name_property)
else:
item_caption = item
print(f"{i:>4} {item_caption}")
i += 1
print()
selected_items = []
# Let the user choose from the list
while len(selected_items) == 0:
# Prompt the user for specifying an item
prompt = mysqlsh.globals.shell.prompt(
prompt_caption, {'defaultValue': prompt_default_value}
).strip().lower()
if prompt == '':
return None
# If the user typed '*', return full list
if allow_multi_select and prompt == "*":
return item_list
if allow_multi_select:
prompt_items = prompt.split(',')
else:
prompt_items = [prompt]
try:
for prompt in prompt_items:
try:
# If the user provided an index, try to map that to an item
nr = int(prompt)
if nr > 0 and nr <= len(item_list):
selected_items.append(item_list[nr - 1])
else:
raise IndexError
except ValueError:
# Search by name
selected_item = None
for item in item_list:
if item_name_property is not None:
if type(item) == dict:
item_name = item.get(item_name_property)
else:
item_name = getattr(item, item_name_property)
else:
item_name = item
if item_name.lower() == prompt:
selected_item = item
break
if selected_item is None:
raise ValueError
else:
selected_items.append(selected_item)
except (ValueError, IndexError):
msg = f'The item {prompt} was not found. Please try again'
if prompt_default_value == "":
msg += " or leave empty to cancel the operation.\n"
else:
msg += ".\n"
print(msg)
if allow_multi_select:
return selected_items if len(selected_items) > 0 else None
elif len(selected_items) > 0:
return selected_items[0]