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
16 changes: 8 additions & 8 deletions api/consumer/swagger.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -812,7 +812,7 @@ components:
items:
oneOf:
- $ref: "#/components/schemas/ContentStabilityExtension"
- $ref: "#/components/schemas/RetrievalMechanismExtension"
- $ref: "#/components/schemas/NRLRetrievalMechanismExtension"
- $ref: "#/components/schemas/Extension"
description: Additional extensions which include Content Stability and Retrieval Mechanism.
minItems: 1
Expand Down Expand Up @@ -977,42 +977,42 @@ components:
- system
- code
- display
RetrievalMechanismExtension:
NRLRetrievalMechanismExtension:
allOf:
- $ref: "#/components/schemas/Extension"
- type: object
properties:
url:
type: string
enum:
- "https://fhir.nhs.uk/England/StructureDefinition/Extension-England-RetrievalMechanism"
- "https://fhir.nhs.uk/England/StructureDefinition/Extension-England-NRLRetrievalMechanism"
valueCodeableConcept:
$ref: "#/components/schemas/RetrievalMechanismExtensionValueCodeableConcept"
$ref: "#/components/schemas/NRLRetrievalMechanismExtensionValueCodeableConcept"
required:
- url
- valueCodeableConcept
RetrievalMechanismExtensionValueCodeableConcept:
NRLRetrievalMechanismExtensionValueCodeableConcept:
allOf:
- $ref: "#/components/schemas/CodeableConcept"
- type: object
properties:
coding:
type: array
items:
$ref: "#/components/schemas/RetrievalMechanismExtensionCoding"
$ref: "#/components/schemas/NRLRetrievalMechanismExtensionCoding"
minItems: 1
maxItems: 1
required:
- coding
RetrievalMechanismExtensionCoding:
NRLRetrievalMechanismExtensionCoding:
allOf:
- $ref: "#/components/schemas/Coding"
- type: object
properties:
system:
type: string
enum:
- "https://fhir.nhs.uk/England/CodeSystem/England-RetrievalMechanism"
- "https://fhir.nhs.uk/England/CodeSystem/England-NRLRetrievalMechanism"
code:
type: string
enum: ["SSP", "Direct", "LDR", "InContext"]
Expand Down
16 changes: 8 additions & 8 deletions api/producer/swagger.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1417,7 +1417,7 @@ components:
items:
oneOf:
- $ref: "#/components/schemas/ContentStabilityExtension"
- $ref: "#/components/schemas/RetrievalMechanismExtension"
- $ref: "#/components/schemas/NRLRetrievalMechanismExtension"
- $ref: "#/components/schemas/Extension"
description: Additional extensions which include Content Stability and Retrieval Mechanism.
minItems: 1
Expand Down Expand Up @@ -1633,42 +1633,42 @@ components:
- system
- code
- display
RetrievalMechanismExtension:
NRLRetrievalMechanismExtension:
allOf:
- $ref: "#/components/schemas/Extension"
- type: object
properties:
url:
type: string
enum:
- "https://fhir.nhs.uk/England/StructureDefinition/Extension-England-RetrievalMechanism"
- "https://fhir.nhs.uk/England/StructureDefinition/Extension-England-NRLRetrievalMechanism"
valueCodeableConcept:
$ref: "#/components/schemas/RetrievalMechanismExtensionValueCodeableConcept"
$ref: "#/components/schemas/NRLRetrievalMechanismExtensionValueCodeableConcept"
required:
- url
- valueCodeableConcept
RetrievalMechanismExtensionValueCodeableConcept:
NRLRetrievalMechanismExtensionValueCodeableConcept:
allOf:
- $ref: "#/components/schemas/CodeableConcept"
- type: object
properties:
coding:
type: array
items:
$ref: "#/components/schemas/RetrievalMechanismExtensionCoding"
$ref: "#/components/schemas/NRLRetrievalMechanismExtensionCoding"
minItems: 1
maxItems: 1
required:
- coding
RetrievalMechanismExtensionCoding:
NRLRetrievalMechanismExtensionCoding:
allOf:
- $ref: "#/components/schemas/Coding"
- type: object
properties:
system:
type: string
enum:
- "https://fhir.nhs.uk/England/CodeSystem/England-RetrievalMechanism"
- "https://fhir.nhs.uk/England/CodeSystem/England-NRLRetrievalMechanism"
code:
type: string
enum: ["SSP", "Direct", "LDR", "InContext"]
Expand Down
22 changes: 13 additions & 9 deletions layer/nrlf/consumer/fhir/r4/model.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# generated by datamodel-codegen:
# filename: swagger.yaml
# timestamp: 2025-09-05T08:22:10+00:00
# timestamp: 2025-09-12T10:25:30+00:00

from __future__ import annotations

