diff options
Diffstat (limited to 'chimere/views.py')
-rw-r--r-- | chimere/views.py | 342 |
1 files changed, 213 insertions, 129 deletions
diff --git a/chimere/views.py b/chimere/views.py index a417fad..01179e4 100644 --- a/chimere/views.py +++ b/chimere/views.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -# Copyright (C) 2008-2013 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> +# Copyright (C) 2008-2014 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> # # RSS : Copyright (C) 2010 Pierre Clarenc <pierre.crc_AT_gmailDOTcom>, # Samuel Renard <renard.samuel_AT_gmailDOTcom>, @@ -24,11 +24,14 @@ Views of the project """ +import copy import datetime from itertools import groupby import re 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 @@ -44,16 +47,16 @@ from django.utils import simplejson as json from django.utils.http import urlquote from django.utils.translation import ugettext as _ -from chimere.actions import actions +from chimere.actions import actions as default_actions from chimere.models import Category, SubCategory, PropertyModel, Page,\ - Marker, Route, News, SimpleArea, Area, Color, TinyUrl, RouteFile,\ + Marker, Route, News, SimpleArea, Map, Color, TinyUrl, RouteFile,\ AggregatedRoute -from chimere.widgets import getMapJS, PointChooserWidget, \ +from chimere.widgets import getMapJS, PointChooserWidget, NominatimWidget,\ RouteChooserWidget, AreaWidget from chimere.forms import MarkerForm, RouteForm, ContactForm, FileForm, \ FullFileForm, MultimediaFileFormSet, PictureFileFormSet, notifySubmission,\ - notifyStaff, AreaForm, RoutingForm, getStaffEmails + notifyStaff, MapForm, RoutingForm, getStaffEmails from chimere.route import router @@ -70,43 +73,41 @@ def get_base_uri(request): return base_uri #TODO: convert to requestcontext -def get_base_response(request, area_name=""): +def get_base_response(request, map_name="", propose=False): """ Get the base url """ - base_response_dct = {'media_path':settings.MEDIA_URL,} + base_response_dct = {'media_path':settings.MEDIA_URL, + 'is_authenticated':request.user.is_authenticated()} 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 area_name and area_name.endswith('/'): - area_name = area_name[:-1] - if area_name: - base_response_dct['area_name_slash'] = area_name + "/" + if map_name and map_name.endswith('/'): + map_name = map_name[:-1] + if map_name: + base_response_dct['map_name_slash'] = map_name + "/" if base_url[-1] != '/': base_url += '/' - base_url += area_name + '/' + base_url += map_name + '/' base_response_dct['extra_url'] = base_url - 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 + 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['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['map'] = map + base_response_dct['map_name'] = map_name + if map and map.external_css: + base_response_dct['css_map'] = map.external_css base_response_dct['dynamic_categories'] = True \ - if area and area.dynamic_categories else False + if map and map.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 @@ -114,17 +115,17 @@ def get_base_response(request, area_name=""): base_response_dct['EXTRA_CSS'] = settings.EXTRA_CSS return base_response_dct, None -def getShareUrl(request, area_name='', network=''): +def getShareUrl(request, map_name='', network=''): """ Get a share url """ - data = getTinyfiedUrl(request, request.GET.urlencode(), area_name) + data = getTinyfiedUrl(request, request.GET.urlencode(), map_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, area_name='', marker=None): +def getShareNetwork(request, map_name='', marker=None): """ Get URLs to share items """ @@ -133,14 +134,19 @@ def getShareNetwork(request, area_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, area_name) + net_dct = getTinyfiedUrl(request, parameters, map_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 index(request, area_name=None, default_area=None, simple=False, - get_response=False): + +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): """ Main page """ @@ -152,9 +158,28 @@ def index(request, area_name=None, default_area=None, simple=False, request.session['last_visit'] != today: request.session['last_visit'] = today news_visible = True - response_dct, redir = get_base_response(request, area_name) + response_dct, redir = get_base_response(request, map_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 \ @@ -172,21 +197,24 @@ def index(request, area_name=None, default_area=None, simple=False, except: pass response_dct.update({ - 'actions':actions(response_dct['area_name']), + 'actions':actions(request.user, response_dct['map_name']), 'action_selected':('view',), 'error_message':'', + 'is_map':True, 'news_visible': news_visible, - 'areas_visible': settings.CHIMERE_DISPLAY_AREAS, + 'maps_visible': settings.CHIMERE_DISPLAY_MAPS, 'map_layer':settings.CHIMERE_DEFAULT_MAP_LAYER, 'dynamic_categories':response_dct['dynamic_categories'], 'zoomout':zoomout, - 'has_default_area':Area.objects.filter(default=True).count(), - 'zoomout':zoomout + 'has_default_map':Map.objects.filter(default=True).count(), + 'zoomout':zoomout, + 'has_search':settings.CHIMERE_SEARCH_ENGINE, + 'zoomout':zoomout, }) 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['area_name']) + getShareNetwork(request, response_dct['map_name']) tpl = 'chimere/main_map.html' response_dct['simple'] = simple if simple: @@ -202,13 +230,13 @@ def get_edit_page(redirect_url, item_cls, item_form, """ Edition page """ - def func(request, area_name="", item_id=None, cat_type=['M']): - response_dct, redir = get_base_response(request, area_name) + def func(request, map_name="", item_id=None, cat_type=['M']): + response_dct, redir = get_base_response(request, map_name, propose=True) if redir: return redir, None, None - if 'area_name' in response_dct: - area_name = response_dct['area_name'] - subcategories = SubCategory.getAvailable(cat_type, area_name, + if 'map_name' in response_dct: + map_name = response_dct['map_name'] + subcategories = SubCategory.getAvailable(cat_type, map_name, public=True) listed_subcats = [] if subcategories: @@ -221,7 +249,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, area_name + '/' if area_name \ + return redirect(redirect_url, map_name + '/' if map_name \ else ''), None, None ref_item = init_item modified_item = item_cls.objects.filter(ref_item=init_item, @@ -232,18 +260,17 @@ 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 request.user.is_superuser and \ + if init_item and not response_dct['can_write'] 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 superuser - if init_item and (request.user.is_superuser or \ + # allow to directly modify only if owner or has can_write permission + if init_item and (response_dct['can_write'] or \ init_item.submiter_session_key == \ request.session.session_key): inst = init_item @@ -256,7 +283,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() + item = form.save(can_write=response_dct.get('can_write')) # set the session key (to permit modifications) item.submiter_session_key = request.session.session_key @@ -274,7 +301,7 @@ def get_edit_page(redirect_url, item_cls, item_form, # just submited if not item.status: - item.status = 'S' + item.status = 'A' if response_dct.get('can_write') else 'S' item.save() marker = item @@ -290,9 +317,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, area_name) + response_dct = get_base_response(request, map_name) return redirect(redirect_url + '-item', - area_name + '/' if area_name else '', + map_name + '/' if map_name else '', item.ref_item.pk, 'submited'), None, subcategories else: response_dct['error_message'] = _(u"There are missing field(s)" @@ -309,11 +336,12 @@ def get_edit_page(redirect_url, item_cls, item_form, get_edit_marker = get_edit_page('chimere:edit', Marker, MarkerForm) -def edit(request, area_name="", item_id=None, submited=False): +def edit(request, map_name="", item_id=None, submited=False, + actions=default_actions): """ Edition page """ - response, values, sub_categories = get_edit_marker(request, area_name, + response, values, sub_categories = get_edit_marker(request, map_name, item_id, ['M', 'B']) if response: return response @@ -327,20 +355,24 @@ def edit(request, area_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(response_dct['area_name']), + 'actions':actions(request.user, response_dct['map_name']), 'action_selected':('contribute', 'edit'), 'map_layer':settings.CHIMERE_DEFAULT_MAP_LAYER, 'form':form, 'formset_multi':formset_multi, 'formset_picture':formset_picture, - 'dated':settings.CHIMERE_DAYS_BEFORE_EVENT, - 'extra_head':form.media, + 'dated':has_dated_items, + 'extra_head':form.media + NominatimWidget().media, 'marker_id':item_id, 'sub_categories':sub_categories, 'point_widget':PointChooserWidget().render('point', point_value, - area_name=response_dct['area_name']), + map_name=response_dct['map_name']), + 'nominatim_widget':NominatimWidget().render('point'), 'properties':declared_fields, 'filtered_properties':filtered_properties, 'submited':submited @@ -351,8 +383,8 @@ def edit(request, area_name="", item_id=None, submited=False): return render_to_response('chimere/edit.html', response_dct, context_instance=RequestContext(request)) -def uploadFile(request, category_id='', area_name=''): - response_dct, redir = get_base_response(request, area_name) +def uploadFile(request, category_id='', map_name=''): + response_dct, redir = get_base_response(request, map_name) if redir: return redir Form = FileForm if not category_id else FullFileForm @@ -399,7 +431,7 @@ def uploadFile(request, category_id='', area_name=''): return render_to_response('chimere/upload_file.html', response_dct, context_instance=RequestContext(request)) -def processRouteFile(request, area_name='', file_id=None): +def processRouteFile(request, map_name='', file_id=None): if file_id: try: route_file = RouteFile.objects.get(pk=file_id) @@ -417,11 +449,12 @@ def processRouteFile(request, area_name='', file_id=None): get_edit_route = get_edit_page('chimere:editroute', Route, RouteForm) -def editRoute(request, area_name="", item_id=None, submited=False): +def editRoute(request, map_name="", item_id=None, submited=False, + actions=default_actions): """ Route edition page """ - response, values, sub_categories = get_edit_route(request, area_name, + response, values, sub_categories = get_edit_route(request, map_name, item_id, ['R', 'B']) if response: return response @@ -435,19 +468,22 @@ def editRoute(request, area_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(response_dct['area_name']), + 'actions':actions(request.user, response_dct['map_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':settings.CHIMERE_DAYS_BEFORE_EVENT, + 'dated':has_dated_items, 'extra_head':form.media, 'sub_categories':sub_categories, 'route_widget':RouteChooserWidget().render('route', route_value, - area_name=response_dct['area_name'], routefile_id='',), + map_name=response_dct['map_name'], routefile_id='',), 'properties':declared_fields, 'submited':submited }) @@ -457,34 +493,33 @@ def editRoute(request, area_name="", item_id=None, submited=False): return render_to_response('chimere/edit_route.html', response_dct, context_instance=RequestContext(request)) -def submited(request, area_name="", action=""): +def submited(request, map_name="", action="", actions=default_actions): """ Successful submission page """ - response_dct, redir = get_base_response(request, area_name) + response_dct, redir = get_base_response(request, map_name) if redir: return redir - dct = {'actions':actions(response_dct['area_name']), - 'action_selected':action,} + response_dct.update({'actions':actions(request.user, response_dct['map_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, area_name=""): +def charte(request, map_name="", actions=default_actions): """ Affichage de la charte """ - response_dct, redir = get_base_response(request, area_name) + response_dct, redir = get_base_response(request, map_name) if redir: return redir - response_dct.update({'actions':actions(response_dct['area_name']), + response_dct.update({'actions':actions(request.user, response_dct['map_name']), 'action_selected':('charte',)}) return render_to_response('chimere/charte.html', response_dct, context_instance=RequestContext(request)) -def contactus(request, area_name=""): +def contactus(request, map_name="", actions=default_actions): """ Contact page """ @@ -505,16 +540,16 @@ def contactus(request, area_name=""): msg = _(u"Temporary error. Renew your message later.") else: form = ContactForm() - response_dct, redir = get_base_response(request, area_name) + response_dct, redir = get_base_response(request, map_name) if redir: return redir - response_dct.update({'actions':actions(response_dct['area_name']), + response_dct.update({'actions':actions(request.user, response_dct['map_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, area_name="", page_id=""): +def extraPage(request, map_name="", page_id="", actions=default_actions): """ Extra dynamic pages """ @@ -522,10 +557,10 @@ def extraPage(request, area_name="", page_id=""): page = Page.objects.get(available=True, mnemonic=page_id) except ObjectDoesNotExist: return redirect(reverse('chimere:index')) - response_dct, redir = get_base_response(request, area_name) + response_dct, redir = get_base_response(request, map_name) if redir: return redir - response_dct.update({'actions':actions(response_dct['area_name']), + response_dct.update({'actions':actions(request.user, response_dct['map_name']), 'action_selected':(page_id,), 'content':page.content, 'title':page.title}) @@ -534,7 +569,7 @@ def extraPage(request, area_name="", page_id=""): return render_to_response(tpl, response_dct, context_instance=RequestContext(request)) -def getDetail(request, area_name, marker_id): +def getDetail(request, map_name, marker_id): ''' Get the detail for a marker ''' @@ -543,7 +578,7 @@ def getDetail(request, area_name, marker_id): status__in=['A', 'S'])[0] except (ValueError, IndexError): return HttpResponse('no results') - response_dct, redir = get_base_response(request, area_name) + response_dct, redir = get_base_response(request, map_name) if redir: return redir response_dct['marker'] = marker @@ -551,7 +586,7 @@ def getDetail(request, area_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['area_name'], marker) + getShareNetwork(request, response_dct['map_name'], marker) response_dct['share_url'] = net_dct['url'] net_dct['to'] = settings.CONTACT_EMAIL if net_dct['to']: @@ -566,7 +601,7 @@ def getDetail(request, area_name, marker_id): return render_to_response('chimere/detail.html', response_dct, context_instance=RequestContext(request)) -def getDescriptionDetail(request, area_name, category_id): +def getDescriptionDetail(request, map_name, category_id): ''' Get the description for a category ''' @@ -574,7 +609,7 @@ def getDescriptionDetail(request, area_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, area_name) + response_dct, redir = get_base_response(request, map_name) if redir: return redir response_dct['category'] = category @@ -596,7 +631,7 @@ def checkDate(q): ) return q -def getGeoObjects(request, area_name, category_ids, status): +def getGeoObjects(request, map_name, category_ids, status): ''' Get the JSON for markers and routes ''' @@ -614,10 +649,17 @@ def getGeoObjects(request, area_name, category_ids, status): idx = 0 current_cat = c_cat colors = list(Color.objects.filter(color_theme = c_cat.color_theme)) + color = '000' if colors: - jsons.append(route.getGeoJSON(color=colors[idx % len(colors)].code)) - else: - jsons.append(route.getGeoJSON(color='000')) + 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)) @@ -625,22 +667,39 @@ def getGeoObjects(request, area_name, category_ids, status): except: return HttpResponse('no results') category_ids = [int(cat_id) for cat_id in category_ids] - jsons += [geo_object.getGeoJSON(category_ids) for geo_object in list(query)] + 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))) if not jsons: return HttpResponse('no results') - data = '{"type": "FeatureCollection", "features":[%s]}' % ",".join(jsons) + data = {"type": "FeatureCollection", "features":jsons} + data = json.dumps(data) + return HttpResponse(data) -def get_all_categories(request, area_name=None): +def get_all_categories(request, map_name=None): ''' Get all available categories in JSON ''' - context_data, redir = get_base_response(request, area_name) - area = context_data["area"] + context_data, redir = get_base_response(request, map_name) + map = context_data["map"] subcategories = [] - if area: - subcategories = list(area.getCategories('A', - area_name=context_data['area_name'])) + if map: + subcategories = list(map.getCategories('A', + map_name=context_data['map_name'])) else: categories = SubCategory.getAvailable() for cat, subcats in categories: @@ -649,25 +708,25 @@ def get_all_categories(request, area_name=None): jsons = json.dumps({'categories':subcats}) return HttpResponse(jsons) -def get_available_categories(request, area_name=None, area=None, status='A', +def get_available_categories(request, map_name=None, map=None, status='A', force=None): ''' - Get category menu for a designed area + Get category menu for a designed map ''' - context_data, redir = get_base_response(request, area_name) - area = context_data["area"] + context_data, redir = get_base_response(request, map_name) + map = context_data["map"] if redir: return redir - if area and area.dynamic_categories and \ + if map and map.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 area or not area.dynamic_categories: + if not map or not map.dynamic_categories: # Categories are not updated dynamicaly when the user move the map # so we return ALL the categories subcategories = SubCategory.getAvailable( - area_name=context_data['area_name']) + map_name=context_data['map_name']) context_data['sub_categories'] = subcategories return render_to_response('chimere/blocks/categories.html', context_data, context_instance=RequestContext(request)) @@ -679,12 +738,12 @@ def get_available_categories(request, area_name=None, area=None, status='A', status = status.split('_') current_extent = request.GET["current_extent"].replace('M', '-')\ .replace('D', '.') - area = SimpleArea([float(pt) for pt in current_extent.split('_')]) + map = SimpleArea([float(pt) for pt in current_extent.split('_')]) except: # bad extent format return HttpResponse(default_message) - # if not force and area.isIn(SimpleArea(cookie.AREA):return - categories = area.getCategories(status, area_name=context_data['area_name']) + # if not force and map.isIn(SimpleArea(cookie.AREA):return + categories = map.getCategories(status, map_name=context_data['map_name']) if not categories: return HttpResponse(default_message) get_cat = lambda subcat: subcat.category @@ -697,7 +756,7 @@ def get_available_categories(request, area_name=None, area=None, status='A', return render_to_response('chimere/blocks/categories.html', context_data, context_instance=RequestContext(request)) -def getCategory(request, area_name='', category_id=0): +def getCategory(request, map_name='', category_id=0): ''' Get the JSON for a category (mainly in order to get the description) ''' @@ -707,7 +766,7 @@ def getCategory(request, area_name='', category_id=0): return HttpResponse('no results') return HttpResponse(category.getJSON()) -def getTinyfiedUrl(request, parameters, area_name=''): +def getTinyfiedUrl(request, parameters, map_name=''): ''' Get the tinyfied version of parameters ''' @@ -716,11 +775,11 @@ def getTinyfiedUrl(request, parameters, area_name=''): urn = TinyUrl.getUrnByParameters(parameters) except: return {} - response_dct, redir = get_base_response(request, area_name) + response_dct, redir = get_base_response(request, map_name) if redir: return redir - url = reverse('chimere:tiny', args=[(response_dct['area_name'] \ - if response_dct['area_name'] else '') + '/', urn]) + url = reverse('chimere:tiny', args=[(response_dct['map_name'] \ + if response_dct['map_name'] else '') + '/', urn]) if not url.startswith('http'): url = get_base_uri(request) + url url = re.sub("([^:])\/\/", "\g<1>/", url) @@ -737,17 +796,17 @@ def getTinyfiedUrl(request, parameters, area_name=''): data["text"] = urlquote(text) return data -def redirectFromTinyURN(request, area_name='', tiny_urn=''): +def redirectFromTinyURN(request, map_name='', tiny_urn=''): """ Redirect from a tiny Urn """ parameters = '?' + TinyUrl.getParametersByUrn(tiny_urn) - response_dct, redir = get_base_response(request, area_name) + response_dct, redir = get_base_response(request, map_name) if redir: return redir return HttpResponseRedirect(response_dct['extra_url'] + parameters) -def route(request, area_name, lon1, lat1, lonlat_steps, lon2, lat2, +def route(request, map_name, lon1, lat1, lonlat_steps, lon2, lat2, transport='foot', speed=''): ''' Get the JSON for a route @@ -826,14 +885,18 @@ def route(request, area_name, lon1, lat1, lonlat_steps, lon2, lat2, message) return HttpResponse(data) -def rss(request, area_name=''): +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): ''' Redirect to RSS subscription page ''' - response_dct, redir = get_base_response(request, area_name) + response_dct, redir = get_base_response(request, map_name) if redir: return redir - response_dct.update({'actions':actions(response_dct['area_name']), + response_dct.update({'actions':actions(request.user, response_dct['map_name']), 'action_selected':('rss',), 'category_rss_feed':'',}) # If the form has been submited @@ -855,14 +918,14 @@ def rss(request, area_name=''): # User wants to follow all the new POI situated in a defined area elif request.POST['rss_category'] == 'area': # An unbound form - form = AreaForm() + form = MapForm() 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', - 'area_id':Area.getAvailable(), + 'map_id':Map.getAvailable(), 'area_widget':area_widget }) return render_to_response('chimere/feeds/rss.html', @@ -893,10 +956,10 @@ def rss(request, area_name=''): kwargs={'category_id':cat_id}) return redirect(feeds_link) - # 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']}) + # 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']}) return redirect(feeds_link) # User has specified the area he wants to follow => we redirect him @@ -931,12 +994,12 @@ def rss(request, area_name=''): context_instance=RequestContext(request)) if request.GET['rss_category'] == 'area': # An unbound form - form = AreaForm() + form = MapForm() response_dct.update({'map_layer':settings.MAP_LAYER, 'extra_head':form.media, 'form':form, 'category_rss_feed':'area', - 'area_id':Area.getAvailable(), + 'map_id':Map.getAvailable(), 'area_widget':AreaWidget().render('area', None)}) return render_to_response('chimere/feeds/rss.html', response_dct, context_instance=RequestContext(request)) @@ -945,3 +1008,24 @@ def rss(request, area_name=''): else: return render_to_response('chimere/feeds/rss.html', response_dct, context_instance=RequestContext(request)) + +from django.core.paginator import Paginator, InvalidPage + +SearchView = None +autocomplete = None +if hasattr(settings, 'CHIMERE_SEARCH_ENGINE') \ + and settings.CHIMERE_SEARCH_ENGINE: + from haystack.views import SearchView as HaystackSearchView + from haystack.query import SearchQuerySet + class SearchView(HaystackSearchView): + pass + def autocomplete(request): + sqs = SearchQuerySet().autocomplete( + content_auto=request.GET.get('q', ''))[:5] + suggestions = [result.object.name for result in sqs if result.object] + # make sure it returns a JSON object, not a bare list. + # otherwise, it could be vulnerable to an XSS attack. + the_data = json.dumps({ + 'results': suggestions + }) + return HttpResponse(the_data, content_type='application/json') |