diff --git a/Bugzilla/Bug.pm b/Bugzilla/Bug.pm index da330a201..b10a30c21 100644 --- a/Bugzilla/Bug.pm +++ b/Bugzilla/Bug.pm @@ -134,6 +134,7 @@ use constant REQUIRED_CREATE_FIELDS => qw( our $CUSTOM_FIELD_VALIDATORS = { FIELD_TYPE_UNKNOWN() => \&_check_default_field, FIELD_TYPE_FREETEXT() => \&_check_freetext_field, + FIELD_TYPE_EXTURL() => \&_check_freetext_field, FIELD_TYPE_SINGLE_SELECT() => \&_check_select_field, FIELD_TYPE_MULTI_SELECT() => \&_check_multi_select_field, FIELD_TYPE_TEXTAREA() => \&_check_default_field, diff --git a/Bugzilla/Constants.pm b/Bugzilla/Constants.pm index 24bbda770..1ef93c464 100644 --- a/Bugzilla/Constants.pm +++ b/Bugzilla/Constants.pm @@ -130,6 +130,7 @@ use Cwd qw(abs_path); FIELD_TYPE_DATETIME FIELD_TYPE_BUG_ID FIELD_TYPE_BUG_URLS + FIELD_TYPE_EXTURL FIELD_TYPE_NUMERIC FIELD_TYPE__BOUNDARY @@ -377,18 +378,19 @@ use constant SENDMAIL_PATH => '/usr/lib:/usr/sbin:/usr/ucblib'; # 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; +use constant FIELD_TYPE_UNKNOWN => 0; +use constant FIELD_TYPE_FREETEXT => 1; use constant FIELD_TYPE_SINGLE_SELECT => 2; use constant FIELD_TYPE_MULTI_SELECT => 3; -use constant FIELD_TYPE_TEXTAREA => 4; -use constant FIELD_TYPE_DATETIME => 5; -use constant FIELD_TYPE_BUG_ID => 6; +use constant FIELD_TYPE_TEXTAREA => 4; +use constant FIELD_TYPE_DATETIME => 5; +use constant FIELD_TYPE_BUG_ID => 6; use constant FIELD_TYPE_BUG_URLS => 7; use constant FIELD_TYPE_NUMERIC => 8; +use constant FIELD_TYPE_EXTURL => 9; # Upper boundary for FIELD_TYPE_* values -use constant FIELD_TYPE__BOUNDARY => 8; +use constant FIELD_TYPE__BOUNDARY => 9; use constant BUG_ID_ADD_TO_BLOCKED => 1; use constant BUG_ID_ADD_TO_DEPENDSON => 2; diff --git a/Bugzilla/Field.pm b/Bugzilla/Field.pm index f31f52157..26cae09cb 100644 --- a/Bugzilla/Field.pm +++ b/Bugzilla/Field.pm @@ -107,6 +107,7 @@ use constant DB_COLUMNS => qw( delta_ts has_activity add_to_deps + url ); use constant REQUIRED_CREATE_FIELDS => qw(name description); @@ -143,6 +144,7 @@ use constant UPDATE_COLUMNS => qw( delta_ts has_activity add_to_deps + url ); # How various field types translate into SQL data definitions. @@ -150,6 +152,7 @@ use constant SQL_DEFINITIONS => { # Using commas because these are constants and they shouldn't # be auto-quoted by the "=>" operator. FIELD_TYPE_FREETEXT, { TYPE => 'varchar(255)' }, + FIELD_TYPE_EXTURL, { TYPE => 'varchar(255)' }, FIELD_TYPE_SINGLE_SELECT, { TYPE => 'varchar(255)', NOTNULL => 1, DEFAULT => "'---'" }, FIELD_TYPE_TEXTAREA, { TYPE => 'MEDIUMTEXT' }, @@ -482,6 +485,8 @@ sub has_activity { $_[0]->{has_activity} } sub add_to_deps { $_[0]->{add_to_deps} } +sub url { $_[0]->{url} } + sub legal_values { my $self = shift; @@ -716,6 +721,7 @@ sub set_sortkey { $_[0]->set('sortkey', $_[1]); } sub set_in_new_bugmail { $_[0]->set('mailhead', $_[1]); } sub set_buglist { $_[0]->set('buglist', $_[1]); } sub set_add_to_deps { $_[0]->set('add_to_deps', $_[1]); } +sub set_url { $_[0]->set('url', $_[1]); } sub set_visibility_field { diff --git a/Bugzilla/Language/en.pm b/Bugzilla/Language/en.pm index 0f3444fcb..82688cbc9 100644 --- a/Bugzilla/Language/en.pm +++ b/Bugzilla/Language/en.pm @@ -66,6 +66,7 @@ $Bugzilla::messages->{en} = { field_types => { FIELD_TYPE_UNKNOWN() => 'Unknown Type', FIELD_TYPE_FREETEXT() => 'Free Text', + FIELD_TYPE_EXTURL() => 'External URL', FIELD_TYPE_SINGLE_SELECT() => 'Drop Down', FIELD_TYPE_MULTI_SELECT() => 'Multiple-Selection Box', FIELD_TYPE_TEXTAREA() => 'Large Text Box', diff --git a/Bugzilla/Template.pm b/Bugzilla/Template.pm index cd80a5b1d..0d99ac908 100644 --- a/Bugzilla/Template.pm +++ b/Bugzilla/Template.pm @@ -616,6 +616,8 @@ sub create { # a full URL that may have characters that need encoding. url_quote => \&Bugzilla::Util::url_quote, + url_quote_ns => \&Bugzilla::Util::url_quote_noslash, + # This filter is similar to url_quote but used a \ instead of a % # as prefix. In addition it replaces a ' ' by a '_'. css_class_quote => \&Bugzilla::Util::css_class_quote, diff --git a/Bugzilla/Util.pm b/Bugzilla/Util.pm index 94661d1e4..c271e50ec 100644 --- a/Bugzilla/Util.pm +++ b/Bugzilla/Util.pm @@ -225,6 +225,16 @@ sub url_quote { return $toencode; } +# Same, but doesn't quote the forward slash "/" +sub url_quote_noslash +{ + my ($toencode) = (@_); + utf8::encode($toencode) # The below regex works only on bytes + if Bugzilla->params->{utf8} && utf8::is_utf8($toencode); + $toencode =~ s!([^a-zA-Z0-9_\-\./])!uc sprintf("%%%02x",ord($1))!ego; + return $toencode; +} + sub css_class_quote { my ($toencode) = (@_); $toencode =~ s#[ /]#_#g; diff --git a/editfields.cgi b/editfields.cgi index c7d442862..eaca1b614 100755 --- a/editfields.cgi +++ b/editfields.cgi @@ -59,6 +59,7 @@ elsif ($action eq 'new') my $field = $vars->{field} = Bugzilla::Field->create({ name => scalar $cgi->param('name'), + url => scalar $cgi->param('url'), description => scalar $cgi->param('desc'), type => scalar $cgi->param('type'), sortkey => scalar $cgi->param('sortkey'), @@ -107,6 +108,7 @@ elsif ($action eq 'update') $field->set_sortkey($cgi->param('sortkey')); $field->set_in_new_bugmail($cgi->param('new_bugmail')); $field->set_obsolete($cgi->param('obsolete')); + $field->set_url($cgi->param('url')); if ($field->custom) { # TODO enter_bug could be edited for non-custom fields, too. diff --git a/extensions/custis/lib/CustisDBHooks.pm b/extensions/custis/lib/CustisDBHooks.pm index 87a420d36..9235a5f2a 100644 --- a/extensions/custis/lib/CustisDBHooks.pm +++ b/extensions/custis/lib/CustisDBHooks.pm @@ -111,6 +111,9 @@ sub db_schema_abstract_schema # Bug 69325 - Настройка копирования / не копирования значения поля при клонировании бага push @{$schema->{fielddefs}->{FIELDS}}, clone_bug => {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => 1}; + # Bug 90854 - Тип поля "ссылка во внешнюю систему по ID" + push @{$schema->{fielddefs}->{FIELDS}}, url => {TYPE => 'VARCHAR(255)'}; + # Bug 70605 - Кэширование зависимостей полей для поиска и формы бага на клиентской стороне push @{$schema->{fielddefs}->{FIELDS}}, delta_ts => {TYPE => 'DATETIME'}; push @{$schema->{fielddefs}->{FIELDS}}, has_activity => {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => 0}; @@ -368,6 +371,9 @@ sub install_update_fielddefs # Bug 69325 - Настройка копирования / не копирования значения поля при клонировании бага $dbh->bz_add_column('fielddefs', clone_bug => {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => 1}); + # Bug 90854 - Тип поля "ссылка во внешнюю систему по ID" + $dbh->bz_add_column('fielddefs', url => {TYPE => 'VARCHAR(255)'}); + # Bug 70605 - Кэширование зависимостей полей для поиска и формы бага на клиентской стороне if (!$dbh->bz_column_info('fielddefs', 'delta_ts')) { diff --git a/extensions/custis/lib/CustisMiscHooks.pm b/extensions/custis/lib/CustisMiscHooks.pm index 3fec0f8fd..d099533f2 100644 --- a/extensions/custis/lib/CustisMiscHooks.pm +++ b/extensions/custis/lib/CustisMiscHooks.pm @@ -185,16 +185,6 @@ sub quote_urls_custom_proto ## НЕ-хуки: ## -# url_quote, не экранирующий / -sub url_quote_slash -{ - my ($toencode) = (@_); - utf8::encode($toencode) # The below regex works only on bytes - if Bugzilla->params->{utf8} && utf8::is_utf8($toencode); - $toencode =~ s!([^a-zA-Z0-9_\-\./])!uc sprintf("%%%02x",ord($1))!ego; - return $toencode; -} - # Кодирование anchor'а подзаголовка wiki-статьи sub process_wiki_anchor { @@ -214,7 +204,7 @@ sub process_wiki_url $url = trim($url); $url =~ s/\s+/_/gso; # обычный url_quote нам не подходит, т.к. / не нужно переделывать в %2F - $url = url_quote_slash($url); + $url = url_quote_noslash($url); return $base . $url . '#' . process_wiki_anchor($anchor); } diff --git a/query.cgi b/query.cgi index 5debb79a6..6eacdf87c 100755 --- a/query.cgi +++ b/query.cgi @@ -273,7 +273,7 @@ if (Bugzilla->params->{usestatuswhiteboard}) push @{$vars->{freetext_fields}}, Bugzilla->get_field('status_whiteboard'); } push @{$vars->{freetext_fields}}, - Bugzilla->active_custom_fields({ type => [ FIELD_TYPE_TEXTAREA, FIELD_TYPE_FREETEXT ] }); + Bugzilla->active_custom_fields({ type => [ FIELD_TYPE_TEXTAREA, FIELD_TYPE_FREETEXT, FIELD_TYPE_EXTURL ] }); if ($params->{format} && $params->{format} =~ /^report-(table|graph)$/) { diff --git a/template/en/default/admin/custom_fields/cf-js.js.tmpl b/template/en/default/admin/custom_fields/cf-js.js.tmpl index 4be6b5e9a..82d9ced76 100644 --- a/template/en/default/admin/custom_fields/cf-js.js.tmpl +++ b/template/en/default/admin/custom_fields/cf-js.js.tmpl @@ -40,6 +40,9 @@ function onChangeType(type_field) { value_field.disabled = false; else value_field.disabled = true; + var u = type_field.value == [% constants.FIELD_TYPE_EXTURL %]; + document.getElementById('url_title').style.display = u ? '' : 'none'; + document.getElementById('url_field').style.display = u ? '' : 'none'; } function onChangeVisibilityField() { diff --git a/template/en/default/admin/custom_fields/create.html.tmpl b/template/en/default/admin/custom_fields/create.html.tmpl index 2a7ffe60a..ae02dc5d3 100644 --- a/template/en/default/admin/custom_fields/create.html.tmpl +++ b/template/en/default/admin/custom_fields/create.html.tmpl @@ -120,7 +120,16 @@ -   + + + + + + + +