old_sql 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -51,3 +51,5 @@ Rake::RDocTask.new do |rdoc|
51
51
  rdoc.rdoc_files.include('README*')
52
52
  rdoc.rdoc_files.include('lib/**/*.rb')
53
53
  end
54
+
55
+ Jeweler::GemcutterTasks.new
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.2.0
@@ -0,0 +1,188 @@
1
+ require 'csv'
2
+ require 'sequel'
3
+
4
+ #
5
+ # TODO:
6
+ # 1. Reduce the datagrid and print views to a single view.
7
+ # The colnames can be defined in the reports.yml config file.
8
+ # (Completed on 5-24-2011)
9
+ # 2. Create a generic SQL parse method.
10
+ # (Completed on 5-24-2011)
11
+ # 3. Convert to a gem. This class will be overridden to implement
12
+ # parse methods.
13
+ # 4. Add export to CSV
14
+ # (Completed on 5-24-2011)
15
+ # 5. I think we should move the parse methods to a lib class.
16
+ # The parse class name could be defined in the reports.yml file.
17
+ # (Completed on 5-24-2011)
18
+ # 6. Try and implement jqgrid sort and search methods.
19
+ # This should be done in the sql files by passing the params
20
+ # from jqgrid into them.
21
+ # 7. Remove rails_admin dependencies
22
+ # 8. Add Devise support
23
+ # 9. Rewrite jqgrid using JQuery
24
+ #
25
+
26
+ module OldSql
27
+ class ReportController < ApplicationController
28
+ before_filter :_init
29
+ before_filter :_reports
30
+
31
+ helper_method :jqgrid_field_list
32
+
33
+ ROUND_PRECISION = 2
34
+ BASE_PROCESSOR = "base"
35
+
36
+ def index
37
+ render :layout => 'rails_admin/dashboard'
38
+ end
39
+
40
+ def datagrid
41
+ @start_date = params[:start_date]
42
+ @end_date = params[:end_date]
43
+ @generation = params[:generation]
44
+ @report_name = params[:report]
45
+ @report_sql = params[:report_sql]
46
+
47
+ render :layout => 'rails_admin/datagrid', :template => "rails_admin/db_report/datagrid.html.erb"
48
+ end
49
+
50
+ def query
51
+ @start_date = params[:start_date]
52
+ @end_date = params[:end_date]
53
+ @generation = params[:generation]
54
+ @report_name = params[:report]
55
+ @report_sql = params[:report_sql].downcase
56
+ @report_sql_orig = params[:report_sql].downcase
57
+
58
+ if !@generation.nil? && @generation.to_i >= 0
59
+ @report_sql << "_gen_#{@generation}"
60
+ end
61
+
62
+ logger.info "REPORT: #{@report_name}"
63
+ logger.info "REPORT SQL: #{@report_sql}"
64
+ logger.info "START_DATE: #{@start_date}"
65
+ logger.info "END_DATE: #{@end_date}"
66
+ logger.info "GENERATION: #{@generation}"
67
+
68
+ processor = load_processor(@report_name)
69
+ @report = processor.execute_query(@report_sql,@start_date,@end_date,query_vars(@report_name))
70
+
71
+ respond_to do |format|
72
+ format.json { render :json => @report.to_json}
73
+ format.xml { render :xml => @report.to_xml }
74
+ format.csv {
75
+ csv_string = CSV.generate do |csv|
76
+ # header row
77
+ csv << ['Start Date', @start_date,'End Date', @end_date]
78
+ csv << @reports[@report_name]['fields']
79
+
80
+ # data rows
81
+ @report[:rows].each do |row|
82
+ rec = []
83
+ row[:cell].each do |cell|
84
+ rec << Sanitize.clean(cell.to_s)
85
+ end
86
+ csv << rec
87
+ end
88
+ end
89
+
90
+ send_data csv_string,
91
+ :type => 'text/csv; charset=iso-8859-1; header=present',
92
+ :disposition => "attachment; filename=#{@report_sql}_#{@start_date.gsub(' ','_')}_#{@end_date.gsub(' ','_')}.csv"
93
+ }
94
+ end
95
+ end
96
+
97
+ def print
98
+ @start_date = params[:start_date]
99
+ @end_date = params[:end_date]
100
+ @generation = params[:generation]
101
+ @report_name = params[:report]
102
+ @desc = params[:desc]
103
+ @report_sql = params[:report_sql].downcase
104
+ @report_sql_orig = params[:report_sql].downcase
105
+
106
+ if !@generation.nil? && @generation.to_i >= 0
107
+ @report_sql << "_gen_#{@generation}"
108
+ end
109
+
110
+ logger.info "REPORT: #{@report_name}"
111
+ logger.info "REPORT SQL: #{@report_sql}"
112
+ logger.info "START_DATE: #{@start_date}"
113
+ logger.info "END_DATE: #{@end_date}"
114
+ logger.info "GENERATION: #{@generation}"
115
+
116
+ processor = load_processor(@report_name)
117
+ @report = processor.execute_query(@report_sql,@start_date,@end_date,query_vars(@report_name))
118
+
119
+ render :layout => 'rails_admin/db_report_print', :template => "rails_admin/db_report/print.html.erb"
120
+ end
121
+
122
+
123
+ private
124
+ def _init
125
+ #todo add Devise support
126
+ #@authorization_adapter.authorize(:index) if @authorization_adapter
127
+ @page_name = t("admin.report.pagename")
128
+ @page_type = "report"
129
+ @host = self.request.host
130
+ @port = self.request.port
131
+ end
132
+
133
+ def _reports
134
+ template = File.read("#{Rails.root}/config/reports.yml")
135
+ @reports = YAML.load(Erubis::Eruby.new(template).result)
136
+ end
137
+
138
+ def load_processor report
139
+ processor = nil
140
+ begin
141
+ #todo get processor name from @reports
142
+
143
+ if !@reports[report]['processor'].nil?
144
+ logger.info "Loading Processor report_processor/#{@reports[report]['processor'].downcase}"
145
+ require "report_processor/#{@reports[report]['processor'].downcase}"
146
+ processor=eval("ReportProcessor::#{@reports[report]['processor'].gsub("_","")}").new
147
+
148
+ else
149
+ logger.info "Loading Processor report_processor/#{BASE_PROCESSOR}"
150
+ require "report_processor/#{BASE_PROCESSOR}"
151
+ processor=eval("ReportProcessor::#{BASE_PROCESSOR}.capitalize").new
152
+ end
153
+ rescue
154
+ logger.info "Loading Processor report_processor/#{BASE_PROCESSOR}"
155
+ require "report_processor/#{BASE_PROCESSOR}"
156
+ processor=eval("ReportProcessor::#{BASE_PROCESSOR}.capitalize").new
157
+ end
158
+
159
+ processor
160
+ end
161
+
162
+ def jqgrid_field_list
163
+ @fields = []
164
+ field_num = 1
165
+
166
+ @reports[@report_name]['fields'].each do |field|
167
+ if field_num == 1
168
+ @fields << { :field => "cell_#{field_num}", :label => field }
169
+ else
170
+ @fields << { :field => "cell_#{field_num}", :label => field, :align => "center" }
171
+ end
172
+ field_num+=1
173
+ end
174
+
175
+ @fields
176
+ end
177
+
178
+ def query_vars report
179
+ query_vars = @reports[report]['query_vars']
180
+ if !query_vars.nil? && query_vars.size > 0
181
+ return query_vars[0]
182
+ else
183
+ return nil
184
+ end
185
+ end
186
+ end
187
+ end
188
+
@@ -0,0 +1,16 @@
1
+ <%=jqgrid_javascripts%>
2
+ <%=jqgrid_stylesheets%>
3
+
4
+ <%=raw jqgrid(
5
+ "#{@reports[@report_name]['value']} Report",
6
+ "#{@report_name}",
7
+ "/admin/db/report/query.json/",
8
+ jqgrid_field_list(),
9
+ {
10
+ :autowidth=>true,
11
+ :height=>430,
12
+ :rows_per_page=>25,
13
+ :mtype=>'GET',
14
+ :post_data=>"{'report':'#{@report_name}','report_sql':'#{@report_sql}','generation':'#{@generation}','start_date':'#{@start_date}','end_date':'#{@end_date}'}"
15
+ }
16
+ ) %>
@@ -0,0 +1,148 @@
1
+ <% head_style "old_sql/db_report" %>
2
+
3
+ <% head_javascript "old_sql/application.js" %>
4
+ <% head_javascript "old_sql/jquery-ui-timepicker-addon.js" %>
5
+ <% head_javascript "old_sql/date_format.js" %>
6
+
7
+ <script>
8
+ var host = "<%=@host%>";
9
+ var port = "<%=@port%>";
10
+ var _report_sql = '';
11
+ var _report_loaded = false;
12
+
13
+ function report_selected()
14
+ {
15
+ var virality = $j("#report option:selected").attr('virality');
16
+ _report_sql = $j("#report option:selected").attr('report_sql');
17
+
18
+ if (virality == 'true')
19
+ {
20
+ $j("#select-generation").removeAttr('disabled');
21
+ }
22
+ else
23
+ {
24
+ $j("#select-generation").attr('disabled', 'disabled');
25
+ $j("#select-generation option:first").attr('selected','selected');
26
+ }
27
+ }
28
+
29
+ function load_report()
30
+ {
31
+ var src = "http://" + host+":"+port+"/admin/db/report/datagrid/?report="+$j("#report").val()+
32
+ "&start_date="+$j("#datepicker-start").val()+"&end_date="+$j("#datepicker-end").val()+"&generation="+$j("#select-generation").val()+"&report_sql="+
33
+ _report_sql;
34
+
35
+ jQuery('iframe').attr('src', src);
36
+
37
+ _report_loaded = true;
38
+ }
39
+
40
+ function print_report()
41
+ {
42
+ if(_report_loaded == false)
43
+ {
44
+ alert("You must select a report, and run it before continuing.");
45
+ return;
46
+ }
47
+
48
+ var src = "http://" + host+":"+port+"/admin/db/report/print/?report="+$j("#report").val()+
49
+ "&start_date="+$j("#datepicker-start").val()+"&end_date="+$j("#datepicker-end").val()+"&generation="+$j("#select-generation").val()+"&report_sql="+
50
+ _report_sql+"&desc="+$j("#report option:selected").attr('desc');
51
+ window.open(src,'DB Report')
52
+ }
53
+
54
+ function export_report_to_excel()
55
+ {
56
+ if(_report_loaded == false)
57
+ {
58
+ alert("You must select a report, and run it before continuing.");
59
+ return;
60
+ }
61
+
62
+ var src = "http://" + host+":"+port+"/admin/db/report/query.csv/?report="+$j("#report").val()+
63
+ "&start_date="+$j("#datepicker-start").val()+"&end_date="+$j("#datepicker-end").val()+"&generation="+$j("#select-generation").val()+"&report_sql="+
64
+ _report_sql+"&desc="+$j("#report option:selected").attr('desc');
65
+ window.open(src,'DB Report')
66
+ }
67
+
68
+ $j(document).ready(function($){
69
+ $("#datepicker-start").datetimepicker();
70
+ $("#datepicker-start").datetimepicker( "option", "dateFormat", "yy/mm/dd" );
71
+ $("#datepicker-end").datetimepicker();
72
+ $("#datepicker-end").datetimepicker( "option", "dateFormat", "yy/mm/dd" );
73
+
74
+ $j("#select-generation").attr('disabled', 'disabled');
75
+
76
+ var now = new Date();
77
+ var tomorrow = new Date();
78
+ var two_weeks_ago = new Date();
79
+ two_weeks_ago.setDate(now.getDate() - 14);
80
+ tomorrow.setDate(now.getDate() + 1);
81
+ $j("#datepicker-start").attr('value', two_weeks_ago.format("yyyy/mm/dd HH:MM:ss"));
82
+ $j("#datepicker-end").attr('value', tomorrow.format("yyyy/mm/dd HH:MM:ss"));
83
+ });
84
+ </script>
85
+
86
+ <div class="ra-block">
87
+ <div class="ui-widget-header clearfix">
88
+ <%= @page_name %>
89
+ </div>
90
+
91
+ <form id="report-form" name="report-form" action="/admin/db/report/query" method="POST">
92
+ <div class="report-form-row">
93
+ <div class="report-form-label">SELECT A REPORT:</div>
94
+ <div class="report-form-input">
95
+ <select name="report" id="report"
96
+ onchange="report_selected()">
97
+ <option></option>
98
+ <% @reports.each do |report, data| %>
99
+ <option value="<%= data['name'] %>" virality="<%= data['virality'] %>" report_sql="<%= data['report_sql'] %>" desc="<%= data['value'] %>"><%= data['value'] %></option>
100
+ <% end %>
101
+ </select>
102
+ </div>
103
+ </div>
104
+
105
+ <div class="report-form-row">
106
+ <div class="report-form-label">GENERATION:</div>
107
+ <div class="report-form-input">
108
+ <select name="generation" id="select-generation">
109
+ <option value="-1"></option>
110
+ <option value="0">0</option>
111
+ <option value="1">1</option>
112
+ <option value="2">2</option>
113
+ </select>
114
+ </div>
115
+ </div>
116
+
117
+ <div class="report-form-row">
118
+ <div class="report-form-label">START DATE:</div>
119
+ <div class="report-form-input">
120
+ <input type="text" id="datepicker-start" name="start_date" value="">
121
+ </div>
122
+ </div>
123
+
124
+ <div class="report-form-row">
125
+ <div class="report-form-label">END DATE:</div>
126
+ <div class="report-form-input">
127
+ <input type="text" id="datepicker-end" name="end_date" value="">
128
+ </div>
129
+ </div>
130
+
131
+ <div class="report-form-row">
132
+ <div class="report-form-label"></div>
133
+ <input type="button" value="Run" onclick="load_report();"/>
134
+ </div>
135
+ </form>
136
+
137
+ <div id="links">
138
+ <div><%= link_to_function("Print Report", "javascript:print_report()") %></div>
139
+ <div><%= link_to_function("Export To Excel", "javascript:export_report_to_excel()") %></div>
140
+ </div>
141
+
142
+ <div id="data_grid">
143
+ <iframe id="data_grid_frame" src="" width="100%" height="530" frameborder="0" scrolling="no">
144
+ <p>Your browser does not support iframes.</p>
145
+ </iframe>
146
+ </div>
147
+
148
+ </div>
@@ -0,0 +1,66 @@
1
+ <script>
2
+ print();
3
+ </script>
4
+
5
+ <style>
6
+ body {
7
+ background-color: White;
8
+ font-family:Verdana, Geneva, sans-serif;
9
+ font-size:13px;
10
+ }
11
+ #report-name {
12
+ font-weight:bold;
13
+ }
14
+ table {
15
+ border-collapse: collapse;
16
+ }
17
+ td {
18
+ border: 1px solid #000000;
19
+ }
20
+ .data {
21
+ text-align:center;
22
+ vertical-align:top
23
+ }
24
+ th {
25
+ border: 1px solid #000000;
26
+ font-weight:normal;
27
+ }
28
+ </style>
29
+
30
+ <div class="print">
31
+ <!-- DISPLAY FOR PRINTED PAGE -->
32
+
33
+ <table border="0" style="margin-bottom:10px; border:0px;">
34
+ <tr>
35
+ <td colspan="3" style="border:0px;"><div id="report-name"><%=@desc%> Report</div></td>
36
+ </tr>
37
+ <tr>
38
+ <td style="border:0px;">Start Date: <%=@start_date%></td>
39
+ <td style="border:0px; padding-left:20px; padding-right:20px;">to</td>
40
+ <td style="border:0px;">End Date: <%=@end_date%></td>
41
+ </tr>
42
+ </table>
43
+
44
+ <table border="1" cellspacing="5" cellpadding="0" width="700">
45
+ <tr>
46
+ <% @reports[@report_name]['fields'].each do |report_field| %>
47
+ <td class="data"><%=report_field%></td>
48
+ <% end %>
49
+ </tr>
50
+
51
+ <% @report[:rows].each do |row| %>
52
+ <tr>
53
+ <% first_cell=true %>
54
+ <%row[:cell].each do |c|%>
55
+ <% cleaned_cell = Sanitize.clean(c.to_s) %>
56
+ <% if first_cell==true %>
57
+ <td><%=cleaned_cell%></td>
58
+ <% else %>
59
+ <td class="data"><%=cleaned_cell%></td>
60
+ <% end %>
61
+ <% first_cell=false %>
62
+ <%end%>
63
+ </tr>
64
+ <% end %>
65
+ </table>
66
+ </div>
data/config/routes.rb CHANGED
@@ -0,0 +1,12 @@
1
+ Rails.application.routes.draw do
2
+ scope "report", :module => :old_sql, :as => "old_sql" do
3
+ scope "report", :as => "report" do
4
+ controller "report" do
5
+ match "/", :to => :index, :as => "report_list"
6
+ match "/query", :to => :query, :as => "query"
7
+ match "/datagrid", :to => :datagrid, :as => "datagrid"
8
+ match "/print", :to => :print, :as => "print"
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,7 @@
1
+ class ActionController::Base
2
+
3
+ def self.authenticate(options = {})
4
+ raise Exception, "Authenticate cannot be called on ActionController::Base. Only it's subclasses" if self == ActionController::Base
5
+ end
6
+
7
+ end
data/lib/old_sql.rb CHANGED
@@ -0,0 +1,5 @@
1
+ module OldSql
2
+ require 'old_sql/engine' if defined?(Rails)
3
+ end
4
+
5
+ require 'extensions/action_controller/base'
@@ -0,0 +1,9 @@
1
+ require "old_sql"
2
+ require "rails"
3
+ require "action_controller"
4
+
5
+ module OldSql
6
+ class Engine < Rails::Engine
7
+ engine_name :old_sql
8
+ end
9
+ end
@@ -0,0 +1,85 @@
1
+ module ReportProcessor
2
+ class Base
3
+
4
+ ROUND_PRECISION = 2
5
+
6
+ def execute_query(report_sql,start_date,end_date,query_vars)
7
+ vars = {:start_date => start_date, :end_date => end_date}
8
+
9
+ if !query_vars.nil?
10
+ vars = vars.merge query_vars
11
+ end
12
+
13
+ template = File.read("#{Rails.root}/config/report_sql/#{report_sql}.erb")
14
+ sql = Erubis::Eruby.new(template).result(vars)
15
+
16
+ Rails.logger.debug sql
17
+
18
+ db = nil
19
+
20
+ begin
21
+ #todo change to a reporting db
22
+ db = Sequel.connect("mysql2://#{PurePlay.database.user}:#{PurePlay.database.password}@#{PurePlay.database.host}:3306/#{PurePlay.database.database}")
23
+
24
+ @resultset = []
25
+ db.fetch(sql) do |row|
26
+ @resultset << row
27
+ end
28
+ ensure
29
+ db.disconnect
30
+ end
31
+
32
+ parse(@resultset)
33
+
34
+ @data
35
+ end
36
+
37
+ def init(resultset)
38
+ @rec = resultset[0]
39
+ self.new_data
40
+ end
41
+
42
+ def parse(resultset)
43
+ init(resultset)
44
+
45
+ resultset.each do |r|
46
+ cell = []
47
+ r.each do |key, value|
48
+ cell << value
49
+ end
50
+ new_row(nil, cell)
51
+ end
52
+
53
+ @data
54
+ end
55
+
56
+ def new_data(page=1, total=1, records=1)
57
+ @id = 0
58
+ @data = {}
59
+ @data[:page]=page
60
+ @data[:total]=total
61
+ @data[:records]=records
62
+ @data[:rows] = []
63
+ end
64
+
65
+ def new_row(title = nil, cell_data = [], id = @id+1)
66
+ if !title.nil?
67
+ cell_data.unshift "<b>#{title}</b>"
68
+ end
69
+
70
+ @data[:rows] << {id: id, cell: cell_data}
71
+ end
72
+
73
+ def ifnull(o)
74
+ if !o.nil? && o != 0
75
+ return o
76
+ else
77
+ return 1
78
+ end
79
+ end
80
+
81
+ def isNumeric(s)
82
+ Float(s) != nil rescue false
83
+ end
84
+ end
85
+ end
data/old_sql.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{old_sql}
8
- s.version = "0.1.0"
8
+ s.version = "0.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = [%q{Eddie Gonzales}]
12
- s.date = %q{2011-05-31}
12
+ s.date = %q{2011-06-01}
13
13
  s.description = %q{OldSQL is a Rails Engine database reporting gem that uses plain old SQL}
