Skip to content

Commit 39b6b56

Browse files
committed
Merge branch 'main' into OPS-5380/fix-agreement-reporting-mismatch
2 parents c1241f9 + 5555f84 commit 39b6b56

80 files changed

Lines changed: 3438 additions & 2266 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/build_data_tools.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,19 +37,19 @@ jobs:
3737
# https://github.com/docker/metadata-action
3838
- name: Extract metadata (tags, labels) for Docker
3939
id: meta
40-
uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # v5.10.0
40+
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0
4141
with:
4242
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
4343

4444
# Setting up Docker Buildx with docker-container driver is required
4545
# at the moment to be able to use a subdirectory with Git context
4646
# https://github.com/docker/setup-buildx-action
4747
- name: Set up Docker Buildx
48-
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0
48+
uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0
4949

5050
# https://github.com/docker/build-push-action/
5151
- name: Build and push Docker image
52-
uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6.19.2
52+
uses: docker/build-push-action@d08e5c354a6adb9ed34480a06d141179aa583294 # v7.0.0
5353
with:
5454
context: "{{defaultContext}}:backend" # https://github.com/docker/build-push-action#git-context
5555
push: true

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ jobs:
2222
fetch-depth: 0
2323
- name: TruffleHog OSS
2424
id: trufflehog
25-
uses: trufflesecurity/trufflehog@586f66d7886cd0b037c7c245d4a6e34ef357ab10 # v3.94.1
25+
uses: trufflesecurity/trufflehog@6bd2d14f7a4bc1e569fa3550efa7ec632a4fa67b # v3.94.2
2626
env:
2727
GITHUB_HEAD_REF_SAFE: ${{ github.head_ref }}
2828
continue-on-error: true

backend/data_tools/Pipfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ name = "pypi"
55

66
[packages]
77
SQLAlchemy = "==2.0.48"
8-
pandas = "==3.0.1"
8+
pandas = "==3.0.2"
99
json5 = "==0.13.0"
1010
psycopg2-binary = "==2.9.11"
1111
cfenv = "==0.5.3"
@@ -37,7 +37,7 @@ pytest-cov = "==7.1.0"
3737
pytest-mock = "==3.15.1"
3838
ipython = "==9.11.0"
3939
pytest-docker = {extras = ["docker-compose-v2"], version = "==3.2.5"}
40-
black = {extras = ["d"], version = "==25.12.0"}
40+
black = {extras = ["d"], version = "==26.3.1"}
4141
isort = "==8.0.1"
4242

4343
[requires]

backend/data_tools/Pipfile.lock

Lines changed: 349 additions & 408 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

backend/models/agreements.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,14 @@ def team_leaders(self):
378378

379379
@property
380380
def division_directors(self) -> list[str]:
381-
full_names = set()
381+
division_directors = self.division_director_user_list
382+
full_names = [d.full_name for d in division_directors if d.full_name]
383+
384+
return sorted(full_names)
385+
386+
@property
387+
def division_director_user_list(self) -> list[User]:
388+
users = set()
382389
for bli in self.budget_line_items:
383390
if (
384391
bli.can
@@ -387,11 +394,13 @@ def division_directors(self) -> list[str]:
387394
and bli.can.portfolio.division
388395
and hasattr(bli.can.portfolio.division, "division_director")
389396
):
390-
director = bli.can.portfolio.division.division_director_full_name
391-
if director is not None:
392-
full_names.add(director)
397+
if (
398+
bli.can.portfolio.division.division_director_id
399+
and bli.can.portfolio.division.division_director_full_name
400+
):
401+
users.add(bli.can.portfolio.division.division_director)
393402

394-
return sorted(full_names)
403+
return sorted(users, key=lambda u: u.full_name or u.email)
395404

396405
@property
397406
def change_requests_in_review(self):
@@ -830,7 +839,6 @@ def get_required_fields_for_awarded_agreement(cls) -> List[str]:
830839
return []
831840

832841

833-
834842
class AgreementMod(BaseModel):
835843
"""Agreement Modification Model"""
836844

backend/models/projects.py

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ def project_metadata(self) -> dict:
8888
start_dates = []
8989
end_dates = []
9090
team_members_dict = {}
91+
project_officer_dict = {}
92+
alternate_project_officer_dict = {}
9193
division_directors_set = set()
9294

9395
for agreement in self.agreements:
@@ -101,7 +103,7 @@ def project_metadata(self) -> dict:
101103
team_members_dict[team_member.id] = team_member
102104

103105
# Collect division directors
104-
for director in agreement.division_directors:
106+
for director in agreement.division_director_user_list:
105107
division_directors_set.add(director)
106108

107109
# Collect all services_component dates
@@ -110,13 +112,37 @@ def project_metadata(self) -> dict:
110112
start_dates.append(sc.period_start)
111113
if sc.period_end is not None:
112114
end_dates.append(sc.period_end)
115+
# Collect all project officers
116+
if agreement.project_officer is not None:
117+
project_officer_dict[agreement.project_officer.id] = (
118+
agreement.project_officer.full_name
119+
if agreement.project_officer.full_name
120+
else agreement.project_officer.email
121+
)
122+
# Collect all alternate project officers
123+
if agreement.alternate_project_officer is not None:
124+
alternate_project_officer_dict[agreement.alternate_project_officer.id] = (
125+
agreement.alternate_project_officer.full_name
126+
if agreement.alternate_project_officer.full_name
127+
else agreement.alternate_project_officer.email
128+
)
113129
return {
114130
"special_topics": sorted(list(special_topics_set)),
115131
"research_methodologies": sorted(list(research_methodologies_set)),
116132
"project_start": min(start_dates) if start_dates else None,
117133
"project_end": max(end_dates) if end_dates else None,
118134
"team_members": sorted(team_members_dict.values(), key=lambda x: x.full_name if x.full_name else x.email),
119-
"division_directors": sorted(list(division_directors_set)),
135+
"division_directors": sorted(
136+
[{"id": d.id, "name": d.full_name if d.full_name else d.email} for d in division_directors_set],
137+
key=lambda x: x["name"],
138+
),
139+
"project_officers": sorted(
140+
[{"id": user_id, "name": name} for user_id, name in project_officer_dict.items()], key=lambda x: x["name"]
141+
),
142+
"alternate_project_officers": sorted(
143+
[{"id": user_id, "name": name} for user_id, name in alternate_project_officer_dict.items()],
144+
key=lambda x: x["name"],
145+
),
120146
}
121147

122148
@property

0 commit comments

Comments
 (0)