summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Bugzilla/Flag.pm17
-rw-r--r--Bugzilla/User.pm33
-rw-r--r--template/en/default/flag/list.html.tmpl33
3 files changed, 62 insertions, 21 deletions
diff --git a/Bugzilla/Flag.pm b/Bugzilla/Flag.pm
index b82165e80..072a449f6 100644
--- a/Bugzilla/Flag.pm
+++ b/Bugzilla/Flag.pm
@@ -416,13 +416,10 @@ sub _validate {
}
# Throw an error if the user won't be allowed to set the flag.
- if ($flag_type->grant_group
- && !$requestee->in_group_id($flag_type->grant_group->id))
- {
- ThrowUserError('flag_requestee_needs_privs',
- {'requestee' => $requestee,
- 'flagtype' => $flag_type});
- }
+ $requestee->can_set_flag($flag_type)
+ || ThrowUserError('flag_requestee_needs_privs',
+ {'requestee' => $requestee,
+ 'flagtype' => $flag_type});
}
}
@@ -433,12 +430,10 @@ sub _validate {
# - User in the request_group can clear pending requests and set flags
# and can rerequest set flags.
return if (($status eq 'X' || $status eq '?')
- && (!$flag_type->request_group
- || $user->in_group_id($flag_type->request_group->id)));
+ && $user->can_request_flag($flag_type));
# - User in the grant_group can set/clear flags, including "+" and "-".
- return if (!$flag_type->grant_group
- || $user->in_group_id($flag_type->grant_group->id));
+ return if $user->can_set_flag($flag_type);
# - Any other flag modification is denied
ThrowUserError('flag_update_denied',
diff --git a/Bugzilla/User.pm b/Bugzilla/User.pm
index 4cb2c4469..961b2ca0b 100644
--- a/Bugzilla/User.pm
+++ b/Bugzilla/User.pm
@@ -642,6 +642,21 @@ sub get_enterable_products {
return $self->{enterable_products};
}
+sub can_request_flag {
+ my ($self, $flag_type) = @_;
+
+ return ($self->can_set_flag($flag_type)
+ || !$flag_type->request_group
+ || $self->in_group_id($flag_type->request_group->id)) ? 1 : 0;
+}
+
+sub can_set_flag {
+ my ($self, $flag_type) = @_;
+
+ return (!$flag_type->grant_group
+ || $self->in_group_id($flag_type->grant_group->id)) ? 1 : 0;
+}
+
# visible_groups_inherited returns a reference to a list of all the groups
# whose members are visible to this user.
sub visible_groups_inherited {
@@ -1741,6 +1756,24 @@ method should be called in such a case to force reresolution of these groups.
Returns: an array of product objects.
+=item C<can_request_flag($flag_type)>
+
+ Description: Checks whether the user can request flags of the given type.
+
+ Params: $flag_type - a Bugzilla::FlagType object.
+
+ Returns: 1 if the user can request flags of the given type,
+ 0 otherwise.
+
+=item C<can_set_flag($flag_type)>
+
+ Description: Checks whether the user can set flags of the given type.
+
+ Params: $flag_type - a Bugzilla::FlagType object.
+
+ Returns: 1 if the user can set flags of the given type,
+ 0 otherwise.
+
=item C<get_userlist>
Returns a reference to an array of users. The array is populated with hashrefs
diff --git a/template/en/default/flag/list.html.tmpl b/template/en/default/flag/list.html.tmpl
index 643547405..463ade125 100644
--- a/template/en/default/flag/list.html.tmpl
+++ b/template/en/default/flag/list.html.tmpl
@@ -104,11 +104,18 @@
<select id="flag-[% flag.id %]" name="flag-[% flag.id %]"
title="[% type.description FILTER html %]"
onchange="toggleRequesteeField(this);">
- <option value="X"></option>
+ [%# Only display statuses the user is allowed to set. %]
[% IF type.is_active %]
- <option value="+" [% "selected" IF flag.status == "+" %]>+</option>
- <option value="-" [% "selected" IF flag.status == "-" %]>-</option>
- [% IF type.is_requestable || flag.status == "?" %]
+ [% IF user.can_request_flag(type) %]
+ <option value="X"></option>
+ [% END %]
+ [% IF user.can_set_flag(type) || flag.status == "+" %]
+ <option value="+" [% "selected" IF flag.status == "+" %]>+</option>
+ [% END %]
+ [% IF user.can_set_flag(type) || flag.status == "-" %]
+ <option value="-" [% "selected" IF flag.status == "-" %]>-</option>
+ [% END %]
+ [% IF (type.is_requestable && user.can_request_flag(type)) || flag.status == "?" %]
<option value="?" [% "selected" IF flag.status == "?" %]>?</option>
[% END %]
[% ELSE %]
@@ -146,11 +153,14 @@
<td>
<select id="flag_type-[% type.id %]" name="flag_type-[% type.id %]"
title="[% type.description FILTER html %]"
+ [% " disabled=\"disabled\"" UNLESS user.can_request_flag(type) %]
onchange="toggleRequesteeField(this);">
<option value="X"></option>
- <option value="+">+</option>
- <option value="-">-</option>
- [% IF type.is_requestable %]
+ [% IF user.can_set_flag(type) %]
+ <option value="+">+</option>
+ <option value="-">-</option>
+ [% END %]
+ [% IF type.is_requestable && user.can_request_flag(type) %]
<option value="?">?</option>
[% END %]
</select>
@@ -186,11 +196,14 @@
<td>
<select id="flag_type-[% type.id %]" name="flag_type-[% type.id %]"
title="[% type.description FILTER html %]"
+ [% " disabled=\"disabled\"" UNLESS user.can_request_flag(type) %]
onchange="toggleRequesteeField(this);">
<option value="X"></option>
- <option value="+">+</option>
- <option value="-">-</option>
- [% IF type.is_requestable %]
+ [% IF user.can_set_flag(type) %]
+ <option value="+">+</option>
+ <option value="-">-</option>
+ [% END %]
+ [% IF type.is_requestable && user.can_request_flag(type) %]
<option value="?">?</option>
[% END %]
</select>