mirror of
https://github.com/thekiwismarthome/shopping-list-manager.git
synced 2026-08-29 11:24:42 +00:00
feat: add currency_symbol and language fields to custom regions
This commit is contained in:
@@ -56,7 +56,7 @@ class ShoppingListStorage:
|
|||||||
self._products: Dict[str, Product] = {}
|
self._products: Dict[str, Product] = {}
|
||||||
self._categories: List[Category] = []
|
self._categories: List[Category] = []
|
||||||
self._loyalty_cards: Dict[str, LoyaltyCard] = {}
|
self._loyalty_cards: Dict[str, LoyaltyCard] = {}
|
||||||
self._custom_regions: Dict[str, str] = {} # code -> display name
|
self._custom_regions: Dict[str, Any] = {} # code -> {name, currency_symbol, language}
|
||||||
self._search_engine: Optional[ProductSearch] = None
|
self._search_engine: Optional[ProductSearch] = None
|
||||||
self._images_dir = Path(hass.config.path(IMAGES_LOCAL_DIR))
|
self._images_dir = Path(hass.config.path(IMAGES_LOCAL_DIR))
|
||||||
self._legacy_images_dir = Path(hass.config.path(LEGACY_IMAGES_LOCAL_DIR))
|
self._legacy_images_dir = Path(hass.config.path(LEGACY_IMAGES_LOCAL_DIR))
|
||||||
@@ -158,10 +158,14 @@ class ShoppingListStorage:
|
|||||||
}
|
}
|
||||||
_LOGGER.debug("Loaded %d loyalty cards", len(self._loyalty_cards))
|
_LOGGER.debug("Loaded %d loyalty cards", len(self._loyalty_cards))
|
||||||
|
|
||||||
# Load custom regions
|
# Load custom regions (migrate old string-only format)
|
||||||
custom_regions_data = await self._store_custom_regions.async_load()
|
custom_regions_data = await self._store_custom_regions.async_load()
|
||||||
if custom_regions_data:
|
if custom_regions_data:
|
||||||
self._custom_regions = custom_regions_data.get("regions", {})
|
raw = custom_regions_data.get("regions", {})
|
||||||
|
self._custom_regions = {
|
||||||
|
k: (v if isinstance(v, dict) else {"name": v, "currency_symbol": None, "language": None})
|
||||||
|
for k, v in raw.items()
|
||||||
|
}
|
||||||
_LOGGER.debug("Loaded %d custom regions", len(self._custom_regions))
|
_LOGGER.debug("Loaded %d custom regions", len(self._custom_regions))
|
||||||
|
|
||||||
# Initialize search engine after products are loaded
|
# Initialize search engine after products are loaded
|
||||||
@@ -838,15 +842,21 @@ class ShoppingListStorage:
|
|||||||
# Custom Regions
|
# Custom Regions
|
||||||
# ==========================================================================
|
# ==========================================================================
|
||||||
|
|
||||||
def get_custom_regions(self) -> Dict[str, str]:
|
def get_custom_regions(self) -> Dict[str, Any]:
|
||||||
"""Return all custom regions as {code: display_name}."""
|
"""Return all custom regions as {code: {name, currency_symbol, language}}."""
|
||||||
return dict(self._custom_regions)
|
return dict(self._custom_regions)
|
||||||
|
|
||||||
async def create_custom_region(self, code: str, name: str) -> bool:
|
async def create_custom_region(
|
||||||
|
self, code: str, name: str, currency_symbol: Optional[str] = None, language: Optional[str] = None
|
||||||
|
) -> bool:
|
||||||
"""Create a new custom region. Returns False if the code already exists."""
|
"""Create a new custom region. Returns False if the code already exists."""
|
||||||
if code in self._custom_regions:
|
if code in self._custom_regions:
|
||||||
return False
|
return False
|
||||||
self._custom_regions[code] = name
|
self._custom_regions[code] = {
|
||||||
|
"name": name,
|
||||||
|
"currency_symbol": currency_symbol,
|
||||||
|
"language": language,
|
||||||
|
}
|
||||||
await self._save_custom_regions()
|
await self._save_custom_regions()
|
||||||
_LOGGER.debug("Created custom region: %s (%s)", code, name)
|
_LOGGER.debug("Created custom region: %s (%s)", code, name)
|
||||||
return True
|
return True
|
||||||
|
|||||||
@@ -1217,12 +1217,13 @@ def websocket_get_integration_settings(
|
|||||||
"BE": "Belgium (Dutch)",
|
"BE": "Belgium (Dutch)",
|
||||||
}
|
}
|
||||||
custom = storage.get_custom_regions()
|
custom = storage.get_custom_regions()
|
||||||
|
custom_names = {code: region["name"] for code, region in custom.items()}
|
||||||
connection.send_result(
|
connection.send_result(
|
||||||
msg["id"],
|
msg["id"],
|
||||||
{
|
{
|
||||||
"country": country,
|
"country": country,
|
||||||
"version": version,
|
"version": version,
|
||||||
"available_countries": {**built_in, **custom},
|
"available_countries": {**built_in, **custom_names},
|
||||||
"custom_regions": custom,
|
"custom_regions": custom,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -1272,6 +1273,8 @@ async def websocket_set_country(
|
|||||||
vol.Required("type"): "shopping_list_manager/regions/create",
|
vol.Required("type"): "shopping_list_manager/regions/create",
|
||||||
vol.Required("code"): vol.All(str, vol.Length(min=2, max=8), vol.Upper),
|
vol.Required("code"): vol.All(str, vol.Length(min=2, max=8), vol.Upper),
|
||||||
vol.Required("name"): vol.All(str, vol.Length(min=1, max=64)),
|
vol.Required("name"): vol.All(str, vol.Length(min=1, max=64)),
|
||||||
|
vol.Optional("currency_symbol"): vol.Any(vol.All(str, vol.Length(min=1, max=5)), None),
|
||||||
|
vol.Optional("language"): vol.Any(vol.All(str, vol.Length(min=1, max=64)), None),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@websocket_api.async_response
|
@websocket_api.async_response
|
||||||
@@ -1283,20 +1286,22 @@ async def websocket_create_custom_region(
|
|||||||
"""Create a custom region."""
|
"""Create a custom region."""
|
||||||
code = msg["code"].upper()
|
code = msg["code"].upper()
|
||||||
name = msg["name"].strip()
|
name = msg["name"].strip()
|
||||||
|
currency_symbol = msg.get("currency_symbol")
|
||||||
|
language = msg.get("language")
|
||||||
storage = get_storage(hass)
|
storage = get_storage(hass)
|
||||||
|
|
||||||
if code in _BUILT_IN_COUNTRIES:
|
if code in _BUILT_IN_COUNTRIES:
|
||||||
connection.send_error(msg["id"], "conflict", f"{code} is a built-in region")
|
connection.send_error(msg["id"], "conflict", f"{code} is a built-in region")
|
||||||
return
|
return
|
||||||
|
|
||||||
created = await storage.create_custom_region(code, name)
|
created = await storage.create_custom_region(code, name, currency_symbol, language)
|
||||||
if not created:
|
if not created:
|
||||||
connection.send_error(msg["id"], "conflict", f"Region {code} already exists")
|
connection.send_error(msg["id"], "conflict", f"Region {code} already exists")
|
||||||
return
|
return
|
||||||
|
|
||||||
connection.send_result(
|
connection.send_result(
|
||||||
msg["id"],
|
msg["id"],
|
||||||
{"success": True, "code": code, "name": name, "custom_regions": storage.get_custom_regions()}
|
{"success": True, "code": code, "custom_regions": storage.get_custom_regions()}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user