From 50612381c5cdf81a87fd6d8c7b4ae864dba49db6 Mon Sep 17 00:00:00 2001 From: Thierry Parmentelat Date: Mon, 25 Mar 2013 18:26:31 +0100 Subject: [PATCH] handle metadata in a separate class and related js in manifold/ --- {unfold => manifold}/js/metadata.js | 0 manifold/metadata.py | 30 +++++++++++++ trash/sliceview.py | 5 +++ unfold/page.py | 69 ++++++++++++----------------- 4 files changed, 64 insertions(+), 40 deletions(-) rename {unfold => manifold}/js/metadata.js (100%) create mode 100644 manifold/metadata.py diff --git a/unfold/js/metadata.js b/manifold/js/metadata.js similarity index 100% rename from unfold/js/metadata.js rename to manifold/js/metadata.js diff --git a/manifold/metadata.py b/manifold/metadata.py new file mode 100644 index 00000000..8aed1268 --- /dev/null +++ b/manifold/metadata.py @@ -0,0 +1,30 @@ +import json + +from manifold.manifoldapi import ManifoldAPI + +class MetaData: + + def __init__ (self, auth): + self.auth=auth + self.hash_by_subject={} + + def fetch (self): + manifold_api = ManifoldAPI(self.auth) + 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'] + results = manifold_api.Get('metadata:table', [], [], fields) + self.hash_by_subject = dict ( [ (result['table'], result) for result in results ] ) + + def to_json(self): + return json.dumps(self.hash_by_subject) + + def details_by_subject (self, subject): + return self.hash_by_subject[subject] + + def sorted_fields_by_subject (self, subject): + return self.hash_by_subject[subject]['columns'].sort() + diff --git a/trash/sliceview.py b/trash/sliceview.py index 2b83e66b..2e804d9a 100644 --- a/trash/sliceview.py +++ b/trash/sliceview.py @@ -78,6 +78,11 @@ def slice_view (request, slicename=tmp_default_slice): query=main_query, # toggled=False, ), + QuickFilter ( + page=page, + title="QuickFilter is currently the only one that requires metadata", + criterias=quickfilter_criterias + ), ]) # variables that will get passed to the view-unfold1.html template diff --git a/unfold/page.py b/unfold/page.py index b00194f8..43ad76ea 100644 --- a/unfold/page.py +++ b/unfold/page.py @@ -6,7 +6,7 @@ import json from django.template.loader import render_to_string -from manifold.manifoldapi import ManifoldAPI +from manifold.metadata import MetaData from unfold.prelude import Prelude @@ -19,6 +19,9 @@ def to_prelude (method): return prelude_method(self.prelude,*args, **kwds) return actual +debug=False +debug=True + class Page: def __init__ (self, request): @@ -31,10 +34,6 @@ class Page: self._queue=[] # global prelude object self.prelude=Prelude(css_files='css/plugin.css') - # load metadata - self._metadata={} - # do not call this uncondionnally as we might not even have logged in - # self.expose_js_metadata() # record known plugins hashed on their domid def record_plugin (self, plugin): @@ -68,42 +67,32 @@ class Page: self.add_js_chunks (javascript) - - def expose_js_metadata(self): - request=self.request - # xxx this code should probably not be called unconditionnally at page creation time - # because we're not sure a user is logged in so we might have no session... - if 'manifold' not in request.session: - print "Page.expose_js_metadata: no 'manifold' in session... - skipping" + # needs to be called explicitly and only when metadata is actually required + # in particular user needs to be logged + def get_metadata (self): + # look in session's cache - we don't want to retrieve this for every request + session=self.request.session + if 'manifold' not in session: + print "Page.expose_js_metadata: no 'manifold' in session... - cannot retrieve metadata - skipping" return - # use cached version if present - if 'metadata' in request.session.keys(): - self._metadata = request.session['metadata'] - else: - manifold_api_session_auth = request.session['manifold']['auth'] - manifold_api = ManifoldAPI(auth=manifold_api_session_auth) - - 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'] - - results = manifold_api.Get('metadata:table', [], [], fields) - - for res in results: - subject = res['table'] - self._metadata[subject] = res - - request.session['metadata'] = self._metadata - - javascript = "var MANIFOLD_METADATA =" + json.dumps(self._metadata) + ";" - self.add_js_chunks(javascript) - - def metadata_get_fields(self, subject): - return self._metadata[subject]['column'].sort() - + manifold=session['manifold'] + # if cached, use it + if 'metadata' in manifold and isinstance(manifold['metadata'],MetaData): + if debug: print "Page.get_metadata: return cached value" + return manifold['metadata'] + # otherwise retrieve it + manifold_api_session_auth = session['manifold']['auth'] + metadata=MetaData (manifold_api_session_auth) + metadata.fetch() + # 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() + ";") + def expose_js_manifold_config (self): self.add_js_chunks(Config.manifold_js_export()) -- 2.43.0