from flask import Flask, render_template, request
|
|
from HandleWeatherFile import HandleWeatherFile
|
|
from datetime import datetime
|
|
|
|
app=Flask(__name__)
|
|
|
|
def getUniqueDate(dateArray):
|
|
date=[]
|
|
for i in dateArray:
|
|
iDate=i.split(" ")[0]
|
|
if iDate not in date:
|
|
date.append(iDate)
|
|
return date
|
|
|
|
def getHumanReadableFetchTime(fetchTime):
|
|
"""
|
|
Compare fetchTime with current date and time value.
|
|
Return the result as "X days Y minutes Z seconds" where days and minutes will only be displayed if relevant.
|
|
@param fetchTime datetime.datetime object representing a past point in time
|
|
"""
|
|
fetchTime=datetime.fromtimestamp(fetchTime)
|
|
tDelta=datetime.now()-fetchTime
|
|
|
|
returnValue=""
|
|
rest=tDelta.seconds
|
|
if(tDelta.days>0):
|
|
returnValue+=str(int(tDelta.days))+" days "
|
|
if(rest>3599):
|
|
returnValue+=str(int(rest/3600))+" hours "
|
|
rest=rest%3600
|
|
if(rest>59):
|
|
returnValue+=str(int(rest/60))+" minutes "
|
|
rest=rest%60
|
|
returnValue+=str((rest))+" seconds"
|
|
return returnValue
|
|
|
|
def getUserArgumentHour(requestHour):
|
|
"""
|
|
Return a sanitized array from the measurement hour(s) requested by the user.
|
|
Return empty array if no valid values.
|
|
Removes duplicates, unsure that the values are number and sort the results.
|
|
@param requestHour URL parameter relative to the hour in string format, value separated by comma.
|
|
"""
|
|
hour=[]
|
|
requestedHour=requestHour
|
|
if requestedHour is None:
|
|
return hour
|
|
|
|
requestedHour=requestedHour.split(",")
|
|
requestedHour=list(dict.fromkeys(requestedHour)) #removes duplicates
|
|
|
|
for h in requestedHour:
|
|
try:
|
|
hi=int(h)
|
|
hour.append(hi)
|
|
except Exception:
|
|
pass
|
|
|
|
hour.sort()
|
|
return hour
|
|
|
|
@app.route("/")
|
|
def indexRoute():
|
|
return renderWeatherTemplate(request.args)
|
|
|
|
@app.route("/<latitude>;<longitude>")
|
|
def specifiedCoordinateRoute(latitude,longitude):
|
|
try:
|
|
flatitude=float(latitude)
|
|
except Exception:
|
|
return "Error, verify the provided latitude. ("+str(latitude)+")"
|
|
|
|
try:
|
|
flongitude=float(longitude)
|
|
except Exception:
|
|
return "Error, verify the provided longitude. ("+str(longitude)+")"
|
|
|
|
return renderWeatherTemplate(request.args,latitude,longitude)
|
|
|
|
def renderWeatherTemplate(requestArgs,latitude=None,longitude=None):
|
|
"""
|
|
Render the weather template based on the specified paramaters.
|
|
@param request.args Parsed URL parameters.
|
|
@param latitude Optional geographic coordinate that specifies the north–south position.
|
|
@param longitude Optional geographic coordinate that specifies the east-west position.
|
|
"""
|
|
title="Weather "
|
|
handleWeatherFile=None
|
|
|
|
if latitude is not None and longitude is not None:
|
|
title+=latitude+"/"+longitude
|
|
handleWeatherFile=HandleWeatherFile(latitude=latitude,longitude=longitude,filename="WeatherReport"+latitude+"_"+longitude+".json")
|
|
else:
|
|
handleWeatherFile=HandleWeatherFile()
|
|
title+=" Paris"
|
|
|
|
weatherFile=handleWeatherFile.fetchWeatherFile()
|
|
|
|
measureHour=getUserArgumentHour(requestArgs.get("hour",type=str))
|
|
validHours=None
|
|
if(len(measureHour)==0):
|
|
measureHour=handleWeatherFile.getWeatherFileMeasureHours(True)
|
|
validHours=measureHour
|
|
|
|
includeToday=True
|
|
if requestArgs.get("today",type=int) is not None:
|
|
if(requestArgs.get("today",type=int)==0):
|
|
includeToday=False
|
|
|
|
night=False
|
|
if requestArgs.get("night",type=int) is not None:
|
|
if(requestArgs.get("night",type=int)==1):
|
|
night=True
|
|
|
|
ui=True
|
|
if requestArgs.get("ui",type=int) is not None:
|
|
if(requestArgs.get("ui",type=int)==0):
|
|
ui=False
|
|
if ui and validHours is None:
|
|
validHours=handleWeatherFile.getWeatherFileMeasureHours(True)
|
|
|
|
dayCount=7
|
|
if requestArgs.get("day",type=int) is not None:
|
|
dayCount=requestArgs.get("day",type=int)
|
|
|
|
if requestArgs.get("title",type=str) is not None:
|
|
title=requestArgs.get("title",type=str)
|
|
|
|
dt=handleWeatherFile.getFormattedDateTimeArray(dayCount,includeToday,measureHour)
|
|
|
|
return render_template(
|
|
"index.html",
|
|
date=getUniqueDate(dt),
|
|
hour=measureHour,
|
|
datetime=dt,
|
|
weatherData=weatherFile,
|
|
fetchTime=getHumanReadableFetchTime(weatherFile["fetchTime"]),
|
|
title=title,
|
|
ui=ui,
|
|
validHours=str(validHours)[1:-1],
|
|
night=night
|
|
)
|
|
|
|
#if __name__ == '__main__':
|
|
# app.run(host='0.0.0.0',debug=True)
|