From 682f4a4297292043a20a7ba873c3afa0d45e7112 Mon Sep 17 00:00:00 2001 From: smilerz Date: Wed, 15 Dec 2021 13:23:22 -0600 Subject: [PATCH] fix post_save signal for sqlite --- cookbook/apps.py | 7 ++----- cookbook/signals.py | 11 +++++++++++ cookbook/tests/factories/__init__.py | 6 +++--- recipes/settings.py | 16 ++++++++-------- 4 files changed, 24 insertions(+), 16 deletions(-) diff --git a/cookbook/apps.py b/cookbook/apps.py index 3297d6928..5654684df 100644 --- a/cookbook/apps.py +++ b/cookbook/apps.py @@ -12,10 +12,7 @@ class CookbookConfig(AppConfig): name = 'cookbook' def ready(self): - # post_save signal is only necessary if using full-text search on postgres - if settings.DATABASES['default']['ENGINE'] in ['django.db.backends.postgresql_psycopg2', - 'django.db.backends.postgresql']: - import cookbook.signals # noqa + import cookbook.signals # noqa if not settings.DISABLE_TREE_FIX_STARTUP: # when starting up run fix_tree to: @@ -23,7 +20,7 @@ class CookbookConfig(AppConfig): # b) fix problems, if any, with tree consistency with scopes_disabled(): try: - from cookbook.models import Keyword, Food + from cookbook.models import Food, Keyword Keyword.fix_tree(fix_paths=True) Food.fix_tree(fix_paths=True) except OperationalError: diff --git a/cookbook/signals.py b/cookbook/signals.py index 242f9152a..7fe8384dc 100644 --- a/cookbook/signals.py +++ b/cookbook/signals.py @@ -1,6 +1,7 @@ from decimal import Decimal from functools import wraps +from django.conf import settings from django.contrib.postgres.search import SearchVector from django.db.models.signals import post_save from django.dispatch import receiver @@ -11,8 +12,14 @@ from cookbook.managers import DICTIONARY from cookbook.models import (Food, FoodInheritField, Ingredient, MealPlan, Recipe, ShoppingListEntry, Step) +SQLITE = True +if settings.DATABASES['default']['ENGINE'] in ['django.db.backends.postgresql_psycopg2', + 'django.db.backends.postgresql']: + SQLITE = False # wraps a signal with the ability to set 'skip_signal' to avoid creating recursive signals + + def skip_signal(signal_func): @wraps(signal_func) def _decorator(sender, instance, **kwargs): @@ -27,6 +34,8 @@ def skip_signal(signal_func): @receiver(post_save, sender=Recipe) @skip_signal def update_recipe_search_vector(sender, instance=None, created=False, **kwargs): + if SQLITE: + return language = DICTIONARY.get(translation.get_language(), 'simple') instance.name_search_vector = SearchVector('name__unaccent', weight='A', config=language) instance.desc_search_vector = SearchVector('description__unaccent', weight='C', config=language) @@ -40,6 +49,8 @@ def update_recipe_search_vector(sender, instance=None, created=False, **kwargs): @receiver(post_save, sender=Step) @skip_signal def update_step_search_vector(sender, instance=None, created=False, **kwargs): + if SQLITE: + return language = DICTIONARY.get(translation.get_language(), 'simple') instance.search_vector = SearchVector('instruction__unaccent', weight='B', config=language) try: diff --git a/cookbook/tests/factories/__init__.py b/cookbook/tests/factories/__init__.py index 0b911ea02..539f61c49 100644 --- a/cookbook/tests/factories/__init__.py +++ b/cookbook/tests/factories/__init__.py @@ -97,7 +97,7 @@ class SupermarketCategoryFactory(factory.django.DjangoModelFactory): @register class FoodFactory(factory.django.DjangoModelFactory): """Food factory.""" - name = factory.LazyAttribute(lambda x: faker.sentence(nb_words=3)) + name = factory.LazyAttribute(lambda x: faker.sentence(nb_words=3, variable_nb_words=False)) description = factory.LazyAttribute(lambda x: faker.sentence(nb_words=10)) supermarket_category = factory.Maybe( factory.LazyAttribute(lambda x: x.has_category), @@ -135,7 +135,7 @@ class UnitFactory(factory.django.DjangoModelFactory): @register class KeywordFactory(factory.django.DjangoModelFactory): """Keyword factory.""" - name = factory.LazyAttribute(lambda x: faker.sentence(nb_words=3)) + name = factory.LazyAttribute(lambda x: faker.sentence(nb_words=2, variable_nb_words=False)) # icon = models.CharField(max_length=16, blank=True, null=True) description = factory.LazyAttribute(lambda x: faker.sentence(nb_words=10)) space = factory.SubFactory(SpaceFactory) @@ -156,7 +156,7 @@ class IngredientFactory(factory.django.DjangoModelFactory): food = factory.SubFactory(FoodFactory, space=factory.SelfAttribute('..space')) unit = factory.SubFactory(UnitFactory, space=factory.SelfAttribute('..space')) amount = factory.LazyAttribute(lambda x: faker.random_int(min=1, max=10)) - note = factory.LazyAttribute(lambda x: faker.sentence(nb_words=5)) + note = factory.LazyAttribute(lambda x: faker.sentence(nb_words=8)) space = factory.SubFactory(SpaceFactory) class Meta: diff --git a/recipes/settings.py b/recipes/settings.py index 0e79da2e2..a7c80124f 100644 --- a/recipes/settings.py +++ b/recipes/settings.py @@ -308,14 +308,14 @@ else: # } # SQLite testing DB -# DATABASES = { -# 'default': { -# 'ENGINE': 'django.db.backends.sqlite3', -# 'OPTIONS': ast.literal_eval(os.getenv('DB_OPTIONS')) if os.getenv('DB_OPTIONS') else {}, -# 'NAME': 'db.sqlite3', -# 'CONN_MAX_AGE': 600, -# } -# } +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'OPTIONS': ast.literal_eval(os.getenv('DB_OPTIONS')) if os.getenv('DB_OPTIONS') else {}, + 'NAME': 'db.sqlite3', + 'CONN_MAX_AGE': 600, + } +} CACHES = { 'default': {