Bug 266159: It's possible to create multiple flags by reloading, even if flag is not multiplicable - Patch by Fr�d�ric Buclin <LpSolit@gmail.com> r/a = myk

This commit is contained in:
lpsolit%gmail.com 2005-06-10 22:57:16 +00:00
Родитель c491cd6268
Коммит 7ca399bb29
1 изменённых файлов: 37 добавлений и 10 удалений

Просмотреть файл

@ -680,7 +680,8 @@ sub clear {
=item C<FormToNewFlags($target, $cgi) =item C<FormToNewFlags($target, $cgi)
Someone pleasedocument this function. Checks whether or not there are new flags to create and returns an
array of flag objects. This array is then passed to Flag::create().
=back =back
@ -689,23 +690,49 @@ Someone pleasedocument this function.
sub FormToNewFlags { sub FormToNewFlags {
my ($target, $cgi) = @_; my ($target, $cgi) = @_;
# Get information about the setter to add to each flag. my $dbh = Bugzilla->dbh;
# Uses a conditional to suppress Perl's "used only once" warnings.
my $setter = new Bugzilla::User($::userid);
# Extract a list of flag type IDs from field names. # Extract a list of flag type IDs from field names.
my @type_ids = map(/^flag_type-(\d+)$/ ? $1 : (), $cgi->param()); my @type_ids = map(/^flag_type-(\d+)$/ ? $1 : (), $cgi->param());
@type_ids = grep($cgi->param("flag_type-$_") ne 'X', @type_ids); @type_ids = grep($cgi->param("flag_type-$_") ne 'X', @type_ids);
# Process the form data and create an array of flag objects. return () unless (scalar(@type_ids) && $target->{'exists'});
# Get information about the setter to add to each flag.
my $setter = new Bugzilla::User($::userid);
# Get a list of active flag types available for this target.
my $flag_types = Bugzilla::FlagType::match(
{ 'target_type' => $target->{'type'},
'product_id' => $target->{'product_id'},
'component_id' => $target->{'component_id'},
'is_active' => 1 });
my @flags; my @flags;
foreach my $type_id (@type_ids) { foreach my $flag_type (@$flag_types) {
my $type_id = $flag_type->{'id'};
# We are only interested in flags the user tries to create.
next unless scalar(grep { $_ == $type_id } @type_ids);
# Get the number of active flags of this type already set for this target.
my $has_flags = count(
{ 'type_id' => $type_id,
'target_type' => $target->{'type'},
'bug_id' => $target->{'bug'}->{'id'},
'attach_id' => $target->{'attachment'}->{'id'},
'is_active' => 1 });
# Do not create a new flag of this type if this flag type is
# not multiplicable and already has an active flag set.
next if (!$flag_type->{'is_multiplicable'} && $has_flags);
my $status = $cgi->param("flag_type-$type_id"); my $status = $cgi->param("flag_type-$type_id");
&::trick_taint($status); trick_taint($status);
# Create the flag record and populate it with data from the form. # Create the flag record and populate it with data from the form.
my $flag = { my $flag = {
type => Bugzilla::FlagType::get($type_id) , type => $flag_type ,
target => $target , target => $target ,
setter => $setter , setter => $setter ,
status => $status status => $status