From 412ff37dc6feac077c71b42c7e36a0056aff224a Mon Sep 17 00:00:00 2001
From: mlbonhomme <bonhomme@teklia.com>
Date: Tue, 23 Apr 2024 17:06:40 +0200
Subject: [PATCH] Set process.element to null on corpus processes before corpus
 deletion

---
 arkindex/documents/tasks.py                              | 4 ++++
 arkindex/sql_validation/corpus_delete.sql                | 5 +++++
 arkindex/sql_validation/corpus_delete_top_level_type.sql | 5 +++++
 3 files changed, 14 insertions(+)

diff --git a/arkindex/documents/tasks.py b/arkindex/documents/tasks.py
index 2dd9855b9b..956f250eab 100644
--- a/arkindex/documents/tasks.py
+++ b/arkindex/documents/tasks.py
@@ -41,6 +41,10 @@ def corpus_delete(corpus_id: str) -> None:
         corpus.top_level_type_id = None
         corpus.save(update_fields=["top_level_type_id"])
 
+    # Set process.element to NULL in all processes, to avoid IntegrityErrors when deleting elements, as
+    # elements are deleted before processes.
+    Process.objects.filter(corpus_id=corpus_id).exclude(element_id=None).update(element_id=None)
+
     # Delete all related objects, bypassing RESTRICTs deletion rules
     # and Django's way of loading everything into memory before deleting.
     querysets = [
diff --git a/arkindex/sql_validation/corpus_delete.sql b/arkindex/sql_validation/corpus_delete.sql
index 2ebb6b6f75..eb41842735 100644
--- a/arkindex/sql_validation/corpus_delete.sql
+++ b/arkindex/sql_validation/corpus_delete.sql
@@ -10,6 +10,11 @@ FROM "documents_corpus"
 WHERE "documents_corpus"."id" = '{corpus_id}'::uuid
 LIMIT 21;
 
+UPDATE "process_process"
+SET "element_id" = NULL
+WHERE ("process_process"."corpus_id" = '{corpus_id}'::uuid
+       AND NOT ("process_process"."element_id" IS NULL));
+
 SELECT "django_content_type"."id",
        "django_content_type"."app_label",
        "django_content_type"."model"
diff --git a/arkindex/sql_validation/corpus_delete_top_level_type.sql b/arkindex/sql_validation/corpus_delete_top_level_type.sql
index 80ae4c77e8..6ee77ab042 100644
--- a/arkindex/sql_validation/corpus_delete_top_level_type.sql
+++ b/arkindex/sql_validation/corpus_delete_top_level_type.sql
@@ -14,6 +14,11 @@ UPDATE "documents_corpus"
 SET "top_level_type_id" = NULL
 WHERE "documents_corpus"."id" = '{corpus_id}'::uuid;
 
+UPDATE "process_process"
+SET "element_id" = NULL
+WHERE ("process_process"."corpus_id" = '{corpus_id}'::uuid
+       AND NOT ("process_process"."element_id" IS NULL));
+
 SELECT "django_content_type"."id",
        "django_content_type"."app_label",
        "django_content_type"."model"
-- 
GitLab