Class: Card::Action
- Inherits:
-
ApplicationRecord
- Object
- ActiveRecord::Base
- ApplicationRecord
- Card::Action
- Extended by:
- Admin
- Includes:
- Differ
- Defined in:
- mod/history/lib/card/action.rb,
mod/history/lib/card/action/admin.rb,
mod/history/lib/card/action/differ.rb,
mod/history/lib/card/action/action_renderer.rb
Overview
An action is a group of changes to a single card that is recorded during an act. Together, acts, actions, and changes comprise a comprehensive card history tracking system.
For example, if a given web submission changes both the name and type of a given card, that would be recorded as one action with two changes. If there are multiple cards changed, each card would have its own action, but the whole submission would still comprise just one single act.
An Action records:
Defined Under Namespace
Modules: Admin, Differ Classes: ActionRenderer
Constant Summary collapse
- TYPE_OPTIONS =
these are the three possible values for action_type
%i[create update delete].freeze
Class Method Summary collapse
-
.cache ⇒ Card::Cache
cache object for actions.
-
.fetch(id) ⇒ Action?
retrieve action from cache if available.
Instance Method Summary collapse
-
#action_type ⇒ Symbol
retrieve action_type (create, update, or delete).
-
#action_type=(value) ⇒ Integer
assign action_type (create, update, or delete).
-
#card ⇒ Card
each action is associated with on and only one card.
-
#change(field) ⇒ Change
action's Change object for given field.
-
#changed_values ⇒ Object
all action in hash form.
-
#changes ⇒ Hash
all action changes in hash form.
- #current_changes ⇒ Hash
-
#expire ⇒ Object
remove action from action cache.
-
#interpret_field(field) ⇒ Symbol
translate field into fieldname as referred to in database.
-
#interpret_value(field, value) ⇒ Integer, ...
value in form prescribed for specific field name.
-
#new_content? ⇒ true/false
does action change card's content?.
-
#new_name? ⇒ true/false
does action change card's name?.
-
#new_type? ⇒ true/false
does action change card's type?.
- #previous_action ⇒ Object
-
#previous_change(field) ⇒ Change
most recent change to given field before this one.
-
#previous_value(field) ⇒ Object
value of field set by most recent Change before this one.
- #sole? ⇒ Boolean
-
#value(field) ⇒ Object
value set by action's Change to given field.
Methods included from Admin
delete_cardless, delete_changeless, delete_old, make_current_state_the_initial_state
Methods included from Differ
#cardtype_diff, #content_diff, #green?, #name_diff, #raw_view, #red?, #summary_diff_omits_content?
Class Method Details
.cache ⇒ Card::Cache
cache object for actions
56 57 58 |
# File 'mod/history/lib/card/action.rb', line 56 def cache Card::Cache[Action] end |
.fetch(id) ⇒ Action?
retrieve action from cache if available
48 49 50 51 52 |
# File 'mod/history/lib/card/action.rb', line 48 def fetch id cache.fetch id.to_s do find id.to_i end end |
Instance Method Details
#action_type ⇒ Symbol
retrieve action_type (create, update, or delete)
83 84 85 86 |
# File 'mod/history/lib/card/action.rb', line 83 def action_type return :draft if draft TYPE_OPTIONS[read_attribute(:action_type)] end |
#action_type=(value) ⇒ Integer
assign action_type (create, update, or delete)
77 78 79 |
# File 'mod/history/lib/card/action.rb', line 77 def action_type= value write_attribute :action_type, TYPE_OPTIONS.index(value) end |
#card ⇒ Card
each action is associated with on and only one card
63 64 65 66 67 |
# File 'mod/history/lib/card/action.rb', line 63 def card res = Card.fetch card_id, look_in_trash: true, skip_modules: true return res unless res && res.type_id.in?([FileID, ImageID]) res.include_set_modules end |
#change(field) ⇒ Change
action's Change object for given field
112 113 114 |
# File 'mod/history/lib/card/action.rb', line 112 def change field changes[interpret_field field] end |
#changed_values ⇒ Object
all action in hash form. { field1: new_value }
144 145 146 147 148 |
# File 'mod/history/lib/card/action.rb', line 144 def changed_values @changed_values ||= changes.each_with_object({}) do |(key,change), h| h[key] = change.value end end |
#changes ⇒ Hash
all action changes in hash form. { field1: Change1 }
132 133 134 135 136 137 138 139 140 141 |
# File 'mod/history/lib/card/action.rb', line 132 def changes @changes ||= if sole? current_changes else card_changes.each_with_object({}) do |change, hash| hash[change.field.to_sym] = change end end end |
#current_changes ⇒ Hash
151 152 153 154 155 156 157 158 159 |
# File 'mod/history/lib/card/action.rb', line 151 def current_changes return {} unless card @current_changes ||= Card::Change::TRACKED_FIELDS.each_with_object({}) do |field, hash| hash[field.to_sym] = Card::Change.new field: field, value: card.send(field), card_action_id: id end end |
#expire ⇒ Object
remove action from action cache
70 71 72 |
# File 'mod/history/lib/card/action.rb', line 70 def expire self.class.cache.delete id.to_s end |
#interpret_field(field) ⇒ Symbol
translate field into fieldname as referred to in database
184 185 186 187 188 189 190 |
# File 'mod/history/lib/card/action.rb', line 184 def interpret_field field case field when :content then :db_content when :cardtype then :type_id else field.to_sym end end |
#interpret_value(field, value) ⇒ Integer, ...
value in form prescribed for specific field name
197 198 199 200 201 202 203 204 205 206 |
# File 'mod/history/lib/card/action.rb', line 197 def interpret_value field, value case field.to_sym when :type_id value && value.to_i when :cardtype type_card = value && Card.quick_fetch(value.to_i) type_card && type_card.name.capitalize else value end end |
#new_content? ⇒ true/false
does action change card's content?
169 170 171 |
# File 'mod/history/lib/card/action.rb', line 169 def new_content? !value(:db_content).nil? end |
#new_name? ⇒ true/false
does action change card's name?
175 176 177 |
# File 'mod/history/lib/card/action.rb', line 175 def new_name? !value(:name).nil? end |
#new_type? ⇒ true/false
does action change card's type?
163 164 165 |
# File 'mod/history/lib/card/action.rb', line 163 def new_type? !value(:type_id).nil? end |
#previous_action ⇒ Object
88 89 90 |
# File 'mod/history/lib/card/action.rb', line 88 def previous_action Card::Action.where("id < ? AND card_id = ?", id, card_id).last end |
#previous_change(field) ⇒ Change
most recent change to given field before this one
119 120 121 122 123 124 125 126 127 128 |
# File 'mod/history/lib/card/action.rb', line 119 def previous_change field return nil if action_type == :create field = interpret_field field if @previous_changes && @previous_changes.key?(field) @previous_changes[field] else @previous_changes ||= {} @previous_changes[field] = card.last_change_on field, before: self end end |
#previous_value(field) ⇒ Object
value of field set by most recent Change before this one
103 104 105 106 107 |
# File 'mod/history/lib/card/action.rb', line 103 def previous_value field return if action_type == :create return unless (previous_change = previous_change field) interpret_value field, previous_change.value end |
#sole? ⇒ Boolean
208 209 210 211 |
# File 'mod/history/lib/card/action.rb', line 208 def sole? card_changes.empty? && (action_type == :create || Card::Action.where(card_id: card_id).count == 1) end |
#value(field) ⇒ Object
value set by action's Change to given field
95 96 97 98 |
# File 'mod/history/lib/card/action.rb', line 95 def value field return unless (change = change field) interpret_value field, change.value end |