From 9af067196ef12830a82a5b011eaf43d0f5313d37 Mon Sep 17 00:00:00 2001 From: Rufus Pollock Date: Thu, 16 Aug 2012 20:22:36 +0100 Subject: [PATCH 1/3] [#2639,js/recline][xs]: re-insert support for serializing all dataset info into state (and vice-versa) which means format is preserved for dataproxy. --- ckan/public/scripts/vendor/recline/recline.js | 50 +++++++------------ 1 file changed, 18 insertions(+), 32 deletions(-) diff --git a/ckan/public/scripts/vendor/recline/recline.js b/ckan/public/scripts/vendor/recline/recline.js index f5b4090bccb..7a1a4818af6 100644 --- a/ckan/public/scripts/vendor/recline/recline.js +++ b/ckan/public/scripts/vendor/recline/recline.js @@ -1181,36 +1181,6 @@ my.Dataset = Backbone.Model.extend({ }); -// ### Dataset.restore -// -// Restore a Dataset instance from a serialized state. Serialized state for a -// Dataset is an Object like: -// -//
-// {
-//   backend: {backend type - i.e. value of dataset.backend.__type__}
-//   dataset: {dataset info needed for loading -- result of dataset.toJSON() would be sufficient but can be simpler }
-//   // convenience - if url provided and dataste not this be used as dataset url
-//   url: {dataset url}
-//   ...
-// }
-my.Dataset.restore = function(state) {
-  var dataset = null;
-  // hack-y - restoring a memory dataset does not mean much ...
-  if (state.backend === 'memory') {
-    var datasetInfo = {
-      records: [{stub: 'this is a stub dataset because we do not restore memory datasets'}]
-    };
-  } else {
-    var datasetInfo = {
-      url: state.url,
-      backend: state.backend
-    };
-  }
-  dataset = new recline.Model.Dataset(datasetInfo);
-  return dataset;
-};
-
 // ## A Record
 // 
 // A single record (or row) in the dataset
@@ -3055,6 +3025,7 @@ my.MultiView = Backbone.View.extend({
         'view-graph': graphState,
         backend: this.model.backend.__type__,
         url: this.model.get('url'),
+        dataset: this.model.toJSON(),
         currentView: null,
         readOnly: false
       },
@@ -3147,8 +3118,24 @@ my.MultiView = Backbone.View.extend({
 // ### MultiView.restore
 //
 // Restore a MultiView instance from a serialized state including the associated dataset
+//
+// This inverts the state serialization process in Multiview
 my.MultiView.restore = function(state) {
-  var dataset = recline.Model.Dataset.restore(state);
+  // hack-y - restoring a memory dataset does not mean much ... (but useful for testing!)
+  if (state.backend === 'memory') {
+    var datasetInfo = {
+      backend: 'memory',
+      records: [{stub: 'this is a stub dataset because we do not restore memory datasets'}]
+    };
+  } else {
+    var datasetInfo = _.extend({
+        url: state.url,
+        backend: state.backend
+      },
+      state.dataset
+    );
+  }
+  var dataset = new recline.Model.Dataset(datasetInfo);
   var explorer = new my.MultiView({
     model: dataset,
     state: state
@@ -3156,7 +3143,6 @@ my.MultiView.restore = function(state) {
   return explorer;
 }
 
-
 // ## Miscellaneous Utilities
 var urlPathRegex = /^([^?]+)(\?.*)?/;
 

From fd1abd9d5701b4addf7e709c1766d6ffed1bb8bf Mon Sep 17 00:00:00 2001
From: Rufus Pollock 
Date: Thu, 16 Aug 2012 20:32:15 +0100
Subject: [PATCH 2/3] [#2639,bugfix][xs]: bugfix for minor issue with backwards
 compatibility in embed urls.

* Bug: previous recline setup used elasticsearch_url in recline 'state' (dataset part) when generating embed_url for dataset. But recline no longer supports this. Fixed by moving elasticsearch_urlmoving to url attribute of dataset attribute of state.
---
 ckan/controllers/package.py | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/ckan/controllers/package.py b/ckan/controllers/package.py
index dff9a15c8a2..54840c09a4b 100644
--- a/ckan/controllers/package.py
+++ b/ckan/controllers/package.py
@@ -890,6 +890,12 @@ def _parse_recline_state(self, params):
         recline_state.pop('height', None)
         recline_state['readOnly'] = True
 
+        # previous versions of recline setup used elasticsearch_url attribute
+        # for data api url - see http://trac.ckan.org/ticket/2639
+        # fix by relocating this to url attribute which is the default location
+        if 'dataset' in recline_state and 'elasticsearch_url' in recline_state['dataset']:
+            recline_state['dataset']['url'] = recline_state['dataset']['elasticsearch_url']
+
         # Ensure only the currentView is available
         # default to grid view if none specified
         if not recline_state.get('currentView', None):

From 48530a360b4b73cdbf4ecf29b84e9a9de017a8b6 Mon Sep 17 00:00:00 2001
From: Rufus Pollock 
Date: Fri, 17 Aug 2012 11:55:24 +0100
Subject: [PATCH 3/3] [#2639,bugfix][xs]: remove reference to
 recline.Model.Dataset.restore (has been removed from recline) and do the
 dataset restore by hand (trivial).

---
 ckan/public/scripts/application.js | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/ckan/public/scripts/application.js b/ckan/public/scripts/application.js
index 87cba35b006..940dd0640a8 100644
--- a/ckan/public/scripts/application.js
+++ b/ckan/public/scripts/application.js
@@ -1493,7 +1493,13 @@ CKAN.DataPreview = function ($, my) {
     my.$dialog.html('

Loading ...

'); // Restore the Dataset from the given reclineState. - var dataset = recline.Model.Dataset.restore(reclineState); + var datasetInfo = _.extend({ + url: reclineState.url, + backend: reclineState.backend + }, + reclineState.dataset + ); + var dataset = new recline.Model.Dataset(datasetInfo); // Only create the view defined in reclineState.currentView. // TODO: tidy this up.