effective_logging 1.10.2 → 1.10.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/app/controllers/admin/logs_controller.rb +3 -3
- data/app/controllers/effective/logs_controller.rb +2 -2
- data/app/helpers/effective_logging_helper.rb +16 -14
- data/app/models/concerns/acts_as_loggable.rb +5 -8
- data/app/models/effective/datatables/logs.rb +7 -7
- data/lib/effective_logging/active_record_logger.rb +24 -63
- data/lib/effective_logging/version.rb +1 -1
- data/lib/effective_logging.rb +1 -0
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5d440bb1c8fc00063bd8be23b294627eddc3968a
|
4
|
+
data.tar.gz: 61aed25b0111ef56a941eedda9726ec40cb02bb4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cfedf4bfa32ecfcdb42e37a575e0cbc36edb0f794b974a8e41b213e4c73559833eb95e25112918615cb1bb296af3dacb05b136f035fe9294d9c68b630e1de687
|
7
|
+
data.tar.gz: 4525eb564843dc558935da3044cb82c3ed5c3f79258c9c2df28da2840a445ec5ba7df4c27c7b6c20537b4e87709fe0e02b399545c4947a6643ba8a9ada763d56
|
data/README.md
CHANGED
@@ -246,9 +246,9 @@ Apply your own formatting to the logged before and after values of each attribut
|
|
246
246
|
# Format the value of this attribute. Return nil to use the default to_s
|
247
247
|
def log_changes_formatted_value(attribute, value)
|
248
248
|
if ['cost'].include?(attribute)
|
249
|
-
|
249
|
+
ApplicationController.helpers.number_to_currency(value)
|
250
250
|
elsif ['percentage'].include?(attribute)
|
251
|
-
|
251
|
+
ApplicationController.helpers.number_to_percentage(value)
|
252
252
|
end
|
253
253
|
end
|
254
254
|
```
|
@@ -17,13 +17,13 @@ module Admin
|
|
17
17
|
|
18
18
|
def show
|
19
19
|
@log = Effective::Log.includes(:logs).find(params[:id])
|
20
|
-
@log.next_log = Effective::Log.unscoped.order(:id).where(:
|
21
|
-
@log.prev_log = Effective::Log.unscoped.order(:id).where(:
|
20
|
+
@log.next_log = Effective::Log.unscoped.order(:id).where(parent_id: @log.parent_id).where('id > ?', @log.id).first
|
21
|
+
@log.prev_log = Effective::Log.unscoped.order(:id).where(parent_id: @log.parent_id).where('id < ?', @log.id).last
|
22
22
|
|
23
23
|
@page_title = "Log ##{@log.to_param}"
|
24
24
|
|
25
25
|
if @log.logs.present?
|
26
|
-
@log.datatable = Effective::Datatables::Logs.new(:
|
26
|
+
@log.datatable = Effective::Datatables::Logs.new(log_id: @log.id) if defined?(EffectiveDatatables)
|
27
27
|
end
|
28
28
|
|
29
29
|
EffectiveLogging.authorized?(self, :show, @log)
|
@@ -39,10 +39,10 @@ module Effective
|
|
39
39
|
|
40
40
|
# This is the User index event
|
41
41
|
def index
|
42
|
-
@datatable = Effective::Datatables::Logs.new(:
|
42
|
+
@datatable = Effective::Datatables::Logs.new(user_id: current_user.id)
|
43
43
|
@page_title = 'My Activity'
|
44
44
|
|
45
|
-
EffectiveLogging.authorized?(self, :index, Effective::Log.new(:
|
45
|
+
EffectiveLogging.authorized?(self, :index, Effective::Log.new(user_id: current_user.id))
|
46
46
|
end
|
47
47
|
|
48
48
|
# This is the User show event
|
@@ -27,21 +27,23 @@ module EffectiveLoggingHelper
|
|
27
27
|
# Any other options are sent to the table tag
|
28
28
|
def tableize_hash(hash, options = {})
|
29
29
|
if hash.present? && hash.kind_of?(Hash)
|
30
|
-
content_tag(:table, options) do
|
31
|
-
|
32
|
-
|
33
|
-
content_tag(
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
30
|
+
content_tag(:table, class: options[:class]) do
|
31
|
+
content_tag(:tbody) do
|
32
|
+
hash.map do |k, v|
|
33
|
+
content_tag(:tr) do
|
34
|
+
content_tag((options[:th] ? :th : :td), k) +
|
35
|
+
content_tag(:td) do
|
36
|
+
if v.kind_of?(Hash)
|
37
|
+
tableize_hash(v, options.merge({class: 'table table-hover', th: (options.key?(:sub_th) ? options[:sub_th] : options[:th])}))
|
38
|
+
elsif v.kind_of?(Array)
|
39
|
+
'[' + v.join(', ') + ']'
|
40
|
+
else
|
41
|
+
v.to_s
|
42
|
+
end
|
41
43
|
end
|
42
44
|
end
|
43
|
-
end
|
44
|
-
end
|
45
|
+
end.join('').html_safe
|
46
|
+
end
|
45
47
|
end.html_safe
|
46
48
|
else
|
47
49
|
hash.to_s.html_safe
|
@@ -65,7 +67,7 @@ module EffectiveLoggingHelper
|
|
65
67
|
value = log.details[key]
|
66
68
|
|
67
69
|
if value.kind_of?(Hash)
|
68
|
-
tableize_hash(value, :
|
70
|
+
tableize_hash(value, class: 'table table-hover', th: true)
|
69
71
|
elsif value.kind_of?(Array)
|
70
72
|
value.map { |value| effective_logging_simple_format(value) }.join.html_safe
|
71
73
|
else
|
@@ -18,12 +18,13 @@ module ActsAsLoggable
|
|
18
18
|
|
19
19
|
around_save do |_, block|
|
20
20
|
@acts_as_loggable_new_record = new_record?
|
21
|
-
block.call
|
22
21
|
EffectiveLogging::ActiveRecordLogger.new(self, log_changes_options).changed! unless @acts_as_loggable_new_record
|
22
|
+
block.call
|
23
23
|
true
|
24
24
|
end
|
25
25
|
|
26
26
|
before_destroy do
|
27
|
+
@acts_as_loggable_destroy_record = true
|
27
28
|
EffectiveLogging::ActiveRecordLogger.new(self, log_changes_options).destroyed!
|
28
29
|
true
|
29
30
|
end
|
@@ -31,9 +32,10 @@ module ActsAsLoggable
|
|
31
32
|
after_commit do
|
32
33
|
if @acts_as_loggable_new_record
|
33
34
|
EffectiveLogging::ActiveRecordLogger.new(self, log_changes_options).created!
|
34
|
-
|
35
|
+
elsif !@acts_as_loggable_destroy_record
|
35
36
|
EffectiveLogging::ActiveRecordLogger.new(self, log_changes_options).updated!
|
36
37
|
end
|
38
|
+
|
37
39
|
true
|
38
40
|
end
|
39
41
|
|
@@ -65,12 +67,7 @@ module ActsAsLoggable
|
|
65
67
|
def log_changes_datatable
|
66
68
|
if persisted?
|
67
69
|
@log_changes_datatable ||= (
|
68
|
-
Effective::Datatables::Logs.new(
|
69
|
-
associated_id: id,
|
70
|
-
associated_type: self.class.name,
|
71
|
-
status: false,
|
72
|
-
log_changes: true
|
73
|
-
)
|
70
|
+
Effective::Datatables::Logs.new(associated_id: id, associated_type: self.class.name, log_changes: true, status: false)
|
74
71
|
)
|
75
72
|
end
|
76
73
|
end
|
@@ -5,9 +5,9 @@ if defined?(EffectiveDatatables)
|
|
5
5
|
include EffectiveLoggingHelper
|
6
6
|
|
7
7
|
datatable do
|
8
|
-
default_order :
|
8
|
+
default_order :updated_at, :desc
|
9
9
|
|
10
|
-
table_column :
|
10
|
+
table_column :updated_at, label: 'Date'
|
11
11
|
table_column :id, visible: false
|
12
12
|
|
13
13
|
if attributes[:user] == false
|
@@ -24,9 +24,11 @@ if defined?(EffectiveDatatables)
|
|
24
24
|
table_column :status, filter: { type: :select, values: EffectiveLogging.statuses }
|
25
25
|
end
|
26
26
|
|
27
|
-
|
28
|
-
|
29
|
-
|
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
|
30
32
|
|
31
33
|
table_column :message do |log|
|
32
34
|
log.message.starts_with?("\t") ? log.message.gsub("\t", " ") : log.message
|
@@ -38,8 +40,6 @@ if defined?(EffectiveDatatables)
|
|
38
40
|
tableize_hash(log.details.except(:email), th: true, sub_th: false, width: '100%')
|
39
41
|
end
|
40
42
|
|
41
|
-
table_column :updated_at, visible: false
|
42
|
-
|
43
43
|
unless attributes[:actions] == false
|
44
44
|
actions_column partial: 'admin/logs/actions', partial_local: :log
|
45
45
|
end
|
@@ -1,14 +1,16 @@
|
|
1
1
|
module EffectiveLogging
|
2
2
|
class ActiveRecordLogger
|
3
|
-
attr_accessor :resource, :logger, :depth, :options
|
3
|
+
attr_accessor :object, :resource, :logger, :depth, :options
|
4
4
|
|
5
5
|
BLANK = "''"
|
6
6
|
|
7
|
-
def initialize(
|
7
|
+
def initialize(object, options = {})
|
8
8
|
raise ArgumentError.new('options must be a Hash') unless options.kind_of?(Hash)
|
9
9
|
|
10
|
-
@
|
11
|
-
@
|
10
|
+
@object = object
|
11
|
+
@resource = Effective::Resource.new(object)
|
12
|
+
|
13
|
+
@logger = options.delete(:logger) || object
|
12
14
|
@depth = options.delete(:depth) || 0
|
13
15
|
@options = options
|
14
16
|
|
@@ -17,9 +19,9 @@ module EffectiveLogging
|
|
17
19
|
|
18
20
|
# execute! is called when we recurse, otherwise the following methods are best called individually
|
19
21
|
def execute!
|
20
|
-
if
|
22
|
+
if object.new_record?
|
21
23
|
created!
|
22
|
-
elsif
|
24
|
+
elsif object.marked_for_destruction?
|
23
25
|
destroyed!
|
24
26
|
else
|
25
27
|
changed!
|
@@ -28,84 +30,44 @@ module EffectiveLogging
|
|
28
30
|
|
29
31
|
# before_destroy
|
30
32
|
def destroyed!
|
31
|
-
log('Deleted', details: applicable(
|
33
|
+
log('Deleted', details: applicable(resource.instance_attributes))
|
32
34
|
end
|
33
35
|
|
34
36
|
# after_commit
|
35
37
|
def created!
|
36
|
-
log('Created', details: applicable(
|
38
|
+
log('Created', details: applicable(resource.instance_attributes))
|
37
39
|
end
|
38
40
|
|
39
41
|
# after_commit
|
40
42
|
def updated!
|
41
|
-
log('Updated', details: applicable(
|
43
|
+
log('Updated', details: applicable(resource.instance_attributes))
|
42
44
|
end
|
43
45
|
|
44
46
|
# before_save
|
45
47
|
def changed!
|
46
|
-
applicable(
|
47
|
-
if
|
48
|
-
before =
|
49
|
-
after =
|
48
|
+
applicable(resource.instance_changes).each do |attribute, (before, after)|
|
49
|
+
if object.respond_to?(:log_changes_formatted_value)
|
50
|
+
before = object.log_changes_formatted_value(attribute, before) || before
|
51
|
+
after = object.log_changes_formatted_value(attribute, after) || after
|
50
52
|
end
|
51
53
|
|
52
|
-
attribute = if
|
53
|
-
|
54
|
+
attribute = if object.respond_to?(:log_changes_formatted_attribute)
|
55
|
+
object.log_changes_formatted_attribute(attribute)
|
54
56
|
end || attribute.titleize
|
55
57
|
|
56
|
-
log("#{attribute}: #{before.presence || BLANK}
|
58
|
+
log("#{attribute}: #{before.presence || BLANK} → #{after.presence || BLANK}", details: { attribute: attribute, before: before, after: after })
|
57
59
|
end
|
58
60
|
|
59
61
|
# Log changes on all accepts_as_nested_parameters has_many associations
|
60
|
-
|
61
|
-
|
62
|
+
resource.nested_resources.each do |association|
|
63
|
+
title = association.name.to_s.singularize.titleize
|
62
64
|
|
63
|
-
Array(
|
64
|
-
ActiveRecordLogger.new(child, options.merge(logger: logger, depth: (depth + 1), prefix: "#{
|
65
|
+
Array(object.send(association.name)).each_with_index do |child, index|
|
66
|
+
ActiveRecordLogger.new(child, options.merge(logger: logger, depth: (depth + 1), prefix: "#{title} ##{index+1}: ")).execute!
|
65
67
|
end
|
66
68
|
end
|
67
69
|
end
|
68
70
|
|
69
|
-
def attributes
|
70
|
-
attributes = { attributes: resource.attributes }
|
71
|
-
|
72
|
-
# Collect to_s representations of all belongs_to associations
|
73
|
-
(resource.class.try(:reflect_on_all_associations, :belongs_to) || []).each do |association|
|
74
|
-
attributes[association.name] = resource.send(association.name).to_s.presence
|
75
|
-
end
|
76
|
-
|
77
|
-
# Collect to_s representations for all has_one associations
|
78
|
-
(resource.class.try(:reflect_on_all_associations, :has_one) || []).each do |association|
|
79
|
-
attributes[association.name] = resource.send(association.name).to_s.presence
|
80
|
-
end
|
81
|
-
|
82
|
-
# Collects attributes for all accepts_as_nested_parameters has_many associations
|
83
|
-
(resource.class.try(:reflect_on_all_autosave_associations) || []).each do |association|
|
84
|
-
attributes[association.name] = {}
|
85
|
-
|
86
|
-
Array(resource.send(association.name)).each_with_index do |child, index|
|
87
|
-
attributes[association.name][index+1] = ActiveRecordLogger.new(child, options.merge(logger: logger)).attributes
|
88
|
-
end
|
89
|
-
|
90
|
-
attributes[association.name].presence
|
91
|
-
end
|
92
|
-
|
93
|
-
attributes
|
94
|
-
end
|
95
|
-
|
96
|
-
def changes
|
97
|
-
changes = resource.changes
|
98
|
-
|
99
|
-
# Log to_s changes on all belongs_to associations
|
100
|
-
(resource.class.try(:reflect_on_all_associations, :belongs_to) || []).each do |association|
|
101
|
-
if (change = changes.delete(association.foreign_key)).present?
|
102
|
-
changes[association.name] = [(association.klass.find_by_id(change.first) if changes.first), resource.send(association.name)]
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
changes
|
107
|
-
end
|
108
|
-
|
109
71
|
private
|
110
72
|
|
111
73
|
def log(message, details: {})
|
@@ -113,8 +75,7 @@ module EffectiveLogging
|
|
113
75
|
user: EffectiveLogging.current_user,
|
114
76
|
status: EffectiveLogging.log_changes_status,
|
115
77
|
message: "#{"\t" * depth}#{options[:prefix]}#{message}",
|
116
|
-
|
117
|
-
associated_to_s: (resource.to_s rescue nil),
|
78
|
+
associated_to_s: (logger.to_s rescue nil),
|
118
79
|
details: details
|
119
80
|
).tap { |log| log.save }
|
120
81
|
end
|
@@ -130,7 +91,7 @@ module EffectiveLogging
|
|
130
91
|
end
|
131
92
|
|
132
93
|
(options[:additionally] || []).each do |attribute|
|
133
|
-
value = (
|
94
|
+
value = (object.send(attribute) rescue :effective_logging_nope)
|
134
95
|
next if attributes[attribute].present? || value == :effective_logging_nope
|
135
96
|
|
136
97
|
atts[attribute] = value
|
data/lib/effective_logging.rb
CHANGED
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: 1.10.
|
4
|
+
version: 1.10.3
|
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: 2017-
|
11
|
+
date: 2017-02-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 2.0.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: effective_resources
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: coffee-rails
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|