summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@peacefrogs.net>2010-11-19 03:09:15 +0100
committerÉtienne Loks <etienne.loks@peacefrogs.net>2010-11-19 03:09:15 +0100
commitf6abc55dd24313816ae6cc708a887fa2c31dd3f4 (patch)
tree8bb6b922bda5282bb8b9e89080ef86f1b18b2b45
parentc2ae3613c662973bd1fd78f415f57bb0e4f16272 (diff)
downloadChimère-f6abc55dd24313816ae6cc708a887fa2c31dd3f4.tar.bz2
Chimère-f6abc55dd24313816ae6cc708a887fa2c31dd3f4.zip
Filter markers and routes by date on the main map (refs #270)
-rw-r--r--chimere/main/models.py21
-rw-r--r--chimere/main/views.py25
2 files changed, 42 insertions, 4 deletions
diff --git a/chimere/main/models.py b/chimere/main/models.py
index a2a3785..e793435 100644
--- a/chimere/main/models.py
+++ b/chimere/main/models.py
@@ -20,6 +20,8 @@
"""
Models description
"""
+from datetime import datetime, timedelta
+
from django.utils.translation import ugettext_lazy as _
from django.contrib.gis.db import models
@@ -327,6 +329,22 @@ Format YYYY-MM-DD"))
"color":"%(color)s"}}""" % {'id':self.id, 'name':self.name,
'color':color, 'geometry':self.route.geojson,}
+def getDateCondition():
+ '''
+ Return an SQL condition for apparition of dates
+ '''
+ if not settings.DAYS_BEFORE_EVENT:
+ return ""
+ now = datetime.now().strftime('%Y-%m-%d')
+ after = (datetime.now() + timedelta(settings.DAYS_BEFORE_EVENT)
+ ).strftime('%Y-%m-%d')
+ date_condition = " and %(alias)s.start_date is null or "
+ date_condition += "(%(alias)s.start_date >= '" + now + "' and "
+ date_condition += "%(alias)s.start_date <='" + after + "')"
+ date_condition += " or (%(alias)s.start_date <='" + now + "' and "
+ date_condition += "%(alias)s.end_date >='" + now + "') "
+ return date_condition
+
class SimplePoint:
"""
Point in the map (not in the database)
@@ -375,6 +393,7 @@ class SimpleArea:
self.upper_left_corner.x, self.upper_left_corner.y,
settings.EPSG_DISPLAY_PROJECTION
)
+ date_condition = getDateCondition()
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,
@@ -384,6 +403,7 @@ inner join main_category cat on cat.id=subcat.category_id'''
inner join main_marker mark on ST_Contains(%s, mark.point)''' % area
if equal_status:
sql += ' and mark.status' + equal_status
+ sql += date_condition % {'alias':'mark'}
sql += '''
inner join main_marker_categories mc on mc.subcategory_id=subcat.id and
mc.marker_id=mark.id'''
@@ -395,6 +415,7 @@ 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 += date_condition % {'alias':'rt'}
sql += '''
inner join main_route_categories rc on rc.subcategory_id=subcat.id and
rc.route_id=rt.id'''
diff --git a/chimere/main/views.py b/chimere/main/views.py
index f16241f..be9b64b 100644
--- a/chimere/main/views.py
+++ b/chimere/main/views.py
@@ -30,6 +30,7 @@ from django.template import loader
from django.http import HttpResponseRedirect, HttpResponse
from django.core import serializers
from django.utils.http import urlquote
+from django.db.models import Q
from chimere import settings
from chimere.main.actions import actions
@@ -268,6 +269,21 @@ def getDescriptionDetail(request, area_name, category_id):
response_dct['category'] = category
return render_to_response('category_detail.html', response_dct)
+def checkDate(q):
+ """
+ Filter a queryset to manage dates
+ """
+ if not settings.DAYS_BEFORE_EVENT:
+ return q
+ today = datetime.date.today()
+ after = today + datetime.timedelta(settings.DAYS_BEFORE_EVENT)
+
+ q = q & ( Q(start_date__isnull=True)
+ | Q(start_date__gte=today, start_date__lte=after)
+ | Q(start_date__lte=today, end_date__gte=today)
+ )
+ return q
+
def getGeoObjects(request, area_name, category_ids, status):
'''
Get the JSON for markers and routes
@@ -277,8 +293,8 @@ def getGeoObjects(request, area_name, category_ids, status):
status = status.split('_')
category_ids = category_ids.split('_')
try:
- query = Route.objects.filter(status__in=status,
- categories__in=category_ids)
+ q = checkDate(Q(status__in=status, categories__in=category_ids))
+ query = Route.objects.filter(q)
except:
return HttpResponse('no results')
query.order_by('categories')
@@ -294,8 +310,9 @@ def getGeoObjects(request, area_name, category_ids, status):
jsons.append(route.getGeoJSON(color=colors[idx % len(colors)].code))
idx += 1
try:
- query = Marker.objects.filter(status__in=status,
- categories__in=category_ids)
+ q = checkDate(Q(status__in=status, categories__in=category_ids))
+ query = Marker.objects.filter(q)
+ print query.query
except:
return HttpResponse('no results')
category_ids = [int(cat_id) for cat_id in category_ids]