%# BEGIN LICENSE BLOCK %# %# Copyright (c) 1996-2003 Jesse Vincent %# %# (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 %# REST/1.0/Forms/ticket/links %# <%ARGS> $id $format => 's' $changes => undef <%perl> my @data; my $ticket = new RT::Ticket $session{CurrentUser}; $ticket->Load($id); if (!$ticket->Id) { return [ "# Ticket $id does not exist.", [], {}, 1 ]; } my ($c, $o, $k, $e) = ("", [], {}, 0); my @fields = qw(DependsOn DependedOnBy RefersTo ReferredToBy Members MemberOf); my %fields = map { lc $_ => $_ } @fields; my %lfields = ( Members => { Type => 'MemberOf', Mode => 'Base' }, ReferredToBy => { Type => 'RefersTo', Mode => 'Base' }, DependedOnBy => { Type => 'DependsOn', Mode => 'Base' }, MemberOf => { Type => 'MemberOf', Mode => 'Target' }, RefersTo => { Type => 'RefersTo', Mode => 'Target' }, DependsOn => { Type => 'DependsOn', Mode => 'Target' }, ); if ($changes) { my ($get, $set, $key, $val, $n, $s); my %data = %$changes; my @comments; foreach $key (keys %data) { $val = $data{$key}; $key = lc $key; $n = 1; if (exists $fields{$key}) { $key = $fields{$key}; my %old; my $field = $lfields{$key}->{Mode}; while (my $link = $ticket->$key->Next) { $old{$link->$field} = 1; } my %new; foreach my $nkey (@{vsplit($val)}) { if ($nkey =~ /^\d+$/) { my $uri = new RT::URI $session{CurrentUser}; my $tick = new RT::Ticket $session{CurrentUser}; $tick->Load($nkey); if ($tick->Id) { $nkey = $uri->FromObject($tick); } else { $n = 0; $s = "Ticket $nkey does not exist."; goto SET; } } $new{$nkey} = 1; } foreach my $u (keys %old) { if (exists $new{$u}) { delete $new{$u}; } else { my $type = $lfields{$key}->{Type}; my $mode = $lfields{$key}->{Mode}; ($n, $s) = $ticket->DeleteLink(Type => $type, $mode => $u); goto SET; } } foreach my $u (keys %new) { my $type = $lfields{$key}->{Type}; my $mode = $lfields{$key}->{Mode}; ($n, $s) = $ticket->AddLink(Type => $type, $mode => $u); goto SET; } } elsif ($key ne 'id' && $key ne 'type') { $n = 0; $s = "Unknown field: $key"; } SET: if ($n == 0) { $e = 1; push @comments, "# $key: $s"; unless (@$o) { @$o = ("id", @fields); %$k = %data; } } } push(@comments, "# Links for ticket $id updated.") unless @comments; $c = join("\n", @comments) if @comments; } else { my @data; push @data, [ id => "ticket/".$ticket->Id."/links" ]; foreach my $key (@fields) { my @val; my $field = $lfields{$key}->{Mode}; while (my $link = $ticket->$key->Next) { push @val, $link->$field; } push(@val, "") if (@val == 0 && $format eq 'l'); push @data, [ $key => [ @val ] ] if @val; } my %k = map {@$_} @data; $o = [ map {$_->[0]} @data ]; $k = \%k; } return [ $c, $o, $k, $e ];