diff options
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 |
commit | 862f795c2a2067510d10fdabdaec7c2e491a78ed (patch) | |
tree | 4ff776593245faf3352bfcf4af35477344093e73 /chimere/views.py | |
parent | 7ddf224de3f1f751f00ebc883404f1424f018c3e (diff) | |
download | Chimè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.py | 56 |
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): |