Feature #42630 » 0002-Improve-method-and-variable-naming-for-clarity-and-consistency.patch
| app/controllers/reactions_controller.rb | ||
|---|---|---|
| 60 | 60 |
end |
| 61 | 61 | |
| 62 | 62 |
def authorize_reactable |
| 63 |
render_403 unless Redmine::Reaction.writable?(@object, User.current)
|
|
| 63 |
render_403 unless Redmine::Reaction.editable?(@object, User.current)
|
|
| 64 | 64 |
end |
| 65 | 65 |
end |
| app/helpers/reactions_helper.rb | ||
|---|---|---|
| 22 | 22 |
DISPLAY_REACTION_USERS_LIMIT = 10 |
| 23 | 23 | |
| 24 | 24 |
def reaction_button(object) |
| 25 |
return unless Redmine::Reaction.visible?(object, User.current)
|
|
| 25 |
return unless Redmine::Reaction.viewable?(object, User.current)
|
|
| 26 | 26 | |
| 27 | 27 |
detail = object.reaction_detail |
| 28 | 28 | |
| 29 |
reaction = detail.user_reaction |
|
| 29 |
user_reaction = detail.user_reaction
|
|
| 30 | 30 |
count = detail.reaction_count |
| 31 | 31 |
visible_user_names = detail.visible_users.take(DISPLAY_REACTION_USERS_LIMIT).map(&:name) |
| 32 | 32 | |
| 33 | 33 |
tooltip = build_reaction_tooltip(visible_user_names, count) |
| 34 | 34 | |
| 35 |
if Redmine::Reaction.writable?(object, User.current)
|
|
| 36 |
if reaction&.persisted?
|
|
| 37 |
reaction_button_reacted(object, reaction, count, tooltip) |
|
| 35 |
if Redmine::Reaction.editable?(object, User.current)
|
|
| 36 |
if user_reaction.present?
|
|
| 37 |
reaction_button_reacted(object, user_reaction, count, tooltip)
|
|
| 38 | 38 |
else |
| 39 | 39 |
reaction_button_not_reacted(object, count, tooltip) |
| 40 | 40 |
end |
| lib/redmine/reaction.rb | ||
|---|---|---|
| 22 | 22 |
# Types of objects that can have reactions |
| 23 | 23 |
REACTABLE_TYPES = %w(Journal Issue Message News Comment) |
| 24 | 24 | |
| 25 |
# Returns true if the user can view the reaction information of the object
|
|
| 26 |
def self.visible?(object, user = User.current)
|
|
| 25 |
# Returns true if the user can view the reaction of the object |
|
| 26 |
def self.viewable?(object, user = User.current)
|
|
| 27 | 27 |
Setting.reactions_enabled? && object.visible?(user) |
| 28 | 28 |
end |
| 29 | 29 | |
| 30 | 30 |
# Returns true if the user can add/remove a reaction to/from the object |
| 31 |
def self.writable?(object, user = User.current)
|
|
| 32 |
user.logged? && visible?(object, user) && object&.project&.active?
|
|
| 31 |
def self.editable?(object, user = User.current)
|
|
| 32 |
user.logged? && viewable?(object, user) && object&.project&.active?
|
|
| 33 | 33 |
end |
| 34 | 34 | |
| 35 | 35 |
module Reactable |
| test/unit/lib/redmine/reaction_test.rb | ||
|---|---|---|
| 124 | 124 |
), comment1.reaction_detail |
| 125 | 125 |
end |
| 126 | 126 | |
| 127 |
test 'visible? returns true when reactions are enabled and object is visible to user' do
|
|
| 127 |
test 'viewable? returns true when reactions are enabled and object is visible to user' do
|
|
| 128 | 128 |
object = issues(:issues_007) |
| 129 | 129 |
user = users(:users_002) |
| 130 | 130 | |
| 131 |
assert Redmine::Reaction.visible?(object, user)
|
|
| 131 |
assert Redmine::Reaction.viewable?(object, user)
|
|
| 132 | 132 |
end |
| 133 | 133 | |
| 134 |
test 'visible? returns false when reactions are disabled' do
|
|
| 134 |
test 'viewable? returns false when reactions are disabled' do
|
|
| 135 | 135 |
Setting.reactions_enabled = '0' |
| 136 | 136 | |
| 137 | 137 |
object = issues(:issues_007) |
| 138 | 138 |
user = users(:users_002) |
| 139 | 139 | |
| 140 |
assert_not Redmine::Reaction.visible?(object, user)
|
|
| 140 |
assert_not Redmine::Reaction.viewable?(object, user)
|
|
| 141 | 141 |
end |
| 142 | 142 | |
| 143 |
test 'visible? returns false when object is not visible to user' do
|
|
| 143 |
test 'viewable? returns false when object is not visible to user' do
|
|
| 144 | 144 |
object = issues(:issues_007) |
| 145 | 145 |
user = users(:users_002) |
| 146 | 146 | |
| 147 | 147 |
object.expects(:visible?).with(user).returns(false) |
| 148 | 148 | |
| 149 |
assert_not Redmine::Reaction.visible?(object, user)
|
|
| 149 |
assert_not Redmine::Reaction.viewable?(object, user)
|
|
| 150 | 150 |
end |
| 151 | 151 | |
| 152 |
test 'writable? returns true for various reactable objects when user is logged in, object is visible, and project is active' do
|
|
| 152 |
test 'editable? returns true for various reactable objects when user is logged in, object is visible, and project is active' do
|
|
| 153 | 153 |
reactable_objects = {
|
| 154 | 154 |
issue: issues(:issues_007), |
| 155 | 155 |
message: messages(:messages_001), |
| ... | ... | |
| 160 | 160 |
user = users(:users_002) |
| 161 | 161 | |
| 162 | 162 |
reactable_objects.each do |type, object| |
| 163 |
assert Redmine::Reaction.writable?(object, user), "Expected writable? to return true for #{type}"
|
|
| 163 |
assert Redmine::Reaction.editable?(object, user), "Expected editable? to return true for #{type}"
|
|
| 164 | 164 |
end |
| 165 | 165 |
end |
| 166 | 166 | |
| 167 |
test 'writable? returns false when user is not logged in' do
|
|
| 167 |
test 'editable? returns false when user is not logged in' do
|
|
| 168 | 168 |
object = issues(:issues_007) |
| 169 | 169 |
user = User.anonymous |
| 170 | 170 | |
| 171 |
assert_not Redmine::Reaction.writable?(object, user)
|
|
| 171 |
assert_not Redmine::Reaction.editable?(object, user)
|
|
| 172 | 172 |
end |
| 173 | 173 | |
| 174 |
test 'writable? returns false when project is inactive' do
|
|
| 174 |
test 'editable? returns false when project is inactive' do
|
|
| 175 | 175 |
object = issues(:issues_007) |
| 176 | 176 |
user = users(:users_002) |
| 177 | 177 |
object.project.update!(status: Project::STATUS_ARCHIVED) |
| 178 | 178 | |
| 179 |
assert_not Redmine::Reaction.writable?(object, user)
|
|
| 179 |
assert_not Redmine::Reaction.editable?(object, user)
|
|
| 180 | 180 |
end |
| 181 | 181 | |
| 182 |
test 'writable? returns false when project is closed' do
|
|
| 182 |
test 'editable? returns false when project is closed' do
|
|
| 183 | 183 |
object = issues(:issues_007) |
| 184 | 184 |
user = users(:users_002) |
| 185 | 185 |
object.project.update!(status: Project::STATUS_CLOSED) |
| 186 | 186 | |
| 187 |
assert_not Redmine::Reaction.writable?(object, user)
|
|
| 187 |
assert_not Redmine::Reaction.editable?(object, user)
|
|
| 188 | 188 |
end |
| 189 | 189 |
end |