analysis/webservice/webmodel/NexusResults.py (92 lines of code) (raw):

# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import json from datetime import datetime from pytz import timezone from webservice.webmodel.CustomEncoder import CustomEncoder ISO_8601 = '%Y-%m-%dT%H:%M:%S%z' class NexusResults: def __init__(self, results=None, meta=None, stats=None, computeOptions=None, status_code=200, **args): self.status_code = status_code self.__results = results self.__meta = meta if meta is not None else {} self.__stats = stats if stats is not None else {} self.__computeOptions = computeOptions if computeOptions is not None: self.__minLat = computeOptions.get_min_lat() self.__maxLat = computeOptions.get_max_lat() self.__minLon = computeOptions.get_min_lon() self.__maxLon = computeOptions.get_max_lon() self.__ds = computeOptions.get_dataset() self.__startTime = computeOptions.get_start_time() self.__endTime = computeOptions.get_end_time() else: self.__minLat = args["minLat"] if "minLat" in args else -90.0 self.__maxLat = args["maxLat"] if "maxLat" in args else 90.0 self.__minLon = args["minLon"] if "minLon" in args else -180.0 self.__maxLon = args["maxLon"] if "maxLon" in args else 180.0 self.__ds = args["ds"] if "ds" in args else None self.__startTime = args["startTime"] if "startTime" in args else None self.__endTime = args["endTime"] if "endTime" in args else None self.extendMeta(minLat=self.__minLat, maxLat=self.__maxLat, minLon=self.__minLon, maxLon=self.__maxLon, ds=self.__ds, startTime=self.__startTime, endTime=self.__endTime) def computeOptions(self): return self.__computeOptions def results(self): return self.__results def meta(self): return self.__meta def stats(self): return self.__stats def _extendMeta(self, meta, minLat, maxLat, minLon, maxLon, ds, startTime, endTime): if meta is None: return None meta["shortName"] = ds if "title" in meta and "units" in meta: meta["label"] = "%s (%s)" % (meta["title"], meta["units"]) if all(p is not None for p in [minLat, maxLat, minLon, maxLon]): meta["bounds"] = { "east": maxLon, "west": minLon, "north": maxLat, "south": minLat } if startTime is not None and endTime is not None: meta["time"] = { "start": startTime, "stop": endTime, "iso_start": datetime.utcfromtimestamp(int(startTime)).replace(tzinfo=timezone('UTC')).strftime(ISO_8601), "iso_stop": datetime.utcfromtimestamp(int(endTime)).replace(tzinfo=timezone('UTC')).strftime(ISO_8601) } return meta def extendMeta(self, minLat, maxLat, minLon, maxLon, ds, startTime, endTime): if self.__meta is None: return None if type(ds) == list: for i in range(0, len(ds)): shortName = ds[i] if type(self.__meta) == list: subMeta = self.__meta[i] else: subMeta = self.__meta # Risky self._extendMeta(subMeta, minLat, maxLat, minLon, maxLon, shortName, startTime, endTime) else: if type(self.__meta) == list: self.__meta = self.__meta[0] else: self.__meta = self.__meta # Risky self._extendMeta(self.__meta, minLat, maxLat, minLon, maxLon, ds, startTime, endTime) def filename(self): return 'download' def toJson(self): data = { 'meta': self.__meta, 'data': self.__results, 'stats': self.__stats } return json.dumps(data, indent=4, cls=CustomEncoder) def toImage(self): raise Exception("Not implemented for this result type")