diff options
| author | hukl <contact@smyck.org> | 2009-03-21 17:39:11 +0100 |
|---|---|---|
| committer | hukl <contact@smyck.org> | 2009-03-21 17:39:11 +0100 |
| commit | 0e215fab6ef01cfe4865ed10bbe083f800c9a73e (patch) | |
| tree | 12b49dc4f5d12d5786f247c581624785bf90d38f | |
| parent | 40bdc8384a33019c1771fbad888525505f61aa7c (diff) | |
put the lock onto nodes
| -rw-r--r-- | app/models/node.rb | 25 | ||||
| -rw-r--r-- | app/views/nodes/index.html.erb | 2 | ||||
| -rw-r--r-- | db/migrate/20090321150359_add_locking_user_id_to_nodes.rb | 9 | ||||
| -rw-r--r-- | test/unit/node_test.rb | 5 |
4 files changed, 30 insertions, 11 deletions
diff --git a/app/models/node.rb b/app/models/node.rb index da26164..0f34b73 100644 --- a/app/models/node.rb +++ b/app/models/node.rb | |||
| @@ -8,6 +8,7 @@ class Node < ActiveRecord::Base | |||
| 8 | belongs_to :draft, :class_name => "Page", :foreign_key => :draft_id | 8 | belongs_to :draft, :class_name => "Page", :foreign_key => :draft_id |
| 9 | has_many :permissions | 9 | has_many :permissions |
| 10 | has_one :event | 10 | has_one :event |
| 11 | belongs_to :user, :foreign_key => :locking_user_id | ||
| 11 | 12 | ||
| 12 | # Callbacks | 13 | # Callbacks |
| 13 | after_create :initialize_empty_page | 14 | after_create :initialize_empty_page |
| @@ -43,17 +44,17 @@ class Node < ActiveRecord::Base | |||
| 43 | 44 | ||
| 44 | # Instance Methods | 45 | # Instance Methods |
| 45 | 46 | ||
| 46 | def find_or_create_draft user | 47 | def find_or_create_draft current_user |
| 47 | if draft && draft.user == user | 48 | if draft && self.user == current_user |
| 48 | draft | 49 | draft |
| 49 | elsif draft && draft.user.nil? | 50 | elsif draft && self.user.nil? |
| 50 | draft.user = user | 51 | lock_for! current_user |
| 51 | draft.save | ||
| 52 | draft | 52 | draft |
| 53 | elsif draft && draft.user != user | 53 | elsif draft && self.user != current_user |
| 54 | raise "Page is locked" | 54 | raise "Page is locked" |
| 55 | else | 55 | else |
| 56 | create_new_draft user | 56 | lock_for! current_user |
| 57 | create_new_draft current_user | ||
| 57 | end | 58 | end |
| 58 | end | 59 | end |
| 59 | 60 | ||
| @@ -73,6 +74,7 @@ class Node < ActiveRecord::Base | |||
| 73 | self.head.save! | 74 | self.head.save! |
| 74 | self.draft = nil | 75 | self.draft = nil |
| 75 | self.save! | 76 | self.save! |
| 77 | self.unlock! | ||
| 76 | else | 78 | else |
| 77 | nil | 79 | nil |
| 78 | end | 80 | end |
| @@ -95,6 +97,15 @@ class Node < ActiveRecord::Base | |||
| 95 | end | 97 | end |
| 96 | 98 | ||
| 97 | protected | 99 | protected |
| 100 | def lock_for! current_user | ||
| 101 | self.user = current_user | ||
| 102 | self.save | ||
| 103 | end | ||
| 104 | |||
| 105 | def unlock! | ||
| 106 | self.user = nil | ||
| 107 | self.save | ||
| 108 | end | ||
| 98 | 109 | ||
| 99 | # Creates an empty page and associates it to the given node. This means | 110 | # Creates an empty page and associates it to the given node. This means |
| 100 | # freshly created node has an empty draft. A user can create nodes as he | 111 | # freshly created node has an empty draft. A user can create nodes as he |
diff --git a/app/views/nodes/index.html.erb b/app/views/nodes/index.html.erb index 103617c..53ddb5b 100644 --- a/app/views/nodes/index.html.erb +++ b/app/views/nodes/index.html.erb | |||
| @@ -28,7 +28,7 @@ | |||
| 28 | <%= link_to 'Unlock', unlock_node_path(node), :method => :put, :confirm => "Are you sure you want to unlock?" %> | 28 | <%= link_to 'Unlock', unlock_node_path(node), :method => :put, :confirm => "Are you sure you want to unlock?" %> |
| 29 | </td> | 29 | </td> |
| 30 | <td> | 30 | <td> |
| 31 | <%= "#{node.draft.user.login}" if node.draft && node.draft.user %> | 31 | <%= node.user.login if node.user %> |
| 32 | </td> | 32 | </td> |
| 33 | <td> | 33 | <td> |
| 34 | <%= node.draft ? node.draft.revision : node.head.revision %> | 34 | <%= node.draft ? node.draft.revision : node.head.revision %> |
diff --git a/db/migrate/20090321150359_add_locking_user_id_to_nodes.rb b/db/migrate/20090321150359_add_locking_user_id_to_nodes.rb new file mode 100644 index 0000000..b40dd71 --- /dev/null +++ b/db/migrate/20090321150359_add_locking_user_id_to_nodes.rb | |||
| @@ -0,0 +1,9 @@ | |||
| 1 | class AddLockingUserIdToNodes < ActiveRecord::Migration | ||
| 2 | def self.up | ||
| 3 | add_column :nodes, :locking_user_id, :integer | ||
| 4 | end | ||
| 5 | |||
| 6 | def self.down | ||
| 7 | remove_column :nodes, :locking_user_id | ||
| 8 | end | ||
| 9 | end | ||
diff --git a/test/unit/node_test.rb b/test/unit/node_test.rb index 2558ca3..a7405f0 100644 --- a/test/unit/node_test.rb +++ b/test/unit/node_test.rb | |||
| @@ -30,7 +30,7 @@ class NodeTest < ActiveSupport::TestCase | |||
| 30 | assert_not_nil @first_child.draft | 30 | assert_not_nil @first_child.draft |
| 31 | assert_nil @first_child.draft.user | 31 | assert_nil @first_child.draft.user |
| 32 | @first_child.find_or_create_draft @user1 | 32 | @first_child.find_or_create_draft @user1 |
| 33 | assert_equal @user1, @first_child.draft.user | 33 | assert_equal @user1, @first_child.user |
| 34 | end | 34 | end |
| 35 | 35 | ||
| 36 | def test_unique_path_returns_an_array | 36 | def test_unique_path_returns_an_array |
| @@ -121,9 +121,8 @@ class NodeTest < ActiveSupport::TestCase | |||
| 121 | node = Node.create :slug => "third_child" | 121 | node = Node.create :slug => "third_child" |
| 122 | node.move_to_child_of @root | 122 | node.move_to_child_of @root |
| 123 | node.publish_draft! | 123 | node.publish_draft! |
| 124 | |||
| 125 | node.find_or_create_draft @user1 | 124 | node.find_or_create_draft @user1 |
| 126 | 125 | assert_equal @user1, node.user | |
| 127 | assert_raise(RuntimeError) do | 126 | assert_raise(RuntimeError) do |
| 128 | node.find_or_create_draft @user2 | 127 | node.find_or_create_draft @user2 |
| 129 | end | 128 | end |
