Exemplo n.º 1
0
def forecast_update(site_key):
    site = Site.get_by_key_name(site_key)
    if site is None:
        return Response(status=404)

    forecast_url = "http://www.metoffice.gov.uk/public/data/PWSCache/BestForecast/Forecast/%s?format=application/json" % site_key

    result = urlfetch.fetch(forecast_url)
    if result.status_code == 200:
        forecast = parse_forecast(result.content)
        issued_date = parse_date(forecast["@dataDate"])
        for date, day in days(forecast):
            forecast_day = ForecastDay.get_by_key_name(
                make_key_name(site, date))
            if forecast_day is None:
                forecast_day = ForecastDay(key_name=make_key_name(site, date),
                                           forecast_date=date,
                                           site=site)
            forecast_day.site = site
            for timestep, data in day_timesteps(day):
                w = Forecast()
                w.issued = issued_date
                for k, v in data.items():
                    prop_name = snake_case(k)
                    if hasattr(w, prop_name):
                        if v == "missing":
                            v = None
                        setattr(w, prop_name, v)

                forecast_day.forecasts.add(timestep, w)

            forecast_day.save()
        site.save()
    return Response(status=204)
Exemplo n.º 2
0
def raw_forecast_to_domain_forecast(raw_forecast) -> Forecast:
    TIME_CURRENT = 'currently'

    raw_weather = raw_forecast[TIME_CURRENT]['icon']
    weather = Weather.from_value(raw_weather)

    return Forecast(weather)
Exemplo n.º 3
0
    def get_forecast(self, data, date_from, date_to):
        forecasts = []
        for data_forecast in data['data']:  
            forecast = Forecast(data_forecast['date'], data_forecast['temperature']['max'], data_forecast['temperature']['min'], data_forecast['rain']['probability'], data_forecast['rain']['precipitation'], data['id'])
            forecasts.append(forecast)

        return forecasts
Exemplo n.º 4
0
    def _parse_forecast(self, request_url):
        weatherbitio_reponse = requests.get(request_url)
        weatherbitio_reponse.raise_for_status()
        json = weatherbitio_reponse.json()
        headers = weatherbitio_reponse.headers

        return Forecast(json, weatherbitio_reponse, headers)
Exemplo n.º 5
0
def add_forecasts():
    # 5-day 3-h forecast (free)
    url = 'http://api.openweathermap.org/data/2.5/forecast?id=6167865&APPID=631d59f50ab1841ba7af0f0f706e1505'
    response = requests.get(url, verify=True)

    if response:
        r = response.json()
        session = db.session  # creates a SQLAlchemy Session
        this_hour = datetime.datetime.now().replace(microsecond=0,
                                                    second=0,
                                                    minute=0)

        Forecast.query.filter(
            Forecast.id < this_hour -
            datetime.timedelta(hours=150)).delete()  # deletes old forecasts

        for dt in r['list']:
            data = Forecast(
                id=dt['dt_txt'],
                retrieval_time=datetime.datetime.now().replace(microsecond=0,
                                                               second=0,
                                                               minute=0),
                drybulb=dt['main']['temp'] - 273.15,  # Kelvin to Celcius
                relative_humidity=dt['main']['humidity'])
            session.merge(data)  # adds new forecasts

        session.commit()

    else:
        print('Unable to add forecasts!')
Exemplo n.º 6
0
def get_forecast_in_location(lat, lon, days=3):
    """Generic method to get the forecast in a specified location for a variable number of days

    The weather is returned in JSON format. More info about the responses can be found in the official API documentation
    site (http://openweathermap.org/current)"""

    # Checking that the message contains actually a location
    if (lon, lat) == (-1, -1):
        raise AttributeError  # Use a custom exception in the future

    TOKEN = get_OpenWeatherAPI_token()

    # Asking for the weather
    current_weather_url = "http://api.openweathermap.org/data/2.5/forecast"
    params = {'appid': TOKEN, 'lon': lon, 'lat': lat}
    rq = requests.get(current_weather_url, params=params)

    return Forecast(api_response=rq.text, days=days)
Exemplo n.º 7
0
    def get(self):
        args = self.parser.parse_args()

        username = _request_ctx_stack.top.current_user['sub']
        if len(args['group']) > 0:
            username = '******'.format(
                username)

        to_coord = _split_coordinates('to', args['to'])
        from_coord = _split_coordinates('from', args['from'])
        group_users = username.split(',')

        gm_routes = get_all_routes(from_coord, to_coord, limit=8)
        ds_forecasts = get_forecast(from_coord, to_coord)

        gm_routes = _prioritize(gm_routes, ds_forecasts, group_users)

        directions = map(
            lambda x: Directions(
                mode=x['_mode'], data=x, priority=x['_priority']), gm_routes)
        directions = Directions.objects.bulk_create(list(directions))

        for idx in range(len(gm_routes)):
            gm_routes[idx]['_id'] = str(directions[idx])

        forecasts = map(
            lambda f: Forecast(lat=f['latitude'], lng=f['longitude'], data=f),
            ds_forecasts)
        forecasts = Forecast.objects.bulk_create(list(forecasts))

        recommendations = Recommendations(available=directions,
                                          forecast=forecasts,
                                          user=username,
                                          created_on=datetime.utcnow())
        recommendations_id = recommendations.save()

        return {
            'to': to_coord,
            'from': from_coord,
            'directions': gm_routes,
            'forecast': ds_forecasts,
            'recommendation_id': str(recommendations_id.pk)
        }
Exemplo n.º 8
0
 def get_forecasts_for_city(city_id):
     url = "http://apiadvisor.climatempo.com.br/api/v1/forecast/locale/%s/days/15?token=%s" % (
         city_id, WeatherService._api_user_token)
     response = requests.get(url)
     if response.status_code != 200:
         return None
     else:
         response_data = response.json()
         city = CityRepository.save_city(
             City(city_id, response_data["name"], response_data["state"],
                  response_data["country"]))
         return [
             ForecastRepository.save_forecast(
                 Forecast(city, data["date"], data["rain"]["probability"],
                          data["rain"]["precipitation"],
                          data["temperature"]["min"],
                          data["temperature"]["max"]))
             for data in response_data["data"]
         ]
Exemplo n.º 9
0
def make_forecast(response):
    return Forecast(response.json(), response, response.headers)