[views] Add goto CKAN dataset link
authorDenis Laxalde <denis.laxalde@logilab.fr>
Tue, 09 Dec 2014 16:28:26 +0100
changeset 20 e7ff8cdf0adf
parent 19 d88cc9dbf6d6
child 40 d7f97a999d12
[views] Add goto CKAN dataset link Backported from client application.
views.py
--- a/views.py	Mon Nov 24 15:49:18 2014 +0100
+++ b/views.py	Tue Dec 09 16:28:26 2014 +0100
@@ -15,3 +15,47 @@
 # with this program. If not, see <http://www.gnu.org/licenses/>.
 
 """cubicweb-ckanpublish views/forms/actions/components for web ui"""
+
+from urlparse import urljoin
+
+from logilab.mtconverter import xml_escape
+
+from cubicweb.predicates import score_entity
+from cubicweb.web import component
+
+from cubes.ckanpublish.utils import ckan_post
+
+
+_ = unicode
+
+
+class GotoCKANDatasetComponent(component.EntityCtxComponent):
+    """Contextual component displaying a link to the CKAN dataset in
+    Dataset-like entities primary view.
+    """
+    __regid__ = 'ckanpublish.goto-ckan-dataset'
+    __select__ = (component.EntityCtxComponent.__select__ &
+                  score_entity(lambda x: hasattr(x, 'ckan_dataset_id')))
+    title = _('CKAN dataset')
+    context = 'incontext'
+
+    _ckan_response = None
+
+    def init_rendering(self):
+        super(GotoCKANDatasetComponent, self).init_rendering()
+        config = self._cw.vreg.config
+        entity = self._cw.entity_from_eid(self.cw_rset[0][0])
+        try:
+            r = ckan_post(config, 'package_show',
+                          {'id': entity.ckan_dataset_id})
+        except Exception as exc:
+            self._cw.warning('fail to post to CKAN instance: %s', exc)
+            raise component.EmptyComponent()
+        self._ckan_response = r
+
+    def render_body(self, w):
+        r = self._ckan_response
+        config = self._cw.vreg.config
+        base = config['ckan-baseurl']
+        url = urljoin(base, 'dataset/' + xml_escape(r['name']))
+        w(u'<a target=_blank href="%s">%s<a/>' % (url, xml_escape(url)))