On Wed, Apr 30, 2008 at 07:19:09PM +0000, Jean-Sebastien Morisset wrote:
> On Wed, Apr 30, 2008 at 05:51:39PM +0000, Jean-Sebastien Morisset wrote:
>> 
>> Aha! Thanks! Ok, so far this seems to work well:
> [snip!]
> 
> Alright, so I spent a little more time on this script, and added some
> validation against the customfield select values. Here's an example:
[snip!]

Well, I couldn't leave well enough alone, and kept tweeking the import
script. I know a few people are already using my first script, so you'll
probably enjoy this little update (script attached). :-)

[root:/opt/rt3/bin]
# ./rt-import-assets.pl
syntax: ./rt-import-assets.pl [-h] [-c] [-d] -f {csvfile}
        -c: create missing assets (script only updates by default)
        -d: change empty Description csv fields to Manufacturer and Model

js.
-- 
Jean-Sebastien Morisset, Sr. UNIX Administrator <[EMAIL PROTECTED]>
#!/usr/bin/perl

use lib qw(/opt/rt3/local/lib /opt/rt3/lib);

use RT;
use RTx::AssetTracker::Asset;
use Getopt::Std;
use strict;

our ($opt_h, $opt_d, $opt_c, $opt_f);
getopts('hcdf:');

RT::LoadConfig();
RT::Init();
my $at = RTx::AssetTracker::Asset->new(RT->SystemUser);
my %csv_map;
my $csv_col;
my $ln;
my $status;
my $msg;

if ($opt_h || !$opt_f) {
        print "syntax: $0 [-h] [-c] [-d] -f {csvfile}\n";
        print "\t-c: create missing assets (script only updates by default)\n";
        print "\t-d: change empty Description csv fields to Manufacturer and 
Model\n";
        exit 0;
}

open(CSV, "< $opt_f") or die "$!\n";

while (<CSV>) {
        chomp;
        $ln++;
        my $lv = $_;
        # fix empty fields without double-quotes
        while (s/",(,+")/",""$1/g) {};
        # csv fields should be padded with double quotes,
        # which allows the use of commas in field values.
        s/^"//; s/"$//;
        my @csv = split(/","/);
        # the first line should be a header. header names
        # must match customfield names, plus the Name,
        # Status and Type headers.
        if ($ln == 1) {
                if ($lv !~ /"Name"/ || 
                        $lv !~ /"Status"/ || 
                        $lv !~ /"Type"/) {
                        print "error: need at least the Name, Status and Type 
headers\n";
                        exit 1;
                }
                # remember the column number for each field name.
                # this allows us to include only those columns we
                # want in the csv, and in whatever order we want.
                for (@csv) { $csv_map{$_} = $csv_col++; }
                next;
        }
        if (!$csv[$csv_map{"Name"}]) {
                print "error: cannot load blank asset Name in $lv\n";
                next;
        }
        # change empty description csv fields to manufacturer and model
        if ($opt_d && defined $csv_map{"Description"} && 
!$csv[$csv_map{"Description"}] &&
                $csv[$csv_map{"Manufacturer"}] && $csv[$csv_map{"Model"}]) {
                $csv[$csv_map{"Description"}] = 
$csv[$csv_map{"Manufacturer"}]." ".$csv[$csv_map{"Model"}];
        }

        print $csv[$csv_map{"Name"}].":\n";
        # load the asset, and on failure, create the asset.
        if (my $id = $at->Load($csv[$csv_map{"Name"}])) {
                # the New Name column, if present, allows us to change the 
asset name.
                for my $fn ("New Name", "Status", "Type", "Description") {
                        if (defined $csv_map{$fn}) {
                                # if we have a New Name defined, make sure it's 
not
                                # empty and it's different from the current Name
                                if ($fn eq "New Name" && $csv[$csv_map{$fn}] && 
                                        $csv[$csv_map{$fn}] ne $csv["Name"]) {
                                        ($status, $msg) = $at->_Set(
                                                Field => "Name",
                                                Value => $csv[$csv_map{$fn}],
                                                RecordTransaction => 0);
                                } else {
                                        ($status, $msg) = $at->_Set(
                                                Field => $fn,
                                                Value => $csv[$csv_map{$fn}],
                                                RecordTransaction => 0);
                                }
                                print "\t$msg\n" if ($status);
                        }
                }
        } else {
                if (!$csv[$csv_map{"Status"}] || !$csv[$csv_map{"Type"}]) {
                        print "\terror: need a Status and Type to create an 
asset!\n";
                        next;
                }
                if ($opt_c) {
                        # create using only the essential fields
                        my ($id, $t, $msg) = $at->Create (
                                Name => $csv[$csv_map{"Name"}],
                                Status => $csv[$csv_map{"Status"}],
                                Type => $csv[$csv_map{"Type"}],
                                RecordTransaction => 0,
                        );
                        print "\t$msg\n" if ($msg);
                        # set the description - if we have this field in the csv
                        if (defined $csv_map{"Description"}) {
                                ($status, $msg) = $at->_Set(
                                        Field => "Description",
                                        Value => $csv[$csv_map{"Description"}],
                                        RecordTransaction => 0);
                                print "\t$msg\n" if ($status);
                        }
                } else {
                        print "\tno create argument - skipping asset 
creation\n";
                        next;
                }
        }
        my $atcf = $at->CustomFields();
        # check each customfield for this asset
        while (my $cf = $atcf->Next()) {
                # check to see if we have a CSV column for this customfield
                if ($csv_col = $csv_map{$cf->Name}) {
                        my $accept;
                        if ($cf->Type eq "Select") {
                                # read all selectable values for this 
customfield
                                my $cfvs = $cf->Values;
                                while (my $value = $cfvs->Next) {
                                        # check to see if new values is defined 
in select
                                        if ($value->Name eq $csv[$csv_col]) {
                                                $accept = 1;
                                                last;
                                        }
                                }
                        } elsif ($cf->Type eq "Freeform") {
                                $accept = 1;
                        } else {
                                print "\tneed more code for ".$cf->Type." 
customfield type\n";
                        }
                        if ($accept) {
                                ($status, $msg) = $at->AddCustomFieldValue(
                                        Field => $cf->Id,
                                        Value => $csv[$csv_col],
                                        RecordTransaction => 0,
                                );
                                print "\t$msg\n" if ($msg);
                        } else {
                                # don't print an error for empty select values
                                print "\t\"$csv[$csv_col]\" value not ok for 
".$cf->Name." customfield\n"
                                        if ($csv[$csv_col]);
                        }
                }
        }
}
_______________________________________________
http://lists.bestpractical.com/cgi-bin/mailman/listinfo/rt-users

Community help: http://wiki.bestpractical.com
Commercial support: [EMAIL PROTECTED]


Discover RT's hidden secrets with RT Essentials from O'Reilly Media. 
Buy a copy at http://rtbook.bestpractical.com

Reply via email to