summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/models/node.rb36
-rw-r--r--test/controllers/nodes_controller_test.rb7
-rw-r--r--test/models/node_test.rb3
3 files changed, 41 insertions, 5 deletions
diff --git a/app/models/node.rb b/app/models/node.rb
index 9eb0fe4..f15c908 100644
--- a/app/models/node.rb
+++ b/app/models/node.rb
@@ -56,6 +56,11 @@ class Node < ApplicationRecord
56 def lock_for_editing! current_user 56 def lock_for_editing! current_user
57 if self.lock_owner.nil? || self.lock_owner == current_user 57 if self.lock_owner.nil? || self.lock_owner == current_user
58 lock_for! current_user 58 lock_for! current_user
59 if self.draft
60 self.draft.user = current_user if self.draft.user.nil?
61 self.draft.editor = current_user
62 self.draft.save!
63 end
59 self 64 self
60 else 65 else
61 raise( 66 raise(
@@ -95,15 +100,18 @@ class Node < ApplicationRecord
95 return unless self.autosave 100 return unless self.autosave
96 101
97 if self.draft 102 if self.draft
103 preserved_published_at = self.draft.published_at
98 self.draft.clone_attributes_from self.autosave 104 self.draft.clone_attributes_from self.autosave
105 self.draft.published_at = preserved_published_at
99 self.draft.user_id = self.autosave.user_id if self.autosave.user_id 106 self.draft.user_id = self.autosave.user_id if self.autosave.user_id
100 self.draft.editor = current_user 107 self.draft.editor = current_user
101 self.draft.save! 108 self.draft.save!
102 else 109 else
103 empty_page = self.pages.create! 110 empty_page = self.pages.create!
104 empty_page.user = self.autosave.user_id ? self.autosave.user : (self.head ? self.head.user : current_user)
105 empty_page.editor = current_user
106 empty_page.clone_attributes_from self.autosave 111 empty_page.clone_attributes_from self.autosave
112 empty_page.user = self.autosave.user_id ? self.autosave.user : (self.head ? self.head.user : current_user)
113 empty_page.editor = current_user
114 empty_page.published_at = self.head.published_at if self.head
107 empty_page.save! 115 empty_page.save!
108 self.draft = empty_page 116 self.draft = empty_page
109 self.save! 117 self.save!
@@ -150,6 +158,28 @@ class Node < ApplicationRecord
150 self.draft.reload 158 self.draft.reload
151 end 159 end
152 160
161 # Discards exactly the topmost non-empty layer -- autosave if present,
162 # else draft -- and reveals whatever's beneath it. Releases the lock
163 # only once nothing is left to protect (no draft survives); leaves it
164 # alone whenever a draft remains, since #edit still has real content
165 # open.
166 def revert! current_user
167 assert_locked_by! current_user
168
169 if self.autosave
170 self.autosave.destroy
171 self.autosave_id = nil
172 self.save!
173 elsif self.draft && self.head
174 self.draft.destroy
175 self.draft_id = nil
176 self.save!
177 end
178
179 self.unlock! unless self.draft
180 self.reload
181 end
182
153 def staged_slug=(value) 183 def staged_slug=(value)
154 if head.blank? 184 if head.blank?
155 self.slug = value 185 self.slug = value
diff --git a/test/controllers/nodes_controller_test.rb b/test/controllers/nodes_controller_test.rb
index 030cff0..f3e04c2 100644
--- a/test/controllers/nodes_controller_test.rb
+++ b/test/controllers/nodes_controller_test.rb
@@ -101,7 +101,7 @@ class NodesControllerTest < ActionController::TestCase
101 assert_select("#page_body", "World") 101 assert_select("#page_body", "World")
102 102
103 node.reload 103 node.reload
104 assert_equal 2, node.pages.length 104 assert_equal 1, node.pages.length
105 assert_equal "Hello", node.find_or_create_draft( User.first ).title 105 assert_equal "Hello", node.find_or_create_draft( User.first ).title
106 assert_equal "World", node.find_or_create_draft( User.first ).body 106 assert_equal "World", node.find_or_create_draft( User.first ).body
107 end 107 end
@@ -291,6 +291,7 @@ class NodesControllerTest < ActionController::TestCase
291 get :edit, params: { :id => node.id } 291 get :edit, params: { :id => node.id }
292 assert_response :success 292 assert_response :success
293 293
294 put :update, params: { :id => node.id, :page => { :title => "updated" } }
294 put :publish, params: { :id => node.id } 295 put :publish, params: { :id => node.id }
295 296
296 node.reload 297 node.reload
@@ -303,6 +304,7 @@ class NodesControllerTest < ActionController::TestCase
303 node = create_node_with_published_page 304 node = create_node_with_published_page
304 get :edit, params: { :id => node.id } 305 get :edit, params: { :id => node.id }
305 306
307 put :update, params: { :id => node.id, :page => { :title => "updated" } }
306 put :publish, params: { :id => node.id } 308 put :publish, params: { :id => node.id }
307 309
308 node.reload 310 node.reload
@@ -324,7 +326,8 @@ class NodesControllerTest < ActionController::TestCase
324 assert_equal "quentin", node.head.user.login 326 assert_equal "quentin", node.head.user.login
325 327
326 login_as :aaron 328 login_as :aaron
327 get :edit, params: {:id => node.id } 329 get :edit, params: { :id => node.id }
330 put :update, params: { :id => node.id, :page => { :title => "updated" } }
328 331
329 node.reload 332 node.reload
330 assert_equal "quentin", node.head.user.login 333 assert_equal "quentin", node.head.user.login
diff --git a/test/models/node_test.rb b/test/models/node_test.rb
index 2953f8f..bdf556d 100644
--- a/test/models/node_test.rb
+++ b/test/models/node_test.rb
@@ -339,6 +339,9 @@ class NodeTest < ActiveSupport::TestCase
339 assert_equal head_revision, node.head.revision 339 assert_equal head_revision, node.head.revision
340 assert_nil node.autosave 340 assert_nil node.autosave
341 assert_equal 2, node.pages.count 341 assert_equal 2, node.pages.count
342 assert_equal node.head.user, node.draft.user
343 assert_equal @user1, node.draft.editor
344 assert_equal node.head.published_at, node.draft.published_at
342 end 345 end
343 346
344 test "autosave!, save_draft!, and lock_for_editing! raise LockedByAnotherUser for a second user" do 347 test "autosave!, save_draft!, and lock_for_editing! raise LockedByAnotherUser for a second user" do