3 %# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
5 %# (Except where explictly superceded by other copyright notices)
7 %# This work is made available to you under the terms of Version 2 of
8 %# the GNU General Public License. A copy of that license should have
9 %# been provided with this software, but in any event can be snarfed
12 %# This work is distributed in the hope that it will be useful, but
13 %# WITHOUT ANY WARRANTY; without even the implied warranty of
14 %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 %# General Public License for more details.
17 %# Unless otherwise specified, all modifications, corrections or
18 %# extensions to this work which alter its source code become the
19 %# property of Best Practical Solutions, LLC when submitted for
20 %# inclusion in the work.
24 %# REST/1.0/Forms/ticket/links
33 my $ticket = new RT::Ticket $session{CurrentUser};
37 return [ "# Ticket $id does not exist.", [], {}, 1 ];
40 my ($c, $o, $k, $e) = ("", [], {}, 0);
41 my @fields = qw(DependsOn DependedOnBy RefersTo ReferredToBy Members MemberOf);
42 my %fields = map { lc $_ => $_ } @fields;
45 Members => { Type => 'MemberOf', Mode => 'Base' },
46 ReferredToBy => { Type => 'RefersTo', Mode => 'Base' },
47 DependedOnBy => { Type => 'DependsOn', Mode => 'Base' },
48 MemberOf => { Type => 'MemberOf', Mode => 'Target' },
49 RefersTo => { Type => 'RefersTo', Mode => 'Target' },
50 DependsOn => { Type => 'DependsOn', Mode => 'Target' },
54 my ($get, $set, $key, $val, $n, $s);
58 foreach $key (keys %data) {
63 if (exists $fields{$key}) {
67 my $field = $lfields{$key}->{Mode};
68 while (my $link = $ticket->$key->Next) {
69 $old{$link->$field} = 1;
73 foreach my $nkey (@{vsplit($val)}) {
74 if ($nkey =~ /^\d+$/) {
75 my $uri = new RT::URI $session{CurrentUser};
76 my $tick = new RT::Ticket $session{CurrentUser};
79 $nkey = $uri->FromObject($tick);
83 $s = "Ticket $nkey does not exist.";
90 foreach my $u (keys %old) {
91 if (exists $new{$u}) {
95 my $type = $lfields{$key}->{Type};
96 my $mode = $lfields{$key}->{Mode};
97 ($n, $s) = $ticket->DeleteLink(Type => $type, $mode => $u);
101 foreach my $u (keys %new) {
102 my $type = $lfields{$key}->{Type};
103 my $mode = $lfields{$key}->{Mode};
104 ($n, $s) = $ticket->AddLink(Type => $type, $mode => $u);
108 elsif ($key ne 'id' && $key ne 'type') {
110 $s = "Unknown field: $key";
116 push @comments, "# $key: $s";
118 @$o = ("id", @fields);
124 push(@comments, "# Links for ticket $id updated.") unless @comments;
125 $c = join("\n", @comments) if @comments;
130 push @data, [ id => "ticket/".$ticket->Id."/links" ];
131 foreach my $key (@fields) {
134 my $field = $lfields{$key}->{Mode};
135 while (my $link = $ticket->$key->Next) {
136 push @val, $link->$field;
138 push(@val, "") if (@val == 0 && $format eq 'l');
139 push @data, [ $key => [ @val ] ] if @val;
142 my %k = map {@$_} @data;
143 $o = [ map {$_->[0]} @data ];
147 return [ $c, $o, $k, $e ];