diff options
Diffstat (limited to 'chimere/main/models.py')
| -rw-r--r-- | chimere/main/models.py | 90 |
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) |
