old_sql 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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"