Google Maps Templatetag

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
from django import template
from django.template import Library
from django.template import RequestContext
from django.template import resolve_variable

GOOGLE_MAPS_API_KEY = {
    "site1":"XXXXXAApNC8VraKxjnpTrC4pax3IRQTfsoMw3qz_e-LauZzPBIws5p_nhSKlQQunTrdkST45GbLxANehi-oSQ",
    "site2":"FFSDFGSDFGSDFGSDFGrC4pax3IRSA7oaebcwS_GFScocy27dna4926BSle32YWjKmaH2Q-oFoR7xr_lzKAQ",
    "site3":"ABQIAAAAXXXXXXXXXnpTrC4pax3IRTjlGRJ-JcA4ENdYSxSTUELqnaldxSXtgc7J9ZfVENFwQjXVhQX0f824A",
}
CURRENT_SITE = "site3"

register = Library()

INCLUDE_TEMPLATE = """
<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=%s" type="text/javascript"></script>
""" % (GOOGLE_MAPS_API_KEY [ CURRENT_SITE ] , )

BASIC_TEMPLATE = """
<div id="map_%s" style="width:%spx;height:%spx;"></div>
<script>
function create_map_%s() {
   if (GBrowserIsCompatible()) {
    var map = new GMap2(document.getElementById("map_%s"));
    map.enableDoubleClickZoom();
    map.enableContinuousZoom();
    map.addControl(new GSmallMapControl());
    map.addControl(new GMapTypeControl());
    map.setCenter(new GLatLng(%s,%s), %s, map.getMapTypes()[%d]);

    var point = map.getCenter();
    var m = new GMarker(point);
    GEvent.addListener(m, "click", function() {
       m.openInfoWindowHtml("%s");
    });
    map.addOverlay(m);
    return map;
   }
}
</script>
"""
# {% gmap name:mimapa width:300 height:300 latitude:x longitude:y zoom:20 view:hybrid %} Message for a marker at that point {% endgmap %}

class GMapNode (template.Node):
    def __init__(self, params, nodelist):
        self.params = params
        self.nodelist = nodelist
        
    def render (self, context):
        for k,v in self.params.items():
            try:
                self.params[k] = resolve_variable(v, context)
            except:
                pass
            if k == "view":
                if v=="satellite": 
                    v = 1
                elif v=="map":
                    v = 0
                else:
                    v = 2
                self.params[k] = v
        self.params["message"] = self.nodelist.render(context).replace("\n", "<br />")
        return BASIC_TEMPLATE % (self.params['name'], self.params['width'], self.params['height'], self.params['name'], self.params['name'], self.params['latitude'], self.params['longitude'], self.params['zoom'], self.params['view'], self.params['message'])

def do_gmap(parser, token):
    items = token.split_contents()

    nodelist = parser.parse(('endgmap',))
    parser.delete_first_token()
    
    #Default values 
    parameters={
            'name'      : "default",
            'width'     : "300",
            'height'    : "300",
            'latitude'  : "33",
            'longitude' : "-3",
            'zoom'      : "15",
            'view'      : "hybrid", # map, satellite, hybrid
            'message'   : "No message",
    }
    for item in items[1:]:
        param, value = item.split(":")
        param = param.strip()
        value = value.strip()
        
        if parameters.has_key(param):
            if value[0]=="\"":
                value = value[1:-1]
            parameters[param] = value
        
    return GMapNode(parameters, nodelist)

class GMapScriptNode (template.Node):
    def __init__(self):
        pass        
    def render (self, context):
        return INCLUDE_TEMPLATE

def do_gmap_script(parser, token):
    try:
        tag_name = token.split_contents()
    except ValueError:
        raise template.TemplateSyntaxError("La etiqueta no requiere argumentos" % token.contents[0])
    return GMapScriptNode()

register.tag('gmap', do_gmap)
register.tag('gmap-script', do_gmap_script)

More like this

  1. head inclusion middleware by bowdengm 5 years, 2 months ago
  2. GoogleAdmin: GMaps base layer in Geographic Admin (GeoDjango) by jbronn 5 years, 6 months ago
  3. A dict template tag by Batiste 5 years, 12 months ago
  4. Google map on admin address field by coulix 3 years, 8 months ago
  5. Git Revision Template Tag by sbaechler 1 year, 5 months ago

Comments

dad (on July 22, 2007):

The function create_map_%s isn't call by my broswer, so no call no map.

I use onload proprety of [HTML_REMOVED] but it may have a better solution.

#

arsatiki (on September 25, 2007):

On row 64 you have a very long string formatting line, where all the formatting elements come from self.params. You can simplify the line and improve the readability of the BASIC_TEMPLATE variable by using parenthesised mapping keys. So instead of writing

<div id="map_%s" style="width:%spx;height:%spx;"></div>

you'd use

<div id="map_%(name)s" style="width:%(width)spx;height:%(height)spx;"></div>

And then the actual formatting line would be simply:

return BASIC_TEMPLATE % self.params

#

justquick (on April 26, 2008):

This belongs in the python section!

#

bcurtu (on August 21, 2008):

I use jquery as js lib, so I have added:

jQuery(document).ready(function(){ create_map_%s(); });

rather than onload

#

anentropic (on November 22, 2009):

is this a typo: map.getMapTypes()[%d]

should it be: map.getMapTypes()[%s] ?

or: map.getMapTypes()[%(view)s] if you do as arsatiki suggests (good tip!)

#

(Forgotten your password?)