# Manifold API Python interface
- import xmlrpclib
+ import copy, xmlrpclib
from myslice.config import Config
def __repr__ (self): return "ManifoldAPI[%s]"%self.url
+ def _print_value (self, value):
+ print "+++",'value',
+ if isinstance (value,list): print "[%d]"%len(value),
+ elif isinstance (value,dict): print "{%d}"%len(value),
+ print mytruncate (value,80)
+
# a one-liner to give a hint of what the return value looks like
def _print_result (self, result):
if not result: print "[no/empty result]"
print "result is a dict with %d keys : %s"%(len(result),result.keys())
for (k,v) in result.iteritems():
if v is None: continue
- print '+++',k,':',mytruncate (v,60)
+ if k=='value': self._print_value(v)
+ else: print '+++',k,':',mytruncate (v,30)
else: print "[dont know how to display result] %s"%result
# xxx temporary code for scaffolding a ManifolResult on top of an API that does not expose error info
try:
if debug:
print "====> ManifoldAPI.%s"%repr(),"url",self.url
- print "=> auth",self.auth
+ # No password in the logs
+ logAuth = copy.copy(self.auth)
+ if 'AuthString' in logAuth:
+ logAuth['AuthString']="XXX"
+ print "=> auth",logAuth
print "=> args",args,"kwds",kwds
annotations = {
'authentication': self.auth
}
args += (annotations,)
result=getattr(self.server, methodName)(*args, **kwds)
+ print "%s%r" %(methodName, args)
+
if debug:
print '<= result=',
self._print_result(result)
from manifold.manifoldresult import ManifoldResult
from manifold.manifoldapi import ManifoldAPI
+from django.contrib import messages
+
debug=False
debug=True
self.auth=auth
self.hash_by_object={}
- def fetch (self):
+ def fetch (self, request):
offline_filename="%s/../offline-metadata.json"%os.path.dirname(__file__)
if work_offline:
try:
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']
+ fields = ['table', 'column.name', 'column.qualifier', 'column.type',
+ 'column.is_array', 'column.description', 'column.default', 'key', 'capability']
#fields = ['table', 'column.column',
# 'column.description','column.header', 'column.title',
# 'column.unit', 'column.info_type',
# 'column.resource_type', 'column.value_type',
# 'column.allowed_values', 'column.platforms.platform',
# 'column.platforms.platform_url']
- result = manifold_api.forward({
- 'action': 'get',
- 'object': 'local:object', # proposed to replace metadata:table
- 'fields': fields
- })
+ request={ 'action': 'get',
+ 'object': 'local:object', # proposed to replace metadata:table
+ 'fields': fields ,
+ }
+ result = manifold_api.forward(request)
+ # xxx need a way to export error messages to the UI
if result['code'] == 1: # warning
- messages.warning(request, result['description'])
+ # messages.warning(request, result['description'])
+ print ("METADATA WARNING -",request,result['description'])
elif result['code'] == 2:
- messages.error(request, result['description'])
+ # messages.error(request, result['description'])
+ print ("METADATA ERROR -",request,result['description'])
# XXX FAIL HERE XXX
+ return
rows = result.ok_value()
# API errors will be handled by the outer logic
# queue of queries with maybe a domid, see enqueue_query
self._queue=[]
# global prelude object
- # self.prelude=Prelude(css_files=['css/plugin.css','css/onelab_marko.css',])
- self.prelude=Prelude()
+ self.prelude=Prelude(css_files=['css/plugin.css','css/onelab_marko.css',])
# record known plugins hashed on their domid
def record_plugin (self, plugin):
result={'query_uuid':a}
if b: result['domid']=b
return result
- env['query_publish_dom_tuples'] = [ query_publish_dom_tuple (a,b) for (a,b) in self._queue ]
+ env['query_exec_tuples'] = [ query_publish_dom_tuple (a,b) for (a,b) in self._queue ]
javascript = render_to_string ("page-queries.js",env)
self.add_js_chunks (javascript)
# self.reset_queue()
self.expose_js_manifold_config()
- # DEPRECATED # # needs to be called explicitly and only when metadata is actually required
- # DEPRECATED # # in particular user needs to be logged
- # DEPRECATED # def get_metadata (self):
- # DEPRECATED # # look in session's cache - we don't want to retrieve this for every request
- # DEPRECATED # session=self.request.session
- # DEPRECATED # if 'manifold' not in session:
- # DEPRECATED # print "Page.expose_js_metadata: no 'manifold' in session... - cannot retrieve metadata - skipping"
- # DEPRECATED # return
- # DEPRECATED # manifold=session['manifold']
- # DEPRECATED # # if cached, use it
- # DEPRECATED # if 'metadata' in manifold and isinstance(manifold['metadata'],MetaData):
- # DEPRECATED # if debug: print "Page.get_metadata: return cached value"
- # DEPRECATED # return manifold['metadata']
- # DEPRECATED # # otherwise retrieve it
- # DEPRECATED # manifold_api_session_auth = session['manifold']['auth']
- # DEPRECATED # print "get_metadata(), manifold_api_session_auth =", session['manifold']['auth']
- # DEPRECATED # metadata=MetaData (manifold_api_session_auth)
- # DEPRECATED # metadata.fetch()
- # DEPRECATED # # store it for next time
- # DEPRECATED # manifold['metadata']=metadata
- # DEPRECATED # if debug: print "Page.get_metadata: return new value"
- # DEPRECATED # return metadata
-
# needs to be called explicitly and only when metadata is actually required
# in particular user needs to be logged
def get_metadata (self):
metadata_auth = {'AuthMethod':'anonymous'}
metadata=MetaData (metadata_auth)
- metadata.fetch()
+ metadata.fetch(self.request)
# store it for next time
manifold['metadata']=metadata
if debug: print "Page.get_metadata: return new value"
return metadata
def expose_js_metadata (self):
- # export in this js global...
- self.add_js_chunks("var MANIFOLD_METADATA =" + self.get_metadata().to_json() + ";")
+ # expose global MANIFOLD_METADATA as a js variable
+ # xxx this is fetched synchroneously..
+ self.add_js_init_chunks("var MANIFOLD_METADATA =" + self.get_metadata().to_json() + ";")
def expose_js_manifold_config (self):
config=Config()
- self.add_js_chunks(config.manifold_js_export())
+ self.add_js_init_chunks(config.manifold_js_export())
#################### requirements/prelude management
# just forward to self.prelude - see decorator above
@to_prelude
def add_css_files (self):pass
@to_prelude
+ def add_js_init_chunks (self):pass
+ @to_prelude
def add_js_chunks (self):pass
@to_prelude
def add_css_chunks (self):pass