summaryrefslogtreecommitdiff
path: root/chimere
diff options
context:
space:
mode:
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
commit8bcca56ce043e0e4312315d69e436935e28ad9dc (patch)
tree99f540a084ae5efa483cc98c9a8c7413dfe64bd1 /chimere
parent7cc593fd4db11fb0ad60ad7875022f6b497ada08 (diff)
downloadChimère-8bcca56ce043e0e4312315d69e436935e28ad9dc.tar.bz2
Chimère-8bcca56ce043e0e4312315d69e436935e28ad9dc.zip
Fix route rapprochement: prevent delete of associated marker
Diffstat (limited to 'chimere')
-rw-r--r--chimere/admin.py19
-rw-r--r--chimere/models.py2
-rw-r--r--chimere/tests.py32
-rw-r--r--chimere/views.py4
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