Expand Down Expand Up @@ -240,8 +240,10 @@ class ContentStabilityExtensionCoding(Coding):
display: Literal["Static", "Dynamic"]


class RetrievalMechanismExtensionCoding(Coding):
system: Literal["https://fhir.nhs.uk/England/CodeSystem/England-RetrievalMechanism"]
class NRLRetrievalMechanismExtensionCoding(Coding):
system: Literal[
"https://fhir.nhs.uk/England/CodeSystem/England-NRLRetrievalMechanism"
]
code: Literal["SSP", "Direct", "LDR", "InContext"]
display: Literal[
"Spine Secure Proxy",
Expand Down Expand Up @@ -512,9 +514,9 @@ class ContentStabilityExtensionValueCodeableConcept(CodeableConcept):
]


class RetrievalMechanismExtensionValueCodeableConcept(CodeableConcept):
class NRLRetrievalMechanismExtensionValueCodeableConcept(CodeableConcept):
coding: Annotated[
List[RetrievalMechanismExtensionCoding], Field(max_length=1, min_length=1)
List[NRLRetrievalMechanismExtensionCoding], Field(max_length=1, min_length=1)
]


Expand Down Expand Up @@ -591,11 +593,11 @@ class ContentStabilityExtension(Extension):
valueCodeableConcept: ContentStabilityExtensionValueCodeableConcept


class RetrievalMechanismExtension(Extension):
class NRLRetrievalMechanismExtension(Extension):
url: Literal[
"https://fhir.nhs.uk/England/StructureDefinition/Extension-England-RetrievalMechanism"
"https://fhir.nhs.uk/England/StructureDefinition/Extension-England-NRLRetrievalMechanism"
]
valueCodeableConcept: RetrievalMechanismExtensionValueCodeableConcept
valueCodeableConcept: NRLRetrievalMechanismExtensionValueCodeableConcept


class OperationOutcome(Parent):
Expand Down Expand Up @@ -657,7 +659,9 @@ class DocumentReferenceContent(Parent):
),
]
extension: Annotated[
List[Union[ContentStabilityExtension, RetrievalMechanismExtension, Extension]],
List[
Union[ContentStabilityExtension, NRLRetrievalMechanismExtension, Extension]
],
Field(min_length=1),
]

Expand Down
4 changes: 2 additions & 2 deletions layer/nrlf/core/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -677,12 +677,12 @@ def coding_value(self):
CONTENT_STABILITY_EXTENSION_URL = (
"https://fhir.nhs.uk/England/StructureDefinition/Extension-England-ContentStability"
)
CONTENT_RETRIEVAL_EXTENSION_URL = "https://fhir.nhs.uk/England/StructureDefinition/Extension-England-RetrievalMechanism"
CONTENT_RETRIEVAL_EXTENSION_URL = "https://fhir.nhs.uk/England/StructureDefinition/Extension-England-NRLRetrievalMechanism"
CONTENT_STABILITY_SYSTEM_URL = (
"https://fhir.nhs.uk/England/CodeSystem/England-NRLContentStability"
)
CONTENT_RETRIEVAL_SYSTEM_URL = (
"https://fhir.nhs.uk/England/CodeSystem/England-RetrievalMechanism"
"https://fhir.nhs.uk/England/CodeSystem/England-NRLRetrievalMechanism"
)
CONTENT_RETRIEVAL_CODE_MAP = {
"Direct": "Direct",
Expand Down
52 changes: 26 additions & 26 deletions layer/nrlf/core/tests/test_validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,11 @@
ContentStabilityExtensionCoding,
ContentStabilityExtensionValueCodeableConcept,
DocumentReference,
NRLRetrievalMechanismExtension,
NRLRetrievalMechanismExtensionCoding,
NRLRetrievalMechanismExtensionValueCodeableConcept,
OperationOutcomeIssue,
RequestQueryType,
RetrievalMechanismExtension,
RetrievalMechanismExtensionCoding,
RetrievalMechanismExtensionValueCodeableConcept,
)
from nrlf.tests.data import load_document_reference_json

