diff options
Diffstat (limited to 'rt/lib/RT/URI')
-rw-r--r-- | rt/lib/RT/URI/base.pm | 129 | ||||
-rw-r--r-- | rt/lib/RT/URI/freeside.pm | 188 | ||||
-rw-r--r-- | rt/lib/RT/URI/fsck_com_rt.pm | 246 |
3 files changed, 563 insertions, 0 deletions
diff --git a/rt/lib/RT/URI/base.pm b/rt/lib/RT/URI/base.pm new file mode 100644 index 000000000..a599f3ad8 --- /dev/null +++ b/rt/lib/RT/URI/base.pm @@ -0,0 +1,129 @@ +# 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::base; + +use strict; +use base qw(RT::Base); + +=head1 NAME + +RT::URI::base + +=head1 DESCRIPTION + +A baseclass (and fallback) RT::URI handler. Every URI handler needs to +handle the API presented here + +=cut + + +=head1 API + +=head2 new + +Create a new URI handler + +=cut + +sub new { + my $proto = shift; + my $class = ref($proto) || $proto; + my $self = {}; + bless( $self, $class ); + $self->CurrentUser(@_); + return ($self); +} + +sub ParseObject { + my $self = shift; + my $obj = shift; + $self->{'uri'} = "unknown-object:".ref($obj); + + +} + + + +sub ParseURI { + my $self = shift; + my $uri = shift; + + if ($uri =~ /^(.*?):/) { + $self->{'scheme'} = $1; + } + $self->{'uri'} = $uri; + + +} + + +sub Object { + my $self = shift; + return undef; + +} + +sub URI { + my $self = shift; + return($self->{'uri'}); +} + +sub Scheme { + my $self = shift; + return($self->{'scheme'}); + +} + +sub HREF { + my $self = shift; + return($self->{'href'} || $self->{'uri'}); +} + +sub IsLocal { + my $self = shift; + return undef; +} + +=head2 AsString + +Return a "pretty" string representing the URI object. + +This is meant to be used like this: + + % $re = $uri->Resolver; + <A HREF="<% $re->HREF %>"><% $re->AsString %></A> + +=cut + +sub AsString { + my $self = shift; + return $self->URI; +} + +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.pm b/rt/lib/RT/URI/freeside.pm new file mode 100644 index 000000000..bfb514df8 --- /dev/null +++ b/rt/lib/RT/URI/freeside.pm @@ -0,0 +1,188 @@ +# 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 +package RT::URI::freeside; + +use RT::URI::base; +use strict; +use vars qw(@ISA); + +@ISA = qw/RT::URI::base/; + + +=head1 NAME + +RT::URI::base + +=head1 DESCRIPTION + +URI handler for freeside URIs. See http://www.sisd.com/freeside/ for +more information on freeside. + +=cut + + +sub FreesideURIPrefix { + + my $self = shift; + return($self->Scheme . '://freeside'); + +} + +sub FreesideURILabel { + + my $self = shift; + + return(undef) unless (exists($self->{'fstable'}) and + exists($self->{'fspkey'})); + + my $label; + my ($table, $pkey) = ($self->{'fstable'}, $self->{'fspkey'}); + + 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}" : ''; + } else { + $label = "Freeside ${table}, ${pkeyfield} == ${pkey}"; + } + + #... other cases + + }; + + if ($label and !$@) { + return($label); + } else { + return(undef); + } + + +} + +sub ParseURI { + my $self = shift; + my $uri = shift; + my ($table, $pkey); + + my $uriprefix = $self->FreesideURIPrefix; + if ($uri =~ /^$uriprefix\/(\w+)\/(\d+)$/) { + $table = $1; + $pkey = $2; + $self->{'scheme'} = $self->Scheme; + } else { + return(undef); + } + + $self->{'uri'} = "${uriprefix}/${table}/${pkey}"; + $self->{'fstable'} = $table; + $self->{'fspkey'} = $pkey; + + my $p; + + eval { + use FS::UID qw(dbh); + use FS::CGI qw(popurl); + + if (dbh) { + $p = popurl(3); + } + + }; + + if ($@ or (!$p)) { + $self->{'href'} = $self->{'uri'}; + } else { + $self->{'href'} = "${p}view/${table}.cgi?${pkey}"; + } + + $self->{'uri'}; + +} + +sub Scheme { + my $self = shift; + return('freeside'); + +} + +sub HREF { + my $self = shift; + return($self->{'href'} || $self->{'uri'}); +} + +sub IsLocal { + my $self = shift; + return undef; +} + +=head2 AsString + +Return a "pretty" string representing the URI object. + +This is meant to be used like this: + + % $re = $uri->Resolver; + <A HREF="<% $re->HREF %>"><% $re->AsString %></A> + +=cut + +sub AsString { + my $self = shift; + my $prettystring; + if ($prettystring = $self->FreesideURILabel) { + return $prettystring; + } else { + return $self->URI; + } +} + +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/fsck_com_rt.pm b/rt/lib/RT/URI/fsck_com_rt.pm new file mode 100644 index 000000000..4035776ef --- /dev/null +++ b/rt/lib/RT/URI/fsck_com_rt.pm @@ -0,0 +1,246 @@ +# 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::fsck_com_rt; + +use RT::Ticket; + +use RT::URI::base; + +use strict; +use vars qw(@ISA); +@ISA = qw/RT::URI::base/; + + + + +=head2 LocalURIPrefix + +Returns the prefix for a local ticket URI + +=begin testing + +use_ok("RT::URI::fsck_com_rt"); +my $uri = RT::URI::fsck_com_rt->new($RT::SystemUser); + +ok(ref($uri)); + +use Data::Dumper; + + +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://example.com/ticket/'); + +=end testing + + + +=cut + +sub LocalURIPrefix { + my $self = shift; + my $prefix = $self->Scheme. "://$RT::Organization/ticket/"; + return ($prefix); +} + + + + + +=head2 URIForObject RT::Ticket + +Returns the RT URI for a local RT::Ticket object + +=begin testing + +my $ticket = RT::Ticket->new($RT::SystemUser); +$ticket->Load(1); +my $uri = RT::URI::fsck_com_rt->new($ticket->CurrentUser); +is($uri->LocalURIPrefix . "1" , $uri->URIForObject($ticket)); + +=end testing + +=cut + +sub URIForObject { + + my $self = shift; + + my $obj = shift; + return ($self->LocalURIPrefix. $obj->Id); +} + + +=head2 ParseObject $TicketObj + +When handed an RT::Ticekt object, figure out its URI + + +=cut + + + +=head2 ParseURI URI + +When handed an fsck.com-rt: URI, figures out things like whether its a local ticket +and what its ID is + +=cut + + +sub ParseURI { + my $self = shift; + my $uri = shift; + + my $ticket; + + if ($uri =~ /^(\d+)$/) { + $ticket = RT::Ticket->new($self->CurrentUser); + $ticket->Load($uri); + $self->{'uri'} = $ticket->URI; + } + else { + $self->{'uri'} = $uri; + } + + + + #If it's a local URI, load the ticket object and return its URI + if ( $self->IsLocal) { + + my $local_uri_prefix = $self->LocalURIPrefix; + if ($self->{'uri'} =~ /^$local_uri_prefix(\d+)$/i) { + my $id = $1; + + + $ticket = RT::Ticket->new( $self->CurrentUser ); + $ticket->Load($id); + + #If we couldn't find a ticket, return undef. + unless ( defined $ticket->Id ) { + return undef; + } + } else { + return undef; + } + } + + $self->{'object'} = $ticket; + if ( UNIVERSAL::can( $ticket, 'Id' ) ) { + return ( $ticket->Id ); + } + else { + return undef; + } +} + +=head2 IsLocal + +Returns true if this URI is for a local ticket. +Returns undef otherwise. + + + +=cut + +sub IsLocal { + my $self = shift; + my $local_uri_prefix = $self->LocalURIPrefix; + if ($self->{'uri'} =~ /^$local_uri_prefix/i) { + return 1; + } + else { + return undef; + } +} + + + +=head2 Object + +Returns the object for this URI, if it's local. Otherwise returns undef. + +=cut + +sub Object { + my $self = shift; + return ($self->{'object'}); + +} + +=head2 Scheme + +Return the URI scheme for RT tickets + +=cut + + +sub Scheme { + my $self = shift; + return "fsck.com-rt"; +} + +=head2 HREF + +If this is a local ticket, return an HTTP url to it. +Otherwise, return its URI + +=cut + + +sub HREF { + my $self = shift; + if ($self->IsLocal && $self->Object) { + return ( $RT::WebURL . "Ticket/Display.html?id=".$self->Object->Id); + } + else { + return ($self->URI); + } +} + +=head2 AsString + +Returns either a localized string 'ticket #23' or the full URI if the object is not local + +=cut + +sub AsString { + my $self = shift; + if ($self->IsLocal && $self->Object) { + return $self->loc("ticket #[_1]", $self->Object->Id); + } + else { + return $self->URI; + } +} + +eval "require RT::URI::fsck_com_rt_Vendor"; +die $@ if ($@ && $@ !~ qr{^Can't locate RT/URI/fsck_com_rt_Vendor.pm}); +eval "require RT::URI::fsck_com_rt_Local"; +die $@ if ($@ && $@ !~ qr{^Can't locate RT/URI/fsck_com_rt_Local.pm}); + +1; |