Skip to content

Commit 0a4f15f

Browse files
Merge pull request #4456 from fedspendingtransparency/ftr/dev-13014-add-park-to-program-activity
Ftr/dev 13014 add park to program activity
2 parents 8427bba + 202a3cf commit 0a4f15f

File tree

4 files changed

+49
-7
lines changed

4 files changed

+49
-7
lines changed

usaspending_api/agency/tests/integration/conftest.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,12 @@ def agency_account_data():
401401
oc, major_object_class=10, major_object_class_name="Other", object_class=140, object_class_name="interest"
402402
)
403403

404+
pap1 = baker.make(
405+
"references.ProgramActivityPark",
406+
code="1",
407+
name="PARK 1",
408+
)
409+
404410
fabpaoc = "financial_activities.FinancialAccountsByProgramActivityObjectClass"
405411
baker.make(
406412
fabpaoc,
@@ -427,6 +433,7 @@ def agency_account_data():
427433
ussgl498200_upward_adjust_pri_deliv_orders_oblig_paid_cpe=14,
428434
ussgl480110_rein_undel_ord_cpe=75,
429435
ussgl490110_rein_deliv_ord_cpe=63,
436+
program_activity_reporting_key=pap1,
430437
)
431438
baker.make(
432439
fabpaoc,
@@ -812,6 +819,12 @@ def tas_mulitple_pas_per_oc():
812819

813820
fabpaoc = "financial_activities.FinancialAccountsByProgramActivityObjectClass"
814821

822+
pap1 = baker.make(
823+
"references.ProgramActivityPark",
824+
code="1",
825+
name="PARK 1",
826+
)
827+
815828
baker.make(
816829
fabpaoc,
817830
treasury_account=tas1,
@@ -837,6 +850,7 @@ def tas_mulitple_pas_per_oc():
837850
ussgl498200_upward_adjust_pri_deliv_orders_oblig_paid_cpe=0,
838851
ussgl480110_rein_undel_ord_cpe=0,
839852
ussgl490110_rein_deliv_ord_cpe=0,
853+
program_activity_reporting_key=pap1,
840854
)
841855

842856
baker.make(

usaspending_api/agency/tests/integration/test_agency_tas_program_activity.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ def test_tas_program_activity_success(client, monkeypatch, agency_account_data,
2929
"name": "NAME 3",
3030
"gross_outlay_amount": 100000.0,
3131
"obligated_amount": 100.0,
32+
"type": "PAC/PAN",
3233
"children": [
3334
{
3435
"name": "Other",
@@ -41,6 +42,7 @@ def test_tas_program_activity_success(client, monkeypatch, agency_account_data,
4142
"name": "NAME 2",
4243
"gross_outlay_amount": 1000000.0,
4344
"obligated_amount": 10.0,
45+
"type": "PAC/PAN",
4446
"children": [
4547
{
4648
"name": "Other",
@@ -50,9 +52,10 @@ def test_tas_program_activity_success(client, monkeypatch, agency_account_data,
5052
],
5153
},
5254
{
53-
"name": "NAME 1",
55+
"name": "PARK 1",
5456
"gross_outlay_amount": 10000000.0,
5557
"obligated_amount": 1.0,
58+
"type": "PARK",
5659
"children": [
5760
{
5861
"name": "Other",
@@ -111,6 +114,7 @@ def test_tas_program_activity_success(client, monkeypatch, agency_account_data,
111114
"gross_outlay_amount": 1000000.0,
112115
"name": "NAME 5",
113116
"obligated_amount": 10.0,
117+
"type": "PAC/PAN",
114118
"children": [
115119
{
116120
"name": "Other",
@@ -151,6 +155,7 @@ def test_tas_multiple_program_activity_belonging_one_object_class(
151155
"name": "NAME 2",
152156
"gross_outlay_amount": 1000000.0,
153157
"obligated_amount": 10.0,
158+
"type": "PAC/PAN",
154159
"children": [
155160
{
156161
"gross_outlay_amount": 1000000.0,
@@ -160,9 +165,10 @@ def test_tas_multiple_program_activity_belonging_one_object_class(
160165
],
161166
},
162167
{
163-
"name": "NAME 1",
168+
"name": "PARK 1",
164169
"gross_outlay_amount": 10000000.0,
165170
"obligated_amount": 1.0,
171+
"type": "PARK",
166172
"children": [
167173
{
168174
"gross_outlay_amount": 10000000.0,
@@ -202,6 +208,7 @@ def test_tas_program_activity_multiple_submission_years(client, agency_account_d
202208
"gross_outlay_amount": 10000.0,
203209
"name": "NAME 4",
204210
"obligated_amount": 1000.0,
211+
"type": "PAC/PAN",
205212
"children": [{"gross_outlay_amount": 10000.0, "name": "Other", "obligated_amount": 1000.0}],
206213
}
207214
],
@@ -235,6 +242,7 @@ def test_tas_program_activity_multiple_object_classes(client, tas_mulitple_oc_pe
235242
"name": "NAME 4",
236243
"gross_outlay_amount": 111000.0,
237244
"obligated_amount": 11100.0,
245+
"type": "PAC/PAN",
238246
"children": [
239247
{
240248
"gross_outlay_amount": 101000.0,

usaspending_api/agency/v2/views/tas_program_activity_list.py

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from typing import Any, List
22

3-
from django.db.models import Q, Sum, F
3+
from django.db.models import Q, Sum, F, Case, When, Value, CharField
4+
from django.db.models.functions import Coalesce
45
from rest_framework.request import Request
56
from rest_framework.response import Response
67

@@ -64,7 +65,10 @@ def get(self, request: Request, *args: Any, **kwargs: Any) -> Response:
6465

6566
def get_program_activity_list(self) -> List[dict]:
6667
filters = [
67-
Q(program_activity__program_activity_name__isnull=False),
68+
(
69+
Q(program_activity_reporting_key__name__isnull=False)
70+
| Q(program_activity__program_activity_name__isnull=False)
71+
),
6872
Q(submission_id__in=self.submission_ids),
6973
Q(treasury_account__tas_rendering_label=self.tas_rendering_label),
7074
self.file_b_calculations.is_non_zero_total_spending(),
@@ -75,21 +79,30 @@ def get_program_activity_list(self) -> List[dict]:
7579
queryset_results = (
7680
FinancialAccountsByProgramActivityObjectClass.objects.filter(*filters)
7781
.values("program_activity__program_activity_name")
82+
.values("program_activity_reporting_key__name")
7883
.annotate(
79-
name=F("program_activity__program_activity_name"),
84+
name=Coalesce("program_activity_reporting_key__name", "program_activity__program_activity_name"),
8085
obligated_amount=Sum(self.file_b_calculations.get_obligations()),
8186
gross_outlay_amount=Sum(self.file_b_calculations.get_outlays()),
87+
type=Case(
88+
When(program_activity_reporting_key__name__isnull=False, then=Value("PARK")),
89+
default=Value("PAC/PAN"),
90+
output_field=CharField(),
91+
),
8292
)
8393
.order_by(f"{'-' if self.pagination.sort_order == 'desc' else ''}{self.pagination.sort_key}")
84-
.values("name", "obligated_amount", "gross_outlay_amount")
94+
.values("name", "obligated_amount", "gross_outlay_amount", "type")
8595
)
8696
return queryset_results
8797

8898
def get_object_class_by_program_activity_list(self, program_activity_name) -> List[dict]:
8999
filters = [
90100
Q(object_class__major_object_class_name__isnull=False),
91101
Q(submission_id__in=self.submission_ids),
92-
Q(program_activity__program_activity_name=program_activity_name),
102+
(
103+
Q(program_activity__program_activity_name=program_activity_name)
104+
| Q(program_activity_reporting_key__name=program_activity_name)
105+
),
93106
Q(treasury_account__tas_rendering_label=self.tas_rendering_label),
94107
self.file_b_calculations.is_non_zero_total_spending(),
95108
]

usaspending_api/api_contracts/contracts/v2/agency/treasury_account/tas/program_activity.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ Returns a list of Program Activities for the specified Treasury Account Symbol (
2727
+ `name`
2828
+ `obligated_amount`
2929
+ `gross_outlay_amount`
30+
+ `type`
3031
+ `page` (optional, number)
3132
The page number that is currently returned.
3233
+ Default: 1
@@ -93,6 +94,12 @@ Returns a list of Program Activities for the specified Treasury Account Symbol (
9394
+ `name` (required, string)
9495
+ `obligated_amount` (required, number)
9596
+ `gross_outlay_amount` (required, number)
97+
+ `type` (required, enum[string])
98+
Indicates whether the values come from the Program Activity Reporting Key (PARK) or Program Activity Code/Name (PAC/PAN)
99+
+ Default: `PARK`
100+
+ Members
101+
+ `PAC/PAN`
102+
+ `PARK`
96103
+ `children` (required, array[ObjectClass], fixed-type)
97104

98105
## ObjectClass (object)

0 commit comments

Comments
 (0)