Do not remove visibility values the user cannot see in editvalues

classes
Vitaliy Filippov 2016-03-09 17:14:46 +03:00
parent 3efbc41166
commit 8e13a0ff60
4 changed files with 23 additions and 12 deletions

View File

@ -551,7 +551,8 @@ sub can_tweak
return 1; return 1;
} }
# Return valid values for this field, arrayref of Bugzilla::Field::Choice objects. # Return valid values for this field, arrayref of Bugzilla::Field::Choice objects,
# filtered by the current user's permissions.
# Includes disabled values is $include_disabled == true # Includes disabled values is $include_disabled == true
sub legal_values sub legal_values
{ {
@ -943,24 +944,24 @@ sub touch
sub set_visibility_values sub set_visibility_values
{ {
my $self = shift; my $self = shift;
my ($value_ids) = @_; my ($value_ids, $skip_invisible) = @_;
$self->update_visibility_values(FLAG_VISIBLE, $value_ids); $self->update_visibility_values(FLAG_VISIBLE, $value_ids, $skip_invisible);
return $value_ids && @$value_ids; return $value_ids && @$value_ids;
} }
sub set_null_visibility_values sub set_null_visibility_values
{ {
my $self = shift; my $self = shift;
my ($value_ids) = @_; my ($value_ids, $skip_invisible) = @_;
$self->update_visibility_values(FLAG_NULLABLE, $value_ids); $self->update_visibility_values(FLAG_NULLABLE, $value_ids, $skip_invisible);
return $value_ids && @$value_ids; return $value_ids && @$value_ids;
} }
sub set_clone_visibility_values sub set_clone_visibility_values
{ {
my $self = shift; my $self = shift;
my ($value_ids) = @_; my ($value_ids, $skip_invisible) = @_;
$self->update_visibility_values(FLAG_CLONED, $value_ids); $self->update_visibility_values(FLAG_CLONED, $value_ids, $skip_invisible);
return $value_ids && @$value_ids; return $value_ids && @$value_ids;
} }
@ -992,7 +993,7 @@ sub clear_default_values
sub update_visibility_values sub update_visibility_values
{ {
my $self = shift; my $self = shift;
my ($controlled_value_id, $visibility_value_ids) = @_; my ($controlled_value_id, $visibility_value_ids, $skip_invisible) = @_;
$visibility_value_ids ||= []; $visibility_value_ids ||= [];
my $vis_field = $self->flag_field($controlled_value_id); my $vis_field = $self->flag_field($controlled_value_id);
if (!$vis_field) if (!$vis_field)
@ -1014,6 +1015,16 @@ sub update_visibility_values
$h = $h->{null}->{$self->id} if $controlled_value_id == FLAG_NULLABLE; $h = $h->{null}->{$self->id} if $controlled_value_id == FLAG_NULLABLE;
$h = $h->{clone}->{$self->id} if $controlled_value_id == FLAG_CLONED; $h = $h->{clone}->{$self->id} if $controlled_value_id == FLAG_CLONED;
$h = $h ? { %$h } : {}; $h = $h ? { %$h } : {};
if ($skip_invisible)
{
# Do not affect visibility values the user can't see
# so he can't damage other user's visibility values for the same field value
my $allowed = { map { $_->id => 1 } @{$vis_field->legal_values} };
for (keys %$h)
{
delete $h->{$_} if !$allowed->{$_};
}
}
my $add = []; my $add = [];
for (@$visibility_value_ids) for (@$visibility_value_ids)
{ {

View File

@ -413,8 +413,8 @@ sub set_sortkey { $_[0]->set('sortkey', $_[1]); }
sub set_visibility_values sub set_visibility_values
{ {
my $self = shift; my $self = shift;
my ($value_ids) = @_; my ($value_ids, $skip_invisible) = @_;
$self->field->update_visibility_values($self->id, $value_ids); $self->field->update_visibility_values($self->id, $value_ids, $skip_invisible);
delete $self->{visibility_values}; delete $self->{visibility_values};
return $value_ids; return $value_ids;
} }

View File

@ -148,7 +148,7 @@ elsif ($action eq 'update')
} }
else else
{ {
$field->${\$_->[2]}([ list $ARGS->{$_->[3]} ]); $field->${\$_->[2]}([ list $ARGS->{$_->[3]} ], 'SKIP_INVISIBLE');
} }
} }
} }

View File

@ -165,7 +165,7 @@ if ($action eq 'update')
} }
if ($value->field->value_field) if ($value->field->value_field)
{ {
$vars->{changes}->{visibility_values} = $value->set_visibility_values([ list $ARGS->{visibility_value_id} ]); $vars->{changes}->{visibility_values} = $value->set_visibility_values([ list $ARGS->{visibility_value_id} ], 'SKIP_INVISIBLE');
} }
$vars->{changes}->{control_lists} = 1 if $field->update_control_lists($value->id, $ARGS); $vars->{changes}->{control_lists} = 1 if $field->update_control_lists($value->id, $ARGS);
delete_token($token); delete_token($token);