marty 0.5.15 → 0.5.16

Sign up to get free protection for your applications and to get access to all the features.
Files changed (212) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +27 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +23 -0
  5. data/Gemfile +23 -0
  6. data/INDEPENDENCE_ISSUES.md +23 -0
  7. data/app/assets/images/marty/.gitkeep +0 -0
  8. data/app/components/marty/report_form.rb +9 -4
  9. data/gemini_deprecations.md +6 -0
  10. data/lib/marty/data_change.rb +99 -0
  11. data/lib/marty/data_conversion.rb +11 -3
  12. data/lib/marty/data_exporter.rb +9 -0
  13. data/lib/marty/version.rb +1 -1
  14. data/marty.gemspec +35 -0
  15. data/script/rails +8 -0
  16. data/spec/controllers/application_controller_spec.rb +52 -0
  17. data/spec/controllers/job_controller_spec.rb +226 -0
  18. data/spec/controllers/rpc_controller_spec.rb +379 -0
  19. data/spec/controllers/rpc_import_spec.rb +45 -0
  20. data/spec/dummy/README.rdoc +261 -0
  21. data/spec/dummy/Rakefile +7 -0
  22. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  23. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  24. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  25. data/spec/dummy/app/controllers/components_controller.rb +7 -0
  26. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  27. data/spec/dummy/app/mailers/.gitkeep +0 -0
  28. data/spec/dummy/app/models/.gitkeep +0 -0
  29. data/spec/dummy/app/models/gemini/amortization_type.rb +5 -0
  30. data/spec/dummy/app/models/gemini/bud_category.rb +7 -0
  31. data/spec/dummy/app/models/gemini/entity.rb +2 -0
  32. data/spec/dummy/app/models/gemini/extras/data_import.rb +5 -0
  33. data/spec/dummy/app/models/gemini/extras/settlement_import.rb +28 -0
  34. data/spec/dummy/app/models/gemini/fannie_bup.rb +29 -0
  35. data/spec/dummy/app/models/gemini/grouping.rb +8 -0
  36. data/spec/dummy/app/models/gemini/grouping_head_version.rb +14 -0
  37. data/spec/dummy/app/models/gemini/head.rb +7 -0
  38. data/spec/dummy/app/models/gemini/head_version.rb +14 -0
  39. data/spec/dummy/app/models/gemini/helper.rb +44 -0
  40. data/spec/dummy/app/models/gemini/loan_program.rb +11 -0
  41. data/spec/dummy/app/models/gemini/mortgage_type.rb +5 -0
  42. data/spec/dummy/app/models/gemini/simple.rb +6 -0
  43. data/spec/dummy/app/models/gemini/streamline_type.rb +16 -0
  44. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  45. data/spec/dummy/config.ru +4 -0
  46. data/spec/dummy/config/application.rb +82 -0
  47. data/spec/dummy/config/boot.rb +10 -0
  48. data/spec/dummy/config/database.yml.example +10 -0
  49. data/spec/dummy/config/environment.rb +5 -0
  50. data/spec/dummy/config/environments/development.rb +35 -0
  51. data/spec/dummy/config/environments/production.rb +69 -0
  52. data/spec/dummy/config/environments/test.rb +39 -0
  53. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  54. data/spec/dummy/config/initializers/delayed_job.rb +5 -0
  55. data/spec/dummy/config/initializers/inflections.rb +15 -0
  56. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  57. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  58. data/spec/dummy/config/initializers/session_store.rb +8 -0
  59. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  60. data/spec/dummy/config/locales/en.yml +5 -0
  61. data/spec/dummy/config/routes.rb +12 -0
  62. data/spec/dummy/db/migrate/20140801000000_create_groupings.rb +11 -0
  63. data/spec/dummy/db/migrate/20150406171536_create_categories.rb +27 -0
  64. data/spec/dummy/db/migrate/20150408200916_create_loan_programs.rb +26 -0
  65. data/spec/dummy/db/migrate/20150408201429_create_types.rb +21 -0
  66. data/spec/dummy/db/migrate/20150420000001_create_heads.rb +14 -0
  67. data/spec/dummy/db/migrate/20150420000002_create_head_versions.rb +15 -0
  68. data/spec/dummy/db/migrate/20150420000003_create_grouping_head_versions.rb +12 -0
  69. data/spec/dummy/db/migrate/20151023000001_create_simple.rb +12 -0
  70. data/spec/dummy/db/seeds.rb +8 -0
  71. data/spec/dummy/delorean/blame_report.dl +171 -0
  72. data/spec/dummy/delorean/data_report.dl +105 -0
  73. data/spec/dummy/delorean/fields.dl +52 -0
  74. data/spec/dummy/delorean/styles.dl +134 -0
  75. data/spec/dummy/lib/assets/.gitkeep +0 -0
  76. data/spec/dummy/lib/class_list.rb +3 -0
  77. data/spec/dummy/log/.gitkeep +0 -0
  78. data/spec/dummy/public/404.html +26 -0
  79. data/spec/dummy/public/422.html +26 -0
  80. data/spec/dummy/public/500.html +25 -0
  81. data/spec/dummy/public/favicon.ico +0 -0
  82. data/spec/dummy/public/icons/READ.txt +3 -0
  83. data/spec/dummy/public/icons/application_cascade.png +0 -0
  84. data/spec/dummy/public/icons/application_delete.png +0 -0
  85. data/spec/dummy/public/icons/application_put.png +0 -0
  86. data/spec/dummy/public/icons/application_view_detail.png +0 -0
  87. data/spec/dummy/public/icons/arrow_in.png +0 -0
  88. data/spec/dummy/public/icons/arrow_refresh.png +0 -0
  89. data/spec/dummy/public/icons/database_save.png +0 -0
  90. data/spec/dummy/public/icons/door_in.png +0 -0
  91. data/spec/dummy/public/icons/door_out.png +0 -0
  92. data/spec/dummy/public/icons/group.png +0 -0
  93. data/spec/dummy/public/icons/page_lightning.png +0 -0
  94. data/spec/dummy/public/icons/printer.png +0 -0
  95. data/spec/dummy/public/icons/report_disk.png +0 -0
  96. data/spec/dummy/public/icons/report_go.png +0 -0
  97. data/spec/dummy/public/icons/report_magnify.png +0 -0
  98. data/spec/dummy/public/icons/script.png +0 -0
  99. data/spec/dummy/public/icons/script_add.png +0 -0
  100. data/spec/dummy/public/icons/script_go.png +0 -0
  101. data/spec/dummy/public/icons/script_key.png +0 -0
  102. data/spec/dummy/public/icons/table_go.png +0 -0
  103. data/spec/dummy/public/icons/time.png +0 -0
  104. data/spec/dummy/public/icons/time_add.png +0 -0
  105. data/spec/dummy/public/icons/time_go.png +0 -0
  106. data/spec/dummy/public/icons/timeline_marker.png +0 -0
  107. data/spec/dummy/public/icons/user_add.png +0 -0
  108. data/spec/dummy/public/icons/user_delete.png +0 -0
  109. data/spec/dummy/public/icons/user_edit.png +0 -0
  110. data/spec/dummy/public/icons/wrench.png +0 -0
  111. data/spec/dummy/script/delayed_job +6 -0
  112. data/spec/dummy/script/rails +6 -0
  113. data/spec/features/javascripts/job_dashboard_live_search.js.coffee +8 -0
  114. data/spec/features/javascripts/login.js.coffee +8 -0
  115. data/spec/features/jobs_dashboard_netzke_spec.rb +24 -0
  116. data/spec/features/jobs_dashboard_spec.rb +49 -0
  117. data/spec/fixtures/scripts/load_tests/script1.dl +2 -0
  118. data/spec/fixtures/scripts/load_tests/script2.dl +2 -0
  119. data/spec/job_helper.rb +102 -0
  120. data/spec/lib/data_exporter_spec.rb +71 -0
  121. data/spec/lib/data_importer_spec.rb +461 -0
  122. data/spec/lib/xl_spec.rb +198 -0
  123. data/spec/lib/xl_styles_spec.rb +115 -0
  124. data/spec/models/api_auth_spec.rb +187 -0
  125. data/spec/models/posting_spec.rb +107 -0
  126. data/spec/models/promise_spec.rb +65 -0
  127. data/spec/models/script_spec.rb +187 -0
  128. data/spec/models/user_spec.rb +68 -0
  129. data/spec/requests/routes_spec.rb +12 -0
  130. data/spec/spec_helper.rb +61 -0
  131. data/spec/support/clean_db_helpers.rb +18 -0
  132. data/spec/support/delayed_job_helpers.rb +12 -0
  133. data/spec/support/user_helpers.rb +12 -0
  134. metadata +139 -89
  135. data/app/components/marty/auth_app.rb~ +0 -51
  136. data/app/components/marty/auth_app/javascripts/auth_app.js~ +0 -91
  137. data/app/components/marty/cm_form_panel.rb~ +0 -5
  138. data/app/components/marty/cm_grid_panel.rb~ +0 -35
  139. data/app/components/marty/data_import_view.rb~ +0 -142
  140. data/app/components/marty/extras/layout.rb~ +0 -46
  141. data/app/components/marty/live_search_grid_panel.rb~ +0 -49
  142. data/app/components/marty/main_auth_app.rb~ +0 -238
  143. data/app/components/marty/mcfly_grid_panel.rb~ +0 -80
  144. data/app/components/marty/new_posting_form.rb~ +0 -46
  145. data/app/components/marty/new_posting_window.rb~ +0 -21
  146. data/app/components/marty/pivot_grid.rb +0 -52
  147. data/app/components/marty/pivot_grid/endpoints.rb +0 -45
  148. data/app/components/marty/pivot_grid/javascripts/extensions.js +0 -150
  149. data/app/components/marty/pivot_grid/javascripts/pivot_grid.js +0 -86
  150. data/app/components/marty/pivot_grid/services.rb +0 -44
  151. data/app/components/marty/posting_grid.rb~ +0 -140
  152. data/app/components/marty/promise_view.rb~ +0 -157
  153. data/app/components/marty/promise_view/stylesheets/promise_view.css~ +0 -15
  154. data/app/components/marty/report_form.rb~ +0 -217
  155. data/app/components/marty/report_select.rb~ +0 -133
  156. data/app/components/marty/reporting.rb~ +0 -39
  157. data/app/components/marty/script_detail.rb~ +0 -430
  158. data/app/components/marty/script_form.rb~ +0 -233
  159. data/app/components/marty/script_form/javascripts/Ext.ux.form.field.CodeMirror.js~ +0 -909
  160. data/app/components/marty/script_grid.rb~ +0 -99
  161. data/app/components/marty/script_tester.rb~ +0 -213
  162. data/app/components/marty/scripting.rb~ +0 -124
  163. data/app/components/marty/select_report.rb~ +0 -143
  164. data/app/components/marty/simple_app.rb~ +0 -101
  165. data/app/components/marty/tag_grid.rb~ +0 -89
  166. data/app/components/marty/tree_panel.rb~ +0 -256
  167. data/app/components/marty/tree_panel/javascripts/tree_panel.js~ +0 -317
  168. data/app/components/marty/user_pivot.rb +0 -128
  169. data/app/components/marty/user_view.rb~ +0 -188
  170. data/app/controllers/marty/application_controller.rb~ +0 -133
  171. data/app/controllers/marty/components_controller.rb~ +0 -37
  172. data/app/controllers/marty/job_controller.rb~ +0 -28
  173. data/app/controllers/marty/rpc_controller.rb~ +0 -61
  174. data/app/helpers/marty/script_set.rb~ +0 -59
  175. data/app/models/marty/api_auth.rb~ +0 -48
  176. data/app/models/marty/data_change.rb~ +0 -141
  177. data/app/models/marty/enum.rb~ +0 -16
  178. data/app/models/marty/import_type.rb~ +0 -48
  179. data/app/models/marty/poop.rb~ +0 -169
  180. data/app/models/marty/posting.rb~ +0 -86
  181. data/app/models/marty/posting_type.rb~ +0 -21
  182. data/app/models/marty/promise.rb~ +0 -196
  183. data/app/models/marty/role.rb~ +0 -10
  184. data/app/models/marty/script.rb~ +0 -62
  185. data/app/models/marty/tag.rb~ +0 -91
  186. data/app/models/marty/user.rb~ +0 -148
  187. data/app/models/marty/user_role.rb~ +0 -13
  188. data/app/views/layouts/marty/application.html.erb~ +0 -11
  189. data/config/routes.rb~ +0 -10
  190. data/db/migrate/019_create_marty_postings.rb~ +0 -19
  191. data/db/migrate/095_create_marty_tags.rb~ +0 -19
  192. data/lib/marty.rb~ +0 -13
  193. data/lib/marty/content_handler.rb~ +0 -93
  194. data/lib/marty/data_exporter.rb~ +0 -137
  195. data/lib/marty/data_importer.rb~ +0 -114
  196. data/lib/marty/data_row_processor.rb~ +0 -206
  197. data/lib/marty/drop_folder_hook.rb~ +0 -17
  198. data/lib/marty/folder_hook.rb~ +0 -9
  199. data/lib/marty/lazy_column_loader.rb~ +0 -47
  200. data/lib/marty/mcfly_query.rb~ +0 -188
  201. data/lib/marty/migrations.rb~ +0 -65
  202. data/lib/marty/monkey.rb~ +0 -160
  203. data/lib/marty/permissions.rb~ +0 -69
  204. data/lib/marty/promise.rb~ +0 -41
  205. data/lib/marty/promise_job.rb~ +0 -121
  206. data/lib/marty/promise_proxy.rb~ +0 -69
  207. data/lib/marty/util.rb~ +0 -80
  208. data/lib/marty/version.rb~ +0 -3
  209. data/lib/marty/xl.rb~ +0 -526
  210. data/lib/pyxll/README.txt~ +0 -16
  211. data/lib/pyxll/gemini.py~ +0 -110
  212. 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,15 +0,0 @@
1
- .green-row td {
2
- background-color: #77FF77 !important;
3
- }
4
-
5
- .red-row td {
6
- background-color: red !important;
7
- }
8
-
9
- .orange-row td {
10
- background-color: orange !important;
11
- }
12
-
13
- .gray-row td {
14
- background-color: #D3D3D3 !important;
15
- }
@@ -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