home · contact · privacy
Refactor BaseModel.from_table_row in regards to VersionedAttributes.
[plomtask] / plomtask / db.py
index 1cecc16f6985b555f25757ad6e9f65724311a287..3917ce0558e3f7deb1f917a07eb5dd4df7b279e6 100644 (file)
@@ -275,6 +275,8 @@ class BaseModel(Generic[BaseModelId]):
     def as_dict(self) -> dict[str, object]:
         """Return self as (json.dumps-coompatible) dict."""
         d: dict[str, object] = {'id': self.id_}
+        if len(self.to_save_versioned) > 0:
+            d['_versioned'] = {}
         for k in self.to_save:
             attr = getattr(self, k)
             if hasattr(attr, 'as_dict'):
@@ -282,7 +284,8 @@ class BaseModel(Generic[BaseModelId]):
             d[k] = attr
         for k in self.to_save_versioned:
             attr = getattr(self, k)
-            d[k] = attr.as_dict
+            assert isinstance(d['_versioned'], dict)
+            d['_versioned'][k] = attr.history
         for r in self.to_save_relations:
             attr_name = r[2]
             d[attr_name] = [x.as_dict for x in getattr(self, attr_name)]
@@ -366,8 +369,14 @@ class BaseModel(Generic[BaseModelId]):
                        # pylint: disable=unused-argument
                        db_conn: DatabaseConnection,
                        row: Row | list[Any]) -> BaseModelInstance:
-        """Make from DB row, update DB cache with it."""
+        """Make from DB row (sans relations), update DB cache with it."""
         obj = cls(*row)
+        assert obj.id_ is not None
+        for attr_name in cls.to_save_versioned:
+            attr = getattr(obj, attr_name)
+            table_name = attr.table_name
+            for row_ in db_conn.row_where(table_name, 'parent', obj.id_):
+                attr.history_from_row(row_)
         obj._cache()
         return obj