def get_grid_centers(request): ''' Outputs GNOME grid centers for a particular mover ''' log_prefix = 'req({0}): get_current_info():'.format(id(request)) log.info('>>' + log_prefix) gnome_sema = request.registry.settings['py_gnome_semaphore'] gnome_sema.acquire() log.info(' {0} {1}'.format(log_prefix, 'semaphore acquired...')) try: obj_id = request.matchdict.get('obj_id')[0] mover = get_session_object(obj_id, request) if mover is not None: if isinstance(mover, CurrentMoversBase): # signature = get_grid_signature(mover) centers = get_center_points(mover) return centers.tolist() else: exc = cors_exception(request, HTTPNotFound) raise exc finally: gnome_sema.release() log.info(' ' + log_prefix + 'semaphore released...') log.info('<<' + log_prefix)
def get_polygons(request): ''' Outputs the SpatialRelease's Polygons in binary format ''' log_prefix = 'req({0}): get_polygons():'.format(id(request)) log.info('>>' + log_prefix) session_lock = acquire_session_lock(request) log.info(' {} session lock acquired (sess:{}, thr_id: {})'.format( log_prefix, id(session_lock), current_thread().ident)) try: obj_id = request.matchdict.get('obj_id')[0] obj = get_session_object(obj_id, request) if obj is not None and obj.obj_type in geojson_types: lengths, lines = obj.get_polygons() lines_bytes = b''.join([l.tobytes() for l in lines]) return (zlib.compress(lengths.tobytes() + lines_bytes), len(lengths)) else: exc = cors_exception(request, HTTPNotFound) raise exc finally: session_lock.release() log.info(' {} session lock released (sess:{}, thr_id: {})'.format( log_prefix, id(session_lock), current_thread().ident)) log.info('<<' + log_prefix)
def get_model(request): ''' Returns Model object in JSON. - This method varies slightly from the common object method in that if we don't specify a model ID, we: - return the current active model if it exists or... - return the specification. ''' ret = None obj_id = obj_id_from_url(request) gnome_sema = request.registry.settings['py_gnome_semaphore'] gnome_sema.acquire() try: if not obj_id: my_model = get_active_model(request) if my_model: ret = my_model.serialize() else: ret = get_specifications(request, implemented_types) else: obj = get_session_object(obj_id, request) if obj: if ObjectImplementsOneOf(obj, implemented_types): set_active_model(request, obj.id) ret = obj.serialize() else: # we refer to an object, but it is not a Model raise cors_exception(request, HTTPBadRequest) else: raise cors_exception(request, HTTPNotFound) finally: gnome_sema.release() return ret
def get_raster(request): ''' Outputs the map's raster in binary format ''' log_prefix = 'req({0}): get_raster():'.format(id(request)) log.info('>>' + log_prefix) session_lock = acquire_session_lock(request) log.info(' {} session lock acquired (sess:{}, thr_id: {})'.format( log_prefix, id(session_lock), current_thread().ident)) try: obj_id = request.matchdict.get('obj_id')[0] obj = get_session_object(obj_id, request) if obj is not None: raster = obj.raster.copy() #transpose for client bbox = obj.land_polys.bounding_box.AsPoly().reshape(-1).tolist() return zlib.compress(np.ascontiguousarray( raster.T).tobytes()), raster.T.shape, bbox else: exc = cors_exception(request, HTTPNotFound) raise exc finally: session_lock.release() log.info(' {} session lock released (sess:{}, thr_id: {})'.format( log_prefix, id(session_lock), current_thread().ident)) log.info('<<' + log_prefix)
def RegisterObject(obj, request): ''' Recursively register an object plus all contained child objects. Registering means we put the object somewhere it can be looked up in the Web API. We would mainly like to register PyGnome objects. Others we probably don't care about. ''' sequence_types = (list, tuple, OrderedCollection, SpillContainerPair) if (isinstance(obj, GnomeId)): set_session_object(obj, request) log.info('registering {0} on session {1}'.format(obj.name, request.session.session_id)) if isinstance(obj, sequence_types): for i in obj: if (isinstance(i, GnomeId)): RegisterObject(i, request) elif hasattr(obj, '__dict__'): for k in dir(obj): attr = None try: attr = getattr(obj, k) except Exception as e: log.warning(str(e)) if ((isinstance(attr, GnomeId) and get_session_object(attr.id, request) is None) or isinstance(attr, sequence_types)): RegisterObject(attr, request)
def update_model(request): ''' Returns Model object in JSON. - This method varies slightly from the common object method in that if we don't specify a model ID, we: - update the current active model if it exists or... - generate a 'Not Found' exception. ''' log_prefix = 'req({0}): update_model():'.format(id(request)) log.info('>>' + log_prefix) ret = None try: json_request = ujson.loads(request.body.decode('utf-8')) except Exception: raise cors_exception(request, HTTPBadRequest) if not JSONImplementsOneOf(json_request, implemented_types): raise cors_exception(request, HTTPNotImplemented) session_lock = acquire_session_lock(request) log.info(' {} session lock acquired (sess:{}, thr_id: {})'.format( log_prefix, id(session_lock), current_thread().ident)) obj_id = obj_id_from_req_payload(json_request) if obj_id: active_model = get_session_object(obj_id, request) else: active_model = get_active_model(request) if active_model: try: if UpdateObject(active_model, json_request, get_session_objects(request)): set_session_object(active_model, request) ret = active_model.serialize(options=web_ser_opts) except Exception: raise cors_exception(request, HTTPUnsupportedMediaType, with_stacktrace=True) finally: session_lock.release() log.info(' ' + log_prefix + 'session lock released...') else: session_lock.release() log.info(' {} session lock released (sess:{}, thr_id: {})'.format( log_prefix, id(session_lock), current_thread().ident)) msg = ("raising cors_exception() in update_model. " "Updating model before it exists.") log.warning(' ' + log_prefix + msg) raise cors_exception(request, HTTPNotFound) log.info('<<' + log_prefix) return ret
def update_model(request): ''' Returns Model object in JSON. - This method varies slightly from the common object method in that if we don't specify a model ID, we: - update the current active model if it exists or... - generate a 'Not Found' exception. ''' log_prefix = 'req({0}): update_model():'.format(id(request)) log.info('>>' + log_prefix) ret = None try: json_request = ujson.loads(request.body) except: raise cors_exception(request, HTTPBadRequest) if not JSONImplementsOneOf(json_request, implemented_types): raise cors_exception(request, HTTPNotImplemented) gnome_sema = request.registry.settings['py_gnome_semaphore'] gnome_sema.acquire() log.info(' ' + log_prefix + 'semaphore acquired...') obj_id = obj_id_from_req_payload(json_request) if obj_id: active_model = get_session_object(obj_id, request) else: active_model = get_active_model(request) if active_model: try: if UpdateObject(active_model, json_request, get_session_objects(request)): set_session_object(active_model, request) ret = active_model.serialize() except: raise cors_exception(request, HTTPUnsupportedMediaType, with_stacktrace=True) finally: gnome_sema.release() log.info(' ' + log_prefix + 'semaphore released...') else: gnome_sema.release() log.info(' ' + log_prefix + 'semaphore released...') msg = ("raising cors_exception() in update_model. " "Updating model before it exists.") log.warning(' ' + log_prefix + msg) raise cors_exception(request, HTTPNotFound) log.info('<<' + log_prefix) return ret
def get_geojson(request, implemented_types): '''Returns the GeoJson for a Gnome Map object.''' obj = get_session_object(obj_id_from_url(request), request) if obj: if ObjectImplementsOneOf(obj, implemented_types): return obj.to_geojson() else: raise cors_exception(request, HTTPNotImplemented) else: raise cors_exception(request, HTTPNotFound)
def get_current_info(request): ''' Outputs GNOME current information for a particular current mover in a geojson format. The output is a collection of Features. The Features contain a MultiPolygon ''' log_prefix = 'req({0}): get_current_info():'.format(id(request)) log.info('>>' + log_prefix) gnome_sema = request.registry.settings['py_gnome_semaphore'] gnome_sema.acquire() log.info(' {0} {1}'.format(log_prefix, 'semaphore acquired...')) try: obj_id = request.matchdict.get('obj_id')[0] mover = get_session_object(obj_id, request) if mover is not None: # start = active_model.start_time # start_seconds = time_utils.date_to_sec(start) # num_hours = active_model.duration.total_seconds() / 60 / 60 # # times = [start_seconds + 3600. * dt # for dt in range(int(num_hours))] if isinstance(mover, CurrentMoversBase): # signature = get_grid_signature(mover) cells = get_cells(mover) return cells.reshape(-1, cells.shape[-1] * cells.shape[-2]).tolist() else: exc = cors_exception(request, HTTPNotFound) raise exc finally: gnome_sema.release() log.info(' ' + log_prefix + 'semaphore released...') log.info('<<' + log_prefix)
def get_current_info(request): ''' Outputs GNOME current information for a particular current mover in a geojson format. The output is a collection of Features. The Features contain a MultiPolygon ''' log_prefix = 'req({0}): get_current_info():'.format(id(request)) log.info('>>' + log_prefix) gnome_sema = request.registry.settings['py_gnome_semaphore'] gnome_sema.acquire() log.info(' {0} {1}'.format(log_prefix, 'semaphore acquired...')) try: obj_id = request.matchdict.get('obj_id')[0] mover = get_session_object(obj_id, request) if mover is not None: # start = active_model.start_time # start_seconds = time_utils.date_to_sec(start) # num_hours = active_model.duration.total_seconds() / 60 / 60 # # times = [start_seconds + 3600. * dt # for dt in range(int(num_hours))] if isinstance(mover, CurrentMoversBase): # signature = get_grid_signature(mover) cells = get_cells(mover) return cells.reshape(-1, cells.shape[-1]*cells.shape[-2]).tolist() else: exc = cors_exception(request, HTTPNotFound) raise exc finally: gnome_sema.release() log.info(' ' + log_prefix + 'semaphore released...') log.info('<<' + log_prefix)
def update_map(request): '''Updates a Gnome Map object.''' try: json_request = ujson.loads(request.body.decode('utf-8')) except Exception: raise cors_exception(request, HTTPBadRequest) if not JSONImplementsOneOf(json_request, implemented_types): raise cors_exception(request, HTTPNotImplemented) obj = get_session_object(obj_id_from_req_payload(json_request), request) if obj: try: UpdateObject(obj, json_request, get_session_objects(request)) except Exception: raise cors_exception(request, HTTPUnsupportedMediaType, with_stacktrace=True) else: raise cors_exception(request, HTTPNotFound) set_session_object(obj, request) return obj.serialize(options=web_ser_opts)
def get_metadata(request): log_prefix = 'req({0}): get_metadata():'.format(id(request)) log.info('>>' + log_prefix) session_lock = acquire_session_lock(request) log.info(' {} session lock acquired (sess:{}, thr_id: {})'.format( log_prefix, id(session_lock), current_thread().ident)) try: obj_id = request.matchdict.get('obj_id')[0] obj = get_session_object(obj_id, request) if obj is not None: return obj.get_metadata() else: exc = cors_exception(request, HTTPNotFound) raise exc finally: session_lock.release() log.info(' {} session lock released (sess:{}, thr_id: {})'.format( log_prefix, id(session_lock), current_thread().ident)) log.info('<<' + log_prefix)
def update_map(request): '''Updates a Gnome Map object.''' try: json_request = ujson.loads(request.body) except: raise cors_exception(request, HTTPBadRequest) if not JSONImplementsOneOf(json_request, implemented_types): raise cors_exception(request, HTTPNotImplemented) obj = get_session_object(obj_id_from_req_payload(json_request), request) if obj: try: UpdateObject(obj, json_request, get_session_objects(request)) except: raise cors_exception(request, HTTPUnsupportedMediaType, with_stacktrace=True) else: raise cors_exception(request, HTTPNotFound) set_session_object(obj, request) return obj.serialize()