From 3cb980c0e72d9f7859618dcb238e9a1a7565b078 Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Sun, 21 Sep 2025 09:01:07 +0200 Subject: [PATCH] model delete page done --- cookbook/models.py | 7 - cookbook/views/api.py | 39 +-- .../model_editors/AccessTokenEditor.vue | 3 +- .../model_editors/AiProviderEditor.vue | 3 +- .../model_editors/AutomationEditor.vue | 3 +- .../model_editors/ConnectorConfigEditor.vue | 3 +- .../model_editors/CookLogEditor.vue | 3 +- .../model_editors/CustomFilterEditor.vue | 3 +- .../components/model_editors/FoodEditor.vue | 3 +- .../model_editors/InviteLinkEditor.vue | 3 +- .../model_editors/KeywordEditor.vue | 3 +- .../model_editors/MealPlanEditor.vue | 3 +- .../model_editors/MealTypeEditor.vue | 3 +- .../model_editors/ModelEditorBase.vue | 12 +- .../model_editors/PropertyEditor.vue | 3 +- .../model_editors/PropertyTypeEditor.vue | 3 +- .../model_editors/RecipeBookEditor.vue | 3 +- .../components/model_editors/RecipeEditor.vue | 3 +- .../model_editors/ShoppingListEntryEditor.vue | 3 +- .../components/model_editors/SpaceEditor.vue | 3 +- .../model_editors/StorageEditor.vue | 3 +- .../SupermarketCategoryEditor.vue | 3 +- .../model_editors/SupermarketEditor.vue | 3 +- .../components/model_editors/SyncEditor.vue | 3 +- .../model_editors/UnitConversionEditor.vue | 3 +- .../components/model_editors/UnitEditor.vue | 6 +- .../model_editors/UserFileEditor.vue | 3 +- .../model_editors/UserSpaceEditor.vue | 3 +- vue3/src/locales/ar.json | 1 + vue3/src/locales/bg.json | 1 + vue3/src/locales/ca.json | 1 + vue3/src/locales/cs.json | 1 + vue3/src/locales/da.json | 1 + vue3/src/locales/de.json | 1 + vue3/src/locales/el.json | 1 + vue3/src/locales/en.json | 1 + vue3/src/locales/es.json | 1 + vue3/src/locales/fi.json | 1 + vue3/src/locales/fr.json | 1 + vue3/src/locales/he.json | 1 + vue3/src/locales/hr.json | 1 + vue3/src/locales/hu.json | 1 + vue3/src/locales/hy.json | 1 + vue3/src/locales/id.json | 1 + vue3/src/locales/is.json | 1 + vue3/src/locales/it.json | 1 + vue3/src/locales/lt.json | 1 + vue3/src/locales/lv.json | 1 + vue3/src/locales/nb_NO.json | 1 + vue3/src/locales/nl.json | 1 + vue3/src/locales/pl.json | 1 + vue3/src/locales/pt.json | 1 + vue3/src/locales/pt_BR.json | 1 + vue3/src/locales/ro.json | 1 + vue3/src/locales/ru.json | 1 + vue3/src/locales/sl.json | 1 + vue3/src/locales/sv.json | 1 + vue3/src/locales/tr.json | 1 + vue3/src/locales/uk.json | 1 + vue3/src/locales/zh_Hans.json | 1 + vue3/src/locales/zh_Hant.json | 1 + vue3/src/openapi/apis/ApiApi.ts | 240 ++++++++++++++++++ vue3/src/pages/ModelDeletePage.vue | 120 ++++++++- vue3/src/types/Models.ts | 21 +- 64 files changed, 482 insertions(+), 68 deletions(-) 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 @@