how_are_we_doing 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/app/controllers/reports_controller.rb +1 -52
- data/app/helpers/reports_helper.rb +30 -4
- data/app/models/print.rb +1 -29
- data/app/models/share.rb +3 -29
- data/app/models/total.rb +2 -21
- data/app/models/view.rb +1 -29
- data/app/views/reports/_bar_graph.html.erb +48 -0
- data/app/views/reports/_line_graph.html.erb +40 -0
- data/app/views/reports/_recent_bar_graph.html.erb +41 -0
- data/app/views/reports/index.html.erb +12 -22
- data/config/locales/en.yml +16 -0
- data/lib/generators/how_are_we_doing/install/install_generator.rb +1 -0
- data/lib/generators/how_are_we_doing/install/templates/public/images/hawd/blank.png +0 -0
- data/lib/generators/how_are_we_doing/install/templates/public/javascripts/flot/API.txt +85 -68
- data/lib/generators/how_are_we_doing/install/templates/public/javascripts/flot/FAQ.txt +0 -0
- data/lib/generators/how_are_we_doing/install/templates/public/javascripts/flot/NEWS.txt +12 -32
- data/lib/generators/how_are_we_doing/install/templates/public/javascripts/flot/PLUGINS.txt +0 -0
- data/lib/generators/how_are_we_doing/install/templates/public/javascripts/flot/README.txt +3 -3
- data/lib/generators/how_are_we_doing/install/templates/public/javascripts/flot/excanvas.js +160 -663
- data/lib/generators/how_are_we_doing/install/templates/public/javascripts/flot/excanvas.min.js +1 -1
- data/lib/generators/how_are_we_doing/install/templates/public/javascripts/flot/jquery.flot.crosshair.js +12 -51
- data/lib/generators/how_are_we_doing/install/templates/public/javascripts/flot/jquery.flot.image.js +0 -0
- data/lib/generators/how_are_we_doing/install/templates/public/javascripts/flot/jquery.flot.js +509 -155
- data/lib/generators/how_are_we_doing/install/templates/public/javascripts/flot/jquery.flot.navigate.js +0 -1
- data/lib/generators/how_are_we_doing/install/templates/public/javascripts/flot/jquery.flot.stack.js +0 -0
- data/lib/generators/how_are_we_doing/install/templates/public/javascripts/flot/jquery.flot.threshold.js +0 -0
- data/lib/generators/how_are_we_doing/install/templates/public/javascripts/flot/jquery.js +0 -0
- data/lib/generators/how_are_we_doing/install/templates/public/javascripts/how_are_we_doing.js +50 -8
- data/lib/how_are_we_doing/acts_as_analytical.rb +98 -0
- data/lib/{acts_as_printable.rb → how_are_we_doing/acts_as_printable.rb} +0 -0
- data/lib/{acts_as_shareable.rb → how_are_we_doing/acts_as_shareable.rb} +0 -0
- data/lib/{acts_as_totalable.rb → how_are_we_doing/acts_as_totalable.rb} +0 -0
- data/lib/{acts_as_viewable.rb → how_are_we_doing/acts_as_viewable.rb} +0 -0
- data/lib/how_are_we_doing/controllers/reports_helpers.rb +92 -0
- data/lib/how_are_we_doing/version.rb +1 -1
- data/lib/how_are_we_doing.rb +16 -8
- metadata +13 -6
data/lib/generators/how_are_we_doing/install/templates/public/javascripts/flot/jquery.flot.stack.js
CHANGED
File without changes
|
File without changes
|
File without changes
|
data/lib/generators/how_are_we_doing/install/templates/public/javascripts/how_are_we_doing.js
CHANGED
@@ -49,15 +49,9 @@ function line_graph_it(data,graph_container_id) {
|
|
49
49
|
);
|
50
50
|
|
51
51
|
$("#"+graph_container_id).live("plothover", graph_hover_cb);
|
52
|
-
|
53
|
-
// $.plot($("#graph"), formatted_data, {
|
54
|
-
// bars: { show: true, barWidth: 0.6, series_spread: true, align: "center" },
|
55
|
-
// xaxis: { ticks: [[0, "Make this first <a id='...title='62'>(remove)</a>"]], autoscaleMargin: .10 },
|
56
|
-
// yaxis: { tickDecimals: 0, min: 0 },
|
57
|
-
// grid: { hoverable: true, clickable: true }
|
58
|
-
// });
|
59
52
|
}
|
60
53
|
|
54
|
+
var previousPoint = null;
|
61
55
|
function graph_hover_cb(event, pos, item) {
|
62
56
|
if (item) {
|
63
57
|
if (previousPoint != item.datapoint) {
|
@@ -86,4 +80,52 @@ function showTooltip(x, y, contents) {
|
|
86
80
|
'z-index': 1000,
|
87
81
|
opacity: 1
|
88
82
|
}).appendTo("body").fadeIn(200);
|
89
|
-
};
|
83
|
+
};
|
84
|
+
|
85
|
+
function bar_graph_it(data,graph_container_id) {
|
86
|
+
var formatted_data = [
|
87
|
+
data.metrics.totals,
|
88
|
+
data.metrics.prints,
|
89
|
+
data.metrics.views,
|
90
|
+
data.metrics.shares
|
91
|
+
];
|
92
|
+
|
93
|
+
var ticks =
|
94
|
+
data.metrics.totals.ticks ||
|
95
|
+
data.metrics.prints.ticks ||
|
96
|
+
data.metrics.views.ticks ||
|
97
|
+
data.metrics.shares.ticks;
|
98
|
+
|
99
|
+
delete data.metrics.shares.ticks;
|
100
|
+
delete data.metrics.prints.ticks;
|
101
|
+
delete data.metrics.views.ticks;
|
102
|
+
delete data.metrics.totals.ticks;
|
103
|
+
|
104
|
+
var default_format_options = {
|
105
|
+
bars: {
|
106
|
+
show: true,
|
107
|
+
barWidth: 0.6,
|
108
|
+
series_spread: true,
|
109
|
+
align: "center"
|
110
|
+
},
|
111
|
+
xaxis: {
|
112
|
+
autoscaleMargin: .10,
|
113
|
+
ticks: ticks
|
114
|
+
},
|
115
|
+
yaxis: {
|
116
|
+
tickDecimals: 0,
|
117
|
+
min: 0
|
118
|
+
},
|
119
|
+
grid: {
|
120
|
+
clickable: true,
|
121
|
+
hoverable: true
|
122
|
+
}
|
123
|
+
};
|
124
|
+
|
125
|
+
$.plot($('#'+graph_container_id),
|
126
|
+
formatted_data,
|
127
|
+
$.extend(true, default_format_options, data.format_options)
|
128
|
+
);
|
129
|
+
|
130
|
+
$("#"+graph_container_id).live("plothover", graph_hover_cb);
|
131
|
+
}
|
@@ -0,0 +1,98 @@
|
|
1
|
+
module HowAreWeDoing
|
2
|
+
module ActsAsAnalytical #:nodoc:
|
3
|
+
|
4
|
+
def self.included(base)
|
5
|
+
base.extend ClassMethods
|
6
|
+
end
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
def acts_as_analytical
|
10
|
+
belongs_to "#{self.name.underscore}able".to_sym, :polymorphic => true
|
11
|
+
belongs_to :user
|
12
|
+
|
13
|
+
validates "#{self.name.underscore}able_type".to_sym, :presence => true, :on => :create
|
14
|
+
validates "#{self.name.underscore}able_id".to_sym, :presence => true, :on => :create
|
15
|
+
|
16
|
+
after_create :create_total
|
17
|
+
|
18
|
+
include HowAreWeDoing::ActsAsAnalytical::InstanceMethods
|
19
|
+
extend HowAreWeDoing::ActsAsAnalytical::SingletonMethods
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module SingletonMethods
|
24
|
+
def json_data_for_line_graph(params)
|
25
|
+
start_date = params[:start_date]
|
26
|
+
end_date = params[:end_date]
|
27
|
+
parent_type = params[:parent_type]
|
28
|
+
parent_id = params[:parent_id]
|
29
|
+
assoc = parent_type.classify.constantize.find(parent_id) if parent_id and parent_type
|
30
|
+
arr = []
|
31
|
+
start_date.to_date.upto(end_date.to_date) do |day|
|
32
|
+
objects = (assoc ? assoc.send("#{self.name.underscore.pluralize}") : self).where("#{self.name.underscore.pluralize}".to_sym => {:created_at => day.beginning_of_day..day.end_of_day})
|
33
|
+
arr << ["#{day.beginning_of_day.to_time.to_i}000",objects.count]
|
34
|
+
end
|
35
|
+
arr
|
36
|
+
end
|
37
|
+
|
38
|
+
def json_data_for_bar_graph(params)
|
39
|
+
start_date = params[:start_date]
|
40
|
+
end_date = params[:end_date]
|
41
|
+
analytical_class = params[:analytical_type].classify.constantize
|
42
|
+
analytical_ids = params[:analytical_ids] ? params[:analytical_ids].split(",") : nil
|
43
|
+
|
44
|
+
objects = analytical_ids ? analytical_class.where(:id => analytical_ids) : analytical_class.limit(params[:analytical_limit]||6).where(:created_at => start_date.beginning_of_day.to_date..(end_date+1.day).beginning_of_day.to_date)
|
45
|
+
|
46
|
+
returning arr = [] do
|
47
|
+
objects.each_with_index do |object,i|
|
48
|
+
arr << [i,object.send("#{self.name.underscore.pluralize}".to_sym).where("#{self.name.underscore.pluralize}".to_sym => {:created_at => start_date.beginning_of_day.to_date..(end_date+1.day).beginning_of_day.to_date}).count]
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def json_labels_for_bar_graph(params)
|
54
|
+
start_date = params[:start_date]
|
55
|
+
end_date = params[:end_date]
|
56
|
+
analytical_class = params[:analytical_type].classify.constantize
|
57
|
+
analytical_ids = params[:analytical_ids] ? params[:analytical_ids].split(",") : nil
|
58
|
+
|
59
|
+
objects = analytical_ids ? analytical_class.where(:id => analytical_ids) : analytical_class.limit(params[:analytical_limit]||6).where(:created_at => start_date.beginning_of_day.to_date..(end_date+1.day).beginning_of_day.to_date)
|
60
|
+
|
61
|
+
returning arr = [] do
|
62
|
+
objects.each_with_index do |object,i|
|
63
|
+
arr << [i,object.send("to_#{self.name.underscore}_chart_label")]
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def json_labels_for_line_graph(params)
|
69
|
+
start_date = params[:start_date]
|
70
|
+
end_date = params[:end_date]
|
71
|
+
parent_type = params[:parent_type]
|
72
|
+
parent_id = params[:parent_id]
|
73
|
+
assoc = parent_type.classify.constantize.find(parent_id) if parent_id and parent_type
|
74
|
+
|
75
|
+
objects = (assoc ? assoc.send("#{self.name.underscore.pluralize}") : self).where("#{self.name.underscore.pluralize}".to_sym => {:created_at => start_date.beginning_of_day..end_date.end_of_day})
|
76
|
+
count = objects.count
|
77
|
+
objects = objects.where("#{self.name.underscore}able_id".to_sym.not_eq => nil)
|
78
|
+
label = objects.first.nil? ? "" : objects.first.send("#{self.name.underscore}able").send("to_#{self.name.underscore}_chart_label")
|
79
|
+
|
80
|
+
[count,label]
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
module InstanceMethods
|
85
|
+
def create_total
|
86
|
+
send("#{self.class.name.underscore}able").totals.create
|
87
|
+
end
|
88
|
+
|
89
|
+
def to_print_chart_label(graph_type=nil)
|
90
|
+
if respond_to?(:print_chart_label)
|
91
|
+
print_chart_label(graph_type)
|
92
|
+
else
|
93
|
+
to_s
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,92 @@
|
|
1
|
+
module HowAreWeDoing
|
2
|
+
module Controllers
|
3
|
+
module ReportsHelpers
|
4
|
+
def self.included(base)
|
5
|
+
base.respond_to :html, :json, :xml, :js
|
6
|
+
base.before_filter :set_dates, :only => :index
|
7
|
+
base.before_filter :set_graph_type, :only => :index
|
8
|
+
base.before_filter :set_analyticals, :only => :index
|
9
|
+
end
|
10
|
+
# extend ActiveSupport::Concern
|
11
|
+
#
|
12
|
+
# included do
|
13
|
+
# respond_to :html, :json, :xml, :js
|
14
|
+
# before_filter :set_dates, :only => :index
|
15
|
+
# before_filter :set_graph_type, :only => :index
|
16
|
+
# before_filter :set_analyticals, :only => :index
|
17
|
+
# end
|
18
|
+
|
19
|
+
def index
|
20
|
+
respond_to do |format|
|
21
|
+
format.html
|
22
|
+
format.json do
|
23
|
+
render :json => {
|
24
|
+
:metrics => {
|
25
|
+
:totals => params[:exclude_totals] ? {} : {
|
26
|
+
:data => Total.send("json_data_for_#{params[:graph_type]}",params),
|
27
|
+
:label => "Totals",
|
28
|
+
:color => 0,
|
29
|
+
:ticks => Total.send("json_labels_for_#{params[:graph_type]}",params)
|
30
|
+
},
|
31
|
+
:prints => params[:exclude_prints] ? {} : {
|
32
|
+
:data => Print.send("json_data_for_#{params[:graph_type]}",params),
|
33
|
+
:label => "Prints",
|
34
|
+
:color => 1,
|
35
|
+
:ticks => Print.send("json_labels_for_#{params[:graph_type]}",params)
|
36
|
+
},
|
37
|
+
:views => params[:exclude_views] ? {} : {
|
38
|
+
:data => View.send("json_data_for_#{params[:graph_type]}",params),
|
39
|
+
:label => "Views",
|
40
|
+
:color => 2,
|
41
|
+
:ticks => View.send("json_labels_for_#{params[:graph_type]}",params)
|
42
|
+
},
|
43
|
+
:shares => params[:exclude_shares] ? {} : {
|
44
|
+
:data => Share.send("json_data_for_#{params[:graph_type]}",params),
|
45
|
+
:label => "Shares",
|
46
|
+
:color => 3,
|
47
|
+
:ticks => Share.send("json_labels_for_#{params[:graph_type]}",params)
|
48
|
+
}
|
49
|
+
},
|
50
|
+
:format_options => format_options
|
51
|
+
}
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
protected
|
57
|
+
def set_analyticals
|
58
|
+
@analyticals = params[:analytical_type] ? params[:analytical_type].classify.constantize.order('id DESC') : []
|
59
|
+
@analytical_ids = params[:analytical_ids] ? params[:analytical_ids] : @analyticals.first.nil? ? [] : [@analyticals.first.id]
|
60
|
+
|
61
|
+
if @analytical_ids.empty? && params[:default_analytical_type]
|
62
|
+
@analyticals = params[:default_analytical_type].classify.constantize.order('id DESC')
|
63
|
+
@analytical_ids = @analyticals.limit(1).map(&:id)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def format_options
|
68
|
+
params[:graph_type] == 'line_graph' ? { :xaxis => { :max => "#{params[:end_date].to_time.to_i}000", :min => "#{params[:start_date].to_time.to_i}000"} } : {}
|
69
|
+
end
|
70
|
+
|
71
|
+
def set_graph_type
|
72
|
+
params[:graph_type] = params[:analytical_type].blank? ? 'line_graph' : 'bar_graph'
|
73
|
+
end
|
74
|
+
|
75
|
+
def set_dates
|
76
|
+
params[:start_date] ||= (Time.now - 2.weeks)
|
77
|
+
params[:end_date] ||= Time.now
|
78
|
+
if params[:start_date].to_s.match(/\//)
|
79
|
+
params[:start_date] = Date.strptime(params[:start_date], '%m/%d/%Y')
|
80
|
+
params[:end_date] = Date.strptime(params[:end_date], '%m/%d/%Y')
|
81
|
+
else
|
82
|
+
params[:start_date] = Date.parse(params[:start_date].to_s)
|
83
|
+
params[:end_date] = Date.parse(params[:end_date].to_s)
|
84
|
+
end
|
85
|
+
|
86
|
+
params[:start_date] = params[:start_date].to_time.utc.beginning_of_day
|
87
|
+
params[:end_date] = params[:end_date].to_time.utc.beginning_of_day
|
88
|
+
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
data/lib/how_are_we_doing.rb
CHANGED
@@ -1,20 +1,28 @@
|
|
1
|
-
require 'acts_as_printable'
|
2
|
-
require 'acts_as_viewable'
|
3
|
-
require 'acts_as_shareable'
|
4
|
-
require 'acts_as_totalable'
|
5
1
|
require File.join(File.dirname(__FILE__), '..', 'app', 'helpers', 'prints_helper')
|
6
2
|
require File.join(File.dirname(__FILE__), '..', 'app', 'helpers', 'views_helper')
|
7
3
|
require File.join(File.dirname(__FILE__), '..', 'app', 'helpers', 'shares_helper')
|
8
4
|
|
9
|
-
ActiveRecord::Base.send(:include, HowAreWeDoing::ActsAsTotalable)
|
10
|
-
ActiveRecord::Base.send(:include, HowAreWeDoing::ActsAsPrintable)
|
11
|
-
ActiveRecord::Base.send(:include, HowAreWeDoing::ActsAsViewable)
|
12
|
-
ActiveRecord::Base.send(:include, HowAreWeDoing::ActsAsShareable)
|
13
5
|
ActionController::Base.helper(PrintsHelper)
|
14
6
|
ActionController::Base.helper(SharesHelper)
|
15
7
|
ActionController::Base.helper(ViewsHelper)
|
16
8
|
|
17
9
|
module HowAreWeDoing
|
10
|
+
autoload :ActsAsAnalytical, 'how_are_we_doing/acts_as_analytical'
|
11
|
+
autoload :ActsAsTotalable, 'how_are_we_doing/acts_as_totalable'
|
12
|
+
autoload :ActsAsViewable, 'how_are_we_doing/acts_as_viewable'
|
13
|
+
autoload :ActsAsShareable, 'how_are_we_doing/acts_as_shareable'
|
14
|
+
autoload :ActsAsPrintable, 'how_are_we_doing/acts_as_printable'
|
15
|
+
|
16
|
+
module Controllers
|
17
|
+
autoload :ReportsHelpers, 'how_are_we_doing/controllers/reports_helpers'
|
18
|
+
end
|
19
|
+
|
18
20
|
class Engine < ::Rails::Engine
|
19
21
|
end
|
20
22
|
end
|
23
|
+
|
24
|
+
ActiveRecord::Base.send(:include, HowAreWeDoing::ActsAsAnalytical)
|
25
|
+
ActiveRecord::Base.send(:include, HowAreWeDoing::ActsAsTotalable)
|
26
|
+
ActiveRecord::Base.send(:include, HowAreWeDoing::ActsAsPrintable)
|
27
|
+
ActiveRecord::Base.send(:include, HowAreWeDoing::ActsAsViewable)
|
28
|
+
ActiveRecord::Base.send(:include, HowAreWeDoing::ActsAsShareable)
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: how_are_we_doing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.5
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Gunner Technology, Cody Swann
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-03-
|
13
|
+
date: 2011-03-04 00:00:00 -08:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -60,18 +60,19 @@ files:
|
|
60
60
|
- app/models/share.rb
|
61
61
|
- app/models/total.rb
|
62
62
|
- app/models/view.rb
|
63
|
+
- app/views/reports/_bar_graph.html.erb
|
64
|
+
- app/views/reports/_line_graph.html.erb
|
65
|
+
- app/views/reports/_recent_bar_graph.html.erb
|
63
66
|
- app/views/reports/index.html.erb
|
67
|
+
- config/locales/en.yml
|
64
68
|
- how_are_we_doing.gemspec
|
65
|
-
- lib/acts_as_printable.rb
|
66
|
-
- lib/acts_as_shareable.rb
|
67
|
-
- lib/acts_as_totalable.rb
|
68
|
-
- lib/acts_as_viewable.rb
|
69
69
|
- lib/generators/how_are_we_doing/USAGE
|
70
70
|
- lib/generators/how_are_we_doing/install/install_generator.rb
|
71
71
|
- lib/generators/how_are_we_doing/install/templates/db/migrate/create_prints.rb
|
72
72
|
- lib/generators/how_are_we_doing/install/templates/db/migrate/create_shares.rb
|
73
73
|
- lib/generators/how_are_we_doing/install/templates/db/migrate/create_totals.rb
|
74
74
|
- lib/generators/how_are_we_doing/install/templates/db/migrate/create_views.rb
|
75
|
+
- lib/generators/how_are_we_doing/install/templates/public/images/hawd/blank.png
|
75
76
|
- lib/generators/how_are_we_doing/install/templates/public/javascripts/flot/API.txt
|
76
77
|
- lib/generators/how_are_we_doing/install/templates/public/javascripts/flot/FAQ.txt
|
77
78
|
- lib/generators/how_are_we_doing/install/templates/public/javascripts/flot/LICENSE.txt
|
@@ -149,6 +150,12 @@ files:
|
|
149
150
|
- lib/generators/how_are_we_doing/install/templates/public/stylesheets/ui-lightness/images/ui-icons_ffffff_256x240.png
|
150
151
|
- lib/generators/how_are_we_doing/install/templates/public/stylesheets/ui-lightness/jquery-ui-1.8.10.custom.css
|
151
152
|
- lib/how_are_we_doing.rb
|
153
|
+
- lib/how_are_we_doing/acts_as_analytical.rb
|
154
|
+
- lib/how_are_we_doing/acts_as_printable.rb
|
155
|
+
- lib/how_are_we_doing/acts_as_shareable.rb
|
156
|
+
- lib/how_are_we_doing/acts_as_totalable.rb
|
157
|
+
- lib/how_are_we_doing/acts_as_viewable.rb
|
158
|
+
- lib/how_are_we_doing/controllers/reports_helpers.rb
|
152
159
|
- lib/how_are_we_doing/version.rb
|
153
160
|
has_rdoc: true
|
154
161
|
homepage: ""
|