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