summaryrefslogtreecommitdiff
path: root/chimere/views.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2016-08-01 18:56:55 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2016-08-01 18:56:55 +0200
commit862f795c2a2067510d10fdabdaec7c2e491a78ed (patch)
tree4ff776593245faf3352bfcf4af35477344093e73 /chimere/views.py
parent7ddf224de3f1f751f00ebc883404f1424f018c3e (diff)
downloadChimère-862f795c2a2067510d10fdabdaec7c2e491a78ed.tar.bz2
Chimère-862f795c2a2067510d10fdabdaec7c2e491a78ed.zip
Manage agregation on higher zoom
* json give the needed zoom to have full access on objects * js reload items when the needed zoom is reach * on click on aggregated item zoom to the needed zoom to have access to items
Diffstat (limited to 'chimere/views.py')
-rw-r--r--chimere/views.py56
1 files changed, 40 insertions, 16 deletions
diff --git a/chimere/views.py b/chimere/views.py
index 6e0eb40..8eaa83a 100644
--- a/chimere/views.py
+++ b/chimere/views.py
@@ -749,14 +749,35 @@ def checkDate(q):
def _getGeoObjects(area_name, category_ids, status='A', getjson=True,
- aggregated=False, item_types=('Marker', 'Route',
- 'Polygon'),
- bounding_box=None):
+ item_types=('Marker', 'Route', 'Polygon'),
+ bounding_box=None, zoom_level=None):
'''
Get geo objects
'''
+ zoom_need_reload = None
items = []
empty = [] if not getjson else {}
+ subcategories = list(
+ SubCategory.getAvailable(None, area_name, public=True,
+ instance=True).all())
+ aggregated_category_ids = []
+ try:
+ zoom_level = int(zoom_level)
+ except ValueError:
+ zoom_level = None
+ if zoom_level:
+ # pop from main category list
+ len_subcats = len(subcategories)
+ for idx, subcat in enumerate(reversed(subcategories)):
+ if not subcat.min_zoom:
+ continue
+ if zoom_level < subcat.min_zoom:
+ if not zoom_need_reload or zoom_need_reload > subcat.min_zoom:
+ zoom_need_reload = subcat.min_zoom
+ aggregated_category_ids.append(
+ subcategories.pop(len_subcats - 1 - idx).pk)
+
+ category_ids = [subcat.pk for subcat in subcategories]
# marker
if 'Marker' in item_types:
@@ -767,9 +788,8 @@ def _getGeoObjects(area_name, category_ids, status='A', getjson=True,
query = query.filter(point__contained=bounding_box)
query = query.distinct('pk').order_by('-pk')
except:
- return empty
+ return empty, zoom_need_reload
- category_ids = [int(cat_id) for cat_id in category_ids]
if getjson:
for geo_object in list(query):
items += json.loads(geo_object.getGeoJSON(category_ids))
@@ -785,12 +805,12 @@ def _getGeoObjects(area_name, category_ids, status='A', getjson=True,
query = query.filter(polygon__contained=bounding_box)
query = query.distinct('pk').order_by('-pk')
except:
- return empty
+ return empty, zoom_need_reload
- category_ids = [int(cat_id) for cat_id in category_ids]
- if aggregated:
+ if aggregated_category_ids:
query = AggregatedPolygon.objects.filter(
- status__in=status, subcategory__in=category_ids).order_by(
+ status__in=status,
+ subcategory__in=aggregated_category_ids).order_by(
'subcategory', '-pk')
# no bounding box filter
if getjson:
@@ -840,8 +860,8 @@ def _getGeoObjects(area_name, category_ids, status='A', getjson=True,
items += list(query)
if not items:
- return empty
- return items
+ return empty, zoom_need_reload
+ return items, zoom_need_reload
def getGeoObjects(request, area_name, category_ids, status):
@@ -862,12 +882,15 @@ def getGeoObjects(request, area_name, category_ids, status):
bounding_box.append(value)
if bounding_box:
bounding_box = GEOSPolygon.from_bbox(bounding_box)
+ zoom_level = request.GET.get('zoom_level', None)
- jsons = _getGeoObjects(area_name, category_ids, status,
- bounding_box=bounding_box)
+ jsons, zoom_need_reload = _getGeoObjects(
+ area_name, category_ids, status, bounding_box=bounding_box,
+ zoom_level=zoom_level)
if not jsons:
return HttpResponse("[]", content_type="application/json")
- data = json.dumps({"type": "FeatureCollection", "features": jsons})
+ data = json.dumps({"type": "FeatureCollection", "features": jsons,
+ "zoom_need_reload": zoom_need_reload or ''})
return HttpResponse(data, content_type="application/json")
@@ -1058,8 +1081,9 @@ class CategoryView(TemplateView):
if not self.category:
raise Http404(_("Category does not exist"))
- items = _getGeoObjects(self.area_name, [unicode(self.category.pk)],
- getjson=False, item_types=('Marker',))
+ items, zoom_need_reload = _getGeoObjects(
+ self.area_name, [unicode(self.category.pk)], getjson=False,
+ item_types=('Marker',))
return items
def get_context_data(self, *args, **kwargs):