diff options
Diffstat (limited to 'app/models')
| -rw-r--r-- | app/models/node.rb | 2 | ||||
| -rw-r--r-- | app/models/node_action.rb | 6 | ||||
| -rw-r--r-- | app/models/page.rb | 17 |
3 files changed, 20 insertions, 5 deletions
diff --git a/app/models/node.rb b/app/models/node.rb index 52e06d2d..ef981a97 100644 --- a/app/models/node.rb +++ b/app/models/node.rb | |||
| @@ -243,7 +243,7 @@ class Node < ApplicationRecord | |||
| 243 | end | 243 | end |
| 244 | 244 | ||
| 245 | if self.draft.redirect_node_id.present? | 245 | if self.draft.redirect_node_id.present? |
| 246 | target = Node.find_by(:id => self.draft.redirect_node_id) | 246 | target = self.draft.redirect_node |
| 247 | 247 | ||
| 248 | unless target | 248 | unless target |
| 249 | errors.add(:base, :redirect_target_missing) | 249 | errors.add(:base, :redirect_target_missing) |
diff --git a/app/models/node_action.rb b/app/models/node_action.rb index aab1d238..a7036833 100644 --- a/app/models/node_action.rb +++ b/app/models/node_action.rb | |||
| @@ -200,6 +200,12 @@ class NodeAction < ApplicationRecord | |||
| 200 | old_url, new_url = old_page.external_url, new_page.external_url | 200 | old_url, new_url = old_page.external_url, new_page.external_url |
| 201 | diff[:external_url] = { "from" => old_url, "to" => new_url } if old_url != new_url | 201 | diff[:external_url] = { "from" => old_url, "to" => new_url } if old_url != new_url |
| 202 | 202 | ||
| 203 | old_redirect, new_redirect = old_page.redirect, new_page.redirect | ||
| 204 | diff[:redirect] = { "from" => old_redirect, "to" => new_redirect } if old_redirect != new_redirect | ||
| 205 | |||
| 206 | old_target, new_target = old_page.redirect_node&.unique_name, new_page.redirect_node&.unique_name | ||
| 207 | diff[:redirect_target] = { "from" => old_target, "to" => new_target } if old_target != new_target | ||
| 208 | |||
| 203 | old_tags, new_tags = old_page.tag_list.sort, new_page.tag_list.sort | 209 | old_tags, new_tags = old_page.tag_list.sort, new_page.tag_list.sort |
| 204 | diff[:tags] = { "from" => old_tags, "to" => new_tags } if old_tags != new_tags | 210 | diff[:tags] = { "from" => old_tags, "to" => new_tags } if old_tags != new_tags |
| 205 | 211 | ||
diff --git a/app/models/page.rb b/app/models/page.rb index 5d3cb0aa..91b7e975 100644 --- a/app/models/page.rb +++ b/app/models/page.rb | |||
| @@ -36,6 +36,7 @@ class Page < ApplicationRecord | |||
| 36 | belongs_to :parent_node, :class_name => "Node", :optional => true | 36 | belongs_to :parent_node, :class_name => "Node", :optional => true |
| 37 | belongs_to :user, optional: true | 37 | belongs_to :user, optional: true |
| 38 | belongs_to :editor, :class_name => "User", optional: true | 38 | belongs_to :editor, :class_name => "User", optional: true |
| 39 | belongs_to :redirect_node, :class_name => "Node", :optional => true | ||
| 39 | has_many :related_assets, :dependent => :destroy | 40 | has_many :related_assets, :dependent => :destroy |
| 40 | has_many :assets, -> { order("position ASC") }, :through => :related_assets | 41 | has_many :assets, -> { order("position ASC") }, :through => :related_assets |
| 41 | 42 | ||
| @@ -289,7 +290,11 @@ class Page < ApplicationRecord | |||
| 289 | changed: user_id != other.user_id }, | 290 | changed: user_id != other.user_id }, |
| 290 | tags: { added: tag_list.to_a - other.tag_list.to_a, removed: other.tag_list.to_a - tag_list.to_a }, | 291 | tags: { added: tag_list.to_a - other.tag_list.to_a, removed: other.tag_list.to_a - tag_list.to_a }, |
| 291 | template_name: { from: other.template_name, to: template_name, changed: template_name != other.template_name }, | 292 | template_name: { from: other.template_name, to: template_name, changed: template_name != other.template_name }, |
| 292 | assets: { added: assets.to_a - other.assets.to_a, removed: other.assets.to_a - assets.to_a } | 293 | assets: { added: assets.to_a - other.assets.to_a, removed: other.assets.to_a - assets.to_a }, |
| 294 | redirect: { from: other.redirect, to: redirect, | ||
| 295 | changed: redirect != other.redirect }, | ||
| 296 | redirect_node: { from: other.redirect_node, to: redirect_node, | ||
| 297 | changed: redirect_node_id != other.redirect_node_id } | ||
| 293 | ) | 298 | ) |
| 294 | end | 299 | end |
| 295 | 300 | ||
| @@ -326,9 +331,8 @@ class Page < ApplicationRecord | |||
| 326 | return nil if redirect.blank? | 331 | return nil if redirect.blank? |
| 327 | 332 | ||
| 328 | if redirect_node_id.present? | 333 | if redirect_node_id.present? |
| 329 | target = Node.find_by(:id => redirect_node_id) | 334 | return nil unless redirect_node&.head |
| 330 | return nil unless target&.head | 335 | return RedirectTarget.new(redirect_node, nil) |
| 331 | return RedirectTarget.new(target, nil) | ||
| 332 | end | 336 | end |
| 333 | 337 | ||
| 334 | return RedirectTarget.new(nil, external_url) if external_url.present? | 338 | return RedirectTarget.new(nil, external_url) if external_url.present? |
| @@ -345,6 +349,11 @@ class Page < ApplicationRecord | |||
| 345 | Node.where(:head_id => where(:redirect_node_id => node_id).select(:id)) | 349 | Node.where(:head_id => where(:redirect_node_id => node_id).select(:id)) |
| 346 | end | 350 | end |
| 347 | 351 | ||
| 352 | def redirect_differs_from? other | ||
| 353 | mine, theirs = redirect_target, other&.redirect_target | ||
| 354 | mine&.url != theirs&.url || mine&.node != theirs&.node | ||
| 355 | end | ||
| 356 | |||
| 348 | # The address this page will have once published. | 357 | # The address this page will have once published. |
| 349 | def prospective_unique_name | 358 | def prospective_unique_name |
| 350 | return nil if parent_node_id.nil? | 359 | return nil if parent_node_id.nil? |
