Package: nm.debian.org
Severity: wishlist

While attempting to import nm-mock.json, several exceptions are raised.

1) for legacy processes it's assumed, that "manager" cannot be null,
   but for example emeritus processes have no AM.
   Attached a patch for that.

2) key errors when looking up people with an email address as lookup_key;
   in most cases this affects the house keeping robot closing processes,
   but also also (currently) two people with @users.alioth.debian.org
   as username, who uploaded statements.
---
File "/tmp/nm.debian.org/backend/export.py", line 144, in import_person
  person._rels["processes"].append(self.import_process(person, pr))
File "/tmp/nm.debian.org/backend/export.py", line 231, in import_process
  "closed_by": self.people[closed_by] if closed_by else None,
KeyError: 'nm AT debian.org'
---
As a workaround in the json-file, one can replace the
redacted (@example.org) email field with the value from the lookup_key:

 {
   "username": "__housekeeping__",
   ...
   "lookup_key": "nm AT debian.org",
 - "email": "nm_debian....@example.org",
 + "email": "nm AT debian.org",


3) key errors when looking up fingerprints for statements
   in non legacy processes
----
  File "/tmp/nm.debian.org/backend/export.py", line 263, in import_requirement
    req._rels["statements"].append(self.import_statement(req, stm))
  File "/tmp/nm.debian.org/backend/export.py", line 278, in import_statement
    "fpr": self.fprs[fpr] if fpr else None,
KeyError: '1234567891234567891234567891234567891234'
----
At the time those statements are imported,
only fingerprints, that belong to people earlier in the json-file
are available in the fpr object.
(For example, if I move myself to the top of the file,
fpr only consists of my fingerprint).

Importing all fingerprints already in the first (shallow) run
of import_person() only apparently solves the problem by
having all fingerprints available and being able to import the whole file.
But in the end the attempt fails with
---
File "/tmp/nm.debian.org/backend/export.py", line 418, in save
st.save()
File "/usr/lib/python3/dist-packages/django/db/models/base.py", line 764, in 
save
"unsaved related object '%s'." % field.name
ValueError: save() prohibited to prevent data loss due to unsaved related 
object 'fpr'.
---
As a rather ugly workaround, that leads to wrongly signed statements,
but finally allows importing nm-mock.json,
one can use the first fingerprint from fpr for each statement:

--- a/backend/export.py
+++ b/backend/export.py
@@ -275,7 +275,7 @@ class ImporterV1:
         stm = pmodels.Statement(**s.validated_data)
         stm._rels = {
             "uploaded_by": self.people[uploaded_by] if uploaded_by else None,
 -            "fpr": self.fprs[fpr] if fpr else None,
+            "fpr": self.fprs[list(self.fprs.keys())[0]] if fpr else None,
         }
         return stm
From 5b8695569d691fb3836630a7aeab0b9f19e57b3b Mon Sep 17 00:00:00 2001
From: Judit Foglszinger <ur...@debian.org>
Date: Thu, 12 Dec 2019 08:07:03 +0600
Subject: [PATCH 1/2] manager for legacy processes can be null

this is the case for eg. emeritus processes
---
 backend/export.py      | 2 +-
 backend/serializers.py | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/backend/export.py b/backend/export.py
index 94ffddf..49ec8ff 100644
--- a/backend/export.py
+++ b/backend/export.py
@@ -191,7 +191,7 @@ class ImporterV1:
         p = bmodels.Process(**s.validated_data)
         p._rels = {
             "person": person,
-            "manager": self.ams[manager],
+            "manager": self.ams[manager] if manager else None,
             "advocates": [self.people[x] for x in advocates],
             "log": [self.import_legacy_process_log(p, x) for x in log]
         }
diff --git a/backend/serializers.py b/backend/serializers.py
index 1d0d0ca..4b32dff 100644
--- a/backend/serializers.py
+++ b/backend/serializers.py
@@ -54,7 +54,7 @@ class LogExportSerializer(serializers.ModelSerializer):
 class LegacyProcessExportSerializer(serializers.ModelSerializer):
     log = LogExportSerializer(many=True)
     advocates = PersonKeyField(many=True)
-    manager = AMKeyField()
+    manager = AMKeyField(allow_null=True)
 
     class Meta:
         model = bmodels.Process
-- 
2.24.0

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

Reply via email to