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.py90
1 files changed, 79 insertions, 11 deletions
diff --git a/chimere/main/models.py b/chimere/main/models.py
index 60a5837..c977446 100644
--- a/chimere/main/models.py
+++ b/chimere/main/models.py
@@ -126,6 +126,9 @@ class SubCategory(models.Model):
for sub_category in subcategories:
if sub_category.category not in sub_categories:
sub_categories[sub_category.category] = []
+ if sub_category.id in settings.DEFAULT_CATEGORIES:
+ sub_category.selected = True
+ sub_category.category.selected = True
sub_categories[sub_category.category].append(sub_category)
return [(category, sub_cats) for category, sub_cats \
in sub_categories.items()]
@@ -222,16 +225,6 @@ class Route(models.Model):
ordering = ('subcategory__category', 'subcategory', 'status', 'name')
verbose_name = _("Route")
- def getLatitude(self):
- '''Return the latitude
- '''
- return self.point.y
-
- def getLongitude(self):
- '''Return the longitude
- '''
- return self.point.x
-
def getProperty(self, propertymodel, safe=None):
"""Get the property of an associated property model.
If safe set to True, verify if the property is available
@@ -265,7 +258,82 @@ class Route(models.Model):
"color":"%(color)s"}}""" % {'id':self.id, 'name':self.name,
'color':color, 'geometry':self.route.geojson,}
-class Area(models.Model):
+class SimplePoint:
+ """
+ Point in the map (not in the database)
+ """
+ def __init__(self, x, y):
+ self.x, self.y = x, y
+
+class SimpleArea:
+ """
+ Rectangular area of a map (not in the database)
+ """
+ def __init__(self, area):
+ """
+ Defining upper left corner ans lower right corner from a tuple
+ """
+ assert len(area) == 4
+ x1, y1, x2, y2 = area
+ self.upper_left_corner = SimplePoint(x1, y1)
+ self.lower_right_corner = SimplePoint(x2, y2)
+
+ def isIn(self, area):
+ """
+ Verify if the current area is in the designated area
+ """
+ if self.upper_left_corner.x >= area.upper_left_corner.x and \
+ self.upper_left_corner.y <= area.upper_left_corner.x and \
+ self.lower_right_corner.x <= area.lower_right_corner.x and \
+ self.lower_right_corner.y >= area.lower_right_corner.y:
+ return True
+ return False
+
+ def getCategories(self, status='A'):
+ """
+ Get categories for this area
+ """
+ equal_status = ''
+ if len(status) == 1:
+ equal_status = "='%s'" % status[0]
+ else:
+ equal_status = " in ('%s')" % "','".join(status)
+ area = "ST_GeometryFromText('POLYGON((%f %f,%f %f,%f %f,%f %f, %f %f))'\
+, %d)" % (self.upper_left_corner.x, self.upper_left_corner.y,
+ self.lower_right_corner.x, self.upper_left_corner.y,
+ self.lower_right_corner.x, self.lower_right_corner.y,
+ self.upper_left_corner.x, self.lower_right_corner.y,
+ self.upper_left_corner.x, self.upper_left_corner.y,
+ settings.EPSG_DISPLAY_PROJECTION
+ )
+ sql_main = '''select subcat.id as id, subcat.category_id as category_id,
+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 mark.status%s
+and ST_Contains(%s, mark.point) where subcat.available = TRUE''' % (
+ equal_status, area)
+ # 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]))
+ sql = sql_main + '''
+inner join main_route rt on rt.subcategory_id=subcat.id and rt.status%s
+and (ST_Intersects(%s, rt.route) or ST_Contains(%s, rt.route))
+where subcat.available = TRUE''' % (equal_status, area, area)
+ # django > 1.1
+ #subcats += SubCategory.objects.raw(sql)
+ cursor.execute(sql, [])
+ for r in cursor.fetchall():
+ subcats.add(SubCategory.objects.get(id=r[0]))
+ return subcats
+
+class Area(models.Model, SimpleArea):
"""Rectangular area of the map
"""
name = models.CharField(_("Name"), max_length=150)