Skip to content

Commit 6e0be5a

Browse files
authored
[fix] Fixed CopyableFieldsAdmin fields order openwisp#335
Fixes openwisp#335
1 parent b10d3cd commit 6e0be5a

File tree

2 files changed

+19
-3
lines changed

2 files changed

+19
-3
lines changed

openwisp_utils/admin.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,15 +104,19 @@ def get_fields(self, request, obj=None):
104104
# in the case of `add_view` because `copyable_fields`
105105
# can't be edited and are auto generated by the system
106106
if not obj:
107-
return tuple(set(fields).difference(self.copyable_fields))
107+
# Make sure field order remains the same when excluding `copyable_fields`
108+
return [field for field in fields if field not in self.copyable_fields]
108109
return fields
109110

110111
def get_readonly_fields(self, request, obj=None):
111112
readonly_fields = super(ModelAdmin, self).get_readonly_fields(request, obj)
112113
if not obj:
113114
return readonly_fields
114-
# Make sure `copyable_fields` is included in `read_only` fields
115-
return tuple([*readonly_fields, *self.copyable_fields])
115+
# If any `copyable_fields` are not included
116+
# in the `read-only` fields, then include them
117+
if not any(field in readonly_fields for field in self.copyable_fields):
118+
return tuple([*readonly_fields, *self.copyable_fields])
119+
return readonly_fields
116120

117121
def add_view(self, request, form_url='', extra_context=None):
118122
extra_context = extra_context or {}

tests/test_project/tests/test_admin.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,18 @@ class TestCopyableFieldAdmin(CopyableFieldsAdmin):
234234
ma.get_fields(self.client.request)
235235
self.assertIn(copyable_field_err, err.exception.args[0])
236236

237+
def test_copyablefields_admin_fields_order(self):
238+
path = reverse('admin:test_project_project_add')
239+
self.client.get(path)
240+
ma = ProjectAdmin(Project, self.site)
241+
# 'uuid' should be missing from ma.get_fields()
242+
# because we're testing the project admin add form,
243+
# and now we're adding it here again only to assert the admin field order
244+
self.assertEqual(ma.fields, ('uuid', *ma.get_fields(self.client.request)))
245+
self.assertEqual(
246+
ma.readonly_fields, ma.get_readonly_fields(self.client.request)
247+
)
248+
237249
def test_receive_url_admin(self):
238250
p = Project.objects.create(name='test_receive_url_admin_project')
239251
ma = ProjectAdmin(Project, self.site)

0 commit comments

Comments
 (0)