class TaskJuggler::RTFQuery

This class is a specialized RichTextFunctionHandler that can be used to query the value of a project or property attribute.

Public Class Methods

new(project, sourceFileInfo = nil) click to toggle source
Calls superclass method
# File lib/taskjuggler/RichText/RTFQuery.rb, line 23
def initialize(project, sourceFileInfo = nil)
  @project = project
  super('query', sourceFileInfo)
  @blockMode = false
end

Public Instance Methods

to_html(args) click to toggle source

Return a XMLElement tree that represents the navigator in HTML code.

# File lib/taskjuggler/RichText/RTFQuery.rb, line 41
def to_html(args)
  return nil unless (query = prepareQuery(args))
  if query.ok
    if (rti = query.to_rti)
      rti.to_html
    elsif (str = query.to_s)
      XMLText.new(str)
    else
      nil
    end
  else
    error('query_error', query.errorMessage + recreateQuerySyntax(args))
    font = XMLElement.new('font', 'color' => '#FF0000')
    font << XMLText.new('Query Error: ' + query.errorMessage)
    font
  end
end
to_s(args) click to toggle source

Return the result of the query as String.

# File lib/taskjuggler/RichText/RTFQuery.rb, line 30
def to_s(args)
  return '' unless (query = prepareQuery(args))
  if query.ok
    query.to_s
  else
    error('query_error', query.errorMessage + recreateQuerySyntax(args))
    'Query Error: ' + query.errorMessage
  end
end
to_tagged(args) click to toggle source

Not supported for this function.

# File lib/taskjuggler/RichText/RTFQuery.rb, line 60
def to_tagged(args)
  nil
end

Private Instance Methods

prepareQuery(args) click to toggle source
# File lib/taskjuggler/RichText/RTFQuery.rb, line 66
def prepareQuery(args)
  unless @query
    raise "No Query has been registered for this RichText yet!"
  end

  query = @query.dup

  # Check the user provided arguments. Only the following list is allowed.
  validArgs = %w( attribute currencyformat end family journalattributes
                  journalmode loadunit numberformat property scenario
                  scopeproperty start timeformat )
  expandedArgs = {}
  args.each do |arg, value|
    unless validArgs.include?(arg)
      error('bad_query_parameter', "Unknown query parameter '#{arg}'. " +
            "Use one of #{validArgs.join(', ')}!")
      return nil
    end
    expandedArgs[arg] =
      SimpleQueryExpander.new(value, @query, @sourceFileInfo).expand
  end

  if (expandedArgs['property'] || expandedArgs['scopeproperty']) &&
      !(expandedArgs['family'] || @query.propertyType)
    error('missing_family',
          "If you provide a property or scope property you need to " +
          "provide a family type as well.")
  end

  # Every provided query parameter will overwrite the corresponding value
  # in the Query that was provided by the ReportContext.  The name of the
  # arguments don't always exactly match the Query variables Let's start
  # with the easy ones.
  if expandedArgs['property']
    query.propertyId = expandedArgs['property']
    query.property = nil
  end
  if expandedArgs['scopeproperty']
    query.scopePropertyId = expandedArgs['scopeproperty']
    query.scopeProperty = nil
  end
  query.attributeId = expandedArgs['attribute'] if expandedArgs['attribute']
  query.start = TjTime.new(expandedArgs['start']) if expandedArgs['start']
  query.end = TjTime.new(expandedArgs['end']) if expandedArgs['end']
  if expandedArgs['numberformat']
    query.numberFormat = expandedArgs['numberformat']
  end
  query.timeFormat = expandedArgs['timeformat'] if expandedArgs['timeformat']
  if expandedArgs['currencyformat']
    query.currencyFormat = expandedArgs['currencyformat']
  end
  query.project = @project

  # And now the slighly more complicated ones.
  setScenarioIdx(query, expandedArgs)
  setPropertyType(query, expandedArgs)
  setLoadUnit(query, expandedArgs)
  setJournalMode(query, expandedArgs)
  setJournalAttributes(query, expandedArgs)

  # Now that we have put together the query, we can process it and return
  # the query object for result extraction.
  query.process
  query
end
recreateQuerySyntax(args) click to toggle source

Regenerate the original query text based on the argument list.

# File lib/taskjuggler/RichText/RTFQuery.rb, line 133
def recreateQuerySyntax(args)
  queryText = "\n<-query"
  args.each do |a, v|
    queryText += " #{a}=\"#{v}\""
  end
  queryText += "->"
end
setJournalAttributes(query, args) click to toggle source
# File lib/taskjuggler/RichText/RTFQuery.rb, line 196
def setJournalAttributes(query, args)
  if (attrListStr = args['journalattributes'])
    attrs = attrListStr.split(', ').map { |a| a.delete(' ') }
    query.journalAttributes = []
    validAttrs = %w( author date details flags headline property propertyid
                     summary timesheet )
    attrs.each do |attr|
      if validAttrs.include?(attr)
        query.journalAttributes << attr
      else
        error('rtfq_bad_journalattr',
              "Unknown journalattribute #{attr}. Must be one of " +
              "#{validAttrs.join(', ')}.")
      end
    end
  elsif !query.journalAttributes
    query.journalAttributes = %w( date summary details )
  end
end
setJournalMode(query, args) click to toggle source
# File lib/taskjuggler/RichText/RTFQuery.rb, line 182
def setJournalMode(query, args)
  if (mode = args['journalmode'])
    validModes = %w( journal journal_sub status_up status_down alerts_down )
    unless validModes.include?(mode)
      error('rtfq_bad_journalmode',
            "Unknown journalmode #{mode}. Must be one of " +
            "#{validModes.join(', ')}.")
    end
    query.journalMode = mode.intern
  elsif !query.journalMode
    query.journalMode = :journal
  end
end
setLoadUnit(query, args) click to toggle source
# File lib/taskjuggler/RichText/RTFQuery.rb, line 161
def setLoadUnit(query, args)
  units = {
    'days' => :days, 'hours' => :hours, 'longauto' => :longauto,
    'minutes' => :minutes, 'months' => :months, 'quarters' => :quarters,
    'shortauto' => :shortauto, 'weeks' => :weeks, 'years' => :years
  }
  query.loadUnit = units[args['loadunit']] if args['loadunit']
end
setPropertyType(query, args) click to toggle source
# File lib/taskjuggler/RichText/RTFQuery.rb, line 141
def setPropertyType(query, args)
  validTypes = { 'account' => :Account,
                 'task' => :Task,
                 'resource' => :Resource }

  if args['family']
    unless validTypes[args['family']]
      error('rtfq_bad_query_family',
            "Unknown query family type '#{args['family']}'. " +
            "Use one of #{validTypes.keys.join(', ')}!")
    end
    query.propertyType = validTypes[args['family']]
    if query.propertyType == :Task
      query.scopePropertyType = :Resource
    elsif query.propertyType == :Resource
      query.scopePropertyType = :Task
    end
  end
end
setScenarioIdx(query, args) click to toggle source
# File lib/taskjuggler/RichText/RTFQuery.rb, line 170
def setScenarioIdx(query, args)
  if args['scenario']
    scenarioIdx = @project.scenarioIdx(args['scenario'])
    unless scenarioIdx
      error('rtfq_bad_scenario', "Unknown scenario #{args['scenario']}")
    end
    query.scenarioIdx = scenarioIdx
  end
  # Default to 0 in case no scenario was provided.
  query.scenarioIdx = 0 unless query.scenarioIdx
end