From 14c96865f725f61b8aa74ead4bcc1d611f4e0b76 Mon Sep 17 00:00:00 2001
From: Sara <sarasdj@stud.ntnu.no>
Date: Thu, 15 Feb 2024 13:35:48 +0100
Subject: [PATCH] fix: get_weather YR req and JSON conversion

---
 .../__pycache__/get_weather.cpython-311.pyc   | Bin 2597 -> 4154 bytes
 server/APIs/get_weather.py                    |  62 +++++++++++++-----
 2 files changed, 46 insertions(+), 16 deletions(-)

diff --git a/server/APIs/__pycache__/get_weather.cpython-311.pyc b/server/APIs/__pycache__/get_weather.cpython-311.pyc
index 602de861966c2bd3b5af12b5f79d7b3a702e5025..c48ae510b8dcd144dfcf8a877ec949cbd66f1107 100644
GIT binary patch
literal 4154
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
C{m=XW

delta 1361
zcmZWpO>7%Q6duRB_S#<WIv(3eTGw`3J3kFhQUS3W2ss3#L~(-<TmZGH$*dEniMQHa
zD>T|we2l6{q)en*Y7o8<f_kD-4{$)@L@!9TS;^K4M1{oN5+I=pBxW2;QZt%;dh>q1
z_vV|O`8xJlK=|D2bptXye|;}K;qD1V_D4Ga_wU{Pu3r<V<7BKmJ6eUqKlfb3U-tA}
zVvcM8JS5-AFxXXKI1p<%b>?+&y>4(ihrhLj0?5%7=sIysB4?MwjX2%)03es{egHmU
z43E~=K?h*njib)~u)*v6I^QuP_pKhPD><F7FtoKD!>fCdXP^@S5Pzy0f-aEW(uSyu
z$a`wn*?(a!>!ddE31@sF5>HpicgPq%-BI!WSKy4I`;Nw*BgF=6pkUj(syk7qL=SQs
z&b_ZF1pd?!T<E1Gk^j*CJQ+5y_k#{9XAa@Cj^0I_4UkBYqV+)(I3kQZY_mc$+CCp)
zCNAh;y|)8W@#DX3gXdvqt#=(#B|zcuk~2OVT-p}q<boy@v}8sqtZHl9Y*EW4)0SgJ
zmKCIK`xEab6Pw8ddM7bIowzogc>BHl?}P`-zLC{%j=P4x;o^cvlQwTlN>(c>lEvYm
zD>d$2l4B^VWn($HSU{t8%eg73YIc?QNoHOvBFS=X$c5Fmip$QJZ!~Dx^99Xvu1Q%W
zDJtG|#m^B8Ny~3amZPYx6yz<7Q#B<=E%=H%fgiix=o#(BH{3Hj{7O+#$WE5q;ry1A
z)z&0snKog$6iL0kydsmLY<p*lgV3YUf8Vkfl?{ud0dhf=EQTg1^y*kFK~wHnLI+Cz
zU|m|#RLXR$dpyH=&-~6+;^N4s_LEa8fnS6D<-lRMIy7Ytq-w#m8BCX!n!dn+`@Z<G
zSP^Qz3DY-GTKEa}9ZZ+=jmUUCGJd>Oi=@m*ss__0OqViEf291O=^rUA{^0<DunFT0
zI97*aHJCJEvH_>+aH^VGtig;q2Q#Hii$sM;nh%y1i0;480vFh<?L_XfO#yzCznd?!
zH6daOkzIS20k^!D`f4yv>g;k)J<#+-D=*ePLsidE6VD14C*0n1EkMLR+l2k)(7{Y4
zQ-_mPIQcX_+)Ru#hhI3pZVtcFjE^2)HsdejN5aTk5CpEYLcljro~w(|su*pCqx-Hu
zNqgRb1|O~S(c?Ft!0P)qs<CA<Yy3@<zgcZh62rP0OsLL;_V3h~L6aG*GK2WMxIF(G
zVH%7&EH<~1Rc|Tec>_v}iZB)QW-IhSz5vQJ)zd^g<6hmAQE@|hO_?D}`oyV=_!lu1
Oe#ti50{<87)PDe*>t9&_

diff --git a/server/APIs/get_weather.py b/server/APIs/get_weather.py
index 63618e2e..4cd63e4a 100644
--- a/server/APIs/get_weather.py
+++ b/server/APIs/get_weather.py
@@ -7,52 +7,82 @@ import json
 # get_weather retrieves weather data for a list of coordinate pairs
 def get_weather(self):
     # Extract coordinates form json data in POST request
-    content_length = int(self.headers['Content-Length'])
-    post_data = self.rfile.read(content_length)
-    request_data = json.loads(post_data.decode('utf-8'))
-    coordinates = request_data['coords']
+    try:
+        content_length = int(self.headers['Content-Length'])
+        post_data = self.rfile.read(content_length)
+        request_data = json.loads(post_data.decode('utf-8'))
+        coordinates = request_data['coords']
 
+    except KeyError:  # Coords key not found in request
+        self.send_response(400)
+        self.send_header("Content-type", "application/json")
+        self.end_headers()
+        response_message = {"error": "No 'coords' provided in request body"}
+        self.wfile.write(json.dumps(response_message).encode('utf-8'))
+        return
+
+    except Exception as e:
+        self.send_response(500)
+        self.send_header("Content-type", "application/json")
+        self.end_headers()
+        response_message = {"error": "Failed to parse request body"}
+        self.wfile.write(json.dumps(response_message).encode('utf-8'))
+        return
+
+    # Form timestamp string with correct format
     # Form timestamp string with correct format
-    current_time = datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ")
+    current_time = datetime.datetime.utcnow()
+    current_time = current_time.replace(minute=0, second=0)
+    current_time_str = current_time.strftime("%Y-%m-%dT%H:%M:%SZ")
+
+    # Set User-Agent header
+    user_agent = "IceApp sarasdj@stud.ntnu.no"
+    headers = {'User-Agent': user_agent}
 
     # Empty list for weather data
     weather_data = []
-    resp_code = 500
+    status_code = 500
 
     # Request weather data for each coordinate pair
     for coord in coordinates:
-        lat = coord.get('lat')
-        lng = coord.get('lng')
+        lat = round(coord.get('lat'), 4)  # YR API only allows for up to 4 decimal points
+        lng = round(coord.get('lng'), 4)
 
         # Construct request string and execute get request to Yr API
         url = f"https://api.met.no/weatherapi/locationforecast/2.0/compact?lat={lat}&lon={lng}"
-        response = requests.get(url)
+        response = requests.get(url, headers=headers)
 
         if response.status_code == 200:
+            if status_code != 200:
+                status_code = 200
+
             data = response.json()  # Extract data from response
             timeseries = data['properties']['timeseries']
 
             # Get data for current time and append to weather_data
             for entry in timeseries:
-                if entry['time'] == current_time:
+                if entry['time'] == current_time_str:
+                    data = entry['data']['instant']['details']
+                    temperature = data['air_temperature']
+                    humidity = data['relative_humidity']
+
                     weather_object = {
                         'Latitude': lat,
                         'Longitude': lng,
-                        'Temperature': entry['temperature'],
-                        'Humidity': entry['humidity']
+                        'Temperature': temperature,
+                        'Humidity': humidity
                     }
                     # Append weather_object to weather_data list
                     weather_data.append(weather_object)
                     break
 
-            if resp_code == 500:
-                resp_code = 200
 
         else:  # Add error message if no weather data is found or the request fails
-            weather_data.append({'message': 'No data found', 'latitude': lat, 'longitude': lng})
+            print(f"Request to weather API failed with status code {response.status_code}")
+            status_code = response.status_code
 
     # Set headers
-    self.send_response(resp_code)
+    self.send_response(status_code)
     self.send_header("Content-type", "application/json")
     self.end_headers()
 
-- 
GitLab