summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chimere/models.py45
-rw-r--r--chimere/views.py6
2 files changed, 48 insertions, 3 deletions
diff --git a/chimere/models.py b/chimere/models.py
index e0b401b..e99a9cf 100644
--- a/chimere/models.py
+++ b/chimere/models.py
@@ -905,6 +905,51 @@ class Marker(GeographicItem):
return json.dumps(jsons)
+ @classmethod
+ def getGeoJSONs(self, queryset, limit_to_categories=[]):
+ vals = []
+ q = queryset.select_related('categories').extra(
+ select={'json': 'ST_AsGeoJSON(point)'}).values(
+ 'json', 'name', 'pk', 'categories__pk')
+ added, cats = [], {}
+ for item in q.all():
+ if item['pk'] in added:
+ continue
+ if limit_to_categories and \
+ item["categories__pk"] not in limit_to_categories:
+ continue
+ if item['categories__pk'] not in cats:
+ try:
+ cat = SubCategory.objects.get(
+ available=True, pk=item['categories__pk'])
+ except SubCategory.DoesNotExist:
+ continue
+ cats[item['categories__pk']] = {
+ 'icon_path': unicode(cat.icon.image),
+ 'icon_hover_path': unicode(cat.hover_icon.image)
+ if cat.hover_icon else '',
+ 'icon_offset_x': cat.icon.offset_x,
+ 'icon_offset_y': cat.icon.offset_y,
+ 'icon_popup_offset_x': cat.icon.popup_offset_x,
+ 'icon_popup_offset_y': cat.icon.popup_offset_y,
+ 'category_name': cat.name}
+ try:
+ cats[item['categories__pk']].update(
+ {'icon_width': cat.icon.image.width,
+ 'icon_height': cat.icon.image.height,
+ })
+ except IOError:
+ pass
+ dct = {
+ "type": "Feature",
+ "geometry": json.loads(item['json']),
+ "properties": {"pk": item['pk'], "name": item['name'],
+ 'key': "marker-{}".format(item['pk'])}}
+ dct['properties'].update(cats[item['categories__pk']])
+ vals.append(dct)
+ added.append(item['pk'])
+ return vals
+
@property
def default_category(self):
# Should we select only available ones ?
diff --git a/chimere/views.py b/chimere/views.py
index f9a9bf9..af8dc67 100644
--- a/chimere/views.py
+++ b/chimere/views.py
@@ -752,7 +752,7 @@ def _getGeoObjects(area_name, category_ids, status='A', getjson=True,
aggregated_category_ids = []
try:
zoom_level = int(zoom_level)
- except ValueError:
+ except (ValueError, TypeError):
zoom_level = None
if zoom_level:
# pop from main category list
@@ -780,8 +780,8 @@ def _getGeoObjects(area_name, category_ids, status='A', getjson=True,
return empty, zoom_need_reload
if getjson:
- for geo_object in list(query):
- items += json.loads(geo_object.getGeoJSON(category_ids))
+ items += Marker.getGeoJSONs(
+ query, limit_to_categories=category_ids)
else:
items += list(query)