diff options
Diffstat (limited to 'chimere/views.py')
| -rw-r--r-- | chimere/views.py | 144 | 
1 files changed, 122 insertions, 22 deletions
| diff --git a/chimere/views.py b/chimere/views.py index eeacd81..fd8f927 100644 --- a/chimere/views.py +++ b/chimere/views.py @@ -26,6 +26,7 @@ Views of the project  import datetime  from itertools import groupby +import simplejson  from django.conf import settings  from django.core import serializers @@ -34,20 +35,22 @@ 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.template import loader, RequestContext +from django.template import loader, RequestContext, defaultfilters  from django.utils import simplejson  from django.utils.http import urlquote  from django.utils.translation import ugettext as _  from chimere.actions import actions -from chimere.models import Category, SubCategory, PropertyModel, \ +from chimere.models import Category, SubCategory, PropertyModel, Page,\                Marker, Route, News, SimpleArea, Area, Color, TinyUrl, RouteFile  from chimere.widgets import getMapJS, PointChooserWidget, \                              RouteChooserWidget, AreaWidget  from chimere.forms import MarkerForm, RouteForm, ContactForm, FileForm, \       FullFileForm, MultimediaFileFormSet, PictureFileFormSet, notifySubmission,\ -     notifyStaff, AreaForm +     notifyStaff, AreaForm, RoutingForm, getStaffEmails + +from chimere.route import router  def get_base_uri(request):      base_uri = 'http://' @@ -101,6 +104,31 @@ def get_base_response(area_name=""):      base_response_dct['JQUERY_CSS_URLS'] = settings.JQUERY_CSS_URLS      return base_response_dct, None +def getShareUrl(request, area_name='', network=''): +    """ +    Get a share url +    """ +    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, area_name='', marker=None): +    """ +    Get URLs to share items +    """ +    parameters = "" +    if marker: +        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) +    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):      """      Main page @@ -121,15 +149,21 @@ def index(request, area_name=None, default_area=None, simple=False):      if request.GET and 'lat' in request.GET \        and 'lon' in request.GET:          zoomout = None +    if settings.CHIMERE_ENABLE_ROUTING: +        response_dct['itinerary_form'] = RoutingForm()      response_dct.update({ -         'actions':actions, 'action_selected':('view',), +         'actions':actions(response_dct['area_name']), +         'action_selected':('view',),           'error_message':'',           'news_visible': news_visible,           'areas_visible': settings.CHIMERE_DISPLAY_AREAS,           'map_layer':settings.CHIMERE_DEFAULT_MAP_LAYER,           'dynamic_categories':response_dct['dynamic_categories'], -         'zoomout':zoomout +         'zoomout':zoomout, +         'contact_email':settings.CONTACT_EMAIL          }) +    response_dct['share_networks'], net_dct = \ +                   getShareNetwork(request, response_dct['area_name'])      tpl = 'chimere/main_map.html'      if simple:          tpl = 'chimere/main_map_simple.html' @@ -260,7 +294,7 @@ def edit(request, area_name="", item_id=None, submited=False):      filtered_properties = PropertyModel.objects.filter(available=True,                                  subcategories__id__isnull=False).all()      response_dct.update({ -        'actions':actions, +        'actions':actions(response_dct['area_name']),          'action_selected':('contribute', 'edit'),          'map_layer':settings.CHIMERE_DEFAULT_MAP_LAYER,          'form':form, @@ -365,7 +399,7 @@ def editRoute(request, area_name="", item_id=None, submited=False):      if 'description' in declared_fields:          declared_fields.pop(declared_fields.index('description'))      response_dct.update({ -        'actions':actions, +        'actions':actions(response_dct['area_name']),          'action_selected':('contribute', 'edit-route'),          'error_message':'',          'map_layer':settings.CHIMERE_DEFAULT_MAP_LAYER, @@ -392,12 +426,20 @@ def welcome(request, display=None):      Welcome string      """      response_dct = {'display':display} -    news = list(News.objects.filter(available=True).all()) +    news = list(News.objects.filter(available=True, is_front_page=True).all())      if settings.CHIMERE_DAYS_BEFORE_EVENT: -        q = checkDate(Q(status='A', start_date__isnull=False)) +        q = checkDate(Q(status='A', start_date__isnull=False, +                        is_front_page=True))          news += list(Marker.objects.filter(q).all()) -    news.sort(key=lambda x:x.date, reverse=True) +    news.sort(key=lambda x:x.date, reverse=True)[:3]      response_dct['news_lst'] = news +    if "area_name" in context: +        try: +            area = Area.objects.get(urn=context["area_name"]) +            context_data['area_name'] = context['area_name'] +            context_data['welcome_message'] = area.welcome_message +        except ObjectDoesNotExist: +            pass      return loader.render_to_string('chimere/blocks/welcome.html', response_dct,                                         context_instance=RequestContext(request)) @@ -408,7 +450,8 @@ def submited(request, area_name="", action=""):      response_dct, redir = get_base_response(area_name)      if redir:          return redir -    response_dct.update({'actions':actions, 'action_selected':action,}) +    response_dct.update({'actions':actions(response_dct['area_name']), +                         'action_selected':action,})      return render_to_response('chimere/submited.html', response_dct,                                context_instance=RequestContext(request)) @@ -419,7 +462,8 @@ def charte(request, area_name=""):      response_dct, redir = get_base_response(area_name)      if redir:          return redir -    response_dct.update({'actions':actions, 'action_selected':('charte',)}) +    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)) @@ -447,11 +491,32 @@ def contactus(request, area_name=""):      response_dct, redir = get_base_response(area_name)      if redir:          return redir -    response_dct.update({'actions':actions, 'action_selected':('contact',), +    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, area_name="", page_id=""): +    """ +    Extra dynamic pages +    """ +    try: +        page = Page.objects.get(available=True, mnemonic=page_id) +    except ObjectDoesNotExist: +        return redirect(reverse('chimere:index')) +    response_dct, redir = get_base_response(area_name) +    if redir: +        return redir +    response_dct.update({'actions':actions(response_dct['area_name']), +                         'action_selected':(page_id,), +                         'content':page.content, +                         'title':page.title}) +    tpl = page.template_path if page.template_path \ +                             else 'chimere/default_extra_page.html' +    return render_to_response(tpl, response_dct, +                              context_instance=RequestContext(request)) +  def getDetail(request, area_name, marker_id):      '''      Get the detail for a marker @@ -468,15 +533,14 @@ def getDetail(request, area_name, marker_id):      if request.method == 'GET':          if 'simple' in request.GET and request.GET['simple']:              response_dct['simple'] = True -    parameters = u'current_feature=%s' % marker_id -    parameters += u"&checked_categories=%s" % "_".join([str(m.id) \ -                                              for m in marker.categories.all()]) -    net_dct = getTinyfiedUrl(request, parameters, response_dct['area_name']) -    share_networks = [] +    response_dct['share_networks'], net_dct = \ +                   getShareNetwork(request, response_dct['area_name'], marker)      response_dct['share_url'] = net_dct['url'] -    for network in settings.CHIMERE_SHARE_NETWORKS: -        share_networks.append((network[0], network[1] % net_dct, network[2])) -    response_dct['share_networks'] = share_networks +    net_dct['to'] = ";".join(getStaffEmails()) +    if net_dct['to']: +        net_dct["body"] = _(settings.CHIMERE_MODIF_EMAIL) +        response_dct['modif_by_email'] = 'mailto:?to=%(to)s&subject='\ +                               '%(text)s&body=%(body)s%(url)s' % net_dct      response_dct['dated'] = settings.CHIMERE_DAYS_BEFORE_EVENT \                              and marker.start_date      return render_to_response('chimere/detail.html', response_dct, @@ -598,6 +662,16 @@ 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): +    ''' +    Get the JSON for a category (mainly in order to get the description) +    ''' +    try: +        category = SubCategory.objects.get(pk=category_id) +    except ObjectDoesNotExist: +        return HttpResponse('no results') +    return HttpResponse(category.getJSON()) +  def getTinyfiedUrl(request, parameters, area_name=''):      '''      Get the tinyfied version of parameters @@ -637,6 +711,31 @@ def redirectFromTinyURN(request, area_name='', tiny_urn=''):          return redir      return HttpResponseRedirect(response_dct['extra_url'] + parameters) +def route(request, area_name, lon1, lat1, lonlat_steps, lon2, lat2, +          transport='foot', speed=''): +    ''' +    Get the JSON for a route +    ''' +    try: +        lon1, lat1 = float(lon1), float(lat1) +        lon2, lat2 = float(lon2), float(lat2) +        steps = [float(lonlat) for lonlat in lonlat_steps.split('_') if lonlat] +        # regroup by 2 +        steps = [(steps[i*2], steps[i*2+1]) for i in range(len(steps)/2)] +    except ValueError: +        return HttpResponse('no results') +    jsons, desc, total = router.route(lon1, lat1, lon2, lat2, steps=steps, +                                      transport=transport, speed=speed) +    if not jsons: +        return HttpResponse('no results') +    jsonencoder = simplejson.JSONEncoder() +    total = jsonencoder.encode(total) +    desc = jsonencoder.encode(desc) +    data = '{"properties":{"total":%s, "description":%s}, '\ +           '"type": "FeatureCollection", "features":[%s]}' % (total, desc, +                                                              ",".join(jsons)) +    return HttpResponse(data) +  def rss(request, area_name=''):      '''      Redirect to RSS subscription page @@ -644,7 +743,8 @@ def rss(request, area_name=''):      response_dct, redir = get_base_response(area_name)      if redir:          return redir -    response_dct.update({'actions':actions, 'action_selected':('rss',), +    response_dct.update({'actions':actions(response_dct['area_name']), +                         'action_selected':('rss',),                           'category_rss_feed':'',})      # If the form has been submited      if request.method == "POST": | 
