Backing out fix for bug 287325 (initial implementation of custom fields): turns out the tree is not yet open for 2.24 checkins after all. I'll check this back in once the tree opens for 2.24 checkins, which lpsolit says will be in about a month.

This commit is contained in:
myk%mozilla.org 2006-01-06 14:38:43 +00:00
Родитель b6e4f982d8
Коммит 40ef8793a1
16 изменённых файлов: 64 добавлений и 513 удалений

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

@ -35,7 +35,6 @@ use Bugzilla::Template;
use Bugzilla::User;
use Bugzilla::Error;
use Bugzilla::Util;
use Bugzilla::Field;
use File::Basename;
@ -277,17 +276,6 @@ sub switch_to_main_db {
return $class->dbh;
}
sub get_fields {
my $class = shift;
my $criteria = shift;
return Bugzilla::Field::match($criteria);
}
sub custom_field_names {
# Get a list of custom fields and convert it into a list of their names.
return map($_->{name}, Bugzilla::Field::match({ custom=>1, obsolete=>0 }));
}
# Private methods
# Per process cleanup

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

@ -90,8 +90,6 @@ sub fields {
push @fields, qw(estimated_time remaining_time actual_time deadline);
}
push(@fields, Bugzilla->custom_field_names);
return @fields;
}
@ -164,11 +162,6 @@ sub initBug {
$self->{'who'} = new Bugzilla::User($user_id);
my $custom_fields = "";
if (length(Bugzilla->custom_field_names) > 0) {
$custom_fields = ", " . join(", ", Bugzilla->custom_field_names);
}
my $query = "
SELECT
bugs.bug_id, alias, products.classification_id, classifications.name,
@ -182,8 +175,7 @@ sub initBug {
delta_ts, COALESCE(SUM(votes.vote_count), 0),
reporter_accessible, cclist_accessible,
estimated_time, remaining_time, " .
$dbh->sql_date_format('deadline', '%Y-%m-%d') .
$custom_fields . "
$dbh->sql_date_format('deadline', '%Y-%m-%d') . "
FROM bugs
LEFT JOIN votes
ON bugs.bug_id = votes.bug_id
@ -220,8 +212,7 @@ sub initBug {
"target_milestone", "qa_contact_id", "status_whiteboard",
"creation_ts", "delta_ts", "votes",
"reporter_accessible", "cclist_accessible",
"estimated_time", "remaining_time", "deadline",
Bugzilla->custom_field_names)
"estimated_time", "remaining_time", "deadline")
{
$fields{$field} = shift @row;
if (defined $fields{$field}) {

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

@ -91,9 +91,6 @@ use base qw(Exporter);
ADMIN_GROUP_NAME
SENDMAIL_EXE
FIELD_TYPE_UNKNOWN
FIELD_TYPE_FREETEXT
);
@Bugzilla::Constants::EXPORT_OK = qw(contenttypes);
@ -246,14 +243,4 @@ use constant ADMIN_GROUP_NAME => 'admin';
# Path to sendmail.exe (Windows only)
use constant SENDMAIL_EXE => '/usr/lib/sendmail.exe';
# Field types. Match values in fielddefs.type column. These are purposely
# not named after database column types, since Bugzilla fields comprise not
# only storage but also logic. For example, we might add a "user" field type
# whose values are stored in an integer column in the database but for which
# we do more than we would do for a standard integer type (f.e. we might
# display a user picker).
use constant FIELD_TYPE_UNKNOWN => 0;
use constant FIELD_TYPE_FREETEXT => 1;
1;

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

@ -36,7 +36,6 @@ package Bugzilla::DB::Schema;
use strict;
use Bugzilla::Error;
use Bugzilla::Util;
use Bugzilla::Constants;
use Safe;
# Historical, needed for SCHEMA_VERSION = '1.00'
@ -454,10 +453,6 @@ use constant ABSTRACT_SCHEMA => {
fieldid => {TYPE => 'MEDIUMSERIAL', NOTNULL => 1,
PRIMARYKEY => 1},
name => {TYPE => 'varchar(64)', NOTNULL => 1},
type => {TYPE => 'INT2', NOTNULL => 1,
DEFAULT => FIELD_TYPE_UNKNOWN},
custom => {TYPE => 'BOOLEAN', NOTNULL => 1,
DEFAULT => 'FALSE'},
description => {TYPE => 'MEDIUMTEXT', NOTNULL => 1},
mailhead => {TYPE => 'BOOLEAN', NOTNULL => 1,
DEFAULT => 'FALSE'},

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

@ -14,57 +14,6 @@
#
# Contributor(s): Dan Mosedale <dmose@mozilla.org>
# Frédéric Buclin <LpSolit@gmail.com>
# Myk Melez <myk@mozilla.org>
=head1 NAME
Bugzilla::Field - a particular piece of information about bugs
and useful routines for form field manipulation
=head1 SYNOPSIS
use Bugzilla;
use Data::Dumper;
# Display information about all fields.
print Dumper(Bugzilla->get_fields());
# Display information about non-obsolete custom fields.
print Dumper(Bugzilla->get_fields({ obsolete => 1, custom => 1 }));
# Display a list of the names of non-obsolete custom fields.
print Bugzilla->custom_field_names;
use Bugzilla::Field;
# Display information about non-obsolete custom fields.
# Bugzilla->get_fields() is a wrapper around Bugzilla::Field::match(),
# so both methods take the same arguments.
print Dumper(Bugzilla::Field::match({ obsolete => 1, custom => 1 }));
# Create a custom field.
my $field = Bugzilla::Field::create("hilarity", "Hilarity");
print "$field->{description} is a custom field\n";
# Instantiate a Field object for an existing field.
my $field = new Bugzilla::Field('qacontact_accessible');
if ($field->{obsolete}) {
print "$field->{description} is obsolete\n";
}
# Validation Routines
check_form_field($cgi, $fieldname, \@legal_values);
check_form_field_defined($cgi, $fieldname);
$fieldid = get_field_id($fieldname);
=head1 DESCRIPTION
Field.pm defines field objects, which represent the particular pieces
of information that Bugzilla stores about bugs.
This package also provides functions for dealing with CGI form fields.
=cut
package Bugzilla::Field;
@ -75,234 +24,8 @@ use base qw(Exporter);
get_field_id);
use Bugzilla::Util;
use Bugzilla::Constants;
use Bugzilla::Error;
use constant DB_COLUMNS => (
'fieldid AS id',
'name',
'description',
'type',
'custom',
'obsolete'
);
our $columns = join(", ", DB_COLUMNS);
sub new {
my $invocant = shift;
my $name = shift;
my $self = shift || Bugzilla->dbh->selectrow_hashref(
"SELECT $columns FROM fielddefs WHERE name = ?",
undef,
$name
);
bless($self, $invocant);
return $self;
}
=pod
=head2 Instance Properties
=over
=item C<id>
the unique identifier for the field;
=back
=cut
sub id { return $_[0]->{id} }
=over
=item C<name>
the name of the field in the database; begins with "cf_" if field
is a custom field, but test the value of the boolean "custom" property
to determine if a given field is a custom field;
=back
=cut
sub name { return $_[0]->{name} }
=over
=item C<description>
a short string describing the field; displayed to Bugzilla users
in several places within Bugzilla's UI, f.e. as the form field label
on the "show bug" page;
=back
=cut
sub description { return $_[0]->{description} }
=over
=item C<type>
an integer specifying the kind of field this is; values correspond to
the FIELD_TYPE_* constants in Constants.pm
=back
=cut
sub type { return $_[0]->{type} }
=over
=item C<custom>
a boolean specifying whether or not the field is a custom field;
if true, field name should start "cf_", but use this property to determine
which fields are custom fields;
=back
=cut
sub custom { return $_[0]->{custom} }
=over
=item C<obsolete>
a boolean specifying whether or not the field is obsolete;
=back
=cut
sub obsolete { return $_[0]->{obsolete} }
=pod
=head2 Class Methods
=over
=item C<create($name, $desc)>
Description: creates a new custom field.
Params: C<$name> - string - the name of the field;
C<$desc> - string - the field label to display in the UI.
Returns: a field object.
=back
=cut
sub create {
my ($name, $desc, $custom) = @_;
# Convert the $custom argument into a DB-compatible value.
$custom = $custom ? 1 : 0;
my $dbh = Bugzilla->dbh;
# Some day we'll allow invocants to specify the sort key.
my ($sortkey) =
$dbh->selectrow_array("SELECT MAX(sortkey) + 1 FROM fielddefs");
# Some day we'll require invocants to specify the field type.
my $type = FIELD_TYPE_FREETEXT;
# Create the database column that stores the data for this field.
$dbh->bz_add_column("bugs", $name, { TYPE => 'varchar(255)' });
# Add the field to the list of fields at this Bugzilla installation.
my $sth = $dbh->prepare(
"INSERT INTO fielddefs (name, description, sortkey, type,
custom, mailhead)
VALUES (?, ?, ?, ?, ?, 1)"
);
$sth->execute($name, $desc, $sortkey, $type, $custom);
return new Bugzilla::Field($name);
}
=pod
=over
=item C<match($criteria)>
Description: returns a list of fields that match the specified criteria.
Params: C<$criteria> - hash reference - the criteria to match against.
Hash keys represent field properties; hash values represent
their values. All criteria are optional. Valid criteria are
"custom" and "obsolete", and both take boolean values.
Note: Bugzilla->get_fields() and Bugzilla->custom_field_names
wrap this method for most callers.
Returns: a list of field objects.
=back
=cut
sub match {
my ($criteria) = @_;
my @terms;
if (defined $criteria->{name}) {
push(@terms, "name=" . Bugzilla->dbh->quote($criteria->{name}));
}
if (defined $criteria->{custom}) {
push(@terms, "custom=" . ($criteria->{custom} ? "1" : "0"));
}
if (defined $criteria->{obsolete}) {
push(@terms, "obsolete=" . ($criteria->{obsolete} ? "1" : "0"));
}
my $where = (scalar(@terms) > 0) ? "WHERE " . join(" AND ", @terms) : "";
my $records = Bugzilla->dbh->selectall_arrayref(
"SELECT $columns FROM fielddefs $where ORDER BY sortkey",
{ Slice => {}}
);
# Generate a array of field objects from the array of field records.
my @fields = map( new Bugzilla::Field(undef, $_), @$records );
return @fields;
}
=pod
=head2 Data Validation
=over
=item C<check_form_field($cgi, $fieldname, \@legal_values)>
Description: Makes sure the field $fieldname is defined and its value
is non empty. If @legal_values is defined, this routine
also checks whether its value is one of the legal values
associated with this field. If the test fails, an error
is thrown.
Params: $cgi - a CGI object
$fieldname - the field name to check
@legal_values - (optional) ref to a list of legal values
Returns: nothing
=back
=cut
sub check_form_field {
my ($cgi, $fieldname, $legalsRef) = @_;
@ -322,24 +45,6 @@ sub check_form_field {
}
}
=pod
=over
=item C<check_form_field_defined($cgi, $fieldname)>
Description: Makes sure the field $fieldname is defined and its value
is non empty. Else an error is thrown.
Params: $cgi - a CGI object
$fieldname - the field name to check
Returns: nothing
=back
=cut
sub check_form_field_defined {
my ($cgi, $fieldname) = @_;
@ -348,24 +53,6 @@ sub check_form_field_defined {
}
}
=pod
=over
=item C<get_field_id($fieldname)>
Description: Returns the ID of the specified field name and throws
an error if this field does not exist.
Params: $name - a field name
Returns: the corresponding field ID or an error if the field name
does not exist.
=back
=cut
sub get_field_id {
my ($name) = @_;
my $dbh = Bugzilla->dbh;
@ -381,3 +68,64 @@ sub get_field_id {
1;
__END__
=head1 NAME
Bugzilla::Field - Useful routines for fields manipulation
=head1 SYNOPSIS
use Bugzilla::Field;
# Validation Routines
check_form_field($cgi, $fieldname, \@legal_values);
check_form_field_defined($cgi, $fieldname);
$fieldid = get_field_id($fieldname);
=head1 DESCRIPTION
This package provides functions for dealing with CGI form fields.
=head1 FUNCTIONS
This package provides several types of routines:
=head2 Validation
=over
=item C<check_form_field($cgi, $fieldname, \@legal_values)>
Description: Makes sure the field $fieldname is defined and its value
is non empty. If @legal_values is defined, this routine
also checks whether its value is one of the legal values
associated with this field. If the test fails, an error
is thrown.
Params: $cgi - a CGI object
$fieldname - the field name to check
@legal_values - (optional) ref to a list of legal values
Returns: nothing
=item C<check_form_field_defined($cgi, $fieldname)>
Description: Makes sure the field $fieldname is defined and its value
is non empty. Else an error is thrown.
Params: $cgi - a CGI object
$fieldname - the field name to check
Returns: nothing
=item C<get_field_id($fieldname)>
Description: Returns the ID of the specified field name and throws
an error if this field does not exist.
Params: $fieldname - a field name
Returns: the corresponding field ID or an error if the field name
does not exist.
=back

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

@ -1305,7 +1305,7 @@ unless ($switch{'no_templates'}) {
# These are the files which need to be marked executable
my @executable_files = ('whineatnews.pl', 'collectstats.pl',
'checksetup.pl', 'importxml.pl', 'runtests.pl', 'testserver.pl',
'whine.pl', 'customfield.pl');
'whine.pl');
# tell me if a file is executable. All CGI files and those in @executable_files
# are executable
@ -4240,13 +4240,6 @@ $dbh->bz_alter_column('logincookies', 'cookie',
{TYPE => 'varchar(16)', PRIMARYKEY => 1, NOTNULL => 1});
# 2005-08-10 Myk Melez <myk@mozilla.org> bug 287325
# Record each field's type and whether or not it's a custom field in fielddefs.
$dbh->bz_add_column('fielddefs', 'type',
{ TYPE => 'INT2', NOTNULL => 1, DEFAULT => 0 });
$dbh->bz_add_column('fielddefs', 'custom',
{ TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => 'FALSE' });
# If you had to change the --TABLE-- definition in any way, then add your
# differential change code *** A B O V E *** this comment.
#

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

@ -1,88 +0,0 @@
#!/usr/bin/perl -wT
# -*- Mode: perl; indent-tabs-mode: nil -*-
#
# The contents of this file are subject to the Mozilla Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is the Bugzilla Bug Tracking System.
#
# The Initial Developer of the Original Code is Netscape Communications
# Corporation. Portions created by Netscape are
# Copyright (C) 1998 Netscape Communications Corporation. All
# Rights Reserved.
#
# Contributor(s): Myk Melez <myk@mozilla.org>
################################################################################
# Script Initialization
################################################################################
use strict;
use lib ".";
require "globals.pl";
use Bugzilla::Field;
use Getopt::Long;
my ($name, $desc);
my $result = GetOptions("name=s" => \$name,
"description|desc=s" => \$desc);
if (!$name or !$desc) {
my $command =
$^O =~ /MSWin32/i ? "perl -T customfield.pl" : "./customfield.pl";
print <<END;
Usage:
Use this script to add a custom field to your Bugzilla installation
by invoking it with the --name and --desc command-line options:
$command --name=<field_name> --desc="<field description>"
<field_name> is the name of the custom field in the database.
The string "cf_" will be prepended to this name to distinguish
the field from standard fields. This name must conform to the
naming rules for the database server you use.
<field description> is a short string describing the field. It will
be displayed to Bugzilla users in several parts of Bugzilla's UI,
for example as the label for the field on the "show bug" page.
Warning:
Custom fields can make Bugzilla less usable. See this URL
for alternatives to custom fields:
http://www.gerv.net/hacking/custom-fields.html
You should try to implement applicable alternatives before using
this script to add a custom field.
END
exit;
}
# Prepend cf_ to the custom field name to distinguish it from standard fields.
$name =~ /^cf_/
or $name = "cf_" . $name;
# Exit gracefully if there is already a field with the given name.
if (scalar(Bugzilla::Field::match({ name=>$name })) > 0) {
print "There is already a field named $name. Please choose " .
"a different name.\n";
exit;
}
# Create the field.
print "Creating custom field $name ...\n";
my $field = Bugzilla::Field::create($name, $desc, 1);
print "Custom field $name created.\n";

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

@ -31,7 +31,6 @@ use lib ".";
require "globals.pl";
use Bugzilla;
use Bugzilla::Constants;
use Bugzilla::Config qw(:DEFAULT $datadir);
use Bugzilla::Series;

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

@ -21,7 +21,6 @@ use lib ".";
require "globals.pl";
use Bugzilla;
use Bugzilla::Constants;
use Bugzilla::Config qw(:DEFAULT $datadir);
use Bugzilla::Product;

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

@ -33,7 +33,6 @@
use strict;
use lib ".";
use Bugzilla;
use Bugzilla::Constants;
require "globals.pl";
use Bugzilla::Bug;

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

@ -855,18 +855,6 @@ foreach my $field ("rep_platform", "priority", "bug_severity",
}
}
# Add custom fields data to the query that will update the database.
foreach my $field (Bugzilla->custom_field_names) {
if (defined $cgi->param($field)
&& (!$cgi->param('dontchange')
|| $cgi->param($field) ne $cgi->param('dontchange')))
{
DoComma();
$::query .= "$field = " . SqlQuote(trim($cgi->param($field)));
}
}
my $prod_id;
my $prod_changed;
my @newprod_ids;

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

@ -28,7 +28,6 @@ use lib qw(.);
require "globals.pl";
use Bugzilla;
use Bugzilla::Bug;
my $cgi = Bugzilla->cgi;

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

@ -27,7 +27,6 @@ use strict;
use lib qw(.);
require "globals.pl";
use Bugzilla;
use Bugzilla::User;
use Bugzilla::Bug;

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

@ -23,7 +23,6 @@ use lib qw(.);
use Date::Parse; # strptime
use Date::Format; # strftime
use Bugzilla;
use Bugzilla::Bug; # EmitDependList
use Bugzilla::Util; # trim
use Bugzilla::Constants; # LOGIN_*

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

@ -497,15 +497,6 @@
</table>
[% END %]
[%# *** Custom Fields *** %]
[% USE Bugzilla %]
<table>
[% FOREACH field = Bugzilla.get_fields({ obsolete => 0, custom => 1 }) %]
[% PROCESS bug/field.html.tmpl value=bug.${field.name} %]
[% END %]
</table>
[%# *** Attachments *** %]
[% PROCESS attachment/list.html.tmpl

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

@ -1,36 +0,0 @@
[%# 1.0@bugzilla.org %]
[%# The contents of this file are subject to the Mozilla Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is the Bugzilla Bug Tracking System.
#
# The Initial Developer of the Original Code is Netscape Communications
# Corporation. Portions created by Netscape are
# Copyright (C) 1998 Netscape Communications Corporation. All
# Rights Reserved.
#
# Contributor(s): Myk Melez <myk@mozilla.org>
#%]
<tr>
[% SWITCH field.type %]
[% CASE constants.FIELD_TYPE_FREETEXT %]
<th align="right">
<label for="[% field.name FILTER html %]">
[% field.description FILTER html %]:
</label>
</th>
<td>
<input name="[% field.name FILTER html %]"
value="[% value FILTER html %]"
size="60">
</td>
[% END %]
</tr>