marty 0.5.15 → 0.5.16
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +27 -0
- data/.rspec +3 -0
- data/.travis.yml +23 -0
- data/Gemfile +23 -0
- data/INDEPENDENCE_ISSUES.md +23 -0
- data/app/assets/images/marty/.gitkeep +0 -0
- data/app/components/marty/report_form.rb +9 -4
- data/gemini_deprecations.md +6 -0
- data/lib/marty/data_change.rb +99 -0
- data/lib/marty/data_conversion.rb +11 -3
- data/lib/marty/data_exporter.rb +9 -0
- data/lib/marty/version.rb +1 -1
- data/marty.gemspec +35 -0
- data/script/rails +8 -0
- data/spec/controllers/application_controller_spec.rb +52 -0
- data/spec/controllers/job_controller_spec.rb +226 -0
- data/spec/controllers/rpc_controller_spec.rb +379 -0
- data/spec/controllers/rpc_import_spec.rb +45 -0
- data/spec/dummy/README.rdoc +261 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/assets/javascripts/application.js +15 -0
- data/spec/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/controllers/components_controller.rb +7 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/mailers/.gitkeep +0 -0
- data/spec/dummy/app/models/.gitkeep +0 -0
- data/spec/dummy/app/models/gemini/amortization_type.rb +5 -0
- data/spec/dummy/app/models/gemini/bud_category.rb +7 -0
- data/spec/dummy/app/models/gemini/entity.rb +2 -0
- data/spec/dummy/app/models/gemini/extras/data_import.rb +5 -0
- data/spec/dummy/app/models/gemini/extras/settlement_import.rb +28 -0
- data/spec/dummy/app/models/gemini/fannie_bup.rb +29 -0
- data/spec/dummy/app/models/gemini/grouping.rb +8 -0
- data/spec/dummy/app/models/gemini/grouping_head_version.rb +14 -0
- data/spec/dummy/app/models/gemini/head.rb +7 -0
- data/spec/dummy/app/models/gemini/head_version.rb +14 -0
- data/spec/dummy/app/models/gemini/helper.rb +44 -0
- data/spec/dummy/app/models/gemini/loan_program.rb +11 -0
- data/spec/dummy/app/models/gemini/mortgage_type.rb +5 -0
- data/spec/dummy/app/models/gemini/simple.rb +6 -0
- data/spec/dummy/app/models/gemini/streamline_type.rb +16 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +82 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/database.yml.example +10 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +35 -0
- data/spec/dummy/config/environments/production.rb +69 -0
- data/spec/dummy/config/environments/test.rb +39 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/delayed_job.rb +5 -0
- data/spec/dummy/config/initializers/inflections.rb +15 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +12 -0
- data/spec/dummy/db/migrate/20140801000000_create_groupings.rb +11 -0
- data/spec/dummy/db/migrate/20150406171536_create_categories.rb +27 -0
- data/spec/dummy/db/migrate/20150408200916_create_loan_programs.rb +26 -0
- data/spec/dummy/db/migrate/20150408201429_create_types.rb +21 -0
- data/spec/dummy/db/migrate/20150420000001_create_heads.rb +14 -0
- data/spec/dummy/db/migrate/20150420000002_create_head_versions.rb +15 -0
- data/spec/dummy/db/migrate/20150420000003_create_grouping_head_versions.rb +12 -0
- data/spec/dummy/db/migrate/20151023000001_create_simple.rb +12 -0
- data/spec/dummy/db/seeds.rb +8 -0
- data/spec/dummy/delorean/blame_report.dl +171 -0
- data/spec/dummy/delorean/data_report.dl +105 -0
- data/spec/dummy/delorean/fields.dl +52 -0
- data/spec/dummy/delorean/styles.dl +134 -0
- data/spec/dummy/lib/assets/.gitkeep +0 -0
- data/spec/dummy/lib/class_list.rb +3 -0
- data/spec/dummy/log/.gitkeep +0 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +25 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/public/icons/READ.txt +3 -0
- data/spec/dummy/public/icons/application_cascade.png +0 -0
- data/spec/dummy/public/icons/application_delete.png +0 -0
- data/spec/dummy/public/icons/application_put.png +0 -0
- data/spec/dummy/public/icons/application_view_detail.png +0 -0
- data/spec/dummy/public/icons/arrow_in.png +0 -0
- data/spec/dummy/public/icons/arrow_refresh.png +0 -0
- data/spec/dummy/public/icons/database_save.png +0 -0
- data/spec/dummy/public/icons/door_in.png +0 -0
- data/spec/dummy/public/icons/door_out.png +0 -0
- data/spec/dummy/public/icons/group.png +0 -0
- data/spec/dummy/public/icons/page_lightning.png +0 -0
- data/spec/dummy/public/icons/printer.png +0 -0
- data/spec/dummy/public/icons/report_disk.png +0 -0
- data/spec/dummy/public/icons/report_go.png +0 -0
- data/spec/dummy/public/icons/report_magnify.png +0 -0
- data/spec/dummy/public/icons/script.png +0 -0
- data/spec/dummy/public/icons/script_add.png +0 -0
- data/spec/dummy/public/icons/script_go.png +0 -0
- data/spec/dummy/public/icons/script_key.png +0 -0
- data/spec/dummy/public/icons/table_go.png +0 -0
- data/spec/dummy/public/icons/time.png +0 -0
- data/spec/dummy/public/icons/time_add.png +0 -0
- data/spec/dummy/public/icons/time_go.png +0 -0
- data/spec/dummy/public/icons/timeline_marker.png +0 -0
- data/spec/dummy/public/icons/user_add.png +0 -0
- data/spec/dummy/public/icons/user_delete.png +0 -0
- data/spec/dummy/public/icons/user_edit.png +0 -0
- data/spec/dummy/public/icons/wrench.png +0 -0
- data/spec/dummy/script/delayed_job +6 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/features/javascripts/job_dashboard_live_search.js.coffee +8 -0
- data/spec/features/javascripts/login.js.coffee +8 -0
- data/spec/features/jobs_dashboard_netzke_spec.rb +24 -0
- data/spec/features/jobs_dashboard_spec.rb +49 -0
- data/spec/fixtures/scripts/load_tests/script1.dl +2 -0
- data/spec/fixtures/scripts/load_tests/script2.dl +2 -0
- data/spec/job_helper.rb +102 -0
- data/spec/lib/data_exporter_spec.rb +71 -0
- data/spec/lib/data_importer_spec.rb +461 -0
- data/spec/lib/xl_spec.rb +198 -0
- data/spec/lib/xl_styles_spec.rb +115 -0
- data/spec/models/api_auth_spec.rb +187 -0
- data/spec/models/posting_spec.rb +107 -0
- data/spec/models/promise_spec.rb +65 -0
- data/spec/models/script_spec.rb +187 -0
- data/spec/models/user_spec.rb +68 -0
- data/spec/requests/routes_spec.rb +12 -0
- data/spec/spec_helper.rb +61 -0
- data/spec/support/clean_db_helpers.rb +18 -0
- data/spec/support/delayed_job_helpers.rb +12 -0
- data/spec/support/user_helpers.rb +12 -0
- metadata +139 -89
- data/app/components/marty/auth_app.rb~ +0 -51
- data/app/components/marty/auth_app/javascripts/auth_app.js~ +0 -91
- data/app/components/marty/cm_form_panel.rb~ +0 -5
- data/app/components/marty/cm_grid_panel.rb~ +0 -35
- data/app/components/marty/data_import_view.rb~ +0 -142
- data/app/components/marty/extras/layout.rb~ +0 -46
- data/app/components/marty/live_search_grid_panel.rb~ +0 -49
- data/app/components/marty/main_auth_app.rb~ +0 -238
- data/app/components/marty/mcfly_grid_panel.rb~ +0 -80
- data/app/components/marty/new_posting_form.rb~ +0 -46
- data/app/components/marty/new_posting_window.rb~ +0 -21
- data/app/components/marty/pivot_grid.rb +0 -52
- data/app/components/marty/pivot_grid/endpoints.rb +0 -45
- data/app/components/marty/pivot_grid/javascripts/extensions.js +0 -150
- data/app/components/marty/pivot_grid/javascripts/pivot_grid.js +0 -86
- data/app/components/marty/pivot_grid/services.rb +0 -44
- data/app/components/marty/posting_grid.rb~ +0 -140
- data/app/components/marty/promise_view.rb~ +0 -157
- data/app/components/marty/promise_view/stylesheets/promise_view.css~ +0 -15
- data/app/components/marty/report_form.rb~ +0 -217
- data/app/components/marty/report_select.rb~ +0 -133
- data/app/components/marty/reporting.rb~ +0 -39
- data/app/components/marty/script_detail.rb~ +0 -430
- data/app/components/marty/script_form.rb~ +0 -233
- data/app/components/marty/script_form/javascripts/Ext.ux.form.field.CodeMirror.js~ +0 -909
- data/app/components/marty/script_grid.rb~ +0 -99
- data/app/components/marty/script_tester.rb~ +0 -213
- data/app/components/marty/scripting.rb~ +0 -124
- data/app/components/marty/select_report.rb~ +0 -143
- data/app/components/marty/simple_app.rb~ +0 -101
- data/app/components/marty/tag_grid.rb~ +0 -89
- data/app/components/marty/tree_panel.rb~ +0 -256
- data/app/components/marty/tree_panel/javascripts/tree_panel.js~ +0 -317
- data/app/components/marty/user_pivot.rb +0 -128
- data/app/components/marty/user_view.rb~ +0 -188
- data/app/controllers/marty/application_controller.rb~ +0 -133
- data/app/controllers/marty/components_controller.rb~ +0 -37
- data/app/controllers/marty/job_controller.rb~ +0 -28
- data/app/controllers/marty/rpc_controller.rb~ +0 -61
- data/app/helpers/marty/script_set.rb~ +0 -59
- data/app/models/marty/api_auth.rb~ +0 -48
- data/app/models/marty/data_change.rb~ +0 -141
- data/app/models/marty/enum.rb~ +0 -16
- data/app/models/marty/import_type.rb~ +0 -48
- data/app/models/marty/poop.rb~ +0 -169
- data/app/models/marty/posting.rb~ +0 -86
- data/app/models/marty/posting_type.rb~ +0 -21
- data/app/models/marty/promise.rb~ +0 -196
- data/app/models/marty/role.rb~ +0 -10
- data/app/models/marty/script.rb~ +0 -62
- data/app/models/marty/tag.rb~ +0 -91
- data/app/models/marty/user.rb~ +0 -148
- data/app/models/marty/user_role.rb~ +0 -13
- data/app/views/layouts/marty/application.html.erb~ +0 -11
- data/config/routes.rb~ +0 -10
- data/db/migrate/019_create_marty_postings.rb~ +0 -19
- data/db/migrate/095_create_marty_tags.rb~ +0 -19
- data/lib/marty.rb~ +0 -13
- data/lib/marty/content_handler.rb~ +0 -93
- data/lib/marty/data_exporter.rb~ +0 -137
- data/lib/marty/data_importer.rb~ +0 -114
- data/lib/marty/data_row_processor.rb~ +0 -206
- data/lib/marty/drop_folder_hook.rb~ +0 -17
- data/lib/marty/folder_hook.rb~ +0 -9
- data/lib/marty/lazy_column_loader.rb~ +0 -47
- data/lib/marty/mcfly_query.rb~ +0 -188
- data/lib/marty/migrations.rb~ +0 -65
- data/lib/marty/monkey.rb~ +0 -160
- data/lib/marty/permissions.rb~ +0 -69
- data/lib/marty/promise.rb~ +0 -41
- data/lib/marty/promise_job.rb~ +0 -121
- data/lib/marty/promise_proxy.rb~ +0 -69
- data/lib/marty/util.rb~ +0 -80
- data/lib/marty/version.rb~ +0 -3
- data/lib/marty/xl.rb~ +0 -526
- data/lib/pyxll/README.txt~ +0 -16
- data/lib/pyxll/gemini.py~ +0 -110
- data/lib/pyxll/pyxll.cfg~ +0 -12
@@ -1,44 +0,0 @@
|
|
1
|
-
class Marty::PivotGrid < Netzke::Base
|
2
|
-
module Services
|
3
|
-
# Implementation for the "server_read" endpoint
|
4
|
-
def read(params = {})
|
5
|
-
{}.tap do |res|
|
6
|
-
records = get_records(params)
|
7
|
-
res[:data] = records.map{|r| data_adapter.record_to_array(r, final_columns(:with_meta => true))}
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
# Returns an array of records.
|
12
|
-
def get_records(params)
|
13
|
-
params[:query] = normalize_query(params[:query]) if params[:query].present?
|
14
|
-
if config[:enable_pagination]
|
15
|
-
params[:limit] = config[:rows_per_page]
|
16
|
-
else
|
17
|
-
params.delete(:limit)
|
18
|
-
end
|
19
|
-
params[:scope] = config[:scope] # note, params[:scope] becomes ActiveSupport::HashWithIndifferentAccess
|
20
|
-
|
21
|
-
data_adapter.get_records(params, final_columns)
|
22
|
-
end
|
23
|
-
|
24
|
-
def count_records(params)
|
25
|
-
params[:scope] = config[:scope] # note, params[:scope] becomes ActiveSupport::HashWithIndifferentAccess
|
26
|
-
|
27
|
-
data_adapter.count_records(params, final_columns)
|
28
|
-
end
|
29
|
-
|
30
|
-
# Override this method to react on each operation that caused changing of data
|
31
|
-
def on_data_changed
|
32
|
-
end
|
33
|
-
|
34
|
-
protected
|
35
|
-
|
36
|
-
def normalize_query(or_query)
|
37
|
-
or_query.each do |and_query|
|
38
|
-
and_query.each do |q|
|
39
|
-
column_config = final_columns_hash[q[:attr].to_sym] || {}
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
@@ -1,140 +0,0 @@
|
|
1
|
-
class Marty::PostingGrid < Marty::CmGridPanel
|
2
|
-
has_marty_permissions read: :any,
|
3
|
-
delete: :any # delete is hijacked for a select
|
4
|
-
|
5
|
-
def configure(c)
|
6
|
-
super
|
7
|
-
|
8
|
-
c.header = false
|
9
|
-
c.model = "Marty::Posting"
|
10
|
-
c.columns = [:name, :created_dt, :user__name, :comment]
|
11
|
-
c.data_store.sorters = {property: :created_dt, direction: 'DESC'}
|
12
|
-
end
|
13
|
-
|
14
|
-
# hijacking delete button
|
15
|
-
action :del do |a|
|
16
|
-
a.text = "Select"
|
17
|
-
a.tooltip = "Select"
|
18
|
-
a.icon = :time_go
|
19
|
-
a.disabled = true
|
20
|
-
end
|
21
|
-
|
22
|
-
js_configure do |c|
|
23
|
-
c.init_component = <<-JS
|
24
|
-
function() {
|
25
|
-
this.callParent();
|
26
|
-
// Set single selection mode. FIXME: can this be done on config?
|
27
|
-
this.getSelectionModel().setSelectionMode('SINGLE');
|
28
|
-
this.getSelectionModel().on('selectionchange', function(selModel) {
|
29
|
-
this.actions.detail &&
|
30
|
-
this.actions.detail.setDisabled(!selModel.hasSelection());
|
31
|
-
}, this);
|
32
|
-
|
33
|
-
var me = this;
|
34
|
-
me.getView().on('itemkeydown', function(view, record, item, index, e) {
|
35
|
-
if (e.getKey() === e.SPACE) {
|
36
|
-
record_id = me.getSelectionModel().selected.first().getId();
|
37
|
-
me.getView().fireEvent('itemclick', me, record);
|
38
|
-
me.serverDetail({record_id: record_id});
|
39
|
-
var rowIndex = me.find('id', record.getId());
|
40
|
-
me.getView().select(rowIndex);
|
41
|
-
}
|
42
|
-
});
|
43
|
-
}
|
44
|
-
JS
|
45
|
-
|
46
|
-
c.detail = <<-JS
|
47
|
-
function() {
|
48
|
-
record_id = this.getSelectionModel().selected.first().getId();
|
49
|
-
this.serverDetail({record_id: record_id});
|
50
|
-
}
|
51
|
-
JS
|
52
|
-
|
53
|
-
c.show_detail = <<-JS
|
54
|
-
function(details) {
|
55
|
-
Ext.create('Ext.Window', {
|
56
|
-
height: 150,
|
57
|
-
minWidth: 250,
|
58
|
-
autoWidth: true,
|
59
|
-
modal: true,
|
60
|
-
autoScroll: true,
|
61
|
-
html: details,
|
62
|
-
title: "Posting Details"
|
63
|
-
}).show();
|
64
|
-
}
|
65
|
-
JS
|
66
|
-
|
67
|
-
c.on_del = <<-JS
|
68
|
-
function() {
|
69
|
-
var records = [];
|
70
|
-
var me = this;
|
71
|
-
me.getSelectionModel().selected.each(function(r) {
|
72
|
-
records.push(r.getId());
|
73
|
-
}, me);
|
74
|
-
|
75
|
-
// find the root component (main application)
|
76
|
-
var main_app = me;
|
77
|
-
while (1) {
|
78
|
-
var p = main_app.netzkeGetParentComponent();
|
79
|
-
if (!p) { break; }
|
80
|
-
main_app = p;
|
81
|
-
}
|
82
|
-
|
83
|
-
// assumes main_app has serverSelectPosting method
|
84
|
-
main_app.serverSelectPosting(records);
|
85
|
-
}
|
86
|
-
JS
|
87
|
-
end
|
88
|
-
|
89
|
-
def default_bbar
|
90
|
-
[:del, :detail]
|
91
|
-
end
|
92
|
-
|
93
|
-
action :detail do |a|
|
94
|
-
a.text = "Detail"
|
95
|
-
a.icon = :application_view_detail
|
96
|
-
a.handler = :detail
|
97
|
-
a.disabled = true
|
98
|
-
end
|
99
|
-
|
100
|
-
endpoint :server_detail do |params, this|
|
101
|
-
record_id = params[:record_id]
|
102
|
-
|
103
|
-
# Prepare an HTML popup with session details such that the
|
104
|
-
# contents can be easily pasted into a spreadsheet.
|
105
|
-
|
106
|
-
pt = Marty::Posting.find_by_id(record_id)
|
107
|
-
|
108
|
-
dt = pt.created_dt.to_s == 'Infinity' ? '---' :
|
109
|
-
pt.created_dt.strftime('%Y-%m-%d %I:%M %p')
|
110
|
-
|
111
|
-
html =
|
112
|
-
"<b>Name:</b>\t#{pt.name}<br/>" +
|
113
|
-
"<b>Date/Time:</b>\t#{dt}<br/>" +
|
114
|
-
"<b>User:</b>\t#{pt.user.name}<br/>" +
|
115
|
-
"<b>Comment:</b>\t#{pt.comment}"
|
116
|
-
|
117
|
-
this.show_detail html
|
118
|
-
end
|
119
|
-
|
120
|
-
column :name do |c|
|
121
|
-
c.flex = 1
|
122
|
-
end
|
123
|
-
|
124
|
-
column :created_dt do |c|
|
125
|
-
c.text = "Date/Time"
|
126
|
-
c.format = "Y-m-d H:i"
|
127
|
-
c.hidden = true
|
128
|
-
end
|
129
|
-
|
130
|
-
column :user__name do |c|
|
131
|
-
c.width = 100
|
132
|
-
end
|
133
|
-
|
134
|
-
column :comment do |c|
|
135
|
-
c.width = 100
|
136
|
-
end
|
137
|
-
|
138
|
-
end
|
139
|
-
|
140
|
-
PostingGrid = Marty::PostingGrid
|
@@ -1,157 +0,0 @@
|
|
1
|
-
class Marty::PromiseView < Marty::TreePanel
|
2
|
-
extend Marty::Permissions
|
3
|
-
|
4
|
-
css_configure do |c|
|
5
|
-
c.require :promise_view
|
6
|
-
end
|
7
|
-
|
8
|
-
js_configure do |c|
|
9
|
-
c.default_get_row_class = <<-JS
|
10
|
-
function(record, index, rowParams, ds) {
|
11
|
-
var status = record.get('status');
|
12
|
-
if (status === false) return "red-row";
|
13
|
-
if (status === true) return "green-row";
|
14
|
-
return "orange-row";
|
15
|
-
}
|
16
|
-
JS
|
17
|
-
end
|
18
|
-
|
19
|
-
def configure(c)
|
20
|
-
c.title = I18n.t("jobs.promise_view")
|
21
|
-
c.model = "Marty::Promise"
|
22
|
-
c.columns = [
|
23
|
-
:parent,
|
24
|
-
:user__login,
|
25
|
-
:job_id,
|
26
|
-
:start_dt,
|
27
|
-
:end_dt,
|
28
|
-
:status,
|
29
|
-
:cformat,
|
30
|
-
:error,
|
31
|
-
]
|
32
|
-
c.treecolumn = :parent
|
33
|
-
super
|
34
|
-
|
35
|
-
c.data_store.sorters = {
|
36
|
-
property: "id",
|
37
|
-
direction: 'DESC',
|
38
|
-
}
|
39
|
-
|
40
|
-
# garbage collect old promises (hacky to do this here)
|
41
|
-
Marty::Promise.cleanup(false)
|
42
|
-
end
|
43
|
-
|
44
|
-
def bbar
|
45
|
-
[:clear, '->', :refresh, :download]
|
46
|
-
end
|
47
|
-
|
48
|
-
js_configure do |c|
|
49
|
-
c.init_component = <<-JS
|
50
|
-
function() {
|
51
|
-
this.callParent();
|
52
|
-
this.getSelectionModel().on('selectionchange', function(selModel) {
|
53
|
-
this.actions.download &&
|
54
|
-
this.actions.download.setDisabled(!selModel.hasSelection());
|
55
|
-
}, this);
|
56
|
-
}
|
57
|
-
JS
|
58
|
-
|
59
|
-
c.on_download = <<-JS
|
60
|
-
function() {
|
61
|
-
var jid = this.getSelectionModel().selected.first().getId();
|
62
|
-
// FIXME: seems pretty hacky
|
63
|
-
window.location = "#{Marty::Util.marty_path}/job/download?job_id=" + jid;
|
64
|
-
}
|
65
|
-
JS
|
66
|
-
|
67
|
-
c.on_refresh = <<-JS
|
68
|
-
function() {
|
69
|
-
this.store.load();
|
70
|
-
}
|
71
|
-
JS
|
72
|
-
|
73
|
-
c.on_clear = <<-JS
|
74
|
-
function(params) {
|
75
|
-
var me = this;
|
76
|
-
Ext.Msg.prompt('Clear All Jobs',
|
77
|
-
'Enter CLEAR and press OK to clear all previous jobs',
|
78
|
-
function (btn, value) {
|
79
|
-
(btn == "ok" && value == "CLEAR") && me.serverClear({});
|
80
|
-
});
|
81
|
-
}
|
82
|
-
JS
|
83
|
-
end
|
84
|
-
|
85
|
-
action :clear do |a|
|
86
|
-
a.text = a.tooltip = 'Clear'
|
87
|
-
a.disabled = false
|
88
|
-
a.icon = :application_delete
|
89
|
-
a.hidden = !self.class.has_admin_perm?
|
90
|
-
end
|
91
|
-
|
92
|
-
action :download do |a|
|
93
|
-
a.text = a.tooltip = 'Download'
|
94
|
-
a.disabled = true
|
95
|
-
a.icon = :application_put
|
96
|
-
end
|
97
|
-
|
98
|
-
action :refresh do |a|
|
99
|
-
a.text = a.tooltip = 'Refresh'
|
100
|
-
a.disabled = false
|
101
|
-
a.icon = :arrow_refresh
|
102
|
-
end
|
103
|
-
|
104
|
-
endpoint :server_clear do |params, this|
|
105
|
-
Marty::Promise.cleanup(true)
|
106
|
-
this.on_refresh
|
107
|
-
end
|
108
|
-
|
109
|
-
def get_children(params)
|
110
|
-
params[:scope] = config[:scope]
|
111
|
-
|
112
|
-
parent_id = params[:node]
|
113
|
-
parent_id = nil if parent_id == 'root'
|
114
|
-
|
115
|
-
scope_data_class(params) do
|
116
|
-
data_class.where(parent_id: parent_id).scoping do
|
117
|
-
data_adapter.get_records(params, final_columns)
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
column :parent do |c|
|
123
|
-
c.text = 'Job Name'
|
124
|
-
c.getter = lambda { |r| r.title }
|
125
|
-
c.width = 275
|
126
|
-
end
|
127
|
-
|
128
|
-
column :status do |c|
|
129
|
-
c.hidden = true
|
130
|
-
# FIXME: TreePanel appears to not work with hidden boolean cols
|
131
|
-
c.xtype = 'numbercolumn'
|
132
|
-
end
|
133
|
-
|
134
|
-
column :user__login do |c|
|
135
|
-
c.text = I18n.t('jobs.user_login')
|
136
|
-
end
|
137
|
-
|
138
|
-
column :start_dt do |c|
|
139
|
-
c.text = I18n.t('jobs.start_dt')
|
140
|
-
end
|
141
|
-
|
142
|
-
column :end_dt do |c|
|
143
|
-
c.text = I18n.t('jobs.end_dt')
|
144
|
-
end
|
145
|
-
|
146
|
-
column :error do |c|
|
147
|
-
c.getter = lambda {|r| r.result.to_s if r.status == false}
|
148
|
-
c.flex = 1
|
149
|
-
end
|
150
|
-
|
151
|
-
column :cformat do |c|
|
152
|
-
c.text = "Format"
|
153
|
-
end
|
154
|
-
|
155
|
-
end
|
156
|
-
|
157
|
-
PromiseView = Marty::PromiseView
|
@@ -1,217 +0,0 @@
|
|
1
|
-
require 'delorean_lang'
|
2
|
-
|
3
|
-
class Marty::ReportForm < Marty::CmFormPanel
|
4
|
-
|
5
|
-
# override apply for background generation
|
6
|
-
action :apply do |a|
|
7
|
-
a.text = a.tooltip = I18n.t("reporting.background")
|
8
|
-
a.handler = :on_apply
|
9
|
-
a.icon = :report_disk
|
10
|
-
a.disabled = false
|
11
|
-
end
|
12
|
-
|
13
|
-
action :generate do |a|
|
14
|
-
a.text = a.tooltip = I18n.t("reporting.generate")
|
15
|
-
a.handler = :on_generate
|
16
|
-
a.icon = :report_go
|
17
|
-
a.disabled = false
|
18
|
-
end
|
19
|
-
|
20
|
-
######################################################################
|
21
|
-
|
22
|
-
def configure_bbar(c)
|
23
|
-
c[:bbar] = ['->', :apply, :generate]
|
24
|
-
end
|
25
|
-
|
26
|
-
######################################################################
|
27
|
-
|
28
|
-
def _get_report_engine(params)
|
29
|
-
d_params = ActiveSupport::JSON.decode(params[:data] || "{}")
|
30
|
-
d_params.each_pair do |k,v|
|
31
|
-
d_params[k] = nil if v.blank? || v == "null"
|
32
|
-
end
|
33
|
-
|
34
|
-
tag_id, script_name =
|
35
|
-
session[:selected_tag_id], session[:selected_script_name]
|
36
|
-
|
37
|
-
engine = Marty::ScriptSet.new(tag_id).get_engine(script_name)
|
38
|
-
|
39
|
-
[engine, d_params]
|
40
|
-
end
|
41
|
-
|
42
|
-
def run_eval(params)
|
43
|
-
engine, d_params = _get_report_engine(params)
|
44
|
-
|
45
|
-
begin
|
46
|
-
engine.evaluate(session[:selected_node], "result", d_params)
|
47
|
-
rescue => exc
|
48
|
-
Marty::Util.logger.error "run_eval failed: #{exc.backtrace}"
|
49
|
-
|
50
|
-
res = Delorean::Engine.grok_runtime_exception(exc)
|
51
|
-
res["backtrace"] =
|
52
|
-
res["backtrace"].map {|m, line, fn| "#{m}:#{line} #{fn}"}.join('\n')
|
53
|
-
res
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
def export_content(format, title, params={})
|
58
|
-
data = run_eval(params)
|
59
|
-
|
60
|
-
# hacky: shouldn't have error parsing logic here
|
61
|
-
format = "json" if data.is_a?(Hash) && (data[:error] || data["error"])
|
62
|
-
|
63
|
-
# hack for testing -- txt -> csv
|
64
|
-
exp_format = format == "txt" ? "csv" : format
|
65
|
-
|
66
|
-
res, type, disposition, filename =
|
67
|
-
Marty::ContentHandler.export(data, exp_format, title)
|
68
|
-
|
69
|
-
# hack for testing -- set content-type
|
70
|
-
type = "text/plain" if format == "txt" && type =~ /csv/
|
71
|
-
|
72
|
-
[res, type, disposition, filename]
|
73
|
-
end
|
74
|
-
|
75
|
-
endpoint :netzke_submit do |params, this|
|
76
|
-
# We get here when user is asking for a background report
|
77
|
-
|
78
|
-
engine, d_params = _get_report_engine(params)
|
79
|
-
|
80
|
-
roles = engine.
|
81
|
-
evaluate(session[:selected_node], "roles", {}) rescue nil
|
82
|
-
|
83
|
-
if roles && !roles.any?{ |r| Marty::User.has_role(r) }
|
84
|
-
this.netzke_feedback "Insufficient permissions to run report!"
|
85
|
-
return
|
86
|
-
end
|
87
|
-
|
88
|
-
d_params["p_title"] ||= engine.
|
89
|
-
evaluate(session[:selected_node], "title", {}).to_s
|
90
|
-
|
91
|
-
# start background promise to get report result
|
92
|
-
engine.background_eval(session[:selected_node],
|
93
|
-
d_params,
|
94
|
-
["result", "title", "format"],
|
95
|
-
)
|
96
|
-
|
97
|
-
this.netzke_feedback "Report can be accessed from the Jobs Dashboard ..."
|
98
|
-
end
|
99
|
-
|
100
|
-
######################################################################
|
101
|
-
|
102
|
-
js_configure do |c|
|
103
|
-
# FIXME: can replace HTTP GET with a POST this would solve the
|
104
|
-
# data.length issue:
|
105
|
-
# http://stackoverflow.com/questions/133925/javascript-post-request-like-a-form-submit
|
106
|
-
c.on_generate = <<-JS
|
107
|
-
function() {
|
108
|
-
var values = this.getForm().getValues();
|
109
|
-
var data = escape(Ext.encode(values));
|
110
|
-
if (data.length > 4096) {
|
111
|
-
msg = "There is too much data to run as a foreground report." +\
|
112
|
-
"<br/>Please run as a background report."
|
113
|
-
Ext.create('Ext.Window', {
|
114
|
-
height: 100,
|
115
|
-
minWidth: 350,
|
116
|
-
autoWidth: true,
|
117
|
-
modal: true,
|
118
|
-
autoScroll: true,
|
119
|
-
html: msg,
|
120
|
-
title: "Warning"
|
121
|
-
}).show();
|
122
|
-
} else {
|
123
|
-
// FIXME: this is very hacky since it bypasses Netzke channel.
|
124
|
-
// This is a security hole wrt to the report role mechanism.
|
125
|
-
window.location = "#{Marty::Util.marty_path}/components" +\
|
126
|
-
"/#{self.name}." + this.repformat +\
|
127
|
-
"?data=" + data + "&reptitle=" + this.reptitle;
|
128
|
-
}
|
129
|
-
}
|
130
|
-
JS
|
131
|
-
end
|
132
|
-
|
133
|
-
endpoint :netzke_load do |params, this|
|
134
|
-
end
|
135
|
-
|
136
|
-
def eval_form_items(engine, items)
|
137
|
-
case items
|
138
|
-
when Array
|
139
|
-
items.map {|x| eval_form_items(engine, x)}
|
140
|
-
when Hash
|
141
|
-
items.each_with_object({}) { |(key, value), result|
|
142
|
-
result[key] = eval_form_items(engine, value)
|
143
|
-
}
|
144
|
-
when String
|
145
|
-
items.starts_with?(':') ? items[1..-1].to_sym : items
|
146
|
-
when Class
|
147
|
-
raise "bad value in form #{items}" unless
|
148
|
-
items < Delorean::BaseModule::BaseClass
|
149
|
-
|
150
|
-
attrs = engine.enumerate_attrs_by_node(items)
|
151
|
-
|
152
|
-
engine.eval_to_hash(items, attrs, {})
|
153
|
-
when Numeric, TrueClass, FalseClass
|
154
|
-
items
|
155
|
-
else
|
156
|
-
raise "bad value in form #{items}"
|
157
|
-
end
|
158
|
-
end
|
159
|
-
|
160
|
-
def configure(c)
|
161
|
-
super
|
162
|
-
|
163
|
-
unless root_sess[:selected_script_name] && root_sess[:selected_node]
|
164
|
-
c.title = "No Report selected."
|
165
|
-
return
|
166
|
-
end
|
167
|
-
|
168
|
-
begin
|
169
|
-
sset = Marty::ScriptSet.new(root_sess[:selected_tag_id])
|
170
|
-
engine = sset.get_engine(root_sess[:selected_script_name])
|
171
|
-
|
172
|
-
raise engine.to_s if engine.is_a?(Hash)
|
173
|
-
|
174
|
-
items, title, format = engine.
|
175
|
-
evaluate_attrs(root_sess[:selected_node],
|
176
|
-
["form", "title", "format"],
|
177
|
-
{},
|
178
|
-
)
|
179
|
-
|
180
|
-
raise "bad form items" unless items.is_a?(Array)
|
181
|
-
raise "bad format" unless
|
182
|
-
["csv", "xlsx", "zip", "json"].member?(format)
|
183
|
-
rescue => exc
|
184
|
-
c.title = "ERROR"
|
185
|
-
c.items =
|
186
|
-
[
|
187
|
-
{
|
188
|
-
field_label: 'Exception',
|
189
|
-
xtype: :displayfield,
|
190
|
-
name: 'displayfield1',
|
191
|
-
value: "<span style=\"color:red;\">#{exc}</span>"
|
192
|
-
},
|
193
|
-
]
|
194
|
-
return
|
195
|
-
end
|
196
|
-
|
197
|
-
items = Marty::Xl.symbolize_keys(eval_form_items(engine, items), ':')
|
198
|
-
|
199
|
-
items = [{html: "<br><b>No input is needed for this report.</b>"}] if
|
200
|
-
items.empty?
|
201
|
-
|
202
|
-
# Hacky: store these globally in session so we can get them on
|
203
|
-
# report generation request which comes out of band. Also, if the
|
204
|
-
# user's script/tag selection changes, we don't need to redraw
|
205
|
-
# report_form.
|
206
|
-
session[:selected_tag_id] = root_sess[:selected_tag_id]
|
207
|
-
session[:selected_script_name] = root_sess[:selected_script_name]
|
208
|
-
session[:selected_node] = root_sess[:selected_node]
|
209
|
-
|
210
|
-
c.items = items
|
211
|
-
c.repformat = format
|
212
|
-
c.title = "Generate: #{title}-#{sset.tag.name}"
|
213
|
-
c.reptitle = title
|
214
|
-
end
|
215
|
-
end
|
216
|
-
|
217
|
-
ReportForm = Marty::ReportForm
|