summaryrefslogtreecommitdiff
path: root/chimere/views.py
diff options
context:
space:
mode:
Diffstat (limited to 'chimere/views.py')
-rw-r--r--chimere/views.py474
1 files changed, 260 insertions, 214 deletions
diff --git a/chimere/views.py b/chimere/views.py
index be9d816..88619ce 100644
--- a/chimere/views.py
+++ b/chimere/views.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (C) 2008-2014 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet>
+# Copyright (C) 2008-2015 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet>
#
# RSS : Copyright (C) 2010 Pierre Clarenc <pierre.crc_AT_gmailDOTcom>,
# Samuel Renard <renard.samuel_AT_gmailDOTcom>,
@@ -24,15 +24,12 @@
Views of the project
"""
-import copy
import datetime
from itertools import groupby
import re
import simplejson as json
from django.conf import settings
-from django.contrib.auth import authenticate, login, logout
-from django.contrib.auth.forms import AuthenticationForm
from django.contrib.gis.geos import GEOSGeometry
from django.contrib.gis.gdal.error import OGRException
from django.contrib.gis.measure import D
@@ -41,23 +38,24 @@ from django.core import serializers
from django.core.exceptions import ObjectDoesNotExist
from django.core.urlresolvers import reverse
from django.db.models import Q
-from django.http import HttpResponseRedirect, HttpResponse
-from django.shortcuts import redirect, render_to_response
+from django.http import HttpResponseRedirect, HttpResponse, Http404
+from django.shortcuts import get_object_or_404, redirect, render_to_response
from django.template import loader, RequestContext, defaultfilters
from django.utils import simplejson as json
from django.utils.http import urlquote
from django.utils.translation import ugettext as _
+from django.views.generic import TemplateView, ListView
-from chimere.actions import actions as default_actions
+from chimere.actions import actions
from chimere.models import Category, SubCategory, PropertyModel, Page,\
- Marker, Route, News, SimpleArea, Map, Color, TinyUrl, RouteFile,\
+ Marker, Route, News, SimpleArea, Area, Color, TinyUrl, RouteFile,\
AggregatedRoute
-from chimere.widgets import getMapJS, PointChooserWidget, NominatimWidget,\
+from chimere.widgets import getMapJS, PointChooserWidget, \
RouteChooserWidget, AreaWidget
from chimere.forms import MarkerForm, RouteForm, ContactForm, FileForm, \
FullFileForm, MultimediaFileFormSet, PictureFileFormSet, notifySubmission,\
- notifyStaff, MapForm, RoutingForm, getStaffEmails
+ notifyStaff, AreaForm, RoutingForm, getStaffEmails
from chimere.route import router
@@ -74,41 +72,43 @@ def get_base_uri(request):
return base_uri
#TODO: convert to requestcontext
-def get_base_response(request, map_name="", propose=False):
+def get_base_response(request, area_name=""):
"""
Get the base url
"""
- base_response_dct = {'media_path':settings.MEDIA_URL,
- 'is_authenticated':request.user.is_authenticated()}
+ base_response_dct = {'media_path':settings.MEDIA_URL,}
base_response_dct['MOBILE'] = settings.MOBILE_TEST or \
get_current_site(request).domain in settings.MOBILE_DOMAINS
base_url = reverse("chimere:index")
if not base_url.startswith('/'):
base_url = '/' + base_url
- if map_name and map_name.endswith('/'):
- map_name = map_name[:-1]
- if map_name:
- base_response_dct['map_name_slash'] = map_name + "/"
+ if area_name and area_name.endswith('/'):
+ area_name = area_name[:-1]
+ if area_name:
+ base_response_dct['area_name_slash'] = area_name + "/"
if base_url[-1] != '/':
base_url += '/'
- base_url += map_name + '/'
+ base_url += area_name + '/'
base_response_dct['extra_url'] = base_url
- map = Map.getAvailable(user=request.user, urn=map_name, propose=propose,
- single=True)
- if map:
- map_name = map.urn
- elif map_name:
- return None, redirect(reverse('chimere:index'))
- if map:
- base_response_dct['can_write'] = map.can_write(user=request.user)
- base_response_dct['can_propose'] = map.can_propose(user=request.user)
-
- base_response_dct['map'] = map
- base_response_dct['map_name'] = map_name
- if map and map.external_css:
- base_response_dct['css_map'] = map.external_css
+ area = None
+ if area_name:
+ try:
+ area = Area.objects.get(urn=area_name, available=True)
+ except ObjectDoesNotExist:
+ return None, redirect(reverse('chimere:index'))
+ else:
+ try:
+ area = Area.objects.get(default=True)
+ area_name = area.urn
+ except ObjectDoesNotExist:
+ pass
+
+ base_response_dct['area'] = area
+ base_response_dct['area_name'] = area_name
+ if area and area.external_css:
+ base_response_dct['css_area'] = area.external_css
base_response_dct['dynamic_categories'] = True \
- if map and map.dynamic_categories else False
+ if area and area.dynamic_categories else False
base_response_dct['JQUERY_JS_URLS'] = settings.JQUERY_JS_URLS
base_response_dct['JQUERY_CSS_URLS'] = settings.JQUERY_CSS_URLS
base_response_dct['PROJECT_NAME'] = settings.PROJECT_NAME
@@ -116,17 +116,17 @@ def get_base_response(request, map_name="", propose=False):
base_response_dct['EXTRA_CSS'] = settings.EXTRA_CSS
return base_response_dct, None
-def getShareUrl(request, map_name='', network=''):
+def getShareUrl(request, area_name='', network=''):
"""
Get a share url
"""
- data = getTinyfiedUrl(request, request.GET.urlencode(), map_name)
+ data = getTinyfiedUrl(request, request.GET.urlencode(), area_name)
for name, url, img in settings.CHIMERE_SHARE_NETWORKS:
if defaultfilters.slugify(name) == network:
return HttpResponse(url % {'text':data['text'], 'url':data['url']})
return HttpResponse('')
-def getShareNetwork(request, map_name='', marker=None):
+def getShareNetwork(request, area_name='', marker=None):
"""
Get URLs to share items
"""
@@ -135,19 +135,14 @@ def getShareNetwork(request, map_name='', marker=None):
parameters = u'current_feature=%d' % marker.pk
parameters += u"&checked_categories=%s" % "_".join([str(m.id) \
for m in marker.categories.all()])
- net_dct = getTinyfiedUrl(request, parameters, map_name)
+ net_dct = getTinyfiedUrl(request, parameters, area_name)
share_networks = []
for network in settings.CHIMERE_SHARE_NETWORKS:
share_networks.append((network[0], network[1] % net_dct, network[2]))
return share_networks, net_dct
-
-def logout_view(request):
- logout(request)
- return redirect(reverse('chimere:index'))
-
-def index(request, map_name=None, default_map=None, simple=False,
- get_response=False, actions=default_actions):
+def index(request, area_name=None, default_area=None, simple=False,
+ get_response=False):
"""
Main page
"""
@@ -159,28 +154,9 @@ def index(request, map_name=None, default_map=None, simple=False,
request.session['last_visit'] != today:
request.session['last_visit'] = today
news_visible = True
- response_dct, redir = get_base_response(request, map_name)
+ response_dct, redir = get_base_response(request, area_name)
if redir:
return redir
-
- if request.POST:
- auth_form = AuthenticationForm(None, request.POST)
- invalid_msg = _(u"Invalid user or password.")
- if auth_form.is_valid():
- user = authenticate(
- username=auth_form.cleaned_data['username'],
- password=auth_form.cleaned_data['password'])
- if user is not None and user.is_active:
- login(request, user)
- return redirect(reverse('chimere:index'))
- else:
- response_dct['auth_form'] = auth_form
- else:
- response_dct['auth_form'] = AuthenticationForm()
-
- if not response_dct['map']:
- return render_to_response('chimere/no_map.html', response_dct,
- context_instance=RequestContext(request))
# don't mess with permalink
zoomout = True
if request.GET and 'lat' in request.GET \
@@ -198,24 +174,24 @@ def index(request, map_name=None, default_map=None, simple=False,
except:
pass
response_dct.update({
- 'actions':actions(request.user, response_dct['map_name']),
+ 'actions':actions(response_dct['area_name']),
'action_selected':('view',),
'error_message':'',
'is_map':True,
'news_visible': news_visible,
- 'maps_visible': settings.CHIMERE_DISPLAY_MAPS,
+ 'areas_visible': settings.CHIMERE_DISPLAY_AREAS,
'map_layer':settings.CHIMERE_DEFAULT_MAP_LAYER,
'dynamic_categories':response_dct['dynamic_categories'],
'zoomout':zoomout,
- 'has_default_map':Map.objects.filter(default=True).count(),
- 'zoomout':zoomout,
- 'has_search':settings.CHIMERE_SEARCH_ENGINE,
+ 'has_default_area':Area.objects.filter(default=True).count(),
'zoomout':zoomout,
+ 'has_search':hasattr(settings, 'CHIMERE_SEARCH_ENGINE') and \
+ settings.CHIMERE_SEARCH_ENGINE
})
if hasattr(settings, 'CONTACT_EMAIL') and settings.CONTACT_EMAIL:
response_dct['contact_email'] = settings.CONTACT_EMAIL
response_dct['share_networks'], net_dct = \
- getShareNetwork(request, response_dct['map_name'])
+ getShareNetwork(request, response_dct['area_name'])
tpl = 'chimere/main_map.html'
response_dct['simple'] = simple
if simple:
@@ -231,13 +207,13 @@ def get_edit_page(redirect_url, item_cls, item_form,
"""
Edition page
"""
- def func(request, map_name="", item_id=None, cat_type=['M']):
- response_dct, redir = get_base_response(request, map_name, propose=True)
+ def func(request, area_name="", item_id=None, cat_type=['M']):
+ response_dct, redir = get_base_response(request, area_name)
if redir:
return redir, None, None
- if 'map_name' in response_dct:
- map_name = response_dct['map_name']
- subcategories = SubCategory.getAvailable(cat_type, map_name,
+ if 'area_name' in response_dct:
+ area_name = response_dct['area_name']
+ subcategories = SubCategory.getAvailable(cat_type, area_name,
public=True)
listed_subcats = []
if subcategories:
@@ -250,7 +226,7 @@ def get_edit_page(redirect_url, item_cls, item_form,
try:
init_item = item_cls.objects.get(pk=item_id)
except:
- return redirect(redirect_url, map_name + '/' if map_name \
+ return redirect(redirect_url, area_name + '/' if area_name \
else ''), None, None
ref_item = init_item
modified_item = item_cls.objects.filter(ref_item=init_item,
@@ -261,17 +237,18 @@ def get_edit_page(redirect_url, item_cls, item_form,
init_multi = init_item.get_init_multi() if init_item else None
init_picture = init_item.get_init_picture() if init_item else None
- if init_item and not response_dct['can_write'] and \
+ if init_item and not request.user.is_superuser and \
not init_item.submiter_session_key == \
request.session.session_key:
# hide personal information
for k in ('submiter_name', 'submiter_email', 'submiter_comment'):
setattr(init_item, k, '')
+ response_dct['is_superuser'] = request.user.is_superuser
# If the form has been submited
if request.method == 'POST':
inst = None
- # allow to directly modify only if owner or has can_write permission
- if init_item and (response_dct['can_write'] or \
+ # allow to directly modify only if owner or superuser
+ if init_item and (request.user.is_superuser or \
init_item.submiter_session_key == \
request.session.session_key):
inst = init_item
@@ -284,7 +261,7 @@ def get_edit_page(redirect_url, item_cls, item_form,
# All validation rules pass
if form.is_valid() and formset_multi.is_valid() and \
formset_picture.is_valid():
- item = form.save(can_write=response_dct.get('can_write'))
+ item = form.save()
# set the session key (to permit modifications)
item.submiter_session_key = request.session.session_key
@@ -302,7 +279,7 @@ def get_edit_page(redirect_url, item_cls, item_form,
# just submited
if not item.status:
- item.status = 'A' if response_dct.get('can_write') else 'S'
+ item.status = 'S'
item.save()
marker = item
@@ -318,9 +295,9 @@ def get_edit_page(redirect_url, item_cls, item_form,
f.save(marker)
base_uri = get_base_uri(request)
notifySubmission(base_uri, item)
- response_dct = get_base_response(request, map_name)
+ response_dct = get_base_response(request, area_name)
return redirect(redirect_url + '-item',
- map_name + '/' if map_name else '',
+ area_name + '/' if area_name else '',
item.ref_item.pk, 'submited'), None, subcategories
else:
response_dct['error_message'] = _(u"There are missing field(s)"
@@ -337,12 +314,11 @@ def get_edit_page(redirect_url, item_cls, item_form,
get_edit_marker = get_edit_page('chimere:edit', Marker, MarkerForm)
-def edit(request, map_name="", item_id=None, submited=False,
- actions=default_actions):
+def edit(request, area_name="", item_id=None, submited=False):
"""
Edition page
"""
- response, values, sub_categories = get_edit_marker(request, map_name,
+ response, values, sub_categories = get_edit_marker(request, area_name,
item_id, ['M', 'B'])
if response:
return response
@@ -356,24 +332,20 @@ def edit(request, map_name="", item_id=None, submited=False,
point_value = init_item.point if init_item else None
if request.POST and request.POST.get('point'):
point_value = request.POST.get('point')
- has_dated_items = settings.CHIMERE_DAYS_BEFORE_EVENT and [
- True for cat, subcats in sub_categories
- if [True for subcat in subcats if subcat.dated]]
response_dct.update({
- 'actions':actions(request.user, response_dct['map_name']),
+ 'actions':actions(response_dct['area_name']),
'action_selected':('contribute', 'edit'),
'map_layer':settings.CHIMERE_DEFAULT_MAP_LAYER,
'form':form,
'formset_multi':formset_multi,
'formset_picture':formset_picture,
- 'dated':has_dated_items,
- 'extra_head':form.media + NominatimWidget().media,
+ 'dated':settings.CHIMERE_DAYS_BEFORE_EVENT,
+ 'extra_head':form.media,
'marker_id':item_id,
'sub_categories':sub_categories,
'point_widget':PointChooserWidget().render('point',
point_value,
- map_name=response_dct['map_name']),
- 'nominatim_widget':NominatimWidget().render('point'),
+ area_name=response_dct['area_name']),
'properties':declared_fields,
'filtered_properties':filtered_properties,
'submited':submited
@@ -384,8 +356,8 @@ def edit(request, map_name="", item_id=None, submited=False,
return render_to_response('chimere/edit.html', response_dct,
context_instance=RequestContext(request))
-def uploadFile(request, category_id='', map_name=''):
- response_dct, redir = get_base_response(request, map_name)
+def uploadFile(request, category_id='', area_name=''):
+ response_dct, redir = get_base_response(request, area_name)
if redir:
return redir
Form = FileForm if not category_id else FullFileForm
@@ -432,7 +404,7 @@ def uploadFile(request, category_id='', map_name=''):
return render_to_response('chimere/upload_file.html', response_dct,
context_instance=RequestContext(request))
-def processRouteFile(request, map_name='', file_id=None):
+def processRouteFile(request, area_name='', file_id=None):
if file_id:
try:
route_file = RouteFile.objects.get(pk=file_id)
@@ -450,12 +422,11 @@ def processRouteFile(request, map_name='', file_id=None):
get_edit_route = get_edit_page('chimere:editroute', Route, RouteForm)
-def editRoute(request, map_name="", item_id=None, submited=False,
- actions=default_actions):
+def editRoute(request, area_name="", item_id=None, submited=False):
"""
Route edition page
"""
- response, values, sub_categories = get_edit_route(request, map_name,
+ response, values, sub_categories = get_edit_route(request, area_name,
item_id, ['R', 'B'])
if response:
return response
@@ -469,22 +440,19 @@ def editRoute(request, map_name="", item_id=None, submited=False,
route_value = init_item.route if init_item else None
if request.POST and request.POST.get('route'):
route_value = request.POST.get('route')
- has_dated_items = settings.CHIMERE_DAYS_BEFORE_EVENT and [
- True for cat, subcats in sub_categories
- if [True for subcat in subcats if subcat.dated]]
response_dct.update({
- 'actions':actions(request.user, response_dct['map_name']),
+ 'actions':actions(response_dct['area_name']),
'action_selected':('contribute', 'edit-route'),
'error_message':'',
'map_layer':settings.CHIMERE_DEFAULT_MAP_LAYER,
'form':form,
'formset_multi':formset_multi,
'formset_picture':formset_picture,
- 'dated':has_dated_items,
+ 'dated':settings.CHIMERE_DAYS_BEFORE_EVENT,
'extra_head':form.media,
'sub_categories':sub_categories,
'route_widget':RouteChooserWidget().render('route', route_value,
- map_name=response_dct['map_name'], routefile_id='',),
+ area_name=response_dct['area_name'], routefile_id='',),
'properties':declared_fields,
'submited':submited
})
@@ -494,33 +462,34 @@ def editRoute(request, map_name="", item_id=None, submited=False,
return render_to_response('chimere/edit_route.html', response_dct,
context_instance=RequestContext(request))
-def submited(request, map_name="", action="", actions=default_actions):
+def submited(request, area_name="", action=""):
"""
Successful submission page
"""
- response_dct, redir = get_base_response(request, map_name)
+ response_dct, redir = get_base_response(request, area_name)
if redir:
return redir
- response_dct.update({'actions':actions(request.user, response_dct['map_name']),
- 'action_selected':action,})
+ dct = {'actions':actions(response_dct['area_name']),
+ 'action_selected':action,}
if hasattr(settings, 'CONTACT_EMAIL') and settings.CONTACT_EMAIL:
response_dct['contact_email'] = settings.CONTACT_EMAIL
+ response_dct.update(dct)
return render_to_response('chimere/submited.html', response_dct,
context_instance=RequestContext(request))
-def charte(request, map_name="", actions=default_actions):
+def charte(request, area_name=""):
"""
Affichage de la charte
"""
- response_dct, redir = get_base_response(request, map_name)
+ response_dct, redir = get_base_response(request, area_name)
if redir:
return redir
- response_dct.update({'actions':actions(request.user, response_dct['map_name']),
+ response_dct.update({'actions':actions(response_dct['area_name']),
'action_selected':('charte',)})
return render_to_response('chimere/charte.html', response_dct,
context_instance=RequestContext(request))
-def contactus(request, map_name="", actions=default_actions):
+def contactus(request, area_name=""):
"""
Contact page
"""
@@ -541,16 +510,16 @@ def contactus(request, map_name="", actions=default_actions):
msg = _(u"Temporary error. Renew your message later.")
else:
form = ContactForm()
- response_dct, redir = get_base_response(request, map_name)
+ response_dct, redir = get_base_response(request, area_name)
if redir:
return redir
- response_dct.update({'actions':actions(request.user, response_dct['map_name']),
+ response_dct.update({'actions':actions(response_dct['area_name']),
'action_selected':('contact',),
'contact_form':form, 'message':msg})
return render_to_response('chimere/contactus.html', response_dct,
context_instance=RequestContext(request))
-def extraPage(request, map_name="", page_id="", actions=default_actions):
+def extraPage(request, area_name="", page_id=""):
"""
Extra dynamic pages
"""
@@ -558,10 +527,10 @@ def extraPage(request, map_name="", page_id="", actions=default_actions):
page = Page.objects.get(available=True, mnemonic=page_id)
except ObjectDoesNotExist:
return redirect(reverse('chimere:index'))
- response_dct, redir = get_base_response(request, map_name)
+ response_dct, redir = get_base_response(request, area_name)
if redir:
return redir
- response_dct.update({'actions':actions(request.user, response_dct['map_name']),
+ response_dct.update({'actions':actions(response_dct['area_name']),
'action_selected':(page_id,),
'content':page.content,
'title':page.title})
@@ -570,7 +539,7 @@ def extraPage(request, map_name="", page_id="", actions=default_actions):
return render_to_response(tpl, response_dct,
context_instance=RequestContext(request))
-def getDetail(request, map_name, marker_id):
+def getDetail(request, area_name, marker_id):
'''
Get the detail for a marker
'''
@@ -579,7 +548,7 @@ def getDetail(request, map_name, marker_id):
status__in=['A', 'S'])[0]
except (ValueError, IndexError):
return HttpResponse('no results')
- response_dct, redir = get_base_response(request, map_name)
+ response_dct, redir = get_base_response(request, area_name)
if redir:
return redir
response_dct['marker'] = marker
@@ -587,7 +556,7 @@ def getDetail(request, map_name, marker_id):
if 'simple' in request.GET and request.GET['simple']:
response_dct['simple'] = True
response_dct['share_networks'], net_dct = \
- getShareNetwork(request, response_dct['map_name'], marker)
+ getShareNetwork(request, response_dct['area_name'], marker)
response_dct['share_url'] = net_dct['url']
net_dct['to'] = settings.CONTACT_EMAIL
if net_dct['to']:
@@ -602,7 +571,7 @@ def getDetail(request, map_name, marker_id):
return render_to_response('chimere/detail.html', response_dct,
context_instance=RequestContext(request))
-def getDescriptionDetail(request, map_name, category_id):
+def getDescriptionDetail(request, area_name, category_id):
'''
Get the description for a category
'''
@@ -610,7 +579,7 @@ def getDescriptionDetail(request, map_name, category_id):
category = Category.objects.filter(id=int(category_id))[0]
except (ValueError, IndexError):
return HttpResponse('no results')
- response_dct, redir = get_base_response(request, map_name)
+ response_dct, redir = get_base_response(request, area_name)
if redir:
return redir
response_dct['category'] = category
@@ -632,82 +601,87 @@ def checkDate(q):
)
return q
-def getGeoObjects(request, map_name, category_ids, status):
+def _getGeoObjects(area_name, category_ids, status='A', getjson=True,
+ item_types=('Marker', 'Route')):
+ '''
+ Get markers and routes
+ '''
+ items = []
+ current_cat, colors, idx = None, None, 0
+ empty = [] if not getjson else {}
+
+ # marker
+ if 'Marker' in item_types:
+ try:
+ q = checkDate(Q(status__in=status, categories__in=category_ids))
+ query = Marker.objects.filter(q).distinct('pk').order_by('-pk')
+ except:
+ return empty
+
+ category_ids = [int(cat_id) for cat_id in category_ids]
+ if getjson:
+ for geo_object in list(query):
+ items += json.loads(geo_object.getGeoJSON(category_ids))
+ else:
+ items += list(query)
+
+ # routes
+ if 'Route' in item_types:
+ query = AggregatedRoute.objects.filter(status__in=status,
+ subcategory__in=category_ids).order_by('subcategory', '-pk')
+ if getjson:
+ for route in query.all():
+ c_cat = route.subcategory
+ if not current_cat or current_cat != c_cat:
+ idx = 0
+ current_cat = c_cat
+ colors = list(Color.objects.filter(
+ color_theme=c_cat.color_theme))
+ if colors:
+ items.append(json.loads(
+ route.getGeoJSON(color=colors[idx % len(colors)].code)))
+ else:
+ items.append(json.loads(route.getGeoJSON(color='000')))
+ idx += 1
+ else:
+ items += list(query)
+
+ if not items:
+ return empty
+ return items
+
+def getGeoObjects(request, area_name, category_ids, status):
'''
Get the JSON for markers and routes
'''
if not status:
status = 'A'
status = status.split('_')
- category_ids = category_ids.split('_')
- query = AggregatedRoute.objects.filter(status__in=status,
- subcategory__in=category_ids).order_by('subcategory')
- jsons = []
- current_cat, colors, idx = None, None, 0
- for route in query.all():
- c_cat = route.subcategory
- if not current_cat or current_cat != c_cat:
- idx = 0
- current_cat = c_cat
- colors = list(Color.objects.filter(color_theme = c_cat.color_theme))
- color = '000'
- if colors:
- color = colors[idx % len(colors)].code
- if '#' not in color:
- color = '#' + color
- base_dct = {"type":"Feature",
- "properties":{
- "color":color
- }
- }
- jsons.append(route._getItems(base_dct))
- idx += 1
- try:
- q = checkDate(Q(status__in=status, categories__in=category_ids))
- query = Marker.objects.filter(q).distinct('pk').order_by('pk')
- except:
- return HttpResponse('no results')
- category_ids = [int(cat_id) for cat_id in category_ids]
- for category_id in category_ids:
- if not category_id:
- continue
- cat = SubCategory.objects.get(pk=category_id)
- base_dct = {"type":"Feature",
- "properties":{
- "icon_path":unicode(cat.icon.image),
- "icon_hover_path":cat.hover_icon.image \
- if cat.hover_icon else '',
- "icon_width":cat.icon.image.width,
- 'icon_height':cat.icon.image.height,
- 'category_name':cat.name}
- }
- for values in query.filter(categories__pk=category_id).values(
- 'point', 'pk', 'name', 'weight'):
- jsons.append(Marker._getJson(values, copy.deepcopy(base_dct)))
+ category_ids = unicode(category_ids).split('_')
+
+ jsons = _getGeoObjects(area_name, category_ids, status)
if not jsons:
return HttpResponse('no results')
- data = {"type": "FeatureCollection", "features":jsons}
- data = json.dumps(data)
-
+ data = json.dumps({"type": "FeatureCollection", "features":jsons})
return HttpResponse(data, content_type="application/json")
-def getMarker(request, map_name, pk):
+def getMarker(request, area_name, pk):
q = Marker.objects.filter(pk=pk, status='A')
if not q.count():
return HttpResponse('{}')
data = q.all()[0].getGeoJSON()
return HttpResponse(data, content_type="application/json")
-def get_all_categories(request, map_name=None):
+def get_all_categories(request, area_name=None):
'''
Get all available categories in JSON
'''
- context_data, redir = get_base_response(request, map_name)
- map = context_data["map"]
+ context_data, redir = get_base_response(request, area_name)
+ area = context_data["area"]
subcategories = []
- if map:
- subcategories = list(map.getCategories('A',
- map_name=context_data['map_name']))
+ if area:
+ subcategories = list(area.getCategories('A',
+ area_name=context_data['area_name']))
else:
categories = SubCategory.getAvailable()
for cat, subcats in categories:
@@ -716,25 +690,25 @@ def get_all_categories(request, map_name=None):
jsons = json.dumps({'categories':subcats})
return HttpResponse(jsons)
-def get_available_categories(request, map_name=None, map=None, status='A',
+def get_available_categories(request, area_name=None, area=None, status='A',
force=None):
'''
- Get category menu for a designed map
+ Get category menu for a designed area
'''
- context_data, redir = get_base_response(request, map_name)
- map = context_data["map"]
+ context_data, redir = get_base_response(request, area_name)
+ area = context_data["area"]
if redir:
return redir
- if map and map.dynamic_categories and \
+ if area and area.dynamic_categories and \
not "current_extent" in request.GET:
context_data['sub_categories'] = []
return render_to_response('chimere/blocks/categories.html', context_data,
context_instance=RequestContext(request))
- if not map or not map.dynamic_categories:
+ if not area or not area.dynamic_categories:
# Categories are not updated dynamicaly when the user move the map
# so we return ALL the categories
subcategories = SubCategory.getAvailable(
- map_name=context_data['map_name'])
+ area_name=context_data['area_name'])
context_data['sub_categories'] = subcategories
return render_to_response('chimere/blocks/categories.html', context_data,
context_instance=RequestContext(request))
@@ -746,12 +720,12 @@ def get_available_categories(request, map_name=None, map=None, status='A',
status = status.split('_')
current_extent = request.GET["current_extent"].replace('M', '-')\
.replace('D', '.')
- map = SimpleArea([float(pt) for pt in current_extent.split('_')])
+ area = SimpleArea([float(pt) for pt in current_extent.split('_')])
except:
# bad extent format
return HttpResponse(default_message)
- # if not force and map.isIn(SimpleArea(cookie.AREA):return
- categories = map.getCategories(status, map_name=context_data['map_name'])
+ # if not force and area.isIn(SimpleArea(cookie.AREA):return
+ categories = area.getCategories(status, area_name=context_data['area_name'])
if not categories:
return HttpResponse(default_message)
get_cat = lambda subcat: subcat.category
@@ -764,7 +738,7 @@ def get_available_categories(request, map_name=None, map=None, status='A',
return render_to_response('chimere/blocks/categories.html', context_data,
context_instance=RequestContext(request))
-def getCategory(request, map_name='', category_id=0):
+def getCategory(request, area_name='', category_id=0):
'''
Get the JSON for a category (mainly in order to get the description)
'''
@@ -774,7 +748,7 @@ def getCategory(request, map_name='', category_id=0):
return HttpResponse('no results')
return HttpResponse(category.getJSON())
-def getTinyfiedUrl(request, parameters, map_name=''):
+def getTinyfiedUrl(request, parameters, area_name=''):
'''
Get the tinyfied version of parameters
'''
@@ -783,11 +757,11 @@ def getTinyfiedUrl(request, parameters, map_name=''):
urn = TinyUrl.getUrnByParameters(parameters)
except:
return {}
- response_dct, redir = get_base_response(request, map_name)
+ response_dct, redir = get_base_response(request, area_name)
if redir:
return redir
- url = reverse('chimere:tiny', args=[(response_dct['map_name'] \
- if response_dct['map_name'] else '') + '/', urn])
+ url = reverse('chimere:tiny', args=[(response_dct['area_name'] \
+ if response_dct['area_name'] else '') + '/', urn])
if not url.startswith('http'):
url = get_base_uri(request) + url
url = re.sub("([^:])\/\/", "\g<1>/", url)
@@ -804,17 +778,89 @@ def getTinyfiedUrl(request, parameters, map_name=''):
data["text"] = urlquote(text)
return data
-def redirectFromTinyURN(request, map_name='', tiny_urn=''):
+def redirectFromTinyURN(request, area_name='', tiny_urn=''):
"""
Redirect from a tiny Urn
"""
parameters = '?' + TinyUrl.getParametersByUrn(tiny_urn)
- response_dct, redir = get_base_response(request, map_name)
+ response_dct, redir = get_base_response(request, area_name)
if redir:
return redir
return HttpResponseRedirect(response_dct['extra_url'] + parameters)
-def route(request, map_name, lon1, lat1, lonlat_steps, lon2, lat2,
+class CategoryDirectoryView(ListView):
+ template_name = "chimere/category_directory.html"
+
+ def get_queryset(self):
+ self.area_name = self.kwargs.get('area_name', None)
+ if self.area_name:
+ self.area_name = self.area_name.split('/')[0]
+ area = get_object_or_404(Area, urn=self.area_name, available=True)
+ q = area.subcategories.filter(available=True,
+ category__available=True
+ ).order_by('category__order', 'category__id', 'order')
+ if q.count():
+ return q
+ return SubCategory.objects.filter(available=True,
+ category__available=True
+ ).order_by('category__order', 'category__id', 'order')
+
+ def get_context_data(self, *args, **kwargs):
+ context = super(CategoryDirectoryView, self).get_context_data(
+ *args, **kwargs)
+ new_context, redirect = get_base_response(self.request, self.area_name)
+ context.update(new_context)
+ context.update({
+ 'actions':actions(self.area_name),
+ 'action_selected':('categories',),
+ })
+ return context
+
+class CategoryView(TemplateView):
+ template_name = "chimere/category_directory_detail.html"
+
+ def get_geo_items(self):
+ # TODO: simplify on v2.3 when slug are available
+ category_slug = self.kwargs.get('category_slug')
+ self.area_name = self.kwargs.get('area_name', None)
+ q = None
+ if self.area_name:
+ self.area_name = self.area_name.split('/')[0]
+ area = get_object_or_404(Area, urn=self.area_name, available=True)
+ q = area.subcategories.filter(available=True,
+ category__available=True)
+ if not q.count():
+ q = None
+ if not q:
+ q = SubCategory.objects.filter(available=True,
+ category__available=True)
+ self.category = None
+ for subcat in q:
+ if defaultfilters.slugify(subcat.name) == category_slug:
+ self.category = subcat
+ break
+ if not self.category:
+ raise Http404(_("Category does not exist"))
+
+ items = _getGeoObjects(self.area_name, [unicode(self.category.pk)],
+ getjson=False, item_types=('Marker',))
+ return items
+
+ def get_context_data(self, *args, **kwargs):
+ context = super(CategoryView, self).get_context_data(
+ *args, **kwargs)
+ self.items = self.get_geo_items()
+ new_context, redirect = get_base_response(self.request, self.area_name)
+ context.update(new_context)
+ context.update({
+ 'actions':actions(self.area_name),
+ 'action_selected':('categories',),
+ 'category':self.category,
+ 'items':self.items
+ })
+ return context
+
+def route(request, area_name, lon1, lat1, lonlat_steps, lon2, lat2,
transport='foot', speed=''):
'''
Get the JSON for a route
@@ -893,18 +939,14 @@ def route(request, map_name, lon1, lat1, lonlat_steps, lon2, lat2,
message)
return HttpResponse(data)
-def get_json(request, map_name='', app_name='', filename=''):
- return HttpResponse(open(settings.STATIC_ROOT+app_name+'/json/'+filename+'.json'),
- 'application/javascript', status=200)
-
-def rss(request, map_name='', actions=default_actions):
+def rss(request, area_name=''):
'''
Redirect to RSS subscription page
'''
- response_dct, redir = get_base_response(request, map_name)
+ response_dct, redir = get_base_response(request, area_name)
if redir:
return redir
- response_dct.update({'actions':actions(request.user, response_dct['map_name']),
+ response_dct.update({'actions':actions(response_dct['area_name']),
'action_selected':('rss',),
'category_rss_feed':'',})
# If the form has been submited
@@ -926,14 +968,14 @@ def rss(request, map_name='', actions=default_actions):
# User wants to follow all the new POI situated in a defined area
elif request.POST['rss_category'] == 'area':
# An unbound form
- form = MapForm()
+ form = AreaForm()
area_widget = AreaWidget().render('area', None)
response_dct.update({
'map_layer':settings.CHIMERE_DEFAULT_MAP_LAYER,
'extra_head':form.media,
'form':form,
'category_rss_feed':'area',
- 'map_id':Map.getAvailable(),
+ 'area_id':Area.getAvailable(),
'area_widget':area_widget
})
return render_to_response('chimere/feeds/rss.html',
@@ -964,10 +1006,10 @@ def rss(request, map_name='', actions=default_actions):
kwargs={'category_id':cat_id})
return redirect(feeds_link)
- # User has specified the ID of the map he wants to follow
- if 'id_map' in request.POST and request.POST['id_map'] != '':
- feeds_link = reverse('chimere:feeds-mapid',
- kwargs={'map_id':request.POST['id_map']})
+ # User has specified the ID of the area he wants to follow
+ if 'id_area' in request.POST and request.POST['id_area'] != '':
+ feeds_link = reverse('chimere:feeds-areaid',
+ kwargs={'area_id':request.POST['id_area']})
return redirect(feeds_link)
# User has specified the area he wants to follow => we redirect him
@@ -1002,12 +1044,12 @@ def rss(request, map_name='', actions=default_actions):
context_instance=RequestContext(request))
if request.GET['rss_category'] == 'area':
# An unbound form
- form = MapForm()
+ form = AreaForm()
response_dct.update({'map_layer':settings.MAP_LAYER,
'extra_head':form.media,
'form':form,
'category_rss_feed':'area',
- 'map_id':Map.getAvailable(),
+ 'area_id':Area.getAvailable(),
'area_widget':AreaWidget().render('area', None)})
return render_to_response('chimere/feeds/rss.html', response_dct,
context_instance=RequestContext(request))
@@ -1026,7 +1068,11 @@ if hasattr(settings, 'CHIMERE_SEARCH_ENGINE') \
from haystack.views import SearchView as HaystackSearchView
from haystack.query import SearchQuerySet
class SearchView(HaystackSearchView):
- pass
+ def extra_context(self, *args, **kwargs):
+ context = super(SearchView, self).extra_context(*args, **kwargs)
+ context["autocomplete"] = settings.HAYSTACK_AUTOCOMPLETE \
+ if hasattr(settings, 'HAYSTACK_AUTOCOMPLETE') else False
+ return context
def autocomplete(request):
sqs = SearchQuerySet().autocomplete(
content_auto=request.GET.get('q', ''))[:5]