From 445e64c71edafef27d46d19c1facec25deab0170 Mon Sep 17 00:00:00 2001 From: Mikhail Epifanov Date: Fri, 12 Jan 2024 22:20:55 +0100 Subject: [PATCH] add an config toggle for external connectors --- cookbook/connectors/connector_manager.py | 6 ++++- .../migrations/0208_homeassistantconfig.py | 13 ++++++---- cookbook/models.py | 24 +++++++++++-------- cookbook/signals.py | 8 ++++--- cookbook/templates/base.html | 4 ++++ recipes/settings.py | 2 ++ 6 files changed, 38 insertions(+), 19 deletions(-) diff --git a/cookbook/connectors/connector_manager.py b/cookbook/connectors/connector_manager.py index 2be64732..53252307 100644 --- a/cookbook/connectors/connector_manager.py +++ b/cookbook/connectors/connector_manager.py @@ -1,6 +1,7 @@ import asyncio import logging import multiprocessing +import queue from asyncio import Task from dataclasses import dataclass from enum import Enum @@ -55,7 +56,10 @@ class ConnectorManager: else: return - self._queue.put_nowait(Payload(instance, action_type)) + try: + self._queue.put_nowait(Payload(instance, action_type)) + except queue.Full: + return def stop(self): self._queue.close() diff --git a/cookbook/migrations/0208_homeassistantconfig.py b/cookbook/migrations/0208_homeassistantconfig.py index a7140b34..f21ff06a 100644 --- a/cookbook/migrations/0208_homeassistantconfig.py +++ b/cookbook/migrations/0208_homeassistantconfig.py @@ -1,4 +1,4 @@ -# Generated by Django 4.2.7 on 2024-01-11 22:06 +# Generated by Django 4.2.7 on 2024-01-12 21:01 import cookbook.models from django.conf import settings @@ -20,16 +20,19 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=128, validators=[django.core.validators.MinLengthValidator(1)])), + ('enabled', models.BooleanField(default=True, help_text='Is Connector Enabled')), + ('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)), ('url', models.URLField(blank=True)), ('token', models.CharField(blank=True, max_length=512)), ('todo_entity', models.CharField(default='todo.shopping_list', max_length=128)), - ('enabled', models.BooleanField(default=True, help_text='Is HomeAssistant Connector Enabled')), - ('on_shopping_list_entry_created_enabled', models.BooleanField(default=False, help_text='Enable syncing ShoppingListEntry to Homeassistant Todo List')), - ('on_shopping_list_entry_updated_enabled', models.BooleanField(default=False, help_text='PLACEHOLDER')), - ('on_shopping_list_entry_deleted_enabled', models.BooleanField(default=False, help_text='Enable syncing ShoppingListEntry deletion to Homeassistant Todo List')), ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), ('space', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cookbook.space')), ], + options={ + 'abstract': False, + }, bases=(models.Model, cookbook.models.PermissionModelMixin), ), ] diff --git a/cookbook/models.py b/cookbook/models.py index d6cf5078..a28cc5a5 100644 --- a/cookbook/models.py +++ b/cookbook/models.py @@ -366,24 +366,28 @@ class Space(ExportModelOperationsMixin('space'), models.Model): return self.name -class HomeAssistantConfig(models.Model, PermissionModelMixin): +class ConnectorConfig(models.Model, PermissionModelMixin): name = models.CharField(max_length=128, validators=[MinLengthValidator(1)]) - url = models.URLField(blank=True) - token = models.CharField(max_length=512, blank=True) - - todo_entity = models.CharField(max_length=128, default='todo.shopping_list') - - enabled = models.BooleanField(default=True, help_text="Is HomeAssistant Connector Enabled") - on_shopping_list_entry_created_enabled = models.BooleanField(default=False, help_text="Enable syncing ShoppingListEntry to Homeassistant Todo List") - on_shopping_list_entry_updated_enabled = models.BooleanField(default=False, help_text="PLACEHOLDER") - on_shopping_list_entry_deleted_enabled = models.BooleanField(default=False, help_text="Enable syncing ShoppingListEntry deletion to Homeassistant Todo List") + enabled = models.BooleanField(default=True, help_text="Is Connector Enabled") + 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) created_by = models.ForeignKey(User, on_delete=models.PROTECT) space = models.ForeignKey(Space, on_delete=models.CASCADE) objects = ScopedManager(space='space') + class Meta: + abstract = True + + +class HomeAssistantConfig(ConnectorConfig): + url = models.URLField(blank=True) + token = models.CharField(max_length=512, blank=True) + todo_entity = models.CharField(max_length=128, default='todo.shopping_list') + class UserPreference(models.Model, PermissionModelMixin): # Themes diff --git a/cookbook/signals.py b/cookbook/signals.py index 2d94b1d0..ce957bce 100644 --- a/cookbook/signals.py +++ b/cookbook/signals.py @@ -15,6 +15,7 @@ from cookbook.helper.shopping_helper import RecipeShoppingEditor from cookbook.managers import DICTIONARY from cookbook.models import (Food, MealPlan, PropertyType, Recipe, SearchFields, SearchPreference, Step, Unit, UserPreference) +from recipes.settings import ENABLE_EXTERNAL_CONNECTORS SQLITE = True if settings.DATABASES['default']['ENGINE'] == 'django.db.backends.postgresql': @@ -164,6 +165,7 @@ def clear_property_type_cache(sender, instance=None, created=False, **kwargs): caches['default'].delete(CacheHelper(instance.space).PROPERTY_TYPE_CACHE_KEY) -handler = ConnectorManager() -post_save.connect(handler, dispatch_uid="connector_manager") -post_delete.connect(handler, dispatch_uid="connector_manager") +if ENABLE_EXTERNAL_CONNECTORS: + handler = ConnectorManager() + post_save.connect(handler, dispatch_uid="connector_manager") + post_delete.connect(handler, dispatch_uid="connector_manager") diff --git a/cookbook/templates/base.html b/cookbook/templates/base.html index d84ccbd4..d9e2eda1 100644 --- a/cookbook/templates/base.html +++ b/cookbook/templates/base.html @@ -335,6 +335,10 @@ {% trans 'Space Settings' %} {% endif %} + {% if request.user == request.space.created_by or user.is_superuser %} + {% trans 'External Connectors' %} + {% endif %} {% if user.is_superuser %}