From b8435853e6d2084f5b5e8767f36f6a044bfba034 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rund=20Helleb=C3=B8?= Date: Mon, 19 Aug 2024 10:58:01 +0200 Subject: [PATCH 1/3] Fix seeddb netbox-edit form so that empty function field will remove function info from netbox --- changelog.d/2269.fixed.md | 3 ++ python/nav/web/seeddb/page/netbox/edit.py | 7 +++++ tests/integration/seeddb_test.py | 34 ++++++++++++++++++++++- 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 changelog.d/2269.fixed.md diff --git a/changelog.d/2269.fixed.md b/changelog.d/2269.fixed.md new file mode 100644 index 0000000000..c0f2711fe4 --- /dev/null +++ b/changelog.d/2269.fixed.md @@ -0,0 +1,3 @@ +Emptying the function field then clicking *Save* when editing a netbox +now actually removes the function for that netbox (as opposed to +silently ignoring the change). diff --git a/python/nav/web/seeddb/page/netbox/edit.py b/python/nav/web/seeddb/page/netbox/edit.py index 209ac090cf..1fab8d6e13 100644 --- a/python/nav/web/seeddb/page/netbox/edit.py +++ b/python/nav/web/seeddb/page/netbox/edit.py @@ -290,6 +290,13 @@ def netbox_do_save(form): else: func.value = function func.save() + elif function == '': + try: + func = NetboxInfo.objects.get(netbox=netbox, variable='function') + except NetboxInfo.DoesNotExist: + pass + else: + func.delete() # Save the groups netboxgroups = form.cleaned_data['groups'] diff --git a/tests/integration/seeddb_test.py b/tests/integration/seeddb_test.py index bfd6b6bb97..4ca9a2d9ae 100644 --- a/tests/integration/seeddb_test.py +++ b/tests/integration/seeddb_test.py @@ -6,7 +6,7 @@ from mock import MagicMock from django.utils.encoding import smart_str -from nav.models.manage import Netbox, Room +from nav.models.manage import Netbox, Room, NetboxInfo from nav.web.seeddb.page.netbox.edit import netbox_edit, log_netbox_change from nav.web.seeddb.utils.delete import dependencies @@ -110,3 +110,35 @@ def test_log_netbox_change_should_not_crash(admin_account, netbox): new.category_id = "OTHER" assert log_netbox_change(admin_account, old, new) is None + + +def test_empty_function_field_in_netbox_edit_form_should_delete_respective_netboxinfo_instance(netbox, db, client): + """ + Empty function fields in the webform should cause the function's + corresponding NetboxInfo to be deleted; This is the correct thing + to do because NAV prefills user forms with previously assigned + values. Hence, if NAV receives a form with an empty function + string, this means the user has explicitly cleared the function + string. + """ + url = reverse('seeddb-netbox-edit', args=(netbox.id,)) + def post(func): + return client.post( + url, + follow=True, + data={ + "ip": netbox.ip, + "room": netbox.room_id, + "category": netbox.category_id, + "organization": netbox.organization_id, + "function": func, + }, + ) + + assert len(NetboxInfo.objects.filter(netbox=netbox, variable='function')) == 0 + post("") + assert len(NetboxInfo.objects.filter(netbox=netbox, variable='function')) == 0 + post("foo") + assert NetboxInfo.objects.filter(netbox=netbox, variable='function').get().value == 'foo' + post("") + assert len(NetboxInfo.objects.filter(netbox=netbox, variable='function')) == 0 From 6251877d9f82d552ecf58dbcb77ccc2c3adedabf Mon Sep 17 00:00:00 2001 From: jorund1 Date: Fri, 23 Aug 2024 14:36:06 +0200 Subject: [PATCH 2/3] Apply suggestions from pull request thread Co-authored-by: Morten Brekkevold --- python/nav/web/seeddb/page/netbox/edit.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/python/nav/web/seeddb/page/netbox/edit.py b/python/nav/web/seeddb/page/netbox/edit.py index 1fab8d6e13..26a5fc4ba7 100644 --- a/python/nav/web/seeddb/page/netbox/edit.py +++ b/python/nav/web/seeddb/page/netbox/edit.py @@ -291,12 +291,7 @@ def netbox_do_save(form): func.value = function func.save() elif function == '': - try: - func = NetboxInfo.objects.get(netbox=netbox, variable='function') - except NetboxInfo.DoesNotExist: - pass - else: - func.delete() + NetboxInfo.objects.filter(netbox=netbox, variable='function').delete() # Save the groups netboxgroups = form.cleaned_data['groups'] From 4b269d18f116719c31868a4dc1cfc5e3ad253e03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rund=20Helleb=C3=B8?= Date: Fri, 23 Aug 2024 16:35:50 +0200 Subject: [PATCH 3/3] Make linter happy --- tests/integration/seeddb_test.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tests/integration/seeddb_test.py b/tests/integration/seeddb_test.py index 4ca9a2d9ae..237016e68e 100644 --- a/tests/integration/seeddb_test.py +++ b/tests/integration/seeddb_test.py @@ -112,7 +112,9 @@ def test_log_netbox_change_should_not_crash(admin_account, netbox): assert log_netbox_change(admin_account, old, new) is None -def test_empty_function_field_in_netbox_edit_form_should_delete_respective_netboxinfo_instance(netbox, db, client): +def test_empty_function_field_in_netbox_edit_form_should_delete_respective_netboxinfo_instance( + netbox, db, client +): """ Empty function fields in the webform should cause the function's corresponding NetboxInfo to be deleted; This is the correct thing @@ -122,6 +124,7 @@ def test_empty_function_field_in_netbox_edit_form_should_delete_respective_netbo string. """ url = reverse('seeddb-netbox-edit', args=(netbox.id,)) + def post(func): return client.post( url, @@ -139,6 +142,9 @@ def post(func): post("") assert len(NetboxInfo.objects.filter(netbox=netbox, variable='function')) == 0 post("foo") - assert NetboxInfo.objects.filter(netbox=netbox, variable='function').get().value == 'foo' + assert ( + NetboxInfo.objects.filter(netbox=netbox, variable='function').get().value + == 'foo' + ) post("") assert len(NetboxInfo.objects.filter(netbox=netbox, variable='function')) == 0