diff options
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 |
commit | f6abc55dd24313816ae6cc708a887fa2c31dd3f4 (patch) | |
tree | 8bb6b922bda5282bb8b9e89080ef86f1b18b2b45 | |
parent | c2ae3613c662973bd1fd78f415f57bb0e4f16272 (diff) | |
download | Chimè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.py | 21 | ||||
-rw-r--r-- | chimere/main/views.py | 25 |
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] |