From Request Tracker Wiki
Jump to navigation Jump to search


I use this script to populate a "select one from many" custom field from a text file generated from a database query.

   use warnings;
   use strict;
   use lib qw(/opt/rt3/local/lib /opt/rt3/lib);
   use Getopt::Long;
   use RT;
   my %args;
   GetOptions(\%args, 'field=s', 'update','replace' ,'help', 'verbose');
    if ($args{'help'} || !($args{'update'}||$args{'replace'})  ){
   my @lines = <STDIN>;
   map {chomp} @lines;
   my $cf = RT::CustomField->new(RT->SystemUser);
   $cf->Load( $args{'field'} );
   unless ( $cf->id ) {
      die "Couldn't find that custom field\n";
   if ( $args{'replace'} ) {
      my $values = $cf->Values;
      my %map;
      while ( my $value = $values->Next ) {
          unless (grep {$value->Name} @lines) {
           print STDERR "Deleting " . $value->Name . "\n" if ($args{'verbose'});
   if ( $args{'update'} || $args{'replace'} ) {
      my $values = $cf->Values;
      my @current;
      while ( my $value = $values->Next ) {
          push @current, $value->Name;
      foreach my $entry (@lines) {
          unless ( grep { $entry eq $_ } @current ) {
              print STDERR "Adding " . $entry . "\n" if ($args{'verbose'});
              my ( $ret, $val ) = $cf->AddValue( Name => $entry );
   print STDERR "Done\n" if ($args{'verbose'});
   sub help {
   print <<EOF
   $0 is a simple RT tool to add values to a custom field.
   It takes several arguments:
    --field    The id or name of the custom field you'd like to work with
    --update   Add values to this field, but do not prune unused files
    --replace  Make the custom field contain only the values listed
    --verbose  Show progress messages
   This script expects a list of potential custom field values,
   one per line to be fed to STDIN.
   $0 --field "My CF Name" --update < list_of_values

The replace switch seems to update on version 3.8.7. (SJN)