/ spoolman / settings.py
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({}))