Skip to content

Commit 1645e68

Browse files
committed
remove protected field on form bound for safety
no need to validate the likely "empty" data form the disabled field Signed-off-by: tdruez <tdruez@aboutcode.org>
1 parent d7fdc59 commit 1645e68

2 files changed

Lines changed: 22 additions & 12 deletions

File tree

component_catalog/tests/test_views.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3566,15 +3566,16 @@ def test_component_catalog_package_form_add(self):
35663566
"usage_policy": policy_approved.pk,
35673567
}
35683568
form = PackageForm(user=self.super_user, data=data)
3569-
self.assertEqual(0, len(form.fields["usage_policy"].queryset))
3569+
self.assertNotIn("usage_policy", form.fields)
35703570
self.assertTrue(form.is_valid())
35713571
package = form.save()
35723572
self.assertIsNone(package.usage_policy)
35733573

35743574
data["filename"] = "with policy"
35753575
self.super_user = add_perm(self.super_user, "change_usage_policy_on_package")
35763576
form = PackageForm(user=self.super_user, data=data)
3577-
self.assertEqual(1, len(form.fields["usage_policy"].queryset))
3577+
self.assertIn("usage_policy", form.fields)
3578+
self.assertQuerySetEqual([policy_approved], form.fields["usage_policy"].queryset)
35783579
self.assertTrue(form.is_valid())
35793580
package = form.save()
35803581
self.assertEqual(policy_approved, package.usage_policy)
@@ -4386,15 +4387,16 @@ def test_component_catalog_component_form_add(self):
43864387
"usage_policy": policy_approved.pk,
43874388
}
43884389
form = ComponentForm(user=self.user, data=data)
4389-
self.assertEqual(0, len(form.fields["usage_policy"].queryset))
4390+
self.assertNotIn("usage_policy", form.fields)
43904391
self.assertTrue(form.is_valid())
43914392
component = form.save()
43924393
self.assertIsNone(component.usage_policy)
43934394

43944395
data["version"] = "with policy"
43954396
self.user = add_perm(self.user, "change_usage_policy_on_component")
43964397
form = ComponentForm(user=self.user, data=data)
4397-
self.assertEqual(1, len(form.fields["usage_policy"].queryset))
4398+
self.assertIn("usage_policy", form.fields)
4399+
self.assertQuerySetEqual([policy_approved], form.fields["usage_policy"].queryset)
43984400
self.assertTrue(form.is_valid())
43994401
component = form.save()
44004402
self.assertEqual(policy_approved, component.usage_policy)
@@ -4413,6 +4415,7 @@ def test_component_catalog_component_form_add(self):
44134415
"homepage_url": "https://nexb.com",
44144416
"configuration_status": status.pk,
44154417
"release_date": "2019-03-01",
4418+
"usage_policy": policy_approved.pk,
44164419
"submit": "Add Component",
44174420
}
44184421
form = ComponentForm(user=self.user, data=data)
@@ -4422,6 +4425,7 @@ def test_component_catalog_component_form_add(self):
44224425
self.assertEqual(status, component.configuration_status)
44234426
self.assertEqual(license1.key, component.license_expression)
44244427
self.assertEqual(["Key1", "Another keyword"], component.keywords)
4428+
self.assertEqual(policy_approved, component.usage_policy)
44254429

44264430
def test_component_catalog_component_form_assigned_packages(self):
44274431
data = {

dje/forms.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -109,18 +109,24 @@ class ScopeAndProtectRelationships:
109109
def __init__(self, *args, **kwargs):
110110
super().__init__(*args, **kwargs)
111111

112-
protected_fields = get_protected_fields(self._meta.model, self.user)
113-
self.protected_fields = protected_fields
112+
self.protected_fields = get_protected_fields(self._meta.model, self.user)
114113

115-
for name, field in self.fields.items():
116-
has_queryset = hasattr(field, "queryset")
117-
118-
if name in protected_fields:
114+
# On submit, remove protected fields so they are not validated or saved.
115+
# On display, render them as disabled with an empty queryset.
116+
for name in self.protected_fields:
117+
if self.is_bound:
118+
self.fields.pop(name, None)
119+
else:
120+
field = self.fields[name]
119121
field.disabled = True
120-
if has_queryset:
122+
if hasattr(field, "queryset"):
121123
field.queryset = field.queryset.none()
122124

123-
elif has_queryset and is_dataspace_related(field.queryset.model):
125+
# Scope relational fields to the user's Dataspace
126+
for name, field in self.fields.items():
127+
has_queryset = hasattr(field, "queryset")
128+
129+
if has_queryset and is_dataspace_related(field.queryset.model):
124130
field.queryset = field.queryset.scope(self.user.dataspace)
125131

126132
related_model = field.queryset.model

0 commit comments

Comments
 (0)