diff options
author | etienne <etienne@9215b0d5-fb2c-4bbd-8d3e-bd2e9090e864> | 2010-03-07 17:20:04 +0000 |
---|---|---|
committer | etienne <etienne@9215b0d5-fb2c-4bbd-8d3e-bd2e9090e864> | 2010-03-07 17:20:04 +0000 |
commit | 7dbdebc6d28415e0d735fdd235909666f125ad4b (patch) | |
tree | d4a6fa8920e652e41d42fce1936438f16ee9f66a | |
parent | 7f7c333f114eee34dd089543e84028eb18f448c4 (diff) | |
download | Chimè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.py | 64 | ||||
-rw-r--r-- | chimere/main/widgets.py | 21 | ||||
-rw-r--r-- | chimere/static/base.js | 22 | ||||
-rw-r--r-- | chimere/static/main_map.js | 12 | ||||
-rw-r--r-- | chimere/templates/base.html | 4 | ||||
-rw-r--r-- | chimere/templates/edit.html | 4 | ||||
-rw-r--r-- | chimere/templates/edit_route.html | 4 | ||||
-rw-r--r-- | chimere/templates/main_map.html | 1 | ||||
-rw-r--r-- | chimere/urls.py | 60 |
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'),) |