summaryrefslogtreecommitdiff
path: root/chimere/views.py
diff options
context:
space:
mode:
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
commit98e523350c4eeb2bfe2b1d31666c301724749305 (patch)
treea976bf8c56a7e2fe5a3a0c5b5235a84649afda33 /chimere/views.py
parentec9676ef71f859a85707ab712568bf9d7f83b392 (diff)
downloadChimè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.py102
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)