effective_logging 1.11.5 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/MIT-LICENSE +1 -1
- data/README.md +1 -21
- data/app/controllers/admin/logs_controller.rb +10 -20
- data/app/controllers/effective/logs_controller.rb +14 -30
- data/app/datatables/effective_logs_datatable.rb +51 -53
- data/app/helpers/effective_logging_helper.rb +6 -8
- data/app/models/concerns/acts_as_loggable.rb +2 -6
- data/app/models/effective/log.rb +4 -19
- data/app/views/admin/logs/_actions.html.haml +3 -11
- data/app/views/effective/logs/_log.html.haml +22 -17
- data/app/views/effective/logs/index.html.haml +1 -4
- data/config/effective_logging.rb +2 -4
- data/config/routes.rb +2 -4
- data/lib/effective_logging/engine.rb +1 -13
- data/lib/effective_logging/log_page_views.rb +5 -12
- data/lib/effective_logging/set_current_user.rb +1 -9
- data/lib/effective_logging/version.rb +1 -1
- data/lib/effective_logging.rb +15 -7
- metadata +6 -9
- data/app/models/effective/datatables/logs.rb +0 -80
- data/app/views/active_admin/effective_logging/logs/index.html.haml +0 -7
- data/app/views/active_admin/effective_logging/logs/show.html.haml +0 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ee73b0a26f21fe2980801d4b8e901ec547ae7721
|
4
|
+
data.tar.gz: 46e1f46fac857042523878446ea3c364e138d887
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: daaddf8064d083684ca67c8629f210d5cde233ff0d4c03cc39b428cdd3f078599417c5b121aa82dcbe7a5e23a37c26e5e954025b3ba4b74cf41a12805b17ec2c
|
7
|
+
data.tar.gz: c7a757f10c577b05c8069f822a3f2427c8a2e0cb9d14e0f4cda880a8cb33f806c0ab6681d844b98eb02e7a5dd8e97b037c3a54ffdfb89d8eb88f056630d910f6
|
data/MIT-LICENSE
CHANGED
data/README.md
CHANGED
@@ -2,8 +2,6 @@
|
|
2
2
|
|
3
3
|
Automatically log all sent emails, user logins, and page views. This also will log custom events from Ruby and JavaScript.
|
4
4
|
|
5
|
-
A Rails3 / Rails4 engine to completely handle logging of events.
|
6
|
-
|
7
5
|
Logs are stored in a single database table. A Log (one logged event) can have many children Logs, nested to any depth.
|
8
6
|
|
9
7
|
Provides a ruby one-liner to log a message, status, user, associated object and any number of additional details.
|
@@ -294,13 +292,7 @@ Creating child logs via JavaScript is not yet supported.
|
|
294
292
|
|
295
293
|
## Admin Screen
|
296
294
|
|
297
|
-
|
298
|
-
|
299
|
-
```ruby
|
300
|
-
gem 'effective_datatables'
|
301
|
-
```
|
302
|
-
|
303
|
-
Then you should be able to visit:
|
295
|
+
Visit:
|
304
296
|
|
305
297
|
```ruby
|
306
298
|
link_to 'Logs', effective_logging.admin_logs_path # /admin/logs
|
@@ -341,22 +333,10 @@ EffectiveLogsDatatable.new(for: @user.id)
|
|
341
333
|
EffectiveLogsDatatable.new(for: [1, 2, 3]) # Users with ID 1, 2 and 3
|
342
334
|
```
|
343
335
|
|
344
|
-
|
345
336
|
## License
|
346
337
|
|
347
338
|
MIT License. Copyright [Code and Effect Inc.](http://www.codeandeffect.com/)
|
348
339
|
|
349
|
-
## Testing
|
350
|
-
|
351
|
-
The test suite for this gem is unfortunately not yet complete.
|
352
|
-
|
353
|
-
Run tests by:
|
354
|
-
|
355
|
-
```ruby
|
356
|
-
rake spec
|
357
|
-
```
|
358
|
-
|
359
|
-
|
360
340
|
## Contributing
|
361
341
|
|
362
342
|
1. Fork it
|
@@ -1,42 +1,32 @@
|
|
1
1
|
module Admin
|
2
2
|
class LogsController < ApplicationController
|
3
|
-
|
3
|
+
before_action :authenticate_user!
|
4
|
+
skip_log_page_views
|
4
5
|
|
5
6
|
layout (EffectiveLogging.layout.kind_of?(Hash) ? EffectiveLogging.layout[:admin_logs] : EffectiveLogging.layout)
|
6
7
|
|
7
|
-
skip_log_page_views quiet: true
|
8
|
-
helper EffectiveLoggingHelper
|
9
|
-
|
10
8
|
def index
|
11
|
-
|
12
|
-
@datatable = Effective::Datatables::Logs.new()
|
13
|
-
else
|
14
|
-
@datatable = EffectiveLogsDatatable.new(self)
|
15
|
-
end
|
9
|
+
@datatable = EffectiveLogsDatatable.new(self)
|
16
10
|
|
17
11
|
@page_title = 'Logs'
|
18
12
|
|
19
|
-
EffectiveLogging.
|
20
|
-
EffectiveLogging.
|
13
|
+
EffectiveLogging.authorize!(self, :index, Effective::Log)
|
14
|
+
EffectiveLogging.authorize!(self, :admin, :effective_logging)
|
21
15
|
end
|
22
16
|
|
23
17
|
def show
|
24
18
|
@log = Effective::Log.includes(:logs).find(params[:id])
|
25
|
-
@log.next_log = Effective::Log.
|
26
|
-
@log.prev_log = Effective::Log.
|
19
|
+
@log.next_log = Effective::Log.order(:id).where(parent_id: @log.parent_id).where('id > ?', @log.id).first
|
20
|
+
@log.prev_log = Effective::Log.order(:id).where(parent_id: @log.parent_id).where('id < ?', @log.id).last
|
27
21
|
|
28
22
|
@page_title = "Log ##{@log.to_param}"
|
29
23
|
|
30
24
|
if @log.logs.present?
|
31
|
-
|
32
|
-
@log.datatable = Effective::Datatables::Logs.new(log_id: @log.id)
|
33
|
-
else
|
34
|
-
@log.datatable = EffectiveLogsDatatable.new(self, log_id: @log.id)
|
35
|
-
end
|
25
|
+
@log.datatable = EffectiveLogsDatatable.new(self, log_id: @log.id)
|
36
26
|
end
|
37
27
|
|
38
|
-
EffectiveLogging.
|
39
|
-
EffectiveLogging.
|
28
|
+
EffectiveLogging.authorize!(self, :show, @log)
|
29
|
+
EffectiveLogging.authorize!(self, :admin, :effective_logging)
|
40
30
|
end
|
41
31
|
end
|
42
32
|
end
|
@@ -1,21 +1,16 @@
|
|
1
1
|
module Effective
|
2
2
|
class LogsController < ApplicationController
|
3
|
-
skip_log_page_views
|
4
|
-
|
5
|
-
if respond_to?(:before_action) # Devise
|
6
|
-
before_action :authenticate_user!, only: [:index, :show]
|
7
|
-
else
|
8
|
-
before_filter :authenticate_user!, only: [:index, :show]
|
9
|
-
end
|
3
|
+
skip_log_page_views
|
4
|
+
before_action :authenticate_user!, only: [:index, :show]
|
10
5
|
|
11
6
|
# This is a post from our Javascript
|
12
7
|
def create
|
13
|
-
EffectiveLogging.
|
8
|
+
EffectiveLogging.authorize!(self, :create, Effective::Log.new)
|
14
9
|
|
15
|
-
@log = Effective::Log.new
|
10
|
+
@log = Effective::Log.new.tap do |log|
|
16
11
|
log.message = log_params[:message]
|
17
|
-
log.status =
|
18
|
-
log.user =
|
12
|
+
log.status = EffectiveLogging.statuses.find { |status| status == log_params[:status] } || 'info'
|
13
|
+
log.user = EffectiveLogging.current_user || current_user
|
19
14
|
|
20
15
|
count = -1
|
21
16
|
Array((JSON.parse(log_params[:details]) rescue [])).flatten(1).each do |obj|
|
@@ -39,38 +34,31 @@ module Effective
|
|
39
34
|
|
40
35
|
# This is the User index event
|
41
36
|
def index
|
42
|
-
|
43
|
-
@datatable = Effective::Datatables::Logs.new(user_id: current_user.id)
|
44
|
-
else
|
45
|
-
@datatable = EffectiveLogsDatatable.new(self, user_id: current_user.id)
|
46
|
-
end
|
37
|
+
EffectiveLogging.authorize!(self, :index, Effective::Log.new(user_id: current_user.id))
|
47
38
|
|
48
|
-
|
39
|
+
@datatable = EffectiveLogsDatatable.new(self, user_id: current_user.id)
|
49
40
|
end
|
50
41
|
|
51
42
|
# This is the User show event
|
52
43
|
def show
|
53
44
|
@log = Effective::Log.includes(:logs).find(params[:id])
|
45
|
+
|
46
|
+
EffectiveLogging.authorize!(self, :show, @log)
|
47
|
+
|
54
48
|
@log.next_log = Effective::Log.unscoped.order(:id).where(parent_id: @log.parent_id).where('id > ?', @log.id).first
|
55
49
|
@log.prev_log = Effective::Log.unscoped.order(:id).where(parent_id: @log.parent_id).where('id < ?', @log.id).last
|
56
50
|
|
57
51
|
@page_title = "Log ##{@log.to_param}"
|
58
52
|
|
59
53
|
if @log.logs.present?
|
60
|
-
|
61
|
-
@log.datatable = Effective::Datatables::Logs.new(log_id: @log.id)
|
62
|
-
else
|
63
|
-
@log.datatable = EffectiveLogsDatatable.new(self, log_id: @log.id)
|
64
|
-
end
|
54
|
+
@log.datatable = EffectiveLogsDatatable.new(self, log_id: @log.id)
|
65
55
|
end
|
66
|
-
|
67
|
-
EffectiveLogging.authorized?(self, :show, @log)
|
68
56
|
end
|
69
57
|
|
70
58
|
def html_part
|
71
59
|
@log = Effective::Log.find(params[:id])
|
72
60
|
|
73
|
-
EffectiveLogging.
|
61
|
+
EffectiveLogging.authorize!(self, :show, @log)
|
74
62
|
|
75
63
|
value = @log.details[(params[:key] || '').to_sym].to_s
|
76
64
|
|
@@ -88,11 +76,7 @@ module Effective
|
|
88
76
|
|
89
77
|
# StrongParameters
|
90
78
|
def log_params
|
91
|
-
|
92
|
-
params.require(:effective_log).permit(:message, :status, :details)
|
93
|
-
rescue => e
|
94
|
-
params[:effective_log] || {}
|
95
|
-
end
|
79
|
+
params.require(:effective_log).permit(:message, :status, :details)
|
96
80
|
end
|
97
81
|
|
98
82
|
end
|
@@ -1,72 +1,70 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
order :updated_at
|
1
|
+
class EffectiveLogsDatatable < Effective::Datatable
|
2
|
+
datatable do
|
3
|
+
order :updated_at
|
5
4
|
|
6
|
-
|
7
|
-
|
5
|
+
col :updated_at, label: 'Date'
|
6
|
+
col :id, visible: false
|
8
7
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
8
|
+
if attributes[:user] == false
|
9
|
+
# Do not include
|
10
|
+
elsif attributes[:for]
|
11
|
+
col :user, search: :string
|
12
|
+
else
|
13
|
+
col :user
|
14
|
+
end
|
16
15
|
|
17
|
-
|
18
|
-
|
19
|
-
|
16
|
+
unless attributes[:status] == false
|
17
|
+
col :status, search: { collection: EffectiveLogging.statuses }
|
18
|
+
end
|
20
19
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
20
|
+
unless attributes[:log_changes]
|
21
|
+
col :associated_type, search: { as: :string }, visible: false
|
22
|
+
col :associated_id, search: { as: :integer }, visible: false, label: 'Associated Id'
|
23
|
+
col :associated_to_s, search: { as: :string }, label: 'Associated'
|
24
|
+
end
|
26
25
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
end
|
31
|
-
else
|
32
|
-
col :message
|
26
|
+
if attributes[:log_changes]
|
27
|
+
col :message do |log|
|
28
|
+
log.message.starts_with?("\t") ? log.message.gsub("\t", " ") : log.message
|
33
29
|
end
|
30
|
+
else
|
31
|
+
col :message
|
32
|
+
end
|
34
33
|
|
35
|
-
|
34
|
+
col :logs_count, visible: false
|
36
35
|
|
37
|
-
|
38
|
-
|
39
|
-
end
|
40
|
-
|
41
|
-
unless attributes[:actions] == false
|
42
|
-
actions_col partial: 'admin/logs/actions', partial_as: :log
|
43
|
-
end
|
36
|
+
col :details, visible: false, sort: false do |log|
|
37
|
+
tableize_hash(log.details.except(:email))
|
44
38
|
end
|
45
39
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
40
|
+
unless attributes[:actions] == false
|
41
|
+
actions_col partial: 'admin/logs/actions', partial_as: :log
|
42
|
+
end
|
43
|
+
end
|
50
44
|
|
51
|
-
|
52
|
-
|
53
|
-
|
45
|
+
# A nil attributes[:log_id] means give me all the top level log entries
|
46
|
+
# If we set a log_id then it's for sub logs
|
47
|
+
collection do
|
48
|
+
scope = Effective::Log.deep.where(parent_id: attributes[:log_id])
|
54
49
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
end
|
50
|
+
if attributes[:log_changes]
|
51
|
+
scope = scope.where(status: EffectiveLogging.log_changes_status)
|
52
|
+
end
|
59
53
|
|
60
|
-
|
61
|
-
|
62
|
-
|
54
|
+
if attributes[:for]
|
55
|
+
user_ids = Array(attributes[:for])
|
56
|
+
scope = scope.where('user_id IN (?) OR (associated_id IN (?) AND associated_type = ?)', user_ids, user_ids, 'User')
|
57
|
+
end
|
63
58
|
|
64
|
-
|
65
|
-
|
66
|
-
|
59
|
+
if attributes[:associated_id] && attributes[:associated_type]
|
60
|
+
scope = scope.where(associated_id: attributes[:associated_id], associated_type: attributes[:associated_type])
|
61
|
+
end
|
67
62
|
|
68
|
-
|
63
|
+
if attributes[:associated]
|
64
|
+
scope = scope.where(associated: attributes[:associated])
|
69
65
|
end
|
70
66
|
|
67
|
+
scope
|
71
68
|
end
|
69
|
+
|
72
70
|
end
|
@@ -12,7 +12,7 @@ module EffectiveLoggingHelper
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def render_log(log)
|
15
|
-
render(partial: 'effective/logs/log', locals: {log: log})
|
15
|
+
render(partial: 'effective/logs/log', locals: { log: log })
|
16
16
|
end
|
17
17
|
|
18
18
|
def parents_of_log(log)
|
@@ -24,13 +24,11 @@ module EffectiveLoggingHelper
|
|
24
24
|
# This is called on the Logs#show Admin page, and is intended for override by the application
|
25
25
|
def effective_logging_object_link_to(obj, action = :show)
|
26
26
|
if obj.kind_of?(User)
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
end
|
33
|
-
)
|
27
|
+
if action == :show && defined?(admin_user_path)
|
28
|
+
link_to('View', admin_user_path(obj))
|
29
|
+
elsif action == :edit && defined?(edit_admin_user_path)
|
30
|
+
link_to('Edit', edit_admin_user_path(obj))
|
31
|
+
end
|
34
32
|
end
|
35
33
|
end
|
36
34
|
|
@@ -14,7 +14,7 @@ module ActsAsLoggable
|
|
14
14
|
end
|
15
15
|
|
16
16
|
included do
|
17
|
-
has_many :logged_changes, -> { where(status: EffectiveLogging.log_changes_status) }, as: :associated, class_name: 'Effective::Log'
|
17
|
+
has_many :logged_changes, -> { order(:id).where(status: EffectiveLogging.log_changes_status) }, as: :associated, class_name: 'Effective::Log'
|
18
18
|
|
19
19
|
around_save do |_, block|
|
20
20
|
@acts_as_loggable_new_record = new_record?
|
@@ -72,11 +72,7 @@ module ActsAsLoggable
|
|
72
72
|
return nil unless persisted?
|
73
73
|
|
74
74
|
@log_changes_datatable ||= (
|
75
|
-
|
76
|
-
Effective::Datatables::Logs.new(associated_id: id, associated_type: self.class.name, log_changes: true, status: false)
|
77
|
-
else
|
78
|
-
EffectiveLogsDatatable.new(associated_id: id, associated_type: self.class.name, log_changes: true, status: false)
|
79
|
-
end
|
75
|
+
EffectiveLogsDatatable.new(associated_id: id, associated_type: self.class.name, log_changes: true, status: false)
|
80
76
|
)
|
81
77
|
end
|
82
78
|
|
data/app/models/effective/log.rb
CHANGED
@@ -11,15 +11,8 @@ module Effective
|
|
11
11
|
belongs_to :parent, class_name: 'Effective::Log', counter_cache: true
|
12
12
|
has_many :logs, class_name: 'Effective::Log', foreign_key: :parent_id
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
if Gem::Version.new(Rails.version) < Gem::Version.new('5.0')
|
17
|
-
belongs_to :user
|
18
|
-
belongs_to :associated, polymorphic: true
|
19
|
-
else
|
20
|
-
belongs_to :user, optional: true
|
21
|
-
belongs_to :associated, polymorphic: true, optional: true
|
22
|
-
end
|
14
|
+
belongs_to :user
|
15
|
+
belongs_to :associated, polymorphic: true
|
23
16
|
|
24
17
|
serialize :details, Hash
|
25
18
|
|
@@ -37,8 +30,8 @@ module Effective
|
|
37
30
|
validates :message, presence: true
|
38
31
|
validates :status, presence: true, inclusion: { in: EffectiveLogging.statuses }
|
39
32
|
|
40
|
-
|
41
|
-
|
33
|
+
scope :deep, -> { includes(:user, :associated) }
|
34
|
+
scope :sorted, -> { order(:id) }
|
42
35
|
scope :logged_changes, -> { where(status: EffectiveLogging.log_changes_status)}
|
43
36
|
scope :changes, -> { where(status: EffectiveLogging.log_changes_status)}
|
44
37
|
|
@@ -58,14 +51,6 @@ module Effective
|
|
58
51
|
self[:details] || {}
|
59
52
|
end
|
60
53
|
|
61
|
-
# def next_log
|
62
|
-
# @next_log ||= Log.unscoped.order(:id).where(:parent_id => self.parent_id).where('id > ?', self.id).first
|
63
|
-
# end
|
64
|
-
|
65
|
-
# def prev_log
|
66
|
-
# @prev_log ||= Log.unscoped.order(:id).where(:parent_id => self.parent_id).where('id < ?', self.id).last
|
67
|
-
# end
|
68
|
-
|
69
54
|
# Dynamically add logging methods based on the defined statuses
|
70
55
|
# EffectiveLogging.info 'my message'
|
71
56
|
(EffectiveLogging.statuses || []).each do |status|
|
@@ -1,15 +1,7 @@
|
|
1
|
-
:
|
2
|
-
show_path =
|
3
|
-
if datatable.try(:admin_namespace?)
|
4
|
-
effective_logging.admin_log_path(log)
|
5
|
-
else
|
6
|
-
effective_logging.log_path(log)
|
7
|
-
end
|
1
|
+
- show_path = (datatable.admin_namespace? ? effective_logging.admin_log_path(log) : effective_logging.log_path(log))
|
8
2
|
|
9
|
-
- if
|
10
|
-
=
|
11
|
-
%span.glyphicon.glyphicon-eye-open
|
12
|
-
= "(#{log.logs_count})"
|
3
|
+
- if defined?(EffectiveBootstrap)
|
4
|
+
= show_icon_to(show_path)
|
13
5
|
- else
|
14
6
|
= link_to show_path, title: 'View' do
|
15
7
|
%span.glyphicon.glyphicon-eye-open
|
@@ -1,33 +1,37 @@
|
|
1
|
-
.panel
|
2
|
-
.panel-heading
|
1
|
+
.panel.card
|
2
|
+
.panel-heading.card-header
|
3
3
|
.row
|
4
|
-
.col-
|
4
|
+
.col-md-10
|
5
5
|
- parents_of_log(log).each do |parent|
|
6
|
-
= link_to(log.message,
|
6
|
+
= link_to(log.message, request.fullpath.sub('/' + log.to_param, '/' + parent.to_param))
|
7
7
|
= ' > '
|
8
8
|
%p= log.message.html_safe
|
9
|
-
.col-
|
10
|
-
|
11
|
-
|
9
|
+
.col-md-2.text-right
|
10
|
+
- if log.prev_log
|
11
|
+
= link_to 'Prev', request.fullpath.sub('/' + log.to_param, '/' + log.prev_log.to_param), class: 'btn btn-primary'
|
12
12
|
|
13
|
-
|
13
|
+
- if log.next_log
|
14
|
+
= link_to 'Next', request.fullpath.sub('/' + log.to_param, '/' + log.prev_log.to_param), class: 'btn btn-primary'
|
15
|
+
|
16
|
+
.panel-body.card-body
|
14
17
|
.row
|
15
|
-
.col-
|
16
|
-
|
18
|
+
.col-md-6
|
19
|
+
- status_class = bootstrap_class_for_status(log.status)
|
20
|
+
%span.label.badge{:class => "label-#{status_class} badge-#{status_class}"}= log.status
|
17
21
|
|
18
|
-
= log.created_at.strftime("%
|
22
|
+
= log.created_at.strftime("%F %H:%M:%S")
|
19
23
|
= '(' + time_ago_in_words(log.created_at) + ' ago)'
|
20
24
|
%br
|
21
25
|
%br
|
22
26
|
|
23
|
-
.col-
|
27
|
+
.col-md-6
|
24
28
|
- if log.user.present?
|
25
29
|
%strong User:
|
26
30
|
|
27
31
|
= (log.user.to_s.starts_with?('#<User:0x') ? (log.user.email rescue log.user) : log.user)
|
28
32
|
- if (log.associated.present? rescue false)
|
29
33
|
%br
|
30
|
-
%strong
|
34
|
+
%strong Associated:
|
31
35
|
|
32
36
|
- if log.associated.to_s.starts_with?('#<')
|
33
37
|
= "#{log.associated.class.name} ##{log.associated.to_param}"
|
@@ -37,20 +41,21 @@
|
|
37
41
|
- log.details.each do |key, value|
|
38
42
|
- next unless value.present?
|
39
43
|
.row
|
40
|
-
.col-
|
44
|
+
.col-md-12
|
41
45
|
%p
|
42
46
|
%strong= "#{key.to_s.titleize}:"
|
43
47
|
= format_log_details_value(log, key)
|
44
48
|
|
45
49
|
- if log.logs.present?
|
46
50
|
.row
|
47
|
-
.col-
|
51
|
+
.col-md-12
|
48
52
|
%br
|
49
53
|
%p
|
50
54
|
%strong Additional Entries:
|
51
55
|
= "this log contains #{log.logs_count} additional sub entries"
|
52
|
-
|
56
|
+
|
57
|
+
- unless log.datatable.nil?
|
53
58
|
%hr
|
54
59
|
.row
|
55
|
-
.col-
|
60
|
+
.col-md-12= render_datatable(log.datatable)
|
56
61
|
|
data/config/effective_logging.rb
CHANGED
@@ -23,9 +23,6 @@ EffectiveLogging.setup do |config|
|
|
23
23
|
# config.authorization_method = false
|
24
24
|
config.authorization_method = Proc.new { |controller, action, resource| authorize!(action, resource) } # CanCanCan
|
25
25
|
|
26
|
-
# Register Effective::Logs with ActiveAdmin if ActiveAdmin is present
|
27
|
-
config.use_active_admin = true
|
28
|
-
|
29
26
|
# Admin Screens Layout Settings
|
30
27
|
config.layout = 'application' # All EffectiveLogging controllers will use this layout
|
31
28
|
|
@@ -34,8 +31,9 @@ EffectiveLogging.setup do |config|
|
|
34
31
|
# admin_logs: 'admin',
|
35
32
|
# }
|
36
33
|
|
37
|
-
# All statuses defined here, as well as 'info', 'success', and 'error' (hardcoded) will be created as
|
38
34
|
# EffectiveLogger.info('my message') macros
|
35
|
+
# The following statuses are already present: info, success, error, view, change, email, sign_in, sign_out
|
36
|
+
# Add more here
|
39
37
|
config.additional_statuses = []
|
40
38
|
|
41
39
|
#########################################
|
data/config/routes.rb
CHANGED
@@ -11,14 +11,6 @@ module EffectiveLogging
|
|
11
11
|
eval File.read("#{config.root}/config/effective_logging.rb")
|
12
12
|
end
|
13
13
|
|
14
|
-
# ActiveAdmin (optional)
|
15
|
-
# This prepends the load path so someone can override the assets.rb if they want.
|
16
|
-
initializer 'effective_logging.active_admin' do
|
17
|
-
if defined?(ActiveAdmin) && EffectiveLogging.use_active_admin == true
|
18
|
-
ActiveAdmin.application.load_paths.unshift Dir["#{config.root}/active_admin"]
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
14
|
# Automatically Log Emails
|
23
15
|
initializer 'effective_logging.emails' do |app|
|
24
16
|
if EffectiveLogging.email_enabled == true
|
@@ -55,11 +47,7 @@ module EffectiveLogging
|
|
55
47
|
config.after_initialize do
|
56
48
|
if EffectiveLogging.sign_in_enabled || EffectiveLogging.sign_out_enabled
|
57
49
|
ActiveSupport.on_load :active_record do
|
58
|
-
|
59
|
-
EffectiveLogging::UserLogger.create_warden_hooks()
|
60
|
-
else
|
61
|
-
raise ArgumentError.new("EffectiveLogging.sign_in_enabled only works with Devise")
|
62
|
-
end
|
50
|
+
EffectiveLogging::UserLogger.create_warden_hooks()
|
63
51
|
end
|
64
52
|
end
|
65
53
|
end
|
@@ -18,25 +18,18 @@ module EffectiveLogging
|
|
18
18
|
self.log_page_views_opts = logging_options
|
19
19
|
|
20
20
|
# Set up the after_filter to do page logging
|
21
|
-
|
22
|
-
after_action :effective_logging_log_page_view, filter_options
|
23
|
-
else
|
24
|
-
after_filter :effective_logging_log_page_view, filter_options
|
25
|
-
end
|
21
|
+
after_action :effective_logging_log_page_view, filter_options
|
26
22
|
end
|
27
23
|
|
28
24
|
def skip_log_page_views(options = {})
|
29
|
-
|
25
|
+
# Nothing
|
30
26
|
end
|
27
|
+
|
31
28
|
end
|
32
29
|
|
33
30
|
module ClassMethods
|
34
31
|
def skip_log_page_views(options = {})
|
35
|
-
|
36
|
-
before_action :skip_log_page_view, options
|
37
|
-
else
|
38
|
-
before_filter :skip_log_page_view, options
|
39
|
-
end
|
32
|
+
before_action :skip_log_page_view, options
|
40
33
|
end
|
41
34
|
end
|
42
35
|
|
@@ -45,7 +38,7 @@ module EffectiveLogging
|
|
45
38
|
return if @_effective_logging_skip_log_page_view == true
|
46
39
|
return if (self.class.log_page_views_opts[:skip_namespace] || []).include?(self.class.parent)
|
47
40
|
|
48
|
-
user =
|
41
|
+
user = EffectiveLogging.current_user || current_user
|
49
42
|
|
50
43
|
if self.class.log_page_views_opts[:details] == false
|
51
44
|
::EffectiveLogger.view("#{request.request_method} #{request.path}", user: user)
|
@@ -6,15 +6,7 @@ module EffectiveLogging
|
|
6
6
|
# before_action :set_effective_logging_current_user
|
7
7
|
|
8
8
|
def set_effective_logging_current_user
|
9
|
-
|
10
|
-
EffectiveLogging.current_user = current_user
|
11
|
-
else
|
12
|
-
raise "(effective_logging) set_effective_logging_current_user expects a current_user() method to be available"
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def set_log_changes_user
|
17
|
-
# No longer need to call this
|
9
|
+
EffectiveLogging.current_user = current_user
|
18
10
|
end
|
19
11
|
|
20
12
|
end
|
data/lib/effective_logging.rb
CHANGED
@@ -6,7 +6,6 @@ module EffectiveLogging
|
|
6
6
|
|
7
7
|
# The following are all valid config keys
|
8
8
|
mattr_accessor :logs_table_name
|
9
|
-
mattr_accessor :use_active_admin
|
10
9
|
|
11
10
|
mattr_accessor :authorization_method
|
12
11
|
mattr_accessor :layout
|
@@ -21,10 +20,20 @@ module EffectiveLogging
|
|
21
20
|
end
|
22
21
|
|
23
22
|
def self.authorized?(controller, action, resource)
|
24
|
-
if
|
25
|
-
|
23
|
+
@_exceptions ||= [Effective::AccessDenied, (CanCan::AccessDenied if defined?(CanCan)), (Pundit::NotAuthorizedError if defined?(Pundit))].compact
|
24
|
+
|
25
|
+
return !!authorization_method unless authorization_method.respond_to?(:call)
|
26
|
+
controller = controller.controller if controller.respond_to?(:controller)
|
27
|
+
|
28
|
+
begin
|
29
|
+
!!(controller || self).instance_exec((controller || self), action, resource, &authorization_method)
|
30
|
+
rescue *@_exceptions
|
31
|
+
false
|
26
32
|
end
|
27
|
-
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.authorize!(controller, action, resource)
|
36
|
+
raise Effective::AccessDenied unless authorized?(controller, action, resource)
|
28
37
|
end
|
29
38
|
|
30
39
|
def self.supressed(&block)
|
@@ -37,9 +46,8 @@ module EffectiveLogging
|
|
37
46
|
|
38
47
|
def self.statuses
|
39
48
|
@statuses ||= (
|
40
|
-
Array(@@additional_statuses).map
|
41
|
-
|
42
|
-
end | ['info', 'success', 'error', log_changes_status, ('email' if email_enabled), ('sign_in' if sign_in_enabled), ('sign_out' if sign_out_enabled), 'view'].compact
|
49
|
+
Array(@@additional_statuses).map { |status| status.to_s.downcase } | # union
|
50
|
+
['info', 'success', 'error', 'view', log_changes_status, ('email' if email_enabled), ('sign_in' if sign_in_enabled), ('sign_out' if sign_out_enabled)].compact
|
43
51
|
)
|
44
52
|
end
|
45
53
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: effective_logging
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Code and Effect
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-03-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -16,28 +16,28 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: '4'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: '4'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: effective_datatables
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: effective_resources
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -98,11 +98,8 @@ files:
|
|
98
98
|
- app/helpers/effective_logging_helper.rb
|
99
99
|
- app/models/concerns/acts_as_loggable.rb
|
100
100
|
- app/models/effective/access_denied.rb
|
101
|
-
- app/models/effective/datatables/logs.rb
|
102
101
|
- app/models/effective/log.rb
|
103
102
|
- app/models/effective_logger.rb
|
104
|
-
- app/views/active_admin/effective_logging/logs/index.html.haml
|
105
|
-
- app/views/active_admin/effective_logging/logs/show.html.haml
|
106
103
|
- app/views/admin/logs/_actions.html.haml
|
107
104
|
- app/views/admin/logs/index.html.haml
|
108
105
|
- app/views/admin/logs/show.html.haml
|
@@ -1,80 +0,0 @@
|
|
1
|
-
if Gem::Version.new(EffectiveDatatables::VERSION) < Gem::Version.new('3.0')
|
2
|
-
module Effective
|
3
|
-
module Datatables
|
4
|
-
class Logs < Effective::Datatable
|
5
|
-
include EffectiveLoggingHelper
|
6
|
-
|
7
|
-
datatable do
|
8
|
-
default_order :updated_at, :desc
|
9
|
-
|
10
|
-
table_column :updated_at, label: 'Date'
|
11
|
-
table_column :id, visible: false
|
12
|
-
|
13
|
-
if attributes[:user] == false
|
14
|
-
# Do not include
|
15
|
-
elsif attributes[:user_id].present?
|
16
|
-
table_column :user, filter: { collection: User.where(id: Array(attributes[:user_id])) }
|
17
|
-
elsif attributes[:user].present?
|
18
|
-
table_column :user, filter: { collection: User.where(id: Array(attributes[:user]).map { |user| user.to_param }) }
|
19
|
-
else
|
20
|
-
table_column :user
|
21
|
-
end
|
22
|
-
|
23
|
-
unless attributes[:status] == false
|
24
|
-
table_column :status, filter: { type: :select, values: EffectiveLogging.statuses }
|
25
|
-
end
|
26
|
-
|
27
|
-
unless attributes[:log_changes]
|
28
|
-
table_column :associated_type, visible: false
|
29
|
-
table_column :associated_id, visible: false, label: 'Associated Id'
|
30
|
-
table_column :associated_to_s, label: 'Associated'
|
31
|
-
end
|
32
|
-
|
33
|
-
if attributes[:log_changes]
|
34
|
-
table_column :message do |log|
|
35
|
-
log.message.starts_with?("\t") ? log.message.gsub("\t", " ") : log.message
|
36
|
-
end
|
37
|
-
else
|
38
|
-
table_column :message
|
39
|
-
end
|
40
|
-
|
41
|
-
table_column :logs_count, visible: false
|
42
|
-
|
43
|
-
table_column :details, visible: false, sortable: false do |log|
|
44
|
-
tableize_hash(log.details.except(:email), th: true, sub_th: false)
|
45
|
-
end
|
46
|
-
|
47
|
-
unless attributes[:actions] == false
|
48
|
-
actions_column partial: 'admin/logs/actions', partial_local: :log
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
# A nil attributes[:log_id] means give me all the top level log entries
|
53
|
-
# If we set a log_id then it's for sub logs
|
54
|
-
def collection
|
55
|
-
collection = Effective::Log.unscoped.where(parent_id: attributes[:log_id]).includes(:user, :associated)
|
56
|
-
|
57
|
-
if attributes[:log_changes]
|
58
|
-
collection = collection.where(status: EffectiveLogging.log_changes_status)
|
59
|
-
end
|
60
|
-
|
61
|
-
if (attributes[:user] || attributes[:user_id]).present?
|
62
|
-
user_ids = Array(attributes[:user].presence || attributes[:user_id]).map { |user| user.kind_of?(User) ? user.id : user.to_i }
|
63
|
-
collection = collection.where('user_id IN (?) OR (associated_id IN (?) AND associated_type = ?)', user_ids, user_ids, 'User')
|
64
|
-
end
|
65
|
-
|
66
|
-
if attributes[:associated_id] && attributes[:associated_type]
|
67
|
-
collection = collection.where(associated_id: attributes[:associated_id], associated_type: attributes[:associated_type])
|
68
|
-
end
|
69
|
-
|
70
|
-
if attributes[:associated]
|
71
|
-
collection = collection.where(associated: attributes[:associated])
|
72
|
-
end
|
73
|
-
|
74
|
-
collection
|
75
|
-
end
|
76
|
-
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|