Fix options pages sometimes displaying blank values in form fields (#3364)
This commit is contained in:
parent
15e06e1779
commit
f3003ff147
|
@ -76,6 +76,34 @@ def test_ordered(obj):
|
||||||
def option_presets(game: str) -> Response:
|
def option_presets(game: str) -> Response:
|
||||||
world = AutoWorldRegister.world_types[game]
|
world = AutoWorldRegister.world_types[game]
|
||||||
|
|
||||||
|
presets = {}
|
||||||
|
for preset_name, preset in world.web.options_presets.items():
|
||||||
|
presets[preset_name] = {}
|
||||||
|
for preset_option_name, preset_option in preset.items():
|
||||||
|
if preset_option == "random":
|
||||||
|
presets[preset_name][preset_option_name] = preset_option
|
||||||
|
continue
|
||||||
|
|
||||||
|
option = world.options_dataclass.type_hints[preset_option_name].from_any(preset_option)
|
||||||
|
if isinstance(option, Options.NamedRange) and isinstance(preset_option, str):
|
||||||
|
assert preset_option in option.special_range_names, \
|
||||||
|
f"Invalid preset value '{preset_option}' for '{preset_option_name}' in '{preset_name}'. " \
|
||||||
|
f"Expected {option.special_range_names.keys()} or {option.range_start}-{option.range_end}."
|
||||||
|
|
||||||
|
presets[preset_name][preset_option_name] = option.value
|
||||||
|
elif isinstance(option, Options.Range):
|
||||||
|
presets[preset_name][preset_option_name] = option.value
|
||||||
|
elif isinstance(preset_option, str):
|
||||||
|
# Ensure the option value is valid for Choice and Toggle options
|
||||||
|
assert option.name_lookup[option.value] == preset_option, \
|
||||||
|
f"Invalid option value '{preset_option}' for '{preset_option_name}' in preset '{preset_name}'. " \
|
||||||
|
f"Values must not be resolved to a different option via option.from_text (or an alias)."
|
||||||
|
# Use the name of the option
|
||||||
|
presets[preset_name][preset_option_name] = option.current_key
|
||||||
|
else:
|
||||||
|
# Use the name of the option
|
||||||
|
presets[preset_name][preset_option_name] = option.current_key
|
||||||
|
|
||||||
class SetEncoder(json.JSONEncoder):
|
class SetEncoder(json.JSONEncoder):
|
||||||
def default(self, obj):
|
def default(self, obj):
|
||||||
from collections.abc import Set
|
from collections.abc import Set
|
||||||
|
@ -83,7 +111,7 @@ def option_presets(game: str) -> Response:
|
||||||
return list(obj)
|
return list(obj)
|
||||||
return json.JSONEncoder.default(self, obj)
|
return json.JSONEncoder.default(self, obj)
|
||||||
|
|
||||||
json_data = json.dumps(world.web.options_presets, cls=SetEncoder)
|
json_data = json.dumps(presets, cls=SetEncoder)
|
||||||
response = Response(json_data)
|
response = Response(json_data)
|
||||||
response.headers["Content-Type"] = "application/json"
|
response.headers["Content-Type"] = "application/json"
|
||||||
return response
|
return response
|
||||||
|
|
Loading…
Reference in New Issue