diff options
| author | Étienne Loks <etienne.loks@iggdrasil.net> | 2016-03-09 12:23:49 +0100 |
|---|---|---|
| committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2016-03-09 12:23:49 +0100 |
| commit | 98e523350c4eeb2bfe2b1d31666c301724749305 (patch) | |
| tree | a976bf8c56a7e2fe5a3a0c5b5235a84649afda33 /chimere/views.py | |
| parent | ec9676ef71f859a85707ab712568bf9d7f83b392 (diff) | |
| download | Chimère-98e523350c4eeb2bfe2b1d31666c301724749305.tar.bz2 Chimère-98e523350c4eeb2bfe2b1d31666c301724749305.zip | |
Custom color for each feature - better management of display details - show polygon on main map!
Diffstat (limited to 'chimere/views.py')
| -rw-r--r-- | chimere/views.py | 102 |
1 files changed, 80 insertions, 22 deletions
diff --git a/chimere/views.py b/chimere/views.py index 6cf16aa..7315ee1 100644 --- a/chimere/views.py +++ b/chimere/views.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -# Copyright (C) 2008-2015 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> +# Copyright (C) 2008-2016 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> # # RSS : Copyright (C) 2010 Pierre Clarenc <pierre.crc_AT_gmailDOTcom>, # Samuel Renard <renard.samuel_AT_gmailDOTcom>, @@ -46,7 +46,7 @@ from django.views.generic import TemplateView, ListView from chimere.actions import actions from chimere.models import Category, SubCategory, PropertyModel, Page,\ - Marker, Route, SimpleArea, Area, Color, TinyUrl, RouteFile,\ + Marker, Route, Polygon, SimpleArea, Area, Color, TinyUrl, RouteFile,\ AggregatedRoute from chimere.widgets import PointChooserWidget, RouteChooserWidget, AreaWidget @@ -565,13 +565,23 @@ def extraPage(request, area_name="", page_id=""): context_instance=RequestContext(request)) -def getDetail(request, area_name, marker_id): +def getDetail(request, area_name, key): ''' - Get the detail for a marker + Get the detail of a geographic item ''' + cls = Marker + pk = key + if '-' in key: + geo_type, pk = key.split('-') + if geo_type == 'route': + cls = Route + elif geo_type == 'aggroute': + cls = AggregatedRoute + elif geo_type == 'polygon': + cls = Polygon try: - marker = Marker.objects.filter(id=int(marker_id), - status__in=['A', 'S'])[0] + marker = cls.objects.filter(id=int(pk), + status__in=['A', 'S'])[0] except (ValueError, IndexError): return HttpResponse('no results') response_dct, redir = get_base_response(request, area_name) @@ -630,12 +640,11 @@ def checkDate(q): def _getGeoObjects(area_name, category_ids, status='A', getjson=True, - item_types=('Marker', 'Route')): + item_types=('Marker', 'Route', 'Polygon')): ''' - Get markers and routes + Get geo objects ''' items = [] - current_cat, colors, idx = None, None, 0 empty = [] if not getjson else {} # marker @@ -653,26 +662,75 @@ def _getGeoObjects(area_name, category_ids, status='A', getjson=True, else: items += list(query) + # polygon + if 'Polygon' in item_types: + try: + q = checkDate(Q(status__in=status, categories__in=category_ids)) + query = Polygon.objects.filter(q).distinct('pk').order_by('-pk') + except: + return empty + + category_ids = [int(cat_id) for cat_id in category_ids] + if getjson: + current_cat, colors, idx = None, None, 0 + for polygon in query.all(): + color, inner_color = "", "" + if polygon.inner_color: + inner_color = polygon.inner_color + if polygon.color: + color = polygon.color + else: + c_cat = None + for cat in polygon.categories.all(): + if cat.id in category_ids: + c_cat = cat + break + if c_cat and not current_cat or current_cat != c_cat: + idx = 0 + current_cat = c_cat + colors = list(Color.objects.filter( + color_theme=c_cat.color_theme)) + if colors: + color = colors[idx % len(colors)].code + idx += 1 + else: + color = "#000" + if not inner_color: + inner_color = "rgba(180, 180, 180, 0.3)" + items.append(json.loads(polygon.getGeoJSON( + color=color, inner_color=inner_color))) + else: + items += list(query) + # routes if 'Route' in item_types: query = AggregatedRoute.objects.filter( status__in=status, subcategory__in=category_ids).order_by( 'subcategory', '-pk') if getjson: + current_cat, colors, idx = None, None, 0 for route in query.all(): - c_cat = route.subcategory - if not current_cat or current_cat != c_cat: - idx = 0 - current_cat = c_cat - colors = list(Color.objects.filter( - color_theme=c_cat.color_theme)) - if colors: - items.append(json.loads( - route.getGeoJSON(color=colors[idx % len(colors)].code)) - ) - else: - items.append(json.loads(route.getGeoJSON(color='000'))) - idx += 1 + color = "" + # aggregated view has no color and no categories + if hasattr(route, 'color') and route.color: + color = route.color + elif hasattr(route, 'categories'): + c_cat = None + for cat in route.categories.all(): + if cat.id in category_ids: + c_cat = cat + break + if c_cat and not current_cat or current_cat != c_cat: + idx = 0 + current_cat = c_cat + colors = list(Color.objects.filter( + color_theme=c_cat.color_theme)) + if colors: + color = colors[idx % len(colors)].code + idx += 1 + else: + color = "#000" + items.append(json.loads(route.getGeoJSON(color=color))) else: items += list(query) |
