Skip to content

Commit 445d5c5

Browse files
committed
adding lynch classes and utils
1 parent df39cc3 commit 445d5c5

File tree

7 files changed

+493
-91
lines changed

7 files changed

+493
-91
lines changed

classes/data/data_creation.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from classes.organisation.organisation_complex import Organisation
66
from classes.subject.gender_type import GenderType
77
from classes.address.address import Address
8-
from classes.person.person import Person
8+
from classes.person.person_data import Person
99
from classes.screening.region_type import RegionType
1010
from classes.subject.pi_subject import PISubject
1111
from utils.nhs_number_tools import NHSNumberTools
@@ -113,17 +113,17 @@ def generate_random_subject(
113113
pi_subject = PISubject()
114114
pi_subject.nhs_number = NHSNumberTools.generate_random_nhs_number()
115115
person = self.generate_random_person(random_words_list, GenderType.NOT_KNOWN)
116-
pi_subject.family_name = person.get_surname()
117-
pi_subject.first_given_names = person.get_forename()
118-
pi_subject.other_given_names = person.get_other_forenames()
119-
pi_subject.previous_family_name = person.get_previous_surname()
120-
pi_subject.name_prefix = person.get_title()
116+
pi_subject.family_name = person.surname
117+
pi_subject.first_given_names = person.forename
118+
pi_subject.other_given_names = person.other_forenames
119+
pi_subject.previous_family_name = person.previous_surname
120+
pi_subject.name_prefix = person.title
121121
pi_subject.birth_date = datetime.date.today() - datetime.timedelta(
122122
days=60 * 365
123123
)
124124

125125
pi_subject.death_date = None
126-
gender = person.get_gender()
126+
gender = person.gender
127127
if gender is not None:
128128
pi_subject.gender_code = gender.redefined_value
129129
else:
@@ -225,15 +225,15 @@ def generate_random_person(
225225
)
226226

227227
person = Person()
228-
person.set_title(self.generate_random_title(gender))
229-
person.set_forename(random_words_list.get("forename", ""))
230-
person.set_surname(random_words_list.get("surname", ""))
231-
person.set_gender(gender)
228+
person.title = self.generate_random_title(gender)
229+
person.forename = random_words_list.get("forename", "")
230+
person.surname = random_words_list.get("surname", "")
231+
person.gender = gender
232232

233233
if self.rand.randint(0, 100) < 5:
234-
person.set_other_forenames(random_words_list.get("forename2", ""))
234+
person.other_forenames = random_words_list.get("forename2", "")
235235
if self.rand.randint(0, 100) < 5:
236-
person.set_previous_surname(random_words_list.get("surname2", ""))
236+
person.previous_surname = random_words_list.get("surname2", "")
237237

238238
logging.debug("generateRandomPerson: end")
239239
return person
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
from enum import Enum
2+
from typing import Optional
3+
4+
5+
class GeneticConditionType(Enum):
6+
"""
7+
Enum representing genetic condition types with valid value ID, description, and lower age.
8+
Provides lookup by description and valid value ID.
9+
"""
10+
11+
EPCAM = (307070, "EPCAM", 25)
12+
MLH1 = (306443, "MLH1", 25)
13+
MSH2 = (306444, "MSH2", 25)
14+
MSH6 = (306445, "MSH6", 35)
15+
PMS2 = (306446, "PMS2", 35)
16+
17+
def __init__(self, valid_value_id: int, description: str, lower_age: int):
18+
self._valid_value_id = valid_value_id
19+
self._description = description
20+
self._lower_age = lower_age
21+
22+
@property
23+
def valid_value_id(self) -> int:
24+
"""Return the valid value ID."""
25+
return self._valid_value_id
26+
27+
@property
28+
def description(self) -> str:
29+
"""Return the description."""
30+
return self._description
31+
32+
@property
33+
def lower_age(self) -> int:
34+
"""Return the lower age."""
35+
return self._lower_age
36+
37+
@classmethod
38+
def by_description(cls, description: str) -> Optional["GeneticConditionType"]:
39+
"""Return the GeneticConditionType instance for the given description."""
40+
for member in cls:
41+
if member.description == description:
42+
return member
43+
return None
44+
45+
@classmethod
46+
def by_valid_value_id(cls, valid_value_id: int) -> Optional["GeneticConditionType"]:
47+
"""Return the GeneticConditionType instance for the given valid value ID."""
48+
for member in cls:
49+
if member.valid_value_id == valid_value_id:
50+
return member
51+
return None

classes/person/person_data.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
from dataclasses import dataclass
2+
from typing import Optional
3+
from classes.subject.gender_type import GenderType
4+
5+
6+
@dataclass
7+
class Person:
8+
"""
9+
Represents a person with name, title, previous surname, other forenames, and gender.
10+
Provides methods to get full name and string representation.
11+
"""
12+
13+
surname: Optional[str] = None
14+
forename: Optional[str] = None
15+
title: Optional[str] = None
16+
other_forenames: Optional[str] = None
17+
previous_surname: Optional[str] = None
18+
gender: Optional[GenderType] = None
19+
20+
def get_full_name(self) -> str:
21+
"""
22+
Returns the full name of the person.
23+
"""
24+
return f"{self.title or ''} {self.forename or ''} {self.surname or ''}".strip()
25+
26+
def __str__(self) -> str:
27+
"""
28+
Returns a string representation of the person.
29+
"""
30+
return f"{self.title or ''} {self.forename or ''} {self.surname or ''} (gender={self.gender})".strip()

classes/repositories/general_repository.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,15 @@ def run_database_transition(
5555
raise oracledb.DatabaseError(f"Error executing database transition: {e}")
5656
finally:
5757
self.oracle_db.disconnect_from_db(conn)
58+
59+
def process_new_lynch_patients(self):
60+
logging.debug("[START] process_new_lynch_patients")
61+
try:
62+
self.oracle_db.execute_stored_procedure("pkg_lynch.p_process_patients")
63+
except Exception as e:
64+
logging.error("Error executing pkg_lynch.p_process_patients", exc_info=True)
65+
raise oracledb.DatabaseError(
66+
f"Error executing pkg_lynch.p_process_patients: {e}"
67+
)
68+
69+
logging.debug("[END] process_new_lynch_patients")
Lines changed: 74 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import pytest
22
import logging
33
from playwright.sync_api import Page
4+
from streamlit import user
45
from classes.user.user import User
56
from classes.subject.subject import Subject
67
from pages.logout.log_out_page import LogoutPage
@@ -11,6 +12,7 @@
1112
from utils.subject_assertion import subject_assertion
1213
from utils import screening_subject_page_searcher
1314
from utils.oracle.subject_selection_query_builder import SubjectSelectionQueryBuilder
15+
from utils.lynch_utils import insert_validated_lynch_patient_from_new_subject_with_age
1416

1517

1618
@pytest.mark.wip
@@ -49,17 +51,14 @@ def debug_log_subject_db_row(nhs_no):
4951

5052
# Given I log in to BCSS "England" as user role "Hub Manager"
5153
login_role = "Hub Manager at BCS01"
52-
UserTools.user_login(page, login_role)
53-
54-
# Retrieve user details and user object
55-
user_details = UserTools.retrieve_user(login_role)
56-
54+
user_role = UserTools.user_login(page, login_role, True)
55+
if user_role is None:
56+
raise ValueError(f"User role '{login_role}' could not be determined after login.")
57+
5758
# When I receive Lynch diagnosis "EPCAM" for a new subject in my hub aged "75" with diagnosis date "3 years ago" and last colonoscopy date "2 years ago"
58-
# TODO: What is involved in receiving an "EPCAM" diagnosis? Is it covered by this code?
5959
# Get or create a subject suitable for Lynch self-referral
60-
nhs_no = SubjectSelector.get_or_create_subject_for_lynch_self_referral(
61-
screening_centre=user_details["hub_code"],
62-
base_age=75,
60+
nhs_no = insert_validated_lynch_patient_from_new_subject_with_age(
61+
"75", "EPCAM", "3 years ago", "2 years ago", user_role
6362
)
6463

6564
OracleDB().exec_bcss_timed_events(nhs_number=nhs_no)
@@ -82,14 +81,14 @@ def debug_log_subject_db_row(nhs_no):
8281

8382
# Then my subject has been updated as follows:
8483
self_referral_criteria = {
85-
# "calculated fobt due date": "Null",
86-
# "calculated lynch due date": "Today",
84+
"calculated fobt due date": "Null",
85+
"calculated lynch due date": "Today",
8786
# "calculated surveillance due date": "Null",
8887
# "lynch due date": "Today",
8988
# "lynch due date date of change": "Null",
9089
# "lynch due date reason": "Self-referral",
9190
# "previous screening status": "Lynch Surveillance",
92-
"screening due date": "Null",
91+
# "screening due date": "Null",
9392
# "screening due date date of change": "Null",
9493
# "screening due date reason": "null",
9594
# "screening status": "Lynch Self-referral",
@@ -109,66 +108,66 @@ def debug_log_subject_db_row(nhs_no):
109108
"[ASSERTION PASSED] Subject details after self-referral are as expected"
110109
)
111110

112-
# When I view the subject
113-
screening_subject_page_searcher.navigate_to_subject_summary_page(page, nhs_no)
114-
115-
# And I set the subject to Seeking Further Data
116-
subject_page.set_seeking_further_data()
117-
118-
# Then my subject has been updated as follows:
119-
seeking_further_data_criteria = {
120-
"calculated fobt due date": "Null",
121-
"calculated lynch due date": "today",
122-
"calculated surveillance due date": "Null",
123-
"lynch due date": "today",
124-
"lynch due date date of change": "Null",
125-
"lynch due date reason": "Self-referral",
126-
"previous screening status": "Lynch Self-referral",
127-
"screening due date": "Null",
128-
"screening due date date of change": "Null",
129-
"screening due date reason": "Null",
130-
"subject has lynch diagnosis": "Yes",
131-
"subject lower fobt age": "Default",
132-
"subject lower lynch age": "25",
133-
"screening status": "Seeking Further Data",
134-
"screening status date of change": "Today",
135-
"screening status reason": "Uncertified Death",
136-
"surveillance due date": "Null",
137-
"surveillance due date date of change": "Null",
138-
"surveillance due date reason": "Null",
139-
}
140-
debug_log_subject_db_row(nhs_no) # For debug purposes - can be removed later
141-
142-
subject_assertion(nhs_no, seeking_further_data_criteria)
143-
144-
# When I set the subject from Seeking Further Data back to "Lynch Self-referral"
145-
subject_page.set_self_referral_screening_status()
146-
147-
# Then my subject has been updated as follows:
148-
reverted_criteria = {
149-
"calculated fobt due date": "Null",
150-
"calculated lynch due date": "today",
151-
"calculated surveillance due date": "Null",
152-
"lynch due date": "today",
153-
"lynch due date date of change": "Null",
154-
"lynch due date reason": "Self-referral",
155-
"previous screening status": "Lynch Self-referral",
156-
"screening due date": "Null",
157-
"screening due date date of change": "Null",
158-
"screening due date reason": "Null",
159-
"subject has lynch diagnosis": "Yes",
160-
"subject lower fobt age": "Default",
161-
"subject lower lynch age": "25",
162-
"screening status": "Lynch Self-referral",
163-
"screening status date of change": "Today",
164-
"screening status reason": "Reset seeking further data to Lynch Self-referral",
165-
"surveillance due date": "Null",
166-
"surveillance due date date of change": "Null",
167-
"surveillance due date reason": "Null",
168-
}
169-
debug_log_subject_db_row(nhs_no) # For debug purposes - can be removed later
170-
171-
subject_assertion(nhs_no, reverted_criteria)
172-
173-
LogoutPage(page).log_out()
174-
logging.info("[TEST END] test_lynch_self_referral_seeking_further_data_flow")
111+
# # When I view the subject
112+
# screening_subject_page_searcher.navigate_to_subject_summary_page(page, nhs_no)
113+
114+
# # And I set the subject to Seeking Further Data
115+
# subject_page.set_seeking_further_data()
116+
117+
# # Then my subject has been updated as follows:
118+
# seeking_further_data_criteria = {
119+
# "calculated fobt due date": "Null",
120+
# "calculated lynch due date": "today",
121+
# "calculated surveillance due date": "Null",
122+
# "lynch due date": "today",
123+
# "lynch due date date of change": "Null",
124+
# "lynch due date reason": "Self-referral",
125+
# "previous screening status": "Lynch Self-referral",
126+
# "screening due date": "Null",
127+
# "screening due date date of change": "Null",
128+
# "screening due date reason": "Null",
129+
# "subject has lynch diagnosis": "Yes",
130+
# "subject lower fobt age": "Default",
131+
# "subject lower lynch age": "25",
132+
# "screening status": "Seeking Further Data",
133+
# "screening status date of change": "Today",
134+
# "screening status reason": "Uncertified Death",
135+
# "surveillance due date": "Null",
136+
# "surveillance due date date of change": "Null",
137+
# "surveillance due date reason": "Null",
138+
# }
139+
# debug_log_subject_db_row(nhs_no) # For debug purposes - can be removed later
140+
141+
# subject_assertion(nhs_no, seeking_further_data_criteria)
142+
143+
# # When I set the subject from Seeking Further Data back to "Lynch Self-referral"
144+
# subject_page.set_self_referral_screening_status()
145+
146+
# # Then my subject has been updated as follows:
147+
# reverted_criteria = {
148+
# "calculated fobt due date": "Null",
149+
# "calculated lynch due date": "today",
150+
# "calculated surveillance due date": "Null",
151+
# "lynch due date": "today",
152+
# "lynch due date date of change": "Null",
153+
# "lynch due date reason": "Self-referral",
154+
# "previous screening status": "Lynch Self-referral",
155+
# "screening due date": "Null",
156+
# "screening due date date of change": "Null",
157+
# "screening due date reason": "Null",
158+
# "subject has lynch diagnosis": "Yes",
159+
# "subject lower fobt age": "Default",
160+
# "subject lower lynch age": "25",
161+
# "screening status": "Lynch Self-referral",
162+
# "screening status date of change": "Today",
163+
# "screening status reason": "Reset seeking further data to Lynch Self-referral",
164+
# "surveillance due date": "Null",
165+
# "surveillance due date date of change": "Null",
166+
# "surveillance due date reason": "Null",
167+
# }
168+
# debug_log_subject_db_row(nhs_no) # For debug purposes - can be removed later
169+
170+
# subject_assertion(nhs_no, reverted_criteria)
171+
172+
# LogoutPage(page).log_out()
173+
# logging.info("[TEST END] test_lynch_self_referral_seeking_further_data_flow")

0 commit comments

Comments
 (0)