Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
bugzilla
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
etersoft
bugzilla
Commits
790e8bbb
Commit
790e8bbb
authored
Nov 13, 2006
by
mkanat%bugzilla.org
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Bug 350307: Split out the create and update functionality of Bugzilla::Field::create_or_update
Patch By Max Kanat-Alexander <mkanat@bugzilla.org> r=LpSolit, a=justdave
parent
dacf3a2a
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
234 additions
and
162 deletions
+234
-162
DB.pm
Bugzilla/DB.pm
+2
-0
Field.pm
Bugzilla/Field.pm
+183
-71
checksetup.pl
checksetup.pl
+1
-1
editfields.cgi
editfields.cgi
+21
-63
create.html.tmpl
template/en/default/admin/custom_fields/create.html.tmpl
+1
-1
messages.html.tmpl
template/en/default/global/messages.html.tmpl
+2
-2
user-error.html.tmpl
template/en/default/global/user-error.html.tmpl
+24
-24
No files found.
Bugzilla/DB.pm
View file @
790e8bbb
...
@@ -587,6 +587,8 @@ sub _bz_add_table_raw {
...
@@ -587,6 +587,8 @@ sub _bz_add_table_raw {
sub
bz_add_field_table
{
sub
bz_add_field_table
{
my
(
$self
,
$name
)
=
@_
;
my
(
$self
,
$name
)
=
@_
;
my
$table_schema
=
$self
->
_bz_schema
->
FIELD_TABLE_SCHEMA
;
my
$table_schema
=
$self
->
_bz_schema
->
FIELD_TABLE_SCHEMA
;
# We do nothing if the table already exists.
return
if
$self
->
bz_table_info
(
$name
);
my
$indexes
=
$table_schema
->
{
INDEXES
};
my
$indexes
=
$table_schema
->
{
INDEXES
};
# $indexes is an arrayref, not a hash. In order to fix the keys,
# $indexes is an arrayref, not a hash. In order to fix the keys,
# we have to fix every other item.
# we have to fix every other item.
...
...
Bugzilla/Field.pm
View file @
790e8bbb
...
@@ -43,8 +43,8 @@ Bugzilla::Field - a particular piece of information about bugs
...
@@ -43,8 +43,8 @@ Bugzilla::Field - a particular piece of information about bugs
print Dumper(Bugzilla::Field->match({ obsolete => 1, custom => 1 }));
print Dumper(Bugzilla::Field->match({ obsolete => 1, custom => 1 }));
# Create or update a custom field or field definition.
# Create or update a custom field or field definition.
my $field = Bugzilla::Field
::create_or_upd
ate(
my $field = Bugzilla::Field
->cre
ate(
{name => '
hilarity', desc => 'Hilarit
y', custom => 1});
{name => '
cf_silly', description => 'Sill
y', custom => 1});
# Instantiate a Field object for an existing field.
# Instantiate a Field object for an existing field.
my $field = new Bugzilla::Field({name => 'qacontact_accessible'});
my $field = new Bugzilla::Field({name => 'qacontact_accessible'});
...
@@ -99,6 +99,26 @@ use constant DB_COLUMNS => (
...
@@ -99,6 +99,26 @@ use constant DB_COLUMNS => (
'enter_bug'
,
'enter_bug'
,
);
);
use
constant
REQUIRED_CREATE_FIELDS
=>
qw(name description)
;
use
constant
VALIDATORS
=>
{
custom
=>
\&
_check_custom
,
description
=>
\&
_check_description
,
enter_bug
=>
\&
_check_enter_bug
,
mailhead
=>
\&
_check_mailhead
,
obsolete
=>
\&
_check_obsolete
,
sortkey
=>
\&
_check_sortkey
,
type
=>
\&
_check_type
,
};
use
constant
UPDATE_COLUMNS
=>
qw(
description
mailhead
sortkey
obsolete
enter_bug
)
;
# How various field types translate into SQL data definitions.
# How various field types translate into SQL data definitions.
use
constant
SQL_DEFINITIONS
=>
{
use
constant
SQL_DEFINITIONS
=>
{
# Using commas because these are constants and they shouldn't
# Using commas because these are constants and they shouldn't
...
@@ -168,6 +188,76 @@ use constant DEFAULT_FIELDS => (
...
@@ -168,6 +188,76 @@ use constant DEFAULT_FIELDS => (
{
name
=>
"owner_idle_time"
,
desc
=>
"Time Since Assignee Touched"
},
{
name
=>
"owner_idle_time"
,
desc
=>
"Time Since Assignee Touched"
},
);
);
##############
# Validators #
##############
sub
_check_custom
{
return
$_
[
1
]
?
1
:
0
;
}
sub
_check_description
{
my
(
$invocant
,
$desc
)
=
@_
;
$desc
=
clean_text
(
$desc
);
$desc
||
ThrowUserError
(
'field_missing_description'
);
return
$desc
;
}
sub
_check_enter_bug
{
return
$_
[
1
]
?
1
:
0
;
}
sub
_check_mailhead
{
return
$_
[
1
]
?
1
:
0
;
}
sub
_check_name
{
my
(
$invocant
,
$name
,
$is_custom
)
=
@_
;
$name
=
clean_text
(
$name
);
$name
||
ThrowUserError
(
'field_missing_name'
);
# Don't want to allow a name that might mess up SQL.
my
$name_regex
=
qr/^[\w\.]+$/
;
# Custom fields have more restrictive name requirements than
# standard fields.
$name_regex
=
qr/^\w+$/
if
$is_custom
;
# Custom fields can't be named just "cf_", and there is no normal
# field named just "cf_".
(
$name
=~
$name_regex
&&
$name
ne
"cf_"
)
||
ThrowUserError
(
'field_invalid_name'
,
{
name
=>
$name
});
# If it's custom, prepend cf_ to the custom field name to distinguish
# it from standard fields.
if
(
$name
!~
/^cf_/
&&
$is_custom
)
{
$name
=
'cf_'
.
$name
;
}
# Assure the name is unique. Names can't be changed, so we don't have
# to worry about what to do on updates.
my
$field
=
new
Bugzilla::
Field
({
name
=>
$name
});
ThrowUserError
(
'field_already_exists'
,
{
'field'
=>
$field
})
if
$field
;
return
$name
;
}
sub
_check_obsolete
{
return
$_
[
1
]
?
1
:
0
;
}
sub
_check_sortkey
{
my
(
$invocant
,
$sortkey
)
=
@_
;
my
$skey
=
$sortkey
;
if
(
!
defined
$skey
||
$skey
eq
''
)
{
(
$sortkey
)
=
Bugzilla
->
dbh
->
selectrow_array
(
'SELECT MAX(sortkey) + 100 FROM fielddefs'
)
||
100
;
}
detaint_natural
(
$sortkey
)
||
ThrowUserError
(
'field_invalid_sortkey'
,
{
sortkey
=>
$skey
});
return
$sortkey
;
}
sub
_check_type
{
my
(
$invocant
,
$type
)
=
@_
;
my
$saved_type
=
$type
;
# FIELD_TYPE_SINGLE_SELECT here should be updated every time a new,
# higher field type is added.
(
detaint_natural
(
$type
)
&&
$type
<=
FIELD_TYPE_SINGLE_SELECT
)
||
ThrowCodeError
(
'invalid_customfield_type'
,
{
type
=>
$saved_type
});
return
$type
;
}
=pod
=pod
=head2 Instance Properties
=head2 Instance Properties
...
@@ -290,98 +380,105 @@ sub legal_values {
...
@@ -290,98 +380,105 @@ sub legal_values {
=pod
=pod
=head2 Class Methods
=head2 Instance Mutators
These set the particular field that they are named after.
They take a single value--the new value for that field.
They will throw an error if you try to set the values to something invalid.
=over
=over
=item C<
create_or_update({name => $name, desc => $desc, in_new_bugmail => 0, custom => 0})
>
=item C<
set_description
>
Description: Creates a new field, or updates one that
=item C<set_enter_bug>
already exists with the same name.
Params: This function takes named parameters in a hashref:
=item C<set_obsolete>
C<name> - string - The name of the field.
C<desc> - string - The field label to display in the UI.
C<in_new_bugmail> - boolean - Whether this field appears at the
top of the bugmail for a newly-filed bug.
The following parameters are optional:
=item C<set_sortkey>
C<custom> - boolean - True if this is a Custom Field. The field
will be added to the C<bugs> table if it does not exist.
C<sortkey> - integer - The sortkey of the field.
C<editable_on_enter_bug> - boolean - Whether this field is
editable on the bug creation form.
C<is_obsolete> - boolean - Whether this field is obsolete.
Returns: a C<Bugzilla::Field> object.
=item C<set_in_new_bugmail>
=back
=back
=cut
=cut
sub
create_or_update
{
sub
set_description
{
$_
[
0
]
->
set
(
'description'
,
$_
[
1
]);
}
my
(
$params
)
=
@_
;
sub
set_enter_bug
{
$_
[
0
]
->
set
(
'enter_bug'
,
$_
[
1
]);
}
my
$dbh
=
Bugzilla
->
dbh
;
sub
set_obsolete
{
$_
[
0
]
->
set
(
'obsolete'
,
$_
[
1
]);
}
sub
set_sortkey
{
$_
[
0
]
->
set
(
'sortkey'
,
$_
[
1
]);
}
sub
set_in_new_bugmail
{
$_
[
0
]
->
set
(
'mailhead'
,
$_
[
1
]);
}
my
$name
=
$params
->
{
name
};
=pod
my
$custom
=
$params
->
{
custom
}
?
1
:
0
;
my
$in_new_bugmail
=
$params
->
{
in_new_bugmail
}
?
1
:
0
;
my
$type
=
$params
->
{
type
}
||
FIELD_TYPE_UNKNOWN
;
my
$field
=
new
Bugzilla::
Field
({
name
=>
$name
});
=head2 Class Methods
if
(
$field
)
{
# Both fields are mandatory.
my
@columns
=
(
'description'
,
'mailhead'
);
my
@values
=
(
$params
->
{
desc
},
$in_new_bugmail
);
if
(
exists
$params
->
{
sortkey
})
{
=over
push
(
@columns
,
'sortkey'
);
push
(
@values
,
$params
->
{
sortkey
}
||
0
);
}
if
(
exists
$params
->
{
editable_on_enter_bug
})
{
push
(
@columns
,
'enter_bug'
);
push
(
@values
,
$params
->
{
editable_on_enter_bug
}
?
1
:
0
);
}
if
(
exists
$params
->
{
is_obsolete
})
{
push
(
@columns
,
'obsolete'
);
push
(
@values
,
$params
->
{
is_obsolete
}
?
1
:
0
);
}
my
$columns
=
join
(
', '
,
map
{
"$_ = ?"
}
@columns
);
# Update the already-existing definition.
$dbh
->
do
(
"UPDATE fielddefs SET $columns WHERE id = ?"
,
undef
,
(
@values
,
$field
->
id
));
}
else
{
my
$sortkey
=
$params
->
{
sortkey
}
||
0
;
my
$enter_bug
=
$params
->
{
editable_on_enter_bug
}
?
1
:
0
;
my
$is_obsolete
=
$params
->
{
is_obsolete
}
?
1
:
0
;
$sortkey
||=
$dbh
->
selectrow_array
(
=item C<create>
"SELECT MAX(sortkey) + 100 FROM fielddefs"
)
||
100
;
# Add the field to the list of fields at this Bugzilla installation.
Just like L<Bugzilla::Object/create>. Takes the following parameters:
$dbh
->
do
(
"INSERT INTO fielddefs (name, description, sortkey, type,
custom, mailhead, obsolete, enter_bug)
=over
VALUES (?, ?, ?, ?, ?, ?, ?, ?)"
,
undef
,
$name
,
$params
->
{
desc
},
$sortkey
,
$type
,
$custom
,
=item C<name> B<Required> - The name of the field.
$in_new_bugmail
,
$is_obsolete
,
$enter_bug
);
}
=item C<description> B<Required> - The field label to display in the UI.
=item C<mailhead> - boolean - Whether this field appears at the
top of the bugmail for a newly-filed bug. Defaults to 0.
=item C<custom> - boolean - True if this is a Custom Field. The field
will be added to the C<bugs> table if it does not exist. Defaults to 0.
=item C<sortkey> - integer - The sortkey of the field. Defaults to 0.
=item C<enter_bug> - boolean - Whether this field is
editable on the bug creation form. Defaults to 0.
C<obsolete> - boolean - Whether this field is obsolete. Defaults to 0.
=back
=back
=cut
if
(
!
$dbh
->
bz_column_info
(
'bugs'
,
$name
)
&&
$custom
)
{
sub
create
{
my
$class
=
shift
;
my
$field
=
$class
->
SUPER::
create
(
@_
);
my
$dbh
=
Bugzilla
->
dbh
;
if
(
$field
->
custom
)
{
my
$name
=
$field
->
name
;
my
$type
=
$field
->
type
;
# Create the database column that stores the data for this field.
# Create the database column that stores the data for this field.
$dbh
->
bz_add_column
(
'bugs'
,
$name
,
SQL_DEFINITIONS
->
{
$type
});
$dbh
->
bz_add_column
(
'bugs'
,
$name
,
SQL_DEFINITIONS
->
{
$type
});
}
if
(
$custom
&&
!
$dbh
->
bz_table_info
(
$name
)
if
(
$type
==
FIELD_TYPE_SINGLE_SELECT
)
{
&&
$type
eq
FIELD_TYPE_SINGLE_SELECT
)
{
# Create the table that holds the legal values for this field.
# Create the table that holds the legal values for this field.
$dbh
->
bz_add_field_table
(
$name
);
$dbh
->
bz_add_field_table
(
$name
);
# And insert a default value of "---" into it.
# And insert a default value of "---" into it.
$dbh
->
do
(
"INSERT INTO $name (value) VALUES ('---')"
);
$dbh
->
do
(
"INSERT INTO $name (value) VALUES ('---')"
);
}
}
}
return
new
Bugzilla::
Field
({
name
=>
$name
});
return
$field
;
}
sub
run_create_validators
{
my
$class
=
shift
;
my
$dbh
=
Bugzilla
->
dbh
;
my
$params
=
$class
->
SUPER::
run_create_validators
(
@_
);
$params
->
{
name
}
=
$class
->
_check_name
(
$params
->
{
name
},
$params
->
{
custom
});
if
(
!
exists
$params
->
{
sortkey
})
{
$params
->
{
sortkey
}
=
$dbh
->
selectrow_array
(
"SELECT MAX(sortkey) + 100 FROM fielddefs"
)
||
100
;
}
return
$params
;
}
}
...
@@ -508,8 +605,22 @@ sub populate_field_definitions {
...
@@ -508,8 +605,22 @@ sub populate_field_definitions {
my
$dbh
=
Bugzilla
->
dbh
;
my
$dbh
=
Bugzilla
->
dbh
;
# ADD and UPDATE field definitions
# ADD and UPDATE field definitions
foreach
my
$definition
(
DEFAULT_FIELDS
)
{
foreach
my
$def
(
DEFAULT_FIELDS
)
{
create_or_update
(
$definition
);
my
$field
=
new
Bugzilla::
Field
({
name
=>
$def
->
{
name
}
});
if
(
$field
)
{
$field
->
set_description
(
$def
->
{
desc
});
$field
->
set_in_new_bugmail
(
$def
->
{
in_new_bugmail
});
$field
->
update
();
}
else
{
if
(
exists
$def
->
{
in_new_bugmail
})
{
$def
->
{
mailhead
}
=
$def
->
{
in_new_bugmail
};
delete
$def
->
{
in_new_bugmail
};
}
$def
->
{
description
}
=
$def
->
{
desc
};
delete
$def
->
{
desc
};
Bugzilla::
Field
->
create
(
$def
);
}
}
}
# DELETE fields which were added only accidentally, or which
# DELETE fields which were added only accidentally, or which
...
@@ -583,8 +694,9 @@ sub populate_field_definitions {
...
@@ -583,8 +694,9 @@ sub populate_field_definitions {
# This field has to be created separately, or the above upgrade code
# This field has to be created separately, or the above upgrade code
# might not run properly.
# might not run properly.
Bugzilla::Field::
create_or_update
(
Bugzilla::
Field
->
create
({
name
=>
$new_field_name
,
{
name
=>
$new_field_name
,
desc
=>
$field_description
});
description
=>
$field_description
})
unless
new
Bugzilla::
Field
({
name
=>
$new_field_name
});
}
}
...
...
checksetup.pl
View file @
790e8bbb
...
@@ -199,7 +199,7 @@ check_graphviz(!$silent) if Bugzilla->params->{'webdotbase'};
...
@@ -199,7 +199,7 @@ check_graphviz(!$silent) if Bugzilla->params->{'webdotbase'};
# Changes to the fielddefs --TABLE--
# Changes to the fielddefs --TABLE--
###########################################################################
###########################################################################
#
Calling Bugzilla::Field::create_or_update
depends on the
#
Using Bugzilla::Field's create() or update()
depends on the
# fielddefs table having a modern definition. So, we have to make
# fielddefs table having a modern definition. So, we have to make
# these particular schema changes before we make any other schema changes.
# these particular schema changes before we make any other schema changes.
Bugzilla::Install::DB::
update_fielddefs_definition
();
Bugzilla::Install::DB::
update_fielddefs_definition
();
...
...
editfields.cgi
View file @
790e8bbb
...
@@ -55,49 +55,18 @@ elsif ($action eq 'add') {
...
@@ -55,49 +55,18 @@ elsif ($action eq 'add') {
}
}
elsif
(
$action
eq
'new'
)
{
elsif
(
$action
eq
'new'
)
{
check_token_data
(
$token
,
'add_field'
);
check_token_data
(
$token
,
'add_field'
);
my
$name
=
clean_text
(
$cgi
->
param
(
'name'
)
||
''
);
my
$desc
=
clean_text
(
$cgi
->
param
(
'desc'
)
||
''
);
$vars
->
{
'field'
}
=
Bugzilla::
Field
->
create
({
my
$type
=
trim
(
$cgi
->
param
(
'type'
)
||
FIELD_TYPE_FREETEXT
);
name
=>
scalar
$cgi
->
param
(
'name'
),
my
$sortkey
=
$cgi
->
param
(
'sortkey'
)
||
0
;
description
=>
scalar
$cgi
->
param
(
'desc'
),
type
=>
scalar
$cgi
->
param
(
'type'
),
# Validate these fields.
sortkey
=>
scalar
$cgi
->
param
(
'sortkey'
),
$name
||
ThrowUserError
(
'customfield_missing_name'
);
mailhead
=>
scalar
$cgi
->
param
(
'new_bugmail'
),
# Don't want to allow a name that might mess up SQL.
enter_bug
=>
scalar
$cgi
->
param
(
'enter_bug'
),
$name
=~
/^\w+$/
&&
$name
ne
"cf_"
obsolete
=>
scalar
$cgi
->
param
(
'obsolete'
),
||
ThrowUserError
(
'customfield_invalid_name'
,
{
name
=>
$name
});
custom
=>
1
,
# Prepend cf_ to the custom field name to distinguish it from standard fields.
});
if
(
$name
!~
/^cf_/
)
{
$name
=
'cf_'
.
$name
;
}
my
$field
=
new
Bugzilla::
Field
({
'name'
=>
$name
});
ThrowUserError
(
'customfield_already_exists'
,
{
'field'
=>
$field
})
if
$field
;
$desc
||
ThrowUserError
(
'customfield_missing_description'
,
{
'name'
=>
$name
});
# We hardcode valid values for $type. This doesn't matter.
my
$typ
=
$type
;
(
detaint_natural
(
$type
)
&&
$type
<
3
)
||
ThrowCodeError
(
'invalid_customfield_type'
,
{
'type'
=>
$typ
});
my
$skey
=
$sortkey
;
detaint_natural
(
$sortkey
)
||
ThrowUserError
(
'customfield_invalid_sortkey'
,
{
'name'
=>
$name
,
'sortkey'
=>
$skey
});
# All fields have been validated. We can create this new custom field.
trick_taint
(
$name
);
trick_taint
(
$desc
);
$vars
->
{
'name'
}
=
$name
;
$vars
->
{
'desc'
}
=
$desc
;
$vars
->
{
'sortkey'
}
=
$sortkey
;
$vars
->
{
'type'
}
=
$type
;
$vars
->
{
'custom'
}
=
1
;
$vars
->
{
'in_new_bugmail'
}
=
$cgi
->
param
(
'new_bugmail'
)
?
1
:
0
;
$vars
->
{
'editable_on_enter_bug'
}
=
$cgi
->
param
(
'enter_bug'
)
?
1
:
0
;
$vars
->
{
'is_obsolete'
}
=
$cgi
->
param
(
'obsolete'
)
?
1
:
0
;
Bugzilla::Field::
create_or_update
(
$vars
);
delete_token
(
$token
);
delete_token
(
$token
);
$vars
->
{
'message'
}
=
'custom_field_created'
;
$vars
->
{
'message'
}
=
'custom_field_created'
;
...
@@ -106,7 +75,7 @@ elsif ($action eq 'new') {
...
@@ -106,7 +75,7 @@ elsif ($action eq 'new') {
||
ThrowTemplateError
(
$template
->
error
());
||
ThrowTemplateError
(
$template
->
error
());
}
}
elsif
(
$action
eq
'edit'
)
{
elsif
(
$action
eq
'edit'
)
{
my
$name
=
$cgi
->
param
(
'name'
)
||
ThrowUserError
(
'
custom
field_missing_name'
);
my
$name
=
$cgi
->
param
(
'name'
)
||
ThrowUserError
(
'field_missing_name'
);
# Custom field names must start with "cf_".
# Custom field names must start with "cf_".
if
(
$name
!~
/^cf_/
)
{
if
(
$name
!~
/^cf_/
)
{
$name
=
'cf_'
.
$name
;
$name
=
'cf_'
.
$name
;
...
@@ -123,11 +92,9 @@ elsif ($action eq 'edit') {
...
@@ -123,11 +92,9 @@ elsif ($action eq 'edit') {
elsif
(
$action
eq
'update'
)
{
elsif
(
$action
eq
'update'
)
{
check_token_data
(
$token
,
'edit_field'
);
check_token_data
(
$token
,
'edit_field'
);
my
$name
=
$cgi
->
param
(
'name'
);
my
$name
=
$cgi
->
param
(
'name'
);
my
$desc
=
clean_text
(
$cgi
->
param
(
'desc'
)
||
''
);
my
$sortkey
=
$cgi
->
param
(
'sortkey'
)
||
0
;
# Validate fields.
# Validate fields.
$name
||
ThrowUserError
(
'
custom
field_missing_name'
);
$name
||
ThrowUserError
(
'field_missing_name'
);
# Custom field names must start with "cf_".
# Custom field names must start with "cf_".
if
(
$name
!~
/^cf_/
)
{
if
(
$name
!~
/^cf_/
)
{
$name
=
'cf_'
.
$name
;
$name
=
'cf_'
.
$name
;
...
@@ -135,25 +102,16 @@ elsif ($action eq 'update') {
...
@@ -135,25 +102,16 @@ elsif ($action eq 'update') {
my
$field
=
new
Bugzilla::
Field
({
'name'
=>
$name
});
my
$field
=
new
Bugzilla::
Field
({
'name'
=>
$name
});
$field
||
ThrowUserError
(
'customfield_nonexistent'
,
{
'name'
=>
$name
});
$field
||
ThrowUserError
(
'customfield_nonexistent'
,
{
'name'
=>
$name
});
$desc
||
ThrowUserError
(
'customfield_missing_description'
,
{
'name'
=>
$name
});
$field
->
set_description
(
$cgi
->
param
(
'desc'
));
trick_taint
(
$desc
);
$field
->
set_sortkey
(
$cgi
->
param
(
'sortkey'
));
$field
->
set_in_new_bugmail
(
$cgi
->
param
(
'new_bugmail'
));
my
$skey
=
$sortkey
;
$field
->
set_enter_bug
(
$cgi
->
param
(
'enter_bug'
));
detaint_natural
(
$sortkey
)
$field
->
set_obsolete
(
$cgi
->
param
(
'obsolete'
));
||
ThrowUserError
(
'customfield_invalid_sortkey'
,
{
'name'
=>
$name
,
$field
->
update
();
'sortkey'
=>
$skey
});
$vars
->
{
'name'
}
=
$field
->
name
;
$vars
->
{
'desc'
}
=
$desc
;
$vars
->
{
'sortkey'
}
=
$sortkey
;
$vars
->
{
'custom'
}
=
1
;
$vars
->
{
'in_new_bugmail'
}
=
$cgi
->
param
(
'new_bugmail'
)
?
1
:
0
;
$vars
->
{
'editable_on_enter_bug'
}
=
$cgi
->
param
(
'enter_bug'
)
?
1
:
0
;
$vars
->
{
'is_obsolete'
}
=
$cgi
->
param
(
'obsolete'
)
?
1
:
0
;
Bugzilla::Field::
create_or_update
(
$vars
);
delete_token
(
$token
);
delete_token
(
$token
);
$vars
->
{
'field'
}
=
$field
;
$vars
->
{
'message'
}
=
'custom_field_updated'
;
$vars
->
{
'message'
}
=
'custom_field_updated'
;
$template
->
process
(
'admin/custom_fields/list.html.tmpl'
,
$vars
)
$template
->
process
(
'admin/custom_fields/list.html.tmpl'
,
$vars
)
...
...
template/en/default/admin/custom_fields/create.html.tmpl
View file @
790e8bbb
...
@@ -93,7 +93,7 @@
...
@@ -93,7 +93,7 @@
<tr>
<tr>
<th align="right"><label for="sortkey">Sortkey:</label></th>
<th align="right"><label for="sortkey">Sortkey:</label></th>
<td>
<td>
<input type="text" id="sortkey" name="sortkey"
value="0"
size="6" maxlength="6">
<input type="text" id="sortkey" name="sortkey" size="6" maxlength="6">
</td>
</td>
<th> </th>
<th> </th>
...
...
template/en/default/global/messages.html.tmpl
View file @
790e8bbb
...
@@ -168,12 +168,12 @@
...
@@ -168,12 +168,12 @@
[% ELSIF message_tag == "custom_field_created" %]
[% ELSIF message_tag == "custom_field_created" %]
[% title = "Custom Field Created" %]
[% title = "Custom Field Created" %]
The new custom field '[% name FILTER html %]' has been
The new custom field '[%
field.
name FILTER html %]' has been
successfully created.
successfully created.
[% ELSIF message_tag == "custom_field_updated" %]
[% ELSIF message_tag == "custom_field_updated" %]
[% title = "Custom Field Updated" %]
[% title = "Custom Field Updated" %]
Properties of the '[% name FILTER html %]' field have been
Properties of the '[%
field.
name FILTER html %]' field have been
successfully updated.
successfully updated.
[% ELSIF message_tag == "emailold_change_cancelled" %]
[% ELSIF message_tag == "emailold_change_cancelled" %]
...
...
template/en/default/global/user-error.html.tmpl
View file @
790e8bbb
...
@@ -311,34 +311,10 @@
...
@@ -311,34 +311,10 @@
Product [% product FILTER html %] does not have a component
Product [% product FILTER html %] does not have a component
named [% name FILTER html %].
named [% name FILTER html %].
[% ELSIF error == "customfield_already_exists" %]
[% title = "Field Already Exists" %]
The field '[% field.name FILTER html %]' ([% field.description FILTER html %])
already exists. Please choose another name.
[% ELSIF error == "customfield_invalid_name" %]
[% title = "Invalid Custom Field Name" %]
'[% name FILTER html %]' is not a valid name for a custom field.
A name may contain only letters, numbers, and the underscore character. The
name should also be different from 'cf_'.
[% ELSIF error == "customfield_nonexistent" %]
[% ELSIF error == "customfield_nonexistent" %]
[% title = "Unknown Custom Field" %]
[% title = "Unknown Custom Field" %]
There is no custom field with the name '[% name FILTER html %]'.
There is no custom field with the name '[% name FILTER html %]'.
[% ELSIF error == "customfield_invalid_sortkey" %]
[% title = "Invalid Sortkey for Field" %]
The sortkey [% sortkey FILTER html %] that you have provided for
the '[% name FILTER html %]' field is not a valid positive integer.
[% ELSIF error == "customfield_missing_description" %]
[% title = "Missing Description for Field" %]
You must enter a description for the '[% name FILTER html %]' field.
[% ELSIF error == "customfield_missing_name" %]
[% title = "Missing Name for Field" %]
You must enter a name for this field.
[% ELSIF error == "dependency_loop_multi" %]
[% ELSIF error == "dependency_loop_multi" %]
[% title = "Dependency Loop Detected" %]
[% title = "Dependency Loop Detected" %]
The following [% terms.bug %](s) would appear on both the "depends on"
The following [% terms.bug %](s) would appear on both the "depends on"
...
@@ -400,6 +376,30 @@
...
@@ -400,6 +376,30 @@
does not exist or you aren't authorized to
does not exist or you aren't authorized to
enter [% terms.abug %] into it.
enter [% terms.abug %] into it.
[% ELSIF error == "field_already_exists" %]
[% title = "Field Already Exists" %]
The field '[% field.name FILTER html %]'
([% field.description FILTER html %]) already exists. Please
choose another name.
[% ELSIF error == "field_invalid_name" %]
[% title = "Invalid Field Name" %]
'[% name FILTER html %]' is not a valid name for a field.
A name may contain only letters, numbers, and the underscore character.
[% ELSIF error == "field_invalid_sortkey" %]
[% title = "Invalid Sortkey for Field" %]
The sortkey [% sortkey FILTER html %] that you have provided for
this field is not a valid positive integer.
[% ELSIF error == "field_missing_description" %]
[% title = "Missing Description for Field" %]
You must enter a description for this field.
[% ELSIF error == "field_missing_name" %]
[% title = "Missing Name for Field" %]
You must enter a name for this field.
[% ELSIF error == "fieldname_invalid" %]
[% ELSIF error == "fieldname_invalid" %]
[% title = "Specified Field Does Not Exist" %]
[% title = "Specified Field Does Not Exist" %]
The field '[% field FILTER html %]' does not exist or
The field '[% field FILTER html %]' does not exist or
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment