Skip to content

Commit 51abd89

Browse files
committed
reverted default_iteration_time to iteration_time
1 parent 6d8e848 commit 51abd89

7 files changed

Lines changed: 40 additions & 32 deletions

File tree

src/eligibility_signposting_api/model/campaign_config.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,7 @@ def iteration_datetime(self) -> datetime:
344344
if self.iteration_time:
345345
iteration_time = self.iteration_time
346346
elif self._parent:
347-
iteration_time = self._parent.default_iteration_time
347+
iteration_time = self._parent.iteration_time
348348
else:
349349
msg = f"No iteration_time and no parent linked for iteration {self.id}"
350350
raise ValueError(msg)
@@ -366,7 +366,7 @@ class CampaignConfig(BaseModel):
366366
reviewer: list[str] | None = Field(None, alias="Reviewer")
367367
iteration_frequency: Literal["X", "D", "W", "M", "Q", "A"] = Field(..., alias="IterationFrequency")
368368
iteration_type: Literal["A", "M", "S", "O"] = Field(..., alias="IterationType")
369-
default_iteration_time: IterationTime = Field(default=IterationTime(time(0, 0, 0)), alias="DefaultIterationTime")
369+
iteration_time: IterationTime = Field(default=IterationTime(time(0, 0, 0)), alias="IterationTime")
370370
default_comms_routing: str | None = Field(None, alias="DefaultCommsRouting")
371371
start_date: StartDate = Field(..., alias="StartDate")
372372
end_date: EndDate = Field(..., alias="EndDate")
@@ -400,7 +400,7 @@ def parse_dates(cls, v: str | date) -> date:
400400
msg = f"Invalid date value: {v_str}. Must be a valid calendar date in YYYYMMDD format."
401401
raise ValueError(msg) from err
402402

403-
@field_validator("default_iteration_time", mode="before")
403+
@field_validator("iteration_time", mode="before")
404404
@classmethod
405405
def parse_times(cls, v: str | time) -> time | None:
406406
if not v:
@@ -426,7 +426,7 @@ def parse_times(cls, v: str | time) -> time | None:
426426
def serialize_dates(v: date, _info: SerializationInfo) -> str:
427427
return v.strftime("%Y%m%d")
428428

429-
@field_serializer("default_iteration_time", when_used="always")
429+
@field_serializer("iteration_time", when_used="always")
430430
@staticmethod
431431
def serialize_time(v: time, _info: SerializationInfo) -> str | None:
432432
return v.strftime("%H:%M:%S") if v else None

src/rules_validation_api/app.py

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -88,14 +88,17 @@ def display_current_iteration(result: RulesValidation) -> None:
8888
if is_campaign_live:
8989
sys.stdout.write(f"{YELLOW}Campaign is {RESET}{GREEN}LIVE{RESET}\n")
9090
current = config.current_iteration
91-
if current:
92-
sys.stdout.write(
93-
f"{YELLOW}Current active Iteration Number: {RESET}{GREEN}{current.iteration_number}{RESET}\n"
94-
)
95-
sys.stdout.write(
96-
f"{YELLOW}Current active Iteration's date&time: {RESET}{GREEN}{current.iteration_datetime}{RESET}\n"
97-
)
98-
else:
91+
92+
try:
93+
current = config.current_iteration
94+
if current:
95+
sys.stdout.write(
96+
f"{YELLOW}Current active Iteration Number: {RESET}{GREEN}{current.iteration_number}{RESET}\n"
97+
)
98+
sys.stdout.write(
99+
f"{YELLOW}Current active Iteration's date&time: {RESET}{GREEN}{current.iteration_datetime}{RESET}\n"
100+
)
101+
except StopIteration:
99102
sys.stdout.write(f"{YELLOW}No active iteration could be determined{RESET}\n")
100103

101104
else:
@@ -109,18 +112,20 @@ def display_current_iteration(result: RulesValidation) -> None:
109112
# ---- Next Iteration ----
110113
if not is_campaign_expired:
111114
sorted_iterations = sorted(iterations, key=attrgetter("iteration_date"))
112-
next_iteration = next(
113-
(i for i in sorted_iterations if i.iteration_date > today), None
114-
)
115115

