Skip to content

Commit fc083e3

Browse files
authored
Merge pull request #78 from yaal-coop/models-without-extensions
extension payloads are not required on response contexts
2 parents 972bd8f + 338ea04 commit fc083e3

File tree

5 files changed

+32
-4
lines changed

5 files changed

+32
-4
lines changed

doc/changelog.rst

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ Changelog
77
Fixed
88
^^^^^
99
- :class:`~scim2_models.ListResponse` pydantic discriminator issue introduced with pydantic 2.9.0. #75
10+
- Extension payloads are not required on response contexts. #77
1011

1112
[0.2.1] - 2024-09-06
1213
--------------------

scim2_models/attributes.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,8 @@ def validate_attribute_urn(
8585
return f"{schema}:{attribute_base}"
8686

8787

88-
def contains_attribute_or_subattributes(attribute_urns: List[str], attribute_urn):
88+
def contains_attribute_or_subattributes(attribute_urns: List[str], attribute_urn: str):
8989
return attribute_urn in attribute_urns or any(
90-
item.startswith(f"{attribute_urn}.") for item in attribute_urns
90+
item.startswith(f"{attribute_urn}.") or item.startswith(f"{attribute_urn}:")
91+
for item in attribute_urns
9192
)

scim2_models/base.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -700,7 +700,10 @@ def get_attribute_urn(self, field_name: str) -> str:
700700
"""
701701
main_schema = self.model_fields["schemas"].default[0]
702702
alias = self.model_fields[field_name].serialization_alias or field_name
703-
return f"{main_schema}:{alias}"
703+
704+
# if alias contains a ':' this is an extension urn
705+
full_urn = alias if ":" in alias else f"{main_schema}:{alias}"
706+
return full_urn
704707

705708

706709
class ComplexAttribute(BaseModel):

scim2_models/rfc7643/resource.py

-1
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,6 @@ def __new__(cls, name, bases, attrs, **kwargs):
136136
schema = extension.model_fields["schemas"].default[0]
137137
attrs.setdefault("__annotations__", {})[extension.__name__] = Annotated[
138138
Optional[extension],
139-
Returned.always,
140139
WrapSerializer(extension_serializer),
141140
]
142141
attrs[extension.__name__] = Field(

tests/test_resource_extension.py

+24
Original file line numberDiff line numberDiff line change
@@ -257,3 +257,27 @@ def test_extensions_schemas():
257257
],
258258
"userName": "foobar",
259259
}
260+
261+
262+
def test_validate_items_without_extension():
263+
"""A model with an optional extension should be able to validate a payload
264+
without an extension payload.
265+
266+
https://github.com/yaal-coop/scim2-models/issues/77
267+
"""
268+
269+
payload = {
270+
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
271+
"id": "new-user",
272+
"userName": "[email protected]",
273+
"meta": {
274+
"resourceType": "User",
275+
"created": "2010-01-23T04:56:22Z",
276+
"lastModified": "2011-05-13T04:42:34Z",
277+
"version": 'W\\/"3694e05e9dff590"',
278+
"location": "http://localhost:46459/Users/new-user",
279+
},
280+
}
281+
User[EnterpriseUser].model_validate(
282+
payload, scim_ctx=Context.RESOURCE_CREATION_RESPONSE
283+
)

0 commit comments

Comments
 (0)