def latest_obs_and_forecast(site_id): result = memcache.get(site_id, "site_latest") if result: return result site = Site.get_by_key_name(site_id) if site is None: return None obs = ObservationTimestep.find_latest_by_site(site, limit=6) result = None if len(obs) > 0: forecasts = ForecastTimestep.find_by_site_closest_by_date( site, first(obs).observation_datetime, limit=50) closest_forecast = first(forecasts) if closest_forecast: matching_obs = first( filter( lambda o: o.observation_datetime == closest_forecast. forecast_datetime, obs)) matching_forecasts = ifilter( lambda f: f.forecast_datetime == closest_forecast. forecast_datetime, forecasts) if matching_obs: #finally have both... a single obs report and multiple forecasts obs_dict = to_dict_excl_sites(matching_obs) obs_dict['best_forecast'] = map( to_dict_excl_sites, make_five_day_list(matching_forecasts)) result = {'site': site.to_dict(), 'observation': obs_dict} memcache.set(site_id, result, 60 * 60, namespace='site_latest') return result
def latest_obs_and_forecast(site_id): result = memcache.get(site_id, "site_latest") if result: return result site = Site.get_by_key_name(site_id) if site is None: return None obs = ObservationTimestep.find_latest_by_site(site, limit=6) result = None if len(obs) > 0: forecasts = ForecastTimestep.find_by_site_closest_by_date(site, first(obs).observation_datetime, limit=50) closest_forecast = first(forecasts) if closest_forecast: matching_obs = first(filter(lambda o: o.observation_datetime == closest_forecast.forecast_datetime, obs)) matching_forecasts = ifilter(lambda f: f.forecast_datetime == closest_forecast.forecast_datetime, forecasts) if matching_obs: #finally have both... a single obs report and multiple forecasts obs_dict = to_dict_excl_sites(matching_obs) obs_dict['best_forecast'] = map(to_dict_excl_sites, make_five_day_list(matching_forecasts)) result = { 'site': site.to_dict(), 'observation': obs_dict } memcache.set(site_id, result, 60 * 60, namespace='site_latest') return result
def site_detail(site_id): site = Site.get_by_key_name(site_id) if site is None: return Response(status = 404) obs = ObservationTimestep.find_latest_by_site(site = site, limit = 24) forecasts = [] if len(obs) > 0: first_obs = first(obs) last_obs = last(obs) forecasts = ForecastTimestep.find_by_site_between_dates( site = site, from_dt = last_obs.observation_datetime, to_dt = first_obs.observation_datetime) return Response(json.dumps({ 'site': site.to_dict(), 'observations': map(lambda o: o.to_dict(excluding = ['site']), obs), 'forecasts': map(lambda f: f.to_dict(excluding = ['site']), forecasts) }), content_type = "application/json")