summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@peacefrogs.net>2012-02-28 16:33:57 +0100
committerÉtienne Loks <etienne.loks@peacefrogs.net>2012-02-28 16:33:57 +0100
commit5e56ea6cddb3cc97892948239dc7b9adbe6a0ec4 (patch)
tree4fa230be4972fbf7375251eedcffbec8879939c4
parent556b3e2c9d2d379fdcf1d6bcecac9bcd7c8d275d (diff)
downloadChimère-5e56ea6cddb3cc97892948239dc7b9adbe6a0ec4.tar.bz2
Chimère-5e56ea6cddb3cc97892948239dc7b9adbe6a0ec4.zip
Allow modification of routes on the main interface
-rw-r--r--chimere/actions.py2
-rw-r--r--chimere/forms.py31
-rw-r--r--chimere/static/chimere/js/edit_route_map.js4
-rw-r--r--chimere/templates/chimere/detail.html4
-rw-r--r--chimere/templates/chimere/edit_route.html2
-rw-r--r--chimere/urls.py10
-rw-r--r--chimere/views.py153
7 files changed, 114 insertions, 92 deletions
diff --git a/chimere/actions.py b/chimere/actions.py
index 61acaf4..4fe9bff 100644
--- a/chimere/actions.py
+++ b/chimere/actions.py
@@ -31,7 +31,7 @@ class Action:
actions = [(Action('view', '', _('View')), []),
(Action('contribute', 'edit/', _('Contribute')),
(Action('edit', 'edit/', _('Add a new point of interest')),
- Action('edit_route', 'edit_route/', _('Add a new route'))),
+ Action('edit-route', 'edit-route/', _('Add a new route'))),
),]
if 'chimere_rss' in settings.INSTALLED_APPS:
diff --git a/chimere/forms.py b/chimere/forms.py
index dbc62c0..638e67e 100644
--- a/chimere/forms.py
+++ b/chimere/forms.py
@@ -228,6 +228,15 @@ class RouteForm(RouteAdminForm):
model = Route
exclude = ('status',)
+ def __init__(self, *args, **kwargs):
+ if kwargs.get('instance'):
+ try:
+ kwargs['initial'] = {
+ 'point':Marker.objects.get(route=kwargs['instance']).point}
+ except:
+ pass
+ super(RouteForm, self).__init__(*args, **kwargs)
+
def save(self, *args, **keys):
"""
Custom save method in order to manage associated marker and file
@@ -236,21 +245,21 @@ class RouteForm(RouteAdminForm):
# associate a route file
if 'associated_file_id' in self.cleaned_data and \
self.cleaned_data['associated_file_id']:
- #try:
- file_pk = int(self.cleaned_data['associated_file_id'])
- new_route.associated_file = RouteFile.objects.get(pk=file_pk)
- new_route.save()
- #except:
- #pass
+ file_pk = int(self.cleaned_data['associated_file_id'])
+ new_route.associated_file = RouteFile.objects.get(pk=file_pk)
+ new_route.save()
marker_fields = [f.attname for f in Marker._meta.fields]
marker_dct = dict([(k, self.cleaned_data[k]) for k in self.cleaned_data
if k in marker_fields])
- marker_dct['route'] = new_route
- if 'status' not in marker_dct:
- marker_dct['status'] = "S"
+ marker_dct['status'] = new_route.status
categories = []
- new_marker = Marker(**marker_dct)
- new_marker.save()
+ new_marker, created = Marker.objects.get_or_create(route=new_route,
+ defaults=marker_dct)
+ if not created:
+ for att in marker_dct.keys():
+ setattr(new_marker, att, marker_dct[att])
+ new_marker.save()
+ new_marker.categories.clear()
for category in self.cleaned_data['categories']:
new_marker.categories.add(category)
new_marker.save()
diff --git a/chimere/static/chimere/js/edit_route_map.js b/chimere/static/chimere/js/edit_route_map.js
index 628e9fd..df81b49 100644
--- a/chimere/static/chimere/js/edit_route_map.js
+++ b/chimere/static/chimere/js/edit_route_map.js
@@ -78,7 +78,9 @@ function initFeatureFromGeometry(linestring){
function updateForm(event) {
/* update the form */
- currentFeature = event.feature;
+ if(event){
+ currentFeature = event.feature;
+ }
var current_geo = currentFeature.geometry.clone();
current_geo.transform(map.getProjectionObject(),
epsg_display_projection);
diff --git a/chimere/templates/chimere/detail.html b/chimere/templates/chimere/detail.html
index d333841..900ffe8 100644
--- a/chimere/templates/chimere/detail.html
+++ b/chimere/templates/chimere/detail.html
@@ -19,6 +19,8 @@
<li>{% trans "Share"%}</li>{% for share_network in share_networks %}
<li><a href='{{share_network.1}}'><img src="{{share_network.2}}" alt="{{share_network.0}}"/></a></li>
{% endfor %}</ul>{% endif %}
- <a href='{% url chimere:edit-marker area_name marker.pk %}'>{% trans "Submit a modification" %}</a>
+ <a href='{% if marker.route %}{% url chimere:editroute-item area_name marker.route.pk %}{%else%}{% url chimere:edit-item area_name marker.pk %}{%endif%}'>
+ {% trans "Submit a modification" %}
+ </a>
{% endif %}
</div>
diff --git a/chimere/templates/chimere/edit_route.html b/chimere/templates/chimere/edit_route.html
index bcc2afa..1088f2b 100644
--- a/chimere/templates/chimere/edit_route.html
+++ b/chimere/templates/chimere/edit_route.html
@@ -18,7 +18,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='.'>
{% csrf_token %}
<div class="fieldWrapper">
<label for="id_name">{% trans "Site name"%} *</label>
diff --git a/chimere/urls.py b/chimere/urls.py
index 8a252f6..8112570 100644
--- a/chimere/urls.py
+++ b/chimere/urls.py
@@ -40,10 +40,12 @@ urlpatterns += patterns('chimere.views',
name="submit"),
url(r'^(?P<area_name>\w+)?/?edit/$', 'edit',
name="edit"),
- url(r'^(?P<area_name>\w+)?/?edit/(?P<marker_id>\w+)/$', 'edit',
- name="edit-marker"),
- url(r'^(?P<area_name>\w+)?/?edit_route/$', 'editRoute',
- name="edit_route"),
+ url(r'^(?P<area_name>\w+)?/?edit/(?P<item_id>\w+)/$', 'edit',
+ name="edit-item"),
+ url(r'^(?P<area_name>\w+)?/?edit-route/$', 'editRoute',
+ name="editroute"),
+ url(r'^(?P<area_name>\w+)?/?edit-route/(?P<item_id>\w+)/$', 'editRoute',
+ name="editroute-item"),
url(r'^(?P<area_name>\w+)?/?getDetail/(?P<marker_id>\d+)/?$', 'getDetail',
name="get_detail"),
url(r'^(?P<area_name>\w+)?/?getDescriptionDetail/?(?P<category_id>\d+)/?$',
diff --git a/chimere/views.py b/chimere/views.py
index e249d56..c6fba50 100644
--- a/chimere/views.py
+++ b/chimere/views.py
@@ -100,60 +100,77 @@ def index(request, area_name=None, default_area=None, simple=False):
return render_to_response(tpl, response_dct,
context_instance=RequestContext(request))
-def edit(request, area_name="", marker_id=None):
+def get_edit_page(redirect_url, item_cls, item_form):
"""
Edition page
"""
- response_dct = get_base_response(area_name)
+ def func(request, area_name="", item_id=None):
+ response_dct = get_base_response(area_name)
+
+ # if an item_id is provided: modification
+ init_item, ref_item = None, None
+ if item_id:
+ try:
+ init_item = item_cls.objects.get(pk=item_id)
+ except:
+ return redirect(redirect_url, area_name if area_name else ''),\
+ None
+ ref_item = init_item
+ modified_item = item_cls.objects.filter(ref_item=init_item,
+ submiter_session_key=request.session.session_key)
+ if modified_item.count():
+ init_item = modified_item.all()[0]
+
+ # If the form has been submited
+ if request.method == 'POST':
+ inst = None
+ # allow to directly modify only if owner or superuser
+ if init_item and (request.user.is_superuser or \
+ init_item.submiter_session_key == \
+ request.session.session_key):
+ inst = init_item
+
+ form = item_form(request.POST, request.FILES, instance=inst)
+ # All validation rules pass
+ if form.is_valid():
+ item = form.save()
+ # set the session key (to permit modifications)
+ item.submiter_session_key = request.session.session_key
+
+ # associate to the reference item
+ if ref_item:
+ item.ref_item = ref_item
+ if item.pk != ref_item.pk:
+ item.status = 'M'
+ elif not item.ref_item:
+ # initialisation
+ item.ref_item = item
+
+ # just submited
+ if not item.status:
+ item.status = 'S'
+ item.save()
+ notifySubmission(item)
+ response_dct = get_base_response(area_name)
+ return redirect(redirect_url + '-item',
+ area_name if area_name else '', item.ref_item.pk),\
+ None
+ else:
+ form = item_form(instance=init_item)
+ return None, (item_id, init_item, response_dct, form)
+ return func
- # if a marker_id is provided: modification
- init_marker, ref_marker = None, None
- if marker_id:
- try:
- init_marker = Marker.objects.get(pk=marker_id)
- except:
- return redirect('chimere:edit', area_name if area_name else '')
- ref_marker = init_marker
- modified_marker = Marker.objects.filter(ref_item=init_marker,
- submiter_session_key=request.session.session_key)
- if modified_marker.count():
- init_marker = modified_marker.all()[0]
+get_edit_marker = get_edit_page('chimere:edit', Marker, MarkerForm)
+
+def edit(request, area_name="", item_id=None):
+ """
+ Edition page
+ """
+ response, values = get_edit_marker(request, area_name, item_id)
+ if response:
+ return response
+ item_id, init_item, response_dct, form = values
- # If the form has been submited
- if request.method == 'POST':
- inst = None
- # allow to directly modify only if owner or superuser
- if init_marker and (request.user.is_superuser or \
- init_marker.submiter_session_key == \
- request.session.session_key):
- inst = init_marker
-
- form = MarkerForm(request.POST, request.FILES, instance=inst)
- # All validation rules pass
- if form.is_valid():
- marker = form.save()
- # set the session key (to permit modifications)
- marker.submiter_session_key = request.session.session_key
-
- # associate to the reference marker
- if ref_marker:
- marker.ref_item = ref_marker
- if marker.pk != ref_marker.pk:
- marker.status = 'M'
- elif not marker.ref_item:
- # initialisation
- marker.ref_item = marker
-
- # just submited
- if not marker.status:
- marker.status = 'S'
- marker.save()
- notifySubmission(marker)
- response_dct = get_base_response(area_name)
- return redirect('chimere:edit-marker',
- area_name if area_name else '', marker.ref_item.pk)
- else:
- form = MarkerForm(instance=init_marker)
# get the "manualy" declared_fields. Ie: properties
declared_fields = form.declared_fields.keys()
response_dct.update({'actions':actions,
@@ -163,11 +180,11 @@ def edit(request, area_name="", marker_id=None):
'form':form,
'dated':settings.CHIMERE_DAYS_BEFORE_EVENT,
'extra_head':form.media,
- 'marker_id':marker_id,
+ 'marker_id':item_id,
'sub_categories':SubCategory.getAvailable(['M', 'B'],
area_name),
'point_widget':PointChooserWidget().render('point',
- init_marker.point if init_marker else None,
+ init_item.point if init_item else None,
area_name=area_name),
'properties':declared_fields,
})
@@ -239,31 +256,21 @@ def processRouteFile(request, area_name='', file_id=None):
else:
return HttpResponse(status=400)
-def editRoute(request, area_name=""):
+get_edit_route = get_edit_page('chimere:editroute', Route, RouteForm)
+
+def editRoute(request, area_name="", item_id=None):
"""
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()
- notifySubmission(route)
- response_dct = get_base_response(area_name)
- return HttpResponseRedirect(response_dct['extra_url'] + \
- 'submited/edit')
- else:
- # An unbound form
- form = RouteForm()
+ response, values = get_edit_route(request, area_name, item_id)
+ if response:
+ return response
+ item_id, init_item, response_dct, form = values
+
# get the "manualy" declared_fields. Ie: properties
declared_fields = form.declared_fields.keys()
- response_dct = get_base_response(area_name)
response_dct.update({'actions':actions,
- 'action_selected':('contribute', 'edit_route'),
+ 'action_selected':('contribute', 'edit-route'),
'error_message':'',
'map_layer':settings.CHIMERE_MAP_LAYER,
'form':form,
@@ -271,9 +278,9 @@ def editRoute(request, area_name=""):
'extra_head':form.media,
'sub_categories':SubCategory.getAvailable(['R', 'B'],
area_name),
- 'route_widget':RouteChooserWidget().render('route', None,
- area_name=area_name,
- routefile_id='',),
+ 'route_widget':RouteChooserWidget().render('route',
+ init_item.route if init_item else None,
+ area_name=area_name, routefile_id='',),
'properties':declared_fields
})
# manualy populate the custom widget