From 2a138a852fcbf41cad28fa692d87e79f890c6243 Mon Sep 17 00:00:00 2001 From: smilerz Date: Tue, 19 Oct 2021 13:14:22 -0500 Subject: [PATCH] inheritance works with object moves --- cookbook/models.py | 1 + cookbook/serializer.py | 25 ++++++++------------ cookbook/signals.py | 1 + vue/src/apps/ModelListView/ModelListView.vue | 14 +++++------ 4 files changed, 19 insertions(+), 22 deletions(-) diff --git a/cookbook/models.py b/cookbook/models.py index f59cb9be..f64bfff3 100644 --- a/cookbook/models.py +++ b/cookbook/models.py @@ -15,6 +15,7 @@ from django.core.files.uploadedfile import InMemoryUploadedFile, UploadedFile from django.core.validators import MinLengthValidator from django.db import IntegrityError, models from django.db.models import Index, ProtectedError, Q, Subquery +from django.db.models.fields.related import ManyToManyField from django.db.models.functions import Substr from django.utils import timezone from django.utils.translation import gettext as _ diff --git a/cookbook/serializer.py b/cookbook/serializer.py index 5a1a888e..14a1cda4 100644 --- a/cookbook/serializer.py +++ b/cookbook/serializer.py @@ -130,12 +130,19 @@ class UserNameSerializer(WritableNestedModelSerializer): fields = ('id', 'username') -class FoodInheritFieldSerializer(UniqueFieldsMixin, serializers.ModelSerializer): +class FoodInheritFieldSerializer(UniqueFieldsMixin): + + def create(self, validated_data): + # don't allow writing to FoodInheritField via API + return FoodInheritField.objects.get(**validated_data) + + def update(self, instance, validated_data): + # don't allow writing to FoodInheritField via API + return FoodInheritField.objects.get(**validated_data) class Meta: model = FoodInheritField fields = ['id', 'name', 'field', ] - read_only_fields = ('id', 'name', 'field', ) class UserPreferenceSerializer(serializers.ModelSerializer): @@ -266,18 +273,6 @@ class KeywordSerializer(UniqueFieldsMixin, ExtendedRecipeMixin): def get_label(self, obj): return str(obj) - # def get_image(self, obj): - # recipes = obj.recipe_set.all().filter(space=obj.space).exclude(image__isnull=True).exclude(image__exact='') - # if recipes.count() == 0 and obj.has_children(): - # recipes = Recipe.objects.filter(keywords__in=obj.get_descendants(), space=obj.space).exclude(image__isnull=True).exclude(image__exact='') # if no recipes found - check whole tree - # if recipes.count() != 0: - # return random.choice(recipes).image.url - # else: - # return None - - # def count_recipes(self, obj): - # return obj.recipe_set.filter(space=self.context['request'].space).all().count() - def create(self, validated_data): # since multi select tags dont have id's # duplicate names might be routed to create @@ -361,7 +356,7 @@ class FoodSerializer(UniqueFieldsMixin, WritableNestedModelSerializer, ExtendedR supermarket_category = SupermarketCategorySerializer(allow_null=True, required=False) recipe = RecipeSimpleSerializer(allow_null=True, required=False) shopping = serializers.SerializerMethodField('get_shopping_status') - ignore_inherit = FoodInheritFieldSerializer(allow_null=True, required=False, many=True) + ignore_inherit = FoodInheritFieldSerializer(many=True) recipe_filter = 'steps__ingredients__food' diff --git a/cookbook/signals.py b/cookbook/signals.py index 4a530b02..10ca5262 100644 --- a/cookbook/signals.py +++ b/cookbook/signals.py @@ -48,6 +48,7 @@ def update_step_search_vector(sender, instance=None, created=False, **kwargs): @receiver(post_save, sender=Food) +@skip_signal def update_food_inheritance(sender, instance=None, created=False, **kwargs): if not instance: return diff --git a/vue/src/apps/ModelListView/ModelListView.vue b/vue/src/apps/ModelListView/ModelListView.vue index 3202ae71..eb3c5477 100644 --- a/vue/src/apps/ModelListView/ModelListView.vue +++ b/vue/src/apps/ModelListView/ModelListView.vue @@ -64,7 +64,7 @@ import { BootstrapVue } from "bootstrap-vue" import "bootstrap-vue/dist/bootstrap-vue.css" -import { CardMixin, ApiMixin, getConfig, StandardToasts, getUserPreference } from "@/utils/utils" +import { CardMixin, ApiMixin, getConfig, StandardToasts, getUserPreference, makeToast } from "@/utils/utils" import GenericInfiniteCards from "@/components/GenericInfiniteCards" import GenericHorizontalCard from "@/components/GenericHorizontalCard" @@ -296,11 +296,11 @@ export default { .then((result) => { this.moveUpdateItem(source_id, target_id) // TODO make standard toast - this.makeToast(this.$t("Success"), "Succesfully moved resource", "success") + makeToast(this.$t("Success"), "Succesfully moved resource", "success") }) .catch((err) => { console.log(err) - this.makeToast(this.$t("Error"), err.bodyText, "danger") + makeToast(this.$t("Error"), err.bodyText, "danger") }) }, moveUpdateItem: function (source_id, target_id) { @@ -336,12 +336,12 @@ export default { .then((result) => { this.mergeUpdateItem(source_id, target_id) // TODO make standard toast - this.makeToast(this.$t("Success"), "Succesfully merged resource", "success") + makeToast(this.$t("Success"), "Succesfully merged resource", "success") }) .catch((err) => { //TODO error checking not working with OpenAPI methods console.log("Error", err) - this.makeToast(this.$t("Error"), err.bodyText, "danger") + makeToast(this.$t("Error"), err.bodyText, "danger") }) if (automate) { @@ -390,7 +390,7 @@ export default { }) .catch((err) => { console.log(err) - this.makeToast(this.$t("Error"), err.bodyText, "danger") + makeToast(this.$t("Error"), err.bodyText, "danger") }) }, getRecipes: function (col, item) { @@ -410,7 +410,7 @@ export default { }) .catch((err) => { console.log(err) - this.makeToast(this.$t("Error"), err.bodyText, "danger") + makeToast(this.$t("Error"), err.bodyText, "danger") }) }, refreshThis: function (id) {