Skip to content

Commit 241a7b7

Browse files
committed
add_phase when source event is intermediate
1 parent 7c3a9f0 commit 241a7b7

File tree

3 files changed

+54
-24
lines changed

3 files changed

+54
-24
lines changed

epictrack-api/src/api/actions/add_phase.py

Lines changed: 51 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
11
"""Disable work start date action handler"""
2+
23
from datetime import timedelta
34
from typing import List
5+
from operator import attrgetter
46
from sqlalchemy import and_
57

68
from api.actions.base import ActionFactory
79
from api.models import Event, EventConfiguration, WorkPhase, Work, db
810
from api.models.phase_code import PhaseCode, PhaseVisibilityEnum
9-
from api.models.event_template import EventTemplateVisibilityEnum, EventPositionEnum
11+
from api.models.event_template import (
12+
EventTemplateVisibilityEnum,
13+
EventPositionEnum,
14+
)
15+
from api.models.event_category import PRIMARY_CATEGORIES
1016
from api.services.event_template import EventTemplateService
1117
from api.schemas import response as res
1218

@@ -24,7 +30,10 @@ def run(self, source_event: Event, params) -> None:
2430
number_of_phases = len(params)
2531
# Push the sort order of the existing work phases after the new ones
2632
self.preset_sort_order(source_event, number_of_phases)
27-
phase_start_date = source_event.actual_date + timedelta(days=1)
33+
number_of_days_to_be_added = self._get_number_of_days_to_be_added(source_event)
34+
phase_start_date = source_event.actual_date + timedelta(
35+
days=number_of_days_to_be_added
36+
)
2837
sort_order = source_event.event_configuration.work_phase.sort_order + 1
2938
total_number_of_days = 0
3039
for param in params:
@@ -43,22 +52,15 @@ def run(self, source_event: Event, params) -> None:
4352
"sort_order": sort_order,
4453
}
4554
)
46-
event_templates_for_the_phase = EventTemplateService.find_by_phase_id(work_phase_data.get("phase_id"))
47-
event_templates_for_the_phase_json = res.EventTemplateResponseSchema(many=True).dump(
48-
event_templates_for_the_phase
55+
event_templates_for_the_phase = EventTemplateService.find_by_phase_id(
56+
work_phase_data.get("phase_id")
57+
)
58+
event_templates_for_the_phase_json = res.EventTemplateResponseSchema(
59+
many=True
60+
).dump(event_templates_for_the_phase)
61+
work_phase = WorkService.create_events_by_template(
62+
work_phase_data, event_templates_for_the_phase_json
4963
)
50-
# event_configurations = self.get_configurations(source_event, param)
51-
# work_phase = WorkPhase.flush(WorkPhase(**work_phase_data))
52-
# event_configurations = res.EventConfigurationResponseSchema(many=True).dump(
53-
# event_configurations
54-
# )
55-
work_phase = WorkService.create_events_by_template(work_phase_data, event_templates_for_the_phase_json)
56-
# new_event_configurations = WorkService.create_configurations(
57-
# work_phase, event_configurations, False
58-
# )
59-
# WorkService.create_events_by_configuration(
60-
# work_phase, new_event_configurations
61-
# )
6264
sort_order = sort_order + 1
6365
phase_start_date = end_date + timedelta(days=1)
6466
# update the current work phase
@@ -73,6 +75,32 @@ def run(self, source_event: Event, params) -> None:
7375
if work_phase:
7476
self.update_susequent_work_phases(work_phase)
7577

78+
def _get_number_of_days_to_be_added(self, source_event) -> int:
79+
"""Returns the phase start date"""
80+
if source_event.event_position == EventPositionEnum.INTERMEDIATE.value:
81+
work_phase_id = source_event.event_configuration.work_phase.id
82+
event_configurations = EventConfiguration.find_by_params(
83+
{
84+
"work_phase_id": work_phase_id,
85+
"visibility": EventTemplateVisibilityEnum.MANDATORY.value,
86+
}
87+
)
88+
primary_categories = list(map(lambda x: x.value, PRIMARY_CATEGORIES))
89+
filtered_configurations = [
90+
template
91+
for template in event_configurations
92+
if template.event_category_id in primary_categories
93+
and template.sort_order > source_event.event_configuration.sort_order
94+
]
95+
last_mandatory_configuration = max(
96+
filtered_configurations, key=attrgetter("sort_order")
97+
)
98+
return (
99+
int(last_mandatory_configuration.start_at)
100+
- int(source_event.event_configuration.start_at)
101+
) + 1
102+
return 1
103+
76104
def preset_sort_order(self, source_event, number_of_new_work_phases: int) -> None:
77105
"""Adjust the sort order of the existing work phases for the new ones"""
78106
db.session.query(WorkPhase).filter(
@@ -130,9 +158,9 @@ def update_susequent_work_phases(
130158
# Update the start event anticipated date by the number of total days added by all the new phases
131159
# This will push all the susequent work phases and all the events
132160
start_event_dict = start_event.as_dict(recursive=False)
133-
start_event_dict[
134-
"anticipated_date"
135-
] = latest_work_phase_added.end_date + timedelta(days=1)
161+
start_event_dict["anticipated_date"] = (
162+
latest_work_phase_added.end_date + timedelta(days=1)
163+
)
136164
EventService.update_event(
137165
start_event_dict, start_event.id, True, commit=False
138166
)
@@ -159,7 +187,9 @@ def get_additional_params(self, source_event, params):
159187
}
160188
return work_phase_data
161189

162-
def get_configurations(self, source_event: Event, params) -> List[EventConfiguration]:
190+
def get_configurations(
191+
self, source_event: Event, params
192+
) -> List[EventConfiguration]:
163193
"""Find the latest event configurations per the given params"""
164194
work_phase = (
165195
db.session.query(WorkPhase)

epictrack-api/src/api/models/event_configuration.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,12 @@ class EventConfiguration(BaseModelVersioned):
4848
work_phase = relationship('WorkPhase', foreign_keys=[work_phase_id], lazy='select')
4949

5050
@classmethod
51-
def find_by_phase_id(cls, _phase_id):
51+
def find_by_work_phase_id(cls, _work_phase_id):
5252
"""Returns the event configurations based on phase id"""
5353
events = db.session.query(
5454
EventConfiguration
5555
).filter_by(
56-
phase_id=_phase_id,
56+
work_phase_id=_work_phase_id,
5757
is_active=True
5858
).order_by(
5959
EventConfiguration.sort_order.asc()

epictrack-api/src/api/reports/thirty_sixty_ninety_report.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ def _format_data(self, data):
212212
response["90"].append(work)
213213
return response
214214

215-
def _update_work_issues(self, data) -> list[WorkIssues]:
215+
def _update_work_issues(self, data) -> List[WorkIssues]:
216216
"""Combine the result with work issues"""
217217
work_ids = set((work["work_id"] for work in data))
218218
work_issues = WorkIssuesService.find_work_issues_by_work_ids(work_ids)

0 commit comments

Comments
 (0)