effective_logging 1.11.5 → 2.0.0
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.
- 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
|