diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2016-05-13 15:57:30 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2016-05-13 15:57:30 +0200 |
commit | 6b9856c9264bf26ee853bf570387a7b5ea949a9f (patch) | |
tree | 091340fc1430f7c13433661a778ea46b1ef2ac5b /chimere/models.py | |
parent | 990493bf4ceaf7aa3e9ce79635799bc1c6b20679 (diff) | |
download | Chimère-6b9856c9264bf26ee853bf570387a7b5ea949a9f.tar.bz2 Chimère-6b9856c9264bf26ee853bf570387a7b5ea949a9f.zip |
Optimize polygon retrievement in database
Diffstat (limited to 'chimere/models.py')
-rw-r--r-- | chimere/models.py | 45 |
1 files changed, 45 insertions, 0 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")), |