From: Yasin Date: Tue, 26 Nov 2013 17:07:06 +0000 (+0100) Subject: Merge branch 'master' of ssh://git.onelab.eu/git/myslice X-Git-Tag: myslice-0.3-0~107^2~1 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=b45df9e952ec69d293fe0e4963e040d2a21c07b3;hp=4fa84eb6c39eed3d7ae9125e0368eb3271908abf;p=unfold.git Merge branch 'master' of ssh://git.onelab.eu/git/myslice --- diff --git a/.gitignore b/.gitignore index db80e62e..ed36fe74 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,5 @@ # any local dbfile *.sqlite3 -# here is a mode to 'record' the backend answers and replay them offline -offline-* # the usual useless crap TAGS *.pyc diff --git a/Makefile b/Makefile index 9f3a563b..473e3d76 100644 --- a/Makefile +++ b/Makefile @@ -28,7 +28,7 @@ install: --install-scripts=$(DESTDIR)/$(datadir)/unfold \ --install-data=$(DESTDIR)/$(datadir)/unfold -#################### third-party layout is managed as art of collectstatic +#################### third-party layout is managed as part of collectstatic static: force ./manage.py collectstatic --noinput @@ -59,7 +59,7 @@ debian.source: force rsync -a $(RPMTARBALL) $(DEBTARBALL) debian.package: - debuild -uc -us -b + debuild --set-envvar PREFIX=/usr -uc -us -b debian.clean: $(MAKE) -f debian/rules clean @@ -116,7 +116,7 @@ SSHCOMMAND:=ssh root@$(MYSLICEBOX) LOCAL_RSYNC_EXCLUDES := --exclude '*.pyc' LOCAL_RSYNC_EXCLUDES += --exclude '*.sqlite3' --exclude myslice.ini LOCAL_RSYNC_EXCLUDES += --exclude static --exclude templates --exclude build -LOCAL_RSYNC_EXCLUDES += --exclude to-be-integrated --exclude third-party --exclude 'offline*' +LOCAL_RSYNC_EXCLUDES += --exclude to-be-integrated --exclude third-party # usual excludes RSYNC_EXCLUDES := --exclude .git --exclude '*~' --exclude TAGS --exclude .DS_Store $(LOCAL_RSYNC_EXCLUDES) # make -n will propagate as rsync -n @@ -127,7 +127,7 @@ RSYNC := rsync -a -v $(RSYNC_COND_DRY_RUN) $(RSYNC_EXCLUDES) #################### minimal convenience for pushing work-in-progress in an apache-based depl. # xxx until we come up with a packaging this is going to be a wild guess # on debian04 I have stuff in /usr/share/myslice and a symlink in /root/myslice -INSTALLED_MAIN =/usr/share/unfold +INSTALLED_MAIN =/usr/share/pyshared # this is for a debian box INSTALLED_APACHE =/etc/apache2/sites-available/ @@ -149,7 +149,7 @@ ifeq (,$(MYSLICEBOX)) @exit 1 else +$(RSYNC) ./apache/myslice.conf $(SSHURL)/$(INSTALLED_APACHE)/ - +$(RSYNC) ./apache/init-ssl.sh ./apache/init-ssl.py $(SSHURL)/$(bindir)/ + +$(RSYNC) ./apache/unfold-init-ssl.sh $(SSHURL)/$(bindir)/ endif restart: diff --git a/apache/myslice.conf b/apache/myslice.conf index b36a75ec..c994af36 100644 --- a/apache/myslice.conf +++ b/apache/myslice.conf @@ -1,5 +1,7 @@ +# xxx it might be smarter to install wsgi.py in some other location +# so we don't have to hard-wire these paths here - WSGIScriptAlias / /usr/share/unfold/myslice/wsgi.py + WSGIScriptAlias / /usr/lib/python2.7/dist-packages/myslice/wsgi.py Order deny,allow @@ -21,7 +23,7 @@ # this to be optional on that port - WSGIScriptAlias / /usr/share/unfold/myslice/wsgi.py + WSGIScriptAlias / /usr/lib/python2.7/dist-packages/myslice/wsgi.py Order deny,allow diff --git a/debian/control b/debian/control index 207b30dc..4a4eb059 100644 --- a/debian/control +++ b/debian/control @@ -4,6 +4,7 @@ Section: misc Priority: optional Standards-Version: 3.9.2 Build-Depends: devscripts, debhelper (>=7.0.50~), debconf, dpatch, python-setuptools, make, python-django +X-Python-Version: >= 2.7 Package: myslice Architecture: any diff --git a/debian/myslice.install b/debian/myslice.install index 5c36f726..e0c711dd 100644 --- a/debian/myslice.install +++ b/debian/myslice.install @@ -1 +1 @@ -usr/share/unfold/portal +usr/lib*/python*/dist-packages/portal diff --git a/debian/rules b/debian/rules index b8796e6e..62e2bb6f 100755 --- a/debian/rules +++ b/debian/rules @@ -2,4 +2,4 @@ # -*- makefile -*- %: - dh $@ + dh $@ --with python2 --buildsystem=python_distutils diff --git a/debian/unfold.install b/debian/unfold.install index 53291581..5bf0af9a 100644 --- a/debian/unfold.install +++ b/debian/unfold.install @@ -1,12 +1,12 @@ +usr/lib*/python*/dist-packages/auth +usr/lib*/python*/dist-packages/insert_above +usr/lib*/python*/dist-packages/manifold +usr/lib*/python*/dist-packages/plugins +usr/lib*/python*/dist-packages/unfold +usr/lib*/python*/dist-packages/ui +usr/lib*/python*/dist-packages/myslice +usr/lib*/python*/dist-packages/sample usr/share/unfold/static usr/share/unfold/templates -usr/share/unfold/auth -usr/share/unfold/insert_above -usr/share/unfold/manifold -usr/share/unfold/plugins -usr/share/unfold/unfold -usr/share/unfold/ui -usr/share/unfold/myslice -usr/share/unfold/sample manage.py usr/share/unfold/ apache/myslice.conf /etc/apache2/sites-available diff --git a/manifold/manifoldapi.py b/manifold/manifoldapi.py index eea606e3..664bb320 100644 --- a/manifold/manifoldapi.py +++ b/manifold/manifoldapi.py @@ -72,8 +72,8 @@ class ManifoldAPI: print "====> ManifoldAPI.%s"%repr(),"url",self.url # No password in the logs logAuth = copy.copy(self.auth) - if 'AuthString' in logAuth: - logAuth['AuthString']="XXX" + for obfuscate in ['Authring','session']: + if obfuscate in logAuth: logAuth[obfuscate]="XXX" print "=> auth",logAuth print "=> args",args,"kwds",kwds annotations = { diff --git a/manifold/manifoldproxy.py b/manifold/manifoldproxy.py index 05486cba..99e7b0aa 100644 --- a/manifold/manifoldproxy.py +++ b/manifold/manifoldproxy.py @@ -25,14 +25,6 @@ debug_spin=0 debug_empty=False #debug_empty=True -# Historically we had a feature for developing without an Internet connection -# However this won't work anymore as the python layer itself does manifold calls -# before javascript has a chance to do so. -# Might still come in handy if you want the fastest possible (locally cached) feedback -# beware that this is very rough though... -work_offline=False -#work_offline=True - # this view is what the javascript talks to when it sends a query # see also # myslice/urls.py @@ -59,7 +51,6 @@ with the query passed using POST""" manifold_query = Query() #manifold_query = ManifoldQuery() manifold_query.fill_from_POST(request.POST) - offline_filename="%s/../offline-%s-%s.json"%(os.path.dirname(__file__),manifold_query.action,manifold_query.object) # retrieve session for request # We allow some requests to use the ADMIN user account @@ -74,19 +65,6 @@ with the query passed using POST""" json_answer=json.dumps({'code':0,'value':[]}) print "By-passing : debug_empty & 'get' request : returning a fake empty list" return HttpResponse (json_answer, mimetype="application/json") - ### patch : return the latest one.. - if work_offline: - # if that won't work then we'll try to update anyways - try: - with (file(offline_filename,"r")) as f: - json_answer=f.read() - print "By-passing : using contents from %s"%offline_filename - return HttpResponse (json_answer, mimetype="application/json") - except: - import traceback - traceback.print_exc() - print "Could not run in offline mode, PROCEEDING" - pass # actually forward manifold_api= ManifoldAPI(auth=manifold_api_session_auth) @@ -102,10 +80,6 @@ with the query passed using POST""" result [ 'description' ] = [ ResultValue.to_html (x) for x in result['description'] ] json_answer=json.dumps(result) - # if in debug mode we save this so we can use offline mode later - if debug: - with (file(offline_filename,"w")) as f: - f.write(json_answer) # this is an artificial delay added for debugging purposes only if debug_spin>0: diff --git a/manifold/metadata.py b/manifold/metadata.py index 08fdf61d..f7a59686 100644 --- a/manifold/metadata.py +++ b/manifold/metadata.py @@ -9,10 +9,6 @@ from django.contrib import messages debug=False debug=True -# turn this on if you want to work offline -work_offline=False -#work_offline=True - class MetaData: def __init__ (self, auth): @@ -20,14 +16,6 @@ class MetaData: self.hash_by_object={} def fetch (self, request): - offline_filename="%s/../offline-metadata.json"%os.path.dirname(__file__) - if work_offline: - try: - with file(offline_metadata) as f: - self.hash_by_object=json.loads(f.read()) - return - except: - print "metadata.work_offline: failed to decode %s"%offline_filename manifold_api = ManifoldAPI(self.auth) fields = ['table', 'column.name', 'column.qualifier', 'column.type', 'column.is_array', 'column.description', 'column.default', 'key', 'capability'] @@ -59,10 +47,6 @@ class MetaData: # print "Failed to retrieve metadata",rows_result.error() # rows=[] self.hash_by_object = dict ( [ (row['table'], row) for row in rows ] ) - # save for next time we use offline mode - if debug and rows: - with file(offline_filename,'w') as f: - f.write(json.dumps(self.hash_by_object)) def to_json(self): return json.dumps(self.hash_by_object) diff --git a/myslice/config.py b/myslice/config.py index 04f4aaf8..908b6512 100644 --- a/myslice/config.py +++ b/myslice/config.py @@ -33,6 +33,8 @@ class Config(object): parser.set ('manifold', 'url', Config.default_manifold_url) parser.set ('manifold', 'admin_user', Config.default_manifold_admin_user) parser.set ('manifold', 'admin_password', Config.default_manifold_admin_password) + parser.add_section('googlemap') + parser.set ('googlemap','api_key', None) parser.read (os.path.join(ROOT,'myslice/myslice.ini')) self.config_parser=parser @@ -43,6 +45,9 @@ class Config(object): return (self.config_parser.get('manifold','admin_user'), self.config_parser.get('manifold','admin_password')) + def googlemap_api_key (self): + return self.config_parser.get('googlemap','api_key') + # exporting these details to js def manifold_js_export (self): return "var MANIFOLD_URL = '%s';\n"%self.manifold_url(); diff --git a/myslice/settings.py b/myslice/settings.py index 4878c0de..91584419 100644 --- a/myslice/settings.py +++ b/myslice/settings.py @@ -19,8 +19,15 @@ except: import traceback traceback.print_exc() -if not ROOT: - raise Exception,"Cannot find ROOT for myslice" +if os.path.isdir(os.path.join(ROOT,"static")): + DATAROOT=ROOT +else: + DATAROOT="/usr/share/unfold" + if not os.path.isdir(os.path.join(DATAROOT,"static")): + DATAROOT=None + +if not ROOT: raise Exception,"Cannot find ROOT for myslice" +if not DATAROOT: raise Exception,"Cannot find DATAROOT for myslice" #################### ADMINS = ( @@ -40,7 +47,7 @@ EMAIL_USE_TLS = False DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. - 'NAME': os.path.join(ROOT,'myslice.sqlite3'), # Or path to database file if using sqlite3. + 'NAME': os.path.join(DATAROOT,'myslice.sqlite3'), # Or path to database file if using sqlite3. 'USER': '', # Not used with sqlite3. 'PASSWORD': '', # Not used with sqlite3. 'HOST': '', # Set to empty string for localhost. Not used with sqlite3. @@ -84,7 +91,7 @@ MEDIA_URL = '' # Don't put anything in this directory yourself; store your static files # in apps' "static/" subdirectories and in STATICFILES_DIRS. # Example: "/home/media/media.lawrence.com/static/" -STATIC_ROOT = os.path.join(ROOT,'static') +STATIC_ROOT = os.path.join(DATAROOT,'static') # URL prefix for static files. # Example: "http://media.lawrence.com/static/" @@ -154,7 +161,7 @@ TEMPLATE_DIRS = ( # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". # Always use forward slashes, even on Windows. # Don't forget to use absolute paths, not relative paths. - os.path.join(ROOT,"templates"), + os.path.join(DATAROOT,"templates"), ) INSTALLED_APPS = ( @@ -183,7 +190,7 @@ INSTALLED_APPS = ( # 'django.contrib.admindocs', 'portal', # temporary - not packaged - 'trash', + # 'trash', 'sample', # DEPRECATED # 'django.contrib.formtools', # DEPRECATED ## 'crispy_forms', diff --git a/myslice/urls.py b/myslice/urls.py index 32109579..8ff01f93 100644 --- a/myslice/urls.py +++ b/myslice/urls.py @@ -63,6 +63,6 @@ urlpatterns = patterns( # # various trash views - bound to go away # - url(r'^trash/', include('trash.urls')), +# url(r'^trash/', include('trash.urls')), ) diff --git a/myslice/wsgi.py b/myslice/wsgi.py index 5bd97286..2fa84161 100644 --- a/myslice/wsgi.py +++ b/myslice/wsgi.py @@ -1,10 +1,6 @@ import os import sys -path = '/usr/share/unfold' -if path not in sys.path: - sys.path.append(path) - os.environ['DJANGO_SETTINGS_MODULE'] = 'myslice.settings' import django.core.handlers.wsgi diff --git a/plugins/googlemap/__init__.py b/plugins/googlemap/__init__.py index bce84f54..8ceaec63 100644 --- a/plugins/googlemap/__init__.py +++ b/plugins/googlemap/__init__.py @@ -2,14 +2,17 @@ from unfold.plugin import Plugin class GoogleMap (Plugin): - # set checkboxes if a final column with checkboxes is desired - # pass columns as the initial set of columns - # if None then this is taken from the query's fields + # expcted input are + # query : query about the slice + # query_all : query about all resources + # googlemap_key : mandatory googlemap API v3 key # latitude,longitude, zoom : the starting point - def __init__ (self, query, query_all = None, latitude=43., longitude=7., zoom=4, **settings): + # apparently at some point there has been support for a boolean 'checkboxes' input arg but seems dropped + def __init__ (self, query, query_all, googlemap_api_key=None, latitude=43., longitude=7., zoom=4, **settings): Plugin.__init__ (self, **settings) self.query=query self.query_all = query_all + self.googlemap_api_key=googlemap_api_key self.query_all_uuid = query_all.query_uuid if query_all else None self.latitude=latitude self.longitude=longitude @@ -23,8 +26,12 @@ class GoogleMap (Plugin): return env def requirements (self): + googlemap_api_url = "https://maps.googleapis.com/maps/api/js?" + if self.googlemap_api_key: googlemap_api_url+="key=%s&"%self.googlemap_api_key + googlemap_api_url += "sensor=false" reqs = { - 'js_files' : [ "https://maps.googleapis.com/maps/api/js?sensor=false", + # let users configure their googlemap API key in production deployements + 'js_files' : [ googlemap_api_url, "/js/googlemap.js", "/js/markerclusterer.js", "js/manifold.js", "js/manifold-query.js", diff --git a/plugins/senslabmap/__init__.py b/plugins/senslabmap/__init__.py index 92895d05..03b06a4d 100644 --- a/plugins/senslabmap/__init__.py +++ b/plugins/senslabmap/__init__.py @@ -24,7 +24,7 @@ class SensLabMap (Plugin): "js/spin.presets.js", "js/spin.min.js", "js/jquery.spin.js", "js/three.min.js", "js/jquery-mousewheel.min.js", "js/map.js", ], - 'css_files': [ "css/map.css", + 'css_files': [ "css/senslabmap.css", ], } return reqs diff --git a/plugins/senslabmap/static/css/map.css b/plugins/senslabmap/static/css/map.css deleted file mode 100644 index ac4b7e0e..00000000 --- a/plugins/senslabmap/static/css/map.css +++ /dev/null @@ -1,5 +0,0 @@ -canvas { - border:1px gray solid; - background-color: #202020; - margin: 10px; -} \ No newline at end of file diff --git a/plugins/senslabmap/static/css/senslabmap.css b/plugins/senslabmap/static/css/senslabmap.css index 86f3638b..bda3f45c 100644 --- a/plugins/senslabmap/static/css/senslabmap.css +++ b/plugins/senslabmap/static/css/senslabmap.css @@ -1,40 +1,5 @@ -.senslabmap { - margin: 10px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - line-height: 18px; - color: #333333; - background-color: #ffffff; -} - -#div3d { - height: 500px; +#maps-container canvas { + border:1px gray solid; background-color: #202020; - z-index:-1 -} - -#selectionbox { - text-align: center; - padding:2px -} - -#infobox { - text-align: center -} - -#node_alive { - background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAYAAACQjC21AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAFRQAABUUBbA3bdwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAFHSURBVDiNtdSxSkJxFMfx7znVtZS2wFdIaLHBpcUl4UYPkRQNCU7hQ0RTYiAk9RDRhRpqaXHIJbBXEJwErXuj/2lJK60ovP3G/+F8/mf6iZkxnnIgib4ubIKsmpAFsm+jlhgtsLuUezw/8i0c35VxcOsquabGCcjyxE+fYg9O2DlbH9x+CRZvZJ4weSjCHiA/Y++qGcckBvuneXsCmB1ONEoemFD6JTQ6SISSREkHlEcXbl+mfIOLP2KfZdhoFPqB7F4vLj1HL/dAehoQ6Mx5Mysahc6PAQNIR6HzVdRyMWAAiFpOzYgNNCOngmXiAgXLqCHtuEBD2ipCMy5QhKaak9hAc9JUL6EB0InB63gJDbSe73UFitNqAsV6vtdVgEahHwhUp8CqjUI/ANDho/MGFTNqwGRBfh8zo+a8QWWE/1sffsw0jf0KmsOTrB0wIw8AAAAASUVORK5CYII='); - -} - -#node_down { - background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAYAAACQjC21AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAFRQAABUUBbA3bdwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAEqSURBVDiNtdSxSkJxFMfx7zkGtQgKgU8gJLRcBZcmxxu9hNCU0BQ9RLSJTT1GdEenFrn87xIY+AQXhCu41OA9DdZNNMLy3288f87n/5uOmBkbqdf3KZfPMGsCAWYBACIJkCDimM8fmEze1ldlAwyCE8zuETna/GklZi+InJMkT9+Dnc4Bs9ktcAHIj9gKC9xRqVwxHL4C7BVPWXaDSG9LqCgE9MiyHLj8athshpg9/hJbo+UU5yKxVuuQxeIZqO0EQkqpdKzkeegBA6iR56ECbQ/YZ9qKmT/QrK1AwxsIDQXGHsGxIjLyxomMFPAHwkhRjYDUA5aiGilxPEWkuzMn0iWOpwqAcxFm/T9jZn2ciwC0GFar18CA5QXZmgIGH7vLov93D1ezw8V+B8jhfgJI7kYcAAAAAElFTkSuQmCC'); -} - -#node_selected { - background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAYAAACQjC21AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAFRQAABUUBbA3bdwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAE0SURBVDiNtdS/SoJxFMbx7zn0xyGhIfAGGhJaTHFpaTW6iISUSGqKLiLaxChq6CKid21pEcklsKEbEBqCGizhfRrMF9SiP+/bM57D+fzO8OOYJMZj9YdZUk8biBXwHCj30WlD2Ma4pTd/qd3F14nZcdBOWqu4nQNLEy+N5p5QW9ou3HwK2sV1ire5I7AdwL7BhhHomJmXfW2u9QCmolY/fQjUfghFC4HV6KdDYC/a0M5aJWRXv8TGaK2rUgiM09YCcAdkYoHQBZYdUykBDCCDqeTIiwlgg8iLjik50FR0RDYxUGQdo5MYaHQcWTMxUNZ0LEwOtLDpyAIGfyhuusgCVzX/iKkcmzOVVc0/OoAqhQCj/neMuiqFAMCj4vTzAagBTB7IryNQYzA7XPS/7uFIMcbFfgcJcoL5SKOsjQAAAABJRU5ErkJggg=='); -} - -#node_used { - background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAYAAACQjC21AAAABHNCSVQICAgIfAhkiAAAAZJJREFUOI2t1D1LQlEcx/Hf+R/NTMKsawldqRZ7JDBIhyAIpwu9A6egpmrsbUQQ1FDQJL2B4E49LC0OuUQPToUKehFTosy6x9OQF8qiQu93Ohw4n7P9WDQaxQ+53Kx70Uv9MwEaDg85JsIAcG9epfL1u1SlblxU5eMRgFrzQ9YMOtAxt+CK7wedobGffrLKvKVvTmuJZROv55/vuaqq1rlzmE9tLXpWd33c7/8NAwAv71MmO+aXKsLwl6VxAsD8Ag7xqc2YO75GIPYXZkUgNuKcjpREwVuRhv5xB8DFurSYO77+X6i5mDu+7mJdmgUqWufKQauYVcNQyMN6tF4eGGgX7OWBAQ/r0UghNdIuZqWQGqGgY9Q2MOgYjdAgD43bBQ7y0DjlRPraLjAn0teUMW+TdoEZ8zZJxXrWNrBYzybpSZb1ksgX2sVKIl94kmWdABT1l72ldsGGUSQAqMln/bia2G4VO64mtmvyWQc+jUNFGqcPouALOidn/zsQJoQ8qx7u3IvLDTTWxvY9/AY2anmx3wGj5aLJgOrlPgAAAABJRU5ErkJggg=='); -} + margin: 10px; +} \ No newline at end of file diff --git a/plugins/senslabmap/static/js/map.js b/plugins/senslabmap/static/js/map.js index 0e8e1407..4e184cd7 100644 --- a/plugins/senslabmap/static/js/map.js +++ b/plugins/senslabmap/static/js/map.js @@ -11,7 +11,7 @@ var Senslab = { if (info && info[2] == "iot-lab" && info[3] == "info") { node.arch = info[0].split("-")[0]; - node.id = info[0].split("-")[1]; + node.id = parseInt(info[0].split("-")[1]); node.site = info[1]; node.normalized = true; } @@ -21,11 +21,22 @@ var Senslab = { }, createMaps: function($container, sites, nodes) { var maps = {}; + var $menu = $("