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