diff options
-rw-r--r-- | chimere/models.py | 45 | ||||
-rw-r--r-- | chimere/views.py | 28 |
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) |