From f268466b9ba387d75d149673bb583392189e776d Mon Sep 17 00:00:00 2001
From: Sara <sarasdj@stud.ntnu.no>
Date: Fri, 9 Feb 2024 13:18:57 +0100
Subject: [PATCH] fix: update_map endpoint, now working

---
 .../__pycache__/data_structs.cpython-311.pyc  | Bin 2445 -> 3945 bytes
 server/data_structs.py                        |  53 +++++++++++++++---
 server/main.py                                |   7 ++-
 .../__pycache__/get_markers.cpython-311.pyc   | Bin 2652 -> 2626 bytes
 server/map/get_markers.py                     |  19 ++++---
 5 files changed, 61 insertions(+), 18 deletions(-)

diff --git a/server/__pycache__/data_structs.cpython-311.pyc b/server/__pycache__/data_structs.cpython-311.pyc
index 133d8fe1d896175c75442992de70415e7e6bd522..4163607b4b1b56fb78c7310f4a0863892bb42ce3 100644
GIT binary patch
literal 3945
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

literal 2445
zcmb7FJ!~UI6rT0|+Kw*<^5+nTT<#9B2RcQZ4gms$L?lRYX%Y%7qh)V*oZDpWH8bl#
zA{QyHNI@AXAf>np6wy#pUPYZE#cC_0tLPj#)m8W2tiAp_BzVbwZ{EDon|U+ed;YCZ
z$PtjL{uh0&67n34z9_vx_d6Jz5|_A=PwJ#XB$6Rt5;yaNxbm+VLVkxYk%}Zd3V75p
zPeyn&@aSV6*)_I^nf(Vtm{M%Gc1T07PMuy*p|qaSU4_9Zp`;?Yq>^zZD!Un~xH461
znyWlfDw?Z8I4#z;XoCkV&TOp5N_fzuv1U7=w@;mZVi*#SF2mPd12`pZsZA^xCDP7-
zC8d@OR+_3yw#d1(Y03<b#&iS&z*J&|Q@=Jg&2iHekQWcW__+Etr;Jw{VWU-Dr+hCA
zn$;!?cHaMJZLJEfeafnE3%12W)^b9AuXzv~mgP0P(6SDvlf>@zC*a)(e-q${M6b^r
zD?jPc%mS!vG`9pQe+++JaFb0_$1n}MPAx0WSynx8TRx7bEbIH0?e{#g*9hY*ZM5o?
z!CS=2qag5E0V13eb^{cfLco0mU~2qRfTQ%UlabZ(&-Xh7)KgEWKWBvcS4bjb(2<8P
z!URh91AvK#m*L?RR{;{J@M-Yr@EKID72Pb5L3MLLhJ2iVNNwI?v`#TKKWOZDVauhl
z;oG4YF(g4;Xfo<}O)rGmpb=-o$DXs-pq$6Ky8WZ|1NC+uhw&7*YcxEte7aBl*svX^
z#cb!m$>KSClJaUFCjJkv+6u4?4<n?lf`#{+SQ=P(Ly4t>)vpWEHo!s_3PE-<EN#<Z
z3!qpD0mHII1f&aFLMS6F1DIKs$MJt$&M{jgw2*`mNRh*tp{q_giXQ$sz!CYov<j@e
z5iP8MD)d$P?y+)dEJi)&;%#tFM@#SEY^k^CxNuw$EZH<QHVwfTl7qbl5UVvmu)`!n
z+>Fg449Gf<CIV8IQ-EQzX4RWd?{o;LKOPA6>?@%zzI~MFAQU=UzSWUoRdoNuM6YiM
zEu61{<OI0y2&u7Apmg5@m>{+2W<YACX1J>8XwWt*x~l_~jrhhxo9$7yP3uh{FOBsb
z8mvRJfVSfu(pYr@AG)5#Y}adXCuIw4lyb5mb{*?=((a(s4R<|hH|=@Au)!F6<AA5w
z8wWf^4yQX0xTvvPu=5bZZliez;cWm@O&BN^jk-8S8)w@5=uM<#LvnL$7tj#rmw`xA
zQEBC}1Pnvky>+<&tODlsn&j*vSh=BIDc;OUF9YIWkzuOcbpR-4vI{y97^f>?Jh&dR
zJGdOOtMu2q(i#3dWj4>%q$WkVjV8-XSZzw;GB`$G5#<%@VPLtQ6CTcuCElCId*gQj
zpvV@M&I(bfe6|c}o@_+3rISiDw|KJG$!o=2ha`~A^~%W@D<@GYYz0EGHxNWcVdU|$
zTE#g8>?(X4V7RO_X#RQFOf6$sfqGUF>SFsFp~s=9t8lhSNU8|8*))};#*q)nDa8>+
ztNn%XN%GV78G9Gj;T7^<06MZHNf9YujQ)2tMJjj5BwXR#^}tcgNjE!W60UIWdf-?p
QN|47ST;bgHD;y%hmw0OEga7~l

diff --git a/server/data_structs.py b/server/data_structs.py
index c7f4c05f..26428d4f 100644
--- a/server/data_structs.py
+++ b/server/data_structs.py
@@ -1,42 +1,79 @@
-from datetime import datetime
 
 # Sensor contains data related to a single sensor
 class Sensor:
-    def __init__(self, ID: int, type: enumerate, active: bool):
+    def __init__(self, ID: int, type: str, active: bool):
         self.ID = ID
         self.type = type
         self.active = active
 
+    def to_dict(self):
+        return {
+            'ID': self.ID,
+            'type': self.type,
+            'active': self.active
+        }
+    
+# DateTime contains the date and time for a measurement
+class DateAndTime:
+    def __init__(self, year: int, month: int, day: int, hour: int, minute: int):
+        self.year = year
+        self.month = month
+        self.day = day
+        self.hour = hour
+        self.minute = minute
+
+    def to_dict(self):
+        return {
+            'year': self.year,
+            'month': self.month,
+            'day': self.day,
+            'hour': self.hour,
+            'minute': self.minute
+        }
 
-# Measurement contains geo-data related to a single measurement point at a given time
+# Measurement contains geo-data related to a single measurement point at a given time. It includes an instance
+# of the class Sensor. 
 class Measurement:
-    def __init__(self, longitude: float, latitude: float, datetime: datetime, precipitation: float, thickness: float,
+    def __init__(self, longitude: float, latitude: float, datetime: DateAndTime, sensor: Sensor, precipitation: float, thickness: float,
                   max_weight: float, safety_level: float, accuracy: float):
         self.longitude = longitude
         self.latitude = latitude
         self.datetime = datetime
+        self.sensor = sensor
         self.precipitation = precipitation
         self.thickness = thickness
         self.max_weight = max_weight
         self.safety_level = safety_level
         self.accuracy = accuracy
-
+    
+    def to_dict(self):
+        return {
+            'longitude': self.longitude,
+            'latitude': self.latitude,
+            'datetime': self.datetime.to_dict(),
+            'sensor': self.sensor.to_dict(),
+            'precipitation': self.precipitation,
+            'thickness': self.thickness,
+            'max_weight': self.max_weight,
+            'safety_level': self.safety_level,
+            'accuracy': self.accuracy
+        }
+    
 # MarkerTemplate is a template for map marker data. It includes an instance of the
 # DataPoint type.
 class MarkerTemplate:
-    def __init__(self, geoData: Measurement, size: float, color: enumerate, radius: float):
+    def __init__(self, geoData: Measurement, size: float, color: str):
         self.geoData = geoData 
         self.longitude = geoData.longitude
         self.latitude = geoData.latitude
         self.size = size
         self.color = color
-        self.radius = radius
 
     def to_dict(self):
         return {
+            'geo_data': self.geoData.to_dict(), 
             'latitude': self.latitude,
             'longitude': self.longitude,
             'size': self.size,
             'color': self.color,
-            'radius': self.radius
         }
\ No newline at end of file
diff --git a/server/main.py b/server/main.py
index 1fc670f9..ace59dd7 100644
--- a/server/main.py
+++ b/server/main.py
@@ -35,7 +35,9 @@ class IceHTTP(BaseHTTPRequestHandler):
             self.end_headers()
 
             self.wfile.write(b"Root path hit!")
-        elif self.path == '/update_map':
+
+        # Update_map endpoint
+        elif self.path == '/update_map': # NB: should be POST?
             # Fetch marker data
             markers_data, resp_code = get_markers()
 
@@ -45,7 +47,7 @@ class IceHTTP(BaseHTTPRequestHandler):
             self.end_headers()
 
             # Write the JSON data to response object
-            self.wfile.write(markers_data)
+            self.wfile.write(str(markers_data).encode('utf-8'))
 
 # Listen for pressing of q key to terminate server
 def on_key_press(server, event):
@@ -73,6 +75,7 @@ if __name__ == "__main__":
         # Register key press event handler
         keyboard.on_press(lambda event: on_key_press(server, event))
 
+        # Run server indefinitely
         server.serve_forever()
 
     except Exception as e:
diff --git a/server/map/__pycache__/get_markers.cpython-311.pyc b/server/map/__pycache__/get_markers.cpython-311.pyc
index 43698edae3b8e474e9db41d43ba5065054d66146..fe067d8d451136985eb529449e19ff358e97b22b 100644
GIT binary patch
delta 1277
zcmb7EO-vI(6rSn+bhkf1%hFP+6bi&NBoJ(g9*Dt6Of&`+G{Rm?%Ph5}3%V_-Aq&*V
zfrA$^F&@QBZA23iFWxl9crFRira^Bea<U|xG#Y0XT4|eTd^7Xr&71H2%$wQWk={!7
zr*^vq5c=hQuRK_@d%7DS0FM9y2qu7hFhdzCAa0^CO6$zpUUMf<*ero=ka0jVR|Vn;
zhyzr$mhts-$dn}xHY!ePYy|}#2_O>N%RmvTL6By{BrK{`wyHMSrrKq@+8~pJiJna~
zs!ehek+~HhI}jWP0e+WeHo9Qy>kF`0hCQ~TbtIfp&d#E1F%>UC7qsGs@YXW2AS<$E
zIg%h52efEPF=ZJ5WJi!-M8wsgm^zdNHK4{C6q~B}CBB-FLpSLFIS<=%^K&UHlHg<<
z2Ir~_T98X;bXYNP*Wvjpd@J(k?2!O%b$D~iT#f~ROXrYR=i+QxwLqQ(I))vLw}nT?
zb-re&o$hdE<kQU<GVL8vW>H94%f<l2`Lc{USAZ_y$BYm9@oUE2BkCgRnl??DCds8O
zic8}7;hctPaF>|`X&C6nKbU?z#CkeoUrCm`PU3BsKGNvU$9u{1`#r<ab1!0_@5rOW
z_&OV~6a_>sH5F48e4m}b-&pTU59ffe3-|IvE%Z<tO-Q5HsnL7T+Of`iLzbdBsmvzl
zw1Kj4vM82a4g3+0XoL6}e>zBW>8Ox)f-H;HsFJ#=hP4?*OKPWxhSnqbgnS(tP%^b)
zr@41o@~yM$k(@sl+4OHogWJ;Js`$xJhI7u`*rsDk3T{imYNc~a3T;cFRq>14pS$rY
zoxdvQr{aZy&>JRyWjr5I^0$*E2DZ+_JwW-s!B=hd@QeS6{|g-Zg%9|rFcC3oYLwV0
zEUj~qn@)t2Ga7whMkTZ^Dg`K`rTQ)msdH#Pp`6i1$ddj)lADB)LqJ#nV#a6%V96K_
bzY{NwUC4uf^a60@t9wcCLRSgYGb5GXr0pr4

delta 1417
zcmbtUO>7fK6n-=NV>|XbNt4(KZb%@c;6@EU2ZThRX)I6=X(TI$B&$LRp0#6V*G^^^
z1&|Yi!~ykC744xMsf0`<+5<vWb0|{PL&b3-r7E&e50xr#Pp*_oh!ZpGIKcr<JkNZy
ze*501@4YwnZ=Fv&wR@V@0^EAF-;JZUw4Ngo1n?aYAjky0ej*+5@7Tl^)-eJDa*{|9
zc1OPTeaAj9lrm4d&v)H)wJFHQgIb&O{M;1;LnTrf^GxjCks@t+z(B8YxA2%LFapio
zNQjcnpcT?XmZob~SPy$X#cZ|O^fvyi-T=Lwph<}PszT62998^e)-jx{Wn9I>!*R(y
ziv}ayE$8e)KD8y=J3{U^Xs+ZaJ3i7vf+R#V5++Jn<!bq^TM<a>)~D@<_Hux~<GXHY
zw2YnYMgfoyNJkTECqbl(L`alGcd;T;YS4DSg;r{!?IC-1(JCay1%F6-chT;M-TM|+
z+3_``1E@tz`ij`qrM+&qq;*MTUs1}*jex8C&XE0Xixf-9WS}VTdUK%6>%PBTdq!GT
zoM0mtAh+E=GI#@uihEn?JM~c-Pr?8=;hnexK*P&wQ6&e{IE82U+?UlAb#m)mLQ8O2
znt>%0Kjdyohlesx|GaLW-5eavB!0~PwWv>wW}oqrsv*u;?Gw-{V2FczPL3;72z0-d
zr%z{}i#Sn!H7ejFhYa7`UVNJA`FlG0^8-%%toPpY&(BYcRz)J^*A}WB93DzaJ3{?#
zmpYOVw}y%~dE`_SN@D^9c|{?YtOdIgICD8=EI8RhKJKgdY$I<M=+VZ*G506+#1RqR
zUpE>Tslklld}Ynjd4t;YIQNLE>__|;cMWPd;`aN7O40qRQ)^3qBxjg@o?W=eNSe*%
zn3-n_i|a|ck)%%sK3*Gm+`(qPWb=7;rC5_t_X_$C1a5j*<5)sBL;o~$&9W3>={c4&
zS$<(Xxww&Be3Ps69%KiH*HVus*|`g>Kx+Ui=rb(DjbR~f3=45%ScpsDo1y>xpv7*F
ztah%N8^ek9c;eTo_0Sg^?kE07TSNWVKb`QV;LSr!p`xVCS$p1_gV#Sg$h}lt2Cu;{
z{UcU^Tr!Q*G{Jr1pUnQn{W=h9hhEma+`EDC@eu~^Tu&gvnpe#qMUfi337&vgxnWFE

diff --git a/server/map/get_markers.py b/server/map/get_markers.py
index fa7524e3..fe91e6ce 100644
--- a/server/map/get_markers.py
+++ b/server/map/get_markers.py
@@ -1,10 +1,9 @@
 import os
 import sys
-from datetime import datetime
 current_dir = os.path.dirname(__file__)
 parent_dir = os.path.abspath(os.path.join(current_dir, '..'))
 sys.path.append(parent_dir)
-from data_structs import Measurement, Sensor, MarkerTemplate
+from data_structs import Measurement, Sensor, MarkerTemplate, DateAndTime
 from flask import json
 
 # get_markers parses a list of MarkerTemplate objects to json, and returns either a successfully
@@ -15,12 +14,16 @@ def get_markers():
         sensor1 = Sensor(ID=1, type="Type1", active=True)
         sensor2 = Sensor(ID=2, type="Type2", active=False)
 
-        measurement1 = Measurement(longitude=10.9771, latitude=60.7066, datetime=datetime(2023, 12, 31, 15, 43, 2),
-                            sensor=sensor1, precipitation=0.0, thickness=0.0, max_weight=0.0, safety_level=0.0, accuracy=2.5),
-        measurement2 = Measurement(longitude=10.8171, latitude=60.6366, datetime=datetime(2024, 1, 7, 23, 59, 59), 
-                            sensor=sensor2, precipitation=0.0, thickness=0.0, max_weight=0.0, safety_level=0.0, accuracy=1.5),
-        measurement3 = Measurement(longitude=10.8471, latitude=60.7366, datetime=datetime(2024, 2, 3, 12, 00, 19), 
-                                sensor=sensor1, precipitation=0.0, thickness=0.0, max_weight=0.0, safety_level=0.0, accuracy=4.0),
+        datetime1 = DateAndTime(2023, 12, 31, 15, 43)
+        datetime2 = DateAndTime(2024, 1, 15, 12, 2)
+        datetime3 = DateAndTime(2024, 1, 31, 18, 10)
+
+        measurement1 = Measurement(longitude=10.9771, latitude=60.7066, datetime=datetime1, sensor=sensor1, 
+                                   precipitation=0.0, thickness=0.0, max_weight=0.0, safety_level=0.0, accuracy=2.5)
+        measurement2 = Measurement(longitude=10.8171, latitude=60.6366, datetime=datetime2, sensor=sensor2, 
+                                   precipitation=0.0, thickness=0.0, max_weight=0.0, safety_level=0.0, accuracy=1.5)
+        measurement3 = Measurement(longitude=10.8471, latitude=60.7366, datetime=datetime3, sensor=sensor1, 
+                                   precipitation=0.0, thickness=0.0, max_weight=0.0, safety_level=0.0, accuracy=4.0)
     
         testData = [
             MarkerTemplate(measurement1, 30.0-measurement1.accuracy, "Green"),
-- 
GitLab