diff options
Diffstat (limited to 'chimere')
| -rw-r--r-- | chimere/admin.py | 46 | ||||
| -rw-r--r-- | chimere/forms.py | 6 | ||||
| -rw-r--r-- | chimere/templates/chimere/detail.html | 4 | ||||
| -rw-r--r-- | chimere/tests.py | 34 |
4 files changed, 80 insertions, 10 deletions
diff --git a/chimere/admin.py b/chimere/admin.py index 7663bd5..4f7a49d 100644 --- a/chimere/admin.py +++ b/chimere/admin.py @@ -24,12 +24,13 @@ import datetime from django import forms from django.conf import settings -from django.contrib import admin +from django.contrib import admin, messages +from django.core.exceptions import ObjectDoesNotExist from django.db.models import Q -from django.http import HttpResponse +from django.http import HttpResponse, HttpResponseRedirect from django.shortcuts import render_to_response +from django.template import RequestContext from django.utils.translation import ugettext_lazy as _ - try: from chimere import tasks except ImportError: @@ -87,6 +88,42 @@ def export_to_csv(modeladmin, request, queryset): return response export_to_csv.short_description = _(u"Export to CSV") +def managed_modified(modeladmin, request, queryset): + if queryset.count() != 1: + messages.error(request, _(u"Only one item can be managed at a " + u"time.")) + return HttpResponseRedirect(request.get_full_path()) + + marker = queryset.all()[0] + if not marker.status == 'M': + try: + marker = Marker.objects.get(ref_item=marker, status='M') + except ObjectDoesNotExist: + messages.error(request, _(u"No modified item associated " + u"to the selected marker.")) + return HttpResponseRedirect(request.get_full_path()) + marker_ref = marker.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() + 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}, + context_instance=RequestContext(request)) + + class PictureInline(admin.TabularInline): model = PictureFile extra = 1 @@ -108,7 +145,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] + actions = [validate, export_to_kml, export_to_shapefile, export_to_csv, + managed_modified] exclude = ['submiter_session_key', 'import_key', 'import_version', 'available_date'] readonly_fields = ['submiter_email', 'submiter_comment', 'import_source', diff --git a/chimere/forms.py b/chimere/forms.py index 1d37b56..4e834d0 100644 --- a/chimere/forms.py +++ b/chimere/forms.py @@ -203,7 +203,7 @@ class MarkerAdminFormBase(forms.ModelForm): Custom save method in order to manage associated properties """ new_marker = super(MarkerAdminFormBase, self).save(*args, **keys) - if 'status' not in self.cleaned_data: + if 'status' not in self.cleaned_data and not new_marker.status: new_marker.status = 'S' if new_marker.status == 'A': tz = UTC() @@ -276,8 +276,8 @@ class RouteAdminForm(forms.ModelForm): Custom save method in order to manage associated properties """ new_route = super(RouteAdminForm, self).save(*args, **keys) - if 'status' not in self.cleaned_data: - new_route.status = 'S' + if 'status' not in self.cleaned_data and not new_route.status: + new_marker.status = 'S' new_route.save() return new_route diff --git a/chimere/templates/chimere/detail.html b/chimere/templates/chimere/detail.html index 3c43f42..33ddfd1 100644 --- a/chimere/templates/chimere/detail.html +++ b/chimere/templates/chimere/detail.html @@ -28,11 +28,9 @@ <a href='#' class='show_gallery_link'>{% trans "Show multimedia gallery" %}</a> {% endif %} </div> - {% comment %} <a href='{% if marker.route %}{% url chimere:editroute-item area_name_slash|default_if_none:"" marker.route.pk "" %}{%else%}{% url chimere:edit-item area_name_slash|default_if_none:"" marker.pk "" %}{%endif%}'> - {% trans "Submit a modification" %} + {% trans "Submit an amendment" %} </a> - {% endcomment %} {% if moderator_emails %} <a href="mailto:?from={{moderator_emails}}&subject={% trans "Propose amendment" %}&body={% trans "I would like to propose an amendment for this item:"%} {{share_url}}"> {% trans "Propose amendment" %} diff --git a/chimere/tests.py b/chimere/tests.py index ccbbfb5..63eb28f 100644 --- a/chimere/tests.py +++ b/chimere/tests.py @@ -8,10 +8,15 @@ test_path = os.path.abspath(__file__) test_dir_path = os.path.dirname(test_path) + os.sep from django.conf import settings +from django.contrib.auth.models import User +from django.contrib.gis.geos import GEOSGeometry +from django.contrib.messages.storage.fallback import FallbackStorage from django.core.urlresolvers import reverse from django.template import Context from django.test import TestCase +from django.test.client import Client +from chimere.admin import managed_modified, MarkerAdmin from chimere.models import Area, Icon, Importer, Category, SubCategory, Marker,\ Route, News from chimere.forms import MarkerForm, AreaAdminForm @@ -264,3 +269,32 @@ class NewsTest(TestCase): self.assertEqual(len(context['news_lst']), 2) context = display_news(Context({'area_name':'area-2'})) self.assertEqual(len(context['news_lst']), 1) + +class RapprochementTest(TestCase): + def setUp(self): + self.areas = areas_setup() + self.markers = marker_setup() + self.adminuser = User.objects.create_superuser('admin', + 'admin@test.com', + 'pass') + self.client.login(username='admin', password='pass') + + def test_managed_modified(self): + ref_marker = self.markers[0] + new_vals = {'name':"Marker 1 - modified", + 'point':GEOSGeometry('SRID=4326;POINT(-4 48)')} + values = {'status':'M', 'ref_item':ref_marker} + values.update(new_vals) + modified_marker = Marker.objects.create(**values) + modified_marker.categories.add(ref_marker.categories.all()[0]) + response = self.client.post('/admin/chimere/marker/', + data={'action':['managed_modified'], + 'index':0, 'rapprochement':1, + 'name':1, 'point':1, + '_selected_action':[unicode(ref_marker.pk)] + }) + ref_marker = Marker.objects.get(pk=ref_marker.pk) + self.assertEqual(Marker.objects.filter(ref_item=ref_marker, + status='M').count(), 0) + for k in new_vals: + self.assertEqual(getattr(ref_marker, k), new_vals[k]) |
