1 %# REST/1.0/Forms/ticket/default
12 my ($c, $o, $k, $e) = ("", [], {}, 0);
14 my $ticket = new RT::Ticket $session{CurrentUser};
15 my @dates = qw(Created Starts Started Due Resolved Told);
16 my @people = qw(Requestors Cc AdminCc);
17 my @create = qw(Queue Requestor Subject Cc AdminCc Owner Status Priority
18 InitialPriority FinalPriority TimeEstimated TimeWorked
19 TimeLeft Starts Started Due Resolved);
20 my @simple = qw(Subject Status Priority Disabled TimeEstimated TimeWorked
21 TimeLeft InitialPriority FinalPriority);
22 my %dates = map {lc $_ => $_} @dates;
23 my %people = map {lc $_ => $_} @people;
24 my %create = map {lc $_ => $_} @create;
25 my %simple = map {lc $_ => $_} @simple;
27 # Are we dealing with an existing ticket?
31 return [ "# Ticket $id does not exist.", [], {}, 1 ];
33 elsif (!$ticket->CurrentUserHasRight('ShowTicket') ||
34 (%data && !$ticket->CurrentUserHasRight('ModifyTicket')))
36 my $act = %data ? "modify" : "display";
37 return [ "# You are not allowed to $act ticket $id.", [], {}, 1 ];
42 # GET ticket/new: Return a suitable default form.
43 # We get defaults from queue/1 (XXX: What if it isn't there?).
44 my $due = new RT::Date $session{CurrentUser};
45 my $queue = new RT::Queue $session{CurrentUser};
46 my $starts = new RT::Date $session{CurrentUser};
49 $due->AddDays($queue->DefaultDueIn) if $queue->DefaultDueIn;
53 "# Required: Queue, Requestor, Subject",
54 [ qw(id Queue Requestor Subject Cc AdminCc Owner Status Priority
55 InitialPriority FinalPriority TimeEstimated Starts Due Text) ],
58 Queue => $queue->Name,
59 Requestor => $session{CurrentUser}->Name,
65 Priority => $queue->InitialPriority,
66 InitialPriority => $queue->InitialPriority,
67 FinalPriority => $queue->FinalPriority,
69 Starts => $starts->ISO,
77 # We'll create a new ticket, and fall through to set fields that
78 # can't be set in the call to Create().
81 foreach my $k (keys %data) {
82 if (exists $create{lc $k}) {
83 $v{$create{lc $k}} = delete $data{$k};
85 elsif (lc $k eq 'text') {
86 $text = delete $data{$k};
93 From => $session{CurrentUser}->EmailAddress,
94 Subject => $v{Subject},
100 unless ($ticket->Id) {
101 return [ "# Could not create ticket.", [], {}, 1 ];
106 push(@comments, "# Ticket $id created.");
107 goto DONE if %data == 0;
111 # Now we know we're dealing with an existing ticket.
113 my ($time, $key, $val, @data);
115 push @data, [ id => "ticket/".$ticket->Id ];
116 push @data, [ Queue => $ticket->QueueObj->Name ]
117 if (!%$fields || exists $fields->{lc 'Queue'});
118 push @data, [ Owner => $ticket->OwnerObj->Name ]
119 if (!%$fields || exists $fields->{lc 'Owner'});
120 push @data, [ Creator => $ticket->CreatorObj->Name ]
121 if (!%$fields || exists $fields->{lc 'Creator'});
123 foreach (qw(Subject Status Priority InitialPriority FinalPriority)) {
124 next unless (!%$fields || (exists $fields->{lc $_}));
125 push @data, [$_ => $ticket->$_ ];
128 foreach $key (@people) {
129 next unless (!%$fields || (exists $fields->{lc $key}));
130 push @data, [ $key => [ $ticket->$key->MemberEmailAddresses ] ];
133 $time = new RT::Date ($session{CurrentUser});
134 foreach $key (@dates) {
135 next unless (!%$fields || (exists $fields->{lc $key}));
136 $time->Set(Format => 'sql', Value => $ticket->$key);
137 push @data, [ $key => $time->AsString ];
140 $time = new RT::Date ($session{CurrentUser});
141 foreach $key (qw(TimeEstimated TimeWorked TimeLeft)) {
142 next unless (!%$fields || (exists $fields->{lc $key}));
143 $val = $ticket->$key || 0;
144 $val = $time->DurationAsString($val*60) if $val;
145 push @data, [ $key => $val ];
148 my %k = map {@$_} @data;
149 $o = [ map {$_->[0]} @data ];
153 my ($get, $set, $key, $val, $n, $s);
155 foreach $key (keys %data) {
160 if (ref $val eq 'ARRAY') {
161 unless ($key =~ /^(?:Requestors|Cc|AdminCc)$/i) {
163 $s = "$key may have only one value.";
168 if ($key =~ /^queue$/i) {
169 next if $val eq $ticket->QueueObj->Name;
170 ($n, $s) = $ticket->SetQueue($val);
172 elsif ($key =~ /^owner$/i) {
173 next if $val eq $ticket->OwnerObj->Name;
174 ($n, $s) = $ticket->SetOwner($val);
176 elsif (exists $simple{$key}) {
177 $key = $simple{$key};
180 next if (($val eq $ticket->$key)|| ($ticket->$key =~ /^\d+$/ && $val == $ticket->$key));
181 ($n, $s) = $ticket->$set("$val");
183 elsif (exists $dates{$key}) {
187 my $time = new RT::Date $session{CurrentUser};
188 $time->Set(Format => 'sql', Value => $ticket->$key);
189 next if ($val =~ /^not set$/i || $val eq $time->AsString);
190 ($n, $s) = $ticket->$set($val);
192 elsif (exists $people{$key}) {
193 $key = $people{$key};
196 my %new = map {$_=>1} @{ vsplit($val) };
197 my %old = map {$_=>1} $ticket->$key->MemberEmailAddresses;
198 my $type = $key eq 'Requestors' ? 'Requestor' : $key;
200 foreach $p (keys %old) {
201 unless (exists $new{$p}) {
202 ($s, $n) = $ticket->DeleteWatcher(Type => $type,
204 push @msgs, [ $s, $n ];
207 foreach $p (keys %new) {
208 # XXX: This is a stupid test.
209 unless ($p =~ /^[\w.+-]+\@([\w.-]+\.)*\w+.?$/) {
211 $n = "$p is not a valid email address.";
212 push @msgs, [ $s, $n ];
215 unless ($ticket->IsWatcher(Type => $type, Email => $p)) {
216 ($s, $n) = $ticket->AddWatcher(Type => $type,
218 push @msgs, [ $s, $n ];
223 if (@msgs = grep {$_->[0] == 0} @msgs) {
225 $s = join "\n", map {"# ".$_->[1]} @msgs;
229 elsif ($key ne 'id' && $key ne 'type' && $key ne 'creator') {
231 $s = "Unknown field.";
237 push @comments, "# $key: $s";
239 my %o = keys %$changes;
241 @$o = ("id", keys %o);
246 push(@comments, "# Ticket ".$ticket->id." updated.") unless $n == 0;
250 $c ||= join("\n", @comments) if @comments;
251 return [$c, $o, $k, $e];