#!/usr/bin/env python # -*- coding: utf-8 -*- # Copyright (C) 2008 Étienne Loks # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # See the file COPYING for details. """ Views of the project """ import datetime from django.shortcuts import render_to_response from django.template import loader from django.http import HttpResponseRedirect, HttpResponse from django.core import serializers from chimere import settings from chimere.main.actions import actions from chimere.main.models import SubCategory, PropertyModel, Marker, Route, News from chimere.main.widgets import getMapJS, PointChooserWidget, \ RouteChooserWidget, URL_OSM_JS, URL_OSM_CSS from chimere.main.forms import MarkerForm, RouteForm def index(request): """ Main page """ subcategories = SubCategory.getAvailable() # by default all subcategories are checked for cat, sub_cats in subcategories: all_checked = True for sub_category in sub_cats: if sub_category.id in settings.DEFAULT_CATEGORIES: sub_category.selected = True elif all_checked: all_checked = False if all_checked: cat.selected = True extra = "" tab = " "*4 for url in URL_OSM_CSS: extra += tab + '' % url for url in URL_OSM_JS + ["%sbase.js" % settings.MEDIA_URL, "%smain_map.js" % settings.MEDIA_URL,]: extra += tab + '\n' % url extra += tab + '\n' # show the welcome page today = datetime.date.today().strftime('%y-%m-%d') display_welcome = None if not 'last_visit' in request.session or \ request.session['last_visit'] != today: request.session['last_visit'] = today display_welcome = True response_dct = {'actions':actions, 'action_selected':'view', 'error_message':'', 'sub_categories':subcategories, 'extra_head':extra + getMapJS(), 'media_path':settings.MEDIA_URL, 'welcome':welcome(request, display_welcome), } # manage permalink if request.GET: for key in ('zoom', 'lon', 'lat', 'display_submited'): if key in request.GET and request.GET[key]: response_dct['p_'+key] = request.GET[key] else: response_dct['p_'+key] = '""' if 'checked_categories' in request.GET \ and request.GET['checked_categories']: cats = request.GET['checked_categories'].split('_') response_dct['p_checked_categories'] = ",".join(cats) else: response_dct['p_checked_categories'] = ''; return render_to_response('main_map.html', response_dct) def edit(request): """ Edition page """ # If the form has been submited if request.method == 'POST': form = MarkerForm(request.POST, request.FILES) # All validation rules pass if form.is_valid(): marker = form.save() # set the submited status marker.status = 'S' marker.save() return HttpResponseRedirect('/chimere/submited/edit') else: # An unbound form form = MarkerForm() # get the « manualy » declared_fields. Ie: properties declared_fields = form.declared_fields.keys() response_dct = {'actions':actions, 'action_selected':'edit', 'error_message':'', 'media_path':settings.MEDIA_URL, 'form':form, 'extra_head':form.media, 'sub_categories':SubCategory.getAvailable(['M', 'B']), 'point_widget':PointChooserWidget().render('point', None), 'properties':declared_fields } # manualy populate the custom widget if 'subcategory' in form.data and form.data['subcategory']: response_dct['current_category'] = int(form.data['subcategory']) return render_to_response('edit.html', response_dct) def editRoute(request): """ Route edition page """ # If the form has been submited if request.method == 'POST': form = RouteForm(request.POST, request.FILES) # All validation rules pass if form.is_valid(): route = form.save() # set the submited status route.status = 'S' route.save() return HttpResponseRedirect('/chimere/submited/edit_route') else: # An unbound form form = RouteForm() # get the « manualy » declared_fields. Ie: properties declared_fields = form.declared_fields.keys() response_dct = {'actions':actions, 'action_selected':'edit_route', 'error_message':'', 'media_path':settings.MEDIA_URL, 'form':form, 'extra_head':form.media, 'sub_categories':SubCategory.getAvailable(['R', 'B']), 'route_widget':RouteChooserWidget().render('route', None), 'properties':declared_fields } # manualy populate the custom widget if 'subcategory' in form.data and form.data['subcategory']: response_dct['current_category'] = int(form.data['subcategory']) return render_to_response('edit_route.html', response_dct) def welcome(request, display=None): """ Welcome string """ response_dct = {'display':display} response_dct['news_lst'] = News.objects.filter(available=True) return loader.render_to_string('welcome.html', response_dct) def submited(request, action): """ Successful submission page """ response_dct = {'actions':actions, 'action_selected':action, 'media_path':settings.MEDIA_URL,} return render_to_response('submited.html', response_dct) def getDetail(request, marker_id): ''' Get the detail for a marker ''' try: marker = Marker.objects.filter(id=int(marker_id), status='A')[0] except (ValueError, IndexError): return HttpResponse('no results') response_dct= {'media_path':settings.MEDIA_URL, 'marker':marker} return render_to_response('detail.html', response_dct) def getGeoObjects(request, category_ids, status='A'): ''' Get the JSON for a route ''' status = status.split('_') try: query = Route.objects.filter(status__in=status, subcategory__in=category_ids.split('_')) except: return HttpResponse('no results') geo_objects = list(query) try: query = Marker.objects.filter(status__in=status, subcategory__in=category_ids.split('_')) except: return HttpResponse('no results') geo_objects += list(query) if not geo_objects: return HttpResponse('no results') data = '{"type": "FeatureCollection", "features":[%s]}' % \ ",".join([geo_object.getGeoJSON() for geo_object in geo_objects]) return HttpResponse(data)