diff options
| -rw-r--r-- | app/controllers/nodes_controller.rb | 9 | ||||
| -rw-r--r-- | app/models/node.rb | 16 | ||||
| -rw-r--r-- | test/models/node_test.rb | 24 |
3 files changed, 42 insertions, 7 deletions
diff --git a/app/controllers/nodes_controller.rb b/app/controllers/nodes_controller.rb index 772bf4b..c1468be 100644 --- a/app/controllers/nodes_controller.rb +++ b/app/controllers/nodes_controller.rb | |||
| @@ -185,16 +185,11 @@ class NodesController < ApplicationController | |||
| 185 | 185 | ||
| 186 | # Filter functions for admin views | 186 | # Filter functions for admin views |
| 187 | def drafts | 187 | def drafts |
| 188 | base = Node.where("draft_id IS NOT NULL OR autosave_id IS NOT NULL") | 188 | @nodes = index_matching(Node.drafts_and_autosaves) |
| 189 | @nodes = index_matching(base) | ||
| 190 | end | 189 | end |
| 191 | 190 | ||
| 192 | def recent | 191 | def recent |
| 193 | base = Node.where( | 192 | @nodes = index_matching(Node.recently_changed) |
| 194 | "nodes.updated_at < ? AND nodes.updated_at > ? AND nodes.parent_id IS NOT NULL", | ||
| 195 | Time.now, Time.now - 14.days | ||
| 196 | ) | ||
| 197 | @nodes = index_matching(base) | ||
| 198 | end | 193 | end |
| 199 | 194 | ||
| 200 | def mine | 195 | def mine |
diff --git a/app/models/node.rb b/app/models/node.rb index 24f3cd0..aa2f7f3 100644 --- a/app/models/node.rb +++ b/app/models/node.rb | |||
| @@ -367,6 +367,22 @@ class Node < ApplicationRecord | |||
| 367 | .distinct | 367 | .distinct |
| 368 | end | 368 | end |
| 369 | 369 | ||
| 370 | def self.drafts_and_autosaves(current_user_id: nil) | ||
| 371 | scope = where("draft_id IS NOT NULL OR autosave_id IS NOT NULL") | ||
| 372 | return scope.order("updated_at DESC") unless current_user_id | ||
| 373 | |||
| 374 | scope.order( | ||
| 375 | Arel.sql(sanitize_sql_array(["CASE WHEN locking_user_id = ? THEN 0 ELSE 1 END, updated_at DESC", current_user_id])) | ||
| 376 | ) | ||
| 377 | end | ||
| 378 | |||
| 379 | def self.recently_changed | ||
| 380 | where( | ||
| 381 | "nodes.updated_at < ? AND nodes.updated_at > ? AND nodes.parent_id IS NOT NULL", | ||
| 382 | Time.now, Time.now - 14.days | ||
| 383 | ) | ||
| 384 | end | ||
| 385 | |||
| 370 | protected | 386 | protected |
| 371 | def lock_for! current_user | 387 | def lock_for! current_user |
| 372 | self.lock_owner = current_user | 388 | self.lock_owner = current_user |
diff --git a/test/models/node_test.rb b/test/models/node_test.rb index 15e908b..de540f8 100644 --- a/test/models/node_test.rb +++ b/test/models/node_test.rb | |||
| @@ -537,4 +537,28 @@ class NodeTest < ActiveSupport::TestCase | |||
| 537 | assert_includes Node.editor_search("Backspace Spiegelgraben"), node | 537 | assert_includes Node.editor_search("Backspace Spiegelgraben"), node |
| 538 | assert_equal 0, Node.editor_search("Backspace Nonexistentstreet").count | 538 | assert_equal 0, Node.editor_search("Backspace Nonexistentstreet").count |
| 539 | end | 539 | end |
| 540 | |||
| 541 | test "drafts_and_autosaves without a user sorts by recency only" do | ||
| 542 | older = Node.root.children.create!(:slug => "drafts_order_older") | ||
| 543 | older.find_or_create_draft(@user1) | ||
| 544 | newer = Node.root.children.create!(:slug => "drafts_order_newer") | ||
| 545 | newer.find_or_create_draft(@user1) | ||
| 546 | |||
| 547 | result = Node.drafts_and_autosaves.to_a | ||
| 548 | assert result.index(newer) < result.index(older) | ||
| 549 | end | ||
| 550 | |||
| 551 | test "drafts_and_autosaves with a user puts their own locked nodes first, regardless of recency" do | ||
| 552 | mine = Node.root.children.create!(:slug => "drafts_order_mine") | ||
| 553 | mine.lock_for_editing!(@user1) | ||
| 554 | mine.autosave!({:title => "mine"}, @user1) | ||
| 555 | |||
| 556 | someone_elses_newer = Node.root.children.create!(:slug => "drafts_order_theirs") | ||
| 557 | other_user = User.find_by_login("quentin") | ||
| 558 | someone_elses_newer.lock_for_editing!(other_user) | ||
| 559 | someone_elses_newer.autosave!({:title => "theirs"}, other_user) | ||
| 560 | |||
| 561 | result = Node.drafts_and_autosaves(current_user_id: @user1.id).to_a | ||
| 562 | assert result.index(mine) < result.index(someone_elses_newer) | ||
| 563 | end | ||
| 540 | end | 564 | end |
