From c5c76cadea8c70f67649ec3ae61188284e612362 Mon Sep 17 00:00:00 2001 From: smilerz Date: Sat, 16 Oct 2021 13:32:27 -0500 Subject: [PATCH] getUserPreference available for all UserPreferences --- cookbook/migrations/0162_food_inherit.py | 43 +++++++++++++++++++ .../0163_create_food_ignore_fields.py | 24 +++++++++++ cookbook/models.py | 17 +++++++- cookbook/serializer.py | 31 ++++++++----- cookbook/urls.py | 2 +- cookbook/views/api.py | 12 +++--- vue/src/utils/utils.js | 13 ------ 7 files changed, 110 insertions(+), 32 deletions(-) create mode 100644 cookbook/migrations/0162_food_inherit.py create mode 100644 cookbook/migrations/0163_create_food_ignore_fields.py diff --git a/cookbook/migrations/0162_food_inherit.py b/cookbook/migrations/0162_food_inherit.py new file mode 100644 index 00000000..e80fa2be --- /dev/null +++ b/cookbook/migrations/0162_food_inherit.py @@ -0,0 +1,43 @@ +# Generated by Django 3.2.7 on 2021-10-14 22:36 + +import cookbook.models +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('cookbook', '0161_alter_shoppinglistentry_list_recipe'), + ] + + operations = [ + migrations.CreateModel( + name='FoodParentIgnore', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('field', models.CharField(max_length=32, unique=True)), + ('name', models.CharField(max_length=64, unique=True)), + ], + bases=(models.Model, cookbook.models.PermissionModelMixin), + ), + migrations.AddField( + model_name='food', + name='child_inherit', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='userpreference', + name='food_inherit', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='userpreference', + name='mealplan_autoinclude_related', + field=models.BooleanField(default=True), + ), + migrations.AddField( + model_name='food', + name='ignore_parent', + field=models.ManyToManyField(blank=True, related_name='ignore_parent', to='cookbook.FoodParentIgnore'), + ), + ] diff --git a/cookbook/migrations/0163_create_food_ignore_fields.py b/cookbook/migrations/0163_create_food_ignore_fields.py new file mode 100644 index 00000000..3051b141 --- /dev/null +++ b/cookbook/migrations/0163_create_food_ignore_fields.py @@ -0,0 +1,24 @@ +from cookbook.models import FoodParentIgnore +from django.db import migrations + + +def create_ignorefields(apps, schema_editor): + FoodParentIgnore.objects.create(name='Supermarket Category', field='name') + FoodParentIgnore.objects.create(name='Ignore Shopping', field='ignore_shopping') + FoodParentIgnore.objects.create(name='Diet', field='diet') + FoodParentIgnore.objects.create(name='Substitute', field='substitute') + FoodParentIgnore.objects.create(name='Substitute Children', field='substitute_children') + FoodParentIgnore.objects.create(name='Substitute Siblings', field='substitute_siblings') + + +class Migration(migrations.Migration): + + dependencies = [ + ('cookbook', '0162_food_inherit'), + ] + + operations = [ + migrations.RunPython( + create_ignorefields + ), + ] diff --git a/cookbook/models.py b/cookbook/models.py index 3c676475..ceec8e64 100644 --- a/cookbook/models.py +++ b/cookbook/models.py @@ -329,8 +329,7 @@ class UserPreference(models.Model, PermissionModelMixin): mealplan_autoadd_shopping = models.BooleanField(default=False) mealplan_autoexclude_onhand = models.BooleanField(default=True) mealplan_autoinclude_related = models.BooleanField(default=True) - filter_to_supermarket = models.BooleanField(default=False) - default_delay = models.IntegerField(default=4) + food_inherit = models.BooleanField(default=False) created_at = models.DateTimeField(auto_now_add=True) space = models.ForeignKey(Space, on_delete=models.CASCADE, null=True) @@ -474,6 +473,18 @@ class Unit(ExportModelOperationsMixin('unit'), models.Model, PermissionModelMixi ] +class FoodParentIgnore(models.Model, PermissionModelMixin): + field = models.CharField(max_length=32, unique=True) + name = models.CharField(max_length=64, unique=True) + + def __str__(self): + return _(self.name) + + @staticmethod + def get_name(self): + return _(self.name) + + class Food(ExportModelOperationsMixin('food'), TreeModel, PermissionModelMixin): # exclude fields not implemented yet inherit_fields = FoodInheritField.objects.exclude(field__in=['diet', 'substitute', 'substitute_children', 'substitute_siblings']) @@ -487,6 +498,8 @@ class Food(ExportModelOperationsMixin('food'), TreeModel, PermissionModelMixin): ignore_shopping = models.BooleanField(default=False) description = models.TextField(default='', blank=True) on_hand = models.BooleanField(default=False) + child_inherit = models.BooleanField(default=False) + ignore_parent = models.ManyToManyField(FoodParentIgnore, related_name="ignore_parent", blank=True) space = models.ForeignKey(Space, on_delete=models.CASCADE) objects = ScopedManager(space='space', _manager_class=TreeManager) diff --git a/cookbook/serializer.py b/cookbook/serializer.py index b99e945c..19582969 100644 --- a/cookbook/serializer.py +++ b/cookbook/serializer.py @@ -12,13 +12,12 @@ from drf_writable_nested import UniqueFieldsMixin, WritableNestedModelSerializer from rest_framework import serializers from rest_framework.exceptions import NotFound, ValidationError -from cookbook.models import (Automation, BookmarkletImport, Comment, CookLog, Food, - FoodInheritField, ImportLog, Ingredient, Keyword, MealPlan, MealType, - NutritionInformation, Recipe, RecipeBook, RecipeBookEntry, - RecipeImport, ShareLink, ShoppingList, ShoppingListEntry, - ShoppingListRecipe, Step, Storage, Supermarket, SupermarketCategory, - SupermarketCategoryRelation, Sync, SyncLog, Unit, UserFile, - UserPreference, ViewLog) +from cookbook.models import (Automation, BookmarkletImport, Comment, CookLog, Food, ImportLog, + Ingredient, Keyword, MealPlan, MealType, NutritionInformation, Recipe, + RecipeBook, RecipeBookEntry, RecipeImport, ShareLink, ShoppingList, + ShoppingListEntry, ShoppingListRecipe, Step, Storage, Supermarket, + SupermarketCategory, SupermarketCategoryRelation, Sync, SyncLog, Unit, + UserFile, UserPreference, ViewLog) from cookbook.templatetags.custom_tags import markdown @@ -163,8 +162,7 @@ class UserPreferenceSerializer(serializers.ModelSerializer): fields = ( 'user', 'theme', 'nav_color', 'default_unit', 'default_page', 'search_style', 'show_recent', 'plan_share', 'ingredient_decimals', - 'comments', 'shopping_auto_sync', 'mealplan_autoadd_shopping', 'food_ignore_default', 'default_delay', - 'mealplan_autoinclude_related', 'mealplan_autoexclude_onhand', 'shopping_share' + 'comments', 'shopping_auto_sync', 'mealplan_autoadd_shopping' ) @@ -404,7 +402,10 @@ class FoodSerializer(UniqueFieldsMixin, WritableNestedModelSerializer, ExtendedR class Meta: model = Food - fields = ('id', 'name', 'description', 'recipe', 'ignore_shopping', 'supermarket_category', 'image', 'parent', 'numchild', 'numrecipe', 'on_hand') + fields = ( + 'id', 'name', 'description', 'shopping', 'recipe', 'ignore_shopping', 'supermarket_category', + 'image', 'parent', 'numchild', 'numrecipe', 'on_hand', 'child_inherit', 'ignore_parent' + ) read_only_fields = ('id', 'numchild', 'parent', 'image', 'numrecipe') @@ -930,3 +931,13 @@ class FoodShoppingUpdateSerializer(serializers.ModelSerializer): class Meta: model = Recipe fields = ['id', 'amount', 'unit', 'delete', ] + + +class FoodParentIgnoreSerializer(serializers.ModelSerializer): + field = serializers.CharField() + name = serializers.CharField() + + class Meta: + model = Recipe + fields = ['id', 'name', 'field', ] + read_only_fields = ('id', 'name', 'field', ) diff --git a/cookbook/urls.py b/cookbook/urls.py index 68ac160b..e780697a 100644 --- a/cookbook/urls.py +++ b/cookbook/urls.py @@ -19,7 +19,7 @@ router.register(r'automation', api.AutomationViewSet) router.register(r'bookmarklet-import', api.BookmarkletImportViewSet) router.register(r'cook-log', api.CookLogViewSet) router.register(r'food', api.FoodViewSet) -router.register(r'food-inherit-field', api.FoodInheritFieldViewSet) +router.register(r'food-inherit-ignore', api.FoodParentIgnoreViewSet) router.register(r'import-log', api.ImportLogViewSet) router.register(r'ingredient', api.IngredientViewSet) router.register(r'keyword', api.KeywordViewSet) diff --git a/cookbook/views/api.py b/cookbook/views/api.py index 99c23498..52df7fd8 100644 --- a/cookbook/views/api.py +++ b/cookbook/views/api.py @@ -39,7 +39,7 @@ from cookbook.helper.recipe_html_import import get_recipe_from_source from cookbook.helper.recipe_search import get_facet, old_search, search_recipes from cookbook.helper.recipe_url_import import get_from_scraper from cookbook.helper.shopping_helper import shopping_helper -from cookbook.models import (Automation, BookmarkletImport, CookLog, Food, FoodInheritField, +from cookbook.models import (Automation, BookmarkletImport, CookLog, Food, FoodParentIgnore, ImportLog, Ingredient, Keyword, MealPlan, MealType, Recipe, RecipeBook, RecipeBookEntry, ShareLink, ShoppingList, ShoppingListEntry, ShoppingListRecipe, Step, Storage, Supermarket, SupermarketCategory, @@ -50,7 +50,7 @@ from cookbook.provider.local import Local from cookbook.provider.nextcloud import Nextcloud from cookbook.schemas import FilterSchema, QueryParam, QueryParamAutoSchema, TreeSchema from cookbook.serializer import (AutomationSerializer, BookmarkletImportSerializer, - CookLogSerializer, FoodInheritFieldSerializer, FoodSerializer, + CookLogSerializer, FoodParentIgnoreSerializer, FoodSerializer, FoodShoppingUpdateSerializer, ImportLogSerializer, IngredientSerializer, KeywordSerializer, MealPlanSerializer, MealTypeSerializer, RecipeBookEntrySerializer, @@ -393,14 +393,14 @@ class UnitViewSet(viewsets.ModelViewSet, MergeMixin, FuzzyFilterMixin): pagination_class = DefaultPagination -class FoodInheritFieldViewSet(viewsets.ReadOnlyModelViewSet): - queryset = FoodInheritField.objects - serializer_class = FoodInheritFieldSerializer +class FoodParentIgnoreViewSet(viewsets.ReadOnlyModelViewSet): + queryset = FoodParentIgnore.objects + serializer_class = FoodParentIgnoreSerializer permission_classes = [CustomIsUser] def get_queryset(self): # exclude fields not yet implemented - return Food.inherit_fields + return self.queryset.exclude(field__in=['diet', 'substitute', 'substitute_children', 'substitute_siblings']) class FoodViewSet(viewsets.ModelViewSet, TreeMixin): diff --git a/vue/src/utils/utils.js b/vue/src/utils/utils.js index e4bce0a6..a0ab5821 100644 --- a/vue/src/utils/utils.js +++ b/vue/src/utils/utils.js @@ -220,11 +220,6 @@ export const ApiMixin = { return { Models: Models, Actions: Actions, - FoodCreateDefault: function (form) { - form.inherit_ignore = getUserPreference("food_ignore_default") - form.inherit = form.supermarket_category.length > 0 - return form - }, } }, methods: { @@ -536,11 +531,3 @@ const specialCases = { }) }, } - -export const formFunctions = { - FoodCreateDefault: function (form) { - form.fields.filter((x) => x.field === "ignore_inherit")[0].value = getUserPreference("food_ignore_default") - form.fields.filter((x) => x.field === "inherit")[0].value = getUserPreference("food_ignore_default").length > 0 - return form - }, -}