Source code for vizic.mongo_ext.extension

from notebook.utils import url_path_join
from notebook.base.handlers import IPythonHandler
# from . import db_util as du
from .db_connect import MongoConnect
from tornado import gen
import json
import tornado.web

connection = None


[docs]class tileHandler(IPythonHandler): """Handler for tiled catalogs requests.""" @gen.coroutine
[docs] def get(self, coll, zoom, xc, yc): global connection if connection is None: self.set_status(403) self.write({'msg': 'error'}) else: tile_gen = yield connection.getTileData(coll, xc, yc, zoom) tile_list = yield tile_gen.to_list(length=100000000) tile_json = json.dumps(tile_list) self.set_status(200) self.set_header('Content-Type', 'application/json') self.write(tile_json)
[docs]class dbHandler(IPythonHandler): """Handler for request on database change.""" @tornado.web.asynchronous
[docs] def post(self): arguments = {k.lower(): self.get_argument(k) for k in self.request.arguments} host = arguments['host'] port = int(arguments['port']) db = arguments['db'] global connection if connection is not None: connection.close() try: connection = MongoConnect(host, port, db) except Exception as e: self.set_status(403) self.write({'status': 'error', 'message': 'check connection info'}) raise Exception(str(e)) else: self.set_status(200) self.write({'status': 'ok'}) self.flush() self.finish()
[docs]class rangeHandler(IPythonHandler): """Handler for updates on catalog metadata."""
[docs] def post(self): arguments = {k.lower(): self.get_argument(k) for k in self.request.arguments} collection = arguments['collection'] mRange = arguments['mrange'] maxZoom = arguments['maxzoom'] MongoConnect.range_dict[collection] = float(mRange) MongoConnect.zoom_dict[collection] = int(maxZoom)
[docs]class popupHandler(IPythonHandler): """Handler for data request on clicked object."""
[docs] def get(self): arguments = {k.lower(): self.get_argument(k) for k in self.request.arguments} coll = arguments['coll'] ra = arguments['ra'] dec = arguments['dec'] content = connection.getOjbectByPos(coll, ra, dec) self.set_status(200) self.set_header('Content-Type', 'application/json') self.write(content)
[docs]class selectionHandler(IPythonHandler): """Handler for data request on selected objects by selection tool."""
[docs] def get(self): arguments = {k.lower(): self.get_argument(k) for k in self.request.arguments} coll = arguments['coll'] swLng = arguments['swlng'] neLng = arguments['nelng'] swLat = arguments['swlat'] neLat = arguments['nelat'] content = connection.getRectSelection(coll, swLng, swLat, neLng, neLat) json_str = json.dumps(content) self.set_status(200) self.set_header('Content-Type', 'application/json') self.write(json_str)
[docs]class mstHandler(IPythonHandler): """Handler for MST data request.""" @gen.coroutine
[docs] def get(self, coll): global connection if connection is None: self.set_status(403) self.write({'msg': 'error'}) else: mst_gen = yield connection.getMst(coll) mst_list = yield mst_gen.to_list(length=1000000000) mst_json = json.dumps(mst_list[0]['tree']) self.set_status(200) self.set_header('Content-Type', 'application/json') self.write(mst_json) self.flush() self.finish()
[docs]class voronoiHandler(IPythonHandler): """Hanlder for request on voronoi diagram data.""" @gen.coroutine
[docs] def get(self, coll): global connection if connection is None: self.set_status(403) self.write({'msg': 'error'}) else: voronoi_gen = yield connection.getVoronoi(coll) voronoi_list = yield voronoi_gen.to_list(length=1000000000) voronoi_json = json.dumps(voronoi_list) self.set_status(200) self.set_header('Content-Type', 'application/json') self.write(voronoi_json) self.flush() self.finish()
[docs]class healpixHandler(IPythonHandler): """Handler for data request on healpix grid.""" @gen.coroutine
[docs] def get(self, coll): global connection if connection is None: self.set_status(403) self.write({'msg': 'error'}) else: healpix_gen = yield connection.getHealpix(coll) healpix_list = yield healpix_gen.to_list(length=1000000000) healpix_json = json.dumps(healpix_list[0]['data']) self.set_status(200) self.set_header('Content-Type', 'application/json') self.write(healpix_json) self.flush() self.finish()
[docs]class circlesHandler(IPythonHandler): """Handler for data request on CirclesOverLays.""" @gen.coroutine
[docs] def get(self, coll): global connection if connection is None: self.set_status(403) self.write({'msg': 'error'}) else: circles_gen = yield connection.getCircles(coll) circles_list = yield circles_gen.to_list(length=1000000000) circles_json = json.dumps(circles_list[0]['data']) self.set_status(200) self.set_header('Content-Type', 'application/json') self.write(circles_json) self.flush() self.finish()
[docs]def load_jupyter_server_extension(nbapp): """ nbapp is instance of Jupyter.notebook.notebookapp.NotebookApp nbapp.web_app is instance of tornado.web.Application - can register new tornado.web.RequestHandlers to extend API backend. """ nbapp.log.info('My Extension Loaded') web_app = nbapp.web_app host_pattern = '.*$' route_pattern = url_path_join(web_app.settings['base_url'], '/tiles/(\S*)/(-?[0-9]+)/(-?[0-9]+)/(-?[0-9]+).json') db_pattern = url_path_join(web_app.settings['base_url'], '/connection/?') collection_pattern = url_path_join(web_app.settings['base_url'], '/rangeinfo/?') popup_pattern = url_path_join(web_app.settings['base_url'], '/objectPop/?') selection_pattern = url_path_join(web_app.settings['base_url'], '/selection/?') mst_pattern = url_path_join(web_app.settings['base_url'], '/mst/(\S*).json') circles_pattern = url_path_join(web_app.settings['base_url'], '/circles/(\S*).json') healpix_pattern = url_path_join(web_app.settings['base_url'], '/healpix/(\S*).json') voronoi_pattern = url_path_join(web_app.settings['base_url'], '/voronoi/(\S*).json') web_app.add_handlers(host_pattern, [ (route_pattern, tileHandler), (popup_pattern, popupHandler), (db_pattern, dbHandler), (collection_pattern, rangeHandler), (selection_pattern, selectionHandler), (mst_pattern, mstHandler), (circles_pattern, circlesHandler), (healpix_pattern, healpixHandler), (voronoi_pattern, voronoiHandler) ])