diff options
Diffstat (limited to 'chimere/main/models.py')
| -rw-r--r-- | chimere/main/models.py | 48 |
1 files changed, 22 insertions, 26 deletions
diff --git a/chimere/main/models.py b/chimere/main/models.py index 6aaad66..7e7c9b6 100644 --- a/chimere/main/models.py +++ b/chimere/main/models.py @@ -27,7 +27,7 @@ from django.contrib.gis.gdal import SpatialReference from django.contrib import admin from chimere import settings -from chimere.main.widgets import PointField, RouteField +from chimere.main.widgets import PointField, RouteField, SelectMultipleField class News(models.Model): """News of the site @@ -135,8 +135,8 @@ class SubCategory(models.Model): category = models.ForeignKey(Category, verbose_name=_("Category")) name = models.CharField(_("Name"), max_length=150) available = models.BooleanField(_("Available")) - areas = models.ManyToManyField('Area', related_name='areas', - db_table=u'subcategory_areas') + areas = SelectMultipleField('Area', related_name='areas', + db_table=u'subcategory_areas', blank=True) icon = models.ForeignKey(Icon, verbose_name=_("Icon")) color_theme = models.ForeignKey(ColorTheme, verbose_name=_("Color theme"), blank=True, null=True) @@ -185,7 +185,7 @@ class Marker(models.Model): '''Marker for a POI ''' name = models.CharField(_("Name"), max_length=150) - categories = models.ManyToManyField(SubCategory) + categories = SelectMultipleField(SubCategory) point = PointField(_("Localisation"), srid=settings.EPSG_DISPLAY_PROJECTION) picture = models.ImageField(_("Image"), upload_to='upload', blank=True, null=True, height_field='height', width_field='width') @@ -243,19 +243,21 @@ class Marker(models.Model): def getGeoJSON(self): '''Return a GeoJSON string ''' - return """{"type":"Feature", "geometry":%(geometry)s, \ + jsons = [] + for cat in self.categories.all(): + jsons.append("""{"type":"Feature", "geometry":%(geometry)s, \ "properties":{"pk": %(id)d, "name": "%(name)s", \ "icon_path":"%(icon_path)s", "icon_width":%(icon_width)d, \ "icon_height":%(icon_height)d}}""" % {'id':self.id, 'name':self.name, -'icon_path':self.subcategory.icon.image, 'geometry':self.point.geojson, -'icon_width':self.subcategory.icon.image.width, -'icon_height':self.subcategory.icon.image.height,} +'icon_path':cat.icon.image, 'geometry':self.point.geojson, +'icon_width':cat.icon.image.width, 'icon_height':cat.icon.image.height,}) + return ",".join(jsons) class Route(models.Model): '''Route on the map ''' name = models.CharField(_("Name"), max_length=150) - categories = models.ManyToManyField(SubCategory) + categories = SelectMultipleField(SubCategory) route = RouteField(_("Route"), srid=settings.EPSG_DISPLAY_PROJECTION) picture = models.ImageField(_("Image"), upload_to='upload', blank=True, null=True, height_field='height', width_field='width') @@ -363,32 +365,26 @@ subcat.name as name, subcat.available as available, subcat.icon_id as icon_id, subcat.color_theme_id as color_theme_id, subcat.order as order, subcat.item_type as item_type from main_subcategory subcat''' sql = sql_main + ''' -inner join main_marker mark on mark.subcategory_id=subcat.id - and ST_Contains(%s, mark.point)''' % area +inner join main_marker mark on ST_Contains(%s, mark.point)''' % area if equal_status: sql += ' and mark.status' + equal_status + sql += ''' +inner join main_marker_categories mc on mc.subcategory_id=subcat.id and +mc.marker_id=mark.id''' if filter_available: sql += ' where subcat.available = TRUE' - # django > 1.1 - #subcats = SubCategory.objects.raw(sql) - from django.db import connection, transaction - cursor = connection.cursor() - cursor.execute(sql, []) - subcats = set() - for r in cursor.fetchall(): - subcats.add(SubCategory.objects.get(id=r[0])) + subcats = set(SubCategory.objects.raw(sql)) sql = sql_main + ''' -inner join main_route rt on rt.subcategory_id=subcat.id -and (ST_Intersects(%s, rt.route) or ST_Contains(%s, rt.route))''' % (area, area) +inner join main_route rt on (ST_Intersects(%s, rt.route) or +ST_Contains(%s, rt.route))''' % (area, area) if equal_status: sql += ' and rt.status' + equal_status + sql += ''' +inner join main_route_categories rc on rc.subcategory_id=subcat.id and +rc.route_id=rt.id''' if filter_available: sql += ' where subcat.available = TRUE' - # django > 1.1 - #subcats += SubCategory.objects.raw(sql) - cursor.execute(sql, []) - for r in cursor.fetchall(): - subcats.add(SubCategory.objects.get(id=r[0])) + subcats.union(SubCategory.objects.raw(sql)) return subcats class Area(models.Model, SimpleArea): |
