summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chimere/models.py45
-rw-r--r--chimere/views.py28
2 files changed, 47 insertions, 26 deletions
diff --git a/chimere/models.py b/chimere/models.py
index a68945a..2c27644 100644
--- a/chimere/models.py
+++ b/chimere/models.py
@@ -904,6 +904,51 @@ class Polygon(GeographicItem):
"inner_color": inner_color}}
return json.dumps(attributes)
+ @classmethod
+ def getGeoJSONs(self, queryset, color="#000",
+ inner_color='rgba(180, 180, 180, 0.3)',
+ limit_to_categories=[]):
+ vals, default_color, default_inner_color = [], color, inner_color
+ q = queryset.select_related('categories').extra(
+ select={'json': 'ST_AsGeoJSON(polygon)'}).values(
+ 'json', 'name', 'pk', 'inner_color', 'color', 'categories__pk')
+ added = []
+ current_categories = {}
+ for polygon in q.all():
+ if polygon['pk'] in added:
+ continue
+ if limit_to_categories and \
+ polygon["categories__pk"] not in limit_to_categories:
+ continue
+ color = default_color
+ if polygon["color"]:
+ color = polygon['color']
+ elif polygon["categories__pk"]:
+ if polygon["categories__pk"] not in current_categories:
+ cat = SubCategory.objects.get(pk=polygon["categories__pk"])
+ # [index, color list]
+ current_categories[polygon["categories__pk"]] = \
+ [0, list(Color.objects.filter(
+ color_theme=cat.color_theme))]
+ idx, colors = current_categories[polygon["categories__pk"]]
+ # category have a color theme
+ if colors:
+ color = colors[idx % len(colors)].code
+ # index += 1
+ current_categories[polygon["categories__pk"]][0] += 1
+
+ inner_color = default_inner_color if not polygon["inner_color"] \
+ else polygon["inner_color"]
+ vals.append({
+ "type": "Feature",
+ "geometry": json.loads(polygon['json']),
+ "properties": {"pk": polygon['pk'], "name": polygon['name'],
+ 'key': "polygon-{}".format(polygon['pk']),
+ 'color': color,
+ 'inner_color': inner_color}})
+ added.append(polygon['pk'])
+ return vals
+
class MultimediaType(models.Model):
MEDIA_TYPES = (('A', _(u"Audio")),
diff --git a/chimere/views.py b/chimere/views.py
index 5fd50cd..796aca3 100644
--- a/chimere/views.py
+++ b/chimere/views.py
@@ -717,32 +717,8 @@ def _getGeoObjects(area_name, category_ids, status='A', getjson=True,
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)))
+ items += Polygon.getGeoJSONs(
+ query, limit_to_categories=category_ids)
else:
items += list(query)