Class: Card::Action

Inherits:
ActiveRecord::Base
  • Object
show all
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:

  • the card_id of the card acted upon
  • the card_act_id of the act of which the action is part
  • the action_type (create, update, or delete)
  • a boolean indicated whether the action is a draft
  • a comment (where applicable)

Defined Under Namespace

Modules: Admin, Differ Classes: ActionRenderer

Constant Summary collapse

TYPE_OPTIONS =

these are the three possible values for action_type

[:create, :update, :delete].freeze

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Admin

delete_cardless, delete_changeless, delete_old

Methods included from Differ

#cardtype_diff, #content_diff, #green?, #name_diff, #raw_view, #red?, #summary_diff_omits_content?

Class Method Details

.cacheCard::Cache

cache object for actions

Returns:



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

Parameters:

Returns:



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_typeSymbol

retrieve action_type (create, update, or delete)

Returns:

  • (Symbol)


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)

Parameters:

  • value (Symbol)

Returns:

  • (Integer)


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

#cardCard

each action is associated with on and only one card

Returns:



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



108
109
110
# File 'mod/history/lib/card/action.rb', line 108

def change field
  changes[interpret_field field]
end

#changesHash

all action changes in hash form. { field1: Change1 }

Returns:

  • (Hash)


127
128
129
130
131
132
# File 'mod/history/lib/card/action.rb', line 127

def changes
  @changes ||=
    card_changes.each_with_object({}) do |change, hash|
      hash[change.field.to_sym] = change
    end
end

#expireObject

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

Parameters:

  • field (Symbol)

    can be :type_id, :cardtype, :db_content, :content, :name, :trash

Returns:

  • (Symbol)

See Also:



157
158
159
160
161
162
163
# File 'mod/history/lib/card/action.rb', line 157

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

Parameters:

Returns:

  • (Integer)

    for :type_id

  • (String)

    for :name, :db_content, :content, :cardtype

  • (True/False)

    for :trash



170
171
172
173
174
175
176
177
178
179
# File 'mod/history/lib/card/action.rb', line 170

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?

Returns:

  • (true/false)


142
143
144
# File 'mod/history/lib/card/action.rb', line 142

def new_content?
  !value(:db_content).nil?
end

#new_name?true/false

does action change card's name?

Returns:

  • (true/false)


148
149
150
# File 'mod/history/lib/card/action.rb', line 148

def new_name?
  !value(:name).nil?
end

#new_type?true/false

does action change card's type?

Returns:

  • (true/false)


136
137
138
# File 'mod/history/lib/card/action.rb', line 136

def new_type?
  !value(:type_id).nil?
end

#previous_change(field) ⇒ Change

most recent change to given field before this one



115
116
117
118
119
120
121
122
123
# File 'mod/history/lib/card/action.rb', line 115

def previous_change field
  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



99
100
101
102
103
# File 'mod/history/lib/card/action.rb', line 99

def previous_value field
  return if action_type == :create
  return unless (previous_change = previous_change field)
  interpret_value field, previous_change.value
end

#value(field) ⇒ Object

value set by action's Change to given field



91
92
93
94
# File 'mod/history/lib/card/action.rb', line 91

def value field
  return unless (change = change field)
  interpret_value field, change.value
end