Expand Down Expand Up @@ -1379,11 +1379,11 @@ def test_validate_content_extension_missing_content_stability():
# Remove all ContentStability extensions
document_ref_data["content"][0]["extension"] = [
{
"url": "https://fhir.nhs.uk/England/StructureDefinition/Extension-England-RetrievalMechanism",
"url": "https://fhir.nhs.uk/England/StructureDefinition/Extension-England-NRLRetrievalMechanism",
"valueCodeableConcept": {
"coding": [
{
"system": "https://fhir.nhs.uk/England/CodeSystem/England-RetrievalMechanism",
"system": "https://fhir.nhs.uk/England/CodeSystem/England-NRLRetrievalMechanism",
"code": "Direct",
"display": "Direct",
}
Expand Down Expand Up @@ -1421,11 +1421,11 @@ def test_validate_content_extension_mismatch_between_retrieval_mechanism_display
# Add a retrieval mechanism extension with a valid code but wrong display
document_ref_data["content"][0]["extension"].append(
{
"url": "https://fhir.nhs.uk/England/StructureDefinition/Extension-England-RetrievalMechanism",
"url": "https://fhir.nhs.uk/England/StructureDefinition/Extension-England-NRLRetrievalMechanism",
"valueCodeableConcept": {
"coding": [
{
"system": "https://fhir.nhs.uk/England/CodeSystem/England-RetrievalMechanism",
"system": "https://fhir.nhs.uk/England/CodeSystem/England-NRLRetrievalMechanism",
"code": "Direct",
"display": "Spine Secure Proxy",
}
Expand Down Expand Up @@ -1604,11 +1604,11 @@ def test_validate_content_multiple_content_retrieval_extensions():

# Add 2 content retrieval extensions
content_retrieval_extension = {
"url": "https://fhir.nhs.uk/England/StructureDefinition/Extension-England-RetrievalMechanism",
"url": "https://fhir.nhs.uk/England/StructureDefinition/Extension-England-NRLRetrievalMechanism",
"valueCodeableConcept": {
"coding": [
{
"system": "https://fhir.nhs.uk/England/CodeSystem/England-RetrievalMechanism",
"system": "https://fhir.nhs.uk/England/CodeSystem/England-NRLRetrievalMechanism",
"code": "Direct",
"display": "Direct",
}
Expand All @@ -1634,7 +1634,7 @@ def test_validate_content_multiple_content_retrieval_extensions():
}
]
},
"diagnostics": "Invalid content retrieval extension: Extension must have one content retrieval extension, see: ('https://fhir.nhs.uk/England/ValueSet/England-RetrievalMechanism')",
"diagnostics": "Invalid content retrieval extension: Extension must have one content retrieval extension, see: ('https://fhir.nhs.uk/England/ValueSet/England-NRLRetrievalMechanism')",
"expression": ["content[0].extension"],
}

Expand Down Expand Up @@ -1672,11 +1672,11 @@ def test_validate_two_content_with_different_retrieval_mechanisms():
"format": unstructured_format,
"extension": [
{
"url": "https://fhir.nhs.uk/England/StructureDefinition/Extension-England-RetrievalMechanism",
"url": "https://fhir.nhs.uk/England/StructureDefinition/Extension-England-NRLRetrievalMechanism",
"valueCodeableConcept": {
"coding": [
{
"system": "https://fhir.nhs.uk/England/CodeSystem/England-RetrievalMechanism",
"system": "https://fhir.nhs.uk/England/CodeSystem/England-NRLRetrievalMechanism",
"code": "SSP",
"display": "Spine Secure Proxy",
}
Expand Down Expand Up @@ -1713,11 +1713,11 @@ def test_validate_two_content_with_different_retrieval_mechanisms():
"format": unstructured_format,
"extension": [
{
"url": "https://fhir.nhs.uk/England/StructureDefinition/Extension-England-RetrievalMechanism",
"url": "https://fhir.nhs.uk/England/StructureDefinition/Extension-England-NRLRetrievalMechanism",
"valueCodeableConcept": {
"coding": [
{
"system": "https://fhir.nhs.uk/England/CodeSystem/England-RetrievalMechanism",
"system": "https://fhir.nhs.uk/England/CodeSystem/England-NRLRetrievalMechanism",
"code": "Direct",
"display": "Direct",
}
Expand All @@ -1737,17 +1737,17 @@ def test_validate_two_content_with_different_retrieval_mechanisms():


def test_validate_content_retrieval_lowercase_urls():
"""Test that the extension is recognised when 'RetrievalMechanism' is in lowercase and throws an error for mismatching the URL case."""
"""Test that the extension is recognised when 'NRLRetrievalMechanism' is in lowercase and throws an error for mismatching the URL case."""
validator = DocumentReferenceValidator()
document_ref_data = load_document_reference_json("Y05868-736253002-Valid")

document_ref_data["content"][0]["extension"] = [
{
"url": "https://fhir.nhs.uk/england/structuredefinition/extension-england-retrievalmechanism",
"url": "https://fhir.nhs.uk/england/structuredefinition/extension-england-nrlretrievalmechanism",
"valueCodeableConcept": {
"coding": [
{
"system": "https://fhir.nhs.uk/England/CodeSystem/England-RetrievalMechanism",
"system": "https://fhir.nhs.uk/England/CodeSystem/England-NRLRetrievalMechanism",
"code": "Direct",
"display": "Direct",
}
Expand Down Expand Up @@ -1784,7 +1784,7 @@ def test_validate_content_retrieval_lowercase_urls():
}
]
},
"diagnostics": "Invalid content retrieval extension (content[0].extension[0].url: Input should be 'https://fhir.nhs.uk/England/StructureDefinition/Extension-England-RetrievalMechanism', see: https://fhir.nhs.uk/England/ValueSet/England-RetrievalMechanism)",
"diagnostics": "Invalid content retrieval extension (content[0].extension[0].url: Input should be 'https://fhir.nhs.uk/England/StructureDefinition/Extension-England-NRLRetrievalMechanism', see: https://fhir.nhs.uk/England/ValueSet/England-NRLRetrievalMechanism)",
"expression": ["content[0].extension[0].url"],
}

Expand All @@ -1805,12 +1805,12 @@ def make_content_stability_extension(code, display):


def make_retrieval_mechanism_extension(code, display):
return RetrievalMechanismExtension(
url="https://fhir.nhs.uk/England/StructureDefinition/Extension-England-RetrievalMechanism",
valueCodeableConcept=RetrievalMechanismExtensionValueCodeableConcept(
return NRLRetrievalMechanismExtension(
url="https://fhir.nhs.uk/England/StructureDefinition/Extension-England-NRLRetrievalMechanism",
valueCodeableConcept=NRLRetrievalMechanismExtensionValueCodeableConcept(
coding=[
RetrievalMechanismExtensionCoding(
system="https://fhir.nhs.uk/England/CodeSystem/England-RetrievalMechanism",
NRLRetrievalMechanismExtensionCoding(
system="https://fhir.nhs.uk/England/CodeSystem/England-NRLRetrievalMechanism",
code=code,
display=display,
)
Expand All @@ -1837,7 +1837,7 @@ def test_has_valid_extensions_multiple_retrieval_mechanism():
]
assert validator._has_valid_extensions(extensions, 0) is False
assert any(
"Invalid content retrieval extension: Extension must have one content retrieval extension, see: ('https://fhir.nhs.uk/England/ValueSet/England-RetrievalMechanism')"
"Invalid content retrieval extension: Extension must have one content retrieval extension, see: ('https://fhir.nhs.uk/England/ValueSet/England-NRLRetrievalMechanism')"
in issue.diagnostics
for issue in validator.result.issues
)
Expand Down Expand Up @@ -1927,11 +1927,11 @@ def test_validate_structured_format_with_text_html_for_incontext_launch():
}
document_ref_data["content"][0]["extension"] = [
{
"url": "https://fhir.nhs.uk/England/StructureDefinition/Extension-England-RetrievalMechanism",
"url": "https://fhir.nhs.uk/England/StructureDefinition/Extension-England-NRLRetrievalMechanism",
"valueCodeableConcept": {
"coding": [
{
"system": "https://fhir.nhs.uk/England/CodeSystem/England-RetrievalMechanism",
"system": "https://fhir.nhs.uk/England/CodeSystem/England-NRLRetrievalMechanism",
"code": "InContext",
"display": "Direct using In-Context",
}
Expand Down
8 changes: 4 additions & 4 deletions layer/nrlf/core/validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
from nrlf.producer.fhir.r4 import model as producer_model
from nrlf.producer.fhir.r4.model import (
ContentStabilityExtension,
RetrievalMechanismExtension,
NRLRetrievalMechanismExtension,
)


Expand Down Expand Up @@ -547,7 +547,7 @@ def _has_valid_extensions(self, extensions, i):
self.result.add_error(
issue_code="business-rule",
error_code="UNPROCESSABLE_ENTITY",
diagnostics="Invalid content retrieval extension: Extension must have one content retrieval extension, see: ('https://fhir.nhs.uk/England/ValueSet/England-RetrievalMechanism')",
diagnostics="Invalid content retrieval extension: Extension must have one content retrieval extension, see: ('https://fhir.nhs.uk/England/ValueSet/England-NRLRetrievalMechanism')",
field=f"content[{i}].extension",
)
return False
Expand Down Expand Up @@ -588,13 +588,13 @@ def _validate_content_stability_extension(self, extension, i, j):

def _validate_retrieval_mechanism_extension(self, extension, i, j):
try:
RetrievalMechanismExtension.model_validate(extension.model_dump())
NRLRetrievalMechanismExtension.model_validate(extension.model_dump())
except ValidationError as exc:
raise ParseError.from_validation_error(
exc,
details=SpineErrorConcept.from_code("BAD_REQUEST"),
msg="Invalid content retrieval extension",
value_set="https://fhir.nhs.uk/England/ValueSet/England-RetrievalMechanism",
value_set="https://fhir.nhs.uk/England/ValueSet/England-NRLRetrievalMechanism",
root_location=("content", i, "extension", j),
) from None
coding = extension.valueCodeableConcept.coding[0]
Expand Down
Loading
Loading