Skip to content

Commit c37e419

Browse files
committed
fix: an error happening when PUT-ing an extension field to an instance
when there was none before
1 parent 7b4e6db commit c37e419

File tree

2 files changed

+22
-3
lines changed

2 files changed

+22
-3
lines changed

scim2_server/utils.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,11 @@ def merge_resources(target: Resource, updates: BaseModel):
5959
if isinstance(getattr(updates, set_attribute), Extension):
6060
# This is a model extension, handle it as its own resource
6161
# and don't simply overwrite it
62-
merge_resources(
63-
getattr(target, set_attribute), getattr(updates, set_attribute)
64-
)
62+
target_extension = getattr(target, set_attribute)
63+
if target_extension is None:
64+
setattr(target, set_attribute, getattr(updates, set_attribute))
65+
else:
66+
merge_resources(target_extension, getattr(updates, set_attribute))
6567
continue
6668
new_value = getattr(updates, set_attribute)
6769
if mutability == Mutability.immutable and getattr(

tests/test_utils.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,3 +368,20 @@ def test_get_or_create_mutability(self):
368368
u = User()
369369
with pytest.raises(SCIMException, match="immutable"):
370370
get_or_create(u, "groups", True)
371+
372+
def test_merge_resources_none_extension(self):
373+
"""Test adding an extension parameter with merge_resources."""
374+
target = User[EnterpriseUser](user_name="test")
375+
assert target[EnterpriseUser] is None
376+
377+
payload = {
378+
"userName": "test",
379+
"urn:ietf:params:scim:schemas:extension:enterprise:2.0:User": {
380+
"employeeNumber": "12345"
381+
},
382+
}
383+
update = User[EnterpriseUser].model_validate(payload)
384+
385+
merge_resources(target, update)
386+
387+
assert target[EnterpriseUser].employee_number == "12345"

0 commit comments

Comments
 (0)