summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoretienne <etienne@9215b0d5-fb2c-4bbd-8d3e-bd2e9090e864>2010-03-07 17:20:04 +0000
committeretienne <etienne@9215b0d5-fb2c-4bbd-8d3e-bd2e9090e864>2010-03-07 17:20:04 +0000
commit7dbdebc6d28415e0d735fdd235909666f125ad4b (patch)
treed4a6fa8920e652e41d42fce1936438f16ee9f66a
parent7f7c333f114eee34dd089543e84028eb18f448c4 (diff)
downloadChimère-7dbdebc6d28415e0d735fdd235909666f125ad4b.tar.bz2
Chimère-7dbdebc6d28415e0d735fdd235909666f125ad4b.zip
Dynamic management of area with URLs - #84
git-svn-id: http://www.peacefrogs.net/svn/chimere/trunk@69 9215b0d5-fb2c-4bbd-8d3e-bd2e9090e864
-rw-r--r--chimere/main/views.py64
-rw-r--r--chimere/main/widgets.py21
-rw-r--r--chimere/static/base.js22
-rw-r--r--chimere/static/main_map.js12
-rw-r--r--chimere/templates/base.html4
-rw-r--r--chimere/templates/edit.html4
-rw-r--r--chimere/templates/edit_route.html4
-rw-r--r--chimere/templates/main_map.html1
-rw-r--r--chimere/urls.py60
9 files changed, 130 insertions, 62 deletions
diff --git a/chimere/main/views.py b/chimere/main/views.py
index 86d98e7..dae5f82 100644
--- a/chimere/main/views.py
+++ b/chimere/main/views.py
@@ -40,10 +40,21 @@ from chimere.main.widgets import getMapJS, PointChooserWidget, \
from chimere.main.forms import MarkerForm, RouteForm, ContactForm, \
notifySubmission, notifyStaff
-base_response_dct = {'media_path':settings.MEDIA_URL,
- 'extra_url':settings.EXTRA_URL,}
+def get_base_response(area_name=""):
+ """
+ Get the base url
+ """
+ base_response_dct = {'media_path':settings.MEDIA_URL,}
+ base_url = settings.EXTRA_URL
+ if not base_url.startswith('/'):
+ base_url = '/' + base_url
+ if area_name:
+ base_url = '/' + area_name + base_url
+ base_response_dct['extra_url'] = base_url
+ base_response_dct['area_name'] = area_name
+ return base_response_dct
-def index(request):
+def index(request, area_name=None, default_area=None):
"""
Main page
"""
@@ -62,10 +73,10 @@ def index(request):
request.session['last_visit'] != today:
request.session['last_visit'] = today
display_welcome = True
- response_dct = base_response_dct
+ response_dct = get_base_response(area_name)
response_dct.update({'actions':actions, 'action_selected':('view',),
- 'error_message':'',
- 'extra_head':extra + getMapJS(),
+ 'error_message':'', 'default_area':default_area,
+ 'extra_head':extra + getMapJS(area_name),
'welcome':welcome(request, display_welcome),
'areas':Area.getAvailable(),
'map_layer':settings.MAP_LAYER,
@@ -86,7 +97,7 @@ def index(request):
response_dct['p_checked_categories'] = '';
return render_to_response('main_map.html', response_dct)
-def edit(request):
+def edit(request, area_name=""):
"""
Edition page
"""
@@ -100,13 +111,15 @@ def edit(request):
marker.status = 'S'
marker.save()
notifySubmission(marker)
- return HttpResponseRedirect('/' + settings.EXTRA_URL +'submited/edit')
+ response_dct = get_base_response(area_name)
+ return HttpResponseRedirect(response_dct['extra_url'] + \
+'submited/edit')
else:
# An unbound form
form = MarkerForm()
# get the « manualy » declared_fields. Ie: properties
declared_fields = form.declared_fields.keys()
- response_dct = base_response_dct
+ response_dct = get_base_response(area_name)
response_dct.update({'actions':actions,
'action_selected':('contribute', 'edit'),
'error_message':'',
@@ -114,7 +127,8 @@ def edit(request):
'form':form,
'extra_head':form.media,
'sub_categories':SubCategory.getAvailable(['M', 'B']),
- 'point_widget':PointChooserWidget().render('point', None),
+ 'point_widget':PointChooserWidget().render('point', None,
+ area_name=area_name),
'properties':declared_fields
})
# manualy populate the custom widget
@@ -122,7 +136,7 @@ def edit(request):
response_dct['current_category'] = int(form.data['subcategory'])
return render_to_response('edit.html', response_dct)
-def editRoute(request):
+def editRoute(request, area_name=""):
"""
Route edition page
"""
@@ -136,14 +150,15 @@ def editRoute(request):
route.status = 'S'
route.save()
notifySubmission(route)
- return HttpResponseRedirect('/' + settings.EXTRA_URL + \
- 'submited/edit_route')
+ response_dct = get_base_response(area_name)
+ return HttpResponseRedirect(response_dct['extra_url'] + \
+'submited/edit')
else:
# An unbound form
form = RouteForm()
# get the « manualy » declared_fields. Ie: properties
declared_fields = form.declared_fields.keys()
- response_dct = base_response_dct
+ response_dct = get_base_response(area_name)
response_dct.update({'actions':actions,
'action_selected':('contribute', 'edit_route'),
'error_message':'',
@@ -151,7 +166,8 @@ def editRoute(request):
'form':form,
'extra_head':form.media,
'sub_categories':SubCategory.getAvailable(['R', 'B']),
- 'route_widget':RouteChooserWidget().render('route', None),
+ 'route_widget':RouteChooserWidget().render('route', None,
+ area_name=area_name),
'properties':declared_fields
})
# manualy populate the custom widget
@@ -167,15 +183,15 @@ def welcome(request, display=None):
response_dct['news_lst'] = News.objects.filter(available=True)
return loader.render_to_string('welcome.html', response_dct)
-def submited(request, action):
+def submited(request, area_name="", action=""):
"""
Successful submission page
"""
- response_dct = base_response_dct
+ response_dct = get_base_response(area_name)
response_dct.update({'actions':actions, 'action_selected':action,})
return render_to_response('submited.html', response_dct)
-def contactus(request):
+def contactus(request, area_name=""):
"""
Contact page
"""
@@ -196,9 +212,9 @@ details.")
msg = _(u"Temporary error. Renew your message later.")
else:
form = ContactForm()
- response_dct = base_response_dct
- response_dct = ({'actions':actions, 'action_selected':('contact',),
- 'contact_form':form, 'message':msg})
+ response_dct = get_base_response(area_name)
+ response_dct.update({'actions':actions, 'action_selected':('contact',),
+ 'contact_form':form, 'message':msg})
return render_to_response('contactus.html', response_dct)
def getDetail(request, marker_id):
@@ -209,7 +225,7 @@ def getDetail(request, marker_id):
marker = Marker.objects.filter(id=int(marker_id), status='A')[0]
except (ValueError, IndexError):
return HttpResponse('no results')
- response_dct = base_response_dct
+ response_dct = get_base_response()
response_dct['marker'] = marker
return render_to_response('detail.html', response_dct)
@@ -221,7 +237,7 @@ def getDescriptionDetail(request, category_id):
category = Category.objects.filter(id=int(category_id))[0]
except (ValueError, IndexError):
return HttpResponse('no results')
- response_dct = base_response_dct
+ response_dct = get_base_response()
response_dct['category'] = category
return render_to_response('category_detail.html', response_dct)
@@ -266,7 +282,7 @@ def getAvailableCategories(request, area=None, status='A', force=None):
'''
if settings.DYNAMIC_CATEGORIES and not area:
return ""
- response_dct = base_response_dct
+ response_dct = get_base_response()
if not settings.DYNAMIC_CATEGORIES:
subcategories = SubCategory.getAvailable()
response_dct['sub_categories'] = subcategories
diff --git a/chimere/main/widgets.py b/chimere/main/widgets.py
index 44e8ac8..2653c19 100644
--- a/chimere/main/widgets.py
+++ b/chimere/main/widgets.py
@@ -38,7 +38,7 @@ class ManyToManyField_NoSyncdb(models.ManyToManyField):
super(ManyToManyField_NoSyncdb, self).__init__(*args, **kwargs)
self.creates_table = False
-def getMapJS():
+def getMapJS(area_name=''):
'''Variable initialization for drawing the map
'''
# projection, center and bounds definitions
@@ -52,6 +52,9 @@ def getMapJS():
js += u"var media_path = '%s';\n" % settings.MEDIA_URL
js += u"var map_layer = %s;\n" % settings.MAP_LAYER
js += u"var restricted_extent;\n"
+
+ if area_name:
+ js += u"var area_name='%s';\n" % area_name
if settings.RESTRICTED_EXTENT:
restricted_extent_str = [str(coord) \
for coord in settings.RESTRICTED_EXTENT]
@@ -81,7 +84,7 @@ class PointChooserWidget(forms.TextInput):
js = URL_OSM_JS + ["%sedit_map.js" % settings.MEDIA_URL,
"%sbase.js" % settings.MEDIA_URL,]
- def render(self, name, value, attrs=None):
+ def render(self, name, value, attrs=None, area_name=''):
'''
Render a map and latitude, longitude information field
'''
@@ -99,7 +102,7 @@ class PointChooserWidget(forms.TextInput):
value = None
else:
value = None
- tpl = getMapJS()
+ tpl = getMapJS(area_name)
tpl += u'<script src="%sedit_map.js"></script>\n' % settings.MEDIA_URL
tpl += u"""<div id='map_edit'></div>
<div id='live_lonlat'>
@@ -112,8 +115,8 @@ value='%f'/></p>
</div>
<input type='hidden' name='%s' id='id_%s' value="%s"/>
""" % (_("Latitude"), value_y, _("Longitude"), value_x, name, name, val)
- tpl += """<script type='text/javascript'><!--
-init();"""
+ tpl += "<script type='text/javascript'><!--\n"
+ tpl += "init();\n"
if value:
tpl += '''var mylonlat = new OpenLayers.LonLat(%f,%f);
putMarker(mylonlat.transform(epsg_display_projection,
@@ -149,11 +152,11 @@ class RouteChooserWidget(forms.TextInput):
js = ["%sedit_route_map.js" % settings.MEDIA_URL,
"%sbase.js" % settings.MEDIA_URL,] + URL_OSM_JS
- def render(self, name, value, attrs=None):
+ def render(self, name, value, attrs=None, area_name=''):
'''
Render a map and latitude, longitude information field
'''
- tpl = getMapJS()
+ tpl = getMapJS(area_name)
help_create = ''
if not value:
help_create = """<h3>%s</h3>
@@ -198,8 +201,8 @@ onclick='toggleDrawOff();'>%s</div>
<hr class='spacer'/>
<input type='hidden' name='%s' id='id_%s' value="%s"/>
""" % (style, help_modify, name, name, value)
- tpl += """<script type='text/javascript'><!--
-init();"""
+ tpl += "<script type='text/javascript'><!--\n"
+ tpl += "init();\n"
if value:
val = value
if type(value) == unicode:
diff --git a/chimere/static/base.js b/chimere/static/base.js
index 3c7c575..449cc0f 100644
--- a/chimere/static/base.js
+++ b/chimere/static/base.js
@@ -1,5 +1,5 @@
/* base function shared by some pages */
-/* Copyright (C) 2009 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet>
+/* Copyright (C) 2009-2010 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as
@@ -17,6 +17,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
See the file COPYING for details.
*/
+var default_area;
+var area_name;
+
/* show a block panel */
function show(id){
document.getElementById(id).style.display = 'block';
@@ -30,7 +33,9 @@ function hide(id){
function saveExtent() {
/* save the current extent in a cookie */
if(!map) return;
- document.cookie = "MAP_EXTENT=" + map.getExtent().toArray().join('_')
+ var extent_key = 'MAP_EXTENT';
+ if (area_name){ extent_key = extent_key + '_' + area_name; }
+ document.cookie = extent_key + "=" + map.getExtent().toArray().join('_')
+ ';path="/"';
}
@@ -38,10 +43,12 @@ function getExtent() {
/* get the current extent from a cookie */
var cookies = document.cookie.split(';');
var map_extent;
+ var extent_key = 'MAP_EXTENT';
+ if (area_name){ extent_key = extent_key + '_' + area_name; }
for (i in cookies){
var items = cookies[i].split('=');
key = items[0].split(' ').join('');
- if (key == 'MAP_EXTENT'){
+ if (key == extent_key){
map_extent = items[1].split('_');
}
}
@@ -51,13 +58,18 @@ function getExtent() {
function zoomToCurrentExtent(map){
/* zoom to current extent */
var current_extent = getExtent();
+ var extent;
if (OpenLayers && current_extent && current_extent.length == 4){
extent = new OpenLayers.Bounds(current_extent[0], current_extent[1],
current_extent[2], current_extent[3]);
- map.zoomToExtent(extent, true);
- return true;
+ }
+ else if (OpenLayers && default_area && default_area.length == 4){
+ extent = new OpenLayers.Bounds(default_area[1], default_area[0],
+ default_area[3], default_area[2]);
}
else{
return;
}
+ map.zoomToExtent(extent, true);
+ return true;
}
diff --git a/chimere/static/main_map.js b/chimere/static/main_map.js
index 52d694f..8137b03 100644
--- a/chimere/static/main_map.js
+++ b/chimere/static/main_map.js
@@ -50,7 +50,7 @@ function toggleCategory(item){
/* reopen the current opened categories when a redraw occurs */
function reOpenCurrent(){
- if (current_cat){
+ if (current_cat && current_cat != -1){
document.getElementById('maincategory_' + current_cat).style.display = 'block';
img = document.getElementById('maincategory_img_' + current_cat);
img.src = media_path + "icons/minus.png";
@@ -188,7 +188,7 @@ function zoomToCategory(category_id){
/* zoom to desired sub categories */
function zoomToSubCategory(subcategory_ids){
/* 0 stand for all categories */
- var uri = "/" + extra_url + "getGeoObjects/" + subcategory_ids;
+ var uri = extra_url + "getGeoObjects/" + subcategory_ids;
if (display_submited) uri += "/A_S";
OpenLayers.loadURL(uri, '', this, zoomToCategoryExtent);
}
@@ -223,7 +223,7 @@ function loadCategories(){
current_extent = current_extent.toArray().join('_')
current_extent = current_extent.replace(/\./g, 'D');
current_extent = current_extent.replace(/-/g, 'M');
- var uri = "/" + extra_url + "getAvailableCategories/" + current_extent;
+ var uri = extra_url + "getAvailableCategories/" + current_extent;
if (display_submited) uri += "/A_S";
OpenLayers.loadURL(uri, '', this, updateCategories);
}
@@ -242,7 +242,7 @@ function loadGeoObjects(){
updateCheckedCategories();
/* 0 stand for all categories */
if (!checked_categories) checked_categories = '0';
- var uri = "/" + extra_url + "getGeoObjects/" + checked_categories;
+ var uri = extra_url + "getGeoObjects/" + checked_categories;
if (display_submited) uri += "/A_S";
OpenLayers.loadURL(uri, '', this, setGeoObjects);
}
@@ -370,7 +370,7 @@ var refreshMapItems = function (evt) {
/* update current detail panel with an AJAX request */
function updateDetail(pk){
- var uri = "/" + extra_url + "getDetail/" + pk;
+ var uri = extra_url + "getDetail/" + pk;
OpenLayers.loadURL(uri, '', this, setDetail);
}
@@ -384,7 +384,7 @@ function setDetail(response){
/* show the detail of a category */
function displayCategoryDetail(category_id) {
- var uri = "/" + extra_url + "getDescriptionDetail/" + category_id;
+ var uri = extra_url + "getDescriptionDetail/" + category_id;
OpenLayers.loadURL(uri, '', this, setCategoryDetail);
}
diff --git a/chimere/templates/base.html b/chimere/templates/base.html
index 30a8660..ce5160b 100644
--- a/chimere/templates/base.html
+++ b/chimere/templates/base.html
@@ -19,10 +19,10 @@
<ul id='action'>
{% for action, subactions in actions %}
<li{% ifequal action.id action_selected.0 %} class='selected'{% endifequal %}>
- <a href='/{{ action.path }}' onclick='saveExtent();'>{{ action.label }}</a>
+ <a href='{{extra_url}}{{ action.path }}' onclick='saveExtent();'>{{ action.label }}</a>
{% ifequal action.id action_selected.0 %}{% if subactions %}<ul>{% for subaction in subactions %}
<li{% ifequal subaction.id action_selected.1 %} class='selected'{% endifequal %}>
- <a href='/{{ subaction.path }}' onclick='saveExtent();'>{{ subaction.label }}</a>
+ <a href='{{extra_url}}{{ subaction.path }}' onclick='saveExtent();'>{{ subaction.label }}</a>
</li>
{% endfor %}</ul>{% endif %}{% endifequal %}
</li>
diff --git a/chimere/templates/edit.html b/chimere/templates/edit.html
index 1378a63..6fc25b9 100644
--- a/chimere/templates/edit.html
+++ b/chimere/templates/edit.html
@@ -8,7 +8,7 @@
<fieldset class='edit'>
<legend>{% trans "Add a new site" %}</legend>
<p>* {% trans "indicates a mandatory field" %}</p>
-<form enctype="multipart/form-data" method='post' action='/{{extra_url}}edit/'>
+<form enctype="multipart/form-data" method='post' action='{{extra_url}}edit/'>
<div class="fieldWrapper">
<label for="id_name">{% trans "Site name"%} *</label>
{{ form.name.errors }}
@@ -31,7 +31,7 @@
<div class="fieldWrapper">
<label for="id_point">{% trans "Point"%} *</label>
{%if form.point.errors %}<ul class="errorlist"><li>{% trans "Select a location for this new site" %}</li></ul>{%endif%}
- {{form.point}}
+ {{point_widget}}
</div>
<div class="fieldWrapper">
<label for="id_picture">{% trans "Image" %}</label>
diff --git a/chimere/templates/edit_route.html b/chimere/templates/edit_route.html
index 421a600..5168001 100644
--- a/chimere/templates/edit_route.html
+++ b/chimere/templates/edit_route.html
@@ -7,7 +7,7 @@
<fieldset class='edit'>
<legend>{% trans "Add a new route" %}</legend>
<p>* {% trans "indicates a mandatory field" %}</p>
-<form enctype="multipart/form-data" method='post' action='/{{extra_url}}edit_route/'>
+<form enctype="multipart/form-data" method='post' action='{{extra_url}}edit_route/'>
<div class="fieldWrapper">
<label for="id_name">{% trans "Site name"%} *</label>
{{ form.name.errors }}
@@ -30,7 +30,7 @@
<div class="fieldWrapper">
<label for="id_route">{% trans "Route"%} *</label>
{%if form.point.errors %}<ul class="errorlist"><li>{% trans "Select a location for this new site" %}</li></ul>{%endif%}
- {{form.route}}
+ {{route_widget}}
</div>
<!--
<div class="fieldWrapper">
diff --git a/chimere/templates/main_map.html b/chimere/templates/main_map.html
index a6c95e4..3d01d9f 100644
--- a/chimere/templates/main_map.html
+++ b/chimere/templates/main_map.html
@@ -30,6 +30,7 @@
var map_layer = {{map_layer|safe}};
var permalink_label = '{%trans "Permalink"%}';
var dynamic_categories{%if dynamic_categories %} = 1{%endif%};
+var default_area{%if default_area %} = new Array({{default_area.upper_left_corner.x}}, {{default_area.upper_left_corner.y}}, {{default_area.lower_right_corner.x}}, {{default_area.lower_right_corner.y}}){%endif%};
var p_zoom;
{%if p_zoom %}p_zoom={{p_zoom}};
var p_lat={{p_lat}};
diff --git a/chimere/urls.py b/chimere/urls.py
index a018d4a..11bae0a 100644
--- a/chimere/urls.py
+++ b/chimere/urls.py
@@ -1,3 +1,23 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# Copyright (C) 2008-2010 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet>
+
+# 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 <http://www.gnu.org/licenses/>.
+
+# See the file COPYING for details.
+
+
from django.conf.urls.defaults import *
from django.contrib import admin
@@ -5,6 +25,8 @@ admin.autodiscover()
from settings import ROOT_PATH, EXTRA_URL
+from main.models import Area
+
js_info_dict = {
'packages': 'chimere',
}
@@ -13,21 +35,35 @@ base = '^' + EXTRA_URL
urlpatterns = patterns('',
(base + r'admin/(.*)', admin.site.root),
- (base + r'$', 'chimere.main.views.index'),
- (base + r'contact/$', 'chimere.main.views.contactus'),
- (base + r'edit/$', 'chimere.main.views.edit'),
- (base + r'edit_route/$', 'chimere.main.views.editRoute'),
- (base + r'submited/(?P<action>\w+)/$$', 'chimere.main.views.submited'),
- (base + r'getDetail/(?P<marker_id>\d+)/$', 'chimere.main.views.getDetail'),
- (base + r'getDescriptionDetail/(?P<category_id>\d+)/$',
- 'chimere.main.views.getDescriptionDetail'),
- (base + r'getGeoObjects/(?P<category_ids>\w+)(/(?P<status>\w+))?$',
- 'chimere.main.views.getGeoObjects'),
- (base + r'getAvailableCategories/(?P<area>\w+)(/(?P<status>\w+))?(/(?P<force>\w+))?$',
- 'chimere.main.views.getAvailableCategories'),
(base + r'static/(?P<path>.*)$', 'django.views.static.serve',
{'document_root': ROOT_PATH + 'static/'}),
(base + r'media/(?P<path>.*)$', 'django.views.static.serve',
{'document_root': ROOT_PATH + 'media/'}),
(base + r'jsi18n/$', 'django.views.i18n.javascript_catalog', js_info_dict),
)
+
+urlpatterns += patterns('chimere.main.views',
+)
+
+url_areas = Area.objects.filter(url__isnull=False)
+urlpatterns += patterns('chimere.main.views', (base + r'$', 'index'),)
+
+for area in url_areas:
+ urlpatterns += patterns('chimere.main.views',
+ (base + '(' + area.url + ')/?$', 'index', {'default_area':area}),)
+
+extra = "|".join([area.url for area in url_areas])
+if extra:
+ extra = "(%s)?/?" % extra
+urlpatterns += patterns('chimere.main.views',
+(base + extra + r'contact/$', 'contactus'),
+(base + extra + r'edit/$', 'edit'),
+(base + extra + r'edit_route/$', 'editRoute'),
+(base + extra + r'submited/(?P<action>\w+)/$', 'submited'),
+(base + extra + r'getDetail/(?P<marker_id>\d+)/$', 'getDetail'),
+(base + extra + r'getDescriptionDetail/(?P<category_id>\d+)/$',
+ 'getDescriptionDetail'),
+(base + extra + r'getGeoObjects/(?P<category_ids>\w+)(/(?P<status>\w+))?$',
+ 'getGeoObjects'),
+(base + extra + r'getAvailableCategories/(?P<area>\w+)(/(?P<status>\w+))?(/(?P<force>\w+))?$',
+ 'getAvailableCategories'),)