def post(self, request):
        """Return all awards matching the provided filters and limits"""
        self.original_filters = request.data.get("filters")
        json_request = self.validate_request_data(request.data)
        self.is_subaward = json_request["subawards"]
        self.constants = GLOBAL_MAP[
            "subaward"] if self.is_subaward else GLOBAL_MAP["award"]
        self.filters = add_date_range_comparison_types(
            json_request.get("filters"),
            self.is_subaward,
            gte_date_type="action_date",
            lte_date_type="date_signed")
        self.fields = json_request["fields"]
        self.pagination = {
            "limit": json_request["limit"],
            "lower_bound": (json_request["page"] - 1) * json_request["limit"],
            "page": json_request["page"],
            "sort_key": json_request.get("sort") or self.fields[0],
            "sort_order": json_request["order"],
            "upper_bound": json_request["page"] * json_request["limit"] + 1,
        }
        self.elasticsearch = is_experimental_elasticsearch_api(request)
        if not self.elasticsearch:
            mirror_request_to_elasticsearch(request)
        if self.if_no_intersection(
        ):  # Like an exception, but API response is a HTTP 200 with a JSON payload
            return Response(self.populate_response(results=[], has_next=False))
        raise_if_award_types_not_valid_subset(self.filters["award_type_codes"],
                                              self.is_subaward)
        raise_if_sort_key_not_valid(self.pagination["sort_key"], self.fields,
                                    self.is_subaward)

        if self.elasticsearch and not self.is_subaward:
            self.last_record_unique_id = json_request.get(
                "last_record_unique_id")
            self.last_record_sort_value = json_request.get(
                "last_record_sort_value")
            logger.info(
                "Using experimental Elasticsearch functionality for 'spending_by_award'"
            )
            return Response(
                self.construct_es_response(self.query_elasticsearch()))
        return Response(self.create_response(self.construct_queryset()))
Exemple #2
0
    def post(self, request):
        """Return all awards matching the provided filters and limits"""
        json_request = self.validate_request_data(request.data)
        self.is_subaward = json_request["subawards"]
        self.constants = GLOBAL_MAP["subaward"] if self.is_subaward else GLOBAL_MAP["award"]
        self.filters = add_date_range_comparison_types(
            json_request.get("filters"), self.is_subaward, gte_date_type="action_date", lte_date_type="date_signed"
        )
        self.fields = json_request["fields"]
        self.pagination = {
            "limit": json_request["limit"],
            "lower_bound": (json_request["page"] - 1) * json_request["limit"],
            "page": json_request["page"],
            "sort_key": json_request.get("sort") or self.fields[0],
            "sort_order": json_request["order"],
            "upper_bound": json_request["page"] * json_request["limit"] + 1,
        }

        if self.if_no_intersection():  # Like an exception, but API response is a HTTP 200 with a JSON payload
            return Response(self.populate_response(results=[], has_next=False))
        raise_if_award_types_not_valid_subset(self.filters["award_type_codes"], self.is_subaward)
        raise_if_sort_key_not_valid(self.pagination["sort_key"], self.fields, self.is_subaward)

        return Response(self.create_response(self.construct_queryset()))
def test_raise_if_award_types_not_valid_subset():
    valid_award_codes = ["09", "11"]
    valid_subaward_codes = ["IDV_C", "A", "IDV_B_A"]
    invalid_award_codes = ["A", "IDV_A"]
    invalid_subaward_codes = ["10", "A"]

    assert raise_if_award_types_not_valid_subset(valid_award_codes, is_subaward=False) is None
    assert raise_if_award_types_not_valid_subset(valid_subaward_codes, is_subaward=True) is None

    with pytest.raises(UnprocessableEntityException):
        raise_if_award_types_not_valid_subset(invalid_award_codes, is_subaward=False)

    with pytest.raises(UnprocessableEntityException):
        raise_if_award_types_not_valid_subset(invalid_subaward_codes, is_subaward=True)

    with pytest.raises(UnprocessableEntityException):
        raise_if_award_types_not_valid_subset(valid_subaward_codes, is_subaward=False)