daily 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/app/controllers/daily_reports_controller.rb +35 -0
- data/app/controllers/daily_tables_controller.rb +24 -0
- data/app/controllers/{users_controller.rb → daily_users_controller.rb} +6 -6
- data/app/controllers/main_controller.rb +1 -1
- data/app/jobs/generate_report_job.rb +5 -1
- data/app/metrics/metric.rb +41 -0
- data/app/metrics/sql_query.rb +11 -0
- data/app/models/{report.rb → daily_report.rb} +4 -4
- data/app/models/{table.rb → daily_table.rb} +27 -17
- data/app/models/{user.rb → daily_user.rb} +3 -3
- data/app/transforms/transform.rb +2 -1
- data/app/views/daily_reports/_form.erb +14 -0
- data/app/views/{reports → daily_reports}/_list.erb +1 -1
- data/app/views/daily_reports/edit.erb +2 -0
- data/app/views/daily_reports/index.erb +3 -0
- data/app/views/{reports → daily_reports}/new.erb +0 -0
- data/app/views/daily_reports/show.erb +23 -0
- data/app/views/{tables → daily_tables}/_form.erb +5 -2
- data/app/views/{tables → daily_tables}/_list.erb +0 -0
- data/app/views/daily_tables/edit.erb +2 -0
- data/app/views/daily_tables/index.erb +3 -0
- data/app/views/{tables → daily_tables}/new.erb +0 -0
- data/app/views/daily_tables/show.erb +35 -0
- data/app/views/{users → daily_users}/_form.erb +1 -1
- data/app/views/daily_users/_items.erb +8 -0
- data/app/views/{users → daily_users}/_list.erb +0 -0
- data/app/views/daily_users/edit.erb +2 -0
- data/app/views/daily_users/index.erb +3 -0
- data/app/views/{users → daily_users}/new.erb +0 -0
- data/app/views/daily_users/show.erb +4 -0
- data/app/views/main/home.erb +1 -1
- data/config/authorization_rules.rb +11 -11
- data/config/initializers/ruport.rb +1 -2
- data/config/locales/en.yml +27 -1
- data/config/routes.rb +6 -6
- data/db/development.sqlite3 +0 -0
- data/db/migrate/20120111054115_create_table_metrics.rb +42 -0
- data/db/migrate/20120111081745_namespace_models.rb +13 -0
- data/db/schema.rb +26 -25
- data/db/test.sqlite3 +0 -0
- data/lib/daily.rb +4 -4
- data/lib/daily/activemetric.rb +5 -0
- data/lib/daily/daily_config.rb +20 -3
- data/lib/daily/version.rb +1 -1
- data/lib/{daily → engine}/engine.rb +0 -0
- data/lib/tasks/user.rake +2 -2
- metadata +63 -44
- data/app/controllers/reports_controller.rb +0 -35
- data/app/controllers/tables_controller.rb +0 -20
- data/app/views/reports/_form.erb +0 -14
- data/app/views/reports/edit.erb +0 -2
- data/app/views/reports/index.erb +0 -3
- data/app/views/reports/show.erb +0 -23
- data/app/views/tables/edit.erb +0 -2
- data/app/views/tables/index.erb +0 -3
- data/app/views/tables/show.erb +0 -35
- data/app/views/users/_items.erb +0 -8
- data/app/views/users/edit.erb +0 -2
- data/app/views/users/index.erb +0 -3
- data/app/views/users/show.erb +0 -4
@@ -0,0 +1,35 @@
|
|
1
|
+
class DailyReportsController < InheritedResources::Base
|
2
|
+
nested_belongs_to :daily_table, :optional => true
|
3
|
+
filter_resource_access :nested_in => :daily_table, :additional_member => :generate
|
4
|
+
|
5
|
+
def create
|
6
|
+
build_resource.user = current_user
|
7
|
+
create! do |success, failure|
|
8
|
+
success.all { redirect_to daily_table_daily_report_path(@daily_report.table, @daily_report)}
|
9
|
+
failure.all { render :new }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def update
|
14
|
+
update! do |success, failure|
|
15
|
+
success.all { redirect_to daily_table_daily_report_path(@daily_report.table, @daily_report)}
|
16
|
+
failure.all { render :edit }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def generate
|
21
|
+
@daily_report.queue_now!
|
22
|
+
redirect_to daily_table_daily_report_path(@daily_report.table, @daily_report)
|
23
|
+
end
|
24
|
+
|
25
|
+
protected
|
26
|
+
|
27
|
+
# methods to make declarative_authorization allow optional table
|
28
|
+
def load_daily_table
|
29
|
+
@daily_table ||= load_parent_controller_object(:daily_table) if params[:daily_table_id]
|
30
|
+
@daily_table # loaded by inherited_resources if there
|
31
|
+
end
|
32
|
+
def new_daily_report_for_collection
|
33
|
+
@daily_report ||= @daily_table ? new_controller_object_for_collection : DailyReport.new
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class DailyTablesController < InheritedResources::Base
|
2
|
+
filter_resource_access
|
3
|
+
|
4
|
+
def new
|
5
|
+
build_resource.metric = "SqlQuery"
|
6
|
+
new!
|
7
|
+
end
|
8
|
+
|
9
|
+
def create
|
10
|
+
build_resource.user = current_user
|
11
|
+
create!
|
12
|
+
end
|
13
|
+
|
14
|
+
def update
|
15
|
+
update!
|
16
|
+
end
|
17
|
+
|
18
|
+
def show
|
19
|
+
show! do
|
20
|
+
@test_html = @daily_table.test if params[:test]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -1,9 +1,9 @@
|
|
1
|
-
class
|
1
|
+
class DailyUsersController < InheritedResources::Base
|
2
2
|
before_filter :user_from_current, :only => :edit
|
3
3
|
filter_resource_access
|
4
4
|
|
5
5
|
def update
|
6
|
-
params[:
|
6
|
+
params[:daily_user][:password] = nil if params[:daily_user][:password].blank?
|
7
7
|
|
8
8
|
update! do |success, failure|
|
9
9
|
success.all { redirect_after_update }
|
@@ -16,11 +16,11 @@ class UsersController < InheritedResources::Base
|
|
16
16
|
params[:id] ||= (current_user.try(:id) || 0)
|
17
17
|
end
|
18
18
|
def redirect_after_update
|
19
|
-
if @
|
20
|
-
sign_in @
|
19
|
+
if @daily_user == current_user
|
20
|
+
sign_in @daily_user, :bypass => true
|
21
21
|
redirect_to user_root_path
|
22
|
-
elsif permitted_to? :show, @
|
23
|
-
redirect_to
|
22
|
+
elsif permitted_to? :show, @daily_user
|
23
|
+
redirect_to daily_user_path(@daily_user)
|
24
24
|
else
|
25
25
|
redirect_to user_root_path
|
26
26
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
class Metric
|
2
|
+
def self.metrics
|
3
|
+
DailyConfig.load_classes if Rails.env.development?
|
4
|
+
subclasses
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.display_name
|
8
|
+
name.demodulize.underscore.humanize.titleize
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.form_keys
|
12
|
+
[] # override to get more / different
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.validates_presence_of_data
|
16
|
+
@validates_presence_of_data = true
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.get_data_errors(data)
|
20
|
+
return ["can't be blank"] if @validates_presence_of_data and data.blank?
|
21
|
+
validate_data(data) || []
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.validate_data(data)
|
25
|
+
[]
|
26
|
+
end
|
27
|
+
|
28
|
+
attr_accessor :data
|
29
|
+
def initialize(data)
|
30
|
+
self.data = data
|
31
|
+
end
|
32
|
+
|
33
|
+
def setting(key, default = nil)
|
34
|
+
val = settings[key.to_sym]
|
35
|
+
val.blank? ? default : val
|
36
|
+
end
|
37
|
+
|
38
|
+
def result
|
39
|
+
raise("Metrics must override result")
|
40
|
+
end
|
41
|
+
end
|
@@ -1,8 +1,8 @@
|
|
1
|
-
class
|
1
|
+
class DailyReport < ActiveRecord::Base
|
2
2
|
include SharedBehaviors
|
3
|
-
belongs_to :user
|
4
|
-
belongs_to :table
|
5
|
-
has_many :jobs, :class_name => "::Delayed::Job"
|
3
|
+
belongs_to :user, :class_name => "DailyUser"
|
4
|
+
belongs_to :table, :class_name => "DailyTable"
|
5
|
+
has_many :jobs, :class_name => "::Delayed::Job", :foreign_key => "report_id"
|
6
6
|
|
7
7
|
has_data :formatter
|
8
8
|
|
@@ -1,24 +1,21 @@
|
|
1
|
-
class
|
1
|
+
class DailyTable < ActiveRecord::Base
|
2
2
|
include SharedBehaviors
|
3
3
|
|
4
|
-
belongs_to :user
|
5
|
-
has_many :reports
|
4
|
+
belongs_to :user, :class_name => "DailyUser"
|
5
|
+
has_many :reports, :class_name => "DailyReport", :foreign_key => "table_id"
|
6
|
+
|
7
|
+
# just easier with declarative auth to also have this one
|
8
|
+
has_many :daily_reports, :foreign_key => "table_id"
|
6
9
|
|
7
10
|
generate_guid :guid
|
8
11
|
|
9
12
|
validates_presence_of :user
|
10
13
|
validates_unique_presence_of :name
|
11
|
-
validates_stripped_presence_of :
|
12
|
-
validates_stripped_presence_of :data_type
|
14
|
+
validates_stripped_presence_of :metric
|
13
15
|
|
14
|
-
validate :
|
15
|
-
|
16
|
+
validate :metric_valid
|
16
17
|
serialize :column_names, Array
|
17
18
|
|
18
|
-
def sql?
|
19
|
-
data_type == "sql"
|
20
|
-
end
|
21
|
-
|
22
19
|
def result
|
23
20
|
fetch
|
24
21
|
end
|
@@ -48,18 +45,31 @@ class Table < ActiveRecord::Base
|
|
48
45
|
out.gsub("\n", "<br/>").html_safe
|
49
46
|
end
|
50
47
|
end
|
48
|
+
|
49
|
+
def metric_name
|
50
|
+
return "" if metric.blank?
|
51
|
+
begin
|
52
|
+
return metric.constantize.display_name
|
53
|
+
rescue Exception => e
|
54
|
+
return "#{metric} (unknown)"
|
55
|
+
end
|
56
|
+
end
|
51
57
|
|
52
58
|
protected
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
59
|
+
|
60
|
+
def metric_valid
|
61
|
+
return if metric.blank?
|
62
|
+
begin
|
63
|
+
metric.constantize.get_data_errors(metric_data).each do |message|
|
64
|
+
errors.add(:metric_data, message)
|
65
|
+
end
|
66
|
+
rescue Exception => e
|
67
|
+
errors.add(:metric, "is not known")
|
57
68
|
end
|
58
69
|
end
|
59
70
|
|
60
71
|
def fetch_data
|
61
|
-
|
62
|
-
Ruport::Data::Table.new
|
72
|
+
metric.constantize.new(metric_data).result
|
63
73
|
end
|
64
74
|
|
65
75
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
class
|
1
|
+
class DailyUser < ActiveRecord::Base
|
2
2
|
# Include default devise modules. Others available are:
|
3
3
|
# :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
|
4
4
|
devise :database_authenticatable, :registerable,
|
@@ -7,8 +7,8 @@ class User < ActiveRecord::Base
|
|
7
7
|
# Setup accessible (or protected) attributes for your model
|
8
8
|
attr_accessible :email, :password, :password_confirmation, :remember_me
|
9
9
|
|
10
|
-
has_many :tables
|
11
|
-
has_many :reports
|
10
|
+
has_many :tables, :class_name => "DailyTable", :foreign_key => "user_id"
|
11
|
+
has_many :reports, :class_name => "DailyReport", :foreign_key => "user_id"
|
12
12
|
|
13
13
|
def role_symbols
|
14
14
|
return [] if new_record?
|
data/app/transforms/transform.rb
CHANGED
@@ -0,0 +1,14 @@
|
|
1
|
+
<h3>Table: <%= link_to @daily_report.table.name, daily_table_path(@daily_report.table) %></h3>
|
2
|
+
|
3
|
+
<%= simple_form_for [@daily_report.table, @daily_report] do |f| %>
|
4
|
+
<%= f.input :name %>
|
5
|
+
<%= f.input :filename unless @daily_report.new_record? %>
|
6
|
+
|
7
|
+
<%= f.input :formatter, :collection => DailyReport.formatters %>
|
8
|
+
<%= f.input :formatter_json, :as => :text %>
|
9
|
+
|
10
|
+
<%= f.input :transform, :collection => Transform.transforms, :label_method => :display_name, :value_method => :name %>
|
11
|
+
<%= f.input :transform_json, :as => :text %>
|
12
|
+
|
13
|
+
<%= f.button :submit %>
|
14
|
+
<% end %>
|
@@ -2,7 +2,7 @@
|
|
2
2
|
<ul>
|
3
3
|
<% list.each do |report| %>
|
4
4
|
<% if permitted_to? :show, report %>
|
5
|
-
<li><%= link_to report.name,
|
5
|
+
<li><%= link_to report.name, daily_table_daily_report_path(report.table, report) %></li>
|
6
6
|
<% end %>
|
7
7
|
<% end %>
|
8
8
|
</ul>
|
File without changes
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<% title @daily_report.name %>
|
2
|
+
<h3>Table: <%= link_to @daily_report.table.name, daily_table_path(@daily_report.table) %></h3>
|
3
|
+
|
4
|
+
<% if @daily_report.file_exists? %>
|
5
|
+
<h5>URL: <%= link_to @daily_report.url(root_url), @daily_report.url(root_url) %></h5>
|
6
|
+
<% else %>
|
7
|
+
<h5>URL: <%= @daily_report.url(root_url) %></h5>
|
8
|
+
<% end %>
|
9
|
+
|
10
|
+
<h6>User: <%= "#{@daily_report.user.email}" %></h6>
|
11
|
+
<h6>Running time: <%= report_time_run(@daily_report) %></h6>
|
12
|
+
<h6>Last updated: <%= report_time_ago(@daily_report) %></h6>
|
13
|
+
<h6>Next updated: <%= report_time_next(@daily_report) %></h6>
|
14
|
+
<%= button_to "Queue Update Now", generate_daily_table_daily_report_path(@daily_report.table, @daily_report) if permitted_to? :generate, @daily_report %>
|
15
|
+
|
16
|
+
<%= content_tag(:p, link_to("Edit", edit_daily_table_daily_report_path(@daily_report.table, @daily_report))) if permitted_to? :edit, @daily_report %>
|
17
|
+
|
18
|
+
<%= formatter_display(@daily_report) %>
|
19
|
+
|
20
|
+
<%= transform_display(@daily_report) %>
|
21
|
+
|
22
|
+
<hr/>
|
23
|
+
<%= report_error_html(@daily_report) %>
|
@@ -1,8 +1,11 @@
|
|
1
|
-
<%= simple_form_for @
|
1
|
+
<%= simple_form_for @daily_table do |f| %>
|
2
2
|
<%= f.input :name %>
|
3
|
-
|
3
|
+
|
4
|
+
<%= f.input :metric, :collection => Metric.metrics, :label_method => :display_name, :value_method => :name, :include_blank => false %>
|
5
|
+
<%= f.input :metric_data %>
|
4
6
|
|
5
7
|
<%= f.input :transform, :collection => Transform.transforms, :label_method => :display_name, :value_method => :name %>
|
6
8
|
<%= f.input :transform_json, :as => :text %>
|
9
|
+
|
7
10
|
<%= f.button :submit %>
|
8
11
|
<% end %>
|
File without changes
|
File without changes
|
@@ -0,0 +1,35 @@
|
|
1
|
+
<% title @daily_table.name %>
|
2
|
+
|
3
|
+
<h3>Reports</h3>
|
4
|
+
<p><%= link_to "New report from this table", new_daily_table_daily_report_path(@daily_table) if permitted_to? :report, @daily_table %></p>
|
5
|
+
<%= render "daily_reports/list", :list => @daily_table.reports %>
|
6
|
+
|
7
|
+
<hr/>
|
8
|
+
|
9
|
+
<h6>User: <%= "#{@daily_table.user.email}" %></h6>
|
10
|
+
<h6>Type: <%= "#{@daily_table.metric_name}" %></h6>
|
11
|
+
<h6>Running time: <%= table_time_run(@daily_table) %></h6>
|
12
|
+
<%= content_tag(:p, link_to("Edit", edit_daily_table_path(@daily_table))) if permitted_to? :edit, @daily_table %>
|
13
|
+
|
14
|
+
<% if @test_html %>
|
15
|
+
<p><%= link_to "Hide Table Output", daily_table_path(@daily_table) %></p>
|
16
|
+
<%= @test_html %>
|
17
|
+
<% else %>
|
18
|
+
<p><%= link_to "See Table Output", daily_table_path(@daily_table, :test => true) %></p>
|
19
|
+
|
20
|
+
<% if @daily_table.column_names and @daily_table.column_names.size > 0 %>
|
21
|
+
<table>
|
22
|
+
<tr>
|
23
|
+
<% @daily_table.column_names.each do |name| %>
|
24
|
+
<th><%= name %></th>
|
25
|
+
<% end %>
|
26
|
+
</tr>
|
27
|
+
</table>
|
28
|
+
<% end %>
|
29
|
+
<% end %>
|
30
|
+
|
31
|
+
<hr/>
|
32
|
+
|
33
|
+
<%= simple_format(@daily_table.metric_data) %>
|
34
|
+
|
35
|
+
<%= transform_display(@daily_table) %>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<h3>Tables</h3>
|
2
|
+
<p><%= link_to "New Table", new_daily_table_path if user == current_user && permitted_to?(:new, :daily_tables) %></p>
|
3
|
+
<%= render "daily_tables/list", :list => user.tables %>
|
4
|
+
|
5
|
+
<% if user.reports.size > 0 %>
|
6
|
+
<h3>Reports</h3>
|
7
|
+
<%= render "daily_reports/list", :list => user.reports %>
|
8
|
+
<% end %>
|
File without changes
|
File without changes
|