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:  | 
