Skip to content

Commit

Permalink
feature/PI-603-update_spine_mhs_questionnaire Update spine mhs questi…
Browse files Browse the repository at this point in the history
…onnaire with system generated fields
  • Loading branch information
megan-bower4 committed Nov 27, 2024
1 parent 8f10751 commit c7e5c33
Show file tree
Hide file tree
Showing 5 changed files with 137 additions and 151 deletions.
60 changes: 48 additions & 12 deletions src/api/createDeviceMessageHandlingSystem/src/v1/steps.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
from domain.core.error import ConfigurationError
from domain.core.product_team import ProductTeam
from domain.core.questionnaire import Questionnaire, QuestionnaireResponse
from domain.core.timestamp import now
from domain.repository.device_reference_data_repository import (
DeviceReferenceDataRepository,
)
Expand All @@ -39,6 +40,30 @@ def parse_mhs_device_payload(data, cache) -> CreateMhsDeviceIncomingParams:
return CreateMhsDeviceIncomingParams(**payload)


def read_spine_mhs_questionnaire(data, cache) -> Questionnaire:
return QuestionnaireRepository().read(QuestionnaireInstance.SPINE_MHS)


def check_expected_questionnaire_response_fields(data, cache):
spine_mhs_questionnaire: Questionnaire = data[read_spine_mhs_questionnaire]
expected_fields = set(spine_mhs_questionnaire.user_provided_fields)
payload: CreateMhsDeviceIncomingParams = data[parse_mhs_device_payload]
spine_mhs_questionnaire_response = payload.questionnaire_responses[
QuestionnaireInstance.SPINE_MHS
]
payload_fields = set(spine_mhs_questionnaire_response.__root__[0].keys())

# Find unexpected fields
unexpected_fields = payload_fields - expected_fields
if unexpected_fields:
raise ValueError(
f"Payload contains unexpected fields: {unexpected_fields}. "
f"Expected fields are: {expected_fields}."
)
# Return questionnaire responses
return spine_mhs_questionnaire_response.__root__[0]


def check_for_existing_mhs(data, cache):
product_team: ProductTeam = data[read_product_team]
product: CpmProduct = data[read_product]
Expand Down Expand Up @@ -79,21 +104,30 @@ def read_device_reference_data(data, cache) -> DeviceReferenceData:
return device_reference_data


def read_spine_mhs_questionnaire(data, cache) -> Questionnaire:
return QuestionnaireRepository().read(QuestionnaireInstance.SPINE_MHS)
def generate_spine_mhs_responses(data, cache) -> list:
spine_mhs_questionnaire_responses = data[
check_expected_questionnaire_response_fields
]

# System generated fields:
spine_mhs_questionnaire_responses["Address"] = (
f"{spine_mhs_questionnaire_responses['Binding']}{spine_mhs_questionnaire_responses['MHS FQDN']}"
)
spine_mhs_questionnaire_responses["MHS Party key"] = data[get_party_key]
spine_mhs_questionnaire_responses["Managing Organization"] = (
spine_mhs_questionnaire_responses["MHS Party key"].split("-")[0]
)
spine_mhs_questionnaire_responses["Date Approved"] = str(now())
spine_mhs_questionnaire_responses["Date Requested"] = str(now())
spine_mhs_questionnaire_responses["Date DNS Approved"] = str(None)

def validate_spine_mhs_questionnaire_response(data, cache) -> QuestionnaireResponse:
spine_mhs_questionnaire: Questionnaire = data[read_spine_mhs_questionnaire]
payload: CreateMhsDeviceIncomingParams = data[parse_mhs_device_payload]
return spine_mhs_questionnaire_responses

spine_mhs_questionnaire_response = payload.questionnaire_responses[
QuestionnaireInstance.SPINE_MHS
]

return spine_mhs_questionnaire.validate(
data=spine_mhs_questionnaire_response.__root__[0]
)
def validate_spine_mhs_questionnaire_response(data, cache) -> QuestionnaireResponse:
spine_mhs_questionnaire: Questionnaire = data[read_spine_mhs_questionnaire]
spine_mhs_response = data[generate_spine_mhs_responses]
return spine_mhs_questionnaire.validate(spine_mhs_response)


def create_mhs_device(data, cache) -> Device:
Expand Down Expand Up @@ -168,12 +202,14 @@ def set_http_status(data, cache) -> tuple[HTTPStatus, dict]:
parse_event_body,
parse_path_params,
parse_mhs_device_payload,
read_spine_mhs_questionnaire,
check_expected_questionnaire_response_fields,
read_product_team,
read_product,
get_party_key,
check_for_existing_mhs,
read_device_reference_data,
read_spine_mhs_questionnaire,
generate_spine_mhs_responses,
validate_spine_mhs_questionnaire_response,
create_mhs_device,
create_party_key_tag,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,23 +28,16 @@ Feature: Create MHS Device - success scenarios
| questionnaire_responses.spine_mhs_message_sets.0.MHS IN | READ_PRACTITIONER_ROLE_R4_V001 |
And I note the response field "$.id" as "message_set_drd_id"
When I make a "POST" request with "default" headers to "ProductTeam/${ note(product_team_id) }/Product/${ note(product_id) }/Device/MessageHandlingSystem" with body:
| path | value |
| questionnaire_responses.spine_mhs.0.Address | http://example.com |
| questionnaire_responses.spine_mhs.0.Unique Identifier | 123456 |
| questionnaire_responses.spine_mhs.0.Managing Organization | Example Org |
| questionnaire_responses.spine_mhs.0.MHS Party key | party-key-001 |
| questionnaire_responses.spine_mhs.0.MHS CPA ID | cpa-id-001 |
| questionnaire_responses.spine_mhs.0.Approver URP | approver-123 |
| questionnaire_responses.spine_mhs.0.Contract Property Template Key | contract-key-001 |
| questionnaire_responses.spine_mhs.0.Date Approved | 2024-01-01 |
| questionnaire_responses.spine_mhs.0.Date DNS Approved | 2024-01-02 |
| questionnaire_responses.spine_mhs.0.Date Requested | 2024-01-03 |
| questionnaire_responses.spine_mhs.0.DNS Approver | dns-approver-456 |
| questionnaire_responses.spine_mhs.0.Interaction Type | FHIR |
| questionnaire_responses.spine_mhs.0.MHS FQDN | mhs.example.com |
| questionnaire_responses.spine_mhs.0.MHS Is Authenticated | PERSISTENT |
| questionnaire_responses.spine_mhs.0.Product Key | product-key-001 |
| questionnaire_responses.spine_mhs.0.Requestor URP | requestor-789 |
| path | value |
| questionnaire_responses.spine_mhs.0.Binding | https:// |
| questionnaire_responses.spine_mhs.0.MHS FQDN | mhs.example.com |
| questionnaire_responses.spine_mhs.0.MHS Service Description | Example Description |
| questionnaire_responses.spine_mhs.0.Manufacturer ODS code | F5H1R |
| questionnaire_responses.spine_mhs.0.Product Name | Product Name |
| questionnaire_responses.spine_mhs.0.Product Version | ${ integer(1) } |
| questionnaire_responses.spine_mhs.0.Approver URP | UI provided |
| questionnaire_responses.spine_mhs.0.DNS Approver | UI provided |
| questionnaire_responses.spine_mhs.0.Requestor URP | UI provided |
Then I receive a status code "201" with body
| path | value |
| id | << ignore >> |
Expand All @@ -63,7 +56,7 @@ Feature: Create MHS Device - success scenarios
And the response headers contain:
| name | value |
| Content-Type | application/json |
| Content-Length | 1295 |
| Content-Length | 1271 |
And I note the response field "$.id" as "device_id"
When I make a "GET" request with "default" headers to "ProductTeam/${ note(product_team_id) }/Product/${ note(product_id) }/Device/${ note(device_id) }"
Then I receive a status code "200" with body
Expand All @@ -86,7 +79,7 @@ Feature: Create MHS Device - success scenarios
And the response headers contain:
| name | value |
| Content-Type | application/json |
| Content-Length | 1338 |
| Content-Length | 1314 |

Examples:
| product_team_id | product_id |
Expand Down
24 changes: 24 additions & 0 deletions src/layers/domain/core/questionnaire/v1.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,30 @@ def validate(self, data) -> "QuestionnaireResponse":
def id(self) -> str:
return f"{self.name}/{self.version}"

@property
def user_provided_fields(self) -> list[str]:
"""
Returns a generator object of fields NOT marked as 'system generated' in the JSON schema.
"""
properties = self.json_schema.get("properties", {})
return (
field_name
for field_name, field_attrs in properties.items()
if not field_attrs.get("system generated", False)
)

@property
def system_generated_fields(self) -> list[str]:
"""
Returns a list of fields marked as 'system generated' in the JSON schema.
"""
properties = self.json_schema.get("properties", {})
return [
field_name
for field_name, field_attrs in properties.items()
if field_attrs.get("system generated") is True
]


class QuestionnaireResponse(BaseModel):
id: UUID = Field(default_factory=uuid4)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,27 +1,17 @@
{
"binding": "Binding",
"nhs_mhs_fqdn": "MHS FQDN",
"nhs_mhs_service_description": "MHS Service Description",
"nhs_mhs_manufacturer_org": "Manufacturer ODS code",
"nhs_product_name": "Product Name",
"nhs_product_version": "Product Version",
"nhs_mhs_end_point": "Address",
"unique_identifier": "Unique Identifier",
"nhs_id_code": "Managing Organization",
"nhs_mhs_party_key": "MHS Party key",
"nhs_mhs_cpa_id": "MHS CPA ID",
"nhs_mhs_actor": "Reliability Configuration Actor",
"nhs_mhs_sync_reply_mode": "Reliability Configuration Reply Mode",
"nhs_mhs_duplicate_elimination": "Reliability Configuration Duplication Elimination",
"nhs_mhs_ack_requested": "Reliability Configuration Ack Requested",
"nhs_approver_urp": "Approver URP",
"nhs_contract_property_template_key": "Contract Property Template Key",
"nhs_date_approved": "Date Approved",
"nhs_date_dns_approved": "Date DNS Approved",
"nhs_date_requested": "Date Requested",
"nhs_id_code": "Managing Organization",
"nhs_approver_urp": "Approver URP",
"nhs_dns_approver": "DNS Approver",
"nhs_ep_interaction_type": "Interaction Type",
"nhs_mhs_fqdn": "MHS FQDN",
"nhs_mhs_ip_address": "MHS IP Address",
"nhs_mhs_is_authenticated": "MHS Is Authenticated",
"nhs_product_key": "Product Key",
"nhs_product_name": "Product Name",
"nhs_product_version": "Product Version",
"nhs_requestor_urp": "Requestor URP",
"nhs_mhs_service_description": "MHS Service Description",
"nhs_mhs_manufacturer_org": "Manufacturer ODS code"
"nhs_requestor_urp": "Requestor URP"
}
Loading

0 comments on commit c7e5c33

Please sign in to comment.