Skip to content

Commit cbd0b49

Browse files
Fixing incorrectly converted classes
Standardising capitalisation of Yes / No Converted classes to Enums where necessary
1 parent 2ae0b5c commit cbd0b49

34 files changed

+637
-723
lines changed

classes/address/address.py

Lines changed: 9 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
1-
import logging
1+
from dataclasses import dataclass
22

33

4+
@dataclass
45
class Address:
56
"""
67
Represents a postal address with up to five address lines and a postcode.
7-
Provides methods to set individual lines and to format the address as a string.
8+
Provides methods to format the address as a string.
89
"""
910

10-
def __init__(self) -> None:
11-
self.address_line1: str = ""
12-
self.address_line2: str = ""
13-
self.address_line3: str = ""
14-
self.address_line4: str = ""
15-
self.address_line5: str = ""
16-
self.post_code: str = ""
11+
address_line1: str = ""
12+
address_line2: str = ""
13+
address_line3: str = ""
14+
address_line4: str = ""
15+
address_line5: str = ""
16+
post_code: str = ""
1717

1818
def set_address_line(self, line_number: int, address_line: str) -> None:
1919
"""
@@ -26,9 +26,6 @@ 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-
logging.debug(
30-
f"start: set_address_line(line_number={line_number}, address_line={address_line})"
31-
)
3229
if line_number == 1:
3330
self.address_line1 = address_line
3431
elif line_number == 2:
@@ -43,9 +40,6 @@ def set_address_line(self, line_number: int, address_line: str) -> None:
4340
raise ValueError(
4441
f"Invalid line number {line_number}, must be between 1 and 5"
4542
)
46-
logging.debug(
47-
f"end: set_address_line(line_number={line_number}, address_line={address_line})"
48-
)
4943

5044
def __str__(self) -> str:
5145
"""
@@ -59,77 +53,4 @@ def __str__(self) -> str:
5953
self.address_line5,
6054
self.post_code,
6155
]
62-
# Filter out empty or None values and join with ', '
6356
return ", ".join([part for part in address_parts if part])
64-
65-
def get_address_line1(self) -> str:
66-
"""
67-
Returns the first address line.
68-
"""
69-
return self.address_line1
70-
71-
def set_address_line1(self, address_line1: str) -> None:
72-
"""
73-
Sets the first address line.
74-
"""
75-
self.address_line1 = address_line1
76-
77-
def get_address_line2(self) -> str:
78-
"""
79-
Returns the second address line.
80-
"""
81-
return self.address_line2
82-
83-
def set_address_line2(self, address_line2: str) -> None:
84-
"""
85-
Sets the second address line.
86-
"""
87-
self.address_line2 = address_line2
88-
89-
def get_address_line3(self) -> str:
90-
"""
91-
Returns the third address line.
92-
"""
93-
return self.address_line3
94-
95-
def set_address_line3(self, address_line3: str) -> None:
96-
"""
97-
Sets the thrid address line.
98-
"""
99-
self.address_line3 = address_line3
100-
101-
def get_address_line4(self) -> str:
102-
"""
103-
Returns the fourth address line.
104-
"""
105-
return self.address_line4
106-
107-
def set_address_line4(self, address_line4: str) -> None:
108-
"""
109-
Sets the fourth address line.
110-
"""
111-
self.address_line4 = address_line4
112-
113-
def get_address_line5(self) -> str:
114-
"""
115-
Returns the fifth address line.
116-
"""
117-
return self.address_line5
118-
119-
def set_address_line5(self, address_line5: str) -> None:
120-
"""
121-
Sets the fifth address line.
122-
"""
123-
self.address_line5 = address_line5
124-
125-
def get_post_code(self) -> str:
126-
"""
127-
Returns the postcodde.
128-
"""
129-
return self.post_code
130-
131-
def set_post_code(self, post_code: str) -> None:
132-
"""
133-
Sets the postcode.
134-
"""
135-
self.post_code = post_code
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
from enum import Enum
2+
from typing import Optional
3+
4+
5+
class AppointmentSlotType(Enum):
6+
"""
7+
Enum representing appointment slot types, mapped to valid value IDs and descriptions.
8+
Provides utility methods for lookup by description (case-sensitive and insensitive) and by valid value ID.
9+
"""
10+
11+
COLONOSCOPY_ASSESSMENT = (209028, "Colonoscopy Assessment")
12+
BOWEL_SCOPE_AUTOMATIC = (200526, "FS Automatic")
13+
BOWEL_SCOPE_MANUAL = (200527, "FS Manual")
14+
POSITIVE_ASSESSMENT = (6016, "Positive Assessment")
15+
POST_INVESTIGATION = (6017, "Post-Investigation")
16+
SURVEILLANCE = (20061, "Surveillance")
17+
18+
def __init__(self, valid_value_id: int, description: str) -> None:
19+
self._valid_value_id = valid_value_id
20+
self._description = description
21+
22+
@property
23+
def valid_value_id(self) -> int:
24+
"""
25+
Returns the valid value ID for the appointment slot type.
26+
"""
27+
return self._valid_value_id
28+
29+
@property
30+
def description(self) -> str:
31+
"""
32+
Returns the description for the appointment slot type.
33+
"""
34+
return self._description
35+
36+
@classmethod
37+
def by_description(cls, description: str) -> Optional["AppointmentSlotType"]:
38+
"""
39+
Returns the enum member matching the given description (case-sensitive).
40+
"""
41+
for member in cls:
42+
if member.description == description:
43+
return member
44+
return None
45+
46+
@classmethod
47+
def by_description_case_insensitive(
48+
cls, description: str
49+
) -> Optional["AppointmentSlotType"]:
50+
"""
51+
Returns the enum member matching the given description (case-insensitive).
52+
"""
53+
desc_lower = description.lower()
54+
for member in cls:
55+
if member.description.lower() == desc_lower:
56+
return member
57+
return None
58+
59+
@classmethod
60+
def by_valid_value_id(cls, valid_value_id: int) -> Optional["AppointmentSlotType"]:
61+
"""
62+
Returns the enum member matching the given valid value ID.
63+
"""
64+
for member in cls:
65+
if member.valid_value_id == valid_value_id:
66+
return member
67+
return None
Lines changed: 56 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,66 @@
1-
class AppointmentStatusType:
2-
"""
3-
Utility class for mapping descriptive appointment statuses to internal IDs.
1+
from enum import Enum
2+
from typing import Optional
43

5-
This class provides a mapping between human-readable appointment status descriptions
6-
(such as "booked", "attended", "cancelled", "dna") and their corresponding internal
7-
integer IDs used in the system.
84

9-
Methods:
10-
get_id(description: str) -> int:
11-
Returns the internal ID for a given appointment status description.
12-
Raises ValueError if the description is not recognized.
5+
class AppointmentStatusType(Enum):
6+
"""
7+
Enum representing appointment status types, mapped to valid value IDs and descriptions.
138
"""
149

15-
_mapping = {
16-
"booked": 2001,
17-
"attended": 2002,
18-
"cancelled": 2003,
19-
"dna": 2004, # Did Not Attend
20-
}
10+
ATTENDED = (6121, "Attended")
11+
BOOKED = (6120, "Booked")
12+
CANCELLED = (6122, "Cancelled")
13+
DID_NOT_ATTEND = (6123, "Did Not Attend")
2114

22-
@classmethod
23-
def get_id(cls, description: str) -> int:
15+
def __init__(self, valid_value_id: int, description: str) -> None:
16+
self._valid_value_id = valid_value_id
17+
self._description = description
18+
19+
@property
20+
def valid_value_id(self) -> int:
21+
"""
22+
Returns the valid value ID for the appointment status type.
23+
"""
24+
return self._valid_value_id
25+
26+
@property
27+
def description(self) -> str:
28+
"""
29+
Returns the description for the appointment status type.
2430
"""
25-
Returns the internal ID for a given appointment status description.
31+
return self._description
2632

27-
Args:
28-
description (str): The appointment status description (e.g., "booked").
33+
@classmethod
34+
def by_description(cls, description: str) -> Optional["AppointmentStatusType"]:
35+
"""
36+
Returns the enum member matching the given description (case-sensitive).
37+
"""
38+
for member in cls:
39+
if member.description == description:
40+
return member
41+
return None
2942

30-
Returns:
31-
int: The internal ID corresponding to the description.
43+
@classmethod
44+
def by_description_case_insensitive(
45+
cls, description: str
46+
) -> Optional["AppointmentStatusType"]:
47+
"""
48+
Returns the enum member matching the given description (case-insensitive).
49+
"""
50+
desc_lower = description.lower()
51+
for member in cls:
52+
if member.description.lower() == desc_lower:
53+
return member
54+
return None
3255

33-
Raises:
34-
ValueError: If the description is not recognized.
56+
@classmethod
57+
def by_valid_value_id(
58+
cls, valid_value_id: int
59+
) -> Optional["AppointmentStatusType"]:
60+
"""
61+
Returns the enum member matching the given valid value ID.
3562
"""
36-
key = description.strip().lower()
37-
if key not in cls._mapping:
38-
raise ValueError(f"Unknown appointment status: {description}")
39-
return cls._mapping[key]
63+
for member in cls:
64+
if member.valid_value_id == valid_value_id:
65+
return member
66+
return None

classes/appointment/appointments_slot_type.py

Lines changed: 0 additions & 38 deletions
This file was deleted.

classes/ceased/manual_cease_requested.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ class ManualCeaseRequested(Enum):
2020
Returns the enum member matching the given description (case-insensitive), or None if not found.
2121
"""
2222