116-
if next_iteration:
117-
sys.stdout.write(
118-
f"{YELLOW}Next active Iteration Number: {RESET}{GREEN}{next_iteration.iteration_number}{RESET}\n"
116+
try:
117+
next_iteration = next(
118+
(i for i in sorted_iterations if i.iteration_date > today), None
119119
)
120-
sys.stdout.write(
121-
f"{YELLOW}Next active Iteration's date&time: {RESET}{GREEN}{next_iteration.iteration_datetime}{RESET}\n"
122-
)
123-
else:
120+
121+
if next_iteration:
122+
sys.stdout.write(
123+
f"{YELLOW}Next active Iteration Number: {RESET}{GREEN}{next_iteration.iteration_number}{RESET}\n"
124+
)
125+
sys.stdout.write(
126+
f"{YELLOW}Next active Iteration's date&time: {RESET}{GREEN}{next_iteration.iteration_datetime}{RESET}\n"
127+
)
128+
except StopIteration:
124129
sys.stdout.write(f"{YELLOW}No next active iteration could be determined{RESET}\n")
125130

126131
# ---- Total Iterations ----

tests/fixtures/builders/model/rule.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ class RawCampaignConfigFactory(ModelFactory[CampaignConfig]):
9898
id = "42-hi5tch-hi5kers-gu5ide-t2o-t3he-gal6axy"
9999
start_date = Use(past_date)
100100
end_date = Use(future_date)
101-
default_iteration_time = IterationTime(time(0, 0, 0))
101+
iteration_time = IterationTime(time(0, 0, 0))
102102

103103

104104
class CampaignConfigFactory(RawCampaignConfigFactory):

tests/test_data/test_config/test_config_v1.3.0.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
"ApprovalMaximum": 5000000,
2121
"IterationFrequency": "X",
2222
"IterationType": "M",
23-
"DefaultIterationTime": "07:00:00",
23+
"IterationTime": "07:00:00",
2424
"Iterations": [
2525
{
2626
"ID": "id_100",

tests/unit/validation/test_app.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import sys
22
from io import StringIO
33
from unittest.mock import Mock, PropertyMock
4+
from datetime import UTC, datetime, timedelta
45

56
from pydantic import BaseModel, ValidationError
67

@@ -84,6 +85,8 @@ def test_no_current_iteration():
8485
# iterations must be a list, not a Mock
8586
result.campaign_config.iterations = []
8687

88+
result.campaign_config.end_date = datetime.now(UTC).date() + timedelta(days=1)
89+
8790
# current_iteration should raise StopIteration
8891
type(result.campaign_config).current_iteration = PropertyMock(side_effect=StopIteration)
8992

tests/unit/validation/test_campaign_config_validator.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -167,13 +167,13 @@ def test_reviewer_field(self, reviewer, valid_campaign_config_with_only_mandator
167167
model = CampaignConfigValidation(**data)
168168
assert model.reviewer == reviewer
169169

170-
@pytest.mark.parametrize("default_iteration_time", ["14:00:00", "09:30:00", "18:45:00"])
171-
def test_default_iteration_time_field(
172-
self, default_iteration_time, valid_campaign_config_with_only_mandatory_fields
170+
@pytest.mark.parametrize("iteration_time", ["14:00:00", "09:30:00", "18:45:00"])
171+
def test_iteration_time_field(
172+
self, iteration_time, valid_campaign_config_with_only_mandatory_fields
173173
):
174-
data = {**valid_campaign_config_with_only_mandatory_fields, "DefaultIterationTime": default_iteration_time}
174+
data = {**valid_campaign_config_with_only_mandatory_fields, "IterationTime": iteration_time}
175175
model = CampaignConfigValidation(**data)
176-
assert model.default_iteration_time == datetime.strptime(default_iteration_time, "%H:%M:%S").time() # noqa: DTZ007
176+
assert model.iteration_time == datetime.strptime(iteration_time, "%H:%M:%S").time() # noqa: DTZ007
177177

178178
@pytest.mark.parametrize("routing", ["email", "sms", "push"])
179179
def test_default_comms_routing_field(self, routing, valid_campaign_config_with_only_mandatory_fields):

tests/unit/validation/test_iteration_validator.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -520,11 +520,11 @@ def test_invalid_iteration_collects_errors_if_iteration_rules_have_invalid_data(
520520
[
521521
# Case 1: Iteration time overrides default
522522
("14:30:00", "09:00:00", datetime(2025, 1, 2, 14, 30, 0)), # noqa: DTZ001
523-
# Case 2: Iteration time is missing, so it uses default_iteration_time
523+
# Case 2: Iteration time is missing, so it uses campaign config iteration_time
524524
(None, "09:00:00", datetime(2025, 1, 2, 9, 0, 0)), # noqa: DTZ001
525525
# Case 3: Both are the same
526526
("10:00:00", "10:00:00", datetime(2025, 1, 2, 10, 0, 0)), # noqa: DTZ001
527-
# Case 4: Both are None, falls back to default value (12 AM) in default_iteration_time
527+
# Case 4: Both are None, falls back to default value (12 AM) in campaign config iteration_time
528528
(None, None, datetime(2025, 1, 2, 0, 0, 0)), # noqa: DTZ001
529529
],
530530
)
@@ -544,7 +544,7 @@ def test_iteration_full_datetime_validation(
544544
data = valid_campaign_config_with_only_mandatory_fields.copy()
545545

546546
if default_time_iteration_input:
547-
data["default_iteration_time"] = default_time_iteration_input
547+
data["iteration_time"] = default_time_iteration_input
548548

549549
data["Iterations"] = [iteration_data]
550550

0 commit comments

Comments
 (0)