web/views/igeocodable.py
changeset 8830 7fd6c52ef878
parent 8190 2a3c1b787688
--- a/web/views/igeocodable.py	Mon Feb 11 11:47:50 2013 +0100
+++ b/web/views/igeocodable.py	Mon Dec 17 14:03:56 2012 +0100
@@ -17,121 +17,21 @@
 # with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
 """Specific views for entities implementing IGeocodable"""
 
-__docformat__ = "restructuredtext en"
-
-from cubicweb.interfaces import IGeocodable
-from cubicweb.view import EntityView, EntityAdapter, implements_adapter_compat
-from cubicweb.predicates import implements, adaptable
-from cubicweb.utils import json_dumps
-
-class IGeocodableAdapter(EntityAdapter):
-    """interface required by geocoding views such as gmap-view"""
-    __needs_bw_compat__ = True
-    __regid__ = 'IGeocodable'
-    __select__ = implements(IGeocodable, warn=False) # XXX for bw compat, should be abstract
-
-    @property
-    @implements_adapter_compat('IGeocodable')
-    def latitude(self):
-        """returns the latitude of the entity in degree (-90 < float < +90)"""
-        raise NotImplementedError
+try:
+    from cubes.geocoding.views import (IGeocodableAdapter,
+                                       GeocodingJsonView,
+                                       GoogleMapBubbleView,
+                                       GoogleMapsView,
+                                       GoogeMapsLegend)
 
-    @property
-    @implements_adapter_compat('IGeocodable')
-    def longitude(self):
-        """returns the longitude of the entity in degree (-180 < float < +180)"""
-        raise NotImplementedError
-
-    @implements_adapter_compat('IGeocodable')
-    def marker_icon(self):
-        """returns the icon that should be used as the marker.
-
-        an icon is defined by a 4-uple:
-
-          (icon._url, icon.size,  icon.iconAnchor, icon.shadow)
-        """
-        return (self._cw.uiprops['GMARKER_ICON'], (20, 34), (4, 34), None)
-
-
-class GeocodingJsonView(EntityView):
-    __regid__ = 'geocoding-json'
-    __select__ = adaptable('IGeocodable')
-
-    binary = True
-    templatable = False
-    content_type = 'application/json'
+    from logilab.common.deprecation import class_moved
 
-    def call(self):
-        zoomlevel = self._cw.form.pop('zoomlevel', None)
-        extraparams = self._cw.form.copy()
-        extraparams.pop('vid', None)
-        extraparams.pop('rql', None)
-        markers = []
-        for entity in self.cw_rset.entities():
-            igeocodable = entity.cw_adapt_to('IGeocodable')
-            # remove entities that don't define latitude and longitude
-            if not (igeocodable.latitude and igeocodable.longitude):
-                continue
-            markers.append(self.build_marker_data(entity, igeocodable,
-                                                  extraparams))
-        if not markers:
-            return
-        geodata = {
-            'markers': markers,
-            }
-        if zoomlevel:
-            geodata['zoomlevel'] = int(zoomlevel)
-        self.w(json_dumps(geodata))
-
-    def build_marker_data(self, entity, igeocodable, extraparams):
-        return {'latitude': igeocodable.latitude,
-                'longitude': igeocodable.longitude,
-                'icon': igeocodable.marker_icon(),
-                'title': entity.dc_long_title(),
-                'bubbleUrl': entity.absolute_url(
-                    vid='gmap-bubble', __notemplate=1, **extraparams),
-                }
-
-
-class GoogleMapBubbleView(EntityView):
-    __regid__ = 'gmap-bubble'
-    __select__ = adaptable('IGeocodable')
-
-    def cell_call(self, row, col):
-        entity = self.cw_rset.get_entity(row, col)
-        self.w(u'<div>%s</div>' % entity.view('oneline'))
-        # FIXME: we should call something like address-view if available
-
-
-class GoogleMapsView(EntityView):
-    __regid__ = 'gmap-view'
-    __select__ = adaptable('IGeocodable')
-
-    paginable = False
-
-    def call(self, gmap_key, width=400, height=400, uselabel=True, urlparams=None):
-        self._cw.demote_to_html()
-        self._cw.add_js('http://maps.google.com/maps?sensor=false&file=api&v=2&key=%s'
-                        % gmap_key, localfile=False)
-        self._cw.add_js( ('cubicweb.widgets.js', 'cubicweb.gmap.js', 'gmap.utility.labeledmarker.js') )
-        rql = self.cw_rset.printable_rql()
-        if urlparams is None:
-            loadurl = self._cw.build_url(rql=rql, vid='geocoding-json')
-        else:
-            loadurl = self._cw.build_url(rql=rql, vid='geocoding-json', **urlparams)
-        self.w(u'<div style="width: %spx; height: %spx;" class="widget gmap" '
-               u'cubicweb:wdgtype="GMapWidget" cubicweb:loadtype="auto" '
-               u'cubicweb:loadurl="%s" cubicweb:uselabel="%s"> </div>'
-               % (width, height, loadurl, uselabel))
-
-
-class GoogeMapsLegend(EntityView):
-    __regid__ = 'gmap-legend'
-
-    def call(self):
-        self.w(u'<ol>')
-        for rowidx in xrange(len(self.cw_rset)):
-            self.w(u'<li>')
-            self.wview('listitem', self.cw_rset, row=rowidx, col=0)
-            self.w(u'</li>')
-        self.w(u'</ol>')
+    msg = '[3.17] cubicweb.web.views.igeocodable moved to cubes.geocoding.views'
+    IGeocodableAdapter = class_moved(IGeocodableAdapter, message=msg)
+    GeocodingJsonView = class_moved(GeocodingJsonView, message=msg)
+    GoogleMapBubbleView = class_moved(GoogleMapBubbleView, message=msg)
+    GoogleMapsView = class_moved(GoogleMapsView, message=msg)
+    GoogeMapsLegend = class_moved(GoogeMapsLegend, message=msg)
+except ImportError:
+    from cubicweb.web import LOGGER
+    LOGGER.warning('[3.17] igeocoding extracted to cube geocoding that was not found. try installing it.')