diff options
-rw-r--r-- | chimere/models.py | 8 | ||||
-rw-r--r-- | chimere/static/chimere/js/jquery.chimere.js | 18 | ||||
-rw-r--r-- | chimere/views.py | 56 |
3 files changed, 63 insertions, 19 deletions
diff --git a/chimere/models.py b/chimere/models.py index 9f3734d..2f6999e 100644 --- a/chimere/models.py +++ b/chimere/models.py @@ -291,7 +291,8 @@ class SubCategory(models.Model): return u"%s / %s" % (self.category.name, self.name) @classmethod - def getAvailable(cls, item_types=None, area_name=None, public=False): + def getAvailable(cls, item_types=None, area_name=None, public=False, + instance=False): '''Get list of tuples with first the category and second the associated subcategories ''' @@ -312,6 +313,10 @@ class SubCategory(models.Model): subcategories = subcategories.filter(id__in=sub_ids) selected_cats = [subcat.pk for subcat in area.default_subcategories.all()] + + if instance: + return subcategories.order_by('order') + for sub_category in subcategories.order_by('order'): if sub_category.category not in sub_categories: sub_categories[sub_category.category] = [] @@ -319,7 +324,6 @@ class SubCategory(models.Model): sub_category.selected = True sub_category.category.selected = True sub_categories[sub_category.category].append(sub_category) - subcategories = [(cat, subcats) for cat, subcats in sub_categories.items()] get_cat_order = lambda cat_tuple: cat_tuple[0].order diff --git a/chimere/static/chimere/js/jquery.chimere.js b/chimere/static/chimere/js/jquery.chimere.js index 2fd94a4..a1490ef 100644 --- a/chimere/static/chimere/js/jquery.chimere.js +++ b/chimere/static/chimere/js/jquery.chimere.js @@ -839,13 +839,17 @@ function transform(obj) { map.getView().calculateExtent(map.getSize()), EPSG_PROJECTION, EPSG_DISPLAY_PROJECTION ); + var current_zoom = settings.map.getView().getZoom(); var init; if (!settings._cache_boundingbox) init = true; if (init || !ol.extent.containsCoordinate(settings._cache_boundingbox, - current_extent)){ + current_extent) || + (settings._zoom_need_reload && + current_zoom >= settings._zoom_need_reload) + ){ // enlarge current extent to cache values x_extent = Math.abs(current_extent[2] - current_extent[0]); y_extent = Math.abs(current_extent[3] - current_extent[1]); @@ -854,6 +858,7 @@ function transform(obj) { current_extent[2] = current_extent[2] + x_extent; current_extent[3] = current_extent[3] + y_extent; settings._cache_boundingbox = current_extent; + settings._cache_zoom = current_zoom; if(!init) methods.loadGeoObjects(); } @@ -1048,6 +1053,7 @@ function transform(obj) { 'min_lat': settings._cache_boundingbox[1], 'max_lon': settings._cache_boundingbox[2], 'max_lat': settings._cache_boundingbox[3], + 'zoom_level': settings._cache_zoom }; } $.ajax({url: uri, @@ -1064,6 +1070,9 @@ function transform(obj) { settings.layerCluster.removeAllFeatures(); } if (!data.features) return; + if (data.zoom_need_reload){ + settings._zoom_need_reload = data.zoom_need_reload; + } for (var i = 0; i < data.features.length; i++) { var feature = data.features[i]; if (feature.geometry.type == 'Point'){ @@ -2087,6 +2096,13 @@ function transform(obj) { * update current detail panel with an AJAX request */ var uri = extra_url + if (key.length > 3 && key.substring(0, 3) == 'agg' && settings._zoom_need_reload){ + var current_zoom = settings.map.getView().getZoom(); + if (current_zoom < settings._zoom_need_reload){ + settings.map.getView().setZoom(settings._zoom_need_reload); + } + return + } if (settings.area_id) uri += settings.area_id + "/" uri += "getDetail/" + key; var params = {} 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): |