<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def calc_sum(app, need, needs, option, filter=None, links_only=False):
 """ Sums the values of a given option in filtered needs up to single number. Useful e.g. for calculating the amount of needed hours for implementation of all linked specification needs. **Input data** .. spec:: Do this :id: sum_input_1 :hours: 7 :collapse: False .. spec:: Do that :id: sum_input_2 :hours: 15 :collapse: False .. spec:: Do too much :id: sum_input_3 :hours: 110 :collapse: False **Example 2** .. code-block:: jinja .. req:: Result 1 :amount: [[calc_sum("hours")]] .. req:: Result 1 :amount: [[calc_sum("hours")]] :collapse: False **Example 2** .. code-block:: jinja .. req:: Result 2 :amount: [[calc_sum("hours", "hours.isdigit() and float(hours) > 10")]] .. req:: Result 2 :amount: [[calc_sum("hours", "hours.isdigit() and float(hours) > 10")]] :collapse: False **Example 3** .. code-block:: jinja .. req:: Result 3 :links: sum_input_1; sum_input_3 :amount: [[calc_sum("hours", links_only="True")]] .. req:: Result 3 :links: sum_input_1; sum_input_3 :amount: [[calc_sum("hours", links_only="True")]] :collapse: False **Example 4** .. code-block:: jinja .. req:: Result 4 :links: sum_input_1; sum_input_3 :amount: [[calc_sum("hours", "hours.isdigit() and float(hours) > 10", "True")]] .. req:: Result 4 :links: sum_input_1; sum_input_3 :amount: [[calc_sum("hours", "hours.isdigit() and float(hours) > 10", "True")]] :collapse: False :param option: Options, from which the numbers shall be taken :param filter: Filter string, which all needs must passed to get their value added. :param links_only: If "True", only linked needs are taken into account. :return: A float number """

    if not links_only:
        check_needs = needs.values()
    else:
        check_needs = []
        for link in need["links"]:
            check_needs.append(needs[link])

    calculated_sum = 0

    for check_need in check_needs:
        if filter is not None:
            try:
                if not filter_single_need(check_need, filter):
                    continue
            except ValueError as e:
                pass
            except NeedInvalidFilter as ex:
                logger.warning('Given filter is not valid. Error: {}'.format(ex))
        try:
            calculated_sum += float(check_need[option])
        except ValueError:
            pass

    return calculated_sum