diff options
author | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-11-23 21:25:27 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-11-23 21:25:27 +0100 |
commit | 8bcca56ce043e0e4312315d69e436935e28ad9dc (patch) | |
tree | 99f540a084ae5efa483cc98c9a8c7413dfe64bd1 | |
parent | 7cc593fd4db11fb0ad60ad7875022f6b497ada08 (diff) | |
download | Chimère-8bcca56ce043e0e4312315d69e436935e28ad9dc.tar.bz2 Chimère-8bcca56ce043e0e4312315d69e436935e28ad9dc.zip |
Fix route rapprochement: prevent delete of associated marker
-rw-r--r-- | chimere/admin.py | 19 | ||||
-rw-r--r-- | chimere/models.py | 2 | ||||
-rw-r--r-- | chimere/tests.py | 32 | ||||
-rw-r--r-- | chimere/views.py | 4 |
4 files changed, 49 insertions, 8 deletions
diff --git a/chimere/admin.py b/chimere/admin.py index 4e175aa..8fe2b77 100644 --- a/chimere/admin.py +++ b/chimere/admin.py @@ -112,9 +112,21 @@ def managed_modified(modeladmin, request, queryset): if request.POST.get('rapprochement'): 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: + couple.append((item.associated_marker.all()[0], + item_ref.associated_marker.all()[0])) + updated_keys = request.POST + updated_keys.pop('action') + updated_keys.pop('rapprochement') + updated_keys.pop('index') + updated_keys.pop('_selected_action') + for idx, cpl in enumerate(couple): + it, it_ref = cpl + # don't copy geometry of associated items + if idx: + for k in ('route', 'point'): + if k in updated_keys: + updated_keys.pop(k) + for k in updated_keys: if not request.POST[k]: continue if hasattr(it_ref, k): @@ -124,6 +136,7 @@ def managed_modified(modeladmin, request, queryset): for val in getattr(it, k).all(): c_value.add(val) else: + setattr(it_ref, k, getattr(it, k)) it_ref.save() elif k.startswith('property_'): try: diff --git a/chimere/models.py b/chimere/models.py index 8420255..065f7e9 100644 --- a/chimere/models.py +++ b/chimere/models.py @@ -960,7 +960,7 @@ def route_post_save(sender, **kwargs): marker_fields = [f.attname for f in Marker._meta.fields] route_fields = [f.attname for f in Route._meta.fields] marker_dct = dict([(k, getattr(instance, k)) for k in marker_fields - if k in route_fields and k not in ('id', 'ref_item_id')]) + if k in route_fields and k not in ('id', 'ref_item_id')]) marker_dct['point'] = "SRID=%d;POINT(%f %f)" % (instance.route.srid, instance.route[0][0], instance.route[0][1]) marker, created = Marker.objects.get_or_create(route=instance, diff --git a/chimere/tests.py b/chimere/tests.py index 5fd9f55..0bfd830 100644 --- a/chimere/tests.py +++ b/chimere/tests.py @@ -95,7 +95,7 @@ def route_setup(sub_categories=[]): current_date = datetime.datetime.now() routes = [] route_1 = Route.objects.create(name="Route 1", status='A', - has_associated_marker=False, route='SRID=4326;LINESTRING(-1 1, 1 -1)') + has_associated_marker=True, route='SRID=4326;LINESTRING(-1 1, 1 -1)') route_1.categories.add(sub_categories[0]) routes.append(route_1) route_2 = Route.objects.create(name="Route 2", status='A', @@ -358,13 +358,15 @@ class NewsTest(TestCase): class RapprochementTest(TestCase): def setUp(self): self.areas = areas_setup() - self.markers = marker_setup() + self.subcategories = subcategory_setup() + self.markers = marker_setup(self.subcategories) + self.routes = route_setup(self.subcategories) self.adminuser = User.objects.create_superuser('admin', 'admin@test.com', 'pass') self.client.login(username='admin', password='pass') - def test_managed_modified(self): + def test_managed_modified_markers(self): ref_marker = self.markers[0] new_vals = {'name':"Marker 1 - modified", 'point':GEOSGeometry('SRID=4326;POINT(-4 48)')} @@ -384,6 +386,30 @@ class RapprochementTest(TestCase): for k in new_vals: self.assertEqual(getattr(ref_marker, k), new_vals[k]) + def test_managed_modified_routes(self): + ref_route = self.routes[0] + new_vals = {'name':"Route 1 - modified", + 'route':GEOSGeometry('SRID=4326;LINESTRING(1 1,2 2)')} + values = {'status':'M', 'ref_item':ref_route, + 'has_associated_marker':True} + values.update(new_vals) + modified_route = Route.objects.create(**values) + modified_route.categories.add(self.subcategories[1]) + response = self.client.post('/admin/chimere/route/', + data={'action':['managed_modified'], + 'index':0, 'rapprochement':1, + 'name':1, 'route':1, 'categories':1, + '_selected_action':[unicode(ref_route.pk)] + }) + ref_route = Route.objects.get(pk=ref_route.pk) + self.assertEqual(Route.objects.filter(ref_item=ref_route, + status='M').count(), 0) + self.assertEqual(ref_route.name, new_vals['name']) + self.assertEqual(ref_route.route.wkt, new_vals['route'].wkt) + self.assertEqual(ref_route.categories.all()[0], self.subcategories[1]) + self.assertEqual(ref_route.associated_marker.all()[0].name, + ref_route.name) + class RouteTest(TestCase): def setUp(self): self.subcategories = subcategory_setup() diff --git a/chimere/views.py b/chimere/views.py index 99ecc89..db63809 100644 --- a/chimere/views.py +++ b/chimere/views.py @@ -187,7 +187,6 @@ def get_edit_page(redirect_url, item_cls, item_form, init_item.submiter_session_key == \ request.session.session_key): inst = init_item - form = item_form(request.POST, request.FILES, instance=inst, subcategories=listed_subcats) formset_multi = multimediafile_formset(request.POST, request.FILES, @@ -206,6 +205,9 @@ def get_edit_page(redirect_url, item_cls, item_form, item.ref_item = ref_item if item.pk != ref_item.pk: item.status = 'M' + if hasattr(ref_item, 'has_associated_marker'): + item.has_associated_marker = \ + ref_item.has_associated_marker elif not item.ref_item: # initialisation item.ref_item = item |