daily 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
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 %>