@@ -3,69 +3,71 @@ module ApplicationController::ReportDownloads
3
3
4
4
# Send the current report in text format
5
5
def render_txt
6
- @ report = report_for_rendering
7
- filename = filename_timestamp ( @ report. title )
6
+ report = report_for_rendering
7
+ filename = filename_timestamp ( report . title )
8
8
disable_client_cache
9
- send_data ( @report . to_text ,
10
- :filename => "#{ filename } .txt" )
9
+ send_data ( report . to_text , :filename => "#{ filename } .txt" )
11
10
end
12
11
13
12
# Send the current report in csv format
14
13
def render_csv
15
- @ report = report_for_rendering
14
+ report = report_for_rendering
16
15
filename = filename_timestamp ( @report . title )
17
16
disable_client_cache
18
- send_data ( @report . to_csv ,
19
- :filename => "#{ filename } .csv" )
17
+ send_data ( report . to_csv , :filename => "#{ filename } .csv" )
20
18
end
21
19
22
- # Send the current report in pdf format
23
- def render_pdf ( report = nil )
24
- @report = report || report_for_rendering
20
+ def render_pdf_internal ( report )
25
21
userid = "#{ session [ :userid ] } |#{ request . session_options [ :id ] } |adhoc"
26
- @ result = @ report. build_create_results ( :userid => userid )
22
+ result = report . build_create_results ( :userid => userid )
27
23
28
- # Use @ result frorm paging, if present
29
- @ result ||= MiqReportResult . for_user ( current_user ) . find ( @sb [ :pages ] [ :rr_id ] ) if @sb [ :pages ]
24
+ # Use result from paging, if present
25
+ result ||= MiqReportResult . for_user ( current_user ) . find ( @sb [ :pages ] [ :rr_id ] ) if @sb [ :pages ]
30
26
# Use report_result_id in session, if present
31
- @ result ||= MiqReportResult . for_user ( current_user ) . find ( session [ :report_result_id ] ) if session [ :report_result_id ]
27
+ result ||= MiqReportResult . for_user ( current_user ) . find ( session [ :report_result_id ] ) if session [ :report_result_id ]
32
28
33
29
disable_client_cache
34
30
35
- @options = {
31
+ @options = { # used by the layouts/print
36
32
:page_layout => 'landscape' ,
37
- :page_size => @ report. page_size || 'a4' ,
38
- :run_date => format_timezone ( @ report. report_run_time , @ result. user_timezone , "gtl" ) ,
39
- :title => @ result. name
33
+ :page_size => report . page_size || 'a4' ,
34
+ :run_date => format_timezone ( report . report_run_time , result . user_timezone , "gtl" ) ,
35
+ :title => result . name
40
36
}
41
37
42
- @data = @result . html_rows . join
38
+ render (
39
+ :template => '/layouts/print/report' ,
40
+ :layout => '/layouts/print' ,
41
+ :locals => {
42
+ :report => report ,
43
+ :data => result . html_rows . join
44
+ }
45
+ )
46
+ end
43
47
44
- render :template => '/layouts/print/report' , :layout => '/layouts/print'
48
+ # Send the current report in pdf format
49
+ def render_pdf
50
+ render_pdf_internal ( report_for_rendering )
45
51
end
46
52
47
53
# Show the current widget report in pdf format
48
54
def widget_to_pdf
49
55
session [ :report_result_id ] = params [ :rr_id ]
50
- render_pdf
56
+ render_pdf_internal ( report_from_report_results ( params [ :rr_id ] ) )
51
57
end
52
58
53
- # Render report in csv/txt/pdf format asynchronously
54
- def render_report_data
55
- render_type = RENDER_TYPES [ params [ :render_type ] ]
56
- assert_privileges ( "render_report_#{ render_type } " )
57
- unless params [ :task_id ] # First time thru, kick off the report generate task
58
- if render_type
59
- @sb [ :render_type ] = render_type
60
- rr = MiqReportResult . for_user ( current_user ) . find ( session [ :report_result_id ] ) # Get report task id from the session
61
- task_id = rr . async_generate_result ( @sb [ :render_type ] , :userid => session [ :userid ] ,
62
- :session_id => request . session_options [ :id ] )
63
- initiate_wait_for_task ( :task_id => task_id )
64
- end
65
- return
59
+ def render_report_data_init ( render_type )
60
+ if render_type
61
+ @sb [ :render_type ] = render_type
62
+ rr = MiqReportResult . for_user ( current_user ) . find ( session [ :report_result_id ] ) # Get report task id from the session
63
+ task_id = rr . async_generate_result ( @sb [ :render_type ] , :userid => session [ :userid ] ,
64
+ :session_id => request . session_options [ :id ] )
65
+ initiate_wait_for_task ( :task_id => task_id )
66
66
end
67
+ end
67
68
68
- miq_task = MiqTask . find ( params [ :task_id ] )
69
+ def render_report_data_continue ( task_id )
70
+ miq_task = MiqTask . find ( task_id )
69
71
if !miq_task . results_ready?
70
72
add_flash ( _ ( "Report generation returned: Status [%{status}] Message [%{message}]" ) % { :status => miq_task . status , :message => miq_task . message } , :error )
71
73
javascript_flash ( :spinner_off => true )
@@ -82,86 +84,112 @@ def render_report_data
82
84
end
83
85
end
84
86
end
87
+
88
+ # Render report in csv/txt/pdf format asynchronously
89
+ def render_report_data
90
+ render_type = RENDER_TYPES [ params [ :render_type ] ]
91
+ assert_privileges ( "render_report_#{ render_type } " )
92
+
93
+ if params [ :task_id ]
94
+ # We are waiting for a task to finish.
95
+ render_report_data_continue ( params [ :task_id ] )
96
+ else
97
+ # First time thru, kick off the report generate task.
98
+ render_report_data_init ( render_type )
99
+ end
100
+ end
85
101
alias_method :render_report_txt , :render_report_data
86
102
alias_method :render_report_csv , :render_report_data
87
103
alias_method :render_report_pdf , :render_report_data
88
104
89
105
# Send rendered report data
90
106
def send_report_data
91
- if @sb [ :render_rr_id ]
92
- disable_client_cache
93
- @result = MiqReportResult . find ( @sb [ :render_rr_id ] )
94
- @report = @result . report
95
- @data = @result . get_generated_result ( @sb [ :render_type ] )
96
- # We need the last_run_on time from the original result
97
- last_run_on = MiqReportResult . select ( :last_run_on ) . find ( session [ :report_result_id ] ) . last_run_on
98
- @result . destroy
107
+ return unless @sb [ :render_rr_id ]
99
108
100
- if @sb [ :render_type ] == :pdf
101
- @options = {
102
- :page_layout => 'landscape' ,
103
- :page_size => @report . page_size || 'a4' ,
104
- :run_date => format_timezone ( last_run_on , @result . user_timezone , "gtl" ) ,
105
- :title => @result . name
109
+ disable_client_cache
110
+ result = MiqReportResult . find ( @sb [ :render_rr_id ] )
111
+ report = result . report
112
+
113
+ ## THIS IS STRANGE
114
+ # We need the last_run_on time from the original result
115
+ last_run_on = MiqReportResult . select ( :last_run_on ) . find ( session [ :report_result_id ] ) . last_run_on
116
+
117
+ if @sb [ :render_type ] == :pdf
118
+ @options = { # needed by the /layouts/print
119
+ :page_layout => 'landscape' ,
120
+ :page_size => report . page_size || 'a4' ,
121
+ :run_date => format_timezone ( last_run_on , result . user_timezone , "gtl" ) ,
122
+ :title => result . name
123
+ }
124
+ render (
125
+ :template => '/layouts/print/report' ,
126
+ :layout => '/layouts/print' ,
127
+ :locals => {
128
+ :report => report ,
129
+ :data => result . html_rows . join
106
130
}
107
- render :template => '/layouts/print/report' , :layout => '/layouts/print'
108
- else
109
- filename = filename_timestamp ( @result . report . title , 'export_filename' )
110
- send_data ( @data ,
111
- :filename => "#{ filename } .#{ @sb [ :render_type ] } " ,
112
- :type => "application/#{ @sb [ :render_type ] } " )
113
- end
131
+ )
132
+ else
133
+ filename = filename_timestamp ( result . report . title , 'export_filename' )
134
+ send_data ( result . get_generated_result ( @sb [ :render_type ] ) ,
135
+ :filename => "#{ filename } .#{ @sb [ :render_type ] } " ,
136
+ :type => "application/#{ @sb [ :render_type ] } " )
114
137
end
138
+
139
+ result . destroy
115
140
end
116
141
117
142
# Download currently displayed view
118
143
def download_data
119
- @ view = session [ :view ] . dup if session [ :view ] # Copy session view, if it exists
144
+ view = session [ :view ] . dup if session [ :view ] # Copy session view, if it exists
120
145
options = session [ :paged_view_search_options ] . merge ( :page => nil , :per_page => nil ) # Get all pages
121
- @ view. table , _attrs = @ view. paged_view_search ( options ) # Get the records
146
+ view . table , _attrs = view . paged_view_search ( options ) # Get the records
122
147
123
- @ view. title = _ ( @ view. title . pluralize )
124
- @ view. headers . map! { |header | _ ( header ) }
148
+ view . title = _ ( view . title . pluralize )
149
+ view . headers . map! { |header | _ ( header ) }
125
150
126
- @filename = filename_timestamp ( @view . title )
127
151
case params [ :download_type ]
128
- when "pdf"
129
- download_pdf ( @view )
130
- when "text"
131
- download_txt ( @view )
132
- when "csv"
133
- download_csv ( @view )
152
+ when 'pdf' then download_pdf ( view )
153
+ when 'text' then download_txt ( view , filename_timestamp ( view . title ) )
154
+ when 'csv' then download_csv ( view , filename_timestamp ( view . title ) )
134
155
end
135
156
end
136
157
137
158
private
138
159
139
160
RENDER_TYPES = { 'txt' => :txt , 'csv' => :csv , 'pdf' => :pdf } . freeze
140
161
141
- def download_txt ( view )
162
+ def download_txt ( view , filename )
142
163
disable_client_cache
143
- send_data ( view . to_text , :filename => "#{ @ filename} .txt" )
164
+ send_data ( view . to_text , :filename => "#{ filename } .txt" )
144
165
end
145
166
146
- def download_csv ( view )
167
+ def download_csv ( view , filename )
147
168
disable_client_cache
148
- send_data ( view . to_csv , :filename => "#{ @ filename} .csv" )
169
+ send_data ( view . to_csv , :filename => "#{ filename } .csv" )
149
170
end
150
171
151
172
# Send the current report in pdf format
152
173
def download_pdf ( view )
153
- render_pdf ( view )
174
+ render_pdf_internal ( view )
175
+ end
176
+
177
+ def report_from_task_id ( task_id )
178
+ MiqTask . find ( task_id ) . task_results
179
+ end
180
+
181
+ def report_from_report_results ( report_result_id )
182
+ rr = MiqReportResult . for_user ( current_user ) . find ( report_result_id )
183
+ report = rr . report_results
184
+ report . report_run_time = rr . last_run_on
185
+ report
154
186
end
155
187
156
188
def report_for_rendering
157
189
if session [ :rpt_task_id ]
158
- miq_task = MiqTask . find ( session [ :rpt_task_id ] )
159
- miq_task . task_results
190
+ report_from_task_id ( session [ :rpt_task_id ] )
160
191
elsif session [ :report_result_id ]
161
- rr = MiqReportResult . for_user ( current_user ) . find ( session [ :report_result_id ] )
162
- report = rr . report_results
163
- report . report_run_time = rr . last_run_on
164
- report
192
+ report_from_report_results ( session [ :report_result_id ] )
165
193
end
166
194
end
167
195
0 commit comments