[Rt-commit] rt branch, 4.6/priority-as-string, created. rt-4.4.2-96-g4504c9ba4c

Craig Kaiser craig at bestpractical.com
Thu Jan 3 11:46:48 EST 2019


The branch, 4.6/priority-as-string has been created
        at  4504c9ba4c554bf6130e92fdf30064b6ef27603d (commit)

- Log -----------------------------------------------------------------
commit e4dcd082eae31c954284613b4a1c166375c78525
Author: sunnavy <sunnavy at bestpractical.com>
Date:   Fri Feb 16 05:21:41 2018 +0800

    reapply dropped changes of "Remove dashboard from menu if it can't be loaded"
    
    original commit is bc441b84, it's been merged but the
    RemoveDashboardMenuItem call in /Elements/Tabs got dropped accidently
    later(probably when we merged another change to move related code to
    MenuBuilder.pm)

diff --git a/lib/RT/Interface/Web/MenuBuilder.pm b/lib/RT/Interface/Web/MenuBuilder.pm
index 604d00875b..6a0e18306c 100644
--- a/lib/RT/Interface/Web/MenuBuilder.pm
+++ b/lib/RT/Interface/Web/MenuBuilder.pm
@@ -113,7 +113,13 @@ sub BuildMainNav {
         if ( $status ) {
             push @dashboards, $dash;
         } else {
-            $RT::Logger->warning( "Failed to load dashboard $id: $msg" );
+            $RT::Logger->debug( "Failed to load dashboard $id: $msg, removing from menu" );
+            $home->RemoveDashboardMenuItem(
+                DashboardId => $id,
+                CurrentUser => $HTML::Mason::Commands::session{CurrentUser}->UserObj,
+            );
+            @{ $HTML::Mason::Commands::session{'dashboards_in_menu'} } =
+              grep { $_ != $id } @{ $HTML::Mason::Commands::session{'dashboards_in_menu'} };
         }
     }
 

commit 52a22b45456c4fe371829cba487adea6919dfe04
Author: Brian C. Duggan <brian at bestpractical.com>
Date:   Tue May 29 19:08:30 2018 -0400

    Core RT::Extension::PriorityAsString
    existing behavior of extension.

diff --git a/etc/RT_Config.pm.in b/etc/RT_Config.pm.in
index fae0d46d4c..169d5e22ac 100644
--- a/etc/RT_Config.pm.in
+++ b/etc/RT_Config.pm.in
@@ -149,8 +149,14 @@ Set( @StaticRoots, () );
 
 =back
 
+=head2 C<@ClearHash>
 
+Set this array for config values that should have the default hash keys completly removed in
+favor or new ones set in config.
 
+=cut
+
+Set(@ClearHash, qw/PriorityAsString/);
 
 =head1 Database connection
 
@@ -1813,6 +1819,66 @@ to Articles when they are included in a message.
 
 Set($LinkArticlesOnInclude, 1);
 
+=item C<%NumericalPriority>
+
+Disable string priorities
+
+    Set($NumericalPriority, 0);
+
+=cut
+
+Set($NumericalPriority, 0);
+
+=item C<%PriorityAsString>
+
+RT can assign a priority value to tickets. Priority is stored as an
+integer in the database, but RT supports mapping strings to numerical
+values. For example, the default mapping is:
+
+    Set(%PriorityAsString, Low => 0, Medium => 50, High => 100);
+
+Redefine C<%PriorityAsString> in C<RT_SiteConfig.pm> to set site
+priority strings.
+
+=cut
+
+Set(%PriorityAsString, Low => 0, Medium => 50, High => 100);
+
+=item C<%PriorityAsStringOrder>
+
+Administrators can alter the order of priority strings as they appear
+in selection drop-downs with C<@PriorityStringOrder>. Administrators
+can also use this setting to limit the available priority strings on
+ticket update pages. When this options is defined, scrips and other RT
+code will still have access to all of the priority strings defined in
+C<%PriorityAsString>. To set a priority string order:
+
+    Set(@PriorityAsStringOrder, qw(Low Medium High));
+
+=cut
+
+=item C<%PriorityAsStringQueues>
+
+RT supports different priority string mappings for individual queues
+with C<%PriorityAsStringQueues>. Use queue names as keys in this
+hash. Then define priority string-number hash maps for each queue's
+value. Tickets in queues that aren't defined in this hash will fall
+back to RT's numerical priorities.
+
+When C<%PriorityAsStringQueues> is set, RT ignores both
+C<%PriorityAsString> and C<@PriorityAsStringOrder>. Administrators do
+not need to define C<%PriorityAsStringQueues> or C<%PriorityAsString>
+when they set C<%PriorityAsStringQueues>.
+
+To set per-queue priority strings:
+
+    Set(%PriorityAsStringQueues,
+      General => { Low => 0, Medium => 50, High => 100 },
+      Binary  => { Low => 0, High => 10 },
+    );
+
+=cut
+
 =back
 
 =head1 Assets
diff --git a/lib/RT/Config.pm b/lib/RT/Config.pm
index e732730126..68ca885d4e 100644
--- a/lib/RT/Config.pm
+++ b/lib/RT/Config.pm
@@ -1617,7 +1617,7 @@ sub SetFromConfig {
     if ( exists $OPTIONS{$name} ) {
         if ( $type eq 'HASH' ) {
             $args{'Value'} = [
-                @{ $args{'Value'} },
+                grep (/$name/, @{$OPTIONS{ClearHash}}) ? () : @{ $args{'Value'} },
                 @{ $args{'Value'} }%2? (undef) : (),
                 $self->Get( $name ),
             ];
diff --git a/lib/RT/Ticket.pm b/lib/RT/Ticket.pm
index 08169fb9c6..0b1e5fdc70 100644
--- a/lib/RT/Ticket.pm
+++ b/lib/RT/Ticket.pm
@@ -3316,7 +3316,9 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.
 Returns the current value of InitialPriority.
 (In the database, InitialPriority is stored as int(11).)
 
+=head2 InitialPriorityAsString
 
+Returns the current mapped string value of InitialPriority.
 
 =head2 SetInitialPriority VALUE
 
@@ -3334,7 +3336,9 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.
 Returns the current value of FinalPriority.
 (In the database, FinalPriority is stored as int(11).)
 
+=head2 FinalPriorityAsString
 
+Returns the current mapped string value of FinalPriority.
 
 =head2 SetFinalPriority VALUE
 
@@ -3352,7 +3356,9 @@ Returns (1, 'Status message') on success and (0, 'Error Message') on failure.
 Returns the current value of Priority.
 (In the database, Priority is stored as int(11).)
 
+=head2 PriorityAsString
 
+Returns the current mapped string value of Priority.
 
 =head2 SetPriority VALUE
 
@@ -3697,6 +3703,47 @@ sub Serialize {
     return %store;
 }
 
+# Returns String: Various Ticket Priorities as either a string or integer
+sub PriorityAsString {
+    my $self = shift;
+    return $self->_PriorityAsString($self->Priority);
+}
+
+sub InitialPriorityAsString {
+    my $self = shift;
+    return $self->_PriorityAsString( $self->InitialPriority );
+}
+
+sub FinalPriorityAsString {
+    my $self=shift;
+    return $self->_PriorityAsString( $self->FinalPriority );
+}
+
+sub _PriorityAsString {
+    my $self = shift;
+    my $priority = shift;
+    return undef unless defined $priority && length $priority;
+
+    my %map;
+    my $queues = RT->Config->Get('PriorityAsStringQueues');
+    if (@_) {
+        %map = %{ shift(@_) };
+    } elsif ($queues and $queues->{$self->QueueObj->Name}) {
+        %map = %{ $queues->{$self->QueueObj->Name} };
+    } else {
+        %map = RT->Config->Get('PriorityAsString');
+    }
+
+    # Count from high down to low until we find one that our number is
+    # greater than or equal to.
+    if ( values %map ) {
+        foreach my $label ( sort { $map{$b} <=> $map{$a} } keys %map ) {
+            return $label if $priority >= $map{ $label };
+        };
+    }
+    return "unknown";
+}
+
 RT::Base->_ImportOverlays();
 
 1;
diff --git a/share/html/Elements/RT__Ticket/ColumnMap b/share/html/Elements/RT__Ticket/ColumnMap
index 089ccea117..0a3390d419 100644
--- a/share/html/Elements/RT__Ticket/ColumnMap
+++ b/share/html/Elements/RT__Ticket/ColumnMap
@@ -352,6 +352,42 @@ if(RT->Config->Get('DisplayTotalTimeWorked')) {
     }
 }
 
+my $printer = sub {
+    my ($class, $string) = @_;
+    return '' unless defined $string && length $string;
+
+    my $request_path = $HTML::Mason::Commands::r->path_info;
+    if ($request_path and $request_path =~ /Results\.tsv/) {
+        return loc($string);
+    }
+
+    my $escaped = $m->interp->apply_escapes($string, 'h');
+    my $loc_escaped = $m->interp->apply_escapes(loc($string), 'h');
+    return \( qq{<span class="ticket-info-$class-}. lc($escaped) .qq{">$loc_escaped</span>} );
+};
+
+foreach my $field (qw(Priority InitialPriority FinalPriority)) {
+    $COLUMN_MAP->{ $field .'Number' } ||= $COLUMN_MAP->{ $field };
+
+    my $class = lc($field);
+    $class =~ s/(?=<.)(?=priority)/-/;
+
+    my $method = $field .'AsString';
+
+    my %queues = RT->Config->Get('PriorityAsStringQueues') || ();
+    if (not keys %queues) {
+        $COLUMN_MAP->{ $field }{'value'} = sub {
+            return $printer->( $class, $_[0]->$method() );
+        };
+    } else {
+        $COLUMN_MAP->{ $field }{'value'} = sub {
+            return $queues{$_[0]->QueueObj->Name}
+                ? $printer->( $class, $_[0]->$method() )
+                : $_[0]->$field;
+        };
+    }
+}
+
 $m->callback( GenericMap => $GenericMap, COLUMN_MAP => $COLUMN_MAP, CallbackName => 'Once', CallbackOnce => 1 );
 return GetColumnMapEntry( Map => $COLUMN_MAP, Name => $Name, Attribute => $Attr );
 </%init>
diff --git a/share/html/Elements/SelectPriority b/share/html/Elements/SelectPriority
index 078d85df78..f09b0d5de0 100644
--- a/share/html/Elements/SelectPriority
+++ b/share/html/Elements/SelectPriority
@@ -45,11 +45,57 @@
 %# those contributions and any derivatives thereof.
 %#
 %# END BPS TAGGED BLOCK }}}
+% if (%map) {
+<select class="select-priority" name="<% $Name %>">
+%     unless ( defined $Default ) {
+<option value="">-</option>
+%     }
+<%PERL>
+foreach my $label ( @order ) {
+    my ($value, $selected);
+    if ( $label eq $default_label ) {
+        ($value, $selected) = ($Default, 'selected="selected"');
+    } else {
+        ($value, $selected) = ($map{ $label }, '');
+    }
+</%PERL>
+<option class="<% lc $label %>" value="<% $value %>" <% $selected |n %>><% loc($label) %></option>
+% }
+</select>
+% } else {
 <input name="<% $Name %>" value="<% $Default %>" size="5" />
+% }
 <%ARGS>
 $Name => 'Priority'
-$Default => ''
+$Default => undef
+$QueueObj => undef
+$PriorityStringMap => undef
 </%ARGS>
 <%INIT>
+
+my $priority_is_string = undef;
+my @order;
+my $default_label = '';
+my %map = ();
+
+if ($PriorityStringMap) {
+    %map = %{$PriorityStringMap};
+} elsif ($QueueObj and ! RT->Config->Get('NumericalPriority')) {
+    my %config = RT->Config->Get('PriorityAsStringQueues') ?  RT->Config->Get('PriorityAsStringQueues') : ();
+    %map = %config && $config{$QueueObj->Name} ? %{$config{$QueueObj->Name}} : RT->Config->Get('PriorityAsString');
+}
+
+if (%map) {
+    if (RT->Config->Get('PriorityAsStringOrder')) {
+    @order = grep {exists $map{$_}} RT->Config->Get('PriorityAsStringOrder');
+    } else {
+    @order = sort { $map{$a} <=> $map{$b} } keys %map;
+    }
+
+    if ( defined $Default && length $Default ) {
+    $default_label = RT::Ticket->_PriorityAsString( $Default, \%map ) || '';
+    }
+}
+
 $Default = '' unless defined $Default;
 </%INIT>
diff --git a/share/html/Search/Elements/PickBasics b/share/html/Search/Elements/PickBasics
index 3f2ed237a9..682058d013 100644
--- a/share/html/Search/Elements/PickBasics
+++ b/share/html/Search/Elements/PickBasics
@@ -223,6 +223,18 @@ my @lines = (
     },
 );
 
+my %priority_strings = RT->Config->Get('PriorityAsStringQueues') || ();
+if ( !RT->Config->Get('NumericalPriority') ) {
+    my ($priority_dropdown) = grep {$_->{Name} eq "Priority"} @lines;
+    my %priority_map = ( '-' => '' );
+    for my $queue (keys %queues) {
+    for my $priority (keys %{$priority_strings{$queue}}) {
+        $priority_map{ keys %queues > 1 ? "$queue: $priority" : "$priority" } = $priority_strings{$queue}{$priority};
+    }
+    }
+    $priority_dropdown->{Value}{Arguments}{PriorityStringMap} = \%priority_map;
+}
+
 $m->callback( Conditions => \@lines );
 
 </%INIT>
diff --git a/share/html/Ticket/Create.html b/share/html/Ticket/Create.html
index 26dc216b03..9352eefc11 100644
--- a/share/html/Ticket/Create.html
+++ b/share/html/Ticket/Create.html
@@ -271,11 +271,13 @@
 <td><& /Elements/SelectPriority,
     Name => "InitialPriority",
     Default => $ARGS{InitialPriority} ? $ARGS{InitialPriority} : $QueueObj->DefaultValue('InitialPriority'),
+    QueueObj => $QueueObj,
 &></td></tr>
 <tr><td class="label"><&|/l&>Final Priority</&>:</td>
 <td><& /Elements/SelectPriority,
     Name => "FinalPriority",
     Default => $ARGS{FinalPriority} ? $ARGS{FinalPriority} : $QueueObj->DefaultValue('FinalPriority'),
+    QueueObj => $QueueObj,
 &></td></tr>
 <tr><td class="label"><&|/l&>Time Estimated</&>:</td>
 <td>
diff --git a/share/html/Ticket/Elements/EditBasics b/share/html/Ticket/Elements/EditBasics
index c4505e770b..284e7d407e 100644
--- a/share/html/Ticket/Elements/EditBasics
+++ b/share/html/Ticket/Elements/EditBasics
@@ -58,6 +58,16 @@ if ($TicketObj) {
     $QueueObj ||= $TicketObj->QueueObj;
 }
 
+#my %queue_priority_strings = RT->Config->Get('PriorityAsStringQueues');
+#
+## Leave it as-is if all queues use PriorityAsString; the overridden
+## /Elements/SelectPriority catches this case and always shows the
+## drop-down
+##return unless keys %as_string;
+#
+## Only applies if the ticket is in a PriorityAsString queue
+##return unless $TicketObj and $as_string{$TicketObj->QueueObj->Name};
+
 unless ( @fields ) {
     my $subject = $defaults{'Subject'} || $TicketObj->Subject;
     @fields = (
@@ -128,6 +138,7 @@ unless ( @fields ) {
                     args => {
                         Name => $field,
                         Default => $defaults{$field} || $TicketObj->$field,
+                QueueObj => $QueueObj,
                     }
                 }
             } ('Priority', 'Final Priority')
diff --git a/share/html/Ticket/Elements/ShowPriority b/share/html/Ticket/Elements/ShowPriority
index c465d4875b..2d450ce8c9 100644
--- a/share/html/Ticket/Elements/ShowPriority
+++ b/share/html/Ticket/Elements/ShowPriority
@@ -45,7 +45,22 @@
 %# those contributions and any derivatives thereof.
 %#
 %# END BPS TAGGED BLOCK }}}
+% if ( !RT->Config->Get('NumericalPriority') ) {
+%   my $current = $Ticket->PriorityAsString || '';
+%   my $final = $Ticket->FinalPriorityAsString || '';
+<span class="ticket-info-priority-<% $CSSClass->(lc($current)) %>"><% loc($current) %></span>/\
+<span class="ticket-info-final-priority-<% $CSSClass->(lc($final)) %>"><% loc($final) %></span>
+% } else {
 <% $Ticket->Priority %>/<% $Ticket->FinalPriority || ''%>
+% }
 <%ARGS>
 $Ticket => undef
 </%ARGS>
+<%INIT>
+my $CSSClass = sub {
+    my $value = shift;
+    return '' unless defined $value;
+    $value =~ s/[^A-Za-z0-9_-]/_/g;
+    return $value;
+};
+</%INIT>
diff --git a/t/web/mobile.t b/t/web/mobile.t
index 3f32e49e66..831bf6652a 100644
--- a/t/web/mobile.t
+++ b/t/web/mobile.t
@@ -82,7 +82,7 @@ $m->content_contains( 'ticket1', 'subject' );
 $m->content_contains( 'open', 'status' );
 $m->content_contains( 'cc at example.com', 'cc' );
 $m->content_contains( 'admincc at example.com', 'admincc' );
-$m->content_contains( '13/93', 'priority' );
+$m->text_contains( 'Low/Medium', 'priority' );
 $m->content_contains( '2 hour', 'time estimates' );
 $m->content_contains( '30 min', 'time worked' );
 $m->content_contains( '60 min', 'time left' );

commit 4504c9ba4c554bf6130e92fdf30064b6ef27603d
Author: Craig Kaiser <craig at bestpractical.com>
Date:   Thu Jan 3 11:31:31 2019 -0500

    Test that PriorityAsString hash is reset when set from siteconfig
    
    We do not want to keep the old key values of the default PriorityAsString
    hash, but instead only take the new hash provided in RT_SiteConfig.pm.

diff --git a/t/api/config.t b/t/api/config.t
index b875311398..302996de90 100644
--- a/t/api/config.t
+++ b/t/api/config.t
@@ -1,7 +1,11 @@
 use strict;
 use warnings;
 use RT;
-use RT::Test nodb => 1, tests => undef;
+
+use RT::Test nodb => 1, tests => undef, config => <<'CONFIG';
+Set(%PriorityAsString, Green => 1, Yellow => 50, Red => 100);
+CONFIG
+
 use Test::Warn;
 
 ok(
@@ -46,4 +50,13 @@ warning_like {RT::Config->PostLoadCheck} qr{rudder},
 my @canonical_encodings = RT::Config->Get('EmailInputEncodings');
 is_deeply(\@encodings, \@canonical_encodings, 'Got correct encoding list');
 
-done_testing;
\ No newline at end of file
+my %PriorityAsString = RT::Config->Get('PriorityAsString');
+
+foreach (qw/Low Medium High/) {
+    is $PriorityAsString{$_}, undef , 'Does not have default config values for PriorityAsString';
+}
+foreach (qw/Green Yellow Red/) {
+    ok $PriorityAsString{$_} ,'SiteConfig value for PriorityAsString overrode default value completly';
+}
+
+done_testing;

-----------------------------------------------------------------------


More information about the rt-commit mailing list