diff options
Diffstat (limited to 'app/models/node.rb')
| -rw-r--r-- | app/models/node.rb | 36 |
1 files changed, 33 insertions, 3 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 |
