summaryrefslogtreecommitdiff
path: root/chimere/views.py
diff options
context:
space:
mode:
Diffstat (limited to 'chimere/views.py')
-rw-r--r--chimere/views.py87
1 files changed, 62 insertions, 25 deletions
diff --git a/chimere/views.py b/chimere/views.py
index ddf7874..e249d56 100644
--- a/chimere/views.py
+++ b/chimere/views.py
@@ -28,8 +28,9 @@ from django.conf import settings
from django.core import serializers
from django.core.urlresolvers import reverse
from django.db.models import Q
+from django.forms import model_to_dict
from django.http import HttpResponseRedirect, HttpResponse
-from django.shortcuts import render_to_response
+from django.shortcuts import redirect, render_to_response
from django.template import loader, RequestContext
from django.utils import simplejson
from django.utils.http import urlquote
@@ -99,42 +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=""):
+def edit(request, area_name="", marker_id=None):
"""
Edition page
"""
+ response_dct = get_base_response(area_name)
+
+ # 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]
+
# If the form has been submited
if request.method == 'POST':
- form = MarkerForm(request.POST, request.FILES)
+ 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 submited status
- marker.status = 'S'
+ # 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 HttpResponseRedirect(response_dct['extra_url'] + \
- 'submited/edit')
+ return redirect('chimere:edit-marker',
+ area_name if area_name else '', marker.ref_item.pk)
else:
- # An unbound form
- form = MarkerForm()
- # get the « manualy » declared_fields. Ie: properties
+ form = MarkerForm(instance=init_marker)
+ # 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'),
- 'error_message':'',
- 'map_layer':settings.CHIMERE_MAP_LAYER,
- 'form':form,
- 'dated':settings.CHIMERE_DAYS_BEFORE_EVENT,
- 'extra_head':form.media,
- 'sub_categories':SubCategory.getAvailable(['M', 'B'],
- area_name),
- 'point_widget':PointChooserWidget().render('point', None,
- area_name=area_name),
- 'properties':declared_fields,
- })
+ 'action_selected':('contribute', 'edit'),
+ 'error_message':'',
+ 'map_layer':settings.CHIMERE_MAP_LAYER,
+ 'form':form,
+ 'dated':settings.CHIMERE_DAYS_BEFORE_EVENT,
+ 'extra_head':form.media,
+ 'marker_id':marker_id,
+ 'sub_categories':SubCategory.getAvailable(['M', 'B'],
+ area_name),
+ 'point_widget':PointChooserWidget().render('point',
+ init_marker.point if init_marker else None,
+ area_name=area_name),
+ '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'])
@@ -310,7 +346,8 @@ def getDetail(request, area_name, marker_id):
Get the detail for a marker
'''
try:
- marker = Marker.objects.filter(id=int(marker_id), status__in=['A', 'S'])[0]
+ marker = Marker.objects.filter(id=int(marker_id),
+ status__in=['A', 'S'])[0]
except (ValueError, IndexError):
return HttpResponse('no results')
response_dct = get_base_response()
@@ -388,7 +425,7 @@ def getGeoObjects(request, area_name, category_ids, status):
idx += 1
try:
q = checkDate(Q(status__in=status, categories__in=category_ids))
- query = Marker.objects.filter(q)
+ query = Marker.objects.filter(q).distinct('pk')
except:
return HttpResponse('no results')
category_ids = [int(cat_id) for cat_id in category_ids]