summaryrefslogtreecommitdiff
path: root/chimere/main/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'chimere/main/models.py')
-rw-r--r--chimere/main/models.py48
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):