From 06eae30773955d21c7e4dc64a40d193edb5033fe Mon Sep 17 00:00:00 2001 From: thekiwismarthome <134335563+thekiwismarthome@users.noreply.github.com> Date: Sat, 14 Feb 2026 07:36:09 +1300 Subject: [PATCH] Update handlers.py --- .../websocket/handlers.py | 95 ++++++++++++++++--- 1 file changed, 84 insertions(+), 11 deletions(-) diff --git a/custom_components/shopping_list_manager/websocket/handlers.py b/custom_components/shopping_list_manager/websocket/handlers.py index 8adaa6f..4e44887 100644 --- a/custom_components/shopping_list_manager/websocket/handlers.py +++ b/custom_components/shopping_list_manager/websocket/handlers.py @@ -550,6 +550,9 @@ def websocket_get_list_total( vol.Required("type"): WS_TYPE_PRODUCTS_SEARCH, vol.Required("query"): str, vol.Optional("limit", default=10): int, + vol.Optional("exclude_allergens"): [str], + vol.Optional("include_tags"): [str], + vol.Optional("substitution_group"): str, } ) @callback @@ -558,21 +561,91 @@ def websocket_search_products( connection: websocket_api.ActiveConnection, msg: Dict[str, Any], ) -> None: - """Handle search products command.""" + """Handle search products command with enhanced filters.""" storage = get_storage(hass) - query = msg["query"] - limit = msg.get("limit", 10) - results = storage.search_products(query, limit) + try: + results = storage.search_products( + query=msg["query"], + limit=msg.get("limit", 10), + exclude_allergens=msg.get("exclude_allergens"), + include_tags=msg.get("include_tags"), + substitution_group=msg.get("substitution_group"), + ) + + connection.send_result( + msg["id"], + {"products": [product.to_dict() for product in results]} + ) + except Exception as err: + _LOGGER.error("Error searching products: %s", err) + connection.send_error(msg["id"], "search_failed", str(err)) + +@websocket_api.websocket_command( + { + vol.Required("type"): "shopping_list_manager/products/substitutes", + vol.Required("product_id"): str, + vol.Optional("limit", default=5): int, + } +) +@callback +def websocket_get_product_substitutes( + hass: HomeAssistant, + connection: websocket_api.ActiveConnection, + msg: Dict[str, Any], +) -> None: + """Handle get product substitutes command.""" + storage = get_storage(hass) - connection.send_result( - msg["id"], - { - "products": [product.to_dict() for product in results] - } - ) - + try: + substitutes = storage.find_product_substitutes( + product_id=msg["product_id"], + limit=msg.get("limit", 5), + ) + + connection.send_result( + msg["id"], + {"substitutes": [product.to_dict() for product in substitutes]} + ) + except Exception as err: + _LOGGER.error("Error finding substitutes: %s", err) + connection.send_error(msg["id"], "substitutes_failed", str(err)) +@websocket_api.websocket_command( + { + vol.Required("type"): WS_TYPE_PRODUCTS_SEARCH, + vol.Required("query"): str, + vol.Optional("limit", default=10): int, + vol.Optional("exclude_allergens"): [str], + vol.Optional("include_tags"): [str], + vol.Optional("substitution_group"): str, + } +) +@callback +def websocket_search_products( + hass: HomeAssistant, + connection: websocket_api.ActiveConnection, + msg: Dict[str, Any], +) -> None: + """Handle search products command with enhanced filters.""" + storage = get_storage(hass) + + try: + results = storage.search_products( + query=msg["query"], + limit=msg.get("limit", 10), + exclude_allergens=msg.get("exclude_allergens"), + include_tags=msg.get("include_tags"), + substitution_group=msg.get("substitution_group"), + ) + + connection.send_result( + msg["id"], + {"products": [product.to_dict() for product in results]} + ) + except Exception as err: + _LOGGER.error("Error searching products: %s", err) + connection.send_error(msg["id"], "search_failed", str(err)) @websocket_api.websocket_command( { vol.Required("type"): WS_TYPE_PRODUCTS_SUGGESTIONS,