#!/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, Area 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), 'areas':Area.getAvailable() } # 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)