23-
NO = "no"
24-
DISCLAIMER_LETTER_REQUIRED = "yes - disclaimer letter required (c1)"
25-
DISCLAIMER_LETTER_SENT = "yes - disclaimer letter sent (c2)"
26-
YES = "yes"
23+
NO = "No"
24+
DISCLAIMER_LETTER_REQUIRED = "Yes - disclaimer letter required (C1)"
25+
DISCLAIMER_LETTER_SENT = "Yes - disclaimer letter sent (C2)"
26+
YES = "Yes"
2727

2828
def __init__(self, description: str) -> None:
2929
"""

classes/data/data_creation.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -129,12 +129,12 @@ def generate_random_subject(
129129
else:
130130
pi_subject.gender_code = GenderType.NOT_KNOWN.redefined_value
131131
address = self.generate_random_address(random_words_list)
132-
pi_subject.address_line_1 = address.get_address_line1()
133-
pi_subject.address_line_2 = address.get_address_line2()
134-
pi_subject.address_line_3 = address.get_address_line3()
135-
pi_subject.address_line_4 = address.get_address_line4()
136-
pi_subject.address_line_5 = address.get_address_line5()
137-
pi_subject.postcode = address.get_post_code()
132+
pi_subject.address_line_1 = address.address_line1
133+
pi_subject.address_line_2 = address.address_line2
134+
pi_subject.address_line_3 = address.address_line3
135+
pi_subject.address_line_4 = address.address_line4
136+
pi_subject.address_line_5 = address.address_line5
137+
pi_subject.postcode = address.post_code
138138
pi_subject.gnc_code = self.generate_random_registration_code()
139139
gp_surgery = self.generate_random_gp_surgery(region)
140140
if gp_surgery is not None:
@@ -203,7 +203,7 @@ def generate_random_address(self, random_words_list: Dict[str, str]) -> Address:
203203
line_number += 1
204204
address.set_address_line(line_number, random_words_list.get("county", ""))
205205

206-
address.set_post_code(self.generate_random_postcode())
206+
address.post_code = self.generate_random_postcode()
207207
logging.debug("generateRandomAddress: end")
208208
return address
209209

0 commit comments

Comments
 (0)