Exemplo n.º 1
0
def calculate(tax_benefit_system, input_data):
    simulation = Simulation(tax_benefit_system=tax_benefit_system,
                            simulation_json=input_data)

    requested_computations = dpath.util.search(input_data,
                                               '*/*/*/*',
                                               afilter=lambda t: t is None,
                                               yielded=True)
    computation_results = {}

    for computation in requested_computations:
        path = computation[0]
        entity_plural, entity_id, variable_name, period = path.split('/')
        variable = tax_benefit_system.get_variable(variable_name)
        result = simulation.calculate(variable_name, period)
        entity = simulation.get_entity(plural=entity_plural)
        entity_index = entity.ids.index(entity_id)

        if variable.value_type == Enum:
            entity_result = result.decode()[entity_index].name
        elif variable.value_type == float:
            entity_result = float(
                str(result[entity_index])
            )  # To turn the float32 into a regular float without adding confusing extra decimals. There must be a better way.
        elif variable.value_type == str:
            entity_result = to_unicode(
                result[entity_index])  # From bytes to unicode
        else:
            entity_result = result.tolist()[entity_index]

        dpath.util.new(computation_results, path, entity_result)

    dpath.merge(input_data, computation_results)

    return input_data
Exemplo n.º 2
0
    def calculate():
        tax_benefit_system = data['tax_benefit_system']
        request.on_json_loading_failed = handle_invalid_json
        input_data = request.get_json()
        try:
            simulation = Simulation(tax_benefit_system=tax_benefit_system,
                                    simulation_json=input_data)
        except SituationParsingError as e:
            abort(make_response(jsonify(e.error), e.code or 400))

        requested_computations = dpath.util.search(input_data,
                                                   '*/*/*/*',
                                                   afilter=lambda t: t is None,
                                                   yielded=True)

        for computation in requested_computations:
            path = computation[0]
            entity_plural, entity_id, variable_name, period = path.split('/')
            result = simulation.calculate(variable_name, period).tolist()
            entity = simulation.get_entity(plural=entity_plural)
            entity_index = entity.ids.index(entity_id)

            variable = tax_benefit_system.get_variable(variable_name)
            if variable.value_type == Enum:
                entity_result = result[entity_index].name
            else:
                entity_result = result[entity_index]

            dpath.util.set(input_data, path, entity_result)

        return jsonify(input_data)
Exemplo n.º 3
0
    def calculate():
        tax_benefit_system = data['tax_benefit_system']
        request.on_json_loading_failed = handle_invalid_json
        input_data = request.get_json()
        try:
            simulation = Simulation(tax_benefit_system=tax_benefit_system,
                                    simulation_json=input_data)
        except SituationParsingError as e:
            abort(make_response(jsonify(e.error), e.code or 400))
        except UnicodeEncodeError as e:
            abort(
                make_response(
                    jsonify({
                        "error":
                        "'" + e[1] + "' is not a valid ASCII value."
                    }), 400))

        requested_computations = dpath.util.search(input_data,
                                                   '*/*/*/*',
                                                   afilter=lambda t: t is None,
                                                   yielded=True)
        results = {}

        try:
            for computation in requested_computations:
                path = computation[0]
                entity_plural, entity_id, variable_name, period = path.split(
                    '/')
                variable = tax_benefit_system.get_variable(variable_name)
                result = simulation.calculate(variable_name, period)
                entity = simulation.get_entity(plural=entity_plural)
                entity_index = entity.ids.index(entity_id)

                if variable.value_type == Enum:
                    entity_result = result.decode()[entity_index].name
                elif variable.value_type == float:
                    entity_result = float(
                        str(result[entity_index])
                    )  # To turn the float32 into a regular float without adding confusing extra decimals. There must be a better way.
                elif variable.value_type == str:
                    entity_result = to_unicode(
                        result[entity_index])  # From bytes to unicode
                else:
                    entity_result = result.tolist()[entity_index]

                dpath.util.new(results, path, entity_result)

        except UnicodeEncodeError as e:
            abort(
                make_response(
                    jsonify({
                        "error":
                        "'" + e[1] + "' is not a valid ASCII value."
                    }), 400))

        dpath.util.merge(input_data, results)

        return jsonify(input_data)