def _parse_and_validate_request(self, request_dict):
        """ Validate the Request object includes the required fields """
        fy_range = [str(i) for i in range(2001, FiscalDateTime.today().year + 1)]
        last_fy = str(SubmissionAttributes.last_certified_fy()) or str(FiscalDateTime.today().year)
        request_settings = [
            {
                "key": "sort",
                "name": "sort",
                "type": "object",
                "optional": True,
                "object_keys": {
                    "field": {
                        "type": "enum",
                        "enum_values": ["budgetary_resources", "managing_agency", "account_name", "account_number"],
                        "optional": True,
                        "default": "budgetary_resources",
                    },
                    "direction": {"type": "enum", "enum_values": ["asc", "desc"], "optional": True, "default": "asc"},
                },
                "default": {"field": "budgetary_resources", "direction": "asc"},
            },
            {"key": "page", "name": "page", "type": "integer", "default": 1, "min": 1, "optional": True},
            {"key": "limit", "name": "limit", "type": "integer", "default": 10, "min": 1, "max": 100, "optional": True},
            {
                "key": "filters",
                "name": "filters",
                "type": "object",
                "optional": True,
                "object_keys": {
                    "agency_identifier": {
                        "name": "agency_identifier",
                        "type": "text",
                        "text_type": "search",
                        "optional": True,
                    },
                    "fy": {"type": "enum", "enum_values": fy_range, "optional": True, "default": last_fy},
                },
                "default": {"fy": last_fy},
            },
            {"key": "keyword", "name": "keyword", "type": "text", "text_type": "search", "optional": True},
        ]

        validated_request_data = TinyShield(request_settings).block(request_dict)
        validated_request_data["filters"]["fy"] = validated_request_data["filters"].get("fy", last_fy)
        return validated_request_data
Пример #2
0
    def post(self, request, format=None):
        """Return all high-level Federal Account information"""

        limit = request.data.get("limit", 10)
        page = request.data.get("page", 1)
        sorting = request.data.get("sort", {'field': 'budgetary_resources', 'direction': 'desc'})
        sort_field = sorting.get('field', 'budgetary_resources')
        sort_direction = sorting.get('direction', 'asc')
        filters = request.data.get('filters', {})
        fy = filters.get('fy') or SubmissionAttributes.last_certified_fy()

        lower_limit = (page - 1) * limit
        upper_limit = page * limit

        agency_subquery = ToptierAgency.objects.filter(cgac_code=OuterRef('corrected_agency_identifier'))
        queryset = FederalAccount.objects.\
            filter(treasuryappropriationaccount__account_balances__final_of_fy=True,
                   treasuryappropriationaccount__account_balances__submission__reporting_period_start__fy=fy).\
            annotate(corrected_agency_identifier=Func(F('agency_identifier'), function='CORRECTED_CGAC')).\
            annotate(account_id=F('id'),
                     account_number=Concat(F('agency_identifier'), Value('-'), F('main_account_code')),
                     account_name=F('account_title'),
                     budgetary_resources=Sum(
                         'treasuryappropriationaccount__account_balances__budget_authority_available_amount_total_cpe'),
                     managing_agency=Subquery(agency_subquery.values('name')[:1]),
                     managing_agency_acronym=Subquery(agency_subquery.values('abbreviation')[:1])
                     )

        if sort_direction == 'desc':
            queryset = queryset.order_by(F(sort_field).desc(nulls_last=True))
        else:
            queryset = queryset.order_by(F(sort_field).asc())

        result = {'count': queryset.count(), 'limit': limit, 'page': page, 'fy': fy}
        resultset = queryset.values('account_id', 'account_number', 'account_name', 'budgetary_resources',
                                    'agency_identifier', 'managing_agency', 'managing_agency_acronym')
        resultset = resultset[lower_limit:upper_limit + 1]
        page_metadata = get_simple_pagination_metadata(len(resultset), limit, page)
        result.update(page_metadata)
        resultset = resultset[:limit]

        result['results'] = resultset
        return Response(result)
 def get(self, request, pk, fy=0, format=None):
     fy = int(fy) or SubmissionAttributes.last_certified_fy()
     queryset = AppropriationAccountBalances.final_objects.filter(
         treasury_account_identifier__federal_account_id=int(pk)).filter(submission__reporting_fiscal_year=fy)
     queryset = queryset.aggregate(
         outlay=Sum('gross_outlay_amount_by_tas_cpe'),
         budget_authority=Sum('total_budgetary_resources_amount_cpe'),
         obligated=Sum('obligations_incurred_total_by_tas_cpe'),
         unobligated=Sum('unobligated_balance_cpe'),
         balance_brought_forward=Sum(
             F('budget_authority_unobligated_balance_brought_forward_fyb') +
             F('adjustments_to_unobligated_balance_brought_forward_cpe')),
         other_budgetary_resources=Sum('other_budgetary_resources_amount_cpe'),
         appropriations=Sum('budget_authority_appropriated_amount_cpe'))
     if queryset['outlay'] is not None:
         name = FederalAccount.objects.filter(id=int(pk)).values('account_title').first()['account_title']
         queryset['name'] = name
         return Response({'results': queryset})
     else:
         return Response({})
    def _parse_and_validate_request(self, request_dict):
        """ Validate the Request object includes the required fields """
        fy_range = [str(i) for i in range(2001, FiscalDateTime.today().year + 1)]
        last_fy = str(SubmissionAttributes.last_certified_fy()) or str(FiscalDateTime.today().year)
        request_settings = [
            {'key': 'sort', 'name': 'sort', 'type': 'object', 'optional': True, 'object_keys': {
                'field': {'type': 'enum', 'enum_values': ['budgetary_resources', 'managing_agency', 'account_name',
                                                          'account_number'],
                          'optional': True, 'default': 'budgetary_resources'},
                'direction': {'type': 'enum', 'enum_values': ['asc', 'desc'], 'optional': True, 'default': 'asc'},
            }, 'default': {'field': 'budgetary_resources', 'direction': 'asc'}},
            {'key': 'page', 'name': 'page', 'type': 'integer', 'default': 1, 'min': 1, 'optional': True},
            {'key': 'limit', 'name': 'limit', 'type': 'integer', 'default': 10, 'min': 1, 'max': 100, 'optional': True},
            {'key': 'filters', 'name': 'filters', 'type': 'object', 'optional': True, 'object_keys': {
                'fy': {'type': 'enum', 'enum_values': fy_range, 'optional': True, 'default': last_fy},
            }, 'default': {'fy': last_fy}},
            {'key': 'keyword', 'name': 'keyword', 'type': 'text', 'text_type': 'search', 'optional': True}
        ]

        validated_request_data = TinyShield(request_settings).block(request_dict)
        return validated_request_data