diff options
author | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-11-16 02:36:12 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-11-16 02:36:12 +0100 |
commit | 14798fd25b0e8445d66e9d83f562caee044e1907 (patch) | |
tree | 1655efc4da0f3ac2a09213b9aad51d6a1f0b1c15 | |
parent | 89fd5864f6f61e1d41d2146c46bbf1625f698060 (diff) | |
download | Chimère-14798fd25b0e8445d66e9d83f562caee044e1907.tar.bz2 Chimère-14798fd25b0e8445d66e9d83f562caee044e1907.zip |
Manage route amendment in admin (refs #381)
-rw-r--r-- | chimere/admin.py | 56 | ||||
-rw-r--r-- | chimere/forms.py | 2 | ||||
-rw-r--r-- | chimere/models.py | 8 | ||||
-rw-r--r-- | chimere/templates/admin/managed_modified.html | 47 | ||||
-rw-r--r-- | chimere/templates/chimere/blocks/ol_map.html | 26 | ||||
-rw-r--r-- | chimere/templatetags/chimere_tags.py | 7 |
6 files changed, 113 insertions, 33 deletions
diff --git a/chimere/admin.py b/chimere/admin.py index 4f7a49d..399e6e1 100644 --- a/chimere/admin.py +++ b/chimere/admin.py @@ -94,35 +94,42 @@ def managed_modified(modeladmin, request, queryset): u"time.")) return HttpResponseRedirect(request.get_full_path()) - marker = queryset.all()[0] - if not marker.status == 'M': + item = queryset.all()[0] + if not item.status == 'M': try: - marker = Marker.objects.get(ref_item=marker, status='M') + item = modeladmin.model.objects.get(ref_item=item, status='M') except ObjectDoesNotExist: messages.error(request, _(u"No modified item associated " - u"to the selected marker.")) + u"to the selected item.")) return HttpResponseRedirect(request.get_full_path()) - marker_ref = marker.ref_item + item_ref = item.ref_item if request.POST.get('rapprochement'): - for k in request.POST: - if not request.POST[k]: - continue - if hasattr(marker_ref, k): - setattr(marker_ref, k, getattr(marker, k)) - marker_ref.save() - elif k.startswith('property_'): - try: - pm = PropertyModel.get(pk=int(k[len('property_'):])) - marker_ref.setProperty(pm, marker.getProperty(pm)) - except (ValueError, ObjectDoesNotExist): - pass - marker.delete() + couple = [(item, item_ref)] + if hasattr(item, 'associated_marker'): + couple.append((item.associated_marker, item_ref.associated_marker)) + for it, it_ref in couple: + for k in request.POST: + if not request.POST[k]: + continue + if hasattr(it_ref, k): + setattr(it_ref, k, getattr(it, k)) + it_ref.save() + elif k.startswith('property_'): + try: + pm = PropertyModel.get(pk=int(k[len('property_'):])) + it_ref.setProperty(pm, it.getProperty(pm)) + except (ValueError, ObjectDoesNotExist): + pass + if hasattr(item, 'associated_marker'): + for it in item.associated_marker.all(): + it.delete() + item.delete() messages.success(request, _(u"Modified item traited.")) return HttpResponseRedirect(request.get_full_path()) - return render_to_response('admin/managed_modified_marker.html', - {'marker':marker, 'marker_ref':marker_ref}, + return render_to_response('admin/managed_modified.html', + {'item':item, 'item_ref':item_ref}, context_instance=RequestContext(request)) - +managed_modified.short_description = _(u"Managed modified items") class PictureInline(admin.TabularInline): model = PictureFile @@ -145,8 +152,8 @@ class MarkerAdmin(admin.ModelAdmin): search_fields = ("name",) list_display = ('name', 'status') list_filter = ('status', 'categories') - actions = [validate, export_to_kml, export_to_shapefile, export_to_csv, - managed_modified] + actions = [validate, managed_modified, export_to_kml, export_to_shapefile, + export_to_csv] exclude = ['submiter_session_key', 'import_key', 'import_version', 'available_date'] readonly_fields = ['submiter_email', 'submiter_comment', 'import_source', @@ -177,7 +184,8 @@ class RouteAdmin(admin.ModelAdmin): exclude = ['height', 'width'] form = RouteAdminForm readonly_fields = ('associated_file',) - actions = [validate, export_to_kml, export_to_shapefile, export_to_csv] + actions = [validate, managed_modified, export_to_kml, export_to_shapefile, + export_to_csv] def queryset(self, request): qs = self.model._default_manager.get_query_set() diff --git a/chimere/forms.py b/chimere/forms.py index 4e834d0..4b4d49f 100644 --- a/chimere/forms.py +++ b/chimere/forms.py @@ -277,7 +277,7 @@ class RouteAdminForm(forms.ModelForm): """ new_route = super(RouteAdminForm, self).save(*args, **keys) if 'status' not in self.cleaned_data and not new_route.status: - new_marker.status = 'S' + new_route.status = 'S' new_route.save() return new_route diff --git a/chimere/models.py b/chimere/models.py index b15a268..12ec7a1 100644 --- a/chimere/models.py +++ b/chimere/models.py @@ -414,6 +414,10 @@ class Marker(GeographicItem): def geometry(self): return self.point.wkt + @property + def geom_attr(self): + return 'point' + class Meta: ordering = ('status', 'name') verbose_name = _(u"Point of interest") @@ -879,6 +883,10 @@ class Route(GeographicItem): def geometry(self): return self.route.wkt + @property + def geom_attr(self): + return 'route' + def get_init_multi(self): if not self.associated_marker.count(): return [] diff --git a/chimere/templates/admin/managed_modified.html b/chimere/templates/admin/managed_modified.html new file mode 100644 index 0000000..c55650d --- /dev/null +++ b/chimere/templates/admin/managed_modified.html @@ -0,0 +1,47 @@ +{% extends "admin/base_site.html" %} +{% load chimere_tags i18n admin_static %} + +{% block extrahead %} +<link rel="stylesheet" type="text/css" href="{% static "admin/css/forms.css" %}" /> +<script src="http://www.openlayers.org/api/OpenLayers.js"></script> +{% endblock %} + + +{% block content %} +<p class='errornote'>{% trans "Be careful: after validation, the modified item will be deleted. There is no roll-back." %}</p> +<fieldset class='module'> +<form method='POST' action='.'> +{% csrf_token %} +<input type='hidden' name='action' value='managed_modified'/> +<input type='hidden' name='rapprochement' value='1'/> +<input type='hidden' name='_selected_action' value='{{item.pk}}'/> +<table> +<thead> +<tr><th> </th><th>{% trans "Reference" %}</th><th>{% trans "Modified item" %}</th><th>{% trans "Accept modification" %}</th></tr> +</thead> +<tbody> +<tr><th>{% trans "Name" %}</th><td>{{item_ref}}</td><td>{{item}}</td><td><input type='checkbox' name='name'/></td></tr> +<tr> + <th>{% trans "Categories" %}</th> + <td>{% for cat in item_ref.categories.all %}{%if forloop.counter0 %}, {%endif%}{{cat}}{%endfor%}</td> + <td>{% for cat in item.categories.all %}{%if forloop.counter0 %}, {%endif%}{{cat}}{%endfor%}</td> + <td><input type='checkbox' name='categories'/></td> +</tr> +<tr><th>{% trans "Emplacement" %}</th><td>{{item_ref|ol_map:'map_ref_id'}}</td><td>{{item|ol_map:'map_id'}}</td><td><input type='checkbox' name='{{item.geom_attr}}'/></td></tr> +<tr><th>{% trans "Description" %}</th><td>{{item_ref.description|safe}}</td><td>{{item.description|safe}}</td><td><input type='checkbox' name='description'/></td></tr> +{% for property_ref in item_ref.getProperties %} +{% for property in item.getProperties %} +{% ifequal property_ref.propertymodel property.propertymodel %} +<tr><th>{{property.propertymodel.name}}</th><td>{{property_ref.value|safe}}</td><td>{{property.value|safe}}</td><td><input type='checkbox' name='property_{{property.propertymodel.pk}}'/></td></tr> +{% endifequal %} +{% endfor %} +{% endfor %} +</tbody> +</table> +</fieldset> +<div class='submit-row'> +<p class='deletelink-box'><a href="{% if item.point %}{% url admin:chimere_marker_changelist %}{%else%}{% url admin:chimere_route_changelist %}{%endif%}">{% trans "Back to list" %}</a></p> +<input class='default' type='submit' value='{% trans "Validate" %}'/> +</div> +</form> +{% endblock %} diff --git a/chimere/templates/chimere/blocks/ol_map.html b/chimere/templates/chimere/blocks/ol_map.html index 98743fa..a12651c 100644 --- a/chimere/templates/chimere/blocks/ol_map.html +++ b/chimere/templates/chimere/blocks/ol_map.html @@ -1,19 +1,31 @@ {% load unlocalize_point %} -<div id="{{map_id}}" style="height:250px"></div> +<div id="{{map_id}}" style="height:250px;width:250px;"></div> <script> - - var lat = '{{geom.y|unlocalize_point}}'; - var lon = '{{geom.x|unlocalize_point}}'; - var zoom = 18; + {{map_id}} = new OpenLayers.Map("{{map_id}}"); + {{map_id}}.addLayer(new OpenLayers.Layer.OSM()); var fromProjection = new OpenLayers.Projection("EPSG:4326"); var toProjection = new OpenLayers.Projection("EPSG:900913"); + {% ifequal geom_type 'point' %} + var lat = '{{geom.y|unlocalize_point}}'; + var lon = '{{geom.x|unlocalize_point}}'; var position = new OpenLayers.LonLat(lon, lat).transform(fromProjection, toProjection); - {{map_id}} = new OpenLayers.Map("{{map_id}}"); - {{map_id}}.addLayer(new OpenLayers.Layer.OSM()); var {{map_id}}markers = new OpenLayers.Layer.Markers( "Markers" ); {{map_id}}.addLayer({{map_id}}markers); {{map_id}}markers.addMarker(new OpenLayers.Marker(position)); + var zoom = 18; {{map_id}}.setCenter(position, zoom); + {% else %} + var wkt_reader = new OpenLayers.Format.WKT({ + 'internalProjection':toProjection, + 'externalProjection':fromProjection + }); + var {{map_id}}vectors = new OpenLayers.Layer.Vector("Vector Layer"); + {{map_id}}.addLayer({{map_id}}vectors); + var {{map_id}}features = wkt_reader.read('{{geom.wkt}}'); + {{map_id}}vectors.addFeatures([{{map_id}}features]); + + {{map_id}}.zoomToExtent({{map_id}}vectors.getDataExtent()); + {% endifequal %} </script> diff --git a/chimere/templatetags/chimere_tags.py b/chimere/templatetags/chimere_tags.py index 25e6122..7753bc0 100644 --- a/chimere/templatetags/chimere_tags.py +++ b/chimere/templatetags/chimere_tags.py @@ -211,7 +211,12 @@ def get_tinyfied_url(marker, area_name=''): return url @register.filter(name='ol_map') -def ol_map(geom, arg='map_id'): +def ol_map(item, arg='map_id'): + geom, geom_type = None, None + if hasattr(item, 'point'): + geom, geom_type = item.point, 'point' + elif hasattr(item, 'route'): + geom, geom_type = item.route, 'route' rendered = render_to_string('chimere/blocks/ol_map.html', {'geom': geom, 'map_id':arg}) return rendered |