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 |