[rt-devel] new ticket/user/queue forms
Abhijit Menon-Sen
ams at wiw.org
Fri Oct 17 02:57:49 EDT 2003
Drop-in replacements for Forms/{ticket,queue,user}/default. The ticket
form here has some minor bugfixes over the version I posted yesterday.
They seem to work fairly well for everything I've tried so far.
Comments welcome.
-- ams
-------------- next part --------------
%# REST/1.0/Forms/user/default
%#
<%ARGS>
$id
$format => 's'
$changes => {}
</%ARGS>
<%perl>
my @comments;
my ($c, $o, $k, $e) = ("", [], {}, 0);
my %data = %$changes;
my $user = new RT::User $session{CurrentUser};
my @fields = qw(RealName NickName Gecos Organization Address1 Address2 City
State Zip Country HomePhone WorkPhone MobilePhone PagerPhone
FreeformContactInfo Comments Signature Lang EmailEncoding
WebEncoding ExternalContactInfoId ContactInfoSystem
ExternalAuthId AuthSystem);
my %fields = map { lc $_ => $_ } @fields;
if ($id ne 'new') {
$user->Load($id);
if (!$user->Id) {
return [ "# User $id does not exist.", [], {}, 1 ];
}
}
else {
if (%data == 0) {
return [
"# Required: Name, EmailAddress",
[ qw(id Name EmailAddress Organization Password Comments) ],
{
id => "user/new",
Name => "",
EmailAddress => "",
Organization => "",
Password => "",
Comments => ""
},
0
];
}
else {
my %v;
my %create = %fields;
$create{name} = "Name";
$create{password} = "Password";
$create{emailaddress} = "EmailAddress";
$create{contactinfo} = "FreeformContactInfo";
# Do any fields need to be excluded here?
foreach my $k (keys %data) {
if (exists $create{lc $k}) {
$v{$create{lc $k}} = delete $data{$k};
}
}
$user->Create(%v);
unless ($user->Id) {
return [ "# Could not create user.", [], {}, 1 ];
}
$id = $user->Id;
delete $data{id};
push(@comments, "# User $id created.");
goto DONE if %data == 0;
}
}
if (%data == 0) {
my @data;
push @data, [ id => "user/".$user->Id ];
push @data, [ Name => $user->Name ];
push @data, [ Password => '********' ];
push @data, [ EmailAddress => $user->EmailAddress ];
foreach my $key (@fields) {
my $val = $user->$key;
if ($format eq 'l' || (defined $val && $val ne '')) {
$key = "ContactInfo" if $key eq 'FreeformContactInfo';
push @data, [ $key => $val ];
}
}
my %k = map {@$_} @data;
$o = [ map {$_->[0]} @data ];
$k = \%k;
}
else {
my ($get, $set, $key, $val, $n, $s);
foreach $key (keys %data) {
$val = $data{$key};
$key = lc $key;
$n = 1;
if ($key eq 'name' || $key eq 'emailaddress' ||
$key eq 'contactinfo' || exists $fields{$key})
{
if (exists $fields{$key}) {
$key = $fields{$key};
}
else {
$key = "FreeformContactInfo" if $key eq 'contactinfo';
$key = "EmailAddress" if $key eq 'emailaddress';
$key = "Name" if $key eq 'name';
}
$set = "Set$key";
next if $val eq $user->$key;
($n, $s) = $user->$set($val);
}
elsif ($key eq 'password') {
($n, $s) = $user->SetPassword($val) unless $val =~ /^\**$/;
}
elsif ($key ne 'id') {
$n = 0;
$s = "Unknown field.";
}
SET:
if ($n == 0) {
$e = 1;
push @comments, "# $key: $s";
unless (@$o) {
my %o = keys %$changes;
delete @o{"id", @fields};
@$o = ("id", @fields, keys %o);
$k = $changes;
}
}
}
push(@comments, "# User $id updated.") unless $n == 0;
}
DONE:
$c ||= join("\n", @comments) if @comments;
return [ $c, $o, $k, $e ];
</%perl>
-------------- next part --------------
%# REST/1.0/Forms/queue/default
%#
<%ARGS>
$id
$format => 's'
$changes => {}
</%ARGS>
<%perl>
my @comments;
my ($c, $o, $k, $e) = ("", [], {}, 0);
my %data = %$changes;
my $queue = new RT::Queue $session{CurrentUser};
my @fields = qw(Name Description CorrespondAddress CommentAddress
InitialPriority FinalPriority DefaultDueIn);
my %fields = map { lc $_ => $_ } @fields;
if ($id ne 'new') {
$queue->Load($id);
if (!$queue->Id) {
return [ "# Queue $id does not exist.", [], {}, 1 ];
}
}
else {
if (%data == 0) {
return [
"# Required: Name",
[ "id", @fields ],
{
id => 'queue/new',
Name => '<queue name>',
Description => "",
CommentAddress => "",
CorrespondAddress => "",
InitialPriority => "",
FinalPriority => "",
DefaultDueIn => "",
},
0
];
}
else {
my %v;
my %create = %fields;
foreach my $k (keys %data) {
if (exists $create{lc $k}) {
$v{$create{lc $k}} = delete $data{$k};
}
}
if ($v{Name} eq '<queue name>') {
my %o = keys %$changes;
delete @o{"id", @fields};
return [
"# Please set the queue name.",
[ "id", @fields, keys %o ], $changes, 1
];
}
$queue->Create(%v);
unless ($queue->Id) {
return [ "# Could not create queue.", [], {}, 1 ];
}
delete $data{id};
$id = $queue->Id;
push(@comments, "# Queue $id created.");
goto DONE if %data == 0;
}
}
if (%data == 0) {
my @data;
push @data, [ id => "queue/".$queue->Id ];
foreach my $key (@fields) {
push @data, [ $key => $queue->$key ];
}
my %k = map {@$_} @data;
$o = [ map {$_->[0]} @data ];
$k = \%k;
}
else {
my ($get, $set, $key, $val, $n, $s);
foreach $key (keys %data) {
$val = $data{$key};
$key = lc $key;
$n = 1;
if (exists $fields{$key}) {
$key = $fields{$key};
$set = "Set$key";
next if $val eq $queue->$key;
($n, $s) = $queue->$set($val);
}
elsif ($key ne 'id') {
$n = 0;
$s = "Unknown field.";
}
SET:
if ($n == 0) {
$e = 1;
push @comments, "# $key: $s";
unless (@$o) {
my %o = keys %$changes;
delete @o{"id", @fields};
@$o = ("id", @fields, keys %o);
$k = $changes;
}
}
}
push(@comments, "# Queue $id updated.") unless $n == 0;
}
DONE:
$c ||= join("\n", @comments) if @comments;
return [ $c, $o, $k, $e ];
</%perl>
-------------- next part --------------
%# REST/1.0/Forms/ticket/default
%#
<%ARGS>
$id
$changes => {}
</%ARGS>
<%perl>
use MIME::Entity;
my @comments;
my ($c, $o, $k, $e) = ("", [], {}, 0);
my %data = %$changes;
my $ticket = new RT::Ticket $session{CurrentUser};
my @dates = qw(Starts Started Due Resolved Told);
my @people = qw(Requestors Cc AdminCc);
my @create = qw(Queue Requestor Subject Cc AdminCc Owner Status Priority
InitialPriority FinalPriority TimeEstimated TimeWorked
TimeLeft Starts Started Due Resolved);
my @simple = qw(Subject Status Priority Disabled TimeEstimated TimeWorked
TimeLeft InitialPriority FinalPriority);
my %dates = map {lc $_ => $_} @dates;
my %people = map {lc $_ => $_} @people;
my %create = map {lc $_ => $_} @create;
my %simple = map {lc $_ => $_} @simple;
# Are we dealing with an existing ticket?
if ($id ne 'new') {
$ticket->Load($id);
if (!$ticket->Id) {
return [ "# Ticket $id does not exist.", [], {}, 1 ];
}
elsif (!$ticket->CurrentUserHasRight('ShowTicket') ||
(%data && !$ticket->CurrentUserHasRight('ModifyTicket')))
{
my $act = %data ? "modify" : "display";
return [ "# You are not allowed to $act ticket $id.", [], {}, 1 ];
}
}
else {
if (%data == 0) {
# GET ticket/new: Return a suitable default form.
# We get defaults from queue/1 (XXX: What if it isn't there?).
my $due = new RT::Date $session{CurrentUser};
my $queue = new RT::Queue $session{CurrentUser};
my $starts = new RT::Date $session{CurrentUser};
$queue->Load(1);
$due->SetToNow;
$due->AddDays($queue->DefaultDueIn) if $queue->DefaultDueIn;
$starts->SetToNow;
return [
"# Required: Queue, Requestor, Subject",
[ qw(id Queue Requestor Subject Cc AdminCc Owner Status Priority
InitialPriority FinalPriority TimeEstimated Starts Due Text) ],
{
id => "ticket/new",
Queue => $queue->Name,
Requestor => $session{CurrentUser}->Name,
Subject => "",
Cc => [],
AdminCc => [],
Owner => "",
Status => "new",
Priority => $queue->InitialPriority,
InitialPriority => $queue->InitialPriority,
FinalPriority => $queue->FinalPriority,
TimeEstimated => 0,
Starts => $starts->ISO,
Due => $due->ISO,
Text => "",
},
0
];
}
else {
# We'll create a new ticket, and fall through to set fields that
# can't be set in the call to Create().
my (%v, $text);
foreach my $k (keys %data) {
if (exists $create{lc $k}) {
$v{$create{lc $k}} = delete $data{$k};
}
elsif (lc $k eq 'text') {
$text = delete $data{$k};
}
}
if ($text) {
$v{MIMEObj} =
MIME::Entity->build(
From => $session{CurrentUser}->EmailAddress,
Subject => $v{Subject},
Data => $text
);
}
$ticket->Create(%v);
unless ($ticket->Id) {
return [ "# Could not create ticket.", [], {}, 1 ];
}
delete $data{id};
$id = $ticket->Id;
push(@comments, "# Ticket $id created.");
goto DONE if %data == 0;
}
}
# Now we know we're dealing with an existing ticket.
if (%data == 0) {
my ($time, $key, $val, @data);
push @data, [ id => "ticket/".$ticket->Id ];
push @data, [ Queue => $ticket->QueueObj->Name ];
push @data, [ Owner => $ticket->OwnerObj->Name ];
foreach (qw(Subject Status Priority InitialPriority FinalPriority)) {
push @data, [$_ => $ticket->$_ ];
}
foreach $key (@people) {
push @data, [ $key => [ $ticket->$key->MemberEmailAddresses ] ];
}
$time = new RT::Date ($session{CurrentUser});
foreach $key (@dates) {
$time->Set(Format => 'sql', Value => $ticket->$key);
push @data, [ $key => $time->AsString ];
}
$time = new RT::Date ($session{CurrentUser});
foreach $key (qw(TimeEstimated TimeWorked TimeLeft)) {
$val = $ticket->$key || 0;
$val = $time->DurationAsString($val*60) if $val;
push @data, [ $key => $val ];
}
my %k = map {@$_} @data;
$o = [ map {$_->[0]} @data ];
$k = \%k;
}
else {
my ($get, $set, $key, $val, $n, $s);
foreach $key (keys %data) {
$val = $data{$key};
$key = lc $key;
$n = 1;
if (ref $val eq 'ARRAY') {
unless ($key =~ /^(?:Requestors|Cc|AdminCc)$/i) {
$n = 0;
$s = "$key may have only one value.";
goto SET;
}
}
if ($key =~ /^queue$/i) {
next if $val eq $ticket->QueueObj->Name;
($n, $s) = $ticket->SetQueue($val);
}
elsif ($key =~ /^owner$/i) {
next if $val eq $ticket->OwnerObj->Name;
($n, $s) = $ticket->SetOwner($val);
}
elsif (exists $simple{$key}) {
$key = $simple{$key};
$set = "Set$key";
next if $val eq $ticket->$key;
($n, $s) = $ticket->$set($val);
}
elsif (exists $dates{$key}) {
$key = $dates{$key};
$set = "Set$key";
my $time = new RT::Date $session{CurrentUser};
$time->Set(Format => 'sql', Value => $ticket->$key);
next if ($val =~ /^not set$/i || $val eq $time->AsString);
($n, $s) = $ticket->$set($val);
}
elsif (exists $people{$key}) {
$key = $people{$key};
my ($p, @msgs);
my %new = map {$_=>1} @{ vsplit($val) };
my %old = map {$_=>1} $ticket->$key->MemberEmailAddresses;
my $type = $key eq 'Requestors' ? 'Requestor' : $key;
foreach $p (keys %old) {
unless (exists $new{$p}) {
($s, $n) = $ticket->DeleteWatcher(Type => $type,
Email => $p);
push @msgs, [ $s, $n ];
}
}
foreach $p (keys %new) {
# XXX: This is a stupid test.
unless ($p =~ /^[\w.+-]+\@([\w.-]+\.)*\w+.?$/) {
$s = 0;
$n = "$p is not a valid email address.";
push @msgs, [ $s, $n ];
next;
}
unless ($ticket->IsWatcher(Type => $type, Email => $p)) {
($s, $n) = $ticket->AddWatcher(Type => $type,
Email => $p);
push @msgs, [ $s, $n ];
}
}
$n = 1;
if (@msgs = grep {$_->[0] == 0} @msgs) {
$n = 0;
$s = join "\n", map {"# ".$_->[1]} @msgs;
$s =~ s/^# //;
}
}
elsif ($key ne 'id' && $key ne 'type') {
$n = 0;
$s = "Unknown field.";
}
SET:
if ($n == 0) {
$e = 1;
push @comments, "# $key: $s";
unless (@$o) {
my %o = keys %$changes;
delete $o{id};
@$o = ("id", keys %o);
$k = $changes;
}
}
}
push(@comments, "# Ticket $id updated.") unless $n == 0;
}
DONE:
$c ||= join("\n", @comments) if @comments;
return [$c, $o, $k, $e];
</%perl>
More information about the Rt-devel
mailing list