| Module | Cms::Behaviors::Versioning::InstanceMethods |
| In: |
lib/cms/behaviors/versioning.rb
|
# File lib/cms/behaviors/versioning.rb, line 202
202: def as_of_draft_version
203: as_of_version(draft.version)
204: end
# File lib/cms/behaviors/versioning.rb, line 206
206: def as_of_version(version)
207: v = find_version(version)
208: raise ActiveRecord::RecordNotFound.new("version #{version.inspect} does not exist for <#{self.class}:#{id}>") unless v
209: obj = self.class.new
210:
211: (self.class.versioned_columns + [:version, :updated_at]).each do |a|
212: obj.send("#{a}=", v.send(a))
213: end
214: obj.id = id
215: obj.lock_version = lock_version
216:
217: # Need to do this so associations can be loaded
218: obj.instance_variable_set("@new_record", false)
219:
220: # Callback to allow us to load other data when an older version is loaded
221: obj.after_as_of_version if obj.respond_to?(:after_as_of_version)
222:
223: # Last but not least, clear the changed attributes
224: if changed_attrs = obj.send(:changed_attributes)
225: changed_attrs.clear
226: end
227:
228: obj
229: end
# File lib/cms/behaviors/versioning.rb, line 76
76: def build_new_version
77: # First get the values from the draft
78: attrs = draft_attributes
79:
80: # Now overwrite any changed values
81: self.class.versioned_columns.each do |col|
82: if(send("#{col}_changed?"))
83: attrs[col] = send(col)
84: end
85: end
86:
87: attrs[:version_comment] = @version_comment || default_version_comment
88: @version_comment = nil
89: new_version = versions.build(attrs)
90: new_version.version = new_record? ? 1 : (draft.version.to_i + 1)
91: after_build_new_version(new_version) if respond_to?(:after_build_new_version)
92: new_version
93: end
# File lib/cms/behaviors/versioning.rb, line 194
194: def current_version
195: find_version(self.version)
196: end
# File lib/cms/behaviors/versioning.rb, line 102
102: def default_version_comment
103: if new_record?
104: "Created"
105: else
106: "Changed #{(changes.keys - %w[version created_by_id updated_by_id]).sort.join(', ')}"
107: end
108: end
# File lib/cms/behaviors/versioning.rb, line 178
178: def draft
179: versions.first(:order => "version desc")
180: end
# File lib/cms/behaviors/versioning.rb, line 95
95: def draft_attributes
96: # When there is no draft, we'll just copy the attibutes from this object
97: # Otherwise we need to use the draft
98: d = new_record? ? self : draft
99: self.class.versioned_columns.inject({}){|attrs, col| attrs[col] = d.send(col); attrs }
100: end
# File lib/cms/behaviors/versioning.rb, line 182
182: def draft_version?
183: version == draft.version
184: end
# File lib/cms/behaviors/versioning.rb, line 198
198: def find_version(number)
199: versions.first(:conditions => { :version => number })
200: end
# File lib/cms/behaviors/versioning.rb, line 72
72: def initialize_version
73: self.version = 1
74: end
# File lib/cms/behaviors/versioning.rb, line 186
186: def live_version
187: find_version(self.class.find(id).version)
188: end
# File lib/cms/behaviors/versioning.rb, line 190
190: def live_version?
191: version == self.class.find(id).version
192: end
# File lib/cms/behaviors/versioning.rb, line 231
231: def revert
232: draft_version = draft.version
233: revert_to(draft_version - 1) unless draft_version == 1
234: end
# File lib/cms/behaviors/versioning.rb, line 247
247: def revert_to(version)
248: revert_to_without_save(version)
249: save
250: end
# File lib/cms/behaviors/versioning.rb, line 236
236: def revert_to_without_save(version)
237: raise "Version parameter missing" if version.blank?
238: self.revert_to_version = find_version(version)
239: raise "Could not find version #{version}" unless revert_to_version
240: (self.class.versioned_columns - ["version"]).each do |a|
241: send("#{a}=", revert_to_version.send(a))
242: end
243: self.version_comment = "Reverted to version #{version}"
244: self
245: end
# File lib/cms/behaviors/versioning.rb, line 110
110: def save(perform_validations=true)
111: transaction do
112: #logger.info "..... Calling valid?"
113: return false unless valid?
114:
115: if changed?
116: #logger.info "..... Changes => #{changes.inspect}"
117: else
118: #logger.info "..... No Changes"
119: return true
120: end
121:
122: #logger.info "..... Calling before_save"
123: return false if callback(:before_save) == false
124:
125: if new_record?
126: #logger.info "..... Calling before_create"
127: return false if callback(:before_create) == false
128: else
129: #logger.info "..... Calling before_update"
130: return false if callback(:before_update) == false
131: end
132:
133: #logger.info "..... Calling build_new_version"
134: new_version = build_new_version
135: #logger.info "..... Is new version valid? #{new_version.valid?}"
136: if new_record?
137: self.version = 1
138: #logger.info "..... Calling create_without_callbacks"
139: if result = create_without_callbacks
140: #logger.info "..... Calling after_create"
141: if callback(:after_create) != false
142: #logger.info "..... Calling after_save"
143: callback(:after_save)
144: end
145:
146: if @publish_on_save
147: publish
148: @publish_on_save = nil
149: end
150: changed_attributes.clear
151: end
152: result
153: elsif new_version
154: #logger.info "..... Calling save"
155: if result = new_version.save
156: #logger.info "..... Calling after_save"
157: if callback(:after_update) != false
158: #logger.info "..... Calling after_update"
159: callback(:after_save)
160: end
161:
162: if @publish_on_save
163: publish
164: @publish_on_save = nil
165: end
166: changed_attributes.clear
167: end
168: result
169: end
170: true
171: end
172: end
# File lib/cms/behaviors/versioning.rb, line 174
174: def save!(perform_validations=true)
175: save || raise(ActiveRecord::RecordNotSaved.new(errors.full_messages))
176: end
# File lib/cms/behaviors/versioning.rb, line 252
252: def version_comment
253: @version_comment
254: end