diff options
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 |
commit | 5e56ea6cddb3cc97892948239dc7b9adbe6a0ec4 (patch) | |
tree | 4fa230be4972fbf7375251eedcffbec8879939c4 | |
parent | 556b3e2c9d2d379fdcf1d6bcecac9bcd7c8d275d (diff) | |
download | Chimère-5e56ea6cddb3cc97892948239dc7b9adbe6a0ec4.tar.bz2 Chimère-5e56ea6cddb3cc97892948239dc7b9adbe6a0ec4.zip |
Allow modification of routes on the main interface
-rw-r--r-- | chimere/actions.py | 2 | ||||
-rw-r--r-- | chimere/forms.py | 31 | ||||
-rw-r--r-- | chimere/static/chimere/js/edit_route_map.js | 4 | ||||
-rw-r--r-- | chimere/templates/chimere/detail.html | 4 | ||||
-rw-r--r-- | chimere/templates/chimere/edit_route.html | 2 | ||||
-rw-r--r-- | chimere/urls.py | 10 | ||||
-rw-r--r-- | chimere/views.py | 153 |
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 |