Skip to content
Snippets Groups Projects
Verified Commit 46c4dd04 authored by Jonathan Weth's avatar Jonathan Weth :keyboard:
Browse files

Fix permission checking for person form so users can (only) edit the configured fields

parent eefe8e04
No related branches found
No related tags found
1 merge request!752Resolve "Users are able to change the linked user, but not the supposed fields"
......@@ -146,17 +146,20 @@ class EditPersonForm(ExtensibleForm):
super().__init__(*args, **kwargs)
# Disable non-editable fields
person_fields = set([field.name for field in Person.syncable_fields()]).intersection(
set(self.fields)
)
allowed_person_fields = get_site_preferences()["account__editable_fields_person"]
if self.instance:
checker = ObjectPermissionChecker(request.user)
checker.prefetch_perms([self.instance])
if (
request
and self.instance
and not request.user.has_perm("core.change_person", self.instance)
):
# First, disable all fields
for field in self.fields:
self.fields[field].disabled = True
for field in person_fields:
if not checker.has_perm(f"core.change_person_field_{field}", self.instance):
self.fields[field].disabled = True
# Then, activate allowed fields
for field in allowed_person_fields:
self.fields[field].disabled = False
def clean(self) -> None:
# Use code implemented in dedicated form to verify user selection
......
......@@ -2,7 +2,6 @@ import rules
from .models import AdditionalField, Announcement, Group, GroupType, Person
from .util.predicates import (
contains_site_preference_value,
has_any_object,
has_global_perm,
has_object_perm,
......@@ -350,15 +349,3 @@ rules.add_perm("core.upload_files_ckeditor_rule", upload_files_ckeditor_predicat
test_pdf_generation_predicate = has_person & has_global_perm("core.test_pdf")
rules.add_perm("core.test_pdf_rule", test_pdf_generation_predicate)
# Generate rules for syncable fields
for field in Person._meta.fields:
perm = (
has_global_perm("core.edit_person")
| has_object_perm("core.edit_person")
| (
is_current_person
& contains_site_preference_value("account", "editable_fields_person", field.name)
)
)
rules.add_perm(f"core.change_person_field_{field.name}_rule", perm)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment