daily 0.0.3 → 0.0.4

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.
Files changed (60) hide show
  1. data/app/controllers/daily_reports_controller.rb +35 -0
  2. data/app/controllers/daily_tables_controller.rb +24 -0
  3. data/app/controllers/{users_controller.rb → daily_users_controller.rb} +6 -6
  4. data/app/controllers/main_controller.rb +1 -1
  5. data/app/jobs/generate_report_job.rb +5 -1
  6. data/app/metrics/metric.rb +41 -0
  7. data/app/metrics/sql_query.rb +11 -0
  8. data/app/models/{report.rb → daily_report.rb} +4 -4
  9. data/app/models/{table.rb → daily_table.rb} +27 -17
  10. data/app/models/{user.rb → daily_user.rb} +3 -3
  11. data/app/transforms/transform.rb +2 -1
  12. data/app/views/daily_reports/_form.erb +14 -0
  13. data/app/views/{reports → daily_reports}/_list.erb +1 -1
  14. data/app/views/daily_reports/edit.erb +2 -0
  15. data/app/views/daily_reports/index.erb +3 -0
  16. data/app/views/{reports → daily_reports}/new.erb +0 -0
  17. data/app/views/daily_reports/show.erb +23 -0
  18. data/app/views/{tables → daily_tables}/_form.erb +5 -2
  19. data/app/views/{tables → daily_tables}/_list.erb +0 -0
  20. data/app/views/daily_tables/edit.erb +2 -0
  21. data/app/views/daily_tables/index.erb +3 -0
  22. data/app/views/{tables → daily_tables}/new.erb +0 -0
  23. data/app/views/daily_tables/show.erb +35 -0
  24. data/app/views/{users → daily_users}/_form.erb +1 -1
  25. data/app/views/daily_users/_items.erb +8 -0
  26. data/app/views/{users → daily_users}/_list.erb +0 -0
  27. data/app/views/daily_users/edit.erb +2 -0
  28. data/app/views/daily_users/index.erb +3 -0
  29. data/app/views/{users → daily_users}/new.erb +0 -0
  30. data/app/views/daily_users/show.erb +4 -0
  31. data/app/views/main/home.erb +1 -1
  32. data/config/authorization_rules.rb +11 -11
  33. data/config/initializers/ruport.rb +1 -2
  34. data/config/locales/en.yml +27 -1
  35. data/config/routes.rb +6 -6
  36. data/db/development.sqlite3 +0 -0
  37. data/db/migrate/20120111054115_create_table_metrics.rb +42 -0
  38. data/db/migrate/20120111081745_namespace_models.rb +13 -0
  39. data/db/schema.rb +26 -25
  40. data/db/test.sqlite3 +0 -0
  41. data/lib/daily.rb +4 -4
  42. data/lib/daily/activemetric.rb +5 -0
  43. data/lib/daily/daily_config.rb +20 -3
  44. data/lib/daily/version.rb +1 -1
  45. data/lib/{daily → engine}/engine.rb +0 -0
  46. data/lib/tasks/user.rake +2 -2
  47. metadata +63 -44
  48. data/app/controllers/reports_controller.rb +0 -35
  49. data/app/controllers/tables_controller.rb +0 -20
  50. data/app/views/reports/_form.erb +0 -14
  51. data/app/views/reports/edit.erb +0 -2
  52. data/app/views/reports/index.erb +0 -3
  53. data/app/views/reports/show.erb +0 -23
  54. data/app/views/tables/edit.erb +0 -2
  55. data/app/views/tables/index.erb +0 -3
  56. data/app/views/tables/show.erb +0 -35
  57. data/app/views/users/_items.erb +0 -8
  58. data/app/views/users/edit.erb +0 -2
  59. data/app/views/users/index.erb +0 -3
  60. 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 UsersController < InheritedResources::Base
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[:user][:password] = nil if params[:user][:password].blank?
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 @user == current_user
20
- sign_in @user, :bypass => true
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, @user
23
- redirect_to user_path(@user)
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
@@ -1,5 +1,5 @@
1
1
  class MainController < ApplicationController
2
2
  def home
3
- redirect_to root_url unless current_user
3
+ redirect_to root_path unless current_user
4
4
  end
5
5
  end
@@ -1,7 +1,11 @@
1
1
  class GenerateReportJob < Struct.new(:report_id, :requeue)
2
2
 
3
+ def enqueue(job)
4
+ job.report_id = self.report_id
5
+ end
6
+
3
7
  def report
4
- @report ||= Report.find_by_id(report_id)
8
+ @daily_report ||= DailyReport.find_by_id(report_id)
5
9
  end
6
10
 
7
11
  def perform
@@ -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
@@ -0,0 +1,11 @@
1
+ class SqlQuery < Metric
2
+ validates_presence_of_data
3
+
4
+ def self.display_name
5
+ "SQL Query"
6
+ end
7
+
8
+ def result
9
+ Ruport::Query.new(data).result
10
+ end
11
+ end
@@ -1,8 +1,8 @@
1
- class Report < ActiveRecord::Base
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 Table < ActiveRecord::Base
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 :data
12
- validates_stripped_presence_of :data_type
14
+ validates_stripped_presence_of :metric
13
15
 
14
- validate :data_type_known
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
- def data_type_known
54
- return if data_type.blank?
55
- unless sql?
56
- errors.add(:data_type, "is not known")
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
- return Ruport::Query.new(data).result if sql?
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 User < ActiveRecord::Base
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?
@@ -1,6 +1,7 @@
1
1
  class Transform
2
2
  def self.transforms
3
- [ColumnFilter, MovingAverage]
3
+ DailyConfig.load_classes if Rails.env.development?
4
+ subclasses
4
5
  end
5
6
 
6
7
  def self.display_name
@@ -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, table_report_path(report.table, report) %></li>
5
+ <li><%= link_to report.name, daily_table_daily_report_path(report.table, report) %></li>
6
6
  <% end %>
7
7
  <% end %>
8
8
  </ul>
@@ -0,0 +1,2 @@
1
+ <% title "Edit Report: #{@daily_report.name}" %>
2
+ <%= render 'form' %>
@@ -0,0 +1,3 @@
1
+ <% title "Reports" %>
2
+
3
+ <%= render "daily_reports/list", :list => @daily_reports %>
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 @table do |f| %>
1
+ <%= simple_form_for @daily_table do |f| %>
2
2
  <%= f.input :name %>
3
- <%= f.input :data %>
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
@@ -0,0 +1,2 @@
1
+ <% title "Edit Table: #{@daily_table.name}" %>
2
+ <%= render 'form' %>
@@ -0,0 +1,3 @@
1
+ <% title "Tables" %>
2
+
3
+ <%= render "daily_tables/list", :list => @daily_tables %>
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) %>
@@ -1,4 +1,4 @@
1
- <%= simple_form_for @user do |f| %>
1
+ <%= simple_form_for @daily_user do |f| %>
2
2
  <%= f.input :email %>
3
3
  <%= f.input :password %>
4
4
  <%= f.button :submit %>
@@ -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
@@ -0,0 +1,2 @@
1
+ <% title "Edit User: #{@daily_user.email}" %>
2
+ <%= render 'form' %>
@@ -0,0 +1,3 @@
1
+ <% title "Users" %>
2
+
3
+ <%= render "daily_users/list", :list => @daily_users %>
File without changes
@@ -0,0 +1,4 @@
1
+ <% title "#{@daily_user.email}" %>
2
+ <%= content_tag(:p, link_to("Update Account", edit_daily_user_path(@daily_user))) if permitted_to? :edit, @daily_user %>
3
+
4
+ <%= render 'daily_users/items', :user => @daily_user %>