From dc3e236d8580bec6f18c242e0082aa590c3ce52e Mon Sep 17 00:00:00 2001
From: Tor-Einar Skog <tor-einar.skog@nibio.no>
Date: Mon, 20 Feb 2023 16:22:48 +0100
Subject: [PATCH] Change Result.all_values type from dict to str

---
 src/vipscore_common/data_utils.py |  2 +-
 src/vipscore_common/entities.py   | 23 +++++++++++++++++++----
 tests/test_entities.py            | 14 +++++++++++---
 3 files changed, 31 insertions(+), 8 deletions(-)

diff --git a/src/vipscore_common/data_utils.py b/src/vipscore_common/data_utils.py
index 0d646a8..e0db4b8 100644
--- a/src/vipscore_common/data_utils.py
+++ b/src/vipscore_common/data_utils.py
@@ -76,7 +76,7 @@ def get_result_list_from_dataframe(df: DataFrame):
             valid_time_start = timestamp,  # valid_time_start
             valid_time_end = None,
             warning_status = values.pop("WARNING_STATUS"),
-            all_values = values
+            all_values = json.dumps(values)
         ))
     return result_list 
     
diff --git a/src/vipscore_common/entities.py b/src/vipscore_common/entities.py
index 767546a..345d5e4 100755
--- a/src/vipscore_common/entities.py
+++ b/src/vipscore_common/entities.py
@@ -24,10 +24,12 @@ along with VIPSCore-Python-Common.  If not, see <http://www.nibio.no/licenses/>.
 
 from datetime import datetime
 from shapely.geometry import Point, Polygon
-from pydantic import BaseModel,  validator, constr, Field
+from pydantic import BaseModel, validator, constr, Field
 from typing import Any, ClassVar, Optional
+import json
 import pytz
 
+
 class Result(BaseModel):
     """
     Represents a set of DSS model result values for a given point in space (Point, Polygon, MultiPolygon) and time (Period or immediate) 
@@ -36,12 +38,12 @@ class Result(BaseModel):
     valid_time_end: Optional[datetime] = Field(alias="validTimeEnd")
     valid_geometry: Optional[Any] = Field(alias="validGeometry")
     warning_status: int = Field(alias="warningStatus")
-    all_values: dict = Field(alias="allValues")
-
+    all_values: str = Field("{}", alias="allValues")
 
     class Config:
         allow_population_by_field_name = True
 
+
     WARNING_STATUS_NO_WARNING:              ClassVar[int] = 0
     WARNING_STATUS_NO_WARNING_MISSING_DATA: ClassVar[int] = 1
     WARNING_STATUS_NO_RISK:                 ClassVar[int] = 2
@@ -50,7 +52,7 @@ class Result(BaseModel):
     
 
     def get_keys(self):
-        return set(self.all_values.keys) if self.all_values is not None else set()
+        return set(json.loads(self.all_values.keys)) if self.all_values is not None else set()
 
     @validator("valid_time_start")
     def ensure_timezone(cls, v):
@@ -70,6 +72,19 @@ class Result(BaseModel):
     def ensure_geometry(cls,v):
         if v is not None and not isinstance(v, Point) and not isinstance(v, Polygon):
             raise ValueError("%s is not a " % v)
+    
+    def set_value(self, key, value):
+        temp_all_values = json.loads(self.all_values)
+        temp_all_values[key] = value
+        self.all_values = json.dumps(temp_all_values)
+    
+    def get_value(self, key):
+        temp_all_values = json.loads(self.all_values)
+        return temp_all_values.get(key)
+    
+    def set_all_values(self, values_dict):
+        self.all_values = json.dumps(values_dict)
+        
 
 class ModelConfiguration(BaseModel):
     """All the input data for the model."""
diff --git a/tests/test_entities.py b/tests/test_entities.py
index 35b47c7..1272768 100644
--- a/tests/test_entities.py
+++ b/tests/test_entities.py
@@ -1,6 +1,6 @@
 import unittest
 import datetime
-
+import json
 
 from src.vipscore_common.entities import *
 
@@ -11,5 +11,13 @@ class TestEntities(unittest.TestCase):
             valid_time_start = datetime.fromisoformat("2015-03-01T00:00:00+01:00"),  # valid_time_start
             valid_time_end = None,
             warning_status = 2,
-            all_values = {"TM":2}
-        )
\ No newline at end of file
+            all_values = json.dumps({"TM":2})
+        )
+
+        r = Result(
+            valid_time_start = datetime.fromisoformat("2015-03-01T00:00:00+01:00"),  # valid_time_start
+            valid_time_end = None,
+            warning_status = 2
+        )
+
+        r.set_value("TM",2)
\ No newline at end of file
-- 
GitLab