diff --git a/cookbook/connectors/homeassistant.py b/cookbook/connectors/homeassistant.py index e2bdcc22d..904afd078 100644 --- a/cookbook/connectors/homeassistant.py +++ b/cookbook/connectors/homeassistant.py @@ -43,13 +43,15 @@ class HomeAssistant(Connector): data = { "entity_id": self._config.todo_entity, "item": item, - "description": description, } + if self._config.supports_description_field: + data["description"] = description + try: await self.homeassistant_api_call("POST", "services/todo/add_item", data) except ClientError as err: - self._logger.warning(f"received an exception from the api: {err=}, {type(err)=}") + self._logger.warning(f"received an exception from the api: {err=}, {type(err)=} {data=}") async def on_shopping_list_entry_updated(self, space: Space, shopping_list_entry: ShoppingListEntry) -> None: if not self._config.on_shopping_list_entry_updated_enabled: diff --git a/cookbook/forms.py b/cookbook/forms.py index c0a670613..f3d6ec4bd 100644 --- a/cookbook/forms.py +++ b/cookbook/forms.py @@ -182,6 +182,12 @@ class ConnectorConfigForm(forms.ModelForm): required=False, ) + supports_description_field = forms.BooleanField( + help_text="Does the connector todo entity support the description field", + initial=True, + required=False, + ) + update_token = forms.CharField( widget=forms.TextInput(attrs={'autocomplete': 'update-token', 'type': 'password'}), required=False, @@ -198,7 +204,7 @@ class ConnectorConfigForm(forms.ModelForm): fields = ( 'name', 'type', 'enabled', 'on_shopping_list_entry_created_enabled', 'on_shopping_list_entry_updated_enabled', - 'on_shopping_list_entry_deleted_enabled', 'url', 'todo_entity', + 'on_shopping_list_entry_deleted_enabled', 'supports_description_field', 'url', 'todo_entity', ) help_texts = { diff --git a/cookbook/migrations/0219_connectorconfig_supports_description_field.py b/cookbook/migrations/0219_connectorconfig_supports_description_field.py new file mode 100644 index 000000000..2f2ac0749 --- /dev/null +++ b/cookbook/migrations/0219_connectorconfig_supports_description_field.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.15 on 2024-09-15 10:30 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('cookbook', '0218_alter_mealplan_from_date_alter_mealplan_to_date'), + ] + + operations = [ + migrations.AddField( + model_name='connectorconfig', + name='supports_description_field', + field=models.BooleanField(default=True, help_text='Does the todo entity support the description field'), + ), + ] diff --git a/cookbook/models.py b/cookbook/models.py index 6c34d8183..e41560992 100644 --- a/cookbook/models.py +++ b/cookbook/models.py @@ -406,6 +406,7 @@ class ConnectorConfig(models.Model, PermissionModelMixin): on_shopping_list_entry_created_enabled = models.BooleanField(default=False) on_shopping_list_entry_updated_enabled = models.BooleanField(default=False) on_shopping_list_entry_deleted_enabled = models.BooleanField(default=False) + supports_description_field = models.BooleanField(default=True, help_text="Does the todo entity support the description field") url = models.URLField(blank=True, null=True) token = models.CharField(max_length=512, blank=True, null=True) diff --git a/cookbook/serializer.py b/cookbook/serializer.py index 8a7114c46..1bdbbad6f 100644 --- a/cookbook/serializer.py +++ b/cookbook/serializer.py @@ -427,7 +427,7 @@ class ConnectorConfigConfigSerializer(SpacedModelSerializer): fields = ( 'id', 'name', 'url', 'token', 'todo_entity', 'enabled', 'on_shopping_list_entry_created_enabled', 'on_shopping_list_entry_updated_enabled', - 'on_shopping_list_entry_deleted_enabled', 'created_by' + 'on_shopping_list_entry_deleted_enabled', 'supports_description_field', 'created_by' ) read_only_fields = ('created_by',) diff --git a/cookbook/tests/api/test_api_connector_config.py b/cookbook/tests/api/test_api_connector_config.py index 79f496bf6..a7c490a78 100644 --- a/cookbook/tests/api/test_api_connector_config.py +++ b/cookbook/tests/api/test_api_connector_config.py @@ -99,11 +99,23 @@ def test_add(arg, request, a1_s2, obj_1): assert r.status_code == arg[1] if r.status_code == 201: assert response['name'] == 'test' + assert response['supports_description_field'] == True r = c.get(reverse(DETAIL_URL, args={response['id']})) assert r.status_code == 200 r = a1_s2.get(reverse(DETAIL_URL, args={response['id']})) assert r.status_code == 404 +def test_add_with_supports_description_field_false(a1_s2): + r = a1_s2.post( + reverse(LIST_URL), + {'name': 'test', 'url': 'http://localhost:8123/api', 'token': '1234', 'enabled': 'true', 'supports_description_field': 'false'}, + content_type='application/json' + ) + response = json.loads(r.content) + print(r.content) + assert r.status_code == 201 + assert response['name'] == 'test' + assert response['supports_description_field'] == False def test_delete(a1_s1, a1_s2, obj_1): r = a1_s2.delete(