diff options
-rw-r--r-- | chimere/admin.py | 54 | ||||
-rw-r--r-- | chimere/templates/admin/chimere/marker/change_form.html | 13 | ||||
l--------- | chimere/templates/admin/chimere/route/change_form.html | 1 | ||||
-rw-r--r-- | chimere/tests.py | 22 | ||||
-rw-r--r-- | chimere/utils.py | 34 |
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: |