14
14
  s.email = %q{egonzales@pureplay.com}
15
15
  s.extra_rdoc_files = [
@@ -24,8 +24,15 @@ Gem::Specification.new do |s|
24
24
  "Rakefile",
25
25
  "TODO.mkd",
26
26
  "VERSION",
27
+ "app/controllers/old_sql/report_controller.rb",
28
+ "app/views/old_sql/report/datagrid.html.erb",
29
+ "app/views/old_sql/report/index.html.erb",
30
+ "app/views/old_sql/report/print.html.erb",
27
31
  "config/routes.rb",
32
+ "lib/extensions/action_controller/base.rb",
28
33
  "lib/old_sql.rb",
34
+ "lib/old_sql/engine.rb",
35
+ "lib/report_processor/base.rb",
29
36
  "old_sql.gemspec",
30
37
  "pkg/old_sql-0.1.0.gem"
31
38
  ]
Binary file
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: old_sql
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.1.0
5
+ version: 0.2.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Eddie Gonzales
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-05-31 00:00:00 Z
13
+ date: 2011-06-01 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: shoulda
@@ -73,8 +73,15 @@ files:
73
73
  - Rakefile
74
74
  - TODO.mkd
75
75
  - VERSION
76
+ - app/controllers/old_sql/report_controller.rb
77
+ - app/views/old_sql/report/datagrid.html.erb
78
+ - app/views/old_sql/report/index.html.erb
79
+ - app/views/old_sql/report/print.html.erb
76
80
  - config/routes.rb
81
+ - lib/extensions/action_controller/base.rb
77
82
  - lib/old_sql.rb
83
+ - lib/old_sql/engine.rb
84
+ - lib/report_processor/base.rb
78
85
  - old_sql.gemspec
79
86
  - pkg/old_sql-0.1.0.gem
80
87
  homepage: http://github.com/egonz/old_sql
@@ -90,7 +97,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
90
97
  requirements:
91
98
  - - ">="
92
99
  - !ruby/object:Gem::Version
93
- hash: -2261371469069848944
100
+ hash: 1302646033916433491
94
101
  segments:
95
102
  - 0
96
103
  version: "0"