Skip to content

Commit 7088135

Browse files
Addressing PR comments
1 parent 2769287 commit 7088135

17 files changed

+103
-80
lines changed

classes/address/address.py

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,21 +26,13 @@ def set_address_line(self, line_number: int, address_line: str) -> None:
2626
Raises:
2727
ValueError: If line_number is not between 1 and 5.
2828
"""
29-
if line_number == 1:
30-
self.address_line1 = address_line
31-
elif line_number == 2:
32-
self.address_line2 = address_line
33-
elif line_number == 3:
34-
self.address_line3 = address_line
35-
elif line_number == 4:
36-
self.address_line4 = address_line
37-
elif line_number == 5:
38-
self.address_line5 = address_line
39-
else:
29+
if not 1 <= line_number <= 5:
4030
raise ValueError(
4131
f"Invalid line number {line_number}, must be between 1 and 5"
4232
)
4333

34+
setattr(self, f"address_line{line_number}", address_line)
35+
4436
def __str__(self) -> str:
4537
"""
4638
Returns the formatted address as a single string.

classes/datasets/intended_extent_type.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from enum import Enum
2-
from typing import Optional, Dict
2+
from typing import Optional
33

44

55
class IntendedExtentType(Enum):

classes/datasets/symptomatic_procedure_result_type.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from enum import Enum
2-
from typing import Optional, Dict
2+
from typing import Optional
33

44

55
class SymptomaticProcedureResultType(Enum):

classes/diagnostic/diagnostic_test_has_outcome_of_result.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
class DiagnosticTestHasOutcomeOfResult(Enum):
66
"""
77
Enum representing possible outcomes of a diagnostic test, mapped to IDs and descriptions.
8+
'Yes' and 'No' have negative IDs to clearly mark them as special, non-database values.
89
"""
910

1011
NO = (-1, "No")

classes/diagnostic/diagnostic_test_type.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ class DiagnosticTestType(Enum):
66
"""
77
Enum representing diagnostic test types, mapped to valid value IDs, descriptions, categories, and allowed status.
88
Provides utility methods for lookup by description (case-sensitive and insensitive) and by valid value ID.
9+
'ANY' is a special placeholder representing a wildcard or default fallback when a specific diagnostic test type is not required.
910
"""
1011

1112
BARIUM_ENEMA = (16003, "Barium Enema", "RADIOLOGY", "DISALLOWED")

classes/diagnostic/which_diagnostic_test.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ class WhichDiagnosticTest(Enum):
66
"""
77
Enum representing which diagnostic test to select, with description and test number.
88
Provides utility methods for lookup by description (case-sensitive and insensitive).
9+
Conventions:
10+
- test_number > 0: Refers to an explicit test index within the latest episode
11+
(e.g., test 1, test 2, ...).
12+
- test_number == 0: Indicates a selection rule or condition rather than a
13+
fixed test index (e.g., "any test", "latest test", "earliest not-void test").
914
"""
1015

1116
ANY_TEST_IN_ANY_EPISODE = ("any test in any episode", 0)

classes/notify/notify_message_type.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
class NotifyMessageType(Enum):
66
"""
77
Enum representing notify message types, with description and event status ID.
8+
'11197' is the event status id for all S1 notify message types
89
"""
910

1011
NONE = ("None", None)

classes/yes_no/yes_no_type.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
class YesNoType(Enum):
66
"""
7-
Enum representing Yes/No values for investigation datasets, with valid value IDs and descriptions.
7+
Enum representing Yes/No values, with valid value IDs and descriptions.
88
"""
99

1010
YES = (17058, "Yes")

utils/oracle/oracle_specific_functions/kit_management.py

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,15 @@ def get_kit_id_logged_from_db(smokescreen_properties: dict) -> pd.DataFrame:
6666
AND se.episode_status_id = :open_episode_status_id
6767
AND tk.tk_type_id = 2
6868
AND se.latest_event_status_id = :s43_event_status
69-
AND tk.logged_in_at = :logged_in_at
69+
AND tk.logged_in_at = :test_org_id
7070
AND tk.reading_flag = 'N'
7171
AND tk.test_results IS NULL
7272
fetch first :subjects_to_retrieve rows only
7373
"""
7474

7575
params = {
7676
"s43_event_status": SqlQueryValues.S43_EVENT_STATUS,
77-
"logged_in_at": smokescreen_properties["c3_fit_kit_results_test_org_id"],
77+
"test_org_id": smokescreen_properties["c3_fit_kit_results_test_org_id"],
7878
"open_episode_status_id": SqlQueryValues.OPEN_EPISODE_STATUS_ID,
7979
"subjects_to_retrieve": smokescreen_properties["c3_total_fit_kits_to_retrieve"],
8080
}
@@ -146,18 +146,22 @@ def update_kit_service_management_entity(
146146
subject_nhs_number (str): The NHS Number of the affected subject
147147
"""
148148
get_service_management_df = get_service_management_by_device_id(device_id)
149-
150-
# Extract the NHS number from the DataFrame
151-
subject_nhs_number = get_service_management_df["subject_nhs_number"].iloc[0]
152-
test_kit_name = get_service_management_df["test_kit_name"].iloc[0]
153-
test_kit_type = get_service_management_df["test_kit_type"].iloc[0]
154-
logged_by_hub = get_service_management_df["logged_by_hub"].iloc[0]
155-
date_time_logged = get_service_management_df["date_time_logged"].iloc[0]
156-
calculated_result = get_service_management_df["calculated_result"].iloc[0]
157-
post_response = get_service_management_df["post_response"].iloc[0]
158-
post_attempts = get_service_management_df["post_attempts"].iloc[0]
159-
put_response = get_service_management_df["put_response"].iloc[0]
160-
put_attempts = get_service_management_df["put_attempts"].iloc[0]
149+
try:
150+
# Extract the NHS number from the DataFrame
151+
subject_nhs_number = get_service_management_df["subject_nhs_number"].iloc[0]
152+
test_kit_name = get_service_management_df["test_kit_name"].iloc[0]
153+
test_kit_type = get_service_management_df["test_kit_type"].iloc[0]
154+
logged_by_hub = get_service_management_df["logged_by_hub"].iloc[0]
155+
date_time_logged = get_service_management_df["date_time_logged"].iloc[0]
156+
calculated_result = get_service_management_df["calculated_result"].iloc[0]
157+
post_response = get_service_management_df["post_response"].iloc[0]
158+
post_attempts = get_service_management_df["post_attempts"].iloc[0]
159+
put_response = get_service_management_df["put_response"].iloc[0]
160+
put_attempts = get_service_management_df["put_attempts"].iloc[0]
161+
except IndexError as e:
162+
raise IndexError(
163+
f"No service management records found for device_id={device_id}"
164+
) from e
161165
# format date
162166
date_time_authorised = (
163167
datetime.now().strftime("%d-%b-%y %H.%M.%S.")

utils/oracle/oracle_specific_functions/organisation.py

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,14 @@ def delete_organisation_relationships_created_for_test(org_codes: list[str]) ->
99
Args:
1010
org_codes (list[str]): A list of organisation codes to delete relationships for.
1111
"""
12-
placeholders = ", ".join([f":org{i}" for i in range(len(org_codes))])
12+
placeholders, params = _make_placeholders_and_params("org", org_codes)
1313
subquery = f"SELECT ORG_ID FROM ORG WHERE ORG_CODE IN ({placeholders})"
1414

1515
query = f"""
1616
DELETE FROM ORG_RELATIONSHIPS
1717
WHERE CHILD_ORG_ID IN ({subquery})
1818
OR PARENT_ORG_ID IN ({subquery})
1919
"""
20-
21-
params = {f"org{i}": code for i, code in enumerate(org_codes)}
2220
OracleDB().update_or_insert_data_to_table(query, params)
2321

2422

@@ -29,15 +27,13 @@ def delete_people_in_org_created_for_test(org_codes: list[str]) -> None:
2927
Args:
3028
org_codes (list[str]): A list of organisation codes to delete people in organisations for.
3129
"""
32-
placeholders = ", ".join([f":org{i}" for i in range(len(org_codes))])
30+
placeholders, params = _make_placeholders_and_params("org", org_codes)
3331
subquery = f"SELECT ORG_ID FROM ORG WHERE ORG_CODE IN ({placeholders})"
3432

3533
query = f"""
3634
DELETE FROM PERSON_IN_ORG
3735
WHERE ORG_ID IN ({subquery})
3836
"""
39-
40-
params = {f"org{i}": code for i, code in enumerate(org_codes)}
4137
OracleDB().update_or_insert_data_to_table(query, params)
4238

4339

@@ -48,13 +44,11 @@ def delete_orgs_created_for_test(org_codes: list[str]) -> None:
4844
Args:
4945
org_codes (list[str]): A list of organisation codes to delete.
5046
"""
51-
placeholders = ", ".join([f":org{i}" for i in range(len(org_codes))])
47+
placeholders, params = _make_placeholders_and_params("org", org_codes)
5248
query = f"""
5349
DELETE FROM ORG
5450
WHERE ORG_CODE IN ({placeholders})
5551
"""
56-
57-
params = {f"org{i}": code for i, code in enumerate(org_codes)}
5852
OracleDB().update_or_insert_data_to_table(query, params)
5953

6054

@@ -82,15 +76,25 @@ def delete_sites_created_for_test(site_codes: list[str]) -> None:
8276
logging.info("Start: delete_sites_created_for_test(%s)", site_codes)
8377

8478
# Dynamically create placeholders like :site0, :site1, ...
85-
placeholders = ", ".join([f":site{i}" for i in range(len(site_codes))])
79+
placeholders, params = _make_placeholders_and_params("site", site_codes)
8680
query = f"""
8781
DELETE FROM SITES
8882
WHERE SITE_CODE IN ({placeholders})
8983
"""
90-
91-
# Bind each site code to its placeholder
92-
params = {f"site{i}": code for i, code in enumerate(site_codes)}
93-
9484
OracleDB().update_or_insert_data_to_table(query, params)
9585

9686
logging.info("End: delete_sites_created_for_test(%s)", site_codes)
87+
88+
89+
def _make_placeholders_and_params(prefix: str, values: list[str]) -> tuple[str, dict]:
90+
"""
91+
Helper to generate SQL placeholders and parameter dict for IN clauses.
92+
Args:
93+
prefix (str): The prefix for the placeholder (e.g., 'org', 'site').
94+
values (list[str]): The values to bind.
95+
Returns:
96+
tuple: (placeholders string, params dict)
97+
"""
98+
placeholders = ", ".join([f":{prefix}{i}" for i in range(len(values))])
99+
params = {f"{prefix}{i}": value for i, value in enumerate(values)}
100+
return placeholders, params

0 commit comments

Comments
 (0)