diff --git a/django_netjsongraph/base/admin.py b/django_netjsongraph/base/admin.py index f6571e1..4f7d65a 100644 --- a/django_netjsongraph/base/admin.py +++ b/django_netjsongraph/base/admin.py @@ -98,21 +98,33 @@ def _message(self, request, rows, suffix, level=messages.SUCCESS): def update_selected(self, request, queryset): items = list(queryset) failed = [] + ignored = [] for item in items: - try: - item.update() - except Exception as e: - failed.append('{0}: {1}'.format(item.label, str(e))) - with log_failure('update topology admin action', item): - raise e + if item.strategy == 'fetch': + try: + item.update() + except Exception as e: + failed.append('{0}: {1}'.format(item.label, str(e))) + with log_failure('update topology admin action', item): + raise e + else: + ignored.append(item) + # remove item from items if ignored. + for item in ignored: + if item in items: + items.remove(item) failures = len(failed) successes = len(items) - failures + total_ignored = len(ignored) if successes > 0: self._message(request, successes, _('successfully updated')) if failures > 0: message = _('not updated. %s') % '; '.join(failed) self._message(request, failures, message, level=messages.ERROR) - update_selected.short_description = _('Update selected topologies') + if total_ignored > 0: + message = _("ignored as they don't use FETCH strategy") + self._message(request, total_ignored, message, level=messages.WARNING) + update_selected.short_description = _('Update selected topologies (FETCH strategy only)') def publish_selected(self, request, queryset): rows_updated = queryset.update(published=True) diff --git a/django_netjsongraph/tests/base/test_admin.py b/django_netjsongraph/tests/base/test_admin.py index 8bd57d5..56150e3 100644 --- a/django_netjsongraph/tests/base/test_admin.py +++ b/django_netjsongraph/tests/base/test_admin.py @@ -117,3 +117,16 @@ def test_topology_visualize_view(self): path = reverse('{0}_topology_visualize'.format(self.prefix), args=[t.pk]) response = self.client.get(path) self.assertContains(response, 'd3.netJsonGraph(') + + def test_update_selected_receive_topology(self): + self.topology_model.objects.create(label='test receive', + parser='netdiff.NetJsonParser', + strategy='receive', url='asd.asd') + t = self.topology_model.objects.filter(strategy='receive')[0] + response = self.client.post(self.changelist_path, { + 'action': 'update_selected', + '_selected_action': str(t.pk) + }, follow=True) + message = list(response.context['messages'])[0] + self.assertEqual('warning', message.tags) + self.assertIn("ignored as they don't use FETCH strategy", message.message)