web/views/igeocodable.py
changeset 0 b97547f5f1fa
child 431 18b4dd650ef8
equal deleted inserted replaced
-1:000000000000 0:b97547f5f1fa
       
     1 # -*- coding: utf-8 -*-
       
     2 
       
     3 import simplejson
       
     4 
       
     5 from cubicweb.interfaces import IGeocodable
       
     6 from cubicweb.common.view import EntityView
       
     7 from cubicweb.common.selectors import interface_selector
       
     8 
       
     9 class GeocodingJsonView(EntityView):
       
    10     id = 'geocoding-json'
       
    11     binary = True
       
    12     templatable = False
       
    13     content_type = 'application/json'
       
    14 
       
    15     __selectors__ = (interface_selector,)
       
    16     accepts_interfaces = (IGeocodable,)
       
    17     
       
    18     def call(self):
       
    19         extraparams = self.req.form.copy()
       
    20         extraparams.pop('vid', None)
       
    21         extraparams.pop('rql', None)
       
    22         markers = [self.build_marker_data(rowidx, extraparams)
       
    23                    for rowidx in xrange(len(self.rset))]
       
    24         center = {
       
    25             'latitude': sum(marker['latitude'] for marker in markers) / len(markers),
       
    26             'longitude': sum(marker['longitude'] for marker in markers) / len(markers),
       
    27             }
       
    28         geodata = {
       
    29             'center': center,
       
    30             'markers': markers,
       
    31             }
       
    32         self.w(simplejson.dumps(geodata))
       
    33         
       
    34     def build_marker_data(self, row, extraparams):
       
    35         entity = self.entity(row, 0)
       
    36         return {'latitude': entity.latitude, 'longitude': entity.longitude,
       
    37                 'title': entity.dc_long_title(),
       
    38                 #icon defines : (icon._url, icon.size,  icon.iconAncho', icon.shadow)
       
    39                 'icon': entity.marker_icon() or (self.req.external_resource('GMARKER_ICON'), (20, 34), (4, 34), None), 
       
    40                 'bubbleUrl': entity.absolute_url(vid='gmap-bubble', __notemplate=1, **extraparams),
       
    41                 }
       
    42 
       
    43 
       
    44 class GoogleMapBubbleView(EntityView):
       
    45     id = 'gmap-bubble'
       
    46     
       
    47     __selectors__ = (interface_selector,)
       
    48     accepts_interfaces = (IGeocodable,)
       
    49     
       
    50     def cell_call(self, row, col):
       
    51         entity = self.entity(row, col)
       
    52         self.w(u'<div>%s</div>' % entity.view('oneline'))
       
    53         # FIXME: we should call something like address-view if available
       
    54         
       
    55 
       
    56 class GoogleMapsView(EntityView):
       
    57     id = 'gmap-view'
       
    58     
       
    59     __selectors__ = (interface_selector,)
       
    60     accepts_interfaces = (IGeocodable,)
       
    61     need_navigation = False
       
    62     
       
    63     def call(self, gmap_key, width=400, height=400, uselabel=True, urlparams=None):
       
    64         self.req.add_js('http://maps.google.com/maps?file=api&amp;v=2&amp;key=%s' % gmap_key,
       
    65                         localfile=False);
       
    66         self.req.add_js( ('cubicweb.widgets.js', 'cubicweb.gmap.js', 'gmap.utility.labeledmarker.js') )
       
    67         rql = self.rset.printable_rql()
       
    68         if urlparams is None:
       
    69             loadurl = self.build_url(rql=rql, vid='geocoding-json')
       
    70         else:
       
    71             loadurl = self.build_url(rql=rql, vid='geocoding-json', **urlparams)
       
    72         self.w(u'<div style="width: %spx; height: %spx;" class="widget gmap" '
       
    73                u'cubicweb:wdgtype="GMapWidget" cubicweb:loadtype="auto" ' 
       
    74                u'cubicweb:loadurl="%s" cubicweb:uselabel="%s"> </div>' % (width, height, loadurl, uselabel))
       
    75 
       
    76         
       
    77 class GoogeMapsLegend(EntityView):
       
    78     id = 'gmap-legend'
       
    79     
       
    80     def call(self):
       
    81         self.w(u'<ol>')
       
    82         for rowidx in xrange(len(self.rset)):
       
    83             self.w(u'<li>')
       
    84             self.wview('listitem', self.rset, row=rowidx, col=0)
       
    85             self.w(u'</li>')
       
    86         self.w(u'</ol>')