From 13b7b4d7482fffbd8a93b65e490518212e494938 Mon Sep 17 00:00:00 2001 From: Ivan <8611739+IRBorisov@users.noreply.github.com> Date: Fri, 23 Aug 2024 19:09:18 +0300 Subject: [PATCH] F: Improve OSS deletion mechanics --- .../backend/apps/library/views/library.py | 10 +++++-- .../oss/tests/s_propagation/t_attributes.py | 27 ++++++++++++------- .../frontend/src/pages/OssPage/OssTabs.tsx | 2 +- rsconcept/frontend/src/utils/labels.ts | 2 ++ 4 files changed, 28 insertions(+), 13 deletions(-) diff --git a/rsconcept/backend/apps/library/views/library.py b/rsconcept/backend/apps/library/views/library.py index 05706f2e..916c1bc9 100644 --- a/rsconcept/backend/apps/library/views/library.py +++ b/rsconcept/backend/apps/library/views/library.py @@ -66,8 +66,14 @@ class LibraryViewSet(viewsets.ModelViewSet): Operation.objects.bulk_update(update_list, ['alias', 'title', 'comment']) def perform_destroy(self, instance: m.LibraryItem) -> None: - PropagationFacade.before_delete_schema(instance) - return super().perform_destroy(instance) + if instance.item_type == m.LibraryItemType.RSFORM: + PropagationFacade.before_delete_schema(instance) + super().perform_destroy(instance) + if instance.item_type == m.LibraryItemType.OPERATION_SCHEMA: + schemas = list(OperationSchema(instance).owned_schemas()) + super().perform_destroy(instance) + for schema in schemas: + self.perform_destroy(schema) def get_permissions(self): if self.action in ['update', 'partial_update']: diff --git a/rsconcept/backend/apps/oss/tests/s_propagation/t_attributes.py b/rsconcept/backend/apps/oss/tests/s_propagation/t_attributes.py index 6dcdb108..36edb98e 100644 --- a/rsconcept/backend/apps/oss/tests/s_propagation/t_attributes.py +++ b/rsconcept/backend/apps/oss/tests/s_propagation/t_attributes.py @@ -1,5 +1,5 @@ ''' Testing API: Change attributes of OSS and RSForms. ''' -from apps.library.models import AccessPolicy, Editor, LocationHead +from apps.library.models import AccessPolicy, Editor, LibraryItem, LocationHead from apps.oss.models import Operation, OperationSchema, OperationType from apps.rsform.models import RSForm from apps.users.models import User @@ -55,7 +55,7 @@ class TestChangeAttributes(EndpointTester): ) self.owned.execute_operation(self.operation3) self.operation3.refresh_from_db() - self.ks3 = self.operation3.result + self.ks3 = RSForm(self.operation3.result) @decl_endpoint('/api/library/{item}/set-owner', method='patch') @@ -71,7 +71,7 @@ class TestChangeAttributes(EndpointTester): self.assertEqual(self.owned.model.owner, self.user3) self.assertEqual(self.ks1.model.owner, self.user) self.assertEqual(self.ks2.model.owner, self.user2) - self.assertEqual(self.ks3.owner, self.user3) + self.assertEqual(self.ks3.model.owner, self.user3) @decl_endpoint('/api/library/{item}/set-location', method='patch') def test_set_location(self): @@ -86,7 +86,7 @@ class TestChangeAttributes(EndpointTester): self.assertEqual(self.owned.model.location, data['location']) self.assertNotEqual(self.ks1.model.location, data['location']) self.assertNotEqual(self.ks2.model.location, data['location']) - self.assertEqual(self.ks3.location, data['location']) + self.assertEqual(self.ks3.model.location, data['location']) @decl_endpoint('/api/library/{item}/set-access-policy', method='patch') def test_set_access_policy(self): @@ -101,13 +101,13 @@ class TestChangeAttributes(EndpointTester): self.assertEqual(self.owned.model.access_policy, data['access_policy']) self.assertNotEqual(self.ks1.model.access_policy, data['access_policy']) self.assertNotEqual(self.ks2.model.access_policy, data['access_policy']) - self.assertEqual(self.ks3.access_policy, data['access_policy']) + self.assertEqual(self.ks3.model.access_policy, data['access_policy']) @decl_endpoint('/api/library/{item}/set-editors', method='patch') def test_set_editors(self): Editor.set(self.owned.model.pk, [self.user2.pk]) Editor.set(self.ks1.model.pk, [self.user2.pk, self.user.pk]) - Editor.set(self.ks3.pk, [self.user2.pk, self.user.pk]) + Editor.set(self.ks3.model.pk, [self.user2.pk, self.user.pk]) data = {'users': [self.user3.pk]} self.executeOK(data=data, item=self.owned_id) @@ -119,7 +119,7 @@ class TestChangeAttributes(EndpointTester): self.assertEqual(list(self.owned.model.editors()), [self.user3]) self.assertEqual(list(self.ks1.model.editors()), [self.user, self.user2]) self.assertEqual(list(self.ks2.model.editors()), []) - self.assertEqual(set(self.ks3.editors()), set([self.user, self.user3])) + self.assertEqual(set(self.ks3.model.editors()), set([self.user, self.user3])) @decl_endpoint('/api/library/{item}', method='patch') def test_sync_from_result(self): @@ -147,6 +147,13 @@ class TestChangeAttributes(EndpointTester): response = self.executeOK(data=data, item=self.owned_id) self.ks3.refresh_from_db() - self.assertEqual(self.ks3.alias, data['item_data']['alias']) - self.assertEqual(self.ks3.title, data['item_data']['title']) - self.assertEqual(self.ks3.comment, data['item_data']['comment']) + self.assertEqual(self.ks3.model.alias, data['item_data']['alias']) + self.assertEqual(self.ks3.model.title, data['item_data']['title']) + self.assertEqual(self.ks3.model.comment, data['item_data']['comment']) + + @decl_endpoint('/api/library/{item}', method='delete') + def test_destroy_oss_consequence(self): + response = self.executeNoContent(item=self.owned_id) + self.assertFalse(LibraryItem.objects.filter(pk=self.owned_id).exists()) + self.assertFalse(LibraryItem.objects.filter(pk=self.ks3.model.pk).exists()) + self.assertTrue(LibraryItem.objects.filter(pk=self.ks1.model.pk).exists()) diff --git a/rsconcept/frontend/src/pages/OssPage/OssTabs.tsx b/rsconcept/frontend/src/pages/OssPage/OssTabs.tsx index 35e4de12..df1cc808 100644 --- a/rsconcept/frontend/src/pages/OssPage/OssTabs.tsx +++ b/rsconcept/frontend/src/pages/OssPage/OssTabs.tsx @@ -91,7 +91,7 @@ function OssTabs() { } const onDestroySchema = useCallback(() => { - if (!schema || !window.confirm(prompts.deleteLibraryItem)) { + if (!schema || !window.confirm(prompts.deleteOSS)) { return; } destroyItem(schema.id, () => { diff --git a/rsconcept/frontend/src/utils/labels.ts b/rsconcept/frontend/src/utils/labels.ts index 88c8d25c..c342a495 100644 --- a/rsconcept/frontend/src/utils/labels.ts +++ b/rsconcept/frontend/src/utils/labels.ts @@ -977,6 +977,8 @@ export const tooltips = { export const prompts = { promptUnsaved: 'Присутствуют несохраненные изменения. Продолжить без их учета?', deleteLibraryItem: 'Вы уверены, что хотите удалить данную схему?', + deleteOSS: + 'Внимание!!\nУдаление операционной схемы приведет к удалению всех операций и собственных концептуальных схем.\nДанное действие нельзя отменить.\nВы уверены, что хотите удалить данную ОСС?', generateWordforms: 'Данное действие приведет к перезаписи словоформ при совпадении граммем. Продолжить?', restoreArchive: 'При восстановлении архивной версии актуальная схему будет заменена. Продолжить?', ownerChange: