summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chimere/admin.py54
-rw-r--r--chimere/templates/admin/chimere/marker/change_form.html13
l---------chimere/templates/admin/chimere/route/change_form.html1
-rw-r--r--chimere/tests.py22
-rw-r--r--chimere/utils.py34
5 files changed, 97 insertions, 27 deletions
diff --git a/chimere/admin.py b/chimere/admin.py
index 2d5f8bf..0f17d30 100644
--- a/chimere/admin.py
+++ b/chimere/admin.py
@@ -95,39 +95,44 @@ def export_to_csv(modeladmin, request, queryset):
export_to_csv.short_description = _(u"Export to CSV")
def managed_modified(modeladmin, request, queryset):
+ # not very clean... There is must be a better way to do that
+ redirect_url = request.get_full_path().split('admin_modification')[0]
if queryset.count() != 1:
messages.error(request, _(u"Only one item can be managed at a "
u"time."))
- return HttpResponseRedirect(request.get_full_path())
+ return HttpResponseRedirect(redirect_url)
item = queryset.all()[0]
- if not item.status == 'M':
+ if not item.ref_item or item.ref_item == item:
try:
- item = modeladmin.model.objects.get(ref_item=item, status='M')
+ item = modeladmin.model.objects.get(ref_item=item)
except ObjectDoesNotExist:
messages.error(request, _(u"No modified item associated "
u"to the selected item."))
- return HttpResponseRedirect(request.get_full_path())
+ return HttpResponseRedirect(redirect_url)
item_ref = item.ref_item
if request.POST.get('rapprochement'):
couple = [(item, item_ref)]
if hasattr(item, 'associated_marker'):
couple.append((item.associated_marker.all()[0],
item_ref.associated_marker.all()[0]))
- updated_keys = dict(request.POST)
+ updated = dict(request.POST)
# clean
for k in ('action', 'rapprochement', 'index', '_selected_action'):
- if k in updated_keys:
- updated_keys.pop(k)
+ if k in updated:
+ updated.pop(k)
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)
+ if k in updated:
+ updated.pop(k)
+ updated_keys = updated.keys()
+ if it.status == 'I':
+ updated_keys.append('import_version')
for k in updated_keys:
- if not request.POST[k]:
+ if k != 'import_version' and not request.POST[k]:
continue
if hasattr(it_ref, k):
c_value = getattr(it_ref, k)
@@ -149,7 +154,7 @@ def managed_modified(modeladmin, request, queryset):
it.delete()
item.delete()
messages.success(request, _(u"Modified item traited."))
- return HttpResponseRedirect(request.get_full_path())
+ return HttpResponseRedirect(redirect_url)
return render_to_response('admin/chimere/managed_modified.html',
{'item':item, 'item_ref':item_ref},
context_instance=RequestContext(request))
@@ -229,7 +234,24 @@ class MarkerAdmin(admin.ModelAdmin):
qs = qs.order_by(*ordering)
return qs.distinct()
-class RouteAdmin(admin.ModelAdmin):
+ def admin_modification(self, request, item_id):
+ '''
+ Redirect to the marker modification form
+ '''
+ return managed_modified(self, request,
+ Marker.objects.filter(pk=item_id))
+ def get_urls(self):
+ from django.conf.urls.defaults import *
+ urls = super(MarkerAdmin, self).get_urls()
+ my_urls = patterns('',
+ url(r'^admin_modification/(?P<item_id>\d+)/$',
+ self.admin_site.admin_view(self.admin_modification),
+ name='admin-modification'),
+ )
+ return my_urls + urls
+
+
+class RouteAdmin(MarkerAdmin):
"""
Specialized the Route field.
"""
@@ -261,6 +283,7 @@ class RouteAdmin(admin.ModelAdmin):
'has_associated_marker')
}),
)
+ inlines = []
def queryset(self, request):
qs = self.model._default_manager.get_query_set()
@@ -275,6 +298,13 @@ class RouteAdmin(admin.ModelAdmin):
qs = qs.order_by(*ordering)
return qs
+ def admin_modification(self, request, item_id):
+ '''
+ Redirect to the route modification form
+ '''
+ return managed_modified(self, request,
+ Route.objects.filter(pk=item_id))
+
class LayerInline(admin.TabularInline):
model = AreaLayers
extra = 1
diff --git a/chimere/templates/admin/chimere/marker/change_form.html b/chimere/templates/admin/chimere/marker/change_form.html
new file mode 100644
index 0000000..64c48f9
--- /dev/null
+++ b/chimere/templates/admin/chimere/marker/change_form.html
@@ -0,0 +1,13 @@
+{% extends "admin/change_form.html" %}
+{% load i18n %}
+{% block field_sets %}
+{% if original.ref_item and original.ref_item != orginal %}
+<p class='errornote'>
+{% url admin:admin-modification object_id as rapprochement_form %}
+{% blocktrans %}
+This item has a reference item associated to it. You should treat it via the <a href='{{ rapprochement_form }}'>rapprochement form</a>.
+{% endblocktrans %}
+</p>
+{% endif %}
+{{ block.super }}
+{% endblock %}
diff --git a/chimere/templates/admin/chimere/route/change_form.html b/chimere/templates/admin/chimere/route/change_form.html
new file mode 120000
index 0000000..21811b6
--- /dev/null
+++ b/chimere/templates/admin/chimere/route/change_form.html
@@ -0,0 +1 @@
+../marker/change_form.html \ No newline at end of file
diff --git a/chimere/tests.py b/chimere/tests.py
index 1622923..20c0f29 100644
--- a/chimere/tests.py
+++ b/chimere/tests.py
@@ -389,6 +389,28 @@ class RapprochementTest(TestCase):
for k in new_vals:
self.assertEqual(getattr(ref_marker, k), new_vals[k])
+ def test_managed_modified_imported_markers(self):
+ ref_marker = self.markers[0]
+ new_vals = {'name':"Marker 1 - modified",
+ 'point':GEOSGeometry('SRID=4326;POINT(-4 48)')}
+ values = {'status':'I', 'ref_item':ref_marker, 'import_version':42}
+ values.update(new_vals)
+ modified_marker = Marker.objects.create(**values)
+ self.assertNotEqual(ref_marker.import_version,
+ modified_marker.import_version)
+ 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='I').count(), 0)
+ for k in new_vals.keys() + ['import_version']:
+ self.assertEqual(getattr(ref_marker, k), values[k])
+
def test_managed_modified_routes(self):
ref_route = self.routes[0]
new_vals = {'name':"Route 1 - modified",
diff --git a/chimere/utils.py b/chimere/utils.py
index bb24037..73eecd0 100644
--- a/chimere/utils.py
+++ b/chimere/utils.py
@@ -71,7 +71,7 @@ class ImportManager:
pass
def create_or_update_item(self, cls, values, import_key, version=None,
- key='', pk=None):
+ key='', pk=None, overload=True):
updated, created, item = False, False, None
import_key = unicode(import_key).replace(':', '^')
if not key:
@@ -82,20 +82,24 @@ class ImportManager:
'import_source':self.importer_instance.source}
try:
if pk:
- item = cls.objects.get(pk=pk)
+ ref_item = cls.objects.get(pk=pk)
else:
- item = cls.objects.get(**dct_import)
- if version and item.import_version == int(version):
+ ref_item = cls.objects.get(**dct_import)
+ if version and ref_item.import_version == int(version):
# no update since the last import
- return item, None, None
- for k in values:
- setattr(item, k, values[k])
- try:
- item.save()
- except TypeError:
- # error on data source
- return None, False, False
- updated = True
+ return ref_item, None, None
+ if not overload and item.modified_since_import:
+ dct_import['ref_item'] = ref_item
+ else:
+ item = ref_item
+ for k in values:
+ setattr(item, k, values[k])
+ try:
+ item.save()
+ except TypeError:
+ # error on data source
+ return None, False, False
+ updated = True
except ObjectDoesNotExist:
pass
if not item:
@@ -680,7 +684,7 @@ class OSMManager(ImportManager):
or u'ODbL',
'import_version':version}
item, updated, created = self.create_or_update_item(
- Route, dct, node_id, version)
+ Route, dct, node_id, version, overload=False)
if updated:
updated_item += 1
if created:
@@ -713,7 +717,7 @@ class OSMManager(ImportManager):
or u'ODbL',
'import_version':version}
item, updated, created = self.create_or_update_item(
- Marker, dct, node_id, version)
+ Marker, dct, node_id, version, overload=False)
if updated:
updated_item += 1
if created: