diff --git a/cookbook/models.py b/cookbook/models.py index 95c4688d8..103b3a3dc 100644 --- a/cookbook/models.py +++ b/cookbook/models.py @@ -805,14 +805,7 @@ class Food(ExportModelOperationsMixin('food'), TreeModel, PermissionModelMixin): self.delete() return target - def delete(self): - if self.ingredient_set.all().exclude(step=None).count() > 0: - raise ProtectedError(self.name + _(" is part of a recipe step and cannot be deleted"), self.ingredient_set.all().exclude(step=None)) - else: - return super().delete() - # MP_Tree move uses raw SQL to execute move, override behavior to force a save triggering post_save signal - def move(self, *args, **kwargs): super().move(*args, **kwargs) # treebeard bypasses ORM, need to explicity save to trigger post save signals retrieve the object again to avoid writing previous state back to disk diff --git a/cookbook/views/api.py b/cookbook/views/api.py index c8483ff5a..77527cca3 100644 --- a/cookbook/views/api.py +++ b/cookbook/views/api.py @@ -552,7 +552,9 @@ class DeleteRelationMixing: collector.collect([obj]) return collector - @extend_schema(responses=GenericModelReferenceSerializer(many=True)) + @extend_schema(responses=GenericModelReferenceSerializer(many=True), parameters=[ + OpenApiParameter(name='cache', description='If results can be cached or not', type=bool, default=True), + ]) @decorators.action(detail=True, methods=['GET'], serializer_class=GenericModelReferenceSerializer) @paginate def protecting(self, request, pk): @@ -562,11 +564,11 @@ class DeleteRelationMixing: obj = self.queryset.filter(pk=pk, space=request.space).first() if obj: CACHE_KEY = f'DELETE_COLLECTOR_{request.space.pk}_PROTECTING_{obj.__class__.__name__}_{obj.pk}' - if c := caches['default'].get(CACHE_KEY, None): - return c + cache = self.request.query_params.get('cache', "true") == "true" + if caches['default'].has_key(CACHE_KEY) and cache: + return caches['default'].get(CACHE_KEY) collector = self.collect(obj) - protected_objects = [] for o in collector.protected: protected_objects.append({ @@ -580,7 +582,9 @@ class DeleteRelationMixing: else: return [] - @extend_schema(responses=GenericModelReferenceSerializer(many=True)) + @extend_schema(responses=GenericModelReferenceSerializer(many=True), parameters=[ + OpenApiParameter(name='cache', description='If results can be cached or not', type=bool, default=True), + ]) @decorators.action(detail=True, methods=['GET'], serializer_class=GenericModelReferenceSerializer) @paginate def cascading(self, request, pk): @@ -590,25 +594,29 @@ class DeleteRelationMixing: obj = self.queryset.filter(pk=pk, space=request.space).first() if obj: CACHE_KEY = f'DELETE_COLLECTOR_{request.space.pk}_CASCADING_{obj.__class__.__name__}_{obj.pk}' - if c := caches['default'].get(CACHE_KEY, None): - return c + cache = self.request.query_params.get('cache', "true") == "true" + if caches['default'].has_key(CACHE_KEY) and cache: + return caches['default'].get(CACHE_KEY) collector = self.collect(obj) cascading_objects = [] for model, objs in collector.model_objs.items(): for o in objs: - cascading_objects.append({ - 'id': o.pk, - 'model': o.__class__.__name__, - 'name': str(o), - }) + if o.pk != pk and o.__class__.__name__ != obj.__class__.__name__: + cascading_objects.append({ + 'id': o.pk, + 'model': o.__class__.__name__, + 'name': str(o), + }) caches['default'].set(CACHE_KEY, cascading_objects, 60) return cascading_objects else: return [] - @extend_schema(responses=GenericModelReferenceSerializer(many=True)) + @extend_schema(responses=GenericModelReferenceSerializer(many=True), parameters=[ + OpenApiParameter(name='cache', description='If results can be cached or not', type=bool, default=True), + ]) @decorators.action(detail=True, methods=['GET'], serializer_class=GenericModelReferenceSerializer) @paginate def nulling(self, request, pk): @@ -618,8 +626,9 @@ class DeleteRelationMixing: obj = self.queryset.filter(pk=pk, space=request.space).first() if obj: CACHE_KEY = f'DELETE_COLLECTOR_{request.space.pk}_NULLING_{obj.__class__.__name__}_{obj.pk}' - if c := caches['default'].get(CACHE_KEY, None): - return c + cache = self.request.query_params.get('cache', "true") == "true" + if caches['default'].has_key(CACHE_KEY) and cache: + return caches['default'].get(CACHE_KEY) collector = self.collect(obj) diff --git a/vue3/src/components/model_editors/AccessTokenEditor.vue b/vue3/src/components/model_editors/AccessTokenEditor.vue index b652855f2..c29ccf16c 100644 --- a/vue3/src/components/model_editors/AccessTokenEditor.vue +++ b/vue3/src/components/model_editors/AccessTokenEditor.vue @@ -8,7 +8,8 @@ :is-update="isUpdate()" :is-changed="editingObjChanged" :model-class="modelClass" - :object-name="editingObjName()"> + :object-name="editingObjName()" + :editing-object="editingObj"> diff --git a/vue3/src/components/model_editors/AiProviderEditor.vue b/vue3/src/components/model_editors/AiProviderEditor.vue index 53a874cca..bac69b368 100644 --- a/vue3/src/components/model_editors/AiProviderEditor.vue +++ b/vue3/src/components/model_editors/AiProviderEditor.vue @@ -8,7 +8,8 @@ :is-update="isUpdate()" :is-changed="editingObjChanged" :model-class="modelClass" - :object-name="editingObjName()"> + :object-name="editingObjName()" + :editing-object="editingObj"> diff --git a/vue3/src/components/model_editors/AutomationEditor.vue b/vue3/src/components/model_editors/AutomationEditor.vue index 21b0d292e..1242eb9b8 100644 --- a/vue3/src/components/model_editors/AutomationEditor.vue +++ b/vue3/src/components/model_editors/AutomationEditor.vue @@ -8,7 +8,8 @@ :is-update="isUpdate()" :is-changed="editingObjChanged" :model-class="modelClass" - :object-name="editingObjName()"> + :object-name="editingObjName()" + :editing-object="editingObj"> diff --git a/vue3/src/components/model_editors/ConnectorConfigEditor.vue b/vue3/src/components/model_editors/ConnectorConfigEditor.vue index 0bc9a86fd..e20556ee1 100644 --- a/vue3/src/components/model_editors/ConnectorConfigEditor.vue +++ b/vue3/src/components/model_editors/ConnectorConfigEditor.vue @@ -8,7 +8,8 @@ :is-update="isUpdate()" :is-changed="editingObjChanged" :model-class="modelClass" - :object-name="editingObjName()"> + :object-name="editingObjName()" + :editing-object="editingObj"> diff --git a/vue3/src/components/model_editors/CookLogEditor.vue b/vue3/src/components/model_editors/CookLogEditor.vue index 3924df390..81781d48f 100644 --- a/vue3/src/components/model_editors/CookLogEditor.vue +++ b/vue3/src/components/model_editors/CookLogEditor.vue @@ -8,7 +8,8 @@ :is-update="isUpdate()" :is-changed="editingObjChanged" :model-class="modelClass" - :object-name="editingObjName()"> + :object-name="editingObjName()" + :editing-object="editingObj"> diff --git a/vue3/src/components/model_editors/CustomFilterEditor.vue b/vue3/src/components/model_editors/CustomFilterEditor.vue index ffceedafa..e3bd40c08 100644 --- a/vue3/src/components/model_editors/CustomFilterEditor.vue +++ b/vue3/src/components/model_editors/CustomFilterEditor.vue @@ -8,7 +8,8 @@ :is-update="isUpdate()" :is-changed="editingObjChanged" :model-class="modelClass" - :object-name="editingObjName()"> + :object-name="editingObjName()" + :editing-object="editingObj"> Coming Soon diff --git a/vue3/src/components/model_editors/FoodEditor.vue b/vue3/src/components/model_editors/FoodEditor.vue index bb2c689a3..4dd688377 100644 --- a/vue3/src/components/model_editors/FoodEditor.vue +++ b/vue3/src/components/model_editors/FoodEditor.vue @@ -8,7 +8,8 @@ :is-update="isUpdate()" :is-changed="editingObjChanged" :model-class="modelClass" - :object-name="editingObjName()"> + :object-name="editingObjName()" + :editing-object="editingObj"> diff --git a/vue3/src/components/model_editors/InviteLinkEditor.vue b/vue3/src/components/model_editors/InviteLinkEditor.vue index 96d7debb6..a6c4bea1d 100644 --- a/vue3/src/components/model_editors/InviteLinkEditor.vue +++ b/vue3/src/components/model_editors/InviteLinkEditor.vue @@ -8,7 +8,8 @@ :is-update="isUpdate()" :is-changed="editingObjChanged" :model-class="modelClass" - :object-name="editingObjName()"> + :object-name="editingObjName()" + :editing-object="editingObj"> diff --git a/vue3/src/components/model_editors/KeywordEditor.vue b/vue3/src/components/model_editors/KeywordEditor.vue index 333639d17..9c02d84e0 100644 --- a/vue3/src/components/model_editors/KeywordEditor.vue +++ b/vue3/src/components/model_editors/KeywordEditor.vue @@ -8,7 +8,8 @@ :is-update="isUpdate()" :is-changed="editingObjChanged" :model-class="modelClass" - :object-name="editingObjName()"> + :object-name="editingObjName()" + :editing-object="editingObj"> diff --git a/vue3/src/components/model_editors/MealPlanEditor.vue b/vue3/src/components/model_editors/MealPlanEditor.vue index 70f9b80b3..61c6eb628 100644 --- a/vue3/src/components/model_editors/MealPlanEditor.vue +++ b/vue3/src/components/model_editors/MealPlanEditor.vue @@ -8,7 +8,8 @@ :is-update="isUpdate()" :is-changed="editingObjChanged" :model-class="modelClass" - :object-name="editingObjName()"> + :object-name="editingObjName()" + :editing-object="editingObj"> diff --git a/vue3/src/components/model_editors/MealTypeEditor.vue b/vue3/src/components/model_editors/MealTypeEditor.vue index bcb868413..ab53f2498 100644 --- a/vue3/src/components/model_editors/MealTypeEditor.vue +++ b/vue3/src/components/model_editors/MealTypeEditor.vue @@ -8,7 +8,8 @@ :is-update="isUpdate()" :is-changed="editingObjChanged" :model-class="modelClass" - :object-name="editingObjName()"> + :object-name="editingObjName()" + :editing-object="editingObj"> diff --git a/vue3/src/components/model_editors/ModelEditorBase.vue b/vue3/src/components/model_editors/ModelEditorBase.vue index 1c1fbda5d..d06afe651 100644 --- a/vue3/src/components/model_editors/ModelEditorBase.vue +++ b/vue3/src/components/model_editors/ModelEditorBase.vue @@ -14,9 +14,14 @@ - {{ $t('Delete') }} + + {{ $t('Delete') }} + {{ $t('Delete') }} + + {{ $t('Create') }} {{ $t('Save') }} @@ -41,10 +46,10 @@