def demand_table(self): table = EvaporationTable(self.basin, None) return table.demands_for_gui()
def get(self, request, random_url_slug, *args, **kwargs): try: self.basin = Basin.objects.filter( random_url_slug=random_url_slug)[0] except IndexError: raise Http404 self.constants = Constants(self.basin) graph_type = request.GET.get('graph_type', None) hours_diff = request.GET.get('hours_diff', None) # debug param # overridable variables for demo purposes rain_flood_surface = request.GET.get('rain_flood_surface', None) # debug params if not rain_flood_surface: rain_flood_surface = request.GET.get('basin_surface', None) basin_storage = request.GET.get('basin_storage', None) reverse_osmosis = request.GET.get('reverse_osmosis', None) if rain_flood_surface: try: # basic validation, if not integer, default value is used # other validations can be put here, like upper bounds self.constants.rain_flood_surface = int(rain_flood_surface) except ValueError: logger.error("invalid value for rain_flood_surface: %s" % rain_flood_surface) if basin_storage: try: # basic validation, if not integer, default value is used # other validations can be put here, like upper bounds self.constants.max_storage = int(basin_storage) except ValueError: logger.error("invalid value for basin_storage: %s" % basin_storage) if reverse_osmosis: try: # basic validation, if not integer, default value is used # other validations can be put here, like upper bounds self.constants.reverse_osmosis = float(reverse_osmosis) except ValueError: logger.error("invalid value for reverse_osmosis: %s" % reverse_osmosis) osmose_till_date = request.GET.get('osmose_date_till', None) if osmose_till_date is not None: date_format = "%d-%m-%Y" self.constants.osmose_till_date = datetime.datetime.strptime( osmose_till_date, date_format).date() # note: t0 is Math.floor() 'ed to a full quarter t0 = round_date(datetime.datetime.now(pytz.utc)) if hours_diff: t0 += datetime.timedelta(hours=int(hours_diff)) if graph_type == 'rain': response_dict = self.rain(t0) elif graph_type == 'prediction' or graph_type == 'meter_comparison': outflow_open = request.GET.get('outflowOpen', None) outflow_closed = request.GET.get('outflowClosed', None) outflow_capacity = request.GET.get('outflowCapacity', 0) if outflow_open is not None: outflow_open = datetime.datetime.fromtimestamp( int(outflow_open) / 1000, pytz.utc) if outflow_closed is not None: outflow_closed = datetime.datetime.fromtimestamp( int(outflow_closed) / 1000, pytz.utc) response_dict = self.prediction( t0, outflow_open, outflow_closed, outflow_capacity) else: table = EvaporationTable(self.basin, self.constants.rain_flood_surface) future = t0 + settings.CONTROLNEXT_FILL_PREDICT_FUTURE history = t0 - settings.CONTROLNEXT_FILL_HISTORY data = table.get_demand_raw(history, future) result = { 'graph_info': { 'data': self.series_to_js(data), } } response_dict = result return RestResponse(response_dict)