fedspendingtransparency/usaspending-api

View on GitHub
usaspending_api/accounts/v2/views/budget_function.py

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
from django.db.models import Q
from rest_framework.response import Response
from rest_framework.views import APIView

from usaspending_api.accounts.models import TreasuryAppropriationAccount
from usaspending_api.common.cache_decorator import cache_response


class ListBudgetFunctionViewSet(APIView):
    """
    This route sends a request to the backend to retrieve all Budget Functions associated with a TAS,
    ordered by Budget Function code.
    """

    endpoint_doc = "usaspending_api/api_contracts/contracts/v2/budget_functions/list_budget_functions.md"

    @cache_response()
    def get(self, request):
        # Retrieve all Budget Functions, grouped by code and title, ordered by code
        results = list(
            TreasuryAppropriationAccount.objects.filter(~Q(budget_function_code=""), ~Q(budget_function_code=None))
            .values("budget_function_code", "budget_function_title")
            .order_by("budget_function_title")
            .distinct()
        )

        return Response({"results": results})


class ListBudgetSubfunctionViewSet(APIView):
    """
    This route sends a request to the backend to retrieve all Budget Subfunctions associated with a TAS,
    ordered by Budget Subfunction code. Can be filtered by Budget Function.
    """

    endpoint_doc = "usaspending_api/api_contracts/contracts/v2/budget_functions/list_budget_subfunctions.md"

    @cache_response()
    def post(self, request):
        # Retrieve all Budget Subfunctions
        queryset = TreasuryAppropriationAccount.objects.filter(
            ~Q(budget_subfunction_code=""), ~Q(budget_subfunction_code=None)
        )

        # Filter by Budget Function, if provided
        budget_function = request.data.get("budget_function", None)
        if budget_function:
            queryset = queryset.filter(budget_function_code=budget_function)

        # Group by code and title, order by code
        results = list(
            queryset.values("budget_subfunction_code", "budget_subfunction_title")
            .order_by("budget_subfunction_title")
            .distinct()
        )

        return Response({"results": results})