diff --git a/arkindex/documents/tests/test_destroy_elements.py b/arkindex/documents/tests/test_destroy_elements.py index 2dece9f44a25b15baf3db873474ea368f0f578a2..5348e927cd32d8ac00787e15db03ec29ef7c6c10 100644 --- a/arkindex/documents/tests/test_destroy_elements.py +++ b/arkindex/documents/tests/test_destroy_elements.py @@ -467,3 +467,14 @@ class TestDestroyElements(FixtureAPITestCase): 'user_id': self.user.id, 'description': 'Element deletion', }) + + def test_element_dot_delete(self): + """ + test Element.delete method + """ + self.maxDiff = None + self.client.force_login(self.user) + with self.assertExactQueries('element_dot_delete.sql', params={'id': str(self.vol.id)}): + self.vol.delete() + with self.assertRaises(Element.DoesNotExist): + self.vol.refresh_from_db() diff --git a/arkindex/sql_validation/element_dot_delete.sql b/arkindex/sql_validation/element_dot_delete.sql new file mode 100644 index 0000000000000000000000000000000000000000..cb144dc710a40a69adf8a8992304d443d354202a --- /dev/null +++ b/arkindex/sql_validation/element_dot_delete.sql @@ -0,0 +1,61 @@ +DELETE FROM documents_transcriptionentity te WHERE transcription_id IN ( + SELECT t.id FROM documents_transcription t + LEFT JOIN documents_elementpath elementpath USING (element_id) + WHERE t.element_id = '{id}'::uuid OR elementpath.path && ARRAY['{id}'::uuid] +) ; + +DELETE FROM documents_transcription +WHERE element_id = '{id}'::uuid +OR element_id IN ( + SELECT element_id FROM documents_elementpath WHERE path && ARRAY['{id}'::uuid] +) ; + +DELETE FROM documents_classification +WHERE element_id = '{id}'::uuid +OR element_id IN ( + SELECT element_id FROM documents_elementpath WHERE path && ARRAY['{id}'::uuid] +) ; + +DELETE FROM documents_metadata +WHERE element_id = '{id}'::uuid +OR element_id IN ( + SELECT element_id FROM documents_elementpath WHERE path && ARRAY['{id}'::uuid] + ) ; + +DELETE FROM dataimport_dataimportelement +WHERE element_id = '{id}'::uuid +OR element_id IN ( + SELECT element_id FROM documents_elementpath WHERE path && ARRAY['{id}'::uuid] +) ; + +UPDATE dataimport_dataimport +SET element_id = NULL +WHERE element_id = '{id}'::uuid +OR element_id IN ( + SELECT element_id FROM documents_elementpath WHERE path && ARRAY['{id}'::uuid] +) ; + +DELETE FROM documents_selection selection +WHERE element_id = '{id}'::uuid +OR element_id IN ( + SELECT element_id FROM documents_elementpath WHERE path && ARRAY['{id}'::uuid] +) ; + +DELETE FROM dataimport_workeractivity +WHERE element_id = '{id}'::uuid +OR element_id IN ( + SELECT element_id FROM documents_elementpath WHERE path && ARRAY['{id}'::uuid] +) ; + +WITH children_ids (id) AS ( + DELETE FROM documents_elementpath + WHERE element_id = '{id}'::uuid OR path && ARRAY['{id}'::uuid] + RETURNING element_id +) +DELETE FROM documents_element element +USING children_ids +WHERE element.id = children_ids.id ; + +DELETE +FROM "documents_element" +WHERE "documents_element"."id" = '{id}'::uuid \ No newline at end of file