From c96ce1504391198bf05cbccf0332921af9b28e70 Mon Sep 17 00:00:00 2001
From: Erwan Rouchet <rouchet@teklia.com>
Date: Mon, 10 May 2021 16:34:01 +0200
Subject: [PATCH 1/2] Update the DataImport's element during file imports

---
 arkindex_tasks/import_files/base.py | 19 +++++++++++++++++++
 tests/import_files/test_base.py     | 18 ++++++++++++++----
 2 files changed, 33 insertions(+), 4 deletions(-)

diff --git a/arkindex_tasks/import_files/base.py b/arkindex_tasks/import_files/base.py
index 351d0934..f45a0032 100644
--- a/arkindex_tasks/import_files/base.py
+++ b/arkindex_tasks/import_files/base.py
@@ -247,6 +247,25 @@ class FileImport(DataImportTask):
 
         logger.info(f"Imported {len(elements) - 1} elements")
 
+        # The file import might create any amount of folders, but the first one
+        # is always the topmost one.  We look for it in the elements list then
+        # update the DataImport's element so that the frontend can display
+        # a "View element" button.
+        created_folder = next(
+            (
+                element
+                for element in elements
+                if element["type"] == self.dataimport["folder_type"]
+            ),
+            None,
+        )
+        if created_folder:
+            default_client.request(
+                "PartialUpdateDataImport",
+                id=self.dataimport["id"],
+                body={"element_id": created_folder["id"]},
+            )
+
         logger.info("Deleting files…")
         self.delete_files(successful_datafiles)
 
diff --git a/tests/import_files/test_base.py b/tests/import_files/test_base.py
index 49606603..5dfe6840 100644
--- a/tests/import_files/test_base.py
+++ b/tests/import_files/test_base.py
@@ -374,6 +374,7 @@ class TestFileImport(TestCase):
                 "mode": "images",
                 "element": {"id": "folderid", "name": "Untitled", "type": "potato"},
                 "files": ["file1"],
+                "folder_type": "potato",
                 "element_type": "page",
             },
         )
@@ -403,6 +404,8 @@ class TestFileImport(TestCase):
         mock.post("/api/v1/elements/create/", json={"id": "pageid", "type": "page"})
         # DataFile deletion
         mock.delete("/api/v1/imports/file/file1/", status_code=204)
+        # DataImport update
+        mock.patch("/api/v1/imports/importid/", status_code=200)
 
         fi = FileImport("importid")
         fi.run()
@@ -417,6 +420,7 @@ class TestFileImport(TestCase):
                 ("PUT", "http://s3/put"),
                 ("PATCH", "https://arkindex.teklia.com/api/v1/image/imageid/"),
                 ("POST", "https://arkindex.teklia.com/api/v1/elements/create/"),
+                ("PATCH", "https://arkindex.teklia.com/api/v1/imports/importid/"),
                 ("DELETE", "https://arkindex.teklia.com/api/v1/imports/file/file1/"),
             ],
         )
@@ -437,7 +441,7 @@ class TestFileImport(TestCase):
                 "id": "importid",
                 "corpus": "corpusid",
                 "mode": "pdf",
-                "element": {"id": "folderid", "name": "Untitled", "type": "potato"},
+                "element": {"id": "folderid", "name": "Untitled", "type": "book"},
                 "files": ["file1"],
                 "element_type": "page",
                 "folder_type": "book",
@@ -470,7 +474,7 @@ class TestFileImport(TestCase):
         mock.post(
             "/api/v1/elements/create/",
             [
-                {"json": {"id": "box", "type": "box"}},
+                {"json": {"id": "box", "type": "book"}},
                 {
                     "json": {
                         "id": "page1",
@@ -497,6 +501,8 @@ class TestFileImport(TestCase):
                 },
             ],
         )
+        # DataImport update
+        mock.patch("/api/v1/imports/importid/", status_code=200)
         # DataFile deletion
         mock.delete("/api/v1/imports/file/file1/", status_code=204)
 
@@ -533,6 +539,7 @@ class TestFileImport(TestCase):
                     "POST",
                     "https://arkindex.teklia.com/api/v1/element/page2/transcriptions/bulk/",
                 ),
+                ("PATCH", "https://arkindex.teklia.com/api/v1/imports/importid/"),
                 ("DELETE", "https://arkindex.teklia.com/api/v1/imports/file/file1/"),
             ],
         )
@@ -542,8 +549,8 @@ class TestFileImport(TestCase):
         self.assertListEqual(
             elements,
             [
-                {"id": "folderid", "type": "potato"},
-                {"id": "box", "type": "box"},
+                {"id": "folderid", "type": "book"},
+                {"id": "box", "type": "book"},
                 {
                     "id": "page1",
                     "type": "page",
@@ -611,6 +618,8 @@ class TestFileImport(TestCase):
                 {"json": {"id": "pageid", "type": "page"}},
             ],
         )
+        # DataImport update
+        mock.patch("/api/v1/imports/importid/", status_code=200)
         # DataFile deletion
         mock.delete("/api/v1/imports/file/file1/", status_code=204)
 
@@ -628,6 +637,7 @@ class TestFileImport(TestCase):
                 ("PUT", "http://s3/put"),
                 ("PATCH", "https://arkindex.teklia.com/api/v1/image/imageid/"),
                 ("POST", "https://arkindex.teklia.com/api/v1/elements/create/"),
+                ("PATCH", "https://arkindex.teklia.com/api/v1/imports/importid/"),
                 ("DELETE", "https://arkindex.teklia.com/api/v1/imports/file/file1/"),
             ],
         )
-- 
GitLab


From 7df9609b6d73460e4332a840eefc58f7f613362b Mon Sep 17 00:00:00 2001
From: Erwan Rouchet <rouchet@teklia.com>
Date: Fri, 14 May 2021 09:29:34 +0200
Subject: [PATCH 2/2] Add missing mock

---
 tests/import_files/test_base.py | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/tests/import_files/test_base.py b/tests/import_files/test_base.py
index 5dfe6840..6a4aec6d 100644
--- a/tests/import_files/test_base.py
+++ b/tests/import_files/test_base.py
@@ -700,6 +700,9 @@ class TestFileImport(TestCase):
         # Page creation
         mock.post("/api/v1/elements/create/", json={"id": "pageid", "type": "page"})
 
+        # DataImport element update
+        mock.patch("/api/v1/imports/importid/", status_code=200)
+
         # DataFile deletion
         for i in numbers:
             mock.delete(f"/api/v1/imports/file/{i}/", status_code=204)
@@ -727,6 +730,7 @@ class TestFileImport(TestCase):
             ("POST", "https://arkindex.teklia.com/api/v1/elements/create/"),
         ] * 5
         expected_queries += [
+            ("PATCH", "https://arkindex.teklia.com/api/v1/imports/importid/"),
             ("DELETE", "https://arkindex.teklia.com/api/v1/imports/file/1/"),
             ("DELETE", "https://arkindex.teklia.com/api/v1/imports/file/2/"),
             ("DELETE", "https://arkindex.teklia.com/api/v1/imports/file/10/"),
-- 
GitLab