settings.py
1 """Settings that can be changed by the user. 2 3 All settings are JSON encoded and stored in the database. 4 """ 5 6 import json 7 from dataclasses import dataclass 8 from enum import Enum 9 10 11 class SettingType(Enum): 12 """The type of a setting.""" 13 14 BOOLEAN = "boolean" 15 NUMBER = "number" 16 STRING = "string" 17 ARRAY = "array" 18 OBJECT = "object" 19 20 21 @dataclass 22 class SettingDefinition: 23 """A setting that can be changed by the user.""" 24 25 key: str 26 type: SettingType 27 default: str 28 29 def validate_type(self, value: str) -> None: # noqa: C901 30 """Validate that the value has the correct type.""" 31 obj = json.loads(value) 32 if self.type == SettingType.BOOLEAN: 33 if not isinstance(obj, bool): 34 raise ValueError(f"Setting {self.key} must be a boolean.") 35 elif self.type == SettingType.NUMBER: 36 if not isinstance(obj, (int, float)): 37 raise ValueError(f"Setting {self.key} must be a number.") 38 elif self.type == SettingType.STRING: 39 if not isinstance(obj, str): 40 raise ValueError(f"Setting {self.key} must be a string.") 41 elif self.type == SettingType.ARRAY: 42 if not isinstance(obj, list): 43 raise ValueError(f"Setting {self.key} must be an array.") 44 elif self.type == SettingType.OBJECT: # noqa: SIM102 45 if not isinstance(obj, dict): 46 raise ValueError(f"Setting {self.key} must be an object.") 47 48 49 SETTINGS: dict[str, SettingDefinition] = {} 50 51 52 def register_setting(key: str, typ: SettingType, default: str) -> None: 53 """Register a setting.""" 54 SETTINGS[key] = SettingDefinition(key, typ, default) 55 56 57 def parse_setting(key: str) -> SettingDefinition: 58 """Parse a setting key.""" 59 if key not in SETTINGS: 60 raise ValueError(f"Setting {key} does not exist.") 61 return SETTINGS[key] 62 63 64 register_setting("currency", SettingType.STRING, json.dumps("EUR")) 65 register_setting("round_prices", SettingType.BOOLEAN, json.dumps(obj=False)) 66 register_setting("print_presets", SettingType.ARRAY, json.dumps([])) 67 68 register_setting("extra_fields_vendor", SettingType.ARRAY, json.dumps([])) 69 register_setting("extra_fields_filament", SettingType.ARRAY, json.dumps([])) 70 register_setting("extra_fields_spool", SettingType.ARRAY, json.dumps([])) 71 register_setting("base_url", SettingType.STRING, json.dumps("")) 72 73 register_setting("locations", SettingType.ARRAY, json.dumps([])) 74 register_setting("locations_spoolorders", SettingType.OBJECT, json.dumps({}))