diff options
Diffstat (limited to 'chimere/views.py')
-rw-r--r-- | chimere/views.py | 87 |
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] |