diff options
Diffstat (limited to 'rt/lib/RT/URI')
-rw-r--r-- | rt/lib/RT/URI/base.pm | 6 | ||||
-rw-r--r-- | rt/lib/RT/URI/freeside.pm | 239 | ||||
-rw-r--r-- | rt/lib/RT/URI/freeside/Internal.pm | 138 | ||||
-rw-r--r-- | rt/lib/RT/URI/freeside/XMLRPC.pm | 122 | ||||
-rw-r--r-- | rt/lib/RT/URI/fsck_com_rt.pm | 8 | ||||
-rw-r--r-- | rt/lib/RT/URI/t.pm | 83 |
6 files changed, 114 insertions, 482 deletions
diff --git a/rt/lib/RT/URI/base.pm b/rt/lib/RT/URI/base.pm index 56bfef33a..e50f640c7 100644 --- a/rt/lib/RT/URI/base.pm +++ b/rt/lib/RT/URI/base.pm @@ -1,8 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# {{{ BEGIN BPS TAGGED BLOCK # # COPYRIGHT: # -# This software is Copyright (c) 1996-2005 Best Practical Solutions, LLC +# This software is Copyright (c) 1996-2004 Best Practical Solutions, LLC # <jesse@bestpractical.com> # # (Except where explicitly superseded by other copyright notices) @@ -42,7 +42,7 @@ # works based on those contributions, and sublicense and distribute # those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} +# }}} END BPS TAGGED BLOCK package RT::URI::base; use strict; diff --git a/rt/lib/RT/URI/freeside.pm b/rt/lib/RT/URI/freeside.pm index ff1d38d21..ebd24ad60 100644 --- a/rt/lib/RT/URI/freeside.pm +++ b/rt/lib/RT/URI/freeside.pm @@ -28,170 +28,143 @@ package RT::URI::freeside; use RT::URI::base; use strict; -use vars qw(@ISA $IntegrationType $URL); +use vars qw(@ISA); + @ISA = qw/RT::URI::base/; =head1 NAME -RT::URI::freeside +RT::URI::base =head1 DESCRIPTION URI handler for freeside URIs. See http://www.sisd.com/freeside/ for more information on freeside. - -=head1 Public subroutines - -=over 4 - -=item FreesideGetConfig CONFKEY - -Subroutine that returns the freeside's configuration value(s) for CONFKEY -as a scalar or list. - -=cut - -sub FreesideGetConfig { return undef; } - - -=item FreesideURL - -Returns the URL for freeside's web interface. - -=cut - -sub FreesideURL { return $URL; } - - -=item FreesideVersion - -Returns a string describing the freeside version being used. - -=cut - -sub FreesideVersion { return undef; } - - -=item smart_search - -A wrapper for the FS::cust_main::smart_search subroutine. - -=cut - -sub smart_search { return undef; } - - -=item small_custview - -A wrapper for the FS::CGI::small_custview subroutine. - -=cut - -sub small_custview { return 'Freeside integration error!</A>'; } - - -=back - -=head1 Private methods - -=over 4 - -=item _FreesideGetRecord - -Method returns a hashref of the freeside record referenced in the URI. -Must be called after ParseURI. - =cut -sub _FreesideGetRecord { return undef; } - -=item _FreesideURIPrefix - -Method that returns the URI prefix for freeside URIs. - -=cut - -sub _FreesideURIPrefix { +sub FreesideURIPrefix { my $self = shift; return($self->Scheme . '://freeside'); } -=item _FreesideURILabel - -Method that returns a short string describing the customer referenced -in the URI. - -=cut - -sub _FreesideURILabel { +sub FreesideURILabel { my $self = shift; - $RT::Logger->debug("Called _FreesideURILabel()"); - - return unless (exists($self->{'fstable'}) and - exists($self->{'fspkey'})); + return(undef) unless (exists($self->{'fstable'}) and + exists($self->{'fspkey'})); my $label; my ($table, $pkey) = ($self->{'fstable'}, $self->{'fspkey'}); - if ($table ne 'cust_main') { - warn "FS::${table} not currently supported"; - return; - } + eval { + use FS::UID qw(dbh); + use FS::Record qw(qsearchs qsearch dbdef); + eval "use FS::$table;"; + use FS::cust_svc; + + my $dbdef = dbdef or die "No dbdef"; + my $pkeyfield = $dbdef->table($table)->primary_key + or die "No primary key for table $table"; + + my $rec = qsearchs($table, { $pkeyfield => $pkey }) + or die "Record with $pkeyfield == $pkey does not exist in table $table"; + + if ($table =~ /^svc_/) { + if ($rec->can('cust_svc')) { + my $cust_svc = $rec->cust_svc or die '$rec->cust_svc failed'; + my ($svc, $tag, $svcdb) = $cust_svc->label; + $label = "Freeside service ${svc}: ${tag}"; + } + } elsif ($table eq 'cust_main') { + #my ($last, $first, $company) = map { $rec->getfield($_) } + # qw(last first company); + #$label = "Freeside customer ${last}, ${first}"; + #$label .= ($company ne '') ? " with ${company}" : ''; + $label = "$pkey: ". $rec->name; + } else { + $label = "Freeside ${table}, ${pkeyfield} == ${pkey}"; + } - my $rec = $self->_FreesideGetRecord(); + #... other cases - if (ref($rec) eq 'HASH' and $table eq 'cust_main') { - my $name = $rec->{'last'} . ', ' . $rec->{'first'}; - $name = $rec->{'company'} . " ($name)" if $rec->{'company'}; - $label = "$pkey: $name"; - } else { - $label = "$pkey: $table"; - } + }; if ($label and !$@) { return($label); } else { - return; + return(undef); } + } -=item _FreesideURILabelLong - -Method that returns a longer string describing the customer referenced -in the URI. - -=cut - -sub _FreesideURILabelLong { +sub FreesideURILabelLong { my $self = shift; - return $self->_FreesideURILabel(); + return(undef) unless (exists($self->{'fstable'}) and + exists($self->{'fspkey'})); -} + my $label; + my ($table, $pkey) = ($self->{'fstable'}, $self->{'fspkey'}); -=back + eval { + use FS::UID qw(dbh); + use FS::Record qw(qsearchs qsearch dbdef); + eval "use FS::$table;"; + use FS::cust_svc; + + my $dbdef = dbdef or die "No dbdef"; + my $pkeyfield = $dbdef->table($table)->primary_key + or die "No primary key for table $table"; + + my $rec = qsearchs($table, { $pkeyfield => $pkey }) + or die "Record with $pkeyfield == $pkey does not exist in table $table"; + + if ($table =~ /^svc_/) { + #if ($rec->can('cust_svc')) { + # my $cust_svc = $rec->cust_svc or die '$rec->cust_svc failed'; + # my ($svc, $tag, $svcdb) = $cust_svc->label; + # $label = "Freeside service ${svc}: ${tag}"; + #} + $label = ''; + } elsif ($table eq 'cust_main') { + use FS::CGI qw(small_custview); + $label = small_custview( $rec, + scalar(FS::Conf->new->config('countrydefault')), + 1 #nobalance + ); + } else { + #$label = "Freeside ${table}, ${pkeyfield} == ${pkey}"; + $label = ''; + } -=head1 Public methods + #... other cases -=over 4 + }; -=cut + if ($label and !$@) { + return($label); + } else { + warn $@; + return(undef); + } + + +} sub ParseURI { my $self = shift; my $uri = shift; my ($table, $pkey); - my $uriprefix = $self->_FreesideURIPrefix; + my $uriprefix = $self->FreesideURIPrefix; if ($uri =~ /^$uriprefix\/(\w+)\/(\d+)$/) { $table = $1; $pkey = $2; @@ -204,13 +177,22 @@ sub ParseURI { $self->{'fstable'} = $table; $self->{'fspkey'} = $pkey; + my $p; - my $url = $self->FreesideURL(); + eval { + use FS::UID qw(dbh); + use FS::CGI qw(popurl); - if ($url ne '') { - $self->{'href'} = "${url}/view/${table}.cgi?${pkey}"; - } else { + if (dbh) { + $p = popurl(3); + } + + }; + + if ($@ or (!$p)) { $self->{'href'} = $self->{'uri'}; + } else { + $self->{'href'} = "${p}view/${table}.cgi?${pkey}"; } $self->{'uri'}; @@ -233,7 +215,7 @@ sub IsLocal { return undef; } -=item AsString +=head2 AsString Return a "pretty" string representing the URI object. @@ -247,14 +229,14 @@ This is meant to be used like this: sub AsString { my $self = shift; my $prettystring; - if ($prettystring = $self->_FreesideURILabel) { + if ($prettystring = $self->FreesideURILabel) { return $prettystring; } else { return $self->URI; } } -=item AsStringLong +=head2 AsStringLong Return a longer (HTML) string representing the URI object. @@ -263,23 +245,16 @@ Return a longer (HTML) string representing the URI object. sub AsStringLong { my $self = shift; my $prettystring; - if ($prettystring = $self->_FreesideURILabelLong || $self->_FreesideURILabel){ + if ($prettystring = $self->FreesideURILabelLong || $self->FreesideURILabel){ return $prettystring; } else { return $self->URI; } } -$IntegrationType ||= 'Internal'; -eval "require RT::URI::freeside::${RT::URI::freeside::IntegrationType}"; -warn $@ if $@; -if ($@ && - $@ !~ qr(^Can't locate RT/URI/freeside/${RT::URI::freeside::IntegrationType}.pm)) { - die $@; -}; - -=back - -=cut +eval "require RT::URI::base_Vendor"; +die $@ if ($@ && $@ !~ qr{^Can't locate RT/URI/base_Vendor.pm}); +eval "require RT::URI::base_Local"; +die $@ if ($@ && $@ !~ qr{^Can't locate RT/URI/base_Local.pm}); 1; diff --git a/rt/lib/RT/URI/freeside/Internal.pm b/rt/lib/RT/URI/freeside/Internal.pm deleted file mode 100644 index 9ca06306d..000000000 --- a/rt/lib/RT/URI/freeside/Internal.pm +++ /dev/null @@ -1,138 +0,0 @@ -# BEGIN LICENSE BLOCK -# -# Copyright (c) 2004 Kristian Hoffmann <khoff@fire2wire.com> -# Based on the original RT::URI::base and RT::URI::fsck_com_rt. -# -# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> -# -# (Except where explictly superceded by other copyright notices) -# -# This work is made available to you under the terms of Version 2 of -# the GNU General Public License. A copy of that license should have -# been provided with this software, but in any event can be snarfed -# from www.gnu.org. -# -# This work is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# Unless otherwise specified, all modifications, corrections or -# extensions to this work which alter its source code become the -# property of Best Practical Solutions, LLC when submitted for -# inclusion in the work. -# -# -# END LICENSE BLOCK -# -use strict; -no warnings qw(redefine); - -#use vars qw($conf); - -use FS; -use FS::UID qw(dbh); -use FS::CGI qw(popurl small_custview); -use FS::Conf; -use FS::Record qw(qsearchs qsearch dbdef); -use FS::cust_main; -use FS::cust_svc; - -=head1 NAME - -RT::URI::freeside::Internal - -=head1 DESCRIPTION - -Overlay for the RT::URI::freeside URI handler implementing the Internal integration type. - -See L<RT::URI::freeside> for public/private interface documentation. - -=cut - - - -sub _FreesideGetRecord { - - my $self = shift; - my ($table, $pkey) = ($self->{'fstable'}, $self->{'fspkey'}); - - $RT::Logger->debug("Called _FreesideGetRecord()"); - - #eval "use FS::$table;"; - - my $dbdef = dbdef; - unless ($dbdef) { - $RT::Logger->error("Using Internal freeside integration type, ". - "but it doesn't look like we're running under ". - "freeside's Mason handler."); - return; - } - - my $pkeyfield = $dbdef->table($table)->primary_key; - unless ($pkeyfield) { - $RT::Logger->error("No primary key for freeside table '$table'"); - return; - } - - my $fsrec = qsearchs($table, { $pkeyfield => $pkey }); - unless ($fsrec) { - $RT::Logger->error("Record with '$pkeyfield' == '$pkey' does " . - "not exist in table $table"); - return; - } - - return { $fsrec->hash, '_object' => $fsrec }; - -} - -sub FreesideVersion { - - return $FS::VERSION; - -} - -sub FreesideGetConfig { - - #$conf = new FS::Conf unless ref($conf); - my $conf = new FS::Conf; - - return scalar($conf->config(@_)); - -} - -sub smart_search { #Subroutine - - return map { { $_->hash } } &FS::cust_main::smart_search(@_); - -} - -sub small_custview { - - return &FS::CGI::small_custview(@_); - -} - -sub _FreesideURILabelLong { - - my $self = shift; - - my $table = $self->{'fstable'}; - - if ( $table eq 'cust_main' ) { - - my $rec = $self->_FreesideGetRecord(); - return small_custview( $rec->{'_object'}, - scalar(FS::Conf->new->config('countrydefault')), - 1 #nobalance - ); - - } else { - - return $self->_FreesideURILabel(); - - } - -} - -1; diff --git a/rt/lib/RT/URI/freeside/XMLRPC.pm b/rt/lib/RT/URI/freeside/XMLRPC.pm deleted file mode 100644 index a8a731fcd..000000000 --- a/rt/lib/RT/URI/freeside/XMLRPC.pm +++ /dev/null @@ -1,122 +0,0 @@ -# BEGIN LICENSE BLOCK -# -# Copyright (c) 2004 Kristian Hoffmann <khoff@fire2wire.com> -# Based on the original RT::URI::base and RT::URI::fsck_com_rt. -# -# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> -# -# (Except where explictly superceded by other copyright notices) -# -# This work is made available to you under the terms of Version 2 of -# the GNU General Public License. A copy of that license should have -# been provided with this software, but in any event can be snarfed -# from www.gnu.org. -# -# This work is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# Unless otherwise specified, all modifications, corrections or -# extensions to this work which alter its source code become the -# property of Best Practical Solutions, LLC when submitted for -# inclusion in the work. -# -# -# END LICENSE BLOCK - -use strict; -no warnings qw(redefine); - -use vars qw($XMLRPC_URL $_FS_VERSION); - -use Frontier::Client; - -=head1 NAME - -RT::URI::freeside::XMLRPC - -=head1 DESCRIPTION - -Overlay for the RT::URI::freeside URI handler implementing the XMLRPC integration type. - -See L<RT::URI::freeside> for public/private interface documentation. - -=cut - - -sub _XMLRPCRequest { #Subroutine - - my $method = shift; - my @args = @_; - - my $result; - eval { - my $server = new Frontier::Client ( url => $XMLRPC_URL ); - $result = $server->call($method, @args); - }; - - if (not $@ and ref($result) eq 'ARRAY') { - return (scalar(@$result) == 1) ? @$result[0] : @$result; - } else { - $RT::Logger->debug("Freeside XMLRPC: " . $result || $@); - return (); - } - -} - -sub _FreesideGetRecord { - - my $self = shift; - my ($table, $pkey) = ($self->{'fstable'}, $self->{'fspkey'}); - my $record; - - $RT::Logger->debug("Called XMLRPC::_FreesideGetRecord()"); - - #FIXME: Need a better way to get primary keys. - # Maybe create a method for it and cache them like version? - my %table_pkeys = ( - cust_main => 'custnum', - ); - - my $method = 'Record.qsearchs'; - my @args = ($table, { $table_pkeys{$table} => $pkey }); - my ($record) = &_XMLRPCRequest($method, @args); - - return $record; - -} - - -sub FreesideGetConfig { - - return _XMLRPCRequest('Conf.config', @_); - -} - - -sub FreesideVersion { - - return $_FS_VERSION if ($_FS_VERSION =~ /^\d+\.\d+\.\d+/); - - $RT::Logger->debug("Requesting freeside version..."); - ($_FS_VERSION) = &_XMLRPCRequest('version'); - $RT::Logger->debug("Cached freeside version: ${_FS_VERSION}"); - - return $_FS_VERSION; - -} - -sub smart_search { #Subroutine - - return _XMLRPCRequest('cust_main.smart_search', @_); - -} - -sub small_custview { - - return _XMLRPCRequest('CGI.small_custview', @_); - -} - -1; diff --git a/rt/lib/RT/URI/fsck_com_rt.pm b/rt/lib/RT/URI/fsck_com_rt.pm index ba98b1df4..cfe77cdff 100644 --- a/rt/lib/RT/URI/fsck_com_rt.pm +++ b/rt/lib/RT/URI/fsck_com_rt.pm @@ -1,8 +1,8 @@ -# BEGIN BPS TAGGED BLOCK {{{ +# {{{ BEGIN BPS TAGGED BLOCK # # COPYRIGHT: # -# This software is Copyright (c) 1996-2005 Best Practical Solutions, LLC +# This software is Copyright (c) 1996-2004 Best Practical Solutions, LLC # <jesse@bestpractical.com> # # (Except where explicitly superseded by other copyright notices) @@ -42,7 +42,7 @@ # works based on those contributions, and sublicense and distribute # those contributions and any derivatives thereof. # -# END BPS TAGGED BLOCK }}} +# }}} END BPS TAGGED BLOCK package RT::URI::fsck_com_rt; use RT::Ticket; @@ -75,7 +75,7 @@ ok (UNIVERSAL::isa($uri,RT::URI::fsck_com_rt), "It's an RT::URI::fsck_com_rt"); ok ($uri->isa('RT::URI::base'), "It's an RT::URI::base"); ok ($uri->isa('RT::Base'), "It's an RT::Base"); -is ($uri->LocalURIPrefix , 'fsck.com-rt://'.$RT::Organization); +is ($uri->LocalURIPrefix , 'fsck.com-rt://example.com'); =end testing diff --git a/rt/lib/RT/URI/t.pm b/rt/lib/RT/URI/t.pm deleted file mode 100644 index 2f95b2d3e..000000000 --- a/rt/lib/RT/URI/t.pm +++ /dev/null @@ -1,83 +0,0 @@ -# BEGIN LICENSE BLOCK -# -# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com> -# -# (Except where explictly superceded by other copyright notices) -# -# This work is made available to you under the terms of Version 2 of -# the GNU General Public License. A copy of that license should have -# been provided with this software, but in any event can be snarfed -# from www.gnu.org. -# -# This work is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# Unless otherwise specified, all modifications, corrections or -# extensions to this work which alter its source code become the -# property of Best Practical Solutions, LLC when submitted for -# inclusion in the work. -# -# -# END LICENSE BLOCK -package RT::URI::t; - -use RT::Ticket; -use RT::URI::base; - -use strict; -use vars qw(@ISA); -@ISA = qw/RT::URI::fsck_com_rt/; - -my $scheme = "t"; - -=head2 ParseURI URI - -When handed an t: URI, figures out if it is an RT ticket. This is an -alternate short form of specifying a full ticket URI. - -=begin testing - -use_ok("RT::URI::t"); -my $uri = RT::URI::t->new($RT::SystemUser); -ok(ref($uri), "URI object exists"); - -my $uristr = "t:1"; -$uri->ParseURI($uristr); -is(ref($uri->Object), "RT::Ticket", "Object loaded is a ticket"); -is($uri->Object->Id, 1, "Object loaded has correct ID"); -is($uri->URI, 'fsck.com-rt://'.$RT::Organization.'/ticket/1', - "URI object has correct URI string"); - -=end testing - -=cut - -sub ParseURI { - my $self = shift; - my $uri = shift; - - # "t:<articlenum>" - # Pass this off to fsck_com_rt, which is equipped to deal with - # tickets after stripping off the t: prefix. - - if ($uri =~ /^$scheme:(\d+)/) { - return $self->SUPER::ParseURI($1); - } else { - $self->{'uri'} = $uri; - return undef; - } -} - -=head2 Scheme - -Return the URI scheme - -=cut - -sub Scheme { - return $scheme; -} - -1; |