about summary refs log tree commit diff
diff options
context:
space:
mode:
authorFrederick Muriuki Muriithi2023-10-12 02:24:50 +0300
committerFrederick Muriuki Muriithi2023-10-12 02:24:50 +0300
commit8fd48af74a0ce629d8853a4af30e34aa83c41c63 (patch)
treebacf7005ed14611cd10054d187100544152e2655
parent21b05916c762adaf27422d6a3ee1d6a8560cee2e (diff)
downloadgenenetwork3-8fd48af74a0ce629d8853a4af30e34aa83c41c63.tar.gz
CaseAttribute: Encode/Decode to/from JSON appropriately.
-rw-r--r--gn3/case_attributes.py20
1 files changed, 16 insertions, 4 deletions
diff --git a/gn3/case_attributes.py b/gn3/case_attributes.py
index 8e8ea8a..3e3079b 100644
--- a/gn3/case_attributes.py
+++ b/gn3/case_attributes.py
@@ -44,6 +44,16 @@ class EditStatus(Enum):
         """Print out human-readable form."""
         return self.name
 
+class CAJSONEncoder(json.JSONEncoder):
+    """Encoder for CaseAttribute-specific data"""
+    def default(self, obj):
+        """Default encoder"""
+        if isinstance(obj, datetime):
+            return obj.isoformat()
+        if isinstance(obj, uuid.UUID):
+            return str(obj)
+        return json.JSONEncoder.default(self, obj)
+
 def required_access(inbredset_id: int, access_levels: tuple[str, ...]) -> bool:
     """Check whether the user has the appropriate access"""
     def __species_id__(conn):
@@ -245,9 +255,10 @@ def __queue_diff__(conn: Connection, diff_data, diff_data_dir: Path) -> Path:
             f"{created.isoformat()}.json")
         with open(filepath, "w", encoding="utf8") as diff_file:
             # We want this to fail if the metadata items below are not provided.
-            the_diff = {**diff_data, "created": created.isoformat()}
+            the_diff = {**diff_data, "created": created}
             insert_id = __save_diff__(conn, the_diff, EditStatus.review)
-            diff_file.write(json.dumps({**the_diff, "db_id": insert_id}))
+            diff_file.write(json.dumps({**the_diff, "db_id": insert_id},
+                                       cls=CAJSONEncoder))
         return filepath
     raise NoDiffError
 
@@ -263,7 +274,7 @@ def __save_diff__(conn: Connection, diff_data: dict, status: EditStatus) -> int:
                 "db_id": diff_data.get("db_id"),
                 "status": str(status),
                 "editor": str(diff_data["user_id"]),
-                "diff": json.dumps(diff_data),
+                "diff": json.dumps(diff_data, cls=CAJSONEncoder),
                 "ts": diff_data["created"].isoformat()
             })
         return diff_data.get("db_id") or cursor.lastrowid
@@ -276,7 +287,8 @@ def __load_diff__(diff_filename):
             **the_diff,
             "db_id": int(the_diff["db_id"]),
             "inbredset_id": int(the_diff["inbredset_id"]),
-            "user_id": uuid.UUID(the_diff["user_id"])
+            "user_id": uuid.UUID(the_diff["user_id"]),
+            "created": datetime.fromisoformat(the_diff["created"])
         }
 
 def __apply_diff__(