Commits

Mikhail Korobov committed 36a3e36

Новый template-tag 'yandex_map'. Теги и фильтры теперь умеют принимать адрес строкой в качестве аргумента, кешируя результаты геокодирования в базе. Дописан README.

Comments (0)

Files changed (9)

 
 #my files
 my_tests.py
+db.sqlite
 
 2. Добавить 'yandex_maps' в INSTALLED_APPS
 
-TODO: дописать
+3. Выполнить ``./manage.py syncdb`` (или ``./manage.py migrate``,
+   если используется south)
+
+3. В шаблоне теперь можно использовать тег yandex_map::
+
+       {% load yandex_maps_tags %}
+
+       <!-- Пример с явным указанием адреса -->
+       {% yandex_map "Екатеринбург, Мира 32" 300 400 %}
+
+       <!-- Пример с адресом в переменной и явным указанием уровня детализации карты -->
+       {% yandex_map address 200 200 5 %}
+
+   и фильтр static_map_url::
+
+       {% load yandex_maps_tags %}
+       <img src='{{ "Санкт-Петербург, ул. Бумажная 4"|static_map_url:"300,200,13" }}'>
+
+   Координаты будут получены через обращение к API Яндекс.Карт при первом
+   обращении и затем сохранятся в базу. В дальнейшем координаты для карты будут
+   браться из базы. При необходимости можно воспользовавшись кешированием в
+   шаблонах, чтобы обойтись для вывода карты без запроса к базе.
+

yandex_maps/models.py

 #coding: utf-8
 from django.db import models
 from django.conf import settings
-from django.utils.encoding import smart_str
-
 from yandex_maps import api
 
 YANDEX_KEY = getattr(settings, 'YANDEX_MAPS_API_KEY', None)
         w = int(width) if width else settings.YANDEX_MAPS_W
         h = int(height) if height else settings.YANDEX_MAPS_H
         detail_level = int(detail_level) or self.get_detail_level()
+
         if YANDEX_KEY is not None:
             return api.get_map_url(YANDEX_KEY, self.longtitude, self.latitude, detail_level, w, h)
         else:
 
     def fill_geocode_data(self):
         if YANDEX_KEY is not None:
-            self.longtitude, self.latitude = api.geocode(settings.YANDEX_MAPS_API_KEY, smart_str(self.address))
+            self.longtitude, self.latitude = api.geocode(settings.YANDEX_MAPS_API_KEY, self.address)
 
     def save(self, *args, **kwargs):
-        if self.pk or (self.longtitude is None) or (self.latitude is None): # don't fill geocode data if it is known already
+        # fill geocode data if it is unknown
+        if self.pk or (self.longtitude is None) or (self.latitude is None):
             self.fill_geocode_data()
         super(MapAndAddress, self).save(*args, **kwargs)
 
     def __unicode__(self):
         return self.address
-

yandex_maps/templatetags/yandex_maps.py

-#coding: utf-8
-from django import template
-
-register = template.Library()
-
-@register.filter
-def static_map_url(address, params=None):
-    ''' Фильтр, который возвращает URL картинки с картой.
-        Применять на объект класса MapAndAddress.
-        Параметры: ширина, высота, уровень детализации - через запятую
-        без пробелов.
-    '''
-    data = [] if params is None else params.split(",")
-    try:
-        return address.get_map_url(*data)
-    except:
-        return ''

yandex_maps/templatetags/yandex_maps_tags.py

+#coding: utf-8
+from django import template
+from django.utils.html import conditional_escape
+from yandex_maps.models import MapAndAddress
+register = template.Library()
+
+def _url_for(address, *args, **kwargs):
+    if not isinstance(address, MapAndAddress):
+        address, created = MapAndAddress.objects.get_or_create(address=address)
+    try:
+        return address.get_map_url(*args, **kwargs)
+    except:
+        return ''
+
+@register.filter
+def static_map_url(address, params=None):
+    '''Фильтр, который возвращает URL картинки с картой.
+    Можно применять к объекту класса MapAndAddress или к строке с адресом.
+    Параметры: ширина, высота, уровень детализации - через запятую без пробелов.
+
+    Пример:
+
+        <img src='{{ address|static_map_url:"300,200" }}'>
+
+    '''
+    data = [] if params is None else params.split(",")
+    return _url_for(address, *data)
+
+
+@register.simple_tag
+def yandex_map(address, width, height, zoom = 14):
+    '''Тег, который выводит <img> с картой.
+
+    Параметры:
+
+        1. адрес (строка или объект класса MapAndAddress)
+        2. ширина
+        3. высота
+        4. уровень детализации (по умолчанию = 14)
+
+    Пример:
+
+        {% yandex_map "Санкт-Петербург, ул. Бумажная 4" 300 200 8 %}
+
+    '''
+    url = _url_for(address, width, height, zoom)
+    return "<img src='%s' width='%s' height='%s' alt='%s' />" % (
+             url, width, height, conditional_escape(address))

yandex_maps_tests/settings.py

 PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
 sys.path.insert(0, os.path.abspath(os.path.join(PROJECT_ROOT, '..')))
 
+DEBUG = True
 DATABASE_ENGINE = 'sqlite3'
-DATABASE_NAME = ':memory:'
+DATABASE_NAME = 'db.sqlite'
 ROOT_URLCONF = 'urls'
 TEMPLATE_DIRS = (os.path.join(PROJECT_ROOT, 'templates'),)
 
-YANDEX_MAPS_API_KEY = 'sdfkjhg'
+# мой ключ для домена example.com
+YANDEX_MAPS_API_KEY = "AOmQeUwBAAAAxp1AOQIAlTD0uSCCp1ukf-GmyqC5tbvCGAgAAAAAAAAAAAAeazHdQX6EPpcOJnuUPR-QlXyJPQ=="
+
 INSTALLED_APPS=(
     'yandex_maps',
     'test_app',
+#    'devserver',
 #    'south'
 )

yandex_maps_tests/templates/500.html

+500

yandex_maps_tests/templates/index.html

+<html>
+    <body>
+        {% load yandex_maps_tags %}
+        <img src='{{ "Санкт-Петербург, ул. Бумажная 4"|static_map_url:"300,200,13" }}'>
+        {% yandex_map "Екатеринбург, Мира 32" 300 400 %}
+    </body>
+</html>

yandex_maps_tests/urls.py

 from django.conf.urls.defaults import *
+from django.views.generic.simple import direct_to_template
 
 urlpatterns = patterns('',
     url(r'^yandex/', include('yandex_maps.urls')),
+    url(r'^$', direct_to_template, {'template': 'index.html'}, 'index')
 )
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.