Class: Marty::ReportForm

Inherits:
Form
  • Object
show all
Defined in:
app/components/marty/report_form.rb

Constant Summary

Constants included from Permissions

Permissions::ALL_ROLES, Permissions::REQ_ROLES

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Permissions

#can_perform_action?, #can_perform_actions, #current_user_roles, #has_any_perm?, #has_marty_permissions

Class Method Details

.get_report_engine(params) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'app/components/marty/report_form.rb', line 33

def self.get_report_engine(params)
  d_params = ActiveSupport::JSON.decode(params[:data] || "{}")
  d_params.each_pair do |k,v|
    d_params[k] = nil if v.blank? || v == "null"
  end

  tag_id      = d_params.delete("selected_tag_id")
  script_name = d_params.delete("selected_script_name")
  node        = d_params.delete("selected_node")

  engine = Marty::ScriptSet.new(tag_id).get_engine(script_name)

  roles = engine.evaluate(node, "roles", {}) rescue nil

  if roles && !roles.any?{ |r| Marty::User.has_role(r) }
    # insufficient permissions
    return []
  end

  d_params["p_title"] ||= engine.evaluate(node, "title", {}).to_s

  [engine, d_params, node]
end

.run_eval(params) ⇒ Object



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'app/components/marty/report_form.rb', line 57

def self.run_eval(params)
  engine, d_params, node = get_report_engine(params)

  raise "Insufficient permissions" unless engine
  raise "no selected report node" unless String === node

  begin
    engine.evaluate(node, "result", d_params)
  rescue => exc
    Marty::Util.logger.error "run_eval failed: #{exc.backtrace}"

    res = Delorean::Engine.grok_runtime_exception(exc)
    res["backtrace"] =
      res["backtrace"].map {|m, line, fn| "#{m}:#{line} #{fn}"}.join('\n')
    res
  end
end

Instance Method Details

#configure(c) ⇒ Object



203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
# File 'app/components/marty/report_form.rb', line 203

def configure(c)
  super

  unless root_sess[:selected_script_name] && root_sess[:selected_node]
    c.title = "No Report selected."
    return
  end

  begin
    sset = Marty::ScriptSet.new(root_sess[:selected_tag_id])
    engine = sset.get_engine(root_sess[:selected_script_name])

    raise engine.to_s if engine.is_a?(Hash)

    items, title, format = engine.
      evaluate(root_sess[:selected_node],
                     ["form", "title", "format"],
                     {},
                     )

    raise "bad form items" unless items.is_a?(Array)
    raise "bad format" unless
      Marty::ContentHandler::GEN_FORMATS.member?(format)

  rescue => exc
    c.title = "ERROR"
    c.items =
      [
       {
         field_label: 'Exception',
         xtype:       :displayfield,
         name:        'displayfield1',
         value:       "<span style=\"color:red;\">#{exc}</span>"
       },
      ]
    return
  end

  # if there's a background_only flag, we disable the foreground submit
  background_only =
    engine.evaluate(root_sess[:selected_node], "background_only") rescue nil

  items = Marty::Xl.symbolize_keys(eval_form_items(engine, items), ':')

  items = [{html: "<br><b>No input is needed for this report.</b>"}] if
    items.empty?

  # add hidden fields for selected tag/script/node
  items += [:selected_tag_id,
            :selected_script_name,
            :selected_node,
            # just for testing
            :selected_testing,
           ].map { |f|
    {
      name:   f,
      xtype:  :textfield,
      hidden: true,
      value:  root_sess[f],
    }
  }

  c.items              = items
  c.repformat          = format
  c.title              = "Generate: #{title}-#{sset.tag.name}"
  c.reptitle           = title
  c.authenticity_token = controller.send(:form_authenticity_token)

  [:foreground, :link].each{|a| actions[a].disabled = !!background_only}
end

#default_bbarObject



25
26
27
28
29
# File 'app/components/marty/report_form.rb', line 25

def default_bbar
  [
    '->', :apply, :foreground, :link
  ]
end

#eval_form_items(engine, items) ⇒ Object



179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
# File 'app/components/marty/report_form.rb', line 179

def eval_form_items(engine, items)
  case items
  when Array
    items.map {|x| eval_form_items(engine, x)}
  when Hash
    items.each_with_object({}) { |(key, value), result|
      result[key] = eval_form_items(engine, value)
    }
  when String
    items.starts_with?(':') ? items[1..-1].to_sym : items
  when Class
    raise "bad value in form #{items}" unless
      items < Delorean::BaseModule::BaseClass

    attrs = engine.enumerate_attrs_by_node(items)

    engine.eval_to_hash(items, attrs, {})
  when Numeric, TrueClass, FalseClass
    items
  else
    raise "bad value in form #{items}"
  end
end