Attached a patch for importing processes in a second step after fingerprints 
are imported.
From 3c99d71d91a54efcc229c86db87ac81fc0ccd366 Mon Sep 17 00:00:00 2001
From: Judit Foglszinger <ur...@debian.org>
Date: Thu, 26 Dec 2019 06:20:48 +0600
Subject: [PATCH] Importing processes separately in a second step

When importing processes, access to fingerprints of all persons is needed.
---
 backend/export.py | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/backend/export.py b/backend/export.py
index 49ec8ff..71a07b0 100644
--- a/backend/export.py
+++ b/backend/export.py
@@ -140,6 +140,32 @@ class ImporterV1:
         for lp in legacy_processes:
             person._rels["legacy_processes"].append(self.import_legacy_process(person, lp))
 
+        return person
+
+    def import_person_processes(self, data):
+        s = bserializers.PersonExportSerializer(data=data, context=self.context)
+        if not s.is_valid():
+            raise RuntimeError("Invalid Person record {}: {}".format(data, s.errors))
+
+        am = s.validated_data.pop("am")
+        fprs = s.validated_data.pop("fprs")
+        audit_log = s.validated_data.pop("audit_log")
+        legacy_processes = s.validated_data.pop("legacy_processes")
+        processes = s.validated_data.pop("processes")
+
+        lookup_key = data["lookup_key"]
+        person = self.people.get(lookup_key)
+
+        if person is None:
+            person = bmodels.Person(**s.validated_data)
+            person._rels = {
+                "am": None,
+                "fprs": [],
+                "audit_log": [],
+                "legacy_processes": [],
+                "processes": [],
+            }
+
         for pr in processes:
             person._rels["processes"].append(self.import_process(person, pr))
 
@@ -365,6 +391,10 @@ class ImporterV1:
             self.import_person(person, shallow=True)
         for person in data["people"]:
             self.import_person(person, shallow=False)
+        # Importing processes separately, since this requires fingerprints of
+        # all people to be imported
+        for person in data["people"]:
+            self.import_person_processes(person)
 
         for apikey in data["apikeys"]:
             pass  # TODO
-- 
2.24.0

Attachment: signature.asc
Description: This is a digitally signed message part.

Reply via email to