Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
O
OHR Support
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
97
Issues
97
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
image/svg+xml
Discourse
Discourse
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Projects
OHR Support
Commits
97fe88f8
Commit
97fe88f8
authored
Dec 14, 2010
by
Eric Davis
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[#805] Add the Watchers sidebar to Wiki Pages
parent
3df729e4
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
137 additions
and
4 deletions
+137
-4
watchers_controller.rb
app/controllers/watchers_controller.rb
+26
-1
_watchers.rhtml
app/views/watchers/_watchers.rhtml
+2
-2
show.rhtml
app/views/wiki/show.rhtml
+8
-0
redmine.rb
lib/redmine.rb
+3
-0
roles.yml
test/fixtures/roles.yml
+3
-0
watchers_controller_test.rb
test/functional/watchers_controller_test.rb
+95
-1
No files found.
app/controllers/watchers_controller.rb
View file @
97fe88f8
...
...
@@ -16,7 +16,8 @@ class WatchersController < ApplicationController
before_filter
:find_project
before_filter
:require_login
,
:check_project_privacy
,
:only
=>
[
:watch
,
:unwatch
]
before_filter
:authorize
,
:only
=>
[
:new
,
:destroy
]
before_filter
:authorize_access_to_object
,
:only
=>
[
:new
,
:destroy
]
verify
:method
=>
:post
,
:only
=>
[
:watch
,
:unwatch
],
:render
=>
{
:nothing
=>
true
,
:status
=>
:method_not_allowed
}
...
...
@@ -97,4 +98,28 @@ private
rescue
::
ActionController
::
RedirectBackError
render
:text
=>
(
watching
?
'Watcher added.'
:
'Watcher removed.'
),
:layout
=>
true
end
def
authorize_access_to_object
allowed
=
false
case
@watched
.
class
.
to_s
when
"Issue"
if
params
[
:action
]
==
'new'
allowed
=
true
if
User
.
current
.
allowed_to?
(
:add_issue_watchers
,
@project
)
end
if
params
[
:action
]
==
'destroy'
allowed
=
true
if
User
.
current
.
allowed_to?
(
:delete_issue_watchers
,
@project
)
end
when
"WikiPage"
if
params
[
:action
]
==
'new'
allowed
=
true
if
User
.
current
.
allowed_to?
(
:add_wiki_page_watchers
,
@project
)
end
if
params
[
:action
]
==
'destroy'
allowed
=
true
if
User
.
current
.
allowed_to?
(
:delete_wiki_page_watchers
,
@project
)
end
end
deny_access
unless
allowed
end
end
app/views/watchers/_watchers.rhtml
View file @
97fe88f8
<div
class=
"contextual"
>
<%=
link_to_function
(
l
(
:button_add
),
"$('new-watcher-form').toggle();"
)
if
User
.
current
.
allowed_to?
(
:add_issue_watchers
,
@project
)
%>
<%=
link_to_function
(
l
(
:button_add
),
"$('new-watcher-form').toggle();"
)
if
User
.
current
.
allowed_to?
(
"add_
#{
watched
.
class
.
name
.
underscore
}
_watchers"
.
to_sym
,
@project
)
%>
</div>
<h3>
<%=
l
(
:label_issue_watchers
)
%>
(
<%=
watched
.
watcher_users
.
size
%>
)
</h3>
<%
if
User
.
current
.
allowed_to?
(
:add_issue_watchers
,
@project
)
%>
<%
if
User
.
current
.
allowed_to?
(
"add_
#{
watched
.
class
.
name
.
underscore
}
_watchers"
.
to_sym
,
@project
)
%>
<%
remote_form_for
(
:watcher
,
@watcher
,
:url
=>
{
:controller
=>
'watchers'
,
:action
=>
'new'
,
...
...
app/views/wiki/show.rhtml
View file @
97fe88f8
...
...
@@ -59,6 +59,14 @@
<%
content_for
:sidebar
do
%>
<%=
render
:partial
=>
'wiki/sidebar'
%>
<%
if
User
.
current
.
allowed_to?
(
:add_wiki_page_watchers
,
@project
)
||
(
@page
.
watchers
.
present?
&&
User
.
current
.
allowed_to?
(
:view_wiki_page_watchers
,
@project
))
%>
<div
id=
"watchers"
>
<%=
render
:partial
=>
'watchers/watchers'
,
:locals
=>
{
:watched
=>
@page
}
%>
</div>
<%
end
%>
<%
end
%>
<%
html_title
h
(
@page
.
pretty_title
)
%>
lib/redmine.rb
View file @
97fe88f8
...
...
@@ -136,6 +136,9 @@ Redmine::AccessControl.map do |map|
map
.
permission
:edit_wiki_pages
,
:wiki
=>
[
:edit
,
:update
,
:preview
,
:add_attachment
]
map
.
permission
:delete_wiki_pages_attachments
,
{}
map
.
permission
:protect_wiki_pages
,
{
:wiki
=>
:protect
},
:require
=>
:member
map
.
permission
:view_wiki_page_watchers
,
{}
map
.
permission
:add_wiki_page_watchers
,
{
:watchers
=>
:new
}
map
.
permission
:delete_wiki_page_watchers
,
{
:watchers
=>
:destroy
}
end
map
.
project_module
:repository
do
|
map
|
...
...
test/fixtures/roles.yml
View file @
97fe88f8
...
...
@@ -45,6 +45,9 @@ roles_001:
- :protect_wiki_pages
- :delete_wiki_pages
- :rename_wiki_pages
- :view_wiki_page_watchers
- :add_wiki_page_watchers
- :delete_wiki_page_watchers
- :add_messages
- :edit_messages
- :delete_messages
...
...
test/functional/watchers_controller_test.rb
View file @
97fe88f8
...
...
@@ -19,7 +19,8 @@ class WatchersController; def rescue_action(e) raise e end; end
class
WatchersControllerTest
<
ActionController
::
TestCase
fixtures
:projects
,
:users
,
:roles
,
:members
,
:member_roles
,
:enabled_modules
,
:issues
,
:trackers
,
:projects_trackers
,
:issue_statuses
,
:enumerations
,
:watchers
:issues
,
:trackers
,
:projects_trackers
,
:issue_statuses
,
:enumerations
,
:watchers
,
:wikis
,
:wiki_pages
def
setup
@controller
=
WatchersController
.
new
...
...
@@ -145,9 +146,58 @@ class WatchersControllerTest < ActionController::TestCase
end
assert
Issue
.
find
(
2
).
watched_by?
(
@group
)
end
end
def
test_new_multiple_users_watching_wiki_page
Role
.
find
(
1
).
add_permission!
:add_wiki_page_watchers
@request
.
session
[
:user_id
]
=
2
@page
=
WikiPage
.
find
(
1
)
assert
!
@page
.
watched_by?
(
User
.
find
(
2
))
assert
!
@page
.
watched_by?
(
User
.
find
(
4
))
assert
!
@page
.
watched_by?
(
User
.
find
(
7
))
assert_difference
(
'Watcher.count'
,
3
)
do
xhr
:post
,
:new
,
:object_type
=>
'wiki_page'
,
:object_id
=>
'1'
,
:user_ids
=>
[
'2'
,
'4'
,
'7'
]
assert_response
:success
assert_select_rjs
:replace_html
,
'watchers'
end
@page
.
reload
assert
@page
.
watched_by?
(
User
.
find
(
2
))
assert
@page
.
watched_by?
(
User
.
find
(
4
))
assert
@page
.
watched_by?
(
User
.
find
(
7
))
end
def
test_new_issue_watcher_without_permission
Role
.
find
(
1
).
remove_permission!
:add_issue_watchers
@request
.
session
[
:user_id
]
=
2
assert_difference
(
'Watcher.count'
,
0
)
do
xhr
:post
,
:new
,
:object_type
=>
'issue'
,
:object_id
=>
'2'
,
:user_ids
=>
[
'4'
]
assert_response
:forbidden
end
assert
!
Issue
.
find
(
2
).
watched_by?
(
User
.
find
(
4
))
end
def
test_remove_wiki_page_watcher_without_permission
Role
.
find
(
1
).
remove_permission!
:delete_wiki_page_watchers
@request
.
session
[
:user_id
]
=
2
@page
=
WikiPage
.
find
(
1
)
assert_difference
(
'Watcher.count'
,
0
)
do
xhr
:post
,
:new
,
:object_type
=>
'wiki_page'
,
:object_id
=>
'1'
,
:user_ids
=>
[
'2'
]
assert_response
:forbidden
end
assert
!
WikiPage
.
find
(
1
).
watched_by?
(
User
.
find
(
2
))
end
def
test_remove_watcher
Role
.
find
(
1
).
add_permission!
:delete_issue_watchers
@request
.
session
[
:user_id
]
=
2
assert_difference
(
'Watcher.count'
,
-
1
)
do
xhr
:post
,
:destroy
,
:object_type
=>
'issue'
,
:object_id
=>
'2'
,
:user_id
=>
'3'
...
...
@@ -175,4 +225,48 @@ class WatchersControllerTest < ActionController::TestCase
end
def
test_remove_wiki_page_watcher
Role
.
find
(
1
).
add_permission!
:delete_wiki_page_watchers
@request
.
session
[
:user_id
]
=
2
@page
=
WikiPage
.
find
(
1
)
Watcher
.
create!
(
:user_id
=>
2
,
:watchable
=>
@page
)
assert
@page
.
watched_by?
(
User
.
find
(
2
))
assert_difference
(
'Watcher.count'
,
-
1
)
do
xhr
:post
,
:destroy
,
:object_type
=>
'wiki_page'
,
:object_id
=>
'1'
,
:user_id
=>
'2'
assert_response
:success
assert_select_rjs
:replace_html
,
'watchers'
end
assert
!
WikiPage
.
find
(
1
).
watched_by?
(
User
.
find
(
2
))
end
def
test_remove_issue_watcher_without_permission
Role
.
find
(
1
).
remove_permission!
:delete_issue_watchers
@request
.
session
[
:user_id
]
=
2
assert_difference
(
'Watcher.count'
,
0
)
do
xhr
:post
,
:destroy
,
:object_type
=>
'issue'
,
:object_id
=>
'2'
,
:user_id
=>
'3'
assert_response
:forbidden
end
assert
Issue
.
find
(
2
).
watched_by?
(
User
.
find
(
3
))
end
def
test_remove_wiki_page_watcher_without_permission
Role
.
find
(
1
).
remove_permission!
:delete_wiki_page_watchers
@request
.
session
[
:user_id
]
=
2
@page
=
WikiPage
.
find
(
1
)
Watcher
.
create!
(
:user_id
=>
2
,
:watchable
=>
@page
)
assert
@page
.
watched_by?
(
User
.
find
(
2
))
assert_difference
(
'Watcher.count'
,
0
)
do
xhr
:post
,
:destroy
,
:object_type
=>
'wiki_page'
,
:object_id
=>
'1'
,
:user_id
=>
'2'
assert_response
:forbidden
end
assert
WikiPage
.
find
(
1
).
watched_by?
(
User
.
find
(
2
))
end
end
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment