Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions doc/changelog.rst
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
Changelog
=========

[0.6.5] - 2026-03-10
--------------------

Fixed
^^^^^
- Fix extension serialization crash when an extension is declared but not populated on a resource serialized outside of SCIM context (e.g. FastAPI ``response_model``). :pr:`131`

[0.6.4] - 2026-02-05
--------------------

Expand Down
4 changes: 4 additions & 0 deletions scim2_models/resources/resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,11 @@ def _extension_serializer(
For instance, attributes 'meta', 'id' or 'schemas' should not be
dumped when the model is used as an extension for another model.
"""
if value is None:
return None

partial_result = handler(value)

result = {
attr_name: value
for attr_name, value in partial_result.items()
Expand Down
9 changes: 9 additions & 0 deletions tests/test_resource_extension.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import datetime

import pytest
from pydantic import TypeAdapter

from scim2_models import URN
from scim2_models import Context
Expand Down Expand Up @@ -370,6 +371,14 @@ def test_class_getitem():
User[int]


def test_dump_resource_with_unset_extension():
"""Serialize a resource whose extension is declared but not populated."""
user = User[EnterpriseUser](user_name="bjensen")
ta = TypeAdapter(User[EnterpriseUser])
payload = ta.dump_python(user)
assert "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User" not in payload


def test_model_attribute_to_scim_attribute_error():
"""Test error case where get_field_root_type returns None."""
from pydantic import Field
Expand Down
Loading