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
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