diff options
Diffstat (limited to 'rt')
67 files changed, 1070 insertions, 11478 deletions
diff --git a/rt/FREESIDE_MODIFIED b/rt/FREESIDE_MODIFIED new file mode 100644 index 000000000..a013b832c --- /dev/null +++ b/rt/FREESIDE_MODIFIED @@ -0,0 +1,23 @@ + sbin/rt-setup-database.in +config.layout +config.layout.in + etc/RT_SiteConfig.pm +lib/RT/Interface/Web_Vendor.pm +lib/RT/URI/freeside.pm +lib/RT/URI/freeside/Internal.pm +lib/RT/URI/freeside/XMLRPC.pm + html/Elements/Header + html/Elements/Menu + html/Elements/PageLayout + html/Elements/SimpleSearch + html/Elements/Tabs + html/Elements/Footer + html/Elements/CollectionAsTable/Row #backport from 3.3-TESTING +html/Ticket/Elements/AddCustomers +html/Ticket/Elements/EditCustomers +html/Ticket/Elements/ShowCustomers + html/Ticket/Elements/ShowSummary + html/Ticket/Elements/Tabs +html/Ticket/ModifyCustomers.html +html/NoAuth/images/small-logo.png + html/NoAuth/webrt.css diff --git a/rt/HOWTO/README b/rt/HOWTO/README deleted file mode 100644 index 942096b0a..000000000 --- a/rt/HOWTO/README +++ /dev/null @@ -1,14 +0,0 @@ -Here you'll find plain text documentation of how to handle various -project procedures. Files contained herein: - -change.txt - How changes are integrated, including generating and - distributing aedist change sets, and updating the CVS repository. - -release.txt - Steps to go through when releasing a new version of RT. - - -These procedures are based on documentation from the scons project -as http://www.scons.org/ - diff --git a/rt/HOWTO/change.txt b/rt/HOWTO/change.txt deleted file mode 100644 index de316450c..000000000 --- a/rt/HOWTO/change.txt +++ /dev/null @@ -1,67 +0,0 @@ -Handling a change set: - - -- Start the change: - - aedist -r [if it's a remote submission] - - -or- - - aedb {cnum} [if it's initiated locally] - - -- Normal development cycle: - - aecd -c {cnum} - aecp . # Copy the baseline to your working dir - # work on your change - aenf {new file names} - - aecpu -unch # Remove unchanged files, for faster diffs - aeb # Currently does nothing - aet # Currently does nothing - aed # Diff your change - aede # End the change - - -- As the reviewer: - - aerpass {cnum} - - -- As the integrator: - - aeib {cnum} - aeb - aet - aed - cd ~ # Get out of the current working directory - aeipass - - - - - -- Update the aedist baseline on the web site: - - aedist -s -bl -p rt.2.1 > rt.2.1.ae - scp rt.2.1.ae jesse@fsck.com:/home/ftp/pub/rt/devel/rt.2.1.ae - rm rt.2.1.ae - - [This will eventually be automated.] - - -- Distribute the change to CVS: - - WARNING. DOES NOT YET WORK - - export CVS_RSH=ssh - ae2cvs -n -aegis -p rt.2.1 -c {cnum} -u ~/SCons/scons - ae2cvs -X -aegis -p rt.2.1 -c {cnum} -u ~/SCons/scons - - If you need the "ae2cvs" Perl script, you can find a copy - checked in to the bin/subdirectory. - - [This may eventually be automated.] - - - - -- Grabbing the latest dev sources over ssh - - ssh fsck.com "aedist -s -p rt.2.1 -naa -bl -entire-source" | aedist -r - - diff --git a/rt/HOWTO/release.txt b/rt/HOWTO/release.txt deleted file mode 100644 index 285041c5b..000000000 --- a/rt/HOWTO/release.txt +++ /dev/null @@ -1,124 +0,0 @@ -Things to do to release a new version of rt: - - Build and test candidate packages - - Read through the README and src/README.txt files for any updates - - Prepare ChangeLog - - date -R the latest release - - should be current if this has been updated as each - change went in. - - [ Should be automated ] - - - TODO: nothing below this line is accurate for RT - - END THE BRANCH - - ae_p rt.2 - aede {5} - aerpass {5} - aeib {5} - aeb - aet - aet -reg - aed - aeipass - - START THE NEW BRANCH - - aenbr -p rt.2 {6} - aenc -p rt.2.{6} - - Call it something like, "Initialize the new - branch." Cause = internal_enhancement. Exempt - it from all tests (*_exempt = true). - - ae_p rt.2.{6} - - aedb 100 - - aecd - - # Change the hard-coded package version numbers - # in the following files. - aecp rttruct debian/changelog rpm/rt.spec - - vi rttruct debian/changelog rpm/rt.spec - - # Optionally, do the same in the following: - [optional] aecp HOWTO/change.txt - [optional] aecp HOWTO/release.txt - [optional] aecp debian/rt.postinst - - [optional] vi HOWTO/change.txt - [optional] vi HOWTO/release.txt - [optional] vi debian/rt.postinst - - aeb - - aet -reg - - aed - - aede - - etc. - - - Read through the FAQ for any updates - - Test downloading from the web site download page - - - In the Bugs Tracker, add a Group for the new release (0.05) - - Announce to the following mailing lists (template below): - - rt-announce@lists.fsck.com - - - Notify www.cmtoday.com/contribute.html - - [This guy wants an announcement no more frequently than - once a month, so save it for a future release if it's - been too soon since the previous one.] - - Notify freshmeat.net - - [Wait until the morning so the announcement hits the - main freshmeat.net page while people in the U.S. are - awake and working] - - - - -======================= - -Template release announcement: - - - -Version 2.1.XXX of rt has been released and is available for download -from the rt web site: - - http://bestpractical.com/rt/ - - - -WHAT'S NEW IN THIS RELEASE? - -Version 2.1.XXX of rt contains the following important changes: - - - XXX - -For a complete list of changes in version 2.1.XXX, see the CHANGES.txt -file in the release itself. - - -WHAT IS RT? - - FILL THIS IN diff --git a/rt/HOWTO/version-control.txt b/rt/HOWTO/version-control.txt deleted file mode 100644 index 06babfdf1..000000000 --- a/rt/HOWTO/version-control.txt +++ /dev/null @@ -1,41 +0,0 @@ -Using Aegis for RT development - - 1. The main line of RT development will be under the control - of the Aegis change management system, as administered by - Best Practical Solutions, LLC - - 2. We will use aedist to generate change sets for each change - checked in to the main Aegis repository. These change sets will be - either distributed by a mailing list or made available via the web, - or both. - - 3. Remote developers using Aegis will send aedist output for - their changes to rt-patches@bestpractical.com for review and - integration. - - 4. The aedist output should be sent to rt-patches@bestpractical.com - after the change has completed its local aede, but before aerpass. - - 5. If the change is rejected, the developer can aedeu to reopen - the change and fix whatever problems caused the review to not pass. - - 6. A baseline snapshot (aedist -bl) of the main Aegis repository - will be generated at least daily and made available via http - to provide a central location for synchronizing remote Aegis - repositories. - - 7. Changes to the main Aegis repository will also be propagated - automatically to the tracking CVS repository. - -Using CVS for RT development - - 1. CVS is accessed via anonymous cvs with the following CVSROOT: - - :pserver:anoncvs@cvs.fsck.com:/raid/cvsroot/rt-2-1 - - 2. Remote developers using CVS will send patches (cvs -diff - output) to rt-patches@bestpractical.com for integration into the - main Aegis repository. This allows anonymous CVS access to be used - for RT development by developers who are unable to use Aegis. - - diff --git a/rt/bin/rt b/rt/bin/rt deleted file mode 100755 index d9f8a3f05..000000000 --- a/rt/bin/rt +++ /dev/null @@ -1,1816 +0,0 @@ -#!/usr/bin/perl -w -# 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 - -use strict; - -# This program is intentionally written to have as few non-core module -# dependencies as possible. It should stay that way. - -use Cwd; -use LWP; -use HTTP::Request::Common; - -# We derive configuration information from hardwired defaults, dotfiles, -# and the RT* environment variables (in increasing order of precedence). -# Session information is stored in ~/.rt_sessions. - -my $VERSION = 0.02; -my $HOME = eval{(getpwuid($<))[7]} - || $ENV{HOME} || $ENV{LOGDIR} || $ENV{HOMEPATH} - || "."; -my %config = ( - ( - debug => 0, - user => eval{(getpwuid($<))[0]} || $ENV{USER} || $ENV{USERNAME}, - passwd => undef, - server => 'http://localhost/rt/', - ), - config_from_file($ENV{RTCONFIG} || ".rtrc"), - config_from_env() -); -my $session = new Session("$HOME/.rt_sessions"); -my $REST = "$config{server}/REST/1.0"; - -sub whine; -sub DEBUG { warn @_ if $config{debug} >= shift } - -# These regexes are used by command handlers to parse arguments. -# (XXX: Ask Autrijus how i18n changes these definitions.) - -my $name = '[\w.-]+'; -my $field = '[a-zA-Z][a-zA-Z0-9_-]*'; -my $label = '[a-zA-Z0-9@_.+-]+'; -my $labels = "(?:$label,)*$label"; -my $idlist = '(?:(?:\d+-)?\d+,)*(?:\d+-)?\d+'; - -# Our command line looks like this: -# -# rt <action> [options] [arguments] -# -# We'll parse just enough of it to decide upon an action to perform, and -# leave the rest to per-action handlers to interpret appropriately. - -my %handlers = ( -# handler => [ ...aliases... ], - version => ["version", "ver"], - logout => ["logout"], - help => ["help", "man"], - show => ["show", "cat"], - edit => ["create", "edit", "new", "ed"], - list => ["search", "list", "ls"], - comment => ["comment", "correspond"], - link => ["link", "ln"], - merge => ["merge"], - grant => ["grant", "revoke"], -); - -# Once we find and call an appropriate handler, we're done. - -my (%actions, $action); -foreach my $fn (keys %handlers) { - foreach my $alias (@{ $handlers{$fn} }) { - $actions{$alias} = \&{"$fn"}; - } -} -if (@ARGV && exists $actions{$ARGV[0]}) { - $action = shift @ARGV; -} -$actions{$action || "help"}->($action || ()); -exit; - -# Handler functions. -# ------------------ -# -# The following subs are handlers for each entry in %actions. - -sub version { - print "rt $VERSION\n"; -} - -sub logout { - submit("$REST/logout") if defined $session->cookie; -} - -sub help { - my ($action, $type) = @_; - my (%help, $key); - - # What help topics do we know about? - local $/ = undef; - foreach my $item (@{ Form::parse(<DATA>) }) { - my $title = $item->[2]{Title}; - my @titles = ref $title eq 'ARRAY' ? @$title : $title; - - foreach $title (grep $_, @titles) { - $help{$title} = $item->[2]{Text}; - } - } - - # What does the user want help with? - undef $action if ($action && $actions{$action} eq \&help); - unless ($action || $type) { - # If we don't know, we'll look for clues in @ARGV. - foreach (@ARGV) { - if (exists $help{$_}) { $key = $_; last; } - } - unless ($key) { - # Tolerate possibly plural words. - foreach (@ARGV) { - if ($_ =~ s/s$// && exists $help{$_}) { $key = $_; last; } - } - } - } - - if ($type && $action) { - $key = "$type.$action"; - } - $key ||= $type || $action || "introduction"; - - # Find a suitable topic to display. - while (!exists $help{$key}) { - if ($type && $action) { - if ($key eq "$type.$action") { $key = $action; } - elsif ($key eq $action) { $key = $type; } - else { $key = "introduction"; } - } - else { - $key = "introduction"; - } - } - - print STDERR $help{$key}, "\n\n"; -} - -# Displays a list of objects that match some specified condition. - -sub list { - my ($q, $type, %data, $orderby); - my $bad = 0; - - while (@ARGV) { - $_ = shift @ARGV; - - if (/^-t$/) { - $bad = 1, last unless defined($type = get_type_argument()); - } - elsif (/^-S$/) { - $bad = 1, last unless get_var_argument(\%data); - } - elsif (/^-o$/) { - $orderby = shift @ARGV; - } - elsif (/^-([isl])$/) { - $data{format} = $1; - } - elsif (/^-f$/) { - if ($ARGV[0] !~ /^(?:(?:$field,)*$field)$/) { - whine "No valid field list in '-f $ARGV[0]'."; - $bad = 1; last; - } - $data{fields} = shift @ARGV; - } - elsif (!defined $q && !/^-/) { - $q = $_; - } - else { - my $datum = /^-/ ? "option" : "argument"; - whine "Unrecognised $datum '$_'."; - $bad = 1; last; - } - } - - $type ||= "ticket"; - unless ($type && defined $q) { - my $item = $type ? "query string" : "object type"; - whine "No $item specified."; - $bad = 1; - } - return help("list", $type) if $bad; - - my $r = submit("$REST/search/$type", { query => $q, %data, orderby => $orderby || "" }); - print $r->content; -} - -# Displays selected information about a single object. - -sub show { - my ($type, @objects, %data); - my $slurped = 0; - my $bad = 0; - - while (@ARGV) { - $_ = shift @ARGV; - - if (/^-t$/) { - $bad = 1, last unless defined($type = get_type_argument()); - } - elsif (/^-S$/) { - $bad = 1, last unless get_var_argument(\%data); - } - elsif (/^-([isl])$/) { - $data{format} = $1; - } - elsif (/^-$/ && !$slurped) { - chomp(my @lines = <STDIN>); - foreach (@lines) { - unless (is_object_spec($_, $type)) { - whine "Invalid object on STDIN: '$_'."; - $bad = 1; last; - } - push @objects, $_; - } - $slurped = 1; - } - elsif (/^-f$/) { - if ($ARGV[0] !~ /^(?:(?:$field,)*$field)$/) { - whine "No valid field list in '-f $ARGV[0]'."; - $bad = 1; last; - } - $data{fields} = shift @ARGV; - } - elsif (my $spec = is_object_spec($_, $type)) { - push @objects, $spec; - } - else { - my $datum = /^-/ ? "option" : "argument"; - whine "Unrecognised $datum '$_'."; - $bad = 1; last; - } - } - - unless (@objects) { - whine "No objects specified."; - $bad = 1; - } - return help("show", $type) if $bad; - - my $r = submit("$REST/show", { id => \@objects, %data }); - print $r->content; -} - -# To create a new object, we ask the server for a form with the defaults -# filled in, allow the user to edit it, and send the form back. -# -# To edit an object, we must ask the server for a form representing that -# object, make changes requested by the user (either on the command line -# or interactively via $EDITOR), and send the form back. - -sub edit { - my ($action) = @_; - my (%data, $type, @objects); - my ($cl, $text, $edit, $input, $output); - - use vars qw(%set %add %del); - %set = %add = %del = (); - my $slurped = 0; - my $bad = 0; - - while (@ARGV) { - $_ = shift @ARGV; - - if (/^-e$/) { $edit = 1 } - elsif (/^-i$/) { $input = 1 } - elsif (/^-o$/) { $output = 1 } - elsif (/^-t$/) { - $bad = 1, last unless defined($type = get_type_argument()); - } - elsif (/^-S$/) { - $bad = 1, last unless get_var_argument(\%data); - } - elsif (/^-$/ && !($slurped || $input)) { - chomp(my @lines = <STDIN>); - foreach (@lines) { - unless (is_object_spec($_, $type)) { - whine "Invalid object on STDIN: '$_'."; - $bad = 1; last; - } - push @objects, $_; - } - $slurped = 1; - } - elsif (/^set$/i) { - my $vars = 0; - - while (@ARGV && $ARGV[0] =~ /^($field)([+-]?=)(.*)$/) { - my ($key, $op, $val) = ($1, $2, $3); - my $hash = ($op eq '=') ? \%set : ($op =~ /^\+/) ? \%add : \%del; - - vpush($hash, lc $key, $val); - shift @ARGV; - $vars++; - } - unless ($vars) { - whine "No variables to set."; - $bad = 1; last; - } - $cl = $vars; - } - elsif (/^(?:add|del)$/i) { - my $vars = 0; - my $hash = ($_ eq "add") ? \%add : \%del; - - while (@ARGV && $ARGV[0] =~ /^($field)=(.*)$/) { - my ($key, $val) = ($1, $2); - - vpush($hash, lc $key, $val); - shift @ARGV; - $vars++; - } - unless ($vars) { - whine "No variables to set."; - $bad = 1; last; - } - $cl = $vars; - } - elsif (my $spec = is_object_spec($_, $type)) { - push @objects, $spec; - } - else { - my $datum = /^-/ ? "option" : "argument"; - whine "Unrecognised $datum '$_'."; - $bad = 1; last; - } - } - - if ($action =~ /^ed(?:it)?$/) { - unless (@objects) { - whine "No objects specified."; - $bad = 1; - } - } - else { - if (@objects) { - whine "You shouldn't specify objects as arguments to $action."; - $bad = 1; - } - unless ($type) { - whine "What type of object do you want to create?"; - $bad = 1; - } - @objects = ("$type/new"); - } - return help($action, $type) if $bad; - - # We need a form to make changes to. We usually ask the server for - # one, but we can avoid that if we are fed one on STDIN, or if the - # user doesn't want to edit the form by hand, and the command line - # specifies only simple variable assignments. - - if ($input) { - local $/ = undef; - $text = <STDIN>; - } - elsif ($edit || %add || %del || !$cl) { - my $r = submit("$REST/show", { id => \@objects, format => 'l' }); - $text = $r->content; - } - - # If any changes were specified on the command line, apply them. - if ($cl) { - if ($text) { - # We're updating forms from the server. - my $forms = Form::parse($text); - - foreach my $form (@$forms) { - my ($c, $o, $k, $e) = @$form; - my ($key, $val); - - next if ($e || !@$o); - - local %add = %add; - local %del = %del; - local %set = %set; - - # Make changes to existing fields. - foreach $key (@$o) { - if (exists $add{lc $key}) { - $val = delete $add{lc $key}; - vpush($k, $key, $val); - $k->{$key} = vsplit($k->{$key}) if $val =~ /[,\n]/; - } - if (exists $del{lc $key}) { - $val = delete $del{lc $key}; - my %val = map {$_=>1} @{ vsplit($val) }; - $k->{$key} = vsplit($k->{$key}); - @{$k->{$key}} = grep {!exists $val{$_}} @{$k->{$key}}; - } - if (exists $set{lc $key}) { - $k->{$key} = delete $set{lc $key}; - } - } - - # Then update the others. - foreach $key (keys %set) { vpush($k, $key, $set{$key}) } - foreach $key (keys %add) { - vpush($k, $key, $add{$key}); - $k->{$key} = vsplit($k->{$key}); - } - push @$o, (keys %add, keys %set); - } - - $text = Form::compose($forms); - } - else { - # We're rolling our own set of forms. - my @forms; - foreach (@objects) { - my ($type, $ids, $args) = - m{^($name)/($idlist|$labels)(?:(/.*))?$}o; - - $args ||= ""; - foreach my $obj (expand_list($ids)) { - my %set = (%set, id => "$type/$obj$args"); - push @forms, ["", [keys %set], \%set]; - } - } - $text = Form::compose(\@forms); - } - } - - if ($output) { - print $text; - exit; - } - - my $synerr = 0; - -EDIT: - # We'll let the user edit the form before sending it to the server, - # unless we have enough information to submit it non-interactively. - if ($edit || (!$input && !$cl)) { - my $newtext = vi($text); - # We won't resubmit a bad form unless it was changed. - $text = ($synerr && $newtext eq $text) ? undef : $newtext; - } - - if ($text) { - my $r = submit("$REST/edit", {content => $text, %data}); - if ($r->code == 409) { - # If we submitted a bad form, we'll give the user a chance - # to correct it and resubmit. - if ($edit || (!$input && !$cl)) { - $text = $r->content; - $synerr = 1; - goto EDIT; - } - else { - print $r->content; - exit -1; - } - } - print $r->content; - } -} - -# We roll "comment" and "correspond" into the same handler. - -sub comment { - my ($action) = @_; - my (%data, $id, @files, @bcc, @cc, $msg, $wtime, $edit); - my $bad = 0; - - while (@ARGV) { - $_ = shift @ARGV; - - if (/^-e$/) { - $edit = 1; - } - elsif (/^-[abcmw]$/) { - unless (@ARGV) { - whine "No argument specified with $_."; - $bad = 1; last; - } - - if (/-a/) { - unless (-f $ARGV[0] && -r $ARGV[0]) { - whine "Cannot read attachment: '$ARGV[0]'."; - exit -1; - } - push @files, shift @ARGV; - } - elsif (/-([bc])/) { - my $a = $_ eq "-b" ? \@bcc : \@cc; - @$a = split /\s*,\s*/, shift @ARGV; - } - elsif (/-m/) { $msg = shift @ARGV } - elsif (/-w/) { $wtime = shift @ARGV } - } - elsif (!$id && m|^(?:ticket/)?($idlist)$|) { - $id = $1; - } - else { - my $datum = /^-/ ? "option" : "argument"; - whine "Unrecognised $datum '$_'."; - $bad = 1; last; - } - } - - unless ($id) { - whine "No object specified."; - $bad = 1; - } - return help($action, "ticket") if $bad; - - my $form = [ - "", - [ "Ticket", "Action", "Cc", "Bcc", "Attachment", "TimeWorked", "Text" ], - { - Ticket => $id, - Action => $action, - Cc => [ @cc ], - Bcc => [ @bcc ], - Attachment => [ @files ], - TimeWorked => $wtime || '', - Text => $msg || '', - } - ]; - - my $text = Form::compose([ $form ]); - - if ($edit || !$msg) { - my $error = 0; - my ($c, $o, $k, $e); - - do { - my $ntext = vi($text); - exit if ($error && $ntext eq $text); - $text = $ntext; - $form = Form::parse($text); - $error = 0; - - ($c, $o, $k, $e) = @{ $form->[0] }; - if ($e) { - $error = 1; - $c = "# Syntax error."; - goto NEXT; - } - elsif (!@$o) { - exit; - } - @files = @{ vsplit($k->{Attachment}) }; - - NEXT: - $text = Form::compose([[$c, $o, $k, $e]]); - } while ($error); - } - - my $i = 1; - foreach my $file (@files) { - $data{"attachment_$i"} = bless([ $file ], "Attachment"); - $i++; - } - $data{content} = $text; - - my $r = submit("$REST/ticket/comment/$id", \%data); - print $r->content; -} - -# Merge one ticket into another. - -sub merge { - my @id; - my $bad = 0; - - while (@ARGV) { - $_ = shift @ARGV; - - if (/^\d+$/) { - push @id, $_; - } - else { - whine "Unrecognised argument: '$_'."; - $bad = 1; last; - } - } - - unless (@id == 2) { - my $evil = @id > 2 ? "many" : "few"; - whine "Too $evil arguments specified."; - $bad = 1; - } - return help("merge", "ticket") if $bad; - - my $r = submit("$REST/ticket/merge/$id[0]", {into => $id[1]}); - print $r->content; -} - -# Link one ticket to another. - -sub link { - my ($bad, $del, %data) = (0, 0, ()); - my %ltypes = map { lc $_ => $_ } qw(DependsOn DependedOnBy RefersTo - ReferredToBy HasMember MemberOf); - - while (@ARGV && $ARGV[0] =~ /^-/) { - $_ = shift @ARGV; - - if (/^-d$/) { - $del = 1; - } - else { - whine "Unrecognised option: '$_'."; - $bad = 1; last; - } - } - - if (@ARGV == 3) { - my ($from, $rel, $to) = @ARGV; - if ($from !~ /^\d+$/ || $to !~ /^\d+$/) { - my $bad = $from =~ /^\d+$/ ? $to : $from; - whine "Invalid ticket ID '$bad' specified."; - $bad = 1; - } - unless (exists $ltypes{lc $rel}) { - whine "Invalid relationship '$rel' specified."; - $bad = 1; - } - %data = (id => $from, rel => $rel, to => $to, del => $del); - } - else { - my $bad = @ARGV < 3 ? "few" : "many"; - whine "Too $bad arguments specified."; - $bad = 1; - } - return help("link", "ticket") if $bad; - - my $r = submit("$REST/ticket/link", \%data); - print $r->content; -} - -# Grant/revoke a user's rights. - -sub grant { - my ($cmd) = @_; - - my $revoke = 0; - while (@ARGV) { - } - - $revoke = 1 if $cmd->{action} eq 'revoke'; -} - -# Client <-> Server communication. -# -------------------------------- -# -# This function composes and sends an HTTP request to the RT server, and -# interprets the response. It takes a request URI, and optional request -# data (a string, or a reference to a set of key-value pairs). - -sub submit { - my ($uri, $content) = @_; - my ($req, $data); - my $ua = new LWP::UserAgent(agent => "RT/3.0b", env_proxy => 1); - - # Did the caller specify any data to send with the request? - $data = []; - if (defined $content) { - unless (ref $content) { - # If it's just a string, make sure LWP handles it properly. - # (By pretending that it's a file!) - $content = [ content => [undef, "", Content => $content] ]; - } - elsif (ref $content eq 'HASH') { - my @data; - foreach my $k (keys %$content) { - if (ref $content->{$k} eq 'ARRAY') { - foreach my $v (@{ $content->{$k} }) { - push @data, $k, $v; - } - } - else { push @data, $k, $content->{$k} } - } - $content = \@data; - } - $data = $content; - } - - # Should we send authentication information to start a new session? - if (!defined $session->cookie) { - push @$data, ( user => $config{user} ); - push @$data, ( pass => $config{passwd} || read_passwd() ); - } - - # Now, we construct the request. - if (@$data) { - $req = POST($uri, $data, Content_Type => 'form-data'); - } - else { - $req = GET($uri); - } - $session->add_cookie_header($req); - - # Then we send the request and parse the response. - DEBUG(3, $req->as_string); - my $res = $ua->request($req); - DEBUG(3, $res->as_string); - - if ($res->is_success) { - # The content of the response we get from the RT server consists - # of an HTTP-like status line followed by optional header lines, - # a blank line, and arbitrary text. - - my ($head, $text) = split /\n\n/, $res->content, 2; - my ($status, @headers) = split /\n/, $head; - $text =~ s/\n*$/\n/; - - # "RT/3.0.1 401 Credentials required" - if ($status !~ m#^RT/\d+(?:\.\d+)+(?:-?\w+)? (\d+) ([\w\s]+)$#) { - warn "rt: Malformed RT response from $config{server}.\n"; - warn "(Rerun with RTDEBUG=3 for details.)\n" if $config{debug} < 3; - exit -1; - } - - # Our caller can pretend that the server returned a custom HTTP - # response code and message. (Doing that directly is apparently - # not sufficiently portable and uncomplicated.) - $res->code($1); - $res->message($2); - $res->content($text); - $session->update($res) if ($res->is_success || $res->code != 401); - - if (!$res->is_success) { - # We can deal with authentication failures ourselves. Either - # we sent invalid credentials, or our session has expired. - if ($res->code == 401) { - my %d = @$data; - if (exists $d{user}) { - warn "rt: Incorrect username or password.\n"; - exit -1; - } - elsif ($req->header("Cookie")) { - # We'll retry the request with credentials, unless - # we only wanted to logout in the first place. - $session->delete; - return submit(@_) unless $uri eq "$REST/logout"; - } - } - # Conflicts should be dealt with by the handler and user. - # For anything else, we just die. - elsif ($res->code != 409) { - warn "rt: ", $res->content; - exit; - } - } - } - else { - warn "rt: Server error: ", $res->message, " (", $res->code, ")\n"; - exit -1; - } - - return $res; -} - -# Session management. -# ------------------- -# -# Maintains a list of active sessions in the ~/.rt_sessions file. -{ - package Session; - my ($s, $u); - - # Initialises the session cache. - sub new { - my ($class, $file) = @_; - my $self = { - file => $file || "$HOME/.rt_sessions", - sids => { } - }; - - # The current session is identified by the currently configured - # server and user. - ($s, $u) = @config{"server", "user"}; - - bless $self, $class; - $self->load(); - - return $self; - } - - # Returns the current session cookie. - sub cookie { - my ($self) = @_; - my $cookie = $self->{sids}{$s}{$u}; - return defined $cookie ? "RT_SID=$cookie" : undef; - } - - # Deletes the current session cookie. - sub delete { - my ($self) = @_; - delete $self->{sids}{$s}{$u}; - } - - # Adds a Cookie header to an outgoing HTTP request. - sub add_cookie_header { - my ($self, $request) = @_; - my $cookie = $self->cookie(); - - $request->header(Cookie => $cookie) if defined $cookie; - } - - # Extracts the Set-Cookie header from an HTTP response, and updates - # session information accordingly. - sub update { - my ($self, $response) = @_; - my $cookie = $response->header("Set-Cookie"); - - if (defined $cookie && $cookie =~ /^RT_SID=([0-9A-Fa-f]+);/) { - $self->{sids}{$s}{$u} = $1; - } - } - - # Loads the session cache from the specified file. - sub load { - my ($self, $file) = @_; - $file ||= $self->{file}; - local *F; - - open(F, $file) && do { - $self->{file} = $file; - my $sids = $self->{sids} = {}; - while (<F>) { - chomp; - next if /^$/ || /^#/; - next unless m#^https?://[^ ]+ \w+ [0-9A-Fa-f]+$#; - my ($server, $user, $cookie) = split / /, $_; - $sids->{$server}{$user} = $cookie; - } - return 1; - }; - return 0; - } - - # Writes the current session cache to the specified file. - sub save { - my ($self, $file) = shift; - $file ||= $self->{file}; - local *F; - - open(F, ">$file") && do { - my $sids = $self->{sids}; - foreach my $server (keys %$sids) { - foreach my $user (keys %{ $sids->{$server} }) { - my $sid = $sids->{$server}{$user}; - if (defined $sid) { - print F "$server $user $sid\n"; - } - } - } - close(F); - chmod 0600, $file; - return 1; - }; - return 0; - } - - sub DESTROY { - my $self = shift; - $self->save; - } -} - -# Form handling. -# -------------- -# -# Forms are RFC822-style sets of (field, value) specifications with some -# initial comments and interspersed blank lines allowed for convenience. -# Sets of forms are separated by --\n (in a cheap parody of MIME). -# -# Each form is parsed into an array with four elements: commented text -# at the start of the form, an array with the order of keys, a hash with -# key/value pairs, and optional error text if the form syntax was wrong. - -# Returns a reference to an array of parsed forms. -sub Form::parse { - my $state = 0; - my @forms = (); - my @lines = split /\n/, $_[0]; - my ($c, $o, $k, $e) = ("", [], {}, ""); - - LINE: - while (@lines) { - my $line = shift @lines; - - next LINE if $line eq ''; - - if ($line eq '--') { - # We reached the end of one form. We'll ignore it if it was - # empty, and store it otherwise, errors and all. - if ($e || $c || @$o) { - push @forms, [ $c, $o, $k, $e ]; - $c = ""; $o = []; $k = {}; $e = ""; - } - $state = 0; - } - elsif ($state != -1) { - if ($state == 0 && $line =~ /^#/) { - # Read an optional block of comments (only) at the start - # of the form. - $state = 1; - $c = $line; - while (@lines && $lines[0] =~ /^#/) { - $c .= "\n".shift @lines; - } - $c .= "\n"; - } - elsif ($state <= 1 && $line =~ /^($field):(?:\s+(.*))?$/) { - # Read a field: value specification. - my $f = $1; - my @v = ($2 || ()); - - # Read continuation lines, if any. - while (@lines && ($lines[0] eq '' || $lines[0] =~ /^\s+/)) { - push @v, shift @lines; - } - pop @v while (@v && $v[-1] eq ''); - - # Strip longest common leading indent from text. - my $ws = ""; - foreach my $ls (map {/^(\s+)/} @v[1..$#v]) { - $ws = $ls if (!$ws || length($ls) < length($ws)); - } - s/^$ws// foreach @v; - - push(@$o, $f) unless exists $k->{$f}; - vpush($k, $f, join("\n", @v)); - - $state = 1; - } - elsif ($line !~ /^#/) { - # We've found a syntax error, so we'll reconstruct the - # form parsed thus far, and add an error marker. (>>) - $state = -1; - $e = Form::compose([[ "", $o, $k, "" ]]); - $e.= $line =~ /^>>/ ? "$line\n" : ">> $line\n"; - } - } - else { - # We saw a syntax error earlier, so we'll accumulate the - # contents of this form until the end. - $e .= "$line\n"; - } - } - push(@forms, [ $c, $o, $k, $e ]) if ($e || $c || @$o); - - foreach my $l (keys %$k) { - $k->{$l} = vsplit($k->{$l}) if (ref $k->{$l} eq 'ARRAY'); - } - - return \@forms; -} - -# Returns text representing a set of forms. -sub Form::compose { - my ($forms) = @_; - my @text; - - foreach my $form (@$forms) { - my ($c, $o, $k, $e) = @$form; - my $text = ""; - - if ($c) { - $c =~ s/\n*$/\n/; - $text = "$c\n"; - } - if ($e) { - $text .= $e; - } - elsif ($o) { - my @lines; - - foreach my $key (@$o) { - my ($line, $sp); - my $v = $k->{$key}; - my @values = ref $v eq 'ARRAY' ? @$v : $v; - - $sp = " "x(length("$key: ")); - $sp = " "x4 if length($sp) > 16; - - foreach $v (@values) { - if ($v =~ /\n/) { - $v =~ s/^/$sp/gm; - $v =~ s/^$sp//; - - if ($line) { - push @lines, "$line\n\n"; - $line = ""; - } - elsif (@lines && $lines[-1] !~ /\n\n$/) { - $lines[-1] .= "\n"; - } - push @lines, "$key: $v\n\n"; - } - elsif ($line && - length($line)+length($v)-rindex($line, "\n") >= 70) - { - $line .= ",\n$sp$v"; - } - else { - $line = $line ? "$line, $v" : "$key: $v"; - } - } - - $line = "$key:" unless @values; - if ($line) { - if ($line =~ /\n/) { - if (@lines && $lines[-1] !~ /\n\n$/) { - $lines[-1] .= "\n"; - } - $line .= "\n"; - } - push @lines, "$line\n"; - } - } - - $text .= join "", @lines; - } - else { - chomp $text; - } - push @text, $text; - } - - return join "\n--\n\n", @text; -} - -# Configuration. -# -------------- - -# Returns configuration information from the environment. -sub config_from_env { - my %env; - - foreach my $k ("DEBUG", "USER", "PASSWD", "SERVER") { - if (exists $ENV{"RT$k"}) { - $env{lc $k} = $ENV{"RT$k"}; - } - } - - return %env; -} - -# Finds a suitable configuration file and returns information from it. -sub config_from_file { - my ($rc) = @_; - - if ($rc =~ m#^/#) { - # We'll use an absolute path if we were given one. - return parse_config_file($rc); - } - else { - # Otherwise we'll use the first file we can find in the current - # directory, or in one of its (increasingly distant) ancestors. - - my @dirs = split /\//, cwd; - while (@dirs) { - my $file = join('/', @dirs, $rc); - if (-r $file) { - return parse_config_file($file); - } - - # Remove the last directory component each time. - pop @dirs; - } - - # Still nothing? We'll fall back to some likely defaults. - for ("$HOME/$rc", "/etc/rt.conf") { - return parse_config_file($_) if (-r $_); - } - } - - return (); -} - -# Makes a hash of the specified configuration file. -sub parse_config_file { - my %cfg; - my ($file) = @_; - - open(CFG, $file) && do { - while (<CFG>) { - chomp; - next if (/^#/ || /^\s*$/); - - if (/^(user|passwd|server)\s+([^ ]+)$/) { - $cfg{$1} = $2; - } - else { - die "rt: $file:$.: unknown configuration directive.\n"; - } - } - }; - - return %cfg; -} - -# Helper functions. -# ----------------- - -sub whine { - my $sub = (caller(1))[3]; - $sub =~ s/^main:://; - warn "rt: $sub: @_\n"; - return; -} - -sub read_passwd { - eval 'require Term::ReadKey'; - if ($@) { - die "No password specified (and Term::ReadKey not installed).\n"; - } - - print "Password: "; - Term::ReadKey::ReadMode('noecho'); - chomp(my $passwd = Term::ReadKey::ReadLine(0)); - Term::ReadKey::ReadMode('restore'); - print "\n"; - - return $passwd; -} - -sub vi { - my ($text) = @_; - my $file = "/tmp/rt.form.$$"; - my $editor = $ENV{EDITOR} || $ENV{VISUAL} || "vi"; - - local *F; - local $/ = undef; - - open(F, ">$file") || die "$file: $!\n"; print F $text; close(F); - system($editor, $file) && die "Couldn't run $editor.\n"; - open(F, $file) || die "$file: $!\n"; $text = <F>; close(F); - unlink($file); - - return $text; -} - -# Add a value to a (possibly multi-valued) hash key. -sub vpush { - my ($hash, $key, $val) = @_; - my @val = ref $val eq 'ARRAY' ? @$val : $val; - - if (exists $hash->{$key}) { - unless (ref $hash->{$key} eq 'ARRAY') { - my @v = $hash->{$key} ne '' ? $hash->{$key} : (); - $hash->{$key} = \@v; - } - push @{ $hash->{$key} }, @val; - } - else { - $hash->{$key} = $val; - } -} - -# "Normalise" a hash key that's known to be multi-valued. -sub vsplit { - my ($val) = @_; - my ($word, @words); - my @values = ref $val eq 'ARRAY' ? @$val : $val; - - foreach my $line (map {split /\n/} @values) { - # XXX: This should become a real parser, à la Text::ParseWords. - $line =~ s/^\s+//; - $line =~ s/\s+$//; - push @words, split /\s*,\s*/, $line; - } - - return \@words; -} - -sub expand_list { - my ($list) = @_; - my ($elt, @elts, %elts); - - foreach $elt (split /,/, $list) { - if ($elt =~ /^(\d+)-(\d+)$/) { push @elts, ($1..$2) } - else { push @elts, $elt } - } - - @elts{@elts}=(); - return sort {$a<=>$b} keys %elts; -} - -sub get_type_argument { - my $type; - - if (@ARGV) { - $type = shift @ARGV; - unless ($type =~ /^[A-Za-z0-9_.-]+$/) { - # We want whine to mention our caller, not us. - @_ = ("Invalid type '$type' specified."); - goto &whine; - } - } - else { - @_ = ("No type argument specified with -t."); - goto &whine; - } - - $type =~ s/s$//; # "Plural". Ugh. - return $type; -} - -sub get_var_argument { - my ($data) = @_; - - if (@ARGV) { - my $kv = shift @ARGV; - if (my ($k, $v) = $kv =~ /^($field)=(.*)$/) { - push @{ $data->{$k} }, $v; - } - else { - @_ = ("Invalid variable specification: '$kv'."); - goto &whine; - } - } - else { - @_ = ("No variable argument specified with -S."); - goto &whine; - } -} - -sub is_object_spec { - my ($spec, $type) = @_; - - $spec =~ s|^(?:$type/)?|$type/| if defined $type; - return $spec if ($spec =~ m{^$name/(?:$idlist|$labels)(?:/.*)?$}o); - return; -} - -__DATA__ - -Title: intro -Title: introduction -Text: - - ** THIS IS AN UNSUPPORTED PREVIEW RELEASE ** - ** PLEASE REPORT BUGS TO rt-bugs@fsck.com ** - - This is a command-line interface to RT 3. - - It allows you to interact with an RT server over HTTP, and offers an - interface to RT's functionality that is better-suited to automation - and integration with other tools. - - In general, each invocation of this program should specify an action - to perform on one or more objects, and any other arguments required - to complete the desired action. - - For more information: - - - rt help actions (a list of possible actions) - - rt help objects (how to specify objects) - - rt help usage (syntax information) - - - rt help config (configuration details) - - rt help examples (a few useful examples) - - rt help topics (a list of help topics) - --- - -Title: usage -Title: syntax -Text: - - Syntax: - - rt <action> [options] [arguments] - - Each invocation of this program must specify an action (e.g. "edit", - "create"), options to modify behaviour, and other arguments required - by the specified action. (For example, most actions expect a list of - numeric object IDs to act upon.) - - The details of the syntax and arguments for each action are given by - "rt help <action>". Some actions may be referred to by more than one - name ("create" is the same as "new", for example). - - Objects are identified by a type and an ID (which can be a name or a - number, depending on the type). For some actions, the object type is - implied (you can only comment on tickets); for others, the user must - specify it explicitly. See "rt help objects" for details. - - In syntax descriptions, mandatory arguments that must be replaced by - appropriate value are enclosed in <>, and optional arguments are - indicated by [] (for example, <action> and [options] above). - - For more information: - - - rt help objects (how to specify objects) - - rt help actions (a list of actions) - - rt help types (a list of object types) - --- - -Title: conf -Title: config -Title: configuration -Text: - - This program has two major sources of configuration information: its - configuration files, and the environment. - - The program looks for configuration directives in a file named .rtrc - (or $RTCONFIG; see below) in the current directory, and then in more - distant ancestors, until it reaches /. If no suitable configuration - files are found, it will also check for ~/.rtrc and /etc/rt.conf. - - Configuration directives: - - The following directives may occur, one per line: - - - server <URL> URL to RT server. - - user <username> RT username. - - passwd <passwd> RT user's password. - - Blank and #-commented lines are ignored. - - Environment variables: - - The following environment variables override any corresponding - values defined in configuration files: - - - RTUSER - - RTPASSWD - - RTSERVER - - RTDEBUG Numeric debug level. (Set to 3 for full logs.) - - RTCONFIG Specifies a name other than ".rtrc" for the - configuration file. - --- - -Title: objects -Text: - - Syntax: - - <type>/<id>[/<attributes>] - - Every object in RT has a type (e.g. "ticket", "queue") and a numeric - ID. Some types of objects can also be identified by name (like users - and queues). Furthermore, objects may have named attributes (such as - "ticket/1/history"). - - An object specification is like a path in a virtual filesystem, with - object types as top-level directories, object IDs as subdirectories, - and named attributes as further subdirectories. - - A comma-separated list of names, numeric IDs, or numeric ranges can - be used to specify more than one object of the same type. Note that - the list must be a single argument (i.e., no spaces). For example, - "user/root,1-3,5,7-10,ams" is a list of ten users; the same list - can also be written as "user/ams,root,1,2,3,5,7,8-20". - - Examples: - - ticket/1 - ticket/1/attachments - ticket/1/attachments/3 - ticket/1/attachments/3/content - ticket/1-3/links - ticket/1-3,5-7/history - - user/ams - user/ams/rights - user/ams,rai,1/rights - - For more information: - - - rt help <action> (action-specific details) - - rt help <type> (type-specific details) - --- - -Title: actions -Title: commands -Text: - - You can currently perform the following actions on all objects: - - - list (list objects matching some condition) - - show (display object details) - - edit (edit object details) - - create (create a new object) - - Each type may define actions specific to itself; these are listed in - the help item about that type. - - For more information: - - - rt help <action> (action-specific details) - - rt help types (a list of possible types) - --- - -Title: types -Text: - - You can currently operate on the following types of objects: - - - tickets - - users - - groups - - queues - - For more information: - - - rt help <type> (type-specific details) - - rt help objects (how to specify objects) - - rt help actions (a list of possible actions) - --- - -Title: ticket -Text: - - Tickets are identified by a numeric ID. - - The following generic operations may be performed upon tickets: - - - list - - show - - edit - - create - - In addition, the following ticket-specific actions exist: - - - link - - merge - - comment - - correspond - - Attributes: - - The following attributes can be used with "rt show" or "rt edit" - to retrieve or edit other information associated with tickets: - - links A ticket's relationships with others. - history All of a ticket's transactions. - history/type/<type> Only a particular type of transaction. - history/id/<id> Only the transaction of the specified id. - attachments A list of attachments. - attachments/<id> The metadata for an individual attachment. - attachments/<id>/content The content of an individual attachment. - --- - -Title: user -Title: group -Text: - - Users and groups are identified by name or numeric ID. - - The following generic operations may be performed upon them: - - - list - - show - - edit - - create - - In addition, the following type-specific actions exist: - - - grant - - revoke - - Attributes: - - The following attributes can be used with "rt show" or "rt edit" - to retrieve or edit other information associated with users and - groups: - - rights Global rights granted to this user. - rights/<queue> Queue rights for this user. - --- - -Title: queue -Text: - - Queues are identified by name or numeric ID. - - Currently, they can be subjected to the following actions: - - - show - - edit - - create - --- - -Title: logout -Text: - - Syntax: - - rt logout - - Terminates the currently established login session. You will need to - provide authentication credentials before you can continue using the - server. (See "rt help config" for details about authentication.) - --- - -Title: ls -Title: list -Title: search -Text: - - Syntax: - - rt <ls|list|search> [options] "query string" - - Displays a list of objects matching the specified conditions. - ("ls", "list", and "search" are synonyms.) - - Conditions are expressed in the SQL-like syntax used internally by - RT3. (For more information, see "rt help query".) The query string - must be supplied as one argument. - - (Right now, the server doesn't support listing anything but tickets. - Other types will be supported in future; this client will be able to - take advantage of that support without any changes.) - - Options: - - The following options control how much information is displayed - about each matching object: - - -i Numeric IDs only. (Useful for |rt edit -; see examples.) - -s Short description. - -l Longer description. - - In addition, - - -o +/-<field> Orders the returned list by the specified field. - -S var=val Submits the specified variable with the request. - -t type Specifies the type of object to look for. (The - default is "ticket".) - - Examples: - - rt ls "Priority > 5 and Status='new'" - rt ls -o +Subject "Priority > 5 and Status='new'" - rt ls -o -Created "Priority > 5 and Status='new'" - rt ls -i "Priority > 5"|rt edit - set status=resolved - rt ls -t ticket "Subject like '[PATCH]%'" - --- - -Title: show -Text: - - Syntax: - - rt show [options] <object-ids> - - Displays details of the specified objects. - - For some types, object information is further classified into named - attributes (for example, "1-3/links" is a valid ticket specification - that refers to the links for tickets 1-3). Consult "rt help <type>" - and "rt help objects" for further details. - - This command writes a set of forms representing the requested object - data to STDOUT. - - Options: - - - Read IDs from STDIN instead of the command-line. - -t type Specifies object type. - -f a,b,c Restrict the display to the specified fields. - -S var=val Submits the specified variable with the request. - - Examples: - - rt show -t ticket -f id,subject,status 1-3 - rt show ticket/3/attachments/29 - rt show ticket/3/attachments/29/content - rt show ticket/1-3/links - rt show -t user 2 - --- - -Title: new -Title: edit -Title: create -Text: - - Syntax: - - rt edit [options] <object-ids> set field=value [field=value] ... - add field=value [field=value] ... - del field=value [field=value] ... - - Edits information corresponding to the specified objects. - - If, instead of "edit", an action of "new" or "create" is specified, - then a new object is created. In this case, no numeric object IDs - may be specified, but the syntax and behaviour remain otherwise - unchanged. - - This command typically starts an editor to allow you to edit object - data in a form for submission. If you specified enough information - on the command-line, however, it will make the submission directly. - - The command line may specify field-values in three different ways. - "set" sets the named field to the given value, "add" adds a value - to a multi-valued field, and "del" deletes the corresponding value. - Each "field=value" specification must be given as a single argument. - - For some types, object information is further classified into named - attributes (for example, "1-3/links" is a valid ticket specification - that refers to the links for tickets 1-3). These attributes may also - be edited. Consult "rt help <type>" and "rt help object" for further - details. - - Options: - - - Read numeric IDs from STDIN instead of the command-line. - (Useful with rt ls ... | rt edit -; see examples below.) - -i Read a completed form from STDIN before submitting. - -o Dump the completed form to STDOUT instead of submitting. - -e Allows you to edit the form even if the command-line has - enough information to make a submission directly. - -S var=val - Submits the specified variable with the request. - -t type Specifies object type. - - Examples: - - # Interactive (starts $EDITOR with a form). - rt edit ticket/3 - rt create -t ticket - - # Non-interactive. - rt edit ticket/1-3 add cc=foo@example.com set priority=3 - rt ls -t tickets -i 'Priority > 5' | rt edit - set status=resolved - rt edit ticket/4 set priority=3 owner=bar@example.com \ - add cc=foo@example.com bcc=quux@example.net - rt create -t ticket subject='new ticket' priority=10 \ - add cc=foo@example.com - --- - -Title: comment -Title: correspond -Text: - - Syntax: - - rt <comment|correspond> [options] <ticket-id> - - Adds a comment (or correspondence) to the specified ticket (the only - difference being that comments aren't sent to the requestors.) - - This command will typically start an editor and allow you to type a - comment into a form. If, however, you specified all the necessary - information on the command line, it submits the comment directly. - - (See "rt help forms" for more information about forms.) - - Options: - - -m <text> Specify comment text. - -a <file> Attach a file to the comment. (May be used more - than once to attach multiple files.) - -c <addrs> A comma-separated list of Cc addresses. - -b <addrs> A comma-separated list of Bcc addresses. - -w <time> Specify the time spent working on this ticket. - -e Starts an editor before the submission, even if - arguments from the command line were sufficient. - - Examples: - - rt comment -t 'Not worth fixing.' -a stddisclaimer.h 23 - --- - -Title: merge -Text: - - Syntax: - - rt merge <from-id> <to-id> - - Merges the two specified tickets. - --- - -Title: link -Text: - - Syntax: - - rt link [-d] <id-A> <relationship> <id-B> - - Creates (or, with -d, deletes) a link between the specified tickets. - The relationship can (irrespective of case) be any of: - - DependsOn/DependedOnBy: A depends upon B (or vice versa). - RefersTo/ReferredToBy: A refers to B (or vice versa). - MemberOf/HasMember: A is a member of B (or vice versa). - - To view a ticket's relationships, use "rt show ticket/3/links". (See - "rt help ticket" and "rt help show".) - - Options: - - -d Deletes the specified link. - - Examples: - - rt link 2 dependson 3 - rt link -d 4 referredtoby 6 # 6 no longer refers to 4 - --- - -Title: grant -Title: revoke -Text: - --- - -Title: query -Text: - - RT3 uses an SQL-like syntax to specify object selection constraints. - See the <RT:...> documentation for details. - - (XXX: I'm going to have to write it, aren't I?) - --- - -Title: form -Title: forms -Text: - - This program uses RFC822 header-style forms to represent object data - in a form that's suitable for processing both by humans and scripts. - - A form is a set of (field, value) specifications, with some initial - commented text and interspersed blank lines allowed for convenience. - Field names may appear more than once in a form; a comma-separated - list of multiple field values may also be specified directly. - - Field values can be wrapped as in RFC822, with leading whitespace. - The longest sequence of leading whitespace common to all the lines - is removed (preserving further indentation). There is no limit on - the length of a value. - - Multiple forms are separated by a line containing only "--\n". - - (XXX: A more detailed specification will be provided soon. For now, - the server-side syntax checking will suffice.) - --- - -Title: topics -Text: - - Use "rt help <topic>" for help on any of the following subjects: - - - tickets, users, groups, queues. - - show, edit, ls/list/search, new/create. - - - query (search query syntax) - - forms (form specification) - - - objects (how to specify objects) - - types (a list of object types) - - actions/commands (a list of actions) - - usage/syntax (syntax details) - - conf/config/configuration (configuration details) - - examples (a few useful examples) - --- - -Title: example -Title: examples -Text: - - This section will be filled in with useful examples, once it becomes - more clear what examples may be useful. - - For the moment, please consult examples provided with each action. - --- diff --git a/rt/bin/rt-commit-handler.in b/rt/bin/rt-commit-handler.in deleted file mode 100644 index 02b01abff..000000000 --- a/rt/bin/rt-commit-handler.in +++ /dev/null @@ -1,846 +0,0 @@ -#!@PERL@ -w -# 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 - -# {{{ Docs -# -*-Perl-*- -# -#ident "@(#)ccvs/contrib:$Name: $:$Id: rt-commit-handler.in,v 1.1 2003-07-15 13:16:15 ivan Exp $" -# -# Perl filter to handle the log messages from the checkin of files in multiple -# directories. This script will group the lists of files by log message, and -# send one piece of mail per unique message, no matter how many files are -# committed. - -=head1 NAME rt-commit-handler - -=head1 USAGE - - - -=head2 Regular use - -Stick the following in in CVSROOT/commitinfo - - ALL @RT_BIN_PATH@/rt-commit-handler --record-last-dir - -Stick the following in CVSROOT/loginfo - - ALL @RT_BIN_PATH@/rt-commit-handler --cvs-root /pathtocvs/root --rt %{Vvts} - -=head2 Invocation (advanced use) - -rt-commit-handler --cvs-root /path/to/cvs/root [-d] [-D] [-r] [-M module] \ - [[-m mailto] ...] [[-R replyto] ...] [-f logfile] - - - -d - turn on debugging - -m mailto - send mail to "mailto" (multiple) - -R replyto - set the "Reply-To:" to "replyto" (multiple) - -M modulename - set module name to "modulename" - -f logfile - write commit messages to logfile too - -D - generate diff commands - --rt - invoke RT commit handler - --cvs-root - specify your CVS root - - --record-last-dir - Record the last directory with changes in - pre-commit (commitinfo) mode - - -=cut - -# }}} - -use strict; -use Carp; -use Getopt::Long; -use Text::Wrap; -use Digest::MD5; -use MIME::Entity; - -use lib ("@RT_LIB_PATH@", "@LOCAL_LIB_PATH@"); - -use RT::Interface::CLI qw(CleanEnv GetCurrentUser GetMessageContent loc); - -use vars - qw(@MAILER $TMPDIR $FILE_PREFIX $LASTDIR_FILE $HASH_FILE $VERSION_FILE $MESSAGE_FILE $MAIL_FILE $DEBUG $MAILTO $REPLYTO $id $MODULE_NAME - $LOGIN $COMMITLOG $CVS_ROOT $RT_HANDLER); - -#Clean out all the nasties from the environment -CleanEnv(); - -#Load etc/config.pm and drop privs -RT::LoadConfig(); - -#Drop setgid permissions -RT::DropSetGIDPermissions(); - -# {{{ Variable setup -$TMPDIR = '/tmp'; -$FILE_PREFIX = $TMPDIR . '/#cvs.'; - -# The root of your CVS install. we should get this from some smarter place. -# It needs a trailing / - -$LASTDIR_FILE = $FILE_PREFIX . "lastdir"; -$HASH_FILE = $FILE_PREFIX . "hash"; -$VERSION_FILE = $FILE_PREFIX . "version"; -$MESSAGE_FILE = $FILE_PREFIX . "message"; -$MAIL_FILE = $FILE_PREFIX . "mail"; - -$DEBUG = 0; -$RT_HANDLER = 1; - -$MAILTO = ''; - -my @files = (); -my (@log_lines); -my $do_diff = 0; -my $id = getpgrp(); # note, you *must* use a shell which does setpgrp() -$LOGIN = getpwuid($<); - -# }}} - -die "User could not be found" unless ($LOGIN); - -# {{{ parse command line arguments (file list is seen as one arg) -# -while ( my $arg = shift @ARGV ) { - - if ( $arg eq '-d' ) { - $DEBUG = 1; - warn "Debug turned on...\n"; - } - elsif ( $arg =~ /^--record-last-dir$/i ) { - record_last_dir( $id, $ARGV[0] ); - exit(0); - } - elsif ( $arg eq '-m' ) { - $MAILTO .= ", " if $MAILTO; - $MAILTO .= shift @ARGV; - } - elsif ( $arg eq '--rt' ) { - $RT_HANDLER = 1; - } - elsif ( $arg eq '-R' ) { - $REPLYTO .= ", " if $REPLYTO; - $REPLYTO .= shift @ARGV; - } - elsif ( $arg eq '-M' ) { - die ("too many '-M' args\n") if $MODULE_NAME; - $MODULE_NAME = shift @ARGV; - } - elsif ( $arg eq '--cvs-root' ) { - $CVS_ROOT = shift @ARGV; - $CVS_ROOT .= "/" unless ( $CVS_ROOT =~ /\/$/ ); - } - elsif ( $arg eq '-f' ) { - die ("too many '-f' args\n") if $COMMITLOG; - $COMMITLOG = shift @ARGV; - - # This is a disgusting hack to untaint $COMMITLOG if we're running from - # setgid cvs. - $COMMITLOG = untaint($COMMITLOG); - } - elsif ( $arg eq '-D' ) { - $do_diff = 1; - } - else { - @files = split ( ' ', $arg ); - last; - } -} - -# }}} - -$REPLYTO = $LOGIN unless ($REPLYTO); - -# for now, the first "file" is the repository directory being committed, -# relative to the $CVSROOT location -# -my $dir = shift @files; - -# XXX there are some ugly assumptions in here about module names and -# XXX directories relative to the $CVSROOT location -- really should -# XXX read $CVSROOT/CVSROOT/modules, but that's not so easy to do, since -# XXX we have to parse it backwards. -# -# XXX For now we set the `module' name to the top-level directory name. -# -unless ($MODULE_NAME) { - ($MODULE_NAME) = split ( '/', $dir, 2 ); -} - -if ($DEBUG) { - warn "module - ", $MODULE_NAME, "\n"; - warn "dir - ", $dir, "\n"; - warn "files - ", join ( " ", @files ), "\n"; - warn "id - ", $id, "\n"; -} - -# {{{ Check for a new directory or an import command. - -# -# files[0] - "-" -# files[1] - "New" -# files[2] - "directory" -# -# files[0] - "-" -# files[1] - "Imported" -# files[2] - "sources" -# -if ( $files[0] eq "-" ) { - - #we just don't care about New Directory notes - unless ( $files[1] eq "New" && $files[2] eq "directory" ) { - - my @text = (); - - push @text, build_header(); - push @text, ""; - - while ( my $line = <STDIN> ) { - chop $line; # Drop the newline - push @text, $line; - } - - append_logfile( $COMMITLOG, @text ) if ($COMMITLOG); - - mail_notification( $id, @text ); - } - - exit 0; -} - -# }}} - -# {{{ Collect just the log message from stdin. -# - -while ( my $line = <STDIN> ) { - chop $line; # strip the newline - last if ( $line =~ /^Log Message:$/ ); -} -while ( my $line = <STDIN> ) { - chop $line; # strip the newline - $line =~ s/\s+$//; # strip trailing white space - push @log_lines, $line; -} - -my $md5 = Digest::MD5->new(); -foreach my $line (@log_lines) { - $md5->add( $line . "\n" ); -} -my $hash = $md5->hexdigest(); - -warn "hash = $hash\n" if ($DEBUG); - -if ( !-e "$MESSAGE_FILE.$id.$hash" ) { - append_logfile( "$HASH_FILE.$id", $hash ); - write_file( "$MESSAGE_FILE.$id.$hash", @log_lines ); -} - -# }}} - -# Spit out the information gathered in this pass. - -append_logfile( "$VERSION_FILE.$id.$hash", $dir . '/', @files ); - -# {{{ Check whether this is the last directory. If not, quit. - -warn "Checking current dir against last dir $LASTDIR_FILE.$id\n" if ($DEBUG); - -my @last_dir = read_file("$LASTDIR_FILE.$id"); - -unless ($CVS_ROOT) { - die "No cvs root specified with --cvs-root. Can't continue."; -} - -if ( $last_dir[0] ne $CVS_ROOT . $dir ) { - warn "Current directory $CVS_ROOT$dir is not last directory $last_dir[0].\n" - if ($DEBUG); - exit 0; -} - -# }}} - -# {{{ End Of Commits! -# - -# This is it. The commits are all finished. Lump everything together -# into a single message, fire a copy off to the mailing list, and drop -# it on the end of the Changes file. -# - -# -# Produce the final compilation of the log messages -# - -my @hashes = read_file("$HASH_FILE.$id"); -my (@text); - -push @text, build_header(); -push @text, ""; - -my ( @added_files, @modified_files, @removed_files ); - -foreach my $hash (@hashes) { - - # In case we're running setgid, make sure the hash file hasn't been hacked. - $hash =~ m/([a-z0-9]*)/ || die "*** Hacking attempt detected\n"; - $hash = $1; - - my @files = read_file("$VERSION_FILE.$id.$hash"); - my @log_lines = read_file("$MESSAGE_FILE.$id.$hash"); - - my $working_on_dir; # gets set as we iterate through the files. - foreach my $file (@files) { - - #If we've entered a new directory, make a note of that and remove the trailing / - - if ( $file =~ s'\/$'' ) { - $working_on_dir = $file; - next; - } - - my @file_entry = ( split ( ',', $file, 4 ), $working_on_dir ); - - # file_entry looks like ths: - - # 0 1 2 3 4 - # Old rev : new rev : tag: file :directory - my $entry = {}; - $entry->{'old'} = $file_entry[0]; - $entry->{'new'} = $file_entry[1]; - $entry->{'tag'} = $file_entry[2]; - $entry->{'file'} = $file_entry[3]; - $entry->{'dir'} = $file_entry[4]; - - if ( $file_entry[0] eq 'NONE' ) { - $entry->{'old'} = '0'; - push @added_files, $entry; - } - elsif ( $file_entry[1] eq 'NONE' ) { - $entry->{'new'} = '0'; - push @removed_files, $entry; - } - else { - push @modified_files, $entry; - } - } -} - -# }}} - -# {{{ start building up the body - -# Strip leading and trailing blank lines from the log message. Also -# compress multiple blank lines in the body of the message down to a -# single blank line. -# - -my $blank = 1; -@log_lines = map { - my $wasblank = $blank; - $blank = $_ eq ''; - $blank && $wasblank ? () : $_; -} @log_lines; - -pop @log_lines if $blank; - -@modified_files = order_and_summarize_diffs(@modified_files); -@added_files = order_and_summarize_diffs(@added_files); -@removed_files = order_and_summarize_diffs(@removed_files); - -push @text, "Modified Files:", format_lists(@modified_files) - if (@modified_files); - -push @text, "Added Files:", format_lists(@added_files) if (@added_files); - -push @text, "Removed Files:", format_lists(@removed_files) if (@removed_files); - -push @text, "", "Log Message", @log_lines if (@log_lines); - -push @text, ""; - -if ($RT_HANDLER) { - rt_handler( - @log_lines, "\n", - loc("To generate a diff of this commit:\n"), "\n", - format_diffs( @modified_files, @added_files, @removed_files ) - ); -} - -if ($COMMITLOG) { - append_logfile( $COMMITLOG, @text ); -} - -if ($do_diff) { - push @text, ""; - push @text, loc("To generate a diff of this commit:"); - push @text, format_diffs( @modified_files, @added_files, @removed_files ); - push @text, ""; -} - -# }}} - -# {{{ Mail out the notification. - -mail_notification( $id, @text ); - -# }}} - -# {{{ clean up - -unless ($DEBUG) { - $hash = untaint($hash); - $id = untaint($id); - unlink "$VERSION_FILE.$id.$hash"; - unlink "$MESSAGE_FILE.$id.$hash"; - unlink "$MAIL_FILE.$id"; - unlink "$LASTDIR_FILE.$id"; - unlink "$HASH_FILE.$id"; -} - -# }}} - -exit 0; - -# {{{ Subroutines -# - -# {{{ append_logfile -sub append_logfile { - my $filename = shift; - my (@lines) = @_; - - $filename = untaint($filename); - - open( FILE, ">>$filename" ) - || die ("Cannot open file $filename for append.\n"); - foreach my $line (@lines) { - print FILE $line . "\n"; - } - close(FILE); -} - -# }}} - -# {{{ write_file -sub write_file { - my $filename = shift; - my (@lines) = @_; - - $filename = untaint($filename); - - open( FILE, ">$filename" ) - || die ("Cannot open file $filename for write.\n"); - foreach my $line (@lines) { - print FILE $line . "\n"; - } - close(FILE); -} - -# }}} - -# {{{ read_file -sub read_file { - my $filename = shift; - my (@lines); - - open( FILE, "<$filename" ) - || die ("Cannot open file $filename for read.\n"); - while ( my $line = <FILE> ) { - chop $line; - push @lines, $line; - } - close(FILE); - - return (@lines); -} - -# }}} - -# {{{ sub format_lists - -sub format_lists { - my @items = (@_); - - my $files = ""; - map { - $_->{'files'} && ( $files .= ' ' . join ( ' ', @{ $_->{'files'} } ) ); - } @items; - - my @lines = wrap( "\t", "\t\t", $files ); - return (@lines); - -} - -# }}} - -# {{{ sub format_diffs - -sub format_diffs { - my @items = (@_); - - my @lines; - foreach my $item (@items) { - next unless ( $item->{'files'} ); - push ( @lines, - "cvs diff -r" - . $item->{'old'} . " -r" - . $item->{'new'} . " " - . join ( " ", @{ $item->{'files'} } ) . "\n" ); - - } - - @lines = fill( "\t", "\t\t", @lines ); - - return (@lines); -} - -# }}} - -# {{{ sub order_and_summarize_diffs { - -# takes an array of file items -# returns a sorted array of fileset items, which are like file items, except they can have an array of files, rather than -# a singleton file. - -sub order_and_summarize_diffs { - - my @files = (@_); - - # Sort by tag, dir, file. - @files = sort { - $a->{'tag'} cmp $b->{'tag'} - || $a->{'dir'} cmp $b->{'dir'} - || $a->{'file'} cmp $b->{'file'}; - } @files; - - # Combine adjacent rows that are the same modulo the file name. - - my @items = (undef); - - foreach my $file (@files) { - if ( $#items == -1 #if it's empty - || ( !defined $items[-1]->{'old'} - || $items[-1]->{'old'} ne $file->{'old'} ) - || ( !defined $items[-1]->{'new'} - || $items[-1]->{'new'} ne $file->{'new'} ) - || ( !defined $items[-1]->{'tag'} - || $items[-1]->{'tag'} ne $file->{'tag'} ) ) - { - - push ( @items, $file ); - } - push ( @{ $items[-1]->{'files'} }, - $file->{'dir'} . "/" . $file->{'file'} ); - } - - return (@items); -} - -# }}} - -# {{{ build_header - -sub build_header { - my $now = gmtime; - my $header = - sprintf( "Module Name:\t%s\nCommitted By:\t%s\nDate:\t\t%s %s %s", - $MODULE_NAME, $LOGIN, substr( $now, 0, 19 ), "UTC", - substr( $now, 20, 4 ) ); - return ($header); -} - -# }}} - -# {{{ mail_notification -sub mail_notification { - my $id = shift; - my (@text) = @_; - write_file( "$MAIL_FILE.$id", "From: " . $LOGIN, - "Subject: CVS commit: " . $MODULE_NAME, "To: " . $MAILTO, - "Reply-To: " . $REPLYTO, "", "", @text ); - - my $entity = MIME::Entity->build( - From => $LOGIN, - To => $MAILTO, - Subject => "CVS commit: " . $MODULE_NAME, - 'Reply-To' => $REPLYTO, - Data => join ( "\n", @text ) - ); - if ( $RT::MailCommand eq 'sendmailpipe' ) { - open( MAIL, "|$RT::SendmailPath $RT::SendmailArguments" ) - || die "Couldn't send mail: " . $@ . "\n"; - print MAIL $entity->as_string; - close(MAIL); - } - else { - $entity->send( $RT::MailCommand, $RT::MailParams ); - } - -} - -# }}} - -# {{{ sub record_last_dir - -sub record_last_dir { - my $id = shift; - my $dir = shift; - - # make a note of this directory. later, we'll use this to - # figure out if we've gone through the whole commit, - # for something that is a bad mockery of attomic commits. - - warn "about to write $dir to $LASTDIR_FILE.$id" if ($DEBUG); - - write_file( "$LASTDIR_FILE.$id", $dir ); -} - -# }}} - -# {{{ Get the RT stuff set up - -# {{{ sub rt_handler - -sub rt_handler { - my (@LogMessage) = (@_); - - #Connect to the database and get RT::SystemUser and RT::Nobody loaded - RT::Init; - - require RT::Ticket; - - #Get the current user all loaded - my $CurrentUser = GetCurrentUser(); - - if ( !$CurrentUser->Id ) { - print -loc("No valid RT user found. RT cvs handler disengaged. Please consult your RT administrator.\n"); - return; - } - - my (@commands) = find_commands( \@LogMessage ); - - my ( @tickets, @errors ); - - # Get the list of tickets we're working with out of commands - grep { $_ =~ /^RT-Ticket:\s*(.*?)$/i && push ( @tickets, $1 ) } @commands; - - my $message = new MIME::Entity; - $message->build( - From => $CurrentUser->EmailAddress, - Subject => 'CVS Commit', - Data => \@LogMessage - ); - - # {{{ comment or correspond, as needed - - foreach my $ticket (@tickets) { - my $TicketObj = RT::Ticket->new($CurrentUser); - $TicketObj->Load($ticket); - my ( $id, $msg ); - unless ( $TicketObj->Id ) { - push ( @errors, -"Couldn't load ticket #$ticket. Not adding commit log to ticket history.\n" - ); - } - - if ( $LogMessage[0] =~ /^(comment|private)$/ ) { - ( $id, $msg ) = $TicketObj->Comment( MIMEObj => $message ); - - } - else { - ( $id, $msg ) = $TicketObj->Correspond( MIMEObj => $message ); - } - - push ( @errors, ">> Log message", - "Ticket #" . $TicketObj->Id . ": " . $msg ); - - } - - # }}} - - my ($reply) = ActOnPseudoHeaders( $CurrentUser, @commands ); - print "$reply\n" if ($reply); - print join ( "\n", @errors ); - print "\n"; - -} - -# }}} - -# {{{ sub find_commands - -sub find_commands { - my $lines = shift; - my (@pseudoheaders); - - while ( my $line = shift @{$lines} ) { - next if $line =~ /^\s*?$/; - if ( $line =~ /^RT-/i ) { - - push ( @pseudoheaders, $line ); - } - - #If we find a line that's not a command, get out. - else { - unshift ( @{$lines}, $line ); - last; - } - } - - return (@pseudoheaders); - -} - -# }}} - -# {{{ sub ActOnPseudoHeaders - -=item ActOnPseudoHeaders $PseudoHeaders - -Takes a string of pseudo-headers, iterates through them and does what they tell it to. - -=cut - -sub ActOnPseudoHeaders { - my $CurrentUser = shift; - my (@actions) = (@_); - - my $ResultsMessage = ''; - my $Ticket = RT::Ticket->new($CurrentUser); - - foreach my $action (@actions) { - my ($val); - my $msg = ''; - - $ResultsMessage .= ">>> $action\n"; - - if ( $action =~ /^RT-(.*?):\s*(.*)$/i ) { - my $command = $1; - my $args = $2; - - if ( $command =~ /^ticket$/i ) { - - $val = $Ticket->Load($args); - unless ($val) { - $ResultsMessage .= - loc("ERROR: Couldn't load ticket '[_1]': [_2].\n", $1, $msg); - . loc("Aborting to avoid unintended ticket modifications.\n") - . loc("The following commands were not proccessed:\n\n") - . join ( "\n", @actions ); - return ($ResultsMessage); - } - $ResultsMessage .= loc("Ticket [_1] loaded\n", $Ticket->Id); - } - else { - unless ( $Ticket->Id ) { - $ResultsMessage .= loc("No Ticket specified. Aborting ticket ") - . loc("modifications\n\n") - . loc("The following commands were not proccessed:\n\n") - . join ( "\n", @actions ); - return ($ResultsMessage); - } - - # Deal with the basics - if ( $command =~ /^(Subject|Owner|Status|Queue)$/i ) { - my $method = 'Set' . ucfirst( lc($1) ); - ( $val, $msg ) = $Ticket->$method($args); - } - - # Deal with the dates - elsif ( $command =~ /^(due|starts|started|resolved)$/i ) { - my $method = 'Set' . ucfirst( lc($1) ); - my $date = new RT::Date($CurrentUser); - $date->Set( Format => 'unknown', Value => $args ); - ( $val, $msg ) = $Ticket->$method( $date->ISO ); - } - - # Deal with the watchers - elsif ( $command =~ /^(requestor|requestors|cc|admincc)$/i ) { - my $operator = "+"; - my ($type); - if ( $args =~ /^(\+|\-)(.*)$/ ) { - $operator = $1; - $args = $2; - } - $type = 'Requestor' if ( $command =~ /^requestor/i ); - $type = 'Cc' if ( $command =~ /^cc/i ); - $type = 'AdminCc' if ( $command =~ /^admincc/i ); - - my $user = RT::User->new($CurrentUser); - $user->Load($args); - - if ($operator eq '+') { - ($val, $msg) = $Ticket->AddWatcher( Type => $type, - PrincipalId => $user->PrincipalId); - } elsif ($operator eq '-') { - ($val, $msg) = $Ticket->DeleteWatcher( Type => $type, - PrincipalId => $user->PrincipalId); - } - - } - $ResultsMessage .= $msg . "\n"; - } - - } - return ($ResultsMessage); - -} - -# }}} - -# {{{ sub untaint -sub untaint { - my $val = shift; - - if ( $val =~ /^([-\#\/\w.]+)$/ ) { - $val = $1; # $data now untainted - } - else { - die loc("Bad data in [_1]", $val); # log this somewhere - } - return ($val); -} - -# }}} - -=head1 AUTHOR - - - - rt-commit-handler is a rewritten version of the NetBSD commit handler, - which was placed in the public domain by Charles Hannum. It bore the following - authors statement: - - Contributed by David Hampton <hampton@cisco.com> - Hacked greatly by Greg A. Woods <woods@planix.com> - Rewritten by Charles M. Hannum <mycroft@netbsd.org> - -=cut - diff --git a/rt/config b/rt/config deleted file mode 100644 index b9418a66d..000000000 --- a/rt/config +++ /dev/null @@ -1,256 +0,0 @@ -/* - * This is the project ``config'' file. It controls many aspects of - * how Aegis interacts with your project. - * - * There are several sections of this file, each dealing with a different - * aspect of the interaction between Aegis and the tools used to manage - * yout project. - */ - -/* - * ------------------------------------------------------------------------- - * - * The build tool is delegated. - */ - -/* - * The build_command field of the config file is used to invoke the relevant - * build command. The following command tells cook where to find the recipes. - * The ${s Howto.cook} expands to a path into the baseline during development - * if the file is not in the change. Look in aesub(5) for more information - * about command substitutions. - */ -build_command = - ""; - -/* cook -book ${s Howto.cook} search_path=$search_path \ -project=$p change=$c version=$v -star -no-log -action -notouch"; - -/* - * The recipes in the User Guide will all remove their targets before - * constructing them, which qualifies them to use the following entry in the - * config file. The targets MUST be removed first if this field is true, - * otherwise the baseline would cease to be self-consistent. - * - * Fortunately, Cook has a nifty ``set unlink;'' statement which is - * placed at the top of the cookbook. - */ -link_integration_directory = true; - - -/* - * ------------------------------------------------------------------------- - * - * The history tool is delegated. - * - * The fhist program was written by David I. Bell and is admirably - * suited to providing a history mechanism with out the "cruft" that - * SCCS and RCS impose. The fhist program also comes with two other - * utilities, fcomp and fmerge, which use the same minimal difference - * algorithm. - * - * Please note that the [# edit #] feature needs to be avoided, or the - * -Fored_Update (-fu) flag needs to be used in addition to the - * -Conditional_Update (-cu) flag, otherwise updates will complain that - * ``Input file "XXX" contains edit A instead of B for module "YYY"'' - * - * The history_create_command and the history_put_command are - * intentionally identical. This minimizes problems when using - * branches. - * - * The ${quote ...} construct is used to quote filesnames whicg contain - * shell special characters. A minimum of quoting is performed, so if - * the filenames do not contail shell special characters, no quotes will - * be used. - */ - -/* - * This command is used to create a new project history. The command is - * always executed as the project owner. Note he the source is left in - * the baseline. The following substitutions are available: - * - * ${Input} - * absolute path of the source file - * ${History} - * absolute path of the history file - * - * The history_create_command and the history_put_command are - * intentionally identical. This minimizes problems when using - * branches. - */ -history_create_command = - "fhist ${quote ${basename $input}} -cr -cu -i ${quote $input} \ --p ${quote ${dirname $history}} -r"; - -/* - * This command is used to get a specific edit back from history. The - * command may be executed by developers. The following substitutions - * are available: - * - * ${History} - * absolute path of the history file - * ${Edit} - * edit number, as given by history_query_command - * ${Output} - * absolute path of the destination file - * - * Note that the destination filename will never look anything like the - * history source filename, so the -p is essential. - */ -history_get_command = - "fhist ${quote ${basename $history}} -e ${quote $e} \ --o ${quote $output} -p ${quote ${dirname $history}}"; - -/* - * This command is used to add a new "top-most" entry to the history - * file. This command is always executed as the project owner. Note - * that the source file is left in the baseline. The following - * substitutions are available: - * - * ${Input} - * absolute path of source file - * ${History} - * absolute path of history file - * - * The history_create_command and the history_put_command are - * intentionally identical. This minimizes problems when using - * branches. - */ -history_put_command = - "fhist ${quote ${basename $input}} -cr -cu -i ${quote $input} \ --p ${quote ${dirname $history}} -r"; - -/* - * This command is used to query what the history mechanism calls the - * "top-most" edit of a history file. The result may be any arbitrary - * string, it need not be anything like a number, just so long as it - * uniquely identifies the edit for use by the history_get_command at a - * later date. The edit number is to be printed on the standard output. - * This command may be executed by developers. The following - * substitutions are available: - * - * ${History} - * absolute path of the history file - */ -history_query_command = - "fhist ${quote ${basename $history}} -l 0 \ --p ${quote ${dirname $history}} -q"; - -/* - * ------------------------------------------------------------------------- - * - * The difference and merge tools are delegated. - */ - -/* - * Compare two files using fcomp. The -w option produces an output of - * the entire file, with insertions an deletions marked by "change bars" - * in the left margin. This is superior to context difference, as it - * shows the entire file as context. The -s option could be added to - * compare runs of white space as equal. - * - * This command is used by aed(1) to produce a difference listing when - * file in the development directory was originally copied from the - * current version in the baseline. - * - * All of the command substitutions described in aesub(5) are available. - * In addition, the following substitutions are also available: - * - * ${ORiginal} - * The absolute path name of a file containing the version - * originally copied. Usually in the baseline. - * ${Input} - * The absolute path name of the edited version of the file. - * Usually in the development directory. - * ${Output} - * The absolute path name of the file in which to write the - * difference listing. Usually in the development directory. - * - * An exit status of 0 means successful, even of the files differ (and - * they usually do). An exit status which is non-zero means something - * is wrong. - * - * The non-zero exit status may be used to overload this command with - * extra tests, such as line length limits. The difference files must - * be produced in addition to these extra tests. - */ -diff_command = - "fcomp -w ${quote $original} ${quote $input} -o ${quote $output}"; - -/* - * Compare three files using fmerge. Conflicts are marked in the - * output. - * - * This command is used by aed(1) to produce a difference listing when a - * file in the development directory is out of date compared to the - * current version in the baseline. - * - * All of the command substitutions described in aesub(5) are available. - * In addition, the following substitutions are also available: - * - * ${ORiginal} - * The absolute path name of a file containing the common ancestor - * version of ${MostRecent} and {$Input}. Usually the version - * originally copied into the change. Usually in a temporary file. - * ${Most_Recent} - * The absolute path name of a file containing the most recent - * version. Usually in the baseline. - * ${Input} - * The absolute path name of the edited version of the file. - * Usually in the development directory. - * ${Output} - * The absolute path name of the file in which to write the - * difference listing. Usually in the development directory. - * - * An exit status of 0 means successful, even of the files differ (and - * they usually do). An exit status which is non-zero means something - * is wrong. - */ -merge_command = - "fmerge ${quote $original} ${quote $MostRecent} ${quote $input} \ --o ${quote $output} -c /dev/null"; - -/* - * ------------------------------------------------------------------------- - * - * The new file templates are very handy. They allow all sorts of things - * to be se automatically. You need to edit them to add your own name, - * and copyright conditions. - */ - -file_template = -[ - { - pattern = [ "*" ]; - body = "${read_file ${source etc/template/generic abs}}"; - - } -]; - -/* ------------------------------------------------------------------------- - * - * The integrate_begin_exceptions are files which are not hard linked - * from the baseline to the integration directory. In this case, this - * is done to ensure the version stmp is updated appropriately. - */ - -integrate_begin_exceptions = [ ]; - - - - -/* ------------------------------------------------------------------------- - * - * The trojan_horse_suspect field is a list of filename patterns which - * indicate files which *could* host a Trojan horse attack. It makes - * aedist --receive more cautions. It is NOT a silver bullet: just - * about ANY file can host a Trojan, one way or the other. - */ - -trojan_horse_suspect = [ ]; - -build_covers_all_architectures = true; - -test_command = "make test"; - -build_time_adjust=dont_adjust; diff --git a/rt/config.layout b/rt/config.layout.in index 5b86eb99e..a08f48948 100644 --- a/rt/config.layout +++ b/rt/config.layout.in @@ -59,31 +59,6 @@ customlibdir: ${customdir}/lib </Layout> -<Layout FHS> - prefix: /usr/local - exec_prefix: ${prefix} - bindir: ${prefix}/bin - sbindir: ${prefix}/sbin - sysconfdir: /etc+ - datadir: ${prefix}/share -# FIXME: missing support for lib64 - libdir: ${prefix}/lib - mandir: ${datadir}/man -# FIXME: no such directory in FHS; shouldn't go to somewhere in "${datadir}/rt/"? - htmldir: ${datadir}/html - manualdir: ${datadir}/doc - localstatedir: /var - logfiledir: ${localstatedir}/log -# XXX: "/var/cache/mason/*"? - masonstatedir: ${localstatedir}/cache/mason_data - sessionstatedir: ${localstatedir}/cache/session_data - customdir: ${prefix}/local - custometcdir: ${customdir}/etc - customhtmldir: ${customdir}/html - customlexdir: ${customdir}/po - customlibdir: ${customdir}/lib -</Layout> - <Layout FreeBSD> prefix: /usr/local exec_prefix: ${prefix} @@ -127,3 +102,26 @@ customlexdir: ${customdir}/po customlibdir: ${customdir}/lib </Layout> + +<Layout Freeside> + prefix: /opt/rt3 + exec_prefix: ${prefix} + bindir: ${exec_prefix}/bin + sbindir: ${exec_prefix}/sbin + sysconfdir: ${prefix}/etc + mandir: ${prefix}/man + libdir: ${prefix}/lib + datadir: ${prefix}/share + htmldir: %%%FREESIDE_DOCUMENT_ROOT%%%/rt + manualdir: ${datadir}/doc + localstatedir: ${prefix}/var + logfiledir: ${localstatedir}/log + masonstatedir: %%%MASONDATA%%% + sessionstatedir: ${localstatedir}/session_data + customdir: ${prefix}/local + custometcdir: ${customdir}/etc + customhtmldir: ${customdir}/html + customlexdir: ${customdir}/po + customlibdir: ${customdir}/lib +</Layout> + diff --git a/rt/config.pld b/rt/config.pld deleted file mode 100644 index c71c7bbdd..000000000 --- a/rt/config.pld +++ /dev/null @@ -1,19 +0,0 @@ -(test "x$prefix" = "xNONE" || test "x$prefix" = "x") && prefix=/opt/rt3 -(test "x$exec_prefix" = "xNONE" || test "x$exec_prefix" = "x") && exec_prefix=${prefix} -bindir=${exec_prefix}/bin -sbindir=${exec_prefix}/sbin -sysconfdir=${prefix}/etc -mandir=${prefix}/man -libdir=${prefix}/lib -datadir=${prefix}/share -(test "x$htmldir" = "xNONE" || test "x$htmldir" = "x") && htmldir=${datadir}/html -(test "x$manualdir" = "xNONE" || test "x$manualdir" = "x") && manualdir=${datadir}/doc -localstatedir=${prefix}/var -(test "x$logfiledir" = "xNONE" || test "x$logfiledir" = "x") && logfiledir=${localstatedir}/log -(test "x$masonstatedir" = "xNONE" || test "x$masonstatedir" = "x") && masonstatedir=${localstatedir}/mason_data -(test "x$sessionstatedir" = "xNONE" || test "x$sessionstatedir" = "x") && sessionstatedir=${localstatedir}/session_data -(test "x$customdir" = "xNONE" || test "x$customdir" = "x") && customdir=${prefix}/local -(test "x$custometcdir" = "xNONE" || test "x$custometcdir" = "x") && custometcdir=${customdir}/etc -(test "x$customhtmldir" = "xNONE" || test "x$customhtmldir" = "x") && customhtmldir=${customdir}/html -(test "x$customlexdir" = "xNONE" || test "x$customlexdir" = "x") && customlexdir=${customdir}/po -(test "x$customlibdir" = "xNONE" || test "x$customlibdir" = "x") && customlibdir=${customdir}/lib diff --git a/rt/etc/RT_SiteConfig.pm b/rt/etc/RT_SiteConfig.pm index 39c99161f..affd36bb3 100644 --- a/rt/etc/RT_SiteConfig.pm +++ b/rt/etc/RT_SiteConfig.pm @@ -14,6 +14,27 @@ # # perl -c /path/to/your/etc/RT_SiteConfig.pm -Set( $rtname, 'example.com'); +#Set( $rtname, 'example.com'); + +$RT::rtname = '%%%RT_DOMAIN%%%'; +$RT::Organization = '%%%RT_DOMAIN%%%'; + +$RT::Timezone = '%%%RT_TIMEZONE%%%'; + +$RT::WebBaseURL = ''; +$RT::WebPath = '/freeside/rt'; + +$RT::WebExternalAuth = 1; +$RT::WebFallbackToInternal = 1; #no +$RT::WebExternalAuto = 1; + +$RT::URI::freeside::IntegrationType = 'Internal'; +$RT::URI::freeside::URL = '%%%FREESIDE_URL%%%'; + +Set($DatabaseHost , ''); + +#perl 5.8.0 - 5.8.2 experiment +#@EmailInputEncodings = qw(iso-8859-1 us-ascii utf-8); # unless (@EmailInputEncodings); +#Set($EmailOutputEncoding , 'iso-8859-1'); 1; diff --git a/rt/etc/schema.Oracle b/rt/etc/schema.Oracle deleted file mode 100644 index 40238b526..000000000 --- a/rt/etc/schema.Oracle +++ /dev/null @@ -1,400 +0,0 @@ - -CREATE SEQUENCE ATTACHMENTS_seq; -CREATE TABLE Attachments ( - id NUMBER(11,0) - CONSTRAINT Attachments_Key PRIMARY KEY, - TransactionId NUMBER(11,0) NOT NULL, - Parent NUMBER(11,0) DEFAULT 0 NOT NULL, - MessageId VARCHAR2(160), - Subject VARCHAR2(255), - Filename VARCHAR2(255), - ContentType VARCHAR2(80), - ContentEncoding VARCHAR2(80), - Content CLOB, - Headers CLOB, - Creator NUMBER(11,0) DEFAULT 0 NOT NULL, - Created DATE -); -CREATE INDEX Attachments2 ON Attachments (TransactionId); -CREATE INDEX Attachments3 ON Attachments (Parent, TransactionId); - - -CREATE SEQUENCE QUEUES_seq; -CREATE TABLE Queues ( - id NUMBER(11,0) - CONSTRAINT Queues_Key PRIMARY KEY, - Name VARCHAR2(200) CONSTRAINT Queues_Name_Unique UNIQUE NOT NULL, - Description VARCHAR2(255), - CorrespondAddress VARCHAR2(120), - CommentAddress VARCHAR2(120), - InitialPriority NUMBER(11,0) DEFAULT 0 NOT NULL, - FinalPriority NUMBER(11,0) DEFAULT 0 NOT NULL, - DefaultDueIn NUMBER(11,0) DEFAULT 0 NOT NULL, - Creator NUMBER(11,0) DEFAULT 0 NOT NULL, - Created DATE, - LastUpdatedBy NUMBER(11,0) DEFAULT 0 NOT NULL, - LastUpdated DATE, - Disabled NUMBER(11,0) DEFAULT 0 NOT NULL -); - CREATE INDEX Queues1 ON Queues (lower(Name)); -CREATE INDEX Queues2 ON Queues (Disabled); - - -CREATE SEQUENCE LINKS_seq; -CREATE TABLE Links ( - id NUMBER(11,0) - CONSTRAINT Links_Key PRIMARY KEY, - Base VARCHAR2(240), - Target VARCHAR2(240), - Type VARCHAR2(20) NOT NULL, - LocalTarget NUMBER(11,0) DEFAULT 0 NOT NULL, - LocalBase NUMBER(11,0) DEFAULT 0 NOT NULL, - LastUpdatedBy NUMBER(11,0) DEFAULT 0 NOT NULL, - LastUpdated DATE, - Creator NUMBER(11,0) DEFAULT 0 NOT NULL, - Created DATE -); -CREATE UNIQUE INDEX Links1 ON Links (Base, Target, Type); -CREATE INDEX Links2 ON Links (Base, Type); -CREATE INDEX Links3 ON Links (Target, Type); -CREATE INDEX Links4 ON Links(Type,LocalBase); - - -CREATE SEQUENCE PRINCIPALS_seq; -CREATE TABLE Principals ( - id NUMBER(11,0) - CONSTRAINT Principals_Key PRIMARY KEY, - PrincipalType VARCHAR2(16), - ObjectId NUMBER(11,0), - Disabled NUMBER(11,0) DEFAULT 0 NOT NULL -); -CREATE UNIQUE INDEX Principals2 ON Principals (ObjectId); - - -CREATE SEQUENCE GROUPS_seq; -CREATE TABLE Groups ( - id NUMBER(11,0) - CONSTRAINT Groups_Key PRIMARY KEY, - Name VARCHAR2(200), - Description VARCHAR2(255), - Domain VARCHAR2(64), - Type VARCHAR2(64), - Instance NUMBER(11,0) DEFAULT 0 -- NOT NULL --- Instance VARCHAR2(64) -); -CREATE INDEX Groups1 ON Groups (lower( Domain), Instance, lower(Type), id); -CREATE INDEX Groups2 ON Groups (lower(Type), Instance, lower(Domain)); - - -CREATE SEQUENCE SCRIPCONDITIONS_seq; -CREATE TABLE ScripConditions ( - id NUMBER(11, 0) - CONSTRAINT ScripConditions_Key PRIMARY KEY, - Name VARCHAR2(200), - Description VARCHAR2(255), - ExecModule VARCHAR2(60), - Argument VARCHAR2(255), - ApplicableTransTypes VARCHAR2(60), - Creator NUMBER(11,0) DEFAULT 0 NOT NULL, - Created DATE, - LastUpdatedBy NUMBER(11,0) DEFAULT 0 NOT NULL, - LastUpdated DATE -); - - -CREATE SEQUENCE TRANSACTIONS_seq; -CREATE TABLE Transactions ( - id NUMBER(11,0) - CONSTRAINT Transactions_Key PRIMARY KEY, - ObjectType VARCHAR2(255), - ObjectId NUMBER(11,0) DEFAULT 0 NOT NULL, - TimeTaken NUMBER(11,0) DEFAULT 0 NOT NULL, - Type VARCHAR2(20), - Field VARCHAR2(40), - OldValue VARCHAR2(255), - NewValue VARCHAR2(255), - ReferenceType VARCHAR2(255), - OldReference NUMBER(11,0), - NewReference NUMBER(11,0), - Data VARCHAR2(255), - Creator NUMBER(11,0) DEFAULT 0 NOT NULL, - Created DATE -); -CREATE INDEX Transactions1 ON Transactions (ObjectType, ObjectId); - - -CREATE SEQUENCE SCRIPS_seq; -CREATE TABLE Scrips ( - id NUMBER(11,0) - CONSTRAINT Scrips_Key PRIMARY KEY, - Description VARCHAR2(255), - ScripCondition NUMBER(11,0) DEFAULT 0 NOT NULL, - ScripAction NUMBER(11,0) DEFAULT 0 NOT NULL, - ConditionRules CLOB, - ActionRules CLOB, - CustomIsApplicableCode CLOB, - CustomPrepareCode CLOB, - CustomCommitCode CLOB, - Stage VARCHAR2(32), - Queue NUMBER(11,0) DEFAULT 0 NOT NULL, - Template NUMBER(11,0) DEFAULT 0 NOT NULL, - Creator NUMBER(11,0) DEFAULT 0 NOT NULL, - Created DATE, - LastUpdatedBy NUMBER(11,0) DEFAULT 0 NOT NULL, - LastUpdated DATE -); - - -CREATE SEQUENCE ACL_seq; -CREATE TABLE ACL ( - id NUMBER(11,0) - CONSTRAINT ACL_Key PRIMARY KEY, - PrincipalType VARCHAR2(25) NOT NULL, - PrincipalId NUMBER(11,0) NOT NULL, - RightName VARCHAR2(25) NOT NULL, - ObjectType VARCHAR2(25) NOT NULL, - ObjectId NUMBER(11,0) DEFAULT 0 NOT NULL, - DelegatedBy NUMBER(11,0) DEFAULT 0 NOT NULL, - DelegatedFrom NUMBER(11,0) DEFAULT 0 NOT NULL -); -CREATE INDEX ACL1 ON ACL(RightName, ObjectType, ObjectId, PrincipalType, PrincipalId); - - -CREATE SEQUENCE GROUPMEMBERS_seq; -CREATE TABLE GroupMembers ( - id NUMBER(11,0) - CONSTRAINT GroupMembers_Key PRIMARY KEY, - GroupId NUMBER(11,0) DEFAULT 0 NOT NULL, - MemberId NUMBER(11,0) DEFAULT 0 NOT NULL -); -CREATE UNIQUE INDEX GroupMembers1 ON GroupMembers (GroupId, MemberId); - - -CREATE SEQUENCE CachedGroupMembers_seq; -CREATE TABLE CachedGroupMembers ( - id NUMBER(11,0) - CONSTRAINT CachedGroupMembers_Key PRIMARY KEY, - GroupId NUMBER(11,0), - MemberId NUMBER(11,0), - Via NUMBER(11,0), - ImmediateParentId NUMBER(11,0), - Disabled NUMBER(11,0) DEFAULT 0 NOT NULL -); -CREATE INDEX DisGrouMem ON CachedGroupMembers (GroupId, MemberId, Disabled); -CREATE INDEX GrouMem ON CachedGroupMembers (GroupId, MemberId); - - -CREATE SEQUENCE USERS_seq; -CREATE TABLE Users ( - id NUMBER(11,0) - CONSTRAINT Users_Key PRIMARY KEY, - Name VARCHAR2(200) CONSTRAINT Users_Name_Unique - unique NOT NULL, - Password VARCHAR2(40), - Comments CLOB, - Signature CLOB, - EmailAddress VARCHAR2(120), - FreeFormContactInfo CLOB, - Organization VARCHAR2(200), - RealName VARCHAR2(120), - NickName VARCHAR2(16), - Lang VARCHAR2(16), - EmailEncoding VARCHAR2(16), - WebEncoding VARCHAR2(16), - ExternalContactInfoId VARCHAR2(100), - ContactInfoSystem VARCHAR2(30), - ExternalAuthId VARCHAR2(100), - AuthSystem VARCHAR2(30), - Gecos VARCHAR2(16), - HomePhone VARCHAR2(30), - WorkPhone VARCHAR2(30), - MobilePhone VARCHAR2(30), - PagerPhone VARCHAR2(30), - Address1 VARCHAR2(200), - Address2 VARCHAR2(200), - City VARCHAR2(100), - State VARCHAR2(100), - Zip VARCHAR2(16), - Country VARCHAR2(50), - Timezone VARCHAR2(50), - PGPKey CLOB, - Creator NUMBER(11,0) DEFAULT 0 NOT NULL, - Created DATE, - LastUpdatedBy NUMBER(11,0) DEFAULT 0 NOT NULL, - LastUpdated DATE -); --- CREATE UNIQUE INDEX Users1 ON Users (Name); - -CREATE INDEX Users2 ON Users( LOWER(name)); -CREATE INDEX Users4 ON Users (lower(EmailAddress)); - - -CREATE SEQUENCE TICKETS_seq; -CREATE TABLE Tickets ( - id NUMBER(11, 0) - CONSTRAINT Tickets_Key PRIMARY KEY, - EffectiveId NUMBER(11,0) DEFAULT 0 NOT NULL, - Queue NUMBER(11,0) DEFAULT 0 NOT NULL, - Type VARCHAR2(16), - IssueStatement NUMBER(11,0) DEFAULT 0 NOT NULL, - Resolution NUMBER(11,0) DEFAULT 0 NOT NULL, - Owner NUMBER(11,0) DEFAULT 0 NOT NULL, - Subject VARCHAR2(200) DEFAULT '[no subject]', - InitialPriority NUMBER(11,0) DEFAULT 0 NOT NULL, - FinalPriority NUMBER(11,0) DEFAULT 0 NOT NULL, - Priority NUMBER(11,0) DEFAULT 0 NOT NULL, - TimeEstimated NUMBER(11,0) DEFAULT 0 NOT NULL, - TimeWorked NUMBER(11,0) DEFAULT 0 NOT NULL, - Status VARCHAR2(10), - TimeLeft NUMBER(11,0) DEFAULT 0 NOT NULL, - Told DATE, - Starts DATE, - Started DATE, - Due DATE, - Resolved DATE, - LastUpdatedBy NUMBER(11,0) DEFAULT 0 NOT NULL, - LastUpdated DATE, - Creator NUMBER(11,0) DEFAULT 0 NOT NULL, - Created DATE, - Disabled NUMBER(11,0) DEFAULT 0 NOT NULL -); -CREATE INDEX Tickets1 ON Tickets (Queue, Status); -CREATE INDEX Tickets2 ON Tickets (Owner); -CREATE INDEX Tickets4 ON Tickets (id, Status); -CREATE INDEX Tickets5 ON Tickets (id, EffectiveId); -CREATE INDEX Tickets6 ON Tickets (EffectiveId, Type); - - -CREATE SEQUENCE SCRIPACTIONS_seq; -CREATE TABLE ScripActions ( - id NUMBER(11,0) - CONSTRAINT ScripActions_Key PRIMARY KEY, - Name VARCHAR2(200), - Description VARCHAR2(255), - ExecModule VARCHAR2(60), - Argument VARCHAR2(255), - Creator NUMBER(11,0) DEFAULT 0 NOT NULL, - Created DATE, - LastUpdatedBy NUMBER(11,0) DEFAULT 0 NOT NULL, - LastUpdated DATE -); - - -CREATE SEQUENCE TEMPLATES_seq; -CREATE TABLE Templates ( - id NUMBER(11,0) - CONSTRAINT Templates_Key PRIMARY KEY, - Queue NUMBER(11,0) DEFAULT 0 NOT NULL, - Name VARCHAR2(200) NOT NULL, - Description VARCHAR2(255), - Type VARCHAR2(16), - Language VARCHAR2(16), - TranslationOf NUMBER(11,0) DEFAULT 0 NOT NULL, - Content CLOB, - LastUpdated DATE, - LastUpdatedBy NUMBER(11,0) DEFAULT 0 NOT NULL, - Creator NUMBER(11,0) DEFAULT 0 NOT NULL, - Created DATE -); - - -CREATE SEQUENCE OBJECTCUSTOMFIELDS_seq; -CREATE TABLE ObjectCustomFields ( - id NUMBER(11,0) - CONSTRAINT ObjectCustomFields_Key PRIMARY KEY, - CustomField NUMBER(11,0) NOT NULL, - ObjectId NUMBER(11,0) NOT NULL, - SortOrder NUMBER(11,0) DEFAULT 0 NOT NULL, - Creator NUMBER(11,0) DEFAULT 0 NOT NULL, - Created DATE, - LastUpdatedBy NUMBER(11,0) DEFAULT 0 NOT NULL, - LastUpdated DATE -); - - -CREATE SEQUENCE OBJECTCUSTOMFIELDVALUES_seq; -CREATE TABLE ObjectCustomFieldValues ( - id NUMBER(11,0) - CONSTRAINT ObjectCustomFieldValues_Key PRIMARY KEY, - CustomField NUMBER(11,0) NOT NULL, - ObjectType VARCHAR2(25) NOT NULL, - ObjectId NUMBER(11,0) DEFAULT 0 NOT NULL, - SortOrder NUMBER(11,0) DEFAULT 0 NOT NULL, - - Content VARCHAR2(255), - LargeContent CLOB, - ContentType VARCHAR2(80), - ContentEncoding VARCHAR2(80), - - Creator NUMBER(11,0) DEFAULT 0 NOT NULL, - Created DATE, - LastUpdatedBy NUMBER(11,0) DEFAULT 0 NOT NULL, - LastUpdated DATE, - Disabled NUMBER(11,0) DEFAULT 0 NOT NULL -); - -CREATE INDEX ObjectCustomFieldValues1 ON ObjectCustomFieldValues (Content); -CREATE INDEX ObjectCustomFieldValues2 ON ObjectCustomFieldValues (CustomField,ObjectType,ObjectId); - -CREATE SEQUENCE CUSTOMFIELDS_seq; -CREATE TABLE CustomFields ( - id NUMBER(11,0) - CONSTRAINT CustomFields_Key PRIMARY KEY, - Name VARCHAR2(200), - Type VARCHAR2(200), - MaxValues NUMBER(11,0) DEFAULT 0 NOT NULL, - Pattern VARCHAR2(255), - Repeated NUMBER(11,0) DEFAULT 0 NOT NULL, - Description VARCHAR2(255), - SortOrder NUMBER(11,0) DEFAULT 0 NOT NULL, - LookupType VARCHAR2(255), - Creator NUMBER(11,0) DEFAULT 0 NOT NULL, - Created DATE, - LastUpdatedBy NUMBER(11,0) DEFAULT 0 NOT NULL, - LastUpdated DATE, - Disabled NUMBER(11,0) DEFAULT 0 NOT NULL -); - - -CREATE SEQUENCE CUSTOMFIELDVALUES_seq; -CREATE TABLE CustomFieldValues ( - id NUMBER(11,0) - CONSTRAINT CustomFieldValues_Key PRIMARY KEY, - CustomField NUMBER(11,0), - Name VARCHAR2(200), - Description VARCHAR2(255), - SortOrder NUMBER(11,0) DEFAULT 0 NOT NULL, - Creator NUMBER(11,0) DEFAULT 0 NOT NULL, - Created DATE, - LastUpdatedBy NUMBER(11,0) DEFAULT 0 NOT NULL, - LastUpdated DATE -); - -CREATE INDEX CustomFieldValues1 ON CustomFieldValues (CustomField); - -CREATE SEQUENCE ATTRIBUTES_seq; -CREATE TABLE Attributes ( - id NUMBER(11,0) PRIMARY KEY, - Name VARCHAR2(255) NOT NULL, - Description VARCHAR2(255), - Content CLOB, - ContentType VARCHAR(16), - ObjectType VARCHAR2(25) NOT NULL, - ObjectId NUMBER(11,0) DEFAULT 0 NOT NULL, - Creator NUMBER(11,0) DEFAULT 0 NOT NULL, - Created DATE, - LastUpdatedBy NUMBER(11,0) DEFAULT 0 NOT NULL, - LastUpdated DATE -); - -CREATE INDEX Attributes1 on Attributes(Name); -CREATE INDEX Attributes2 on Attributes(ObjectType, ObjectId); - - -CREATE TABLE sessions ( - id VARCHAR2(32) - CONSTRAINT Sessions_Key PRIMARY KEY, - a_session CLOB, - LastUpdated DATE -); - diff --git a/rt/etc/upgrade/2.1.71 b/rt/etc/upgrade/2.1.71 deleted file mode 100644 index cb89a3ac3..000000000 --- a/rt/etc/upgrade/2.1.71 +++ /dev/null @@ -1,211 +0,0 @@ -@Queues = ( { - Name => '___Approvals', - Description => 'A system-internal queue for the approvals system', - Disabled => 2, - } -); - - - - - -# {{{ Templates -@Templates = ( - { - Queue => '___Approvals', - Name => "New Pending Approval", # loc - Description => "Notify Owners and AdminCcs of new items pending their approval", # loc - Content => 'Subject: New Pending Approval: {$Ticket->Subject} - -Greetings, - -There is a new item pending your approval: "{$Ticket->Subject()}", -a summary of which appears below. - -Please visit {$RT::WebURL}Approvals/Display.html?id={$Ticket->id} -to approve or reject this ticket, or {$RT::WebURL}Approvals/ to -batch-process all your pending approvals. - -------------------------------------------------------------------------- -{$Transaction->Content()} -' - }, -); - -# }}} - -1; - -@ScripActions = ( - { Name => 'Open Tickets', - Description => 'Open tickets on correspondence', - ExecModule => 'AutoOpen' }, - -); - - @Scrips = ( - { ScripCondition => 'On Correspond', - ScripAction => 'Open Tickets', - Template => 'Blank', - Queue => '0' - }, - { ScripCondition => 'On Create', - ScripAction => 'AutoReply To Requestors', - Template => 'AutoReply' }, - { ScripCondition => 'On Create', - ScripAction => 'Notify AdminCcs', - Template => 'Transaction' }, - { ScripCondition => 'On Correspond', - ScripAction => 'Notify AdminCcs', - Template => 'Admin Correspondence' }, - { ScripCondition => 'On Correspond', - ScripAction => 'Notify Requestors And Ccs', - Template => 'Correspondence' }, - { ScripCondition => 'On Correspond', - ScripAction => 'Notify Other Recipients', - Template => 'Correspondence' }, - { ScripCondition => 'On Comment', - ScripAction => 'Notify AdminCcs As Comment', - Template => 'Admin Comment' }, - { ScripCondition => 'On Comment', - ScripAction => 'Notify Other Recipients As Comment', - Template => 'Correspondence' }, - { ScripCondition => 'On Resolve', - ScripAction => 'Notify Requestors', - Template => 'Resolved' }, - - - { - Description => "When an approval ticket is created, notify the Owner and AdminCc of the item awaiting their approval", # loc - Queue => '___Approvals', - ScripCondition => 'On Create', - ScripAction => 'Notify AdminCcs', - Template => 'New Pending Approval' - }, - { - Description => "If an approval is rejected, reject the original and delete pending approvals", # loc - Queue => '___Approvals', - ScripCondition => 'On Status Change', - ScripAction => 'User Defined', - CustomCommitCode => q[ -# ------------------------------------------------------------------- # -return(1) unless ( lc($self->TransactionObj->NewValue) eq "rejected" or - lc($self->TransactionObj->NewValue) eq "deleted" ); - -my $links = $self->TicketObj->DependedOnBy; -foreach my $link (@{ $links->ItemsArrayRef }) { - my $obj = $link->BaseObj; - if ($obj->QueueObj->IsActiveStatus($obj->Status)) { - if ($obj->Type eq 'ticket') { - $obj->Correspond( - Content => $self->loc("Your request was rejected."), - ); - $obj->SetStatus( - Status => 'rejected', - Force => 1, - ); - } - else { - $obj->SetStatus( - Status => 'deleted', - Force => 1, - ); - } - } -} - -$links = $self->TicketObj->DependsOn; -foreach my $link (@{ $links->ItemsArrayRef }) { - my $obj = $link->TargetObj; - if ($obj->QueueObj->IsActiveStatus($obj->Status)) { - $obj->SetStatus( - Status => 'deleted', - Force => 1, - ); - } -} - -return 1; -# ------------------------------------------------------------------- # - ], - CustomPrepareCode => '1', - Template => 'Admin Comment', - }, - { - Description => "When a ticket has been approved by any approver, add correspondence to the original ticket", # loc - Queue => '___Approvals', - ScripCondition => 'On Resolve', - ScripAction => 'User Defined', - CustomPrepareCode => 'return(1);', - CustomCommitCode => q[ -# ------------------------------------------------------------------- # -return(1) unless ($self->TicketObj->Type eq 'approval'); - -foreach my $obj ($self->TicketObj->AllDependedOnBy( Type => 'ticket' )) { - $obj->Correspond( - Content => $self->loc( "Your request has been approved by [_1]. Other approvals may still be pending.", # loc - $self->TransactionObj->CreatorObj->Name, - ) . "\n" . $self->loc( "Approver's notes: [_1]", # loc - $self->TicketObj->Transactions->Last->Content, - ), - _reopen => 0, - ); -} - -return 1; -# ------------------------------------------------------------------- # - ], - Template => 'Admin Comment' - }, - { - Description => "When a ticket has been approved by all approvers, add correspondence to the original ticket", # loc - Queue => '___Approvals', - ScripCondition => 'On Resolve', - ScripAction => 'User Defined', - CustomPrepareCode => 'return(1);', - CustomCommitCode => q[ -# ------------------------------------------------------------------- # -# Find all the tickets that depend on this (that this is approving) - -my $Ticket = $self->TicketObj; -my @TOP = $Ticket->AllDependedOnBy( Type => 'ticket' ); -my $links = $Ticket->DependedOnBy; - -while (my $link = $links->Next) { - my $obj = $link->BaseObj; - next if ($obj->HasUnresolvedDependencies( Type => 'approval' )); - - if ($obj->Type eq 'ticket') { - $obj->Correspond( - Content => $self->loc("Your request has been approved."), - _reopen => 0, - ); - } - elsif ($obj->Type eq 'code') { - my $code = $obj->Transactions->First->Content; - my $rv; - - foreach my $TOP (@TOP) { - local $@; - $rv++ if eval $code; - $RT::Logger->error("Cannot eval code: $@") if $@; - } - - if ($rv or !@TOP) { - $obj->SetStatus( Status => 'resolved', Force => 1,); - } - else { - $obj->SetStatus( Status => 'rejected', Force => 1,); - } - } -} - -return 1; -# ------------------------------------------------------------------- # - ], - Template => 'Admin Comment', - }, -); - -# }}} - diff --git a/rt/html/Admin/Elements/ModifyQueue b/rt/html/Admin/Elements/ModifyQueue deleted file mode 100644 index 36f9ce17f..000000000 --- a/rt/html/Admin/Elements/ModifyQueue +++ /dev/null @@ -1,78 +0,0 @@ -%# 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 -<& /Elements/TitleBoxStart, title => loc('Editing Configuration for queue [_1]', $QueueObj->Id) &> - -<FORM ACTION="<%$RT::WebPath%>/Admin/Queues/Modify.html" METHOD=POST> -<INPUT TYPE=HIDDEN NAME=id VALUE="<%$QueueObj->Id%>"> -<TABLE> -<TR><TD ALIGN=RIGHT> -<&|/l&>Queue Name</&>: -</TD> -<TD><INPUT name="Name" value="<%$QueueObj->Name%>"></TD> -</TR><TR> -<TD ALIGN=RIGHT> -<&|/l&>Description</&>:</TD><TD COLSPAN=3><INPUT name="Description" value="<%$QueueObj->Description%>" size=60></TD></TR> -<TR> -<TD ALIGN=RIGHT> -<&|/l&>Correspondence Address</&>: -</TD><TD> -<INPUT name="CorrespondAddress" value="<%$QueueObj->CorrespondAddress%>"> -</TD> -<TD ALIGN=RIGHT> - -<&|/l&>Comment Address</&>: </TD><TD> -<INPUT NAME="CommentAddress" value="<%$QueueObj->CommentAddress%>"> -</TD> -</TR><TR> - -<TD ALIGN=RIGHT> -<&|/l&>Priority starts at</&>: -</TD><TD><INPUT NAME="InitialPriority" value="<%$QueueObj->InitialPriority %>"> -</TD> -<TD ALIGN=RIGHT> -<&|/l&>Over time, priority moves toward</&>: -</TD><TD><INPUT NAME="FinalPriority" value="<%$QueueObj->FinalPriority %>"> -</TD> -</TR> -<TR> -<TD ALIGN=RIGHT> -<&|/l&>Requests should be due in</&>: -</TD><TD> -<INPUT NAME="DefaultDueIn" VALUE="<%$QueueObj->DefaultDueIn%>"> <&|/l&>days</&>. -</TD> -</TR> -</TABLE> -<& /Elements/Submit, Label => loc('Save Changes') &> -</form> -<& /Elements/TitleBoxEnd &> - -<%INIT> - -</%INIT> - -<%ARGS> - - -$QueueObj => undef -</%ARGS> diff --git a/rt/html/Admin/Elements/ModifyUser b/rt/html/Admin/Elements/ModifyUser deleted file mode 100644 index 2faefefaa..000000000 --- a/rt/html/Admin/Elements/ModifyUser +++ /dev/null @@ -1,99 +0,0 @@ -%# 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 -<& /Elements/TitleBoxStart, title => loc('Editing Configuration for user [_1]', $UserObj->Name) &> - -<FORM ACTION="<%$RT::WebPath%>/Admin/Users/Modify.html" METHOD=POST> -<INPUT TYPE=HIDDEN NAME=id VALUE="<%$UserObj->Id%>"> - -<&|/l&>Name</&>: <input name="Name" value="<%$UserObj->Name%>"> -<BR> -<&|/l&>New Password</&>: <input type=password name="Pass1"><BR> -<&|/l&>Retype Password</&>: <input type=password name="Pass2"><BR> - -<&|/l&>Comments</&>: <TEXTAREA name="Comments" COLS=80 ROWS=5 WRAP=VIRTUAL> -<%$UserObj->Comments%></TEXTAREA> - -<BR> -<&|/l&>Signature</&>: <TEXTAREA COLS=80 ROWS=5 name="Signature" WRAP=HARD> -<%$UserObj->Signature%></TEXTAREA> -<BR> -<&|/l&>EmailAddress</&>: <input name="EmailAddress" value="<%$UserObj->EmailAddress%>"> -<BR> -<&|/l&>FreeformContactInfo</&>: <input name="FreeformContactInfo" value="<%$UserObj->FreeformContactInfo%>"> -<BR> -<&|/l&>Organization</&>: <input name="Organization" value="<%$UserObj->Organization%>"> -<BR> -<&|/l&>RealName</&>: <input name="RealName" value="<%$UserObj->RealName%>"> -<BR> -<&|/l&>NickName</&>: <input name="NickName" value="<%$UserObj->NickName%>"> -<BR> -<&|/l&>Lang</&>: <input name="Lang" value="<%$UserObj->Lang%>"> -<BR> -<&|/l&>EmailEncoding</&>: <input name="EmailEncoding" value="<%$UserObj->EmailEncoding%>"> -<BR> -<&|/l&>WebEncoding</&>: <input name="WebEncoding" value="<%$UserObj->WebEncoding%>"> -<BR> -<&|/l&>ExternalContactInfoId</&>: <input name="ExternalContactInfoId" value="<%$UserObj->ExternalContactInfoId%>"> -<BR> -<&|/l&>ContactInfoSystem</&>: <input name="ContactInfoSystem" value="<%$UserObj->ContactInfoSystem%>"> -<BR> -<&|/l&>UnixUsername</&>: <input name="Gecos" value="<%$UserObj->Gecos%>"> -<BR> -<&|/l&>ExternalAuthId</&>: <input name="ExternalAuthId" value="<%$UserObj->ExternalAuthId%>"> -<BR> -<&|/l&>AuthSystem</&>: <input name="AuthSystem" value="<%$UserObj->AuthSystem%>"> -<BR> -<&|/l&>HomePhone</&>: <input name="HomePhone" value="<%$UserObj->HomePhone%>"> -<BR> -<&|/l&>WorkPhone</&>: <input name="WorkPhone" value="<%$UserObj->WorkPhone%>"> -<BR> -<&|/l&>MobilePhone</&>: <input name="MobilePhone" value="<%$UserObj->MobilePhone%>"> -<BR> -<&|/l&>PagerPhone</&>: <input name="PagerPhone" value="<%$UserObj->PagerPhone%>"> -<BR> -<&|/l&>Address1</&>: <input name="Address1" value="<%$UserObj->Address1%>"> -<BR> -<&|/l&>Address2</&>: <input name="Address2" value="<%$UserObj->Address2%>"> -<BR> -<&|/l&>City</&>: <input name="City" value="<%$UserObj->City%>"> -<BR> -<&|/l&>State</&>: <input name="State" value="<%$UserObj->State%>"> -<BR> -<&|/l&>Zip</&>: <input name="Zip" value="<%$UserObj->Zip%>"> -<BR> -<&|/l&>Country</&>: <input name="Country" value="<%$UserObj->Country%>"> -<BR> -<& /Elements/Submit, Label => loc('Save Changes') &> -</form> -<& /Elements/TitleBoxEnd &> - -<%INIT> - -</%INIT> - -<%ARGS> - - -$UserObj => undef -</%ARGS> diff --git a/rt/html/Admin/Global/CustomField.html b/rt/html/Admin/Global/CustomField.html deleted file mode 100644 index 3871d8998..000000000 --- a/rt/html/Admin/Global/CustomField.html +++ /dev/null @@ -1,86 +0,0 @@ -%# {{{ BEGIN BPS TAGGED BLOCK -%# -%# COPYRIGHT: -%# -%# This software is Copyright (c) 1996-2004 Best Practical Solutions, LLC -%# <jesse@bestpractical.com> -%# -%# (Except where explicitly superseded by other copyright notices) -%# -%# -%# LICENSE: -%# -%# 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. -%# -%# You should have received a copy of the GNU General Public License -%# along with this program; if not, write to the Free Software -%# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -%# -%# -%# CONTRIBUTION SUBMISSION POLICY: -%# -%# (The following paragraph is not intended to limit the rights granted -%# to you to modify and distribute this software under the terms of -%# the GNU General Public License and is only of importance to you if -%# you choose to contribute your changes and enhancements to the -%# community by submitting them to Best Practical Solutions, LLC.) -%# -%# By intentionally submitting any modifications, corrections or -%# derivatives to this work, or any other work intended for use with -%# Request Tracker, to Best Practical Solutions, LLC, you confirm that -%# you are the copyright holder for those contributions and you grant -%# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -%# royalty-free, perpetual, license to use, copy, create derivative -%# works based on those contributions, and sublicense and distribute -%# those contributions and any derivatives thereof. -%# -%# }}} END BPS TAGGED BLOCK -<& /Admin/Elements/Header, Title => $title &> -<& /Admin/Elements/SystemTabs, - current_tab => 'Admin/Global/CustomFields.html', - current_subtab => $current_subtab, - subtabs => $subtabs, - Title => $title &> - -<& /Admin/Elements/EditCustomField, title => $title, %ARGS &> - -<%INIT> -my ($title, $current_subtab); - -my $subtabs = { - A => { title => loc('Select custom field'), - path => "Admin/Global/CustomFields.html" - }, - B => { title => loc('New custom field'), - path => "Admin/Global/CustomField.html?create=1&Queue=0", - separator => 1, - } - }; -if ( $ARGS{'create'} ) { - $current_subtab = "Admin/Global/CustomField.html?create=1&Queue=0"; - $title = loc('Create a CustomField which applies to all queues'); -} -else { - $current_subtab = - "Admin/Global/CustomField.html?CustomField=" . $CustomField . "&Queue=0"; - $title = loc('Modify a CustomField which applies to all queues'); - $subtabs->{"C"} = { - title => loc( 'Custom Field #[_1]', $CustomField ), - path => "Admin/Global/CustomField.html?CustomField=" . $CustomField . "&Queue=0" - }; -} -</%INIT> -<%ARGS> -$CustomField => undef -</%ARGS> -<%ATTR> -AutoFlush => 0 -</%ATTR> diff --git a/rt/html/Admin/Global/CustomFields.html b/rt/html/Admin/Global/CustomFields.html deleted file mode 100644 index 593040218..000000000 --- a/rt/html/Admin/Global/CustomFields.html +++ /dev/null @@ -1,69 +0,0 @@ -%# {{{ BEGIN BPS TAGGED BLOCK -%# -%# COPYRIGHT: -%# -%# This software is Copyright (c) 1996-2004 Best Practical Solutions, LLC -%# <jesse@bestpractical.com> -%# -%# (Except where explicitly superseded by other copyright notices) -%# -%# -%# LICENSE: -%# -%# 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. -%# -%# You should have received a copy of the GNU General Public License -%# along with this program; if not, write to the Free Software -%# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -%# -%# -%# CONTRIBUTION SUBMISSION POLICY: -%# -%# (The following paragraph is not intended to limit the rights granted -%# to you to modify and distribute this software under the terms of -%# the GNU General Public License and is only of importance to you if -%# you choose to contribute your changes and enhancements to the -%# community by submitting them to Best Practical Solutions, LLC.) -%# -%# By intentionally submitting any modifications, corrections or -%# derivatives to this work, or any other work intended for use with -%# Request Tracker, to Best Practical Solutions, LLC, you confirm that -%# you are the copyright holder for those contributions and you grant -%# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -%# royalty-free, perpetual, license to use, copy, create derivative -%# works based on those contributions, and sublicense and distribute -%# those contributions and any derivatives thereof. -%# -%# }}} END BPS TAGGED BLOCK -<& /Admin/Elements/Header, Title => $title &> -<& /Admin/Elements/SystemTabs, - current_tab => 'Admin/Global/CustomFields.html', - current_subtab => 'Admin/Global/CustomFields.html', - subtabs => $subtabs, - Title => $title &> - -<& /Admin/Elements/EditCustomFields, title => $title, %ARGS &> - -<%INIT> -my $subtabs = { - A => { title => loc('Select custom field'), - path => "Admin/Global/CustomFields.html" - }, - B => { title => loc('New custom field'), - path => "Admin/Global/CustomField.html?create=1&Queue=0", - separator => 1, - } - }; -my $title = loc("Modify Custom Fields which apply to all queues"); -</%INIT> -<%ARGS> -$id => undef -</%ARGS> diff --git a/rt/html/Admin/Users/Prefs.html b/rt/html/Admin/Users/Prefs.html deleted file mode 100644 index 0bba9fadd..000000000 --- a/rt/html/Admin/Users/Prefs.html +++ /dev/null @@ -1,122 +0,0 @@ -%# 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 -<& /Elements/Header, Title => loc("User view") &> - -<& /Elements/ViewUser, User=>$u &> - -<h2 class="title"><%loc("User view")%></h2> - -%if ($session{CurrentUser} && ($session{CurrentUser}->Id == $id)) { - <& /Elements/TitleBoxStart, title => loc('Signature') &> -<form method=post> -<input type="hidden" name="id" value=<%$id%>> -<TEXTAREA COLS=72 ROWS=4 WRAP=HARD NAME="Signature"><% $u->Signature %></TEXTAREA><br><br> -<input type="submit" value="<&|/l&>Update signature</&>"> -</form> - <& /Elements/TitleBoxEnd &> - <form method=post> - <&|/l&>Open tickets (from listing) in another window</&>: <input type="checkbox" name="NewWindowOption" <%exists $session{NewWindowOption} && "CHECKED"%>><br> - <&|/l&>Open tickets (from listing) in a new window</&>: <input type="checkbox" name="AlwaysNewWindowOption" <%exists $session{AlwaysNewWindowOption} && "CHECKED"%>><br> - <input type="submit" name="NewWindowSetting" value="<&|/l&>New window setting</&>"> - </form> -%} - - <& /Elements/TitleBoxStart, title => loc('Email') &> -<form method=post> -<input type="hidden" name="id" value="<%$id%>"> -<input name="Email" value="<% $u->EmailAddress %>"><input type="submit" value="<&|/l&>Update email</&>"> -</form> - <& /Elements/TitleBoxEnd &> - <& /Elements/TitleBoxStart, title => loc('Real Name') &> -<form method=post> -<input type="hidden" name="id" value="<%$id%>"> -<input name="RealName" value="<% $u->RealName %>"><input type="submit" value="<&|/l&>Update name</&>"> -</form> - <& /Elements/TitleBoxEnd &> - - <& /Elements/TitleBoxStart, title => loc('User ID') &> -<form method=post> -<input type="hidden" name="id" value="<%$id%>"> -<input name="Name" value="<% $u->Name %>"><input type="submit" value="<&|/l&>Update ID</&>"> -</form> - <& /Elements/TitleBoxEnd &> - -%# TODO: alternative email addresses + merging users - -<%ARGS> -$id => $session{CurrentUser} ? $session{CurrentUser}->Id : 0 -$Signature => undef -$Email => undef -$RealName => undef -$Name => undef -</%ARGS> - -<%INIT> -require RT::User; -my $u=RT::User->new($session{CurrentUser}); -$u->Load($id) || die loc("Couldn't load that user ([_1])", $id); -if ($Signature) { -my ($val, $msg)=$u->SetSignature($Signature); -$RT::Logger->log(level=>($val ? 'info' : 'error'), message=>$msg); -} - -if ($Email) { -my ($val, $msg)=$u->SetEmailAddress($Email); -$RT::Logger->log(level=>($val ? 'info' : 'error'), message=>$msg); -} - -if ($RealName) { -my ($val, $msg)=$u->SetRealName($RealName); -$RT::Logger->log(level=>($val ? 'info' : 'error'), message=>$msg); -} - -if ($Name) { -my ($val, $msg)=$u->SetName($Name); -$RT::Logger->log(level=>($val ? 'info' : 'error'), message=>$msg); -} - -if ($ARGS{NewWindowSetting}) { -if ($ARGS{NewWindowOption}) { -$session{NewWindowOption}=1; -} else { -delete $session{NewWindowOption}; -} -if ($ARGS{AlwaysNewWindowOption}) { -$session{NewWindowOption}=1; -$session{AlwaysNewWindowOption}=1; -} else { -delete $session{AlwaysNewWindowOption}; -} -} - -</%INIT> - - - - - - - - - diff --git a/rt/html/Elements/Footer b/rt/html/Elements/Footer index 4c90acfa3..78a116f38 100644 --- a/rt/html/Elements/Footer +++ b/rt/html/Elements/Footer @@ -50,6 +50,7 @@ <td> % } <& /Elements/Callback, %ARGS &> +<!-- <div class="bpscredits"> <&|/l, '»|«', $RT::VERSION, '2005', '<a href="http://www.bestpractical.com?rt='.$RT::VERSION.'">Best Practical Solutions, LLC</a>', &>[_1] RT [_2] Copyright 1996-[_3] [_4].</&><br> % if (!$Menu) { @@ -57,6 +58,7 @@ <&|/l, '<a href="mailto:sales@bestpractical.com">sales@bestpractical.com</a>' &>To inquire about support, training, custom development or licensing, please contact [_1].</&><br> % } </div> +--> % if ($Debug >= 2 ) { % require Data::Dumper; % my $d = Data::Dumper->new([\%ARGS], [qw(%ARGS)]); diff --git a/rt/html/Elements/Header b/rt/html/Elements/Header index 8c3775bba..a2563fee3 100644 --- a/rt/html/Elements/Header +++ b/rt/html/Elements/Header @@ -77,10 +77,9 @@ ONLOAD=" > <table width="100%" border="0" cellspacing="0" cellpadding="0" bgcolor="#FFFFFF"> <tr> - <td colspan=2><a href="http://bestpractical.com"><img src="<%$RT::WebImagesURL%>/bplogo.gif" alt="<%loc("Best Practical Solutions, LLC corporate logo")%>" width="230" height="50"></a></td> - <td> </td> - <td> </td> - <td width="50%" align="right"> + <td colspan=2 rowspan=2><img border=0 alt="freeside" src="<%$RT::WebImagesURL%>/small-logo.png" width="92" height="62"></td> + <td align="left" rowspan=2><font size=6><% &RT::URI::freeside::FreesideGetConfig('company_name') %> Ticketing</font></td> + <td align="right" valign="top"> % if ($session{'CurrentUser'} && $session{'CurrentUser'}->Id && $LoggedIn) { <SPAN STYLE="display: none"><A HREF="#skipnav"><&|/l&>Skip Menu</&></A> |</SPAN> %if ($session{'CurrentUser'}->HasRight( Right => 'ModifySelf', Object => $RT::System )) { @@ -96,12 +95,38 @@ ONLOAD=" <&|/l&>Not logged in.</&> % } </td> + + </tr> + <tr> + + <td align=right valign=bottom> + <table> + <tr> + <td align=right> + <FONT SIZE="-3"> + <A HREF="http://www.sisd.com/freeside">Freeside</A> v<% &RT::URI::freeside::FreesideVersion() %><BR> + <A HREF="../docs/">Documentation</A><BR> + </FONT> + </td> + <td bgcolor=#000000></td> + <td align=left> + <FONT SIZE="-3"> + <A HREF="http://www.bestpractical.com/rt">RT</A> v<% $RT::VERSION %><BR> + <A HREF="http://wiki.bestpractical.com/">Documentation</A><BR> + </FONT> + </td> + + </tr> + </table> + </td> + </tr> </table> <%INIT> $r->headers_out->{'Pragma'} = 'no-cache'; $r->headers_out->{'Cache-control'} = 'no-cache'; +require RT::URI::freeside; </%INIT> <%ARGS> diff --git a/rt/html/Elements/PageLayout b/rt/html/Elements/PageLayout index 3d7241dad..94bdbe194 100644 --- a/rt/html/Elements/PageLayout +++ b/rt/html/Elements/PageLayout @@ -43,12 +43,12 @@ %# those contributions and any derivatives thereof. %# %# END BPS TAGGED BLOCK }}} -<table class="darkblue" border=0 cellspacing=0 cellpadding=0 width="100%"> - <th class="titlebox" align="left"><span class="rtname"><%$AppName%></span> +<table class="lightgray" border=0 cellspacing=0 cellpadding=0 width="100%"> + <th class="lightgray" align="left" width=42%><span class="rtname"><%$AppName%></span> </th> <span class="topactions"> % foreach my $action (sort keys %{$topactions}) { - <td class="darkblueright"> + <td class="lightgrayright"> <%$topactions->{"$action"}->{'html'} |n %> </td> % } @@ -57,18 +57,18 @@ <table border=0 cellspacing=0 cellpadding=0 width="100%" height="100%"> %# Vertical menu <TR height="100%"> -<TD valign="top" width="140" class="blue"> +<TD valign="top" width="140" class="lightgray"> <& /Elements/Menu, toptabs => $toptabs, current_toptab => $current_toptab &> </TD> <td valign="top"> <table width="100%" height="100%" border="0" cellpadding="0" cellspacing="0"> <tr> - <td class="blue" valign="top"> + <td class="mediumgray" valign="top"> <span class="title"><%$title%></span> </td> </tr> <tr> -<td class="blueright" valign="top"> +<td class="mediumgrayright" valign="top"> <span class="nav"> % if ($actions) { % my @actions; @@ -79,7 +79,8 @@ % push @actions, qq|<a class="nav" href="|.$RT::WebPath."/".$actions->{$action}->{'path'}.qq|">|.$actions->{$action}->{'title'}."</a>"; % } % } -<% join(" | ", @actions) | n %> +%#<% join(" | ", @actions) | n %> +<% '['. join("] [", @actions). ']' | n %> % if ($subactions) { % my @actions; % foreach my $action (sort keys %{$subactions}) { @@ -118,5 +119,5 @@ $tabs => undef $actions => undef $subactions => undef $title => $m->callers(-1)->path -$AppName => undef +$AppName => '' </%ARGS> diff --git a/rt/html/Elements/ShadedBox b/rt/html/Elements/ShadedBox deleted file mode 100644 index 36b9cae7c..000000000 --- a/rt/html/Elements/ShadedBox +++ /dev/null @@ -1,33 +0,0 @@ -%# 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 -<table> - <tr> - <td class="label"><%$title |n %>:</td> - <td class="value"><%$content |n %></td> - </tr> -</table> -<%ARGS> -$title => undef -$content => " " -</%ARGS> diff --git a/rt/html/Elements/ShadedInputRow b/rt/html/Elements/ShadedInputRow deleted file mode 100644 index e9fb69e5f..000000000 --- a/rt/html/Elements/ShadedInputRow +++ /dev/null @@ -1,35 +0,0 @@ -%# 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 -<tr> - <td class="label"><%$title |n %>:</td> - <td class="value"> - <input name=<%$name%> value="<%$content|h%>" SIZE=<%$size%>> - </td> -</tr> -<%ARGS> -$title => undef -$content => " " -$name => undef -$size => undef -</%ARGS> diff --git a/rt/html/Elements/ShadedRow b/rt/html/Elements/ShadedRow deleted file mode 100644 index 8947fcd82..000000000 --- a/rt/html/Elements/ShadedRow +++ /dev/null @@ -1,31 +0,0 @@ -%# 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 -<tr> - <td class="label"><%$title |n %>:</td> - <td class="value"><%$content |n %></td> -</tr> -<%ARGS> -$title => undef -$content => " " -</%ARGS> diff --git a/rt/html/Elements/SimpleSearch b/rt/html/Elements/SimpleSearch index 2b34d3a24..e76f801df 100644 --- a/rt/html/Elements/SimpleSearch +++ b/rt/html/Elements/SimpleSearch @@ -45,5 +45,5 @@ %# END BPS TAGGED BLOCK }}} <form action="<% $RT::WebPath %>/index.html"> <input size="12" name="q" autocomplete="off" accesskey="0"> -<input type="submit" value="<&|/l&>Search</&>"> +<input type="submit" value="<&|/l&>Search tickets</&>"> </form> diff --git a/rt/html/Elements/Tabs b/rt/html/Elements/Tabs index b2081edca..f5839a9e5 100644 --- a/rt/html/Elements/Tabs +++ b/rt/html/Elements/Tabs @@ -62,7 +62,12 @@ my $basetopactions = { B => { html => $m->scomp('/Elements/SimpleSearch') } }; -my $basetabs = { A => { title => loc('Homepage'), +my $basetabs = { + ' A'=> { title => 'Billing Main', + path => &RT::URI::freeside::FreesideURL(), + }, + A => { #title => loc('Homepage'), + title => 'Ticketing Main', path => '', }, B => { title => loc('Tickets'), @@ -96,6 +101,8 @@ if (!defined $toptabs) { if (!defined $topactions) { $topactions = $basetopactions; } + + require RT::URI::freeside; # Now let callbacks add their extra tabs $m->comp('/Elements/Callback', diff --git a/rt/html/Elements/ViewUser b/rt/html/Elements/ViewUser deleted file mode 100644 index 657272496..000000000 --- a/rt/html/Elements/ViewUser +++ /dev/null @@ -1,51 +0,0 @@ -%# 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 -<& /Elements/TitleBoxStart, - title => "<a class='inverse' href=\"$RT::WebPath/Search/Listing.html?LimitRequestorById=1&IdOfRequestor=".$User->id."\">".loc("Tickets from [_1]", $name)."</a>", - titleright=> "<a class='inverse' href=\"$RT::WebPath/EditUserComments.html?id=".$User->id."\">".loc("Comments about [_1]", $name)."</a>" &> -<TABLE WIDTH="100%"> -<tr> -<td halign=left valign=top> -%while (my $w=$tickets->Next) { -<%$w->Id%>: <a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$w->id%>"><%$w->Subject%></a> (<%$w->Status%>)<BR> -%} -</td> -<td align=right valign=top> - <% ($User->Comments || loc("No comment entered about this user")) %> -</tr> -</table> -<& /Elements/TitleBoxEnd &> - -<%ARGS> -$User=>undef -</%ARGS> - -<%INIT> -my $name=$User->RealName || $User->EmailAddress; - -my $tickets = new RT::Tickets($session{'CurrentUser'}); -$tickets->LimitWatcher(TYPE => 'Requestor', VALUE => $User->EmailAddress); - - -</%INIT> diff --git a/rt/html/NoAuth/images/back_home.gif b/rt/html/NoAuth/images/back_home.gif Binary files differdeleted file mode 100644 index 40b19c153..000000000 --- a/rt/html/NoAuth/images/back_home.gif +++ /dev/null diff --git a/rt/html/NoAuth/images/head_requestracker.gif b/rt/html/NoAuth/images/head_requestracker.gif Binary files differdeleted file mode 100644 index 73315e918..000000000 --- a/rt/html/NoAuth/images/head_requestracker.gif +++ /dev/null diff --git a/rt/html/NoAuth/images/rt.jpg b/rt/html/NoAuth/images/rt.jpg Binary files differdeleted file mode 100644 index a137a932b..000000000 --- a/rt/html/NoAuth/images/rt.jpg +++ /dev/null diff --git a/rt/html/NoAuth/images/small-logo.png b/rt/html/NoAuth/images/small-logo.png Binary files differnew file mode 100644 index 000000000..1e415e6d8 --- /dev/null +++ b/rt/html/NoAuth/images/small-logo.png diff --git a/rt/html/NoAuth/images/spacer.gif b/rt/html/NoAuth/images/spacer.gif Binary files differdeleted file mode 100644 index 5bfd67a2d..000000000 --- a/rt/html/NoAuth/images/spacer.gif +++ /dev/null diff --git a/rt/html/NoAuth/images/squares_blue.gif b/rt/html/NoAuth/images/squares_blue.gif Binary files differdeleted file mode 100644 index a28da5ce1..000000000 --- a/rt/html/NoAuth/images/squares_blue.gif +++ /dev/null diff --git a/rt/html/NoAuth/webrt.css b/rt/html/NoAuth/webrt.css index ccdd49d60..bc688ac1d 100644 --- a/rt/html/NoAuth/webrt.css +++ b/rt/html/NoAuth/webrt.css @@ -45,15 +45,18 @@ %# END BPS TAGGED BLOCK }}} SPAN.nav { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; - color: #FFFFFF; +%# color: #FFFFFF; + color: #000000; text-decoration: none; white-space: nowrap} .nav2 { font-size: 10px; white-space: nowrap} .nav { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; - font-weight: normal; - color: #FFFFFF; +%# font-weight: normal; + font-weight: bold; +%# color: #FFFFFF; + color: #000000; text-decoration: none; white-space: nowrap} .currentnav { font-family: Verdana, Arial, Helvetica, sans-serif; @@ -65,7 +68,8 @@ SPAN.nav { font-family: Verdana, Arial, Helvetica, sans-serif; .topnav { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 16px; font-weight: normal; - color: #FFFFFF; +%# color: #FFFFFF; + color: #000000; text-decoration: none; white-space: nowrap} @@ -77,96 +81,96 @@ SPAN.nav { font-family: Verdana, Arial, Helvetica, sans-serif; a.topnav-0 { font-family: Verdana, sans-serif; font-size: 16px; font-weight: normal; - color: #FFFFFF; + color: #000000; text-decoration: none; white-space: nowrap} a.topnav-1 { font-family: Verdana, sans-serif; font-size: 14px; font-weight: normal; - color: #FFFFFF; + color: #000000; text-decoration: none; white-space: nowrap} a.topnav-2 { font-family: Verdana, sans-serif; font-size: 12px; font-weight: normal; - color: #FFFFFF; + color: #000000; text-decoration: none; white-space: nowrap} a.topnav-3 { font-family: Verdana, sans-serif; font-size: 11px; font-weight: normal; - color: #FFFFFF; + color: #000000; text-decoration: none; white-space: nowrap} a.topnav-4 { font-family: Verdana, sans-serif; font-size: 11px; font-weight: normal; - color: #FFFFFF; + color: #000000; text-decoration: none; white-space: nowrap} a.topnav-5 { font-family: Verdana, sans-serif; font-size: 11px; font-weight: normal; - color: #FFFFFF; + color: #000000; text-decoration: none; white-space: nowrap} li.topnav-0-minor { - border-top: solid #999999 1px; + border-top: solid #777777 1px; padding-top: .1em; margin-top: .5em; } li.topnav-1-minor { - border-top: solid #999999 1px; + border-top: solid #777777 1px; padding-top: .1em; margin-top: .5em; } li.topnav-2-minor { - border-top: solid #999999 1px; + border-top: solid #777777 1px; padding-top: .1em; margin-top: .5em; } li.topnav-3-minor { - border-top: solid #999999 1px; + border-top: solid #777777 1px; padding-top: .1em; margin-top: .5em; } li.topnav-4-minor { - border-top: solid #999999 1px; + border-top: solid #777777 1px; padding-top: .1em; margin-top: .5em; } li.topnav-5-minor { - border-top: solid #999999 1px; + border-top: solid #777777 1px; padding-top: .1em; margin-top: .5em; } li.topnav-0-major { - border-bottom: solid white 1px; + border-bottom: solid black 1px; padding-top: .25em; padding-bottom: .5em; } li.topnav-1-major { - border-bottom: solid white 1px; + border-bottom: solid black 1px; padding-top: .25em; padding-bottom: .5em; } li.topnav-2-major { - border-bottom: solid white 1px; + border-bottom: solid black 1px; padding-top: .25em; padding-bottom: .5em; } li.topnav-3-major { - border-bottom: solid white 1px; + border-bottom: solid black 1px; padding-top: .25em; padding-bottom: .5em; } li.topnav-4-major { - border-bottom: solid white 1px; + border-bottom: solid black 1px; padding-top: .25em; padding-bottom: .5em; } li.topnav-5-major { - border-bottom: solid white 1px; + border-bottom: solid black 1px; padding-top: .25em; padding-bottom: .5em; } @@ -174,7 +178,8 @@ li.topnav-5-major { .currenttopnav { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 16px; font-weight: bold; - color: #FFFF66; +%# color: #FFFF66; + color: #000000; background-color: #cccccc; text-decoration: none; white-space: nowrap} @@ -186,37 +191,37 @@ li.topnav-5-major { a.currenttopnav-0 { font-family: Verdana, sans-serif; font-size: 16px; font-weight: bold; - color: #FFFF66; + color: #000000; background-color: #cccccc; text-decoration: none; white-space: nowrap} a.currenttopnav-1 { font-family: Verdana, sans-serif; font-size: 14px; font-weight: bold; - color: #FFFF66; + color: #000000; background-color: #cccccc; text-decoration: none; white-space: nowrap} a.currenttopnav-2 { font-family: Verdana, sans-serif; font-size: 12px; font-weight: normal; - color: #FFFF66; + color: #000000; background-color: #cccccc; text-decoration: none; white-space: nowrap} a.currenttopnav-3 { font-family: Verdana, sans-serif; font-size: 11px; font-weight: normal; - color: #FFFF66; + color: #000000; background-color: #cccccc; text-decoration: none; white-space: nowrap} a.currenttopnav-4 { font-family: Verdana, sans-serif; font-size: 11px; font-weight: normal; - color: #FFFF66; + color: #000000; background-color: #cccccc; text-decoration: none; white-space: nowrap} a.currenttopnav-5 { font-family: Verdana, sans-serif; font-size: 11px; font-weight: normal; - color: #FFFF66; + color: #000000; background-color: #cccccc; text-decoration: none; white-space: nowrap} li.currenttopnav-0-minor { @@ -225,57 +230,57 @@ li.currenttopnav-0-minor { margin-top: .5em; } li.currenttopnav-1-minor { - border-top: solid #999999 1px; + border-top: solid #777777 1px; padding-top: .1em; margin-top: .5em; } li.currenttopnav-2-minor { - border-top: solid #999999 1px; + border-top: solid #777777 1px; padding-top: .1em; margin-top: .5em; } li.currenttopnav-3-minor { - border-top: solid #999999 1px; + border-top: solid #777777 1px; padding-top: .1em; margin-top: .5em; } li.currenttopnav-4-minor { - border-top: solid #999999 1px; + border-top: solid #777777 1px; padding-top: .1em; margin-top: .5em; } li.currenttopnav-5-minor { - border-top: solid #999999 1px; + border-top: solid #777777 1px; padding-top: .1em; margin-top: .5em; } li.currenttopnav-0-major { - border-bottom: solid white 1px; + border-bottom: solid black 1px; padding-top: .25em; padding-bottom: .5em; } li.currenttopnav-1-major { - border-bottom: solid white 1px; + border-bottom: solid black 1px; padding-top: .25em; padding-bottom: .5em; } li.currenttopnav-2-major { - border-bottom: solid white 1px; + border-bottom: solid black 1px; padding-top: .25em; padding-bottom: .5em; } li.currenttopnav-3-major { - border-bottom: solid white 1px; + border-bottom: solid black 1px; padding-top: .25em; padding-bottom: .5em; } li.currenttopnav-4-major { - border-bottom: solid white 1px; + border-bottom: solid black 1px; padding-top: .25em; padding-bottom: .5em; } li.currenttopnav-5-major { - border-bottom: solid white 1px; + border-bottom: solid black 1px; padding-top: .25em; padding-bottom: .5em; } @@ -307,7 +312,9 @@ li.currenttopnav-5-major { vertical-align: top; text-align: left; } -.blue { background-color: #4682B4; +.blue { + background-color: #4682B4; +%# background-color: #eeeeee; background-position: left top; vertical-align: top; text-align: left; @@ -324,12 +331,50 @@ li.currenttopnav-5-major { vertical-align: top; text-align: left; } -.darkblue { background-color: #000080; +.darkblue { + background-color: #000080; + background-position: left top; + vertical-align: top; + text-align: left; + } +.darkblueright { + background-color: #000080; + background-position: left top; + vertical-align: top; + text-align: right; + } +.lightgray { + background-color: #eeeeee; + background-position: left top; + vertical-align: top; + text-align: left; + } +.lightgrayright { + background-color: #eeeeee; + background-position: left top; + vertical-align: top; + text-align: right; + } +.mediumgray { + background-color: #cccccc; + background-position: left top; + vertical-align: top; + text-align: left; + } +.mediumgrayright { + background-color: #cccccc; + background-position: left top; + vertical-align: top; + text-align: right; + } +.white { + background-color: #ffffff; background-position: left top; vertical-align: top; text-align: left; } -.darkblueright { background-color: #000080; +.whiteright { + background-color: #ffffff; background-position: left top; vertical-align: top; text-align: right; @@ -518,7 +563,9 @@ SPAN.date { font-size: 0.8em } span.title { font-size: 1.6em; vertical-align: middle; - color: #ffffff;} +%# color: #ffffff; + color: #000000; + } span.productname { font-size: 2em; color: #0066cc;} SPAN.titleboxtitle, SPAN.titleboxclose { diff --git a/rt/html/Search/Elements/PickRestriction b/rt/html/Search/Elements/PickRestriction deleted file mode 100644 index ff9b86ba5..000000000 --- a/rt/html/Search/Elements/PickRestriction +++ /dev/null @@ -1,142 +0,0 @@ -%# 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 -<FORM ACTION="<%$RT::WebPath%>/Search/Listing.html" METHOD="GET"> -<INPUT TYPE=HIDDEN NAME="Bookmark" VALUE="<% $session{'tickets'}->FreezeLimits()%>"> -<& /Elements/TitleBoxStart, title => loc('Refine search')&> -<INPUT TYPE=HIDDEN NAME="CompileRestriction" VALUE=1> - -<ul> -<li><&|/l&>Owner is</&> <& /Elements/SelectBoolean, Name => "OwnerOp", - TrueVal=> '=', - FalseVal => '!=' -&> -<& /Elements/SelectOwner, Name => "ValueOfOwner" &> - -<li> -<& /Elements/SelectWatcherType, Name => "WatcherRole", AllowNull => 0 &> -<&|/l&>email address</&> -<& /Elements/SelectMatch, Name => "WatcherRoleOp" &> -<INPUT Name="ValueOfWatcherRole" SIZE=20> - -<li> -<&|/l&>Subject</&> <& /Elements/SelectMatch, Name => "SubjectOp" &> -<INPUT Name="ValueOfSubject" SIZE=20> - -<li><&|/l&>Queue</&> <& /Elements/SelectBoolean, Name => "QueueOp" , - True => loc("is"), - False => loc("isn't"), - TrueVal=> '=', - FalseVal => '!=' &> -<& /Elements/SelectQueue, Name => "ValueOfQueue" &> - - -<li><&|/l&>Priority</&> <& /Elements/SelectEqualityOperator, Name => "PriorityOp" &> - -<INPUT Name="ValueOfPriority" SIZE=5> - -<li> -<& /Elements/SelectDateType, Name => 'DateType' &> -<& /Elements/SelectDateRelation, Name=>"DateOp" &> -<& /Elements/SelectDate, Name => "ValueOfDate", ShowTime => 0, Default => '' &> - -<li><&|/l&>Ticket attachment</&> - -<& /Elements/SelectAttachmentField, Name => 'AttachmentField' &> -<& /Elements/SelectBoolean, Name => "AttachmentFieldOp", - True => loc("matches"), - False => loc("does not match"), - TrueVal => 'LIKE', - FalseVal => 'NOT LIKE' -&> -<Input Name="ValueOfAttachmentField" Size=20> - -<li><&|/l&>Status</&> -<& /Elements/SelectBoolean, Name => "StatusOp", - True => loc("is"), - False => loc("isn't"), - TrueVal=> '=', - FalseVal => '!=' -&> -<& /Elements/SelectStatus, Name => "ValueOfStatus", SkipDeleted => 1 &> - - -% while ( my $CustomField = $CustomFields->Next ) { - -<li><% $CustomField->Name %> - <& /Elements/SelectCustomFieldOperator, Name => "CustomFieldOp". $CustomField->id, - True => loc("is"), - False => loc("isn't"), - TrueVal=> '=', FalseVal => '!=' &> - -<& /Elements/SelectCustomFieldValue, Name => "CustomField".$CustomField->id, - CustomField => $CustomField, - &> -% } - -</UL> - -<& /Elements/TitleBoxEnd &> - -<& /Elements/TitleBoxStart, title => loc('Ordering and sorting')&> - -<UL> - -<li><&|/l&>Results per page</&> <& /Elements/SelectResultsPerPage, Name => "RowsPerPage", - Default => $session{'tickets_rows_per_page'} || '50' -&> - -<li><&|/l&>Sort results by</&> <& /Elements/SelectTicketSortBy, Name => "TicketsSortBy", - Default => $session{'tickets_sort_by'} -&> -<& /Elements/SelectSortOrder, Name => 'TicketsSortOrder', Default => $session{'tickets_sort_order'} &> - -<li><input type="checkbox" name="HideResults" <%$ARGS{'HideResults'} && 'CHECKED'%>> <&|/l&>Don't show search results</&> -<li><& /Elements/Refresh, Name => 'RefreshSearchInterval' , Default => $session{'tickets_refresh_interval'} &> - -</UL> - - -</DIV> - - - -<& /Elements/TitleBoxEnd &> - -<& /Elements/Submit, Label => loc('Search'), Name => 'Action'&> - -</FORM> - - - <%INIT> -my $CustomFields = RT::CustomFields->new( $session{'CurrentUser'}); - foreach ( $session{'tickets'}->RestrictionValues('Queue') ) { - # Gotta load up the $queue object, since queues get stored by name now. - my $queue = RT::Queue->new($session{'CurrentUser'}); - $queue->Load($_); - $CustomFields->LimitToQueue($queue->Id); - } - - $CustomFields->LimitToGlobal(); - -</%INIT> diff --git a/rt/html/Search/Elements/TicketHeader b/rt/html/Search/Elements/TicketHeader deleted file mode 100644 index ed2f60e4e..000000000 --- a/rt/html/Search/Elements/TicketHeader +++ /dev/null @@ -1,40 +0,0 @@ -%# 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 -<TR> -<& TicketHeaderCell , Attribute => 'id', Header => '#'&> -<& TicketHeaderCell , Attribute => 'Subject'&> -<& TicketHeaderCell , Attribute => 'Status'&> -<& TicketHeaderCell , Attribute => 'Queue'&> -<& TicketHeaderCell , Attribute => 'Owner'&> -<& TicketHeaderCell , Attribute => 'Priority'&> -</TR> -<TR> -<TH class="ticketheader"> </TH> -<& TicketHeaderCell , Attribute => 'Requestor(s)'&> -<& TicketHeaderCell , Attribute => 'Created'&> -<& TicketHeaderCell , Attribute => 'Told', Header => 'Last Contact'&> -<& TicketHeaderCell , Attribute => 'LastUpdated', Header => 'Last Updated'&> -<& TicketHeaderCell , Attribute => 'TimeLeft', Header => 'Left'&> -</TR> -%# loc('Last Notified'); diff --git a/rt/html/Search/Elements/TicketHeaderCell b/rt/html/Search/Elements/TicketHeaderCell deleted file mode 100644 index 5def9ea37..000000000 --- a/rt/html/Search/Elements/TicketHeaderCell +++ /dev/null @@ -1,55 +0,0 @@ -%# 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 -<%INIT> -my ($order,$curorder); - $Attribute =~ s/Obj->(Name|AsString|AgeAsString)//g; - if ($session{'tickets_sort_order'} =~ /^asc$/i) { - $order = 'DESC'; - $curorder = 'ASC'; - } else { - $order = 'ASC'; - $curorder = 'DESC'; - } -$Header = $Attribute unless ($Header); - -</%INIT> -<th class="ticketheader"> -% if (grep (/^$Attribute$/i, $session{'tickets'}->SortFields)) { -<A -% if ($Attribute eq $session{'tickets_sort_by'}) { -class="currenttab" -HREF="<% $RT::WebPath%>/Search/Listing.html?Bookmark=<%$session{'tickets'}->FreezeLimits()|u%>&TicketsSortBy=<%$Attribute%>&TicketsSortOrder=<%$order%>&RowsPerPage=<%$session{'tickets_rows_per_page'}%>"> -% } else { -HREF="<% $RT::WebPath%>/Search/Listing.html?Bookmark=<%$session{'tickets'}->FreezeLimits()|u%>&TicketsSortBy=<%$Attribute%>&TicketsSortOrder=<%$curorder%>&RowsPerPage=<%$session{'tickets_rows_per_page'}%>"> -% } -<% loc($Header) %> -</A> -% } else { -<% loc($Header) %> -% } -</th> -<%ARGS> -$Header => undef -$Attribute => undef -</%ARGS> diff --git a/rt/html/Search/Elements/TicketRow b/rt/html/Search/Elements/TicketRow deleted file mode 100644 index 5d1ad209a..000000000 --- a/rt/html/Search/Elements/TicketRow +++ /dev/null @@ -1,55 +0,0 @@ -%# 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 -<SPAN class="search"> -<TR -% if ($i%2) { -CLASS="oddline" -% } else { -CLASS="evenline" -% } -> -<TD ROWSPAN="2"><B><A HREF="<%$RT::WebPath%>/Ticket/Display.html?id=<%$Ticket->Id%>"><%$Ticket->id%></a></B></TD> -<TD><B><A HREF="<%$RT::WebPath%>/Ticket/Display.html?id=<%$Ticket->Id%>"><%$Ticket->Subject%></a></B></TD> -<TD><%loc($Ticket->Status)%></TD> -<TD><%$Ticket->QueueObj->Name%></TD> -<TD><%$Ticket->Owner == $RT::Nobody->Id ? loc('Nobody') : $Ticket->OwnerObj->Name%></TD> -<TD><%$Ticket->Priority%></TD> -</TR> -<TR -% if ($i%2) { -CLASS="oddline" -% } else { -CLASS="evenline" -% } -><TD><small><%$Ticket->Requestors->MemberEmailAddressesAsString%></small></TD> -<TD><SMALL><%$Ticket->CreatedObj->AgeAsString || '-'%></SMALL></TD> -<TD><SMALL><%$Ticket->ToldObj->AgeAsString || '-'%></SMALL></TD> -<TD><SMALL><%$Ticket->LastUpdatedObj->AgeAsString || '-'%></SMALL></TD> -<TD><SMALL><%$Ticket->TimeLeft%></SMALL></TD> -</TR> -</SPAN> -<%ARGS> -$Ticket => undef -$i => undef -</%ARGS> diff --git a/rt/html/Search/Listing.html b/rt/html/Search/Listing.html deleted file mode 100644 index 68b1fd75c..000000000 --- a/rt/html/Search/Listing.html +++ /dev/null @@ -1,113 +0,0 @@ -%# 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 -<& /Elements/Header, Title => $title, Refresh => $session{'tickets_refresh_interval'} &> -<& /Ticket/Elements/Tabs, - current_tab => 'Search/Listing.html', - Title => $title &> - -%if ($ticketcount && ! $ARGS{'HideResults'}) { -<TABLE WIDTH=100% border=0 cellpadding=2 CELLSPACING=0> -<& Elements/TicketHeader, %ARGS &> -% my $i; -%while (my $Ticket = $session{'tickets'}->Next) { -% $i++; -<& Elements/TicketRow, Ticket => $Ticket, i=> $i, %ARGS &> -%} -</TABLE> -<div align=center> -<font size=2> -<a href="<%$RT::WebPath%>/Search/Listing.html?GotoPage=1"><&|/l&>First page</&></a> - -% if ( $session{'tickets'}->FirstRow >= $session{'tickets_rows_per_page'}-1 ) { -<a href="<%$RT::WebPath%>/Search/Listing.html?GotoPage=Prev"><<&|/l&>Previous page</&></a> - -% } -% if ( $session{'tickets'}->FirstRow + $session{'tickets_rows_per_page'} < $ticketcount ) { -<a href="<%$RT::WebPath%>/Search/Listing.html?GotoPage=Next"><&|/l&>Next page</&>></a> -% } -%# <form method=get action="<%$RT::WebPath%>/Search/Listing.html"><&|/l&>Goto page</&> <input name=GotoPage size=2></form> -</font> -</div> -<!--<div align=right>--> -<table width="100%" border=0 cellpadding=3 CELLSPACING=1> -<tr> -<td align=left> -(<&|/l, ($session{'tickets'}->FirstRow+1), ($session{'tickets'}->FirstRow() + $session{'tickets'}->RowsPerPage() ) &>[_1] - [_2] shown</&>) -</td> -<td align=right> - -<a href="<%$RT::WebPath%>/Search/Bulk.html"><&|/l&>Update all these tickets at once</&></a> -<!--</div>--> -</td> -</tr> -</table> - -% } -<TABLE WIDTH="100%"> -<TR> -<TD VALIGN="TOP"> -<& /Elements/TitleBoxStart, title => loc('Current search criteria')&> - -%my %restrictions=$session{'tickets'}->DescribeRestrictions(); -%foreach my $row (keys %restrictions){ -<%$restrictions{"$row"}%> <A HREF="<% $RT::WebPath %>/Search/Listing.html?DeleteRestriction=<%$row%>">[<&|/l&>delete</&>]</a><br> -%} -<BR> -<BR> -<A HREF="<% $RT::WebPath%>/Search/Listing.html?Bookmark=<%$session{'tickets'}->FreezeLimits()|nu%>&TicketsSortBy=<%$session{'tickets_sort_by'}%>&TicketsSortOrder=<%$session{'tickets_sort_order'}%>&RowsPerPage=<%$session{'tickets_rows_per_page'}%>"><&|/l&>Bookmarkable URL for this search</&></a> -<& /Elements/TitleBoxEnd&> -</TD> -<TD> - -<& Elements/PickRestriction, %ARGS &> - -</TD> -</TR> -</TABLE> - -<%INIT> - -my ($title, $ticketcount); -$session{'i'}++; -if ($session{'tickets'}) { - if ($ARGS{'DeleteRestriction'}) { - $session{'tickets'}->DeleteRestriction($ARGS{'DeleteRestriction'}); - } - if ( ($ARGS{'ClearRestrictions'}) || ($ARGS{'NewSearch'}) ) { - $session{'tickets'}->ClearRestrictions; - $session{'tickets'}->CleanSlate; - } -} - ProcessSearchQuery(ARGS=>\%ARGS); - $session{'tickets'}->RedoSearch(); - if ( $session{'tickets'}->DescribeRestrictions()) { - $ticketcount = $session{tickets}->CountAll(); - $title = loc('Found [quant,_1,ticket]', $ticketcount); - } else { - $title = loc("Find tickets"); - } -</%INIT> -<%CLEANUP> -$session{'tickets'}->PrepForSerialization(); -</%CLEANUP> diff --git a/rt/html/Ticket/Elements/AddCustomers b/rt/html/Ticket/Elements/AddCustomers new file mode 100644 index 000000000..01c7367c4 --- /dev/null +++ b/rt/html/Ticket/Elements/AddCustomers @@ -0,0 +1,50 @@ +%# Copyright (c) 2004 Ivan Kohler <ivan-rt@420.am> +%# +%# 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. +<BR> +<%$msg%><br> + +% if (@Customers) { + +<br><i>(Check box to link)<i> +<table> +% foreach my $customer (@Customers) { +<tr> + <td> + <input type="checkbox" name="Ticket-AddCustomer-<% $customer->{'custnum'} %>" VALUE="1" <% scalar(@Customers) == 1 ? 'CHECKED' : '' %>> + <A HREF="<%$freeside_url%>/view/cust_main.cgi?<% $customer->{'custnum'} %>"><% &RT::URI::freeside::small_custview($customer->{'custnum'}, &RT::URI::freeside::FreesideGetConfig('countrydefault'), 1) |n %> + </td> +</tr> +% } + +% } + +<%INIT> +my ($msg); + +my $freeside_url = &RT::URI::freeside::FreesideURL(); + +my @Customers = (); +if ( $CustomerString ) { + @Customers = &RT::URI::freeside::smart_search( 'search' => $CustomerString ); +} + +my @Services = (); +if ($ServiceString) { + @Services = (); #service_search(); +} + +</%INIT> + +<%ARGS> +$CustomerString => undef +$ServiceString => undef +</%ARGS> diff --git a/rt/html/Ticket/Elements/EditCustomers b/rt/html/Ticket/Elements/EditCustomers new file mode 100644 index 000000000..47d1aa222 --- /dev/null +++ b/rt/html/Ticket/Elements/EditCustomers @@ -0,0 +1,67 @@ +%# Copyright (c) 2004 Ivan Kohler <ivan-rt@420.am> +%# +%# 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. +<TABLE width=100%> + <TR> + <TD VALIGN=TOP WIDTH=50%> + <h3><&|/l&>Current Customers</&></h3> + +<table> + <tr> + <td><i><&|/l&>(Check box to disassociate)</&></i></td> + </tr> + <tr> + <td class="value"> +% #while (my $link = $Ticket->MemberOf->Next) { +% foreach my $link ( +% grep { $_->TargetURI->Resolver->{'fstable'} eq 'cust_main' } +% grep { $_->TargetURI->Scheme eq 'freeside' } +% @{ $Ticket->_Links('Base')->ItemsArrayRef } +% ) { + + <INPUT TYPE=CHECKBOX NAME="DeleteLink--<%$link->Type%>-<%$link->Target%>"> +%# <& ShowLink, URI => $link->TargetURI &><br> + <A HREF="<% $link->TargetURI->Resolver->HREF %>"><% $link->TargetURI->Resolver->AsStringLong |n %></A> + <BR> +% } + </td> + </tr> +</table> + +</TD> + +<TD VALIGN=TOP> +<h3><&|/l&>New Customer Links</&></h3> +<&|/l&>Find customer</&><BR> +<input name="CustomerString"> +<input type=submit name="OnlySearchForCustomers" value="<&|/l&>Go!</&>"> +<br><i>cust #, last name, or company</i> +<BR> +%#<BR> +%#<&|/l&>Find service</&><BR> +%#<input name="ServiceString"> +%#<input type=submit name="OnlySearchForServices" value="<&|/l&>Go!</&>"> +%#<br><i>username, username@domain, domain, or IP address</i> +%#<BR> + +<& AddCustomers, Ticket => $Ticket, + CustomerString => $CustomerString, + ServiceString => $ServiceString, &> + +</TD> +</TR> +</TABLE> + +<%ARGS> +$CustomerString => undef +$ServiceString => undef +$Ticket => undef +</%ARGS> diff --git a/rt/html/Ticket/Elements/EditLinks b/rt/html/Ticket/Elements/EditLinks deleted file mode 100644 index bdb8a6b7d..000000000 --- a/rt/html/Ticket/Elements/EditLinks +++ /dev/null @@ -1,133 +0,0 @@ -%# 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 -<TABLE width=100%> - <TR> - <TD VALIGN=TOP WIDTH=50%> - <h3><&|/l&>Current Relationships</&></h3> - -<table> - <tr> - <td></td> - <td><i><&|/l&>(Check box to delete)</&></i></td> - </tr> - <tr> - <td class="labeltop"><&|/l&>Depends on</&>:</td> - <td class="value"> -% while (my $link = $Ticket->DependsOn->Next) { - <INPUT TYPE=CHECKBOX NAME="DeleteLink--<%$link->Type%>-<%$link->Target%>"> - <& ShowLink, URI => $link->TargetURI &><br> -% } - </td> - </tr> - <tr> - <td class="labeltop"><&|/l&>Depended on by</&>:</td> - <td class="value"> -% while (my $link = $Ticket->DependedOnBy->Next) { -% my $member = $link->BaseObj; - <INPUT TYPE=CHECKBOX NAME="DeleteLink-<%$link->Base%>-<%$link->Type%>-"> - <& ShowLink, URI => $link->BaseURI &><br> -% } - </td> - </tr> - <tr> - <td class="labeltop"><&|/l&>Parents</&>:</td> - <td class="value"> -% while (my $link = $Ticket->MemberOf->Next) { - <INPUT TYPE=CHECKBOX NAME="DeleteLink--<%$link->Type%>-<%$link->Target%>"> - <& ShowLink, URI => $link->TargetURI &><br> -% } - </td> - </tr> - <tr> - <td class="labeltop"><&|/l&>Children</&>:</td> - <td class="value"> -% while (my $link = $Ticket->Members->Next) { - <INPUT TYPE=CHECKBOX NAME="DeleteLink-<%$link->Base%>-<%$link->Type%>-"> - <& ShowLink, URI => $link->BaseURI &><br> -% } - </td> - </tr> - <tr> - <td class="labeltop"><&|/l&>Refers to</&>:</td> - <td class="value"> -% while (my $link = $Ticket->RefersTo->Next) { - <INPUT TYPE=CHECKBOX NAME="DeleteLink--<%$link->Type%>-<%$link->Target%>"> - <& ShowLink, URI => $link->TargetURI &><br> -%} - </td> - </tr> - <tr> - <td class="labeltop"><&|/l&>Referred to by</&>:</td> - <td class="value"> -% while (my $link = $Ticket->ReferredToBy->Next) { - <INPUT TYPE=CHECKBOX NAME="DeleteLink-<%$link->Base%>-<%$link->Type%>-"> - <& ShowLink, URI => $link->BaseURI &><br> -% } - </td> - </tr> -</table> - -</TD> -<TD VALIGN=TOP> -<h3><&|/l&>New Relationships</&></h3> -<i><&|/l&>Enter tickets or URIs to link tickets to. Seperate multiple entries with spaces.</&></i><br> -<TABLE> - <TR> - <TD class="label"><&|/l&>Merge into</&>:</TD> - <TD class="entry"><input name="<%$Ticket->Id%>-MergeInto"> <i><&|/l&>(only one ticket)</&></i></TD> - </TR> - <TR> - <TD class="label"><&|/l&>Depends on</&>:</TD> - <TD class="entry"><input name="<%$Ticket->Id%>-DependsOn"></TD> - </TR> - <TR> - <TD class="label"><&|/l&>Depended on by</&>:</TD> - <TD class="entry"><input name="DependsOn-<%$Ticket->Id%>"></TD> - </TR> - <TR> - <TD class="label"><&|/l&>Parents</&>:</TD> - <TD class="entry"><input name="<%$Ticket->Id%>-MemberOf"></TD> - </TR> - <TR> - <TD class="label"><&|/l&>Children</&>:</TD> - <TD class="entry"> <input name="MemberOf-<%$Ticket->Id%>"></TD> - </TR> - <TR> - <TD class="label"><&|/l&>Refers to</&>:</TD> - <TD class="entry"><input name="<%$Ticket->Id%>-RefersTo"></TD> - </TR> - <TR> - <TD class="label"><&|/l&>Referred to by</&>:</TD> - <TD class="entry"> <input name="RefersTo-<%$Ticket->Id%>"></TD> - </TR> -</TABLE> -</TD> -</TR> -</TABLE> - - - -<%ARGS> -$Ticket => undef -</%ARGS> diff --git a/rt/html/Ticket/Elements/ShowCustomers b/rt/html/Ticket/Elements/ShowCustomers new file mode 100644 index 000000000..612727ede --- /dev/null +++ b/rt/html/Ticket/Elements/ShowCustomers @@ -0,0 +1,40 @@ +%# Copyright (c) 2004 Ivan Kohler <ivan-rt@420.am> +%# +%# 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. +<table> +% my $cust = 0; +% foreach my $customerURI ( +% grep { $_->Resolver->{'fstable'} eq 'cust_main' } +% grep { $_->Scheme eq 'freeside' } +% map { $_->TargetURI } +% @{ $Ticket->_Links('Base')->ItemsArrayRef } +% ) { +% $cust++; +% my $cust_main = ''; + <tr> + <td class="value"> + <A HREF="<% $customerURI->Resolver->HREF %>"><% $customerURI->Resolver->AsStringLong |n %></A> + </td> + </tr> +% } +% unless ( $cust ) { + <tr> + <td class="labeltop"> + <i>(none)<i> + </td> + </tr> + +% } +</table> +<%ARGS> +$Ticket => undef +</%ARGS> + diff --git a/rt/html/Ticket/Elements/ShowLink b/rt/html/Ticket/Elements/ShowLink deleted file mode 100644 index 493fd95a5..000000000 --- a/rt/html/Ticket/Elements/ShowLink +++ /dev/null @@ -1,40 +0,0 @@ -%# 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 -<A href="<%$URI->Resolver->HREF%>"> -% if ($URI->IsLocal) { -% my $member = $URI->Object; -% if (UNIVERSAL::isa($member, "RT::Ticket")) { -<%$member->Id%>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> [<% loc($member->Status) %>] -% } elsif ( UNIVERSAL::can($member, 'Name')) { -<%$URI->Resolver->AsString%>: <%$member->Name%> -% } else { -<%$URI->Resolver->AsString%> -% } -% } else { -<%$URI->Resolver->AsString%> -% } -</a> -<%ARGS> -$URI => undef -</%ARGS> diff --git a/rt/html/Ticket/Elements/ShowLinks b/rt/html/Ticket/Elements/ShowLinks deleted file mode 100644 index f88a6008d..000000000 --- a/rt/html/Ticket/Elements/ShowLinks +++ /dev/null @@ -1,87 +0,0 @@ -%# 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 -<table> - <tr> - <td class="labeltop"><&|/l&>Depends on</&>:</td> - <td class="value"> -<ul> -% while (my $Link = $Ticket->DependsOn->Next) { -<li><& ShowLink, URI => $Link->TargetURI &> -% } -</ul> - </td> - </tr> - <tr> - <td class="labeltop"><&|/l&>Depended on by</&>:</td> - <td class="value"> -<ul> -% while (my $Link = $Ticket->DependedOnBy->Next) { -<li><& ShowLink, URI => $Link->BaseURI &> -% } -</ul> - </td> - </tr> - <tr> - <td class="labeltop"><&|/l&>Parents</&>:</td> - <td class="value"> -<ul> -% while (my $Link = $Ticket->MemberOf->Next) { -<li><& ShowLink, URI => $Link->TargetURI &> -% } -</ul> - </td> - </tr> - <tr> - <td class="labeltop"><&|/l&>Children</&>:</td> - <td class="value"><& /Ticket/Elements/ShowMembers, Ticket => $Ticket &></td> - </tr> - <tr> - <td class="labeltop"><&|/l&>Refers to</&>:</td> - <td class="value"> -<ul> -% while (my $Link = $Ticket->RefersTo->Next) { -<li><& ShowLink, URI => $Link->TargetURI &> -% } -</ul> - </td> - </tr> - <tr> - <td class="labeltop"><&|/l&>Referred to by</&>:</td> - <td class="value"> - <ul> -% while (my $Link = $Ticket->ReferredToBy->Next) { -<li><& ShowLink, URI => $Link->BaseURI &> -% } -</ul> - </td> - </tr> - -% # Allow people to add more rows to the table -% $m->comp('/Elements/Callback', %ARGS ); - -</table> - -<%ARGS> -$Ticket => undef -</%ARGS> diff --git a/rt/html/Ticket/Elements/ShowSummary b/rt/html/Ticket/Elements/ShowSummary index 31571400e..5a6e7e099 100644 --- a/rt/html/Ticket/Elements/ShowSummary +++ b/rt/html/Ticket/Elements/ShowSummary @@ -69,6 +69,15 @@ color => "#333399" &> <& /Ticket/Elements/ShowPeople, Ticket => $Ticket &> <& /Elements/TitleBoxEnd &> + <br> + + <& /Elements/TitleBoxStart, title => loc('Customers'), + title_href =>"$RT::WebPath/Ticket/ModifyCustomers.html?id=".$Ticket->Id, + title_class=> 'inverse', + color => "#7f007b" &> + <& /Ticket/Elements/ShowCustomers, Ticket => $Ticket &> + <& /Elements/TitleBoxEnd &> + <BR> </TD> <TD VALIGN=TOP WIDTH="50%" class="boxcontainer"> diff --git a/rt/html/Ticket/Elements/Tabs b/rt/html/Ticket/Elements/Tabs index 1a5058691..46e1d4a27 100644 --- a/rt/html/Ticket/Elements/Tabs +++ b/rt/html/Ticket/Elements/Tabs @@ -119,6 +119,8 @@ my $ticket_page_tabs = { { title => loc('People'), path => "Ticket/ModifyPeople.html?id=" . $id, }, _E => { title => loc('Links'), path => "Ticket/ModifyLinks.html?id=" . $id, }, + _Eb=> { title => loc('Customers'), + path => "Ticket/ModifyCustomers.html?id=" . $id, }, _F => { title => loc('Jumbo'), path => "Ticket/ModifyAll.html?id=" . $id, separator => 1 diff --git a/rt/html/Ticket/ModifyCustomers.html b/rt/html/Ticket/ModifyCustomers.html new file mode 100644 index 000000000..72d103b23 --- /dev/null +++ b/rt/html/Ticket/ModifyCustomers.html @@ -0,0 +1,49 @@ +%# Copyright (c) 2004 Ivan Kohler <ivan-rt@420.am> +%# +%# 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. +<& /Elements/Header, Title => loc("Customers for ticket #[_1]", $Ticket->Id) &> +<& /Ticket/Elements/Tabs, + Ticket => $Ticket, + current_tab => "Ticket/ModifyCustomers.html?id=".$Ticket->Id, + Title => loc("Customers for ticket #[_1]", $Ticket->Id) &> + +<& /Elements/ListActions, actions => \@results &> + +<form action="ModifyCustomers.html" method="post"> +<input type="hidden" name="id" value="<%$Ticket->id%>"> + +<& /Elements/TitleBoxStart, title => loc('Edit Customer Links'), color => "#7f007b"&> +<& Elements/EditCustomers, Ticket => $Ticket, CustomerString => $CustomerString, ServiceString => $ServiceString &> +<& /Elements/TitleBoxEnd &> +<& /Elements/Submit, color => "#7f007b", Label => loc('Save Changes') &> +</form> + + +<%INIT> + +my @results = (); +my $Ticket = LoadTicket($id); + +# if we're trying to search for customers/services and nothing else +unless ( $OnlySearchForCustomers || $OnlySearchForServices) { + @results = ProcessTicketCustomers( TicketObj => $Ticket, ARGSRef => \%ARGS); +} + +</%INIT> + + +<%ARGS> +$OnlySearchForCustomers => undef +$OnlySearchForServices => undef +$CustomerString => undef +$ServiceString => undef +$id => undef +</%ARGS> diff --git a/rt/lib/RT/I18N/en_malkovich.po b/rt/lib/RT/I18N/en_malkovich.po deleted file mode 100644 index 74769f1a3..000000000 --- a/rt/lib/RT/I18N/en_malkovich.po +++ /dev/null @@ -1,3973 +0,0 @@ -msgid "" -msgstr "" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: html/Approvals/Elements/Approve:26 html/Approvals/Elements/ShowDependency:49 html/SelfService/Display.html:24 html/Ticket/Display.html:25 html/Ticket/Display.html:29 -#. ($TicketObj->Id, $TicketObj->Subject) -#. ($Ticket->id, $Ticket->Subject) -#. ($ticket->Id, $ticket->Subject) -#. ($link->BaseObj->Id, $link->BaseObj->Subject) -msgid "#%1: %2" -msgstr "#%1: %2" - -#: html/Search/Elements/SelectPersonType:30 lib/RT/Date.pm:337 -#. ($s, $time_unit) -#. ($option, $subtype) -msgid "%1 %2" -msgstr "%1 %2" - -#: lib/RT/Tickets_Overlay.pm:828 -#. ($args{'FIELD'}, $args{'OPERATOR'}, $args{'VALUE'}) -msgid "%1 %2 %3" -msgstr "%1 %2 %3" - -#: lib/RT/Date.pm:373 -#. ($self->GetWeekday($wday), $self->GetMonth($mon), map {sprintf "%02d", $_} ($mday, $hour, $min, $sec), ($year+1900)) -msgid "%1 %2 %3 %4:%5:%6 %7" -msgstr "%1 %2 %3 %4:%5:%6 %7" - -#: lib/RT/Ticket_Overlay.pm:3451 lib/RT/Transaction_Overlay.pm:550 lib/RT/Transaction_Overlay.pm:593 -#. ($cf->Name, $new_value->Content) -#. ($field, $self->NewValue) -#. ($self->Field, $principal->Object->Name) -msgid "%1 %2 added" -msgstr "%1 %2 Malkovich" - -#: lib/RT/Date.pm:334 -#. ($s, $time_unit) -msgid "%1 %2 ago" -msgstr "%1 %2 ago" - -#: lib/RT/Ticket_Overlay.pm:3457 lib/RT/Transaction_Overlay.pm:557 -#. ($cf->Name, $old_value, $new_value->Content) -#. ($field, $self->OldValue, $self->NewValue) -msgid "%1 %2 changed to %3" -msgstr "%1 %2 Malkovich to %3" - -#: lib/RT/Ticket_Overlay.pm:3454 lib/RT/Transaction_Overlay.pm:553 lib/RT/Transaction_Overlay.pm:599 -#. ($cf->Name, $old_value) -#. ($field, $self->OldValue) -#. ($self->Field, $principal->Object->Name) -msgid "%1 %2 deleted" -msgstr "%1 %2 Malkovich" - -#: html/Admin/Elements/EditScrips:43 html/Admin/Elements/ListGlobalScrips:27 html/Ticket/Elements/PreviewScrips:53 -#. ($scrip->ConditionObj->Name, $scrip->ActionObj->Name, $scrip->TemplateObj->Name) -#. (loc($scrip->ConditionObj->Name), loc($scrip->ActionObj->Name), loc($scrip->TemplateObj->Name)) -msgid "%1 %2 with template %3" -msgstr "%1 %2 Malkovich %3" - -#: bin/rt-crontool:165 bin/rt-crontool:172 bin/rt-crontool:178 -#. ("--search-argument", "--search") -#. ("--condition-argument", "--condition") -#. ("--action-argument", "--action") -msgid "%1 - An argument to pass to %2" -msgstr "%1 - A Malkovich to pass to %2" - -#: bin/rt-crontool:181 -#. ("--verbose") -msgid "%1 - Output status updates to STDOUT" -msgstr "%1 - Malkovich Malkovich to MALKOVICH" - -#: bin/rt-crontool:175 -#. ("--action") -msgid "%1 - Specify the action module you want to use" -msgstr "%1 - Malkovich the Malkovich Malkovich to use" - -#: bin/rt-crontool:169 -#. ("--condition") -msgid "%1 - Specify the condition module you want to use" -msgstr "%1 - Malkovich the Malkovich Malkovich to use" - -#: bin/rt-crontool:162 -#. ("--search") -msgid "%1 - Specify the search module you want to use" -msgstr "%1 - Malkovich the Malkovich Malkovich to use" - -#: lib/RT/ScripAction_Overlay.pm:114 -#. ($self->Id) -msgid "%1 ScripAction loaded" -msgstr "%1 Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:3484 -#. ($args{'Value'}, $cf->Name) -msgid "%1 added as a value for %2" -msgstr "%1 Malkovich as a Malkovich %2" - -#: lib/RT/Link_Overlay.pm:111 lib/RT/Link_Overlay.pm:118 -#. ($args{'Base'}) -#. ($args{'Target'}) -msgid "%1 appears to be a local object, but can't be found in the database" -msgstr "%1 Malkovich to be a Malkovich, but can't be Malkovich in the Malkovich" - -#: html/Ticket/Elements/ShowDates:52 lib/RT/Transaction_Overlay.pm:458 -#. ($self->BriefDescription , $self->CreatorObj->Name) -#. ($Ticket->LastUpdatedAsString, $Ticket->LastUpdatedByObj->Name) -msgid "%1 by %2" -msgstr "%1 by %2" - -#: lib/RT/Transaction_Overlay.pm:512 lib/RT/Transaction_Overlay.pm:688 lib/RT/Transaction_Overlay.pm:697 lib/RT/Transaction_Overlay.pm:700 -#. ($self->Field , ( $self->OldValue || $no_value ) , $self->NewValue) -#. ($self->Field , $q1->Name , $q2->Name) -#. ($self->Field, $t2->AsString, $t1->AsString) -#. ($self->Field, $self->OldValue, $self->NewValue) -msgid "%1 changed from %2 to %3" -msgstr "%1 Malkovich %2 to %3" - -#: lib/RT/Record.pm:739 -msgid "%1 could not be set to %2." -msgstr "%1 Malkovich be set to %2." - -#: lib/RT/Ticket_Overlay.pm:2739 -#. ($self) -msgid "%1 couldn't set status to resolved. RT's Database may be inconsistent." -msgstr "%1 couldn't Malkovich to Malkovich. RT's Malkovich be Malkovich." - -#: NOT FOUND IN SOURCE -msgid "%1 highest priority tickets I own..." -msgstr "%1 Malkovich Malkovich I Malkovich..." - -#: html/Elements/MyTickets:26 -#. ($rows) -msgid "%1 highest priority tickets I requested..." -msgstr "%1 Malkovich Malkovich I Malkovich..." - -#: bin/rt-crontool:157 -#. ($0) -msgid "%1 is a tool to act on tickets from an external scheduling tool, such as cron." -msgstr "%1 is a tool to act on Malkovich a Malkovich Malkovich, such as cron." - -#: lib/RT/Queue_Overlay.pm:784 -#. ($principal->Object->Name, $args{'Type'}) -msgid "%1 is no longer a %2 for this queue." -msgstr "%1 is no Malkovich a %2 Malkovich." - -#: lib/RT/Ticket_Overlay.pm:3540 -#. ($args{'Value'}, $cf->Name) -msgid "%1 is no longer a value for custom field %2" -msgstr "%1 is no Malkovich a Malkovich Malkovich %2" - -#: html/Ticket/Create.html:155 html/Ticket/Create.html:156 html/Ticket/Elements/ShowBasics:36 html/Ticket/Elements/ShowBasics:42 html/Ticket/Elements/ShowBasics:47 -#. ('<input size=3 name="TimeWorked" value="'.$ARGS{TimeWorked}.'">') -#. ('<input size=3 name="TimeLeft" value="'.$ARGS{TimeLeft}.'">') -#. ($Ticket->TimeEstimated) -#. ($Ticket->TimeWorked) -#. ($Ticket->TimeLeft) -msgid "%1 min" -msgstr "%1 min" - -#: html/User/Elements/DelegateRights:75 -#. (loc($ObjectType =~ /^RT::(.*)$/)) -msgid "%1 rights" -msgstr "%1 Malkovich" - -#: lib/RT/Action/ResolveMembers.pm:41 -#. (ref $self) -msgid "%1 will resolve all members of a resolved group ticket." -msgstr "%1 Malkovich Malkovich of a Malkovich Malkovich." - -#: lib/RT/Transaction_Overlay.pm:408 -#. ($self) -msgid "%1: no attachment specified" -msgstr "%1: no Malkovich Malkovich" - -#: html/Ticket/Elements/ShowTransactionAttachments:56 -#. ($size) -msgid "%1b" -msgstr "%1b" - -#: html/Ticket/Elements/ShowTransactionAttachments:53 -#. (int( $size / 102.4 ) / 10) -msgid "%1k" -msgstr "%1k" - -#: lib/RT/Ticket_Overlay.pm:1252 -#. ($args{'Status'}) -msgid "'%1' is an invalid value for status" -msgstr "'%1' is a Malkovich Malkovich" - -#: html/Admin/Elements/EditCustomFieldValues:24 html/Admin/Elements/EditQueueWatchers:28 html/Admin/Elements/EditScrips:34 html/Admin/Elements/EditTemplates:35 html/Admin/Groups/Members.html:51 html/Elements/EditLinks:32 html/Ticket/Elements/EditPeople:45 html/User/Groups/Members.html:54 -msgid "(Check box to delete)" -msgstr "(Malkovich to Malkovich)" - -#: html/Ticket/Elements/PreviewScrips:49 -msgid "(Check boxes to disable notifications to the listed recipients)" -msgstr "(Malkovich to Malkovich Malkovich to the Malkovich Malkovich)" - -#: html/Ticket/Elements/PreviewScrips:71 -msgid "(Check boxes to enable notifications to the listed recipients)" -msgstr "(Malkovich to Malkovich Malkovich to the Malkovich Malkovich)" - -#: NOT FOUND IN SOURCE -msgid "(Enter ticket ids or URLs, seperated with spaces)" -msgstr "(Malkovich Malkovich or URLs, Malkovich Malkovich)" - -#: html/Admin/Queues/Modify.html:53 html/Admin/Queues/Modify.html:59 -#. ($RT::CorrespondAddress) -#. ($RT::CommentAddress) -msgid "(If left blank, will default to %1" -msgstr "(If Malkovich, Malkovich to %1" - -#: html/Admin/Elements/EditCustomFields:32 html/Admin/Elements/ListGlobalCustomFields:31 -msgid "(No custom fields)" -msgstr "(No Malkovich)" - -#: html/Admin/Groups/Members.html:49 html/User/Groups/Members.html:52 -msgid "(No members)" -msgstr "(No Malkovich)" - -#: html/Admin/Elements/EditScrips:31 html/Admin/Elements/ListGlobalScrips:31 -msgid "(No scrips)" -msgstr "(No Malkovich)" - -#: html/Admin/Elements/EditTemplates:30 -msgid "(No templates)" -msgstr "(No Malkovich)" - -#: html/Ticket/Update.html:66 -msgid "(Sends a blind carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will receive future updates.)" -msgstr "(Malkovich a Malkovich-copy of Malkovich to a Malkovich-Malkovich of Malkovich. Does <b>not</b> Malkovich Malkovich Malkovich Malkovich.)" - -#: html/Ticket/Create.html:78 -msgid "(Sends a carbon-copy of this update to a comma-delimited list of administrative email addresses. These people <b>will</b> receive future updates.)" -msgstr "(Malkovich a Malkovich-copy of Malkovich to a Malkovich-Malkovich of Malkovich Malkovich Malkovich. Malkovich <b>will</b> Malkovich Malkovich.)" - -#: html/Ticket/Update.html:62 -msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. Does <b>not</b> change who will receive future updates.)" -msgstr "(Malkovich a Malkovich-copy of Malkovich to a Malkovich-Malkovich of Malkovich. Does <b>not</b> Malkovich Malkovich Malkovich Malkovich.)" - -#: html/Ticket/Create.html:68 -msgid "(Sends a carbon-copy of this update to a comma-delimited list of email addresses. These people <b>will</b> receive future updates.)" -msgstr "(Malkovich a Malkovich-copy of Malkovich to a Malkovich-Malkovich of Malkovich. Malkovich <b>will</b> Malkovich Malkovich.)" - -#: html/Admin/Groups/index.html:32 html/User/Groups/index.html:32 -msgid "(empty)" -msgstr "(Malkovich)" - -#: html/Admin/Users/index.html:38 -msgid "(no name listed)" -msgstr "(no Malkovich)" - -#: html/Admin/Elements/SelectRights:47 html/Elements/SelectCustomFieldValue:29 html/Ticket/Elements/EditCustomField:64 html/Ticket/Elements/ShowCustomFields:35 lib/RT/Transaction_Overlay.pm:511 -msgid "(no value)" -msgstr "(no Malkovich)" - -#: html/Elements/EditLinks:105 html/Ticket/Elements/BulkLinks:27 -msgid "(only one ticket)" -msgstr "(Malkovich)" - -#: html/Elements/TicketList:167 -msgid "(pending approval)" -msgstr "(Malkovich Malkovich)" - -#: html/Elements/TicketList:170 -msgid "(pending other Collection)" -msgstr "(Malkovich Malkovich)" - -#: NOT FOUND IN SOURCE -msgid "(pending other tickets)" -msgstr "(Malkovich Malkovich)" - -#: html/Admin/Users/Modify.html:49 -msgid "(required)" -msgstr "(Malkovich)" - -#: html/Ticket/Elements/ShowTransactionAttachments:60 -msgid "(untitled)" -msgstr "(Malkovich)" - -#: NOT FOUND IN SOURCE -msgid "..." -msgstr "..." - -#: html/Ticket/Elements/ShowBasics:31 -msgid "<% $Ticket->Status%>" -msgstr "<% $Ticket->Status %>" - -#: html/Elements/SelectTicketTypes:26 -msgid "<% $_ %>" -msgstr "<% $_ %>" - -#: docs/design_docs/string-extraction-guide.txt:54 html/Elements/CreateTicket:25 lib/RT/StyleGuide.pod:767 -#. ($m->scomp('/Elements/SelectNewTicketQueue')) -msgid "<input type=\"submit\" value=\"New ticket in\"> %1" -msgstr "<input type=\"submit\" value=\"Malkovich in\"> %1" - -#: etc/initialdata:218 -msgid "A blank template" -msgstr "A Malkovich" - -#: lib/RT/ACE_Overlay.pm:156 lib/RT/Principal_Overlay.pm:180 -msgid "ACE not found" -msgstr "Malkovich" - -#: lib/RT/ACE_Overlay.pm:830 -msgid "ACEs can only be created and deleted." -msgstr "Malkovich be Malkovich and Malkovich." - -#: NOT FOUND IN SOURCE -msgid "Aborting to avoid unintended ticket modifications.\\n" -msgstr "Malkovich to Malkovich Malkovich Malkovich Malkovich.\\n" - -#: html/User/Elements/Tabs:31 -msgid "About me" -msgstr "Malkovich me" - -#: html/Admin/Users/Modify.html:79 -msgid "Access control" -msgstr "Malkovich" - -#: html/Admin/Elements/EditScrip:49 -msgid "Action" -msgstr "Malkovich" - -#: lib/RT/Scrip_Overlay.pm:148 -#. ($args{'ScripAction'}) -msgid "Action %1 not found" -msgstr "Malkovich %1 Malkovich" - -#: bin/rt-crontool:119 -msgid "Action committed." -msgstr "Malkovich Malkovich." - -#: bin/rt-crontool:115 -msgid "Action prepared..." -msgstr "Malkovich..." - -#: html/Search/Bulk.html:93 -msgid "Add AdminCc" -msgstr "Malkovich" - -#: html/Search/Bulk.html:89 -msgid "Add Cc" -msgstr "Add Cc" - -#: html/Ticket/Create.html:113 html/Ticket/Update.html:81 -msgid "Add More Files" -msgstr "Malkovich" - -#: html/Search/Bulk.html:85 -msgid "Add Requestor" -msgstr "Malkovich" - -#: html/Admin/Elements/AddCustomFieldValue:24 -msgid "Add Value" -msgstr "Malkovich" - -#: html/Admin/Global/Scrip.html:54 -msgid "Add a scrip which will apply to all queues" -msgstr "Add a Malkovich Malkovich to Malkovich" - -#: html/Search/Bulk.html:125 -msgid "Add comments or replies to selected tickets" -msgstr "Malkovich or Malkovich to Malkovich Malkovich" - -#: html/Admin/Groups/Members.html:41 html/User/Groups/Members.html:38 -msgid "Add members" -msgstr "Malkovich" - -#: html/Admin/Queues/People.html:65 html/Ticket/Elements/AddWatchers:27 -msgid "Add new watchers" -msgstr "Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:684 -#. ($args{'Type'}) -msgid "Added principal as a %1 for this queue" -msgstr "Malkovich as a %1 Malkovich" - -#: lib/RT/Ticket_Overlay.pm:1547 -#. ($self->loc($args{'Type'})) -msgid "Added principal as a %1 for this ticket" -msgstr "Malkovich as a %1 Malkovich" - -#: html/Admin/Users/Modify.html:119 html/User/Prefs.html:111 -msgid "Address1" -msgstr "Malkovich1" - -#: html/Admin/Users/Modify.html:124 html/User/Prefs.html:115 -msgid "Address2" -msgstr "Malkovich2" - -#: html/Ticket/Create.html:73 -msgid "Admin Cc" -msgstr "Malkovich Cc" - -#: etc/initialdata:295 -msgid "Admin Comment" -msgstr "Malkovich" - -#: etc/initialdata:274 -msgid "Admin Correspondence" -msgstr "Malkovich Malkovich" - -#: html/Admin/Queues/index.html:24 html/Admin/Queues/index.html:27 -msgid "Admin queues" -msgstr "Malkovich" - -#: html/Admin/Global/index.html:25 html/Admin/Global/index.html:27 -msgid "Admin/Global configuration" -msgstr "Malkovich/Malkovich Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Admin/Queue/Basics" -msgstr "Malkovich/Malkovich/Malkovich" - -#: etc/initialdata:56 html/Ticket/Elements/ShowPeople:38 lib/RT/ACE_Overlay.pm:88 -msgid "AdminCc" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:73 -msgid "AdminCustomFields" -msgstr "Malkovich Malkovich" - -#: lib/RT/Group_Overlay.pm:146 -msgid "AdminGroup" -msgstr "Malkovich" - -#: lib/RT/Group_Overlay.pm:148 -msgid "AdminGroupMembership" -msgstr "Malkovich Malkovich" - -#: lib/RT/System.pm:58 -msgid "AdminOwnPersonalGroups" -msgstr "Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:69 -msgid "AdminQueue" -msgstr "Malkovich" - -#: lib/RT/System.pm:59 -msgid "AdminUsers" -msgstr "Malkovich" - -#: html/Admin/Queues/People.html:47 html/Ticket/Elements/EditPeople:53 -msgid "Administrative Cc" -msgstr "Malkovich Cc" - -#: html/Elements/SelectDateRelation:35 -msgid "After" -msgstr "Malkovich" - -#: etc/initialdata:363 -msgid "All Approvals Passed" -msgstr "Malkovich Malkovich" - -#: html/Admin/Elements/EditCustomFields:94 -msgid "All Custom Fields" -msgstr "Malkovich Malkovich" - -#: html/Admin/Queues/index.html:52 -msgid "All Queues" -msgstr "Malkovich" - -#: html/Elements/Tabs:58 -msgid "Approval" -msgstr "Malkovich" - -#: html/Approvals/Display.html:45 html/Approvals/Elements/ShowDependency:41 html/Approvals/index.html:64 -#. ($Ticket->Id, $Ticket->Subject) -#. ($ticket->id, $msg) -#. ($link->BaseObj->Id, $link->BaseObj->Subject) -msgid "Approval #%1: %2" -msgstr "Malkovich #%1: %2" - -#: html/Approvals/index.html:53 -#. ($ticket->Id) -msgid "Approval #%1: Notes not recorded due to a system error" -msgstr "Malkovich #%1: Malkovich Malkovich to a Malkovich" - -#: html/Approvals/index.html:51 -#. ($ticket->Id) -msgid "Approval #%1: Notes recorded" -msgstr "Malkovich #%1: Malkovich" - -#: etc/initialdata:351 -msgid "Approval Passed" -msgstr "Malkovich" - -#: etc/initialdata:374 -msgid "Approval Rejected" -msgstr "Malkovich Malkovich" - -#: html/Approvals/Elements/Approve:43 -msgid "Approve" -msgstr "Malkovich" - -#: etc/initialdata:504 -msgid "Approver's notes: %1" -msgstr "Malkovich's Malkovich: %1" - -#: lib/RT/Date.pm:414 -msgid "Apr." -msgstr "Apr." - -#: html/Elements/SelectSortOrder:34 html/Search/Elements/DisplayOptions:52 -msgid "Ascending" -msgstr "Malkovich" - -#: html/Search/Bulk.html:134 html/SelfService/Update.html:47 html/Ticket/ModifyAll.html:82 html/Ticket/Update.html:81 -msgid "Attach" -msgstr "Malkovich" - -#: html/SelfService/Create.html:64 html/Ticket/Create.html:109 -msgid "Attach file" -msgstr "Malkovich" - -#: html/SelfService/Update.html:36 html/Ticket/Create.html:97 html/Ticket/Update.html:70 -msgid "Attached file" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:416 -msgid "Attachment created" -msgstr "Malkovich Malkovich" - -#: lib/RT/Tickets_Overlay.pm:1251 -msgid "Attachment filename" -msgstr "Malkovich Malkovich" - -#: html/Ticket/Elements/ShowAttachments:25 -msgid "Attachments" -msgstr "Malkovich" - -#: lib/RT/Attributes_Overlay.pm:158 -msgid "Attribute Deleted" -msgstr "Malkovich Malkovich" - -#: lib/RT/Date.pm:418 -msgid "Aug." -msgstr "Aug." - -#: NOT FOUND IN SOURCE -msgid "AuthSystem" -msgstr "Malkovich" - -#: etc/initialdata:221 -msgid "Autoreply" -msgstr "Malkovich" - -#: etc/initialdata:72 -msgid "Autoreply To Requestors" -msgstr "Malkovich To Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Bad data in %1" -msgstr "Malkovich in %1" - -#: html/Admin/Elements/GroupTabs:38 html/Admin/Elements/QueueTabs:38 html/Admin/Elements/UserTabs:37 html/Ticket/Elements/Tabs:91 html/User/Elements/GroupTabs:37 -msgid "Basics" -msgstr "Malkovich" - -#: html/Ticket/Update.html:64 -msgid "Bcc" -msgstr "Bcc" - -#: html/Admin/Elements/EditScrip:73 -msgid "Be sure to save your changes" -msgstr "Be sure to Malkovich Malkovich" - -#: html/Elements/SelectDateRelation:33 lib/RT/CurrentUser.pm:336 -msgid "Before" -msgstr "Malkovich" - -#: etc/initialdata:217 -msgid "Blank" -msgstr "Malkovich" - -#: html/Ticket/Elements/ShowHistory:38 html/Ticket/Elements/ShowHistory:44 -msgid "Brief headers" -msgstr "Malkovich" - -#: html/Search/Bulk.html:24 html/Search/Bulk.html:25 -msgid "Bulk ticket update" -msgstr "Malkovich Malkovich" - -#: lib/RT/User_Overlay.pm:1533 -msgid "Can not modify system users" -msgstr "Malkovich Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:68 -msgid "Can this principal see this queue" -msgstr "Malkovich Malkovich Malkovich" - -#: lib/RT/CustomField_Overlay.pm:211 -msgid "Can't add a custom field value without a name" -msgstr "Can't add a Malkovich Malkovich Malkovich a name" - -#: lib/RT/Link_Overlay.pm:126 -msgid "Can't link a ticket to itself" -msgstr "Can't link a Malkovich to Malkovich" - -#: lib/RT/Ticket_Overlay.pm:2716 -msgid "Can't merge into a merged ticket. You should never get this error" -msgstr "Can't Malkovich a Malkovich. Malkovich Malkovich Malkovich" - -#: lib/RT/Record.pm:1060 lib/RT/Record.pm:1138 -msgid "Can't specifiy both base and target" -msgstr "Can't Malkovich Malkovich and Malkovich" - -#: html/autohandler:132 -#. ($msg) -msgid "Cannot create user: %1" -msgstr "Malkovich Malkovich: %1" - -#: etc/initialdata:50 html/Admin/Queues/People.html:43 html/SelfService/Create.html:48 html/Ticket/Create.html:63 html/Ticket/Elements/EditPeople:50 html/Ticket/Elements/ShowPeople:34 html/Ticket/Update.html:59 lib/RT/ACE_Overlay.pm:87 -msgid "Cc" -msgstr "Cc" - -#: html/SelfService/Prefs.html:30 -msgid "Change password" -msgstr "Malkovich" - -#: html/SelfService/Update.html:39 html/Ticket/Create.html:100 html/Ticket/Update.html:73 -msgid "Check box to delete" -msgstr "Malkovich to Malkovich" - -#: html/Admin/Elements/SelectRights:30 -msgid "Check box to revoke right" -msgstr "Malkovich to Malkovich" - -#: html/Elements/EditLinks:121 html/Elements/EditLinks:63 html/Elements/ShowLinks:56 html/Ticket/Create.html:183 html/Ticket/Elements/BulkLinks:42 -msgid "Children" -msgstr "Malkovich" - -#: html/Admin/Users/Modify.html:129 html/User/Prefs.html:119 -msgid "City" -msgstr "City" - -#: html/Ticket/Elements/ShowDates:47 -msgid "Closed" -msgstr "Malkovich" - -#: html/SelfService/Closed.html:24 -msgid "Closed Tickets" -msgstr "Malkovich" - -#: html/SelfService/Elements/Tabs:44 -msgid "Closed tickets" -msgstr "Malkovich" - -#: html/Ticket/Elements/ShowTransaction:152 html/Ticket/Elements/Tabs:154 -msgid "Comment" -msgstr "Malkovich" - -#: html/Admin/Queues/Modify.html:57 -msgid "Comment Address" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:88 -msgid "Comment on tickets" -msgstr "Malkovich on Malkovich" - -#: lib/RT/Queue_Overlay.pm:88 -msgid "CommentOnTicket" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Comments" -msgstr "Malkovich" - -#: html/Ticket/ModifyAll.html:69 html/Ticket/Update.html:51 -msgid "Comments (Not sent to requestors)" -msgstr "Malkovich (Malkovich to Malkovich)" - -#: html/Search/Bulk.html:129 -msgid "Comments (not sent to requestors)" -msgstr "Malkovich (Malkovich to Malkovich)" - -#: NOT FOUND IN SOURCE -msgid "Comments about %1" -msgstr "Malkovich %1" - -#: html/Admin/Users/Modify.html:182 html/Ticket/Elements/ShowRequestor:45 -msgid "Comments about this user" -msgstr "Malkovich Malkovich" - -#: lib/RT/Transaction_Overlay.pm:537 -msgid "Comments added" -msgstr "Malkovich" - -#: lib/RT/Action/Generic.pm:149 -msgid "Commit Stubbed" -msgstr "Malkovich" - -#: html/Admin/Elements/EditScrip:41 -msgid "Condition" -msgstr "Malkovich" - -#: bin/rt-crontool:105 -msgid "Condition matches..." -msgstr "Malkovich Malkovich..." - -#: lib/RT/Scrip_Overlay.pm:164 -msgid "Condition not found" -msgstr "Malkovich Malkovich" - -#: html/Elements/Tabs:52 -msgid "Configuration" -msgstr "Malkovich" - -#: html/SelfService/Prefs.html:32 -msgid "Confirm" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "ContactInfoSystem" -msgstr "Malkovich Malkovich" - -#: html/Admin/Elements/ModifyTemplate:43 html/Elements/SelectAttachmentField:26 html/Ticket/ModifyAll.html:86 -msgid "Content" -msgstr "Malkovich" - -#: etc/initialdata:286 -msgid "Correspondence" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Correspondence Address" -msgstr "Malkovich Malkovich" - -#: lib/RT/Transaction_Overlay.pm:533 -msgid "Correspondence added" -msgstr "Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:3471 -msgid "Could not add new custom field value for ticket. " -msgstr "Malkovich Malkovich Malkovich Malkovich Malkovich. " - -#: lib/RT/Ticket_Overlay.pm:2967 lib/RT/Ticket_Overlay.pm:2975 lib/RT/Ticket_Overlay.pm:2992 -msgid "Could not change owner. " -msgstr "Malkovich Malkovich. " - -#: html/Admin/Elements/EditCustomField:84 html/Admin/Elements/EditCustomFields:164 -#. ($msg) -msgid "Could not create CustomField" -msgstr "Malkovich Malkovich Malkovich" - -#: html/User/Groups/Modify.html:76 lib/RT/Group_Overlay.pm:474 lib/RT/Group_Overlay.pm:481 -msgid "Could not create group" -msgstr "Malkovich Malkovich" - -#: html/Admin/Global/Template.html:74 html/Admin/Queues/Template.html:71 -#. ($msg) -msgid "Could not create template: %1" -msgstr "Malkovich Malkovich: %1" - -#: lib/RT/Ticket_Overlay.pm:1185 lib/RT/Ticket_Overlay.pm:364 -msgid "Could not create ticket. Queue not set" -msgstr "Malkovich Malkovich. Malkovich" - -#: lib/RT/User_Overlay.pm:226 lib/RT/User_Overlay.pm:240 lib/RT/User_Overlay.pm:249 lib/RT/User_Overlay.pm:258 lib/RT/User_Overlay.pm:267 lib/RT/User_Overlay.pm:281 lib/RT/User_Overlay.pm:291 lib/RT/User_Overlay.pm:462 -msgid "Could not create user" -msgstr "Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:662 lib/RT/Ticket_Overlay.pm:1515 -msgid "Could not find or create that user" -msgstr "Malkovich or Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:723 lib/RT/Ticket_Overlay.pm:1596 -msgid "Could not find that principal" -msgstr "Malkovich Malkovich Malkovich" - -#: html/Admin/Groups/Members.html:87 html/User/Groups/Members.html:89 html/User/Groups/Modify.html:81 -msgid "Could not load group" -msgstr "Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:682 -#. ($args{'Type'}) -msgid "Could not make that principal a %1 for this queue" -msgstr "Malkovich Malkovich Malkovich a %1 Malkovich" - -#: lib/RT/Ticket_Overlay.pm:1536 -#. ($self->loc($args{'Type'})) -msgid "Could not make that principal a %1 for this ticket" -msgstr "Malkovich Malkovich Malkovich a %1 Malkovich" - -#: lib/RT/Queue_Overlay.pm:781 -#. ($args{'Type'}) -msgid "Could not remove that principal as a %1 for this queue" -msgstr "Malkovich Malkovich Malkovich as a %1 Malkovich" - -#: lib/RT/Group_Overlay.pm:977 -msgid "Couldn't add member to group" -msgstr "Couldn't Malkovich to Malkovich" - -#: lib/RT/Ticket_Overlay.pm:3481 lib/RT/Ticket_Overlay.pm:3537 -#. ($Msg) -msgid "Couldn't create a transaction: %1" -msgstr "Couldn't Malkovich a Malkovich: %1" - -#: lib/RT/Record.pm:748 -msgid "Couldn't find row" -msgstr "Couldn't Malkovich" - -#: lib/RT/Group_Overlay.pm:951 -msgid "Couldn't find that principal" -msgstr "Couldn't Malkovich Malkovich" - -#: lib/RT/CustomField_Overlay.pm:245 -msgid "Couldn't find that value" -msgstr "Couldn't Malkovich" - -#: lib/RT/CurrentUser.pm:123 -#. ($self->Id) -msgid "Couldn't load %1 from the users database.\\n" -msgstr "Couldn't load %1 from the Malkovich.\\n" - -#: html/Admin/Groups/GroupRights.html:87 html/Admin/Groups/UserRights.html:74 -#. ($id) -msgid "Couldn't load group %1" -msgstr "Couldn't Malkovich %1" - -#: lib/RT/Link_Overlay.pm:169 lib/RT/Link_Overlay.pm:178 lib/RT/Link_Overlay.pm:205 -msgid "Couldn't load link" -msgstr "Couldn't Malkovich" - -#: html/Admin/Elements/EditCustomFields:145 html/Admin/Queues/CustomFields.html:35 html/Admin/Queues/People.html:120 -#. ($id) -msgid "Couldn't load queue" -msgstr "Couldn't Malkovich" - -#: html/Admin/Queues/GroupRights.html:100 html/Admin/Queues/UserRights.html:71 -#. ($id) -msgid "Couldn't load queue %1" -msgstr "Couldn't Malkovich %1" - -#: NOT FOUND IN SOURCE -msgid "Couldn't load that user (%1)" -msgstr "Couldn't Malkovich (%1)" - -#: html/SelfService/Display.html:116 -#. ($id) -msgid "Couldn't load ticket '%1'" -msgstr "Couldn't Malkovich '%1'" - -#: html/Admin/Users/Modify.html:146 html/User/Prefs.html:131 -msgid "Country" -msgstr "Malkovich" - -#: html/Admin/Elements/CreateUserCalled:25 html/Admin/Elements/EditCustomField:62 html/Admin/Elements/EditScrip:110 html/Admin/Groups/Modify.html:55 html/Admin/Queues/Template.html:44 html/Elements/QuickCreate:23 html/Ticket/Create.html:134 html/Ticket/Create.html:195 html/User/Groups/Modify.html:55 -msgid "Create" -msgstr "Malkovich" - -#: etc/initialdata:135 -msgid "Create Tickets" -msgstr "Malkovich" - -#: html/Admin/Elements/EditCustomField:74 -msgid "Create a CustomField" -msgstr "Malkovich a Malkovich" - -#: html/Admin/Queues/CustomField.html:47 -#. ($QueueObj->Name()) -msgid "Create a CustomField for queue %1" -msgstr "Malkovich a Malkovich Malkovich %1" - -#: html/Admin/Global/CustomField.html:47 -msgid "Create a CustomField which applies to all queues" -msgstr "Malkovich a Malkovich Malkovich to Malkovich" - -#: html/Admin/Groups/Modify.html:66 html/Admin/Groups/Modify.html:92 -msgid "Create a new group" -msgstr "Malkovich a Malkovich" - -#: html/User/Groups/Modify.html:66 html/User/Groups/Modify.html:91 -msgid "Create a new personal group" -msgstr "Malkovich a Malkovich Malkovich" - -#: html/Ticket/Create.html:24 html/Ticket/Create.html:27 html/Ticket/Create.html:35 -msgid "Create a new ticket" -msgstr "Malkovich a Malkovich" - -#: html/Admin/Users/Modify.html:211 html/Admin/Users/Modify.html:268 -msgid "Create a new user" -msgstr "Malkovich a Malkovich" - -#: html/Admin/Queues/Modify.html:103 -msgid "Create a queue" -msgstr "Malkovich a Malkovich" - -#: html/Admin/Queues/Scrip.html:58 -#. ($QueueObj->Name) -msgid "Create a scrip for queue %1" -msgstr "Malkovich a Malkovich %1" - -#: html/Admin/Global/Template.html:68 html/Admin/Queues/Template.html:64 -msgid "Create a template" -msgstr "Malkovich a Malkovich" - -#: html/SelfService/Create.html:24 -msgid "Create a ticket" -msgstr "Malkovich a Malkovich" - -#: etc/initialdata:137 -msgid "Create new tickets based on this scrip's template" -msgstr "Malkovich Malkovich on Malkovich's Malkovich" - -#: html/SelfService/Create.html:77 -msgid "Create ticket" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:86 -msgid "Create tickets in this queue" -msgstr "Malkovich in Malkovich" - -#: lib/RT/Queue_Overlay.pm:73 -msgid "Create, delete and modify custom fields" -msgstr "Malkovich, Malkovich and Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:69 -msgid "Create, delete and modify queues" -msgstr "Malkovich, Malkovich and Malkovich" - -#: lib/RT/System.pm:58 -msgid "Create, delete and modify the members of personal groups" -msgstr "Malkovich, Malkovich and Malkovich the Malkovich of Malkovich" - -#: lib/RT/System.pm:59 -msgid "Create, delete and modify users" -msgstr "Malkovich, Malkovich and Malkovich" - -#: lib/RT/Queue_Overlay.pm:86 -msgid "CreateTicket" -msgstr "Malkovich" - -#: html/Elements/SelectDateType:25 html/Ticket/Elements/ShowDates:27 lib/RT/Ticket_Overlay.pm:1279 -msgid "Created" -msgstr "Malkovich" - -#: html/Admin/Elements/EditCustomField:87 -#. ($CustomFieldObj->Name()) -msgid "Created CustomField %1" -msgstr "Malkovich Malkovich %1" - -#: html/Elements/EditLinks:27 -msgid "Current Links" -msgstr "Malkovich Malkovich" - -#: html/Admin/Elements/EditScrips:29 -msgid "Current Scrips" -msgstr "Malkovich" - -#: html/Admin/Groups/Members.html:38 html/User/Groups/Members.html:41 -msgid "Current members" -msgstr "Malkovich" - -#: html/Admin/Elements/SelectRights:28 -msgid "Current rights" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Current search criteria" -msgstr "Malkovich Malkovich" - -#: html/Admin/Queues/People.html:40 html/Ticket/Elements/EditPeople:44 -msgid "Current watchers" -msgstr "Malkovich Malkovich" - -#: html/Admin/Global/CustomField.html:54 -#. ($CustomField) -msgid "Custom Field #%1" -msgstr "Malkovich #%1" - -#: html/Admin/Elements/QueueTabs:52 html/Admin/Elements/SystemTabs:39 html/Admin/Global/index.html:49 html/Ticket/Elements/ShowSummary:35 -msgid "Custom Fields" -msgstr "Malkovich" - -#: html/Admin/Elements/EditScrip:101 -msgid "Custom action cleanup code" -msgstr "Malkovich Malkovich Malkovich" - -#: html/Admin/Elements/EditScrip:93 -msgid "Custom action preparation code" -msgstr "Malkovich Malkovich Malkovich" - -#: html/Admin/Elements/EditScrip:85 -msgid "Custom condition" -msgstr "Malkovich Malkovich" - -#: lib/RT/Tickets_Overlay.pm:1693 -#. ($CF->Name , $args{OPERATOR} , $args{VALUE}) -msgid "Custom field %1 %2 %3" -msgstr "Malkovich %1 %2 %3" - -#: lib/RT/Tickets_Overlay.pm:1688 -#. ($CF->Name) -msgid "Custom field %1 has a value." -msgstr "Malkovich %1 has a Malkovich." - -#: lib/RT/Tickets_Overlay.pm:1685 -#. ($CF->Name) -msgid "Custom field %1 has no value." -msgstr "Malkovich %1 has no Malkovich." - -#: lib/RT/Ticket_Overlay.pm:3373 -#. ($args{'Field'}) -msgid "Custom field %1 not found" -msgstr "Malkovich %1 Malkovich" - -#: html/Admin/Elements/EditCustomFields:195 -msgid "Custom field deleted" -msgstr "Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:3523 -msgid "Custom field not found" -msgstr "Malkovich Malkovich" - -#: lib/RT/CustomField_Overlay.pm:355 -#. ($args{'Content'}, $self->Name) -msgid "Custom field value %1 could not be found for custom field %2" -msgstr "Malkovich Malkovich %1 Malkovich be Malkovich Malkovich %2" - -#: lib/RT/CustomField_Overlay.pm:255 -msgid "Custom field value could not be deleted" -msgstr "Malkovich Malkovich Malkovich be Malkovich" - -#: lib/RT/CustomField_Overlay.pm:361 -msgid "Custom field value could not be found" -msgstr "Malkovich Malkovich Malkovich be Malkovich" - -#: lib/RT/CustomField_Overlay.pm:253 lib/RT/CustomField_Overlay.pm:363 -msgid "Custom field value deleted" -msgstr "Malkovich Malkovich Malkovich" - -#: lib/RT/Transaction_Overlay.pm:541 -msgid "CustomField" -msgstr "Malkovich" - -#: html/SelfService/Display.html:38 html/Ticket/Create.html:160 html/Ticket/Elements/ShowSummary:54 html/Ticket/Elements/Tabs:94 html/Ticket/ModifyAll.html:43 -msgid "Dates" -msgstr "Malkovich" - -#: lib/RT/Date.pm:422 -msgid "Dec." -msgstr "Dec." - -#: etc/initialdata:222 -msgid "Default Autoresponse template" -msgstr "Malkovich Malkovich Malkovich" - -#: etc/initialdata:296 -msgid "Default admin comment template" -msgstr "Malkovich Malkovich Malkovich" - -#: etc/initialdata:287 -msgid "Default correspondence template" -msgstr "Malkovich Malkovich Malkovich" - -#: etc/initialdata:253 -msgid "Default transaction template" -msgstr "Malkovich Malkovich Malkovich" - -#: lib/RT/Transaction_Overlay.pm:519 -#. ($type, $self->Field, $self->OldValue, $self->NewValue) -msgid "Default: %1/%2 changed from %3 to %4" -msgstr "Malkovich: %1/%2 Malkovich %3 to %4" - -#: html/User/Delegation.html:24 html/User/Delegation.html:27 -msgid "Delegate rights" -msgstr "Malkovich" - -#: lib/RT/System.pm:62 -msgid "Delegate specific rights which have been granted to you." -msgstr "Malkovich Malkovich Malkovich Malkovich Malkovich to you." - -#: lib/RT/System.pm:62 -msgid "DelegateRights" -msgstr "Malkovich" - -#: html/User/Elements/Tabs:37 -msgid "Delegation" -msgstr "Malkovich" - -#: html/Admin/Elements/EditScrips:53 html/Search/Elements/EditFormat:66 html/Search/Elements/EditSearches:15 -msgid "Delete" -msgstr "Malkovich" - -#: html/Admin/Elements/EditScrips:52 -msgid "Delete selected scrips" -msgstr "Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:91 -msgid "Delete tickets" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:91 -msgid "DeleteTicket" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:162 -msgid "Deleting this object could break referential integrity" -msgstr "Malkovich Malkovich Malkovich Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:329 -msgid "Deleting this object would break referential integrity" -msgstr "Malkovich Malkovich Malkovich Malkovich Malkovich" - -#: lib/RT/User_Overlay.pm:478 -msgid "Deleting this object would violate referential integrity" -msgstr "Malkovich Malkovich Malkovich Malkovich Malkovich Malkovich" - -#: html/Approvals/Elements/Approve:44 -msgid "Deny" -msgstr "Deny" - -#: html/Elements/EditLinks:113 html/Elements/EditLinks:44 html/Elements/ShowLinks:36 html/Ticket/Create.html:181 html/Ticket/Elements/BulkLinks:34 html/Ticket/Elements/ShowDependencies:31 -msgid "Depended on by" -msgstr "Malkovich on by" - -#: lib/RT/Transaction_Overlay.pm:621 -#. ($value) -msgid "Dependency by %1 added" -msgstr "Malkovich by %1 Malkovich" - -#: lib/RT/Transaction_Overlay.pm:661 -#. ($value) -msgid "Dependency by %1 deleted" -msgstr "Malkovich by %1 Malkovich" - -#: lib/RT/Transaction_Overlay.pm:618 -#. ($value) -msgid "Dependency on %1 added" -msgstr "Malkovich on %1 Malkovich" - -#: lib/RT/Transaction_Overlay.pm:658 -#. ($value) -msgid "Dependency on %1 deleted" -msgstr "Malkovich on %1 Malkovich" - -#: html/Elements/EditLinks:109 html/Elements/EditLinks:35 html/Elements/SelectLinkType:26 html/Elements/ShowLinks:26 html/Ticket/Create.html:180 html/Ticket/Elements/BulkLinks:30 html/Ticket/Elements/ShowDependencies:24 -msgid "Depends on" -msgstr "Malkovich on" - -#: html/Elements/SelectSortOrder:34 html/Search/Elements/DisplayOptions:57 -msgid "Descending" -msgstr "Malkovich" - -#: html/SelfService/Create.html:72 html/Ticket/Create.html:118 -msgid "Describe the issue below" -msgstr "Malkovich the Malkovich" - -#: html/Admin/Elements/AddCustomFieldValue:35 html/Admin/Elements/EditCustomField:38 html/Admin/Elements/EditScrip:34 html/Admin/Elements/ModifyTemplate:35 html/Admin/Groups/Modify.html:48 html/Admin/Queues/Modify.html:47 html/Elements/SelectGroups:26 html/Search/Elements/EditSearches:8 html/User/Groups/Modify.html:48 -msgid "Description" -msgstr "Malkovich" - -#: html/Ticket/Elements/Tabs:86 -msgid "Display" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:70 -msgid "Display Access Control List" -msgstr "Malkovich Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:76 -msgid "Display Scrip templates for this queue" -msgstr "Malkovich Malkovich Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:79 -msgid "Display Scrips for this queue" -msgstr "Malkovich Malkovich Malkovich" - -#: html/Ticket/Elements/ShowHistory:34 -msgid "Display mode" -msgstr "Malkovich" - -#: lib/RT/System.pm:53 -msgid "Do anything and everything" -msgstr "Do Malkovich and Malkovich" - -#: html/Elements/Refresh:29 -msgid "Don't refresh this page." -msgstr "Don't Malkovich Malkovich." - -#: NOT FOUND IN SOURCE -msgid "Don't show search results" -msgstr "Don't Malkovich Malkovich" - -#: html/Ticket/Elements/ShowTransactionAttachments:60 -msgid "Download" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Download all the tickets as a tab delimited file" -msgstr "Malkovich the Malkovich as a Malkovich Malkovich" - -#: html/Elements/SelectDateType:31 html/Ticket/Create.html:166 html/Ticket/Elements/EditDates:44 html/Ticket/Elements/ShowDates:43 lib/RT/Ticket_Overlay.pm:1283 -msgid "Due" -msgstr "Due" - -#: NOT FOUND IN SOURCE -msgid "ERROR: Couldn't load ticket '%1': %2.\\n" -msgstr "MALKOVICH: Couldn't Malkovich '%1': %2.\\n" - -#: html/Admin/Queues/CustomFields.html:45 -#. ($Queue->Name) -msgid "Edit Custom Fields for %1" -msgstr "Malkovich Malkovich %1" - -#: html/Search/Bulk.html:141 html/Ticket/ModifyLinks.html:35 -msgid "Edit Links" -msgstr "Malkovich Malkovich" - -#: html/Admin/Queues/Templates.html:41 -#. ($QueueObj->Name) -msgid "Edit Templates for queue %1" -msgstr "Malkovich Malkovich %1" - -#: html/Admin/Global/index.html:45 -msgid "Edit system templates" -msgstr "Malkovich Malkovich" - -#: html/Admin/Queues/Modify.html:118 -#. ($QueueObj->Name) -msgid "Editing Configuration for queue %1" -msgstr "Malkovich Malkovich Malkovich %1" - -#: NOT FOUND IN SOURCE -msgid "Editing Configuration for user %1" -msgstr "Malkovich Malkovich Malkovich %1" - -#: html/Admin/Elements/EditCustomField:90 -#. ($CustomFieldObj->Name()) -msgid "Editing CustomField %1" -msgstr "Malkovich Malkovich %1" - -#: html/Admin/Groups/Members.html:31 -#. ($Group->Name) -msgid "Editing membership for group %1" -msgstr "Malkovich Malkovich Malkovich %1" - -#: html/User/Groups/Members.html:128 -#. ($Group->Name) -msgid "Editing membership for personal group %1" -msgstr "Malkovich Malkovich Malkovich Malkovich %1" - -#: lib/RT/Record.pm:1075 lib/RT/Record.pm:1152 -msgid "Either base or target must be specified" -msgstr "Malkovich or Malkovich be Malkovich" - -#: html/Admin/Users/Modify.html:52 html/Elements/SelectUsers:26 html/Ticket/Elements/AddWatchers:55 html/User/Prefs.html:43 -msgid "Email" -msgstr "Malkovich" - -#: lib/RT/User_Overlay.pm:206 -msgid "Email address in use" -msgstr "Malkovich in use" - -#: NOT FOUND IN SOURCE -msgid "EmailAddress" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "EmailEncoding" -msgstr "Malkovich" - -#: html/Admin/Elements/EditCustomField:50 -msgid "Enabled (Unchecking this box disables this custom field)" -msgstr "Malkovich (Malkovich Malkovich Malkovich Malkovich Malkovich)" - -#: html/Admin/Groups/Modify.html:52 html/User/Groups/Modify.html:52 -msgid "Enabled (Unchecking this box disables this group)" -msgstr "Malkovich (Malkovich Malkovich Malkovich Malkovich)" - -#: html/Admin/Queues/Modify.html:83 -msgid "Enabled (Unchecking this box disables this queue)" -msgstr "Malkovich (Malkovich Malkovich Malkovich Malkovich)" - -#: html/Admin/Elements/EditCustomFields:97 -msgid "Enabled Custom Fields" -msgstr "Malkovich Malkovich" - -#: html/Admin/Queues/index.html:55 -msgid "Enabled Queues" -msgstr "Malkovich" - -#: html/Admin/Elements/EditCustomField:106 html/Admin/Groups/Modify.html:116 html/Admin/Queues/Modify.html:140 html/Admin/Users/Modify.html:308 html/User/Groups/Modify.html:116 -#. (loc_fuzzy($msg)) -msgid "Enabled status %1" -msgstr "Malkovich %1" - -#: lib/RT/CustomField_Overlay.pm:433 -msgid "Enter multiple values" -msgstr "Malkovich Malkovich" - -#: lib/RT/CustomField_Overlay.pm:430 -msgid "Enter one value" -msgstr "Malkovich" - -#: html/Search/Bulk.html:142 -msgid "Enter tickets or URIs to link tickets to. Seperate multiple entries with spaces." -msgstr "Malkovich or URIs to Malkovich to. Malkovich Malkovich Malkovich Malkovich." - -#: html/Elements/Login:39 html/SelfService/Error.html:24 html/SelfService/Error.html:25 -msgid "Error" -msgstr "Error" - -#: lib/RT/Queue_Overlay.pm:593 -msgid "Error in parameters to Queue->AddWatcher" -msgstr "Malkovich in Malkovich to Malkovich->Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Error in parameters to Queue->DelWatcher" -msgstr "Malkovich in Malkovich to Malkovich->Malkovich" - -#: lib/RT/Ticket_Overlay.pm:1468 -msgid "Error in parameters to Ticket->AddWatcher" -msgstr "Malkovich in Malkovich to Malkovich->Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Error in parameters to Ticket->DelWatcher" -msgstr "Malkovich in Malkovich to Malkovich->Malkovich" - -#: etc/initialdata:20 -msgid "Everyone" -msgstr "Malkovich" - -#: bin/rt-crontool:190 -msgid "Example:" -msgstr "Malkovich:" - -#: NOT FOUND IN SOURCE -msgid "ExternalAuthId" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "ExternalContactInfoId" -msgstr "Malkovich Malkovich" - -#: html/Admin/Users/Modify.html:72 -msgid "Extra info" -msgstr "Malkovich" - -#: lib/RT/User_Overlay.pm:342 -msgid "Failed to find 'Privileged' users pseudogroup." -msgstr "Malkovich to find 'Malkovich' Malkovich Malkovich." - -#: lib/RT/User_Overlay.pm:349 -msgid "Failed to find 'Unprivileged' users pseudogroup" -msgstr "Malkovich to find 'Malkovich' Malkovich Malkovich" - -#: bin/rt-crontool:134 -#. ($modname, $@) -msgid "Failed to load module %1. (%2)" -msgstr "Malkovich to Malkovich %1. (%2)" - -#: lib/RT/Date.pm:412 -msgid "Feb." -msgstr "Feb." - -#: html/Search/Elements/PickBasics:60 html/Ticket/Create.html:154 html/Ticket/Elements/EditBasics:57 lib/RT/Tickets_Overlay.pm:1153 -msgid "Final Priority" -msgstr "Malkovich" - -#: lib/RT/Ticket_Overlay.pm:1274 -msgid "FinalPriority" -msgstr "Malkovich" - -#: html/Admin/Queues/People.html:60 html/Ticket/Elements/EditPeople:33 -msgid "Find group whose" -msgstr "Malkovich Malkovich" - -#: html/Admin/Queues/People.html:56 html/Admin/Users/index.html:45 html/Ticket/Elements/EditPeople:29 -msgid "Find people whose" -msgstr "Malkovich Malkovich" - -#: html/Search/Results.html:72 -msgid "Find tickets" -msgstr "Malkovich" - -#: html/Ticket/Elements/Tabs:59 -msgid "First" -msgstr "Malkovich" - -#: docs/design_docs/string-extraction-guide.txt:33 lib/RT/StyleGuide.pod:746 -msgid "Foo Bar Baz" -msgstr "Malkovich" - -#: docs/design_docs/string-extraction-guide.txt:24 lib/RT/StyleGuide.pod:737 -msgid "Foo!" -msgstr "Foo!" - -#: html/Search/Bulk.html:84 -msgid "Force change" -msgstr "Malkovich" - -#: html/Search/Results.html:70 -#. ($ticketcount) -msgid "Found %quant(%1,ticket)" -msgstr "Malkovich %quant(%1,Malkovich)" - -#: lib/RT/Record.pm:750 -msgid "Found Object" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "FreeformContactInfo" -msgstr "Malkovich Malkovich" - -#: lib/RT/CustomField_Overlay.pm:37 -msgid "FreeformMultiple" -msgstr "Malkovich Malkovich" - -#: lib/RT/CustomField_Overlay.pm:36 -msgid "FreeformSingle" -msgstr "Malkovich" - -#: lib/RT/Date.pm:392 -msgid "Fri." -msgstr "Fri." - -#: html/Ticket/Elements/ShowHistory:40 html/Ticket/Elements/ShowHistory:50 -msgid "Full headers" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:587 -#. ($New->Name) -msgid "Given to %1" -msgstr "Malkovich to %1" - -#: html/Admin/Elements/Tabs:40 html/Admin/index.html:37 -msgid "Global" -msgstr "Malkovich" - -#: html/Admin/Elements/SelectTemplate:37 -#. (loc($Template->Name)) -msgid "Global template: %1" -msgstr "Malkovich: %1" - -#: html/Tools/Offline.html:69 -msgid "Go" -msgstr "Go" - -#: html/Admin/Elements/EditCustomFields:73 html/Admin/Groups/index.html:39 html/Admin/Queues/People.html:58 html/Admin/Queues/People.html:62 html/Admin/Queues/index.html:43 html/Admin/Users/index.html:48 html/Ticket/Elements/EditPeople:31 html/Ticket/Elements/EditPeople:35 html/index.html:69 -msgid "Go!" -msgstr "Go!" - -#: html/Elements/GotoTicket:24 html/SelfService/Elements/GotoTicket:24 -msgid "Goto ticket" -msgstr "Malkovich" - -#: html/Ticket/Elements/AddWatchers:45 html/Ticket/Elements/ShowGroupMembers:33 html/User/Elements/DelegateRights:77 -msgid "Group" -msgstr "Malkovich" - -#: html/Admin/Elements/GroupTabs:44 html/Admin/Elements/QueueTabs:56 html/Admin/Elements/SystemTabs:43 html/Admin/Global/index.html:54 -msgid "Group Rights" -msgstr "Malkovich" - -#: lib/RT/Group_Overlay.pm:957 -msgid "Group already has member" -msgstr "Malkovich Malkovich" - -#: html/Admin/Groups/Modify.html:76 -#. ($create_msg) -msgid "Group could not be created: %1" -msgstr "Malkovich be Malkovich: %1" - -#: lib/RT/Group_Overlay.pm:497 -msgid "Group created" -msgstr "Malkovich" - -#: lib/RT/Group_Overlay.pm:1129 -msgid "Group has no such member" -msgstr "Malkovich no Malkovich" - -#: lib/RT/Group_Overlay.pm:937 lib/RT/Queue_Overlay.pm:669 lib/RT/Queue_Overlay.pm:729 lib/RT/Ticket_Overlay.pm:1522 lib/RT/Ticket_Overlay.pm:1602 -msgid "Group not found" -msgstr "Malkovich" - -#: html/Admin/Elements/SelectNewGroupMembers:34 html/Admin/Elements/Tabs:34 html/Admin/Groups/Members.html:63 html/Admin/Queues/People.html:82 html/Admin/index.html:31 html/User/Groups/Members.html:66 -msgid "Groups" -msgstr "Malkovich" - -#: lib/RT/Group_Overlay.pm:963 -msgid "Groups can't be members of their members" -msgstr "Malkovich can't be Malkovich of Malkovich" - -#: lib/RT/Interface/CLI.pm:72 lib/RT/Interface/CLI.pm:72 -msgid "Hello!" -msgstr "Malkovich!" - -#: docs/design_docs/string-extraction-guide.txt:40 lib/RT/StyleGuide.pod:753 -#. ($name) -msgid "Hello, %1" -msgstr "Malkovich, %1" - -#: html/Ticket/Elements/ShowHistory:29 html/Ticket/Elements/Tabs:89 -msgid "History" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "HomePhone" -msgstr "Malkovich" - -#: html/Elements/Tabs:43 -msgid "Homepage" -msgstr "Malkovich" - -#: lib/RT/Base.pm:86 -#. (6) -msgid "I have %quant(%1,concrete mixer)." -msgstr "I have %quant(%1,Malkovich)." - -#: html/Search/Elements/PickBasics:104 html/Ticket/Elements/ShowBasics:26 lib/RT/Tickets_Overlay.pm:1080 -msgid "Id" -msgstr "Id" - -#: html/Admin/Users/Modify.html:43 html/User/Prefs.html:38 -msgid "Identity" -msgstr "Malkovich" - -#: etc/initialdata:429 -msgid "If an approval is rejected, reject the original and delete pending approvals" -msgstr "If a Malkovich is Malkovich, Malkovich the Malkovich and Malkovich Malkovich" - -#: bin/rt-crontool:186 -msgid "If this tool were setgid, a hostile local user could use this tool to gain administrative access to RT." -msgstr "If Malkovich Malkovich, a Malkovich Malkovich Malkovich Malkovich to Malkovich Malkovich Malkovich to RT." - -#: html/Admin/Queues/People.html:104 html/Ticket/Modify.html:38 html/Ticket/ModifyAll.html:93 html/Ticket/ModifyPeople.html:37 -msgid "If you've updated anything above, be sure to" -msgstr "If you've Malkovich Malkovich, be sure to" - -#: lib/RT/Record.pm:742 -msgid "Illegal value for %1" -msgstr "Malkovich Malkovich %1" - -#: lib/RT/Record.pm:745 -msgid "Immutable field" -msgstr "Malkovich" - -#: html/Admin/Elements/EditCustomFields:72 -msgid "Include disabled custom fields in listing." -msgstr "Malkovich Malkovich Malkovich in Malkovich." - -#: html/Admin/Queues/index.html:42 -msgid "Include disabled queues in listing." -msgstr "Malkovich Malkovich in Malkovich." - -#: html/Admin/Users/index.html:46 -msgid "Include disabled users in search." -msgstr "Malkovich Malkovich in Malkovich." - -#: html/Search/Elements/PickBasics:59 lib/RT/Tickets_Overlay.pm:1129 -msgid "Initial Priority" -msgstr "Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:1273 lib/RT/Ticket_Overlay.pm:1275 -msgid "InitialPriority" -msgstr "Malkovich" - -#: lib/RT/ScripAction_Overlay.pm:97 -msgid "Input error" -msgstr "Malkovich" - -#: lib/RT/Ticket_Overlay.pm:3797 -msgid "Internal Error" -msgstr "Malkovich" - -#: lib/RT/Record.pm:186 -#. ($id->{error_message}) -msgid "Internal Error: %1" -msgstr "Malkovich: %1" - -#: lib/RT/Group_Overlay.pm:644 -msgid "Invalid Group Type" -msgstr "Malkovich Malkovich" - -#: lib/RT/Principal_Overlay.pm:127 -msgid "Invalid Right" -msgstr "Malkovich" - -#: lib/RT/Record.pm:747 -msgid "Invalid data" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Invalid owner. Defaulting to 'nobody'." -msgstr "Malkovich. Malkovich to 'Malkovich'." - -#: lib/RT/Scrip_Overlay.pm:133 lib/RT/Template_Overlay.pm:251 -msgid "Invalid queue" -msgstr "Malkovich" - -#: lib/RT/ACE_Overlay.pm:243 lib/RT/ACE_Overlay.pm:252 lib/RT/ACE_Overlay.pm:258 lib/RT/ACE_Overlay.pm:269 lib/RT/ACE_Overlay.pm:274 -msgid "Invalid right" -msgstr "Malkovich" - -#: lib/RT/Record.pm:161 -#. ($key) -msgid "Invalid value for %1" -msgstr "Malkovich Malkovich %1" - -#: lib/RT/Ticket_Overlay.pm:3380 -msgid "Invalid value for custom field" -msgstr "Malkovich Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:385 -msgid "Invalid value for status" -msgstr "Malkovich Malkovich" - -#: bin/rt-crontool:187 -msgid "It is incredibly important that nonprivileged users not be allowed to run this tool." -msgstr "It is Malkovich Malkovich Malkovich Malkovich Malkovich be Malkovich to Malkovich." - -#: bin/rt-crontool:188 -msgid "It is suggested that you create a non-privileged unix user with the correct group membership and RT access to run this tool." -msgstr "It is Malkovich Malkovich a non-Malkovich Malkovich the Malkovich Malkovich and RT Malkovich to Malkovich." - -#: bin/rt-crontool:159 -msgid "It takes several arguments:" -msgstr "It Malkovich Malkovich:" - -#: lib/RT/Date.pm:411 -msgid "Jan." -msgstr "Jan." - -#: lib/RT/Group_Overlay.pm:149 -msgid "Join or leave this group" -msgstr "Join or Malkovich Malkovich" - -#: lib/RT/Date.pm:417 -msgid "Jul." -msgstr "Jul." - -#: html/Ticket/Elements/Tabs:100 -msgid "Jumbo" -msgstr "Malkovich" - -#: lib/RT/Date.pm:416 -msgid "Jun." -msgstr "Jun." - -#: NOT FOUND IN SOURCE -msgid "Lang" -msgstr "Lang" - -#: html/User/Prefs.html:54 -msgid "Language" -msgstr "Malkovich" - -#: html/Ticket/Elements/Tabs:74 -msgid "Last" -msgstr "Last" - -#: html/Ticket/Elements/EditDates:37 html/Ticket/Elements/ShowDates:39 -msgid "Last Contact" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Last Contact</a>" -msgstr "Malkovich</a>" - -#: html/Elements/SelectDateType:28 -msgid "Last Contacted" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Last Notified" -msgstr "Malkovich" - -#: html/Elements/SelectDateType:29 -msgid "Last Updated" -msgstr "Malkovich" - -#: html/Admin/Users/Modify.html:82 -msgid "Let this user access RT" -msgstr "Malkovich Malkovich RT" - -#: html/Admin/Users/Modify.html:86 -msgid "Let this user be granted rights" -msgstr "Malkovich be Malkovich" - -#: lib/RT/Record.pm:1086 -msgid "Link already exists" -msgstr "Malkovich Malkovich" - -#: lib/RT/Record.pm:1100 -msgid "Link could not be created" -msgstr "Malkovich be Malkovich" - -#: lib/RT/Record.pm:1106 -#. ($TransString) -msgid "Link created (%1)" -msgstr "Malkovich (%1)" - -#: lib/RT/Record.pm:1167 -#. ($TransString) -msgid "Link deleted (%1)" -msgstr "Malkovich (%1)" - -#: lib/RT/Record.pm:1173 -msgid "Link not found" -msgstr "Malkovich" - -#: html/Ticket/ModifyLinks.html:24 html/Ticket/ModifyLinks.html:28 -#. ($Ticket->Id) -msgid "Link ticket #%1" -msgstr "Malkovich #%1" - -#: html/Ticket/Create.html:174 html/Ticket/Elements/ShowSummary:61 html/Ticket/Elements/Tabs:98 html/Ticket/ModifyAll.html:56 -msgid "Links" -msgstr "Malkovich" - -#: html/Admin/Users/Modify.html:111 html/User/Prefs.html:104 -msgid "Location" -msgstr "Malkovich" - -#: lib/RT.pm:184 -#. ($RT::LogDir) -msgid "Log directory %1 not found or couldn't be written.\\n RT can't run." -msgstr "Malkovich %1 Malkovich or couldn't be Malkovich.\\n RT can't run." - -#: html/Elements/Header:69 -#. ("<b>".$session{'CurrentUser'}->Name."</b>") -msgid "Logged in as %1" -msgstr "Malkovich in as %1" - -#: docs/design_docs/string-extraction-guide.txt:71 html/Elements/Login:35 html/Elements/Login:44 html/Elements/Login:54 lib/RT/StyleGuide.pod:777 -msgid "Login" -msgstr "Malkovich" - -#: html/Elements/Header:66 -msgid "Logout" -msgstr "Malkovich" - -#: html/Search/Bulk.html:83 -msgid "Make Owner" -msgstr "Malkovich" - -#: html/Search/Bulk.html:107 -msgid "Make Status" -msgstr "Malkovich" - -#: html/Search/Bulk.html:115 -msgid "Make date Due" -msgstr "Malkovich" - -#: html/Search/Bulk.html:117 -msgid "Make date Resolved" -msgstr "Malkovich Malkovich" - -#: html/Search/Bulk.html:111 -msgid "Make date Started" -msgstr "Malkovich Malkovich" - -#: html/Search/Bulk.html:109 -msgid "Make date Starts" -msgstr "Malkovich Malkovich" - -#: html/Search/Bulk.html:113 -msgid "Make date Told" -msgstr "Malkovich" - -#: html/Search/Bulk.html:103 -msgid "Make priority" -msgstr "Malkovich" - -#: html/Search/Bulk.html:105 -msgid "Make queue" -msgstr "Malkovich" - -#: html/Search/Bulk.html:101 -msgid "Make subject" -msgstr "Malkovich" - -#: html/Admin/index.html:32 -msgid "Manage groups and group membership" -msgstr "Malkovich and Malkovich Malkovich" - -#: html/Admin/index.html:38 -msgid "Manage properties and configuration which apply to all queues" -msgstr "Malkovich Malkovich and Malkovich Malkovich to Malkovich" - -#: html/Admin/index.html:35 -msgid "Manage queues and queue-specific properties" -msgstr "Malkovich and Malkovich-Malkovich Malkovich" - -#: html/Admin/index.html:29 -msgid "Manage users and passwords" -msgstr "Malkovich and Malkovich" - -#: lib/RT/Date.pm:413 -msgid "Mar." -msgstr "Mar." - -#: lib/RT/Date.pm:415 -msgid "May." -msgstr "May." - -#: lib/RT/Transaction_Overlay.pm:634 -#. ($value) -msgid "Member %1 added" -msgstr "Malkovich %1 Malkovich" - -#: lib/RT/Transaction_Overlay.pm:674 -#. ($value) -msgid "Member %1 deleted" -msgstr "Malkovich %1 Malkovich" - -#: lib/RT/Group_Overlay.pm:974 -msgid "Member added" -msgstr "Malkovich" - -#: lib/RT/Group_Overlay.pm:1136 -msgid "Member deleted" -msgstr "Malkovich" - -#: lib/RT/Group_Overlay.pm:1140 -msgid "Member not deleted" -msgstr "Malkovich Malkovich" - -#: html/Elements/SelectLinkType:25 -msgid "Member of" -msgstr "Malkovich of" - -#: html/Admin/Elements/GroupTabs:41 html/User/Elements/GroupTabs:41 -msgid "Members" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:631 -#. ($value) -msgid "Membership in %1 added" -msgstr "Malkovich in %1 Malkovich" - -#: lib/RT/Transaction_Overlay.pm:671 -#. ($value) -msgid "Membership in %1 deleted" -msgstr "Malkovich in %1 Malkovich" - -#: lib/RT/Ticket_Overlay.pm:2813 -msgid "Merge Successful" -msgstr "Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:2733 -msgid "Merge failed. Couldn't set EffectiveId" -msgstr "Malkovich. Couldn't Malkovich" - -#: html/Elements/EditLinks:104 html/Ticket/Elements/BulkLinks:26 -msgid "Merge into" -msgstr "Malkovich" - -#: html/Search/Bulk.html:135 html/Ticket/Update.html:83 -msgid "Message" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Message body not shown because it is too large or is not plain text." -msgstr "Malkovich Malkovich Malkovich it is Malkovich or is Malkovich." - -#: lib/RT/Ticket_Overlay.pm:2514 -msgid "Message could not be recorded" -msgstr "Malkovich Malkovich be Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Message recipients" -msgstr "Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:2517 -msgid "Message recorded" -msgstr "Malkovich Malkovich" - -#: lib/RT/Record.pm:749 -msgid "Missing a primary key?: %1" -msgstr "Malkovich a Malkovich?: %1" - -#: html/Admin/Users/Modify.html:166 html/User/Prefs.html:71 -msgid "Mobile" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "MobilePhone" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:71 -msgid "Modify Access Control List" -msgstr "Malkovich Malkovich Malkovich" - -#: html/Admin/Global/CustomFields.html:43 html/Admin/Global/index.html:50 -msgid "Modify Custom Fields which apply to all queues" -msgstr "Malkovich Malkovich Malkovich to Malkovich" - -#: lib/RT/Queue_Overlay.pm:74 -msgid "Modify Scrip templates for this queue" -msgstr "Malkovich Malkovich Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:77 -msgid "Modify Scrips for this queue" -msgstr "Malkovich Malkovich Malkovich" - -#: html/Admin/Queues/CustomField.html:44 -#. ($QueueObj->Name()) -msgid "Modify a CustomField for queue %1" -msgstr "Malkovich a Malkovich Malkovich %1" - -#: html/Admin/Global/CustomField.html:52 -msgid "Modify a CustomField which applies to all queues" -msgstr "Malkovich a Malkovich Malkovich to Malkovich" - -#: html/Admin/Queues/Scrip.html:53 -#. ($QueueObj->Name) -msgid "Modify a scrip for queue %1" -msgstr "Malkovich a Malkovich %1" - -#: html/Admin/Global/Scrip.html:47 -msgid "Modify a scrip which applies to all queues" -msgstr "Malkovich a Malkovich Malkovich to Malkovich" - -#: html/Ticket/ModifyDates.html:24 html/Ticket/ModifyDates.html:28 -#. ($TicketObj->Id) -msgid "Modify dates for #%1" -msgstr "Malkovich Malkovich #%1" - -#: html/Ticket/ModifyDates.html:34 -#. ($TicketObj->Id) -msgid "Modify dates for ticket # %1" -msgstr "Malkovich Malkovich # %1" - -#: html/Admin/Global/GroupRights.html:24 html/Admin/Global/GroupRights.html:27 html/Admin/Global/index.html:55 -msgid "Modify global group rights" -msgstr "Malkovich Malkovich Malkovich" - -#: html/Admin/Global/GroupRights.html:32 -msgid "Modify global group rights." -msgstr "Malkovich Malkovich Malkovich." - -#: html/Admin/Global/UserRights.html:24 html/Admin/Global/UserRights.html:27 html/Admin/Global/index.html:59 -msgid "Modify global user rights" -msgstr "Malkovich Malkovich" - -#: html/Admin/Global/UserRights.html:32 -msgid "Modify global user rights." -msgstr "Malkovich Malkovich." - -#: lib/RT/Group_Overlay.pm:146 -msgid "Modify group metadata or delete group" -msgstr "Malkovich Malkovich or Malkovich" - -#: html/Admin/Groups/GroupRights.html:24 html/Admin/Groups/GroupRights.html:28 html/Admin/Groups/GroupRights.html:34 -#. ($GroupObj->Name) -msgid "Modify group rights for group %1" -msgstr "Malkovich Malkovich Malkovich %1" - -#: html/Admin/Queues/GroupRights.html:24 html/Admin/Queues/GroupRights.html:28 -#. ($QueueObj->Name) -msgid "Modify group rights for queue %1" -msgstr "Malkovich Malkovich Malkovich %1" - -#: lib/RT/Group_Overlay.pm:148 -msgid "Modify membership roster for this group" -msgstr "Malkovich Malkovich Malkovich Malkovich" - -#: lib/RT/System.pm:60 -msgid "Modify one's own RT account" -msgstr "Malkovich's own RT Malkovich" - -#: html/Admin/Queues/People.html:24 html/Admin/Queues/People.html:28 -#. ($QueueObj->Name) -msgid "Modify people related to queue %1" -msgstr "Malkovich Malkovich to Malkovich %1" - -#: html/Ticket/ModifyPeople.html:24 html/Ticket/ModifyPeople.html:28 html/Ticket/ModifyPeople.html:34 -#. ($Ticket->id) -#. ($Ticket->Id) -msgid "Modify people related to ticket #%1" -msgstr "Malkovich Malkovich to Malkovich #%1" - -#: html/Admin/Queues/Scrips.html:45 -#. ($QueueObj->Name) -msgid "Modify scrips for queue %1" -msgstr "Malkovich Malkovich %1" - -#: html/Admin/Global/Scrips.html:43 html/Admin/Global/index.html:41 -msgid "Modify scrips which apply to all queues" -msgstr "Malkovich Malkovich to Malkovich" - -#: html/Admin/Global/Template.html:24 html/Admin/Global/Template.html:29 html/Admin/Global/Template.html:80 html/Admin/Queues/Template.html:77 -#. (loc($TemplateObj->Name())) -#. ($TemplateObj->id) -msgid "Modify template %1" -msgstr "Malkovich %1" - -#: html/Admin/Global/Templates.html:43 -msgid "Modify templates which apply to all queues" -msgstr "Malkovich Malkovich Malkovich to Malkovich" - -#: html/Admin/Groups/Modify.html:86 html/User/Groups/Modify.html:85 -#. ($Group->Name) -msgid "Modify the group %1" -msgstr "Malkovich the Malkovich %1" - -#: lib/RT/Queue_Overlay.pm:72 -msgid "Modify the queue watchers" -msgstr "Malkovich the Malkovich" - -#: html/Admin/Users/Modify.html:263 -#. ($UserObj->Name) -msgid "Modify the user %1" -msgstr "Malkovich the user %1" - -#: html/Ticket/ModifyAll.html:36 -#. ($Ticket->Id) -msgid "Modify ticket # %1" -msgstr "Malkovich # %1" - -#: html/Ticket/Modify.html:24 html/Ticket/Modify.html:27 html/Ticket/Modify.html:33 -#. ($TicketObj->Id) -msgid "Modify ticket #%1" -msgstr "Malkovich #%1" - -#: lib/RT/Queue_Overlay.pm:90 -msgid "Modify tickets" -msgstr "Malkovich" - -#: html/Admin/Groups/UserRights.html:24 html/Admin/Groups/UserRights.html:28 html/Admin/Groups/UserRights.html:34 -#. ($GroupObj->Name) -msgid "Modify user rights for group %1" -msgstr "Malkovich Malkovich Malkovich %1" - -#: html/Admin/Queues/UserRights.html:24 html/Admin/Queues/UserRights.html:28 -#. ($QueueObj->Name) -msgid "Modify user rights for queue %1" -msgstr "Malkovich Malkovich Malkovich %1" - -#: lib/RT/Queue_Overlay.pm:71 -msgid "ModifyACL" -msgstr "Malkovich" - -#: lib/RT/Group_Overlay.pm:149 -msgid "ModifyOwnMembership" -msgstr "Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:72 -msgid "ModifyQueueWatchers" -msgstr "Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:77 -msgid "ModifyScrips" -msgstr "Malkovich" - -#: lib/RT/System.pm:60 -msgid "ModifySelf" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:74 -msgid "ModifyTemplate" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:90 -msgid "ModifyTicket" -msgstr "Malkovich" - -#: lib/RT/Date.pm:388 -msgid "Mon." -msgstr "Mon." - -#: html/Ticket/Elements/ShowRequestor:40 -#. ($name) -msgid "More about %1" -msgstr "Malkovich %1" - -#: html/Admin/Elements/EditCustomFields:60 -msgid "Move down" -msgstr "Malkovich" - -#: html/Admin/Elements/SelectSingleOrMultiple:26 -msgid "Multiple" -msgstr "Malkovich" - -#: lib/RT/User_Overlay.pm:197 -msgid "Must specify 'Name' attribute" -msgstr "Malkovich 'Name' Malkovich" - -#: html/SelfService/Elements/MyRequests:48 -#. ($friendly_status) -msgid "My %1 tickets" -msgstr "My %1 Malkovich" - -#: html/Approvals/index.html:24 html/Approvals/index.html:25 -msgid "My approvals" -msgstr "My Malkovich" - -#: html/Admin/Elements/AddCustomFieldValue:31 html/Admin/Elements/EditCustomField:33 html/Admin/Elements/ModifyTemplate:27 html/Admin/Groups/Modify.html:43 html/Elements/SelectGroups:25 html/Elements/SelectUsers:27 html/User/Groups/Modify.html:43 -msgid "Name" -msgstr "Name" - -#: lib/RT/User_Overlay.pm:204 -msgid "Name in use" -msgstr "Name in use" - -#: html/Ticket/Elements/ShowDates:52 -msgid "Never" -msgstr "Malkovich" - -#: html/Elements/Quicksearch:29 -msgid "New" -msgstr "New" - -#: html/Elements/EditLinks:93 -msgid "New Links" -msgstr "Malkovich Malkovich" - -#: html/Admin/Users/Modify.html:92 html/User/Prefs.html:87 -msgid "New Password" -msgstr "Malkovich" - -#: etc/initialdata:332 -msgid "New Pending Approval" -msgstr "Malkovich Malkovich" - -#: NOT FOUND IN SOURCE -msgid "New Search" -msgstr "Malkovich" - -#: html/Admin/Global/CustomField.html:40 html/Admin/Global/CustomFields.html:38 html/Admin/Queues/CustomField.html:51 html/Admin/Queues/CustomFields.html:40 -msgid "New custom field" -msgstr "Malkovich Malkovich" - -#: html/Admin/Elements/GroupTabs:53 html/User/Elements/GroupTabs:51 -msgid "New group" -msgstr "Malkovich" - -#: html/SelfService/Prefs.html:31 -msgid "New password" -msgstr "Malkovich" - -#: lib/RT/User_Overlay.pm:773 -msgid "New password notification sent" -msgstr "Malkovich Malkovich Malkovich" - -#: html/Admin/Elements/QueueTabs:69 -msgid "New queue" -msgstr "Malkovich" - -#: html/Admin/Elements/SelectRights:41 -msgid "New rights" -msgstr "Malkovich" - -#: html/Admin/Global/Scrip.html:39 html/Admin/Global/Scrips.html:38 html/Admin/Queues/Scrip.html:42 html/Admin/Queues/Scrips.html:54 -msgid "New scrip" -msgstr "Malkovich" - -#: html/Admin/Global/Template.html:59 html/Admin/Global/Templates.html:38 html/Admin/Queues/Template.html:57 html/Admin/Queues/Templates.html:49 -msgid "New template" -msgstr "Malkovich" - -#: html/SelfService/Elements/Tabs:47 -msgid "New ticket" -msgstr "Malkovich" - -#: lib/RT/Ticket_Overlay.pm:2700 -msgid "New ticket doesn't exist" -msgstr "Malkovich doesn't Malkovich" - -#: html/Admin/Elements/UserTabs:50 -msgid "New user" -msgstr "Malkovich" - -#: html/Admin/Elements/CreateUserCalled:25 -msgid "New user called" -msgstr "Malkovich" - -#: html/Admin/Queues/People.html:54 html/Ticket/Elements/EditPeople:28 -msgid "New watchers" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "New window setting" -msgstr "Malkovich Malkovich" - -#: html/Ticket/Elements/Tabs:70 -msgid "Next" -msgstr "Next" - -#: NOT FOUND IN SOURCE -msgid "NickName" -msgstr "Malkovich" - -#: html/Admin/Users/Modify.html:62 html/User/Prefs.html:50 -msgid "Nickname" -msgstr "Malkovich" - -#: html/Admin/Elements/EditCustomField:89 html/Admin/Elements/EditCustomFields:103 -msgid "No CustomField" -msgstr "No Malkovich" - -#: html/Admin/Groups/GroupRights.html:83 html/Admin/Groups/UserRights.html:70 -msgid "No Group defined" -msgstr "No Malkovich" - -#: lib/RT/Tickets_Overlay_SQL.pm:452 -msgid "No Query" -msgstr "No Malkovich" - -#: html/Admin/Queues/GroupRights.html:96 html/Admin/Queues/UserRights.html:67 -msgid "No Queue defined" -msgstr "No Malkovich" - -#: bin/rt-crontool:52 -msgid "No RT user found. Please consult your RT administrator.\\n" -msgstr "No RT Malkovich. Malkovich Malkovich RT Malkovich.\\n" - -#: html/Admin/Global/Template.html:78 html/Admin/Queues/Template.html:75 -msgid "No Template" -msgstr "No Malkovich" - -#: NOT FOUND IN SOURCE -msgid "No Ticket specified. Aborting ticket " -msgstr "No Malkovich Malkovich. Malkovich " - -#: html/Approvals/Elements/Approve:45 -msgid "No action" -msgstr "No Malkovich" - -#: lib/RT/Record.pm:744 -msgid "No column specified" -msgstr "No Malkovich Malkovich" - -#: html/Ticket/Elements/ShowRequestor:46 -msgid "No comment entered about this user" -msgstr "No Malkovich Malkovich Malkovich" - -#: lib/RT/Action/Generic.pm:159 lib/RT/Condition/Generic.pm:175 lib/RT/Search/ActiveTicketsInQueue.pm:55 lib/RT/Search/Generic.pm:112 -#. (ref $self) -msgid "No description for %1" -msgstr "No Malkovich %1" - -#: lib/RT/Users_Overlay.pm:159 -msgid "No group specified" -msgstr "No Malkovich" - -#: lib/RT/Ticket_Overlay.pm:2475 -msgid "No message attached" -msgstr "No Malkovich Malkovich" - -#: lib/RT/User_Overlay.pm:991 -msgid "No password set" -msgstr "No Malkovich" - -#: lib/RT/Queue_Overlay.pm:296 -msgid "No permission to create queues" -msgstr "No Malkovich to Malkovich" - -#: NOT FOUND IN SOURCE -msgid "No permission to create tickets in the queue '%1'" -msgstr "No Malkovich to Malkovich in the Malkovich '%1'" - -#: lib/RT/User_Overlay.pm:157 -msgid "No permission to create users" -msgstr "No Malkovich to Malkovich" - -#: html/SelfService/Display.html:125 -msgid "No permission to display that ticket" -msgstr "No Malkovich to Malkovich Malkovich" - -#: html/SelfService/Update.html:68 -msgid "No permission to view update ticket" -msgstr "No Malkovich to Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:716 lib/RT/Ticket_Overlay.pm:1581 -msgid "No principal specified" -msgstr "No Malkovich Malkovich" - -#: html/Admin/Queues/People.html:153 html/Admin/Queues/People.html:163 -msgid "No principals selected." -msgstr "No Malkovich Malkovich." - -#: html/Admin/Queues/index.html:34 -msgid "No queues matching search criteria found." -msgstr "No Malkovich Malkovich Malkovich Malkovich." - -#: html/Admin/Elements/SelectRights:81 -msgid "No rights found" -msgstr "No Malkovich" - -#: html/Admin/Elements/SelectRights:32 -msgid "No rights granted." -msgstr "No Malkovich." - -#: html/Search/Bulk.html:162 -msgid "No search to operate on." -msgstr "No Malkovich to Malkovich on." - -#: lib/RT/Transaction_Overlay.pm:455 lib/RT/Transaction_Overlay.pm:493 -msgid "No transaction type specified" -msgstr "No Malkovich Malkovich Malkovich" - -#: html/Admin/Users/index.html:35 -msgid "No users matching search criteria found." -msgstr "No Malkovich Malkovich Malkovich Malkovich." - -#: NOT FOUND IN SOURCE -msgid "No valid RT user found. RT cvs handler disengaged. Please consult your RT administrator.\\n" -msgstr "No Malkovich RT Malkovich. RT Malkovich Malkovich. Malkovich Malkovich RT Malkovich.\\n" - -#: lib/RT/Record.pm:741 -msgid "No value sent to _Set!\\n" -msgstr "No Malkovich to _Set!\\n" - -#: lib/RT/Record.pm:746 -msgid "Nonexistant field?" -msgstr "Malkovich Malkovich?" - -#: html/Elements/Header:71 -msgid "Not logged in." -msgstr "Malkovich in." - -#: lib/RT/Date.pm:369 -msgid "Not set" -msgstr "Malkovich" - -#: html/NoAuth/Reminder.html:26 -msgid "Not yet implemented." -msgstr "Malkovich Malkovich." - -#: html/Approvals/Elements/Approve:48 -msgid "Notes" -msgstr "Malkovich" - -#: lib/RT/User_Overlay.pm:776 -msgid "Notification could not be sent" -msgstr "Malkovich Malkovich be sent" - -#: etc/initialdata:101 -msgid "Notify AdminCcs" -msgstr "Malkovich" - -#: etc/initialdata:97 -msgid "Notify AdminCcs as Comment" -msgstr "Malkovich as Malkovich" - -#: etc/initialdata:128 -msgid "Notify Other Recipients" -msgstr "Malkovich Malkovich" - -#: etc/initialdata:124 -msgid "Notify Other Recipients as Comment" -msgstr "Malkovich Malkovich as Malkovich" - -#: etc/initialdata:85 -msgid "Notify Owner" -msgstr "Malkovich" - -#: etc/initialdata:81 -msgid "Notify Owner as Comment" -msgstr "Malkovich as Malkovich" - -#: etc/initialdata:376 -msgid "Notify Owner of their rejected ticket" -msgstr "Malkovich of Malkovich Malkovich" - -#: etc/initialdata:365 -msgid "Notify Owner of their ticket has been approved by all approvers" -msgstr "Malkovich of Malkovich Malkovich Malkovich by Malkovich" - -#: etc/initialdata:353 -msgid "Notify Owner of their ticket has been approved by some approver" -msgstr "Malkovich of Malkovich Malkovich Malkovich by Malkovich" - -#: etc/initialdata:334 -msgid "Notify Owners and AdminCcs of new items pending their approval" -msgstr "Malkovich and Malkovich of Malkovich Malkovich Malkovich" - -#: etc/initialdata:77 -msgid "Notify Requestors" -msgstr "Malkovich Malkovich" - -#: etc/initialdata:111 -msgid "Notify Requestors and Ccs" -msgstr "Malkovich Malkovich and Ccs" - -#: etc/initialdata:106 -msgid "Notify Requestors and Ccs as Comment" -msgstr "Malkovich Malkovich and Ccs as Malkovich" - -#: etc/initialdata:120 -msgid "Notify Requestors, Ccs and AdminCcs" -msgstr "Malkovich Malkovich, Ccs and Malkovich" - -#: etc/initialdata:116 -msgid "Notify Requestors, Ccs and AdminCcs as Comment" -msgstr "Malkovich Malkovich, Ccs and Malkovich as Malkovich" - -#: lib/RT/Date.pm:421 -msgid "Nov." -msgstr "Nov." - -#: lib/RT/Record.pm:200 -msgid "Object could not be created" -msgstr "Malkovich Malkovich be Malkovich" - -#: lib/RT/Record.pm:219 -msgid "Object created" -msgstr "Malkovich" - -#: lib/RT/Date.pm:420 -msgid "Oct." -msgstr "Oct." - -#: html/Elements/SelectDateRelation:34 -msgid "On" -msgstr "On" - -#: etc/initialdata:163 -msgid "On Comment" -msgstr "On Malkovich" - -#: etc/initialdata:156 -msgid "On Correspond" -msgstr "On Malkovich" - -#: etc/initialdata:145 -msgid "On Create" -msgstr "On Malkovich" - -#: etc/initialdata:184 -msgid "On Owner Change" -msgstr "On Malkovich" - -#: etc/initialdata:192 -msgid "On Queue Change" -msgstr "On Malkovich" - -#: etc/initialdata:198 -msgid "On Resolve" -msgstr "On Malkovich" - -#: etc/initialdata:169 -msgid "On Status Change" -msgstr "On Malkovich" - -#: etc/initialdata:150 -msgid "On Transaction" -msgstr "On Malkovich" - -#: html/Approvals/Elements/PendingMyApproval:49 -#. ("<input size='15' value='".( $created_after->Unix >0 && $created_after->ISO)."' name='CreatedAfter'>") -msgid "Only show approvals for requests created after %1" -msgstr "Malkovich Malkovich Malkovich Malkovich Malkovich %1" - -#: html/Approvals/Elements/PendingMyApproval:47 -#. ("<input size='15' value='".($created_before->Unix > 0 &&$created_before->ISO)."' name='CreatedBefore'>") -msgid "Only show approvals for requests created before %1" -msgstr "Malkovich Malkovich Malkovich Malkovich Malkovich %1" - -#: html/Elements/Quicksearch:30 -msgid "Open" -msgstr "Open" - -#: html/Ticket/Elements/Tabs:137 -msgid "Open it" -msgstr "Open it" - -#: html/SelfService/Elements/Tabs:41 -msgid "Open tickets" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Open tickets (from listing) in a new window" -msgstr "Malkovich (Malkovich) in a Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Open tickets (from listing) in another window" -msgstr "Malkovich (Malkovich) in Malkovich" - -#: etc/initialdata:140 -msgid "Open tickets on correspondence" -msgstr "Malkovich on Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Ordering and sorting" -msgstr "Malkovich and Malkovich" - -#: html/Admin/Users/Modify.html:114 html/Elements/SelectUsers:28 html/User/Prefs.html:107 -msgid "Organization" -msgstr "Malkovich" - -#: html/Approvals/Elements/Approve:32 -#. ($approving->Id, $approving->Subject) -msgid "Originating ticket: #%1" -msgstr "Malkovich Malkovich: #%1" - -#: html/Admin/Queues/Modify.html:68 -msgid "Over time, priority moves toward" -msgstr "Malkovich, Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:89 -msgid "Own tickets" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:89 -msgid "OwnTicket" -msgstr "Malkovich" - -#: etc/initialdata:38 html/Elements/QuickCreate:13 html/Search/Elements/PickBasics:114 html/SelfService/Elements/MyRequests:29 html/Ticket/Create.html:47 html/Ticket/Elements/EditPeople:42 html/Ticket/Elements/EditPeople:43 html/Ticket/Elements/ShowPeople:26 html/Ticket/Update.html:40 lib/RT/ACE_Overlay.pm:85 lib/RT/Tickets_Overlay.pm:1306 -msgid "Owner" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:575 -#. ($Old->Name , $New->Name) -msgid "Owner forcibly changed from %1 to %2" -msgstr "Malkovich Malkovich Malkovich %1 to %2" - -#: NOT FOUND IN SOURCE -msgid "Owner is" -msgstr "Malkovich is" - -#: html/Admin/Users/Modify.html:171 html/User/Prefs.html:75 -msgid "Pager" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "PagerPhone" -msgstr "Malkovich" - -#: html/Elements/EditLinks:117 html/Elements/EditLinks:54 html/Elements/ShowLinks:46 html/Ticket/Create.html:182 html/Ticket/Elements/BulkLinks:38 -msgid "Parents" -msgstr "Malkovich" - -#: html/Elements/Login:52 html/User/Prefs.html:83 -msgid "Password" -msgstr "Malkovich" - -#: html/NoAuth/Reminder.html:24 -msgid "Password Reminder" -msgstr "Malkovich Malkovich" - -#: lib/RT/User_Overlay.pm:185 lib/RT/User_Overlay.pm:994 -msgid "Password too short" -msgstr "Malkovich Malkovich" - -#: html/Admin/Users/Modify.html:316 html/User/Prefs.html:209 -#. (loc_fuzzy($msg)) -msgid "Password: %1" -msgstr "Malkovich: %1" - -#: html/Admin/Users/Modify.html:318 -msgid "Passwords do not match." -msgstr "Malkovich do Malkovich." - -#: html/User/Prefs.html:211 -msgid "Passwords do not match. Your password has not been changed" -msgstr "Malkovich do Malkovich. Malkovich Malkovich Malkovich" - -#: html/Ticket/Elements/ShowSummary:44 html/Ticket/Elements/Tabs:97 html/Ticket/ModifyAll.html:50 -msgid "People" -msgstr "Malkovich" - -#: etc/initialdata:133 -msgid "Perform a user-defined action" -msgstr "Malkovich a user-Malkovich" - -#: lib/RT/ACE_Overlay.pm:230 lib/RT/ACE_Overlay.pm:236 lib/RT/ACE_Overlay.pm:562 lib/RT/ACE_Overlay.pm:572 lib/RT/ACE_Overlay.pm:582 lib/RT/ACE_Overlay.pm:647 lib/RT/Attribute_Overlay.pm:135 lib/RT/Attribute_Overlay.pm:141 lib/RT/Attribute_Overlay.pm:379 lib/RT/Attribute_Overlay.pm:388 lib/RT/Attribute_Overlay.pm:401 lib/RT/CurrentUser.pm:103 lib/RT/CurrentUser.pm:94 lib/RT/CustomField_Overlay.pm:100 lib/RT/CustomField_Overlay.pm:207 lib/RT/CustomField_Overlay.pm:239 lib/RT/CustomField_Overlay.pm:517 lib/RT/CustomField_Overlay.pm:90 lib/RT/Group_Overlay.pm:1091 lib/RT/Group_Overlay.pm:1095 lib/RT/Group_Overlay.pm:1104 lib/RT/Group_Overlay.pm:1155 lib/RT/Group_Overlay.pm:1159 lib/RT/Group_Overlay.pm:1165 lib/RT/Group_Overlay.pm:426 lib/RT/Group_Overlay.pm:518 lib/RT/Group_Overlay.pm:596 lib/RT/Group_Overlay.pm:604 lib/RT/Group_Overlay.pm:701 lib/RT/Group_Overlay.pm:705 lib/RT/Group_Overlay.pm:711 lib/RT/Group_Overlay.pm:896 lib/RT/Group_Overlay.pm:900 lib/RT/Group_Overlay.pm:913 lib/RT/Queue_Overlay.pm:117 lib/RT/Queue_Overlay.pm:135 lib/RT/Queue_Overlay.pm:578 lib/RT/Queue_Overlay.pm:588 lib/RT/Queue_Overlay.pm:602 lib/RT/Queue_Overlay.pm:740 lib/RT/Queue_Overlay.pm:749 lib/RT/Queue_Overlay.pm:762 lib/RT/Queue_Overlay.pm:975 lib/RT/Scrip_Overlay.pm:125 lib/RT/Scrip_Overlay.pm:136 lib/RT/Scrip_Overlay.pm:201 lib/RT/Scrip_Overlay.pm:473 lib/RT/Template_Overlay.pm:284 lib/RT/Template_Overlay.pm:87 lib/RT/Template_Overlay.pm:93 lib/RT/Ticket_Overlay.pm:1453 lib/RT/Ticket_Overlay.pm:1463 lib/RT/Ticket_Overlay.pm:1477 lib/RT/Ticket_Overlay.pm:1614 lib/RT/Ticket_Overlay.pm:1624 lib/RT/Ticket_Overlay.pm:1638 lib/RT/Ticket_Overlay.pm:1755 lib/RT/Ticket_Overlay.pm:2075 lib/RT/Ticket_Overlay.pm:2213 lib/RT/Ticket_Overlay.pm:2381 lib/RT/Ticket_Overlay.pm:2428 lib/RT/Ticket_Overlay.pm:2582 lib/RT/Ticket_Overlay.pm:2640 lib/RT/Ticket_Overlay.pm:2691 lib/RT/Ticket_Overlay.pm:2706 lib/RT/Ticket_Overlay.pm:2905 lib/RT/Ticket_Overlay.pm:2915 lib/RT/Ticket_Overlay.pm:2920 lib/RT/Ticket_Overlay.pm:3143 lib/RT/Ticket_Overlay.pm:3147 lib/RT/Ticket_Overlay.pm:3350 lib/RT/Ticket_Overlay.pm:3512 lib/RT/Ticket_Overlay.pm:3564 lib/RT/Ticket_Overlay.pm:3791 lib/RT/Transaction_Overlay.pm:443 lib/RT/Transaction_Overlay.pm:450 lib/RT/Transaction_Overlay.pm:479 lib/RT/Transaction_Overlay.pm:486 lib/RT/User_Overlay.pm:1088 lib/RT/User_Overlay.pm:1536 lib/RT/User_Overlay.pm:335 lib/RT/User_Overlay.pm:696 lib/RT/User_Overlay.pm:731 lib/RT/User_Overlay.pm:987 -msgid "Permission Denied" -msgstr "Malkovich Malkovich" - -#: html/User/Elements/Tabs:34 -msgid "Personal Groups" -msgstr "Malkovich" - -#: html/User/Groups/index.html:29 html/User/Groups/index.html:39 -msgid "Personal groups" -msgstr "Malkovich" - -#: html/User/Elements/DelegateRights:36 -msgid "Personal groups:" -msgstr "Malkovich:" - -#: html/Admin/Users/Modify.html:153 html/User/Prefs.html:60 -msgid "Phone numbers" -msgstr "Malkovich" - -#: html/Elements/Header:63 html/Elements/Tabs:55 html/SelfService/Elements/Tabs:50 html/SelfService/Prefs.html:24 html/User/Prefs.html:24 html/User/Prefs.html:27 -msgid "Preferences" -msgstr "Malkovich" - -#: lib/RT/Action/Generic.pm:169 -msgid "Prepare Stubbed" -msgstr "Malkovich" - -#: html/Ticket/Elements/Tabs:62 -msgid "Prev" -msgstr "Prev" - -#: lib/RT/ACE_Overlay.pm:132 lib/RT/ACE_Overlay.pm:207 lib/RT/ACE_Overlay.pm:551 -#. ($args{'PrincipalId'}) -msgid "Principal %1 not found." -msgstr "Malkovich %1 Malkovich." - -#: html/Search/Elements/PickBasics:58 html/Ticket/Create.html:153 html/Ticket/Elements/EditBasics:52 html/Ticket/Elements/ShowBasics:50 lib/RT/Tickets_Overlay.pm:1104 -msgid "Priority" -msgstr "Malkovich" - -#: html/Admin/Queues/Modify.html:64 -msgid "Priority starts at" -msgstr "Malkovich at" - -#: etc/initialdata:25 -msgid "Privileged" -msgstr "Malkovich" - -#: html/Admin/Users/Modify.html:296 html/User/Prefs.html:200 -#. (loc_fuzzy($msg)) -msgid "Privileged status: %1" -msgstr "Malkovich Malkovich: %1" - -#: html/Admin/Users/index.html:61 -msgid "Privileged users" -msgstr "Malkovich Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Projects" -msgstr "Malkovich" - -#: etc/initialdata:23 etc/initialdata:29 etc/initialdata:35 etc/initialdata:59 -msgid "Pseudogroup for internal use" -msgstr "Malkovich Malkovich Malkovich" - -#: html/Elements/QuickCreate:10 html/Elements/Quicksearch:28 html/Search/Elements/PickBasics:94 html/SelfService/Create.html:32 html/Ticket/Create.html:37 html/Ticket/Elements/EditBasics:35 html/Ticket/Elements/ShowBasics:54 html/User/Elements/DelegateRights:79 lib/RT/Tickets_Overlay.pm:945 -msgid "Queue" -msgstr "Malkovich" - -#: html/Admin/Queues/CustomField.html:41 html/Admin/Queues/Scrip.html:49 html/Admin/Queues/Scrips.html:47 html/Admin/Queues/Templates.html:43 -#. ($Queue) -#. ($id) -msgid "Queue %1 not found" -msgstr "Malkovich %1 Malkovich" - -#: html/Admin/Queues/Modify.html:42 -msgid "Queue Name" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:300 -msgid "Queue already exists" -msgstr "Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:309 lib/RT/Queue_Overlay.pm:315 -msgid "Queue could not be created" -msgstr "Malkovich not be Malkovich" - -#: html/Ticket/Create.html:208 -msgid "Queue could not be loaded." -msgstr "Malkovich be Malkovich." - -#: docs/design_docs/string-extraction-guide.txt:83 lib/RT/Queue_Overlay.pm:319 lib/RT/StyleGuide.pod:789 -msgid "Queue created" -msgstr "Malkovich" - -#: html/SelfService/Display.html:72 lib/RT/CustomField_Overlay.pm:97 -msgid "Queue not found" -msgstr "Malkovich" - -#: html/Admin/Elements/Tabs:37 html/Admin/index.html:34 -msgid "Queues" -msgstr "Malkovich" - -#: html/Elements/Quicksearch:24 -msgid "Quick search" -msgstr "Malkovich" - -#: html/Elements/Login:44 -#. ($RT::VERSION) -msgid "RT %1" -msgstr "RT %1" - -#: docs/design_docs/string-extraction-guide.txt:70 lib/RT/StyleGuide.pod:776 -#. ($RT::VERSION, $RT::rtname) -msgid "RT %1 for %2" -msgstr "RT %1 for %2" - -#: NOT FOUND IN SOURCE -msgid "RT %1 from <a href=\"http://bestpractical.com\">Best Practical Solutions, LLC</a>." -msgstr "RT %1 from <a href=\"http://Malkovich.com\">Malkovich Malkovich, LLC</a>." - -#: html/Admin/index.html:24 html/Admin/index.html:25 -msgid "RT Administration" -msgstr "RT Malkovich" - -#: html/Elements/Error:41 html/SelfService/Error.html:40 -msgid "RT Error" -msgstr "RT Malkovich" - -#: html/index.html:50 html/index.html:53 -msgid "RT at a glance" -msgstr "RT at a Malkovich" - -#: html/Elements/PageLayout:85 -#. ($RT::rtname) -msgid "RT for %1" -msgstr "RT for %1" - -#: NOT FOUND IN SOURCE -msgid "RT is © Copyright 1996-%1 Jesse Vincent <jesse@bestpractical.com>. It is distributed under <a href=\"http://www.gnu.org/copyleft/gpl.html\">Version 2 of the GNU General Public License.</a>" -msgstr "RT is © Malkovich 1996-%1 Malkovich <Malkovich@Malkovich.com>. It is Malkovich Malkovich <a href=\"http://www.gnu.org/copyleft/gpl.html\">Malkovich 2 of the Malkovich Malkovich Malkovich.</a>" - -#: html/Admin/Users/Modify.html:57 html/User/Prefs.html:47 -msgid "Real Name" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "RealName" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:628 -#. ($value) -msgid "Reference by %1 added" -msgstr "Malkovich by %1 Malkovich" - -#: lib/RT/Transaction_Overlay.pm:668 -#. ($value) -msgid "Reference by %1 deleted" -msgstr "Malkovich by %1 Malkovich" - -#: lib/RT/Transaction_Overlay.pm:625 -#. ($value) -msgid "Reference to %1 added" -msgstr "Malkovich to %1 Malkovich" - -#: lib/RT/Transaction_Overlay.pm:665 -#. ($value) -msgid "Reference to %1 deleted" -msgstr "Malkovich to %1 Malkovich" - -#: html/Elements/EditLinks:129 html/Elements/EditLinks:81 html/Elements/ShowLinks:70 html/Ticket/Create.html:185 html/Ticket/Elements/BulkLinks:50 -msgid "Referred to by" -msgstr "Malkovich to by" - -#: html/Elements/EditLinks:125 html/Elements/EditLinks:72 html/Elements/SelectLinkType:27 html/Elements/ShowLinks:60 html/Ticket/Create.html:184 html/Ticket/Elements/BulkLinks:46 -msgid "Refers to" -msgstr "Malkovich to" - -#: NOT FOUND IN SOURCE -msgid "Refine search" -msgstr "Malkovich" - -#: html/Elements/Refresh:35 -#. ($value/60) -msgid "Refresh this page every %1 minutes." -msgstr "Malkovich Malkovich %1 Malkovich." - -#: html/Search/Bulk.html:95 -msgid "Remove AdminCc" -msgstr "Malkovich" - -#: html/Search/Bulk.html:91 -msgid "Remove Cc" -msgstr "Malkovich Cc" - -#: html/Search/Bulk.html:87 -msgid "Remove Requestor" -msgstr "Malkovich Malkovich" - -#: html/Ticket/Elements/ShowTransaction:142 html/Ticket/Elements/Tabs:123 -msgid "Reply" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:87 -msgid "Reply to tickets" -msgstr "Malkovich to Malkovich" - -#: lib/RT/Queue_Overlay.pm:87 -msgid "ReplyToTicket" -msgstr "Malkovich" - -#: etc/initialdata:44 lib/RT/ACE_Overlay.pm:86 -msgid "Requestor" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Requestor email address" -msgstr "Malkovich Malkovich" - -#: html/SelfService/Create.html:40 html/Ticket/Create.html:55 html/Ticket/Elements/EditPeople:47 html/Ticket/Elements/ShowPeople:30 -msgid "Requestors" -msgstr "Malkovich" - -#: html/Admin/Queues/Modify.html:74 -msgid "Requests should be due in" -msgstr "Malkovich be due in" - -#: html/Elements/Submit:61 -msgid "Reset" -msgstr "Malkovich" - -#: html/Admin/Users/Modify.html:156 html/User/Prefs.html:63 -msgid "Residence" -msgstr "Malkovich" - -#: html/Ticket/Elements/Tabs:133 -msgid "Resolve" -msgstr "Malkovich" - -#: html/Ticket/Update.html:119 -#. ($TicketObj->id, $TicketObj->Subject) -msgid "Resolve ticket #%1 (%2)" -msgstr "Malkovich #%1 (%2)" - -#: etc/initialdata:323 html/Elements/SelectDateType:27 lib/RT/Ticket_Overlay.pm:1282 -msgid "Resolved" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Response to requestors" -msgstr "Malkovich to Malkovich" - -#: html/Elements/ListActions:25 html/Search/Elements/NewListActions:25 -msgid "Results" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Results per page" -msgstr "Malkovich Malkovich" - -#: html/Admin/Users/Modify.html:99 html/User/Prefs.html:94 -msgid "Retype Password" -msgstr "Malkovich" - -#: lib/RT/ACE_Overlay.pm:612 -msgid "Right Delegated" -msgstr "Malkovich" - -#: lib/RT/ACE_Overlay.pm:302 -msgid "Right Granted" -msgstr "Malkovich" - -#: lib/RT/ACE_Overlay.pm:160 -msgid "Right Loaded" -msgstr "Malkovich" - -#: lib/RT/ACE_Overlay.pm:677 lib/RT/ACE_Overlay.pm:692 -msgid "Right could not be revoked" -msgstr "Malkovich be Malkovich" - -#: html/User/Delegation.html:63 -msgid "Right not found" -msgstr "Malkovich" - -#: lib/RT/ACE_Overlay.pm:542 lib/RT/ACE_Overlay.pm:637 -msgid "Right not loaded." -msgstr "Malkovich Malkovich." - -#: lib/RT/ACE_Overlay.pm:688 -msgid "Right revoked" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Rights" -msgstr "Malkovich" - -#: lib/RT/Interface/Web.pm:869 -#. ($object_type) -msgid "Rights could not be granted for %1" -msgstr "Malkovich Malkovich be Malkovich %1" - -#: lib/RT/Interface/Web.pm:899 -#. ($object_type) -msgid "Rights could not be revoked for %1" -msgstr "Malkovich Malkovich be Malkovich %1" - -#: html/Admin/Global/GroupRights.html:50 html/Admin/Queues/GroupRights.html:52 -msgid "Roles" -msgstr "Malkovich" - -#: lib/RT/Date.pm:393 -msgid "Sat." -msgstr "Sat." - -#: html/Admin/Global/Template.html:45 html/Admin/Queues/Modify.html:89 html/Admin/Queues/People.html:104 html/Admin/Users/Modify.html:198 html/SelfService/Prefs.html:36 html/Ticket/Modify.html:38 html/Ticket/ModifyAll.html:93 html/Ticket/ModifyDates.html:38 html/Ticket/ModifyLinks.html:38 html/Ticket/ModifyPeople.html:37 -msgid "Save Changes" -msgstr "Malkovich" - -#: html/Ticket/Elements/PreviewScrips:79 -msgid "Save changes" -msgstr "Malkovich" - -#: html/Admin/Global/Scrip.html:48 html/Admin/Queues/Scrip.html:54 -#. ($id) -#. ($ARGS{'id'}) -msgid "Scrip #%1" -msgstr "Malkovich #%1" - -#: lib/RT/Scrip_Overlay.pm:180 -msgid "Scrip Created" -msgstr "Malkovich" - -#: html/Admin/Elements/EditScrips:85 -msgid "Scrip deleted" -msgstr "Malkovich" - -#: html/Admin/Elements/QueueTabs:45 html/Admin/Elements/SystemTabs:32 html/Admin/Global/index.html:40 -msgid "Scrips" -msgstr "Malkovich" - -#: html/Admin/Queues/Scrips.html:33 -msgid "Scrips which apply to all queues" -msgstr "Malkovich Malkovich to Malkovich" - -#: html/Elements/SimpleSearch:26 html/Search/Elements/DisplayOptions:73 -msgid "Search" -msgstr "Malkovich" - -#: html/Approvals/Elements/PendingMyApproval:38 -msgid "Search for approvals" -msgstr "Malkovich Malkovich" - -#: bin/rt-crontool:184 -msgid "Security:" -msgstr "Malkovich:" - -#: lib/RT/Queue_Overlay.pm:68 -msgid "SeeQueue" -msgstr "Malkovich" - -#: html/Admin/Groups/index.html:50 -msgid "Select a group" -msgstr "Malkovich a Malkovich" - -#: html/Admin/Users/index.html:24 html/Admin/Users/index.html:27 -msgid "Select a user" -msgstr "Malkovich a user" - -#: html/Admin/Global/CustomField.html:37 html/Admin/Global/CustomFields.html:35 -msgid "Select custom field" -msgstr "Malkovich Malkovich" - -#: html/Admin/Elements/GroupTabs:51 html/User/Elements/GroupTabs:49 -msgid "Select group" -msgstr "Malkovich" - -#: lib/RT/CustomField_Overlay.pm:427 -msgid "Select multiple values" -msgstr "Malkovich Malkovich" - -#: lib/RT/CustomField_Overlay.pm:424 -msgid "Select one value" -msgstr "Malkovich Malkovich" - -#: html/Admin/Elements/QueueTabs:66 -msgid "Select queue" -msgstr "Malkovich" - -#: html/Admin/Global/Scrip.html:36 html/Admin/Global/Scrips.html:35 html/Admin/Queues/Scrip.html:39 html/Admin/Queues/Scrips.html:51 -msgid "Select scrip" -msgstr "Malkovich" - -#: html/Admin/Global/Template.html:56 html/Admin/Global/Templates.html:35 html/Admin/Queues/Template.html:54 html/Admin/Queues/Templates.html:46 -msgid "Select template" -msgstr "Malkovich" - -#: html/Admin/Elements/UserTabs:46 -msgid "Select user" -msgstr "Malkovich" - -#: lib/RT/CustomField_Overlay.pm:35 -msgid "SelectMultiple" -msgstr "Malkovich" - -#: lib/RT/CustomField_Overlay.pm:34 -msgid "SelectSingle" -msgstr "Malkovich" - -#: etc/initialdata:121 -msgid "Send mail to all watchers" -msgstr "Malkovich to Malkovich" - -#: etc/initialdata:117 -msgid "Send mail to all watchers as a \"comment\"" -msgstr "Malkovich to Malkovich as a \"Malkovich\"" - -#: etc/initialdata:112 -msgid "Send mail to requestors and Ccs" -msgstr "Malkovich to Malkovich and Ccs" - -#: etc/initialdata:107 -msgid "Send mail to requestors and Ccs as a comment" -msgstr "Malkovich to Malkovich and Ccs as a Malkovich" - -#: etc/initialdata:78 -msgid "Sends a message to the requestors" -msgstr "Malkovich a Malkovich to the Malkovich" - -#: etc/initialdata:125 etc/initialdata:129 -msgid "Sends mail to explicitly listed Ccs and Bccs" -msgstr "Malkovich to Malkovich Malkovich and Bccs" - -#: etc/initialdata:102 -msgid "Sends mail to the administrative Ccs" -msgstr "Malkovich to the Malkovich Malkovich" - -#: etc/initialdata:98 -msgid "Sends mail to the administrative Ccs as a comment" -msgstr "Malkovich to the Malkovich Malkovich as a Malkovich" - -#: etc/initialdata:82 etc/initialdata:86 -msgid "Sends mail to the owner" -msgstr "Malkovich to the Malkovich" - -#: lib/RT/Date.pm:419 -msgid "Sep." -msgstr "Sep." - -#: html/Approvals/Elements/PendingMyApproval:43 -msgid "Show approved requests" -msgstr "Malkovich Malkovich" - -#: html/Ticket/Create.html:143 html/Ticket/Create.html:33 -msgid "Show basics" -msgstr "Malkovich" - -#: html/Approvals/Elements/PendingMyApproval:44 -msgid "Show denied requests" -msgstr "Malkovich Malkovich" - -#: html/Ticket/Create.html:143 html/Ticket/Create.html:33 -msgid "Show details" -msgstr "Malkovich" - -#: html/Approvals/Elements/PendingMyApproval:42 -msgid "Show pending requests" -msgstr "Malkovich Malkovich" - -#: html/Approvals/Elements/PendingMyApproval:45 -msgid "Show requests awaiting other approvals" -msgstr "Malkovich Malkovich Malkovich Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Show ticket private commentary" -msgstr "Malkovich Malkovich Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Show ticket summaries" -msgstr "Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:70 -msgid "ShowACL" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:79 -msgid "ShowScrips" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:76 -msgid "ShowTemplate" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:80 -msgid "ShowTicket" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:81 -msgid "ShowTicketComments" -msgstr "Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:84 -msgid "Sign up as a ticket Requestor or ticket or queue Cc" -msgstr "Sign up as a Malkovich Malkovich or Malkovich or Malkovich Cc" - -#: lib/RT/Queue_Overlay.pm:85 -msgid "Sign up as a ticket or queue AdminCc" -msgstr "Sign up as a Malkovich or Malkovich" - -#: html/Admin/Users/Modify.html:188 html/User/Prefs.html:145 -msgid "Signature" -msgstr "Malkovich" - -#: html/Admin/Elements/SelectSingleOrMultiple:25 -msgid "Single" -msgstr "Malkovich" - -#: html/Elements/Header:62 -msgid "Skip Menu" -msgstr "Malkovich" - -#: html/Admin/Elements/AddCustomFieldValue:27 -msgid "Sort" -msgstr "Sort" - -#: NOT FOUND IN SOURCE -msgid "Sort results by" -msgstr "Malkovich by" - -#: NOT FOUND IN SOURCE -msgid "Squelched message recipients" -msgstr "Malkovich Malkovich Malkovich" - -#: html/Admin/Elements/EditScrip:65 -msgid "Stage" -msgstr "Malkovich" - -#: html/Elements/SelectDateType:26 html/Ticket/Elements/EditDates:31 html/Ticket/Elements/ShowDates:35 -msgid "Started" -msgstr "Malkovich" - -#: html/Elements/SelectDateType:30 html/Ticket/Create.html:165 html/Ticket/Elements/EditDates:26 html/Ticket/Elements/ShowDates:31 -msgid "Starts" -msgstr "Malkovich" - -#: html/Admin/Users/Modify.html:135 html/User/Prefs.html:123 -msgid "State" -msgstr "Malkovich" - -#: html/Search/Elements/PickBasics:77 html/SelfService/Elements/MyRequests:28 html/SelfService/Update.html:30 html/Ticket/Create.html:41 html/Ticket/Elements/EditBasics:31 html/Ticket/Elements/ShowBasics:30 html/Ticket/Update.html:37 lib/RT/Ticket_Overlay.pm:1276 lib/RT/Tickets_Overlay.pm:970 -msgid "Status" -msgstr "Malkovich" - -#: etc/initialdata:309 -msgid "Status Change" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:505 -#. ($self->loc($self->OldValue), $self->loc($self->NewValue)) -msgid "Status changed from %1 to %2" -msgstr "Malkovich Malkovich %1 to %2" - -#: html/Ticket/Elements/Tabs:148 -msgid "Steal" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:94 -msgid "Steal tickets" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:94 -msgid "StealTicket" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:581 -#. ($Old->Name) -msgid "Stolen from %1 " -msgstr "Malkovich %1 " - -#: html/Elements/QuickCreate:7 html/Elements/SelectAttachmentField:25 html/Search/Bulk.html:133 html/SelfService/Create.html:56 html/SelfService/Elements/MyRequests:27 html/SelfService/Update.html:31 html/Ticket/Create.html:83 html/Ticket/Elements/EditBasics:26 html/Ticket/ModifyAll.html:78 html/Ticket/Update.html:58 lib/RT/Ticket_Overlay.pm:1272 lib/RT/Tickets_Overlay.pm:1049 -msgid "Subject" -msgstr "Malkovich" - -#: docs/design_docs/string-extraction-guide.txt:89 lib/RT/StyleGuide.pod:795 lib/RT/Transaction_Overlay.pm:603 -#. ($self->Data) -msgid "Subject changed to %1" -msgstr "Malkovich to %1" - -#: html/Elements/Submit:58 -msgid "Submit" -msgstr "Malkovich" - -#: lib/RT/Group_Overlay.pm:749 -msgid "Succeeded" -msgstr "Malkovich" - -#: lib/RT/Date.pm:394 -msgid "Sun." -msgstr "Sun." - -#: lib/RT/System.pm:53 -msgid "SuperUser" -msgstr "Malkovich" - -#: html/User/Elements/DelegateRights:76 -msgid "System" -msgstr "Malkovich" - -#: html/Admin/Elements/SelectRights:81 lib/RT/ACE_Overlay.pm:566 lib/RT/Interface/Web.pm:868 lib/RT/Interface/Web.pm:898 -msgid "System Error" -msgstr "Malkovich" - -#: lib/RT/ACE_Overlay.pm:615 -msgid "System error. Right not delegated." -msgstr "Malkovich. Malkovich Malkovich." - -#: lib/RT/ACE_Overlay.pm:145 lib/RT/ACE_Overlay.pm:222 lib/RT/ACE_Overlay.pm:305 lib/RT/ACE_Overlay.pm:897 -msgid "System error. Right not granted." -msgstr "Malkovich. Malkovich Malkovich." - -#: html/Admin/Global/GroupRights.html:34 html/Admin/Groups/GroupRights.html:36 html/Admin/Queues/GroupRights.html:35 -msgid "System groups" -msgstr "Malkovich" - -#: etc/initialdata:41 etc/initialdata:47 etc/initialdata:53 -msgid "SystemRolegroup for internal use" -msgstr "Malkovich Malkovich Malkovich" - -#: lib/RT/CurrentUser.pm:334 -msgid "TEST_STRING" -msgstr "TEST_MALKOVICH" - -#: html/Elements/MyRequests:27 html/Ticket/Elements/Tabs:144 -msgid "Take" -msgstr "Take" - -#: lib/RT/Queue_Overlay.pm:92 -msgid "Take tickets" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:92 -msgid "TakeTicket" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:566 -msgid "Taken" -msgstr "Malkovich" - -#: html/Admin/Elements/EditScrip:57 html/Tools/Offline.html:56 -msgid "Template" -msgstr "Malkovich" - -#: html/Admin/Global/Template.html:90 html/Admin/Queues/Template.html:89 -#. ($TemplateObj->Id()) -msgid "Template #%1" -msgstr "Malkovich #%1" - -#: html/Admin/Elements/EditTemplates:88 -msgid "Template deleted" -msgstr "Malkovich Malkovich" - -#: lib/RT/Scrip_Overlay.pm:156 -msgid "Template not found" -msgstr "Malkovich Malkovich" - -#: lib/RT/Template_Overlay.pm:348 -msgid "Template parsed" -msgstr "Malkovich" - -#: html/Admin/Elements/QueueTabs:48 html/Admin/Elements/SystemTabs:35 html/Admin/Global/index.html:44 -msgid "Templates" -msgstr "Malkovich" - -#: lib/RT/Record.pm:740 -msgid "That is already the current value" -msgstr "That is Malkovich the Malkovich" - -#: lib/RT/CustomField_Overlay.pm:248 -msgid "That is not a value for this custom field" -msgstr "That is not a Malkovich Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:2086 -msgid "That is the same value" -msgstr "That is the Malkovich" - -#: lib/RT/ACE_Overlay.pm:287 lib/RT/ACE_Overlay.pm:596 -msgid "That principal already has that right" -msgstr "Malkovich Malkovich Malkovich Malkovich" - -#: lib/RT/Queue_Overlay.pm:674 -#. ($args{'Type'}) -msgid "That principal is already a %1 for this queue" -msgstr "Malkovich is Malkovich a %1 Malkovich" - -#: lib/RT/Ticket_Overlay.pm:1527 -#. ($self->loc($args{'Type'})) -msgid "That principal is already a %1 for this ticket" -msgstr "Malkovich is Malkovich a %1 Malkovich" - -#: lib/RT/Queue_Overlay.pm:773 -#. ($args{'Type'}) -msgid "That principal is not a %1 for this queue" -msgstr "That Malkovich is not a %1 Malkovich" - -#: lib/RT/Ticket_Overlay.pm:2082 -msgid "That queue does not exist" -msgstr "Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:3152 -msgid "That ticket has unresolved dependencies" -msgstr "Malkovich Malkovich Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:2956 -msgid "That user already owns that ticket" -msgstr "Malkovich Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:2928 -msgid "That user does not exist" -msgstr "Malkovich Malkovich" - -#: lib/RT/User_Overlay.pm:355 -msgid "That user is already privileged" -msgstr "Malkovich is Malkovich Malkovich" - -#: lib/RT/User_Overlay.pm:376 -msgid "That user is already unprivileged" -msgstr "Malkovich is Malkovich Malkovich" - -#: lib/RT/User_Overlay.pm:368 -msgid "That user is now privileged" -msgstr "Malkovich is Malkovich" - -#: lib/RT/User_Overlay.pm:389 -msgid "That user is now unprivileged" -msgstr "Malkovich is Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:2949 -msgid "That user may not own tickets in that queue" -msgstr "Malkovich Malkovich Malkovich in Malkovich" - -#: lib/RT/Link_Overlay.pm:200 -msgid "That's not a numerical id" -msgstr "That's not a Malkovich id" - -#: html/SelfService/Display.html:31 html/Ticket/Create.html:149 html/Ticket/Elements/ShowSummary:27 -msgid "The Basics" -msgstr "The Malkovich" - -#: lib/RT/ACE_Overlay.pm:87 -msgid "The CC of a ticket" -msgstr "The CC of a Malkovich" - -#: lib/RT/ACE_Overlay.pm:88 -msgid "The administrative CC of a ticket" -msgstr "The Malkovich CC of a Malkovich" - -#: bin/rt-crontool:194 -msgid "The following command will find all active tickets in the queue 'general' and set their priority to 99 if they haven't been touched in 4 hours:" -msgstr "The Malkovich Malkovich Malkovich Malkovich Malkovich in the Malkovich 'Malkovich' and Malkovich Malkovich to 99 if they haven't Malkovich in 4 Malkovich:" - -#: NOT FOUND IN SOURCE -msgid "The following commands were not proccessed:\\n\\n" -msgstr "The Malkovich Malkovich Malkovich Malkovich:\\n\\n" - -#: lib/RT/Record.pm:743 -msgid "The new value has been set." -msgstr "The Malkovich Malkovich." - -#: lib/RT/ACE_Overlay.pm:85 -msgid "The owner of a ticket" -msgstr "The Malkovich of a Malkovich" - -#: lib/RT/ACE_Overlay.pm:86 -msgid "The requestor of a ticket" -msgstr "The Malkovich of a Malkovich" - -#: html/Admin/Elements/EditUserComments:25 -msgid "These comments aren't generally visible to the user" -msgstr "Malkovich aren't Malkovich Malkovich to the user" - -#: bin/rt-crontool:185 -msgid "This tool allows the user to run arbitrary perl modules from within RT." -msgstr "Malkovich Malkovich the user to Malkovich Malkovich Malkovich Malkovich RT." - -#: lib/RT/Transaction_Overlay.pm:226 -msgid "This transaction appears to have no content" -msgstr "Malkovich Malkovich to have no Malkovich" - -#: html/Ticket/Elements/ShowRequestor:48 -#. ($rows) -msgid "This user's %1 highest priority tickets" -msgstr "Malkovich's %1 Malkovich Malkovich" - -#: lib/RT/Date.pm:391 -msgid "Thu." -msgstr "Thu." - -#: html/Ticket/ModifyAll.html:24 html/Ticket/ModifyAll.html:28 -#. ($Ticket->Id, $Ticket->Subject) -msgid "Ticket #%1 Jumbo update: %2" -msgstr "Malkovich #%1 Malkovich: %2" - -#: html/Approvals/Elements/ShowDependency:45 -#. ($link->BaseObj->Id, $link->BaseObj->Subject) -msgid "Ticket #%1: %2" -msgstr "Malkovich #%1: %2" - -#: lib/RT/Ticket_Overlay.pm:696 lib/RT/Ticket_Overlay.pm:720 -#. ($self->Id, $QueueObj->Name) -msgid "Ticket %1 created in queue '%2'" -msgstr "Malkovich %1 Malkovich in Malkovich '%2'" - -#: NOT FOUND IN SOURCE -msgid "Ticket %1 loaded\\n" -msgstr "Malkovich %1 Malkovich\\n" - -#: html/Search/Bulk.html:216 -#. ($Ticket->Id,$_) -msgid "Ticket %1: %2" -msgstr "Malkovich %1: %2" - -#: html/Ticket/History.html:24 html/Ticket/History.html:27 -#. ($Ticket->Id, $Ticket->Subject) -msgid "Ticket History # %1 %2" -msgstr "Malkovich # %1 %2" - -#: etc/initialdata:324 -msgid "Ticket Resolved" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Ticket attachment" -msgstr "Malkovich Malkovich" - -#: lib/RT/Tickets_Overlay.pm:1228 -msgid "Ticket content" -msgstr "Malkovich" - -#: lib/RT/Tickets_Overlay.pm:1274 -msgid "Ticket content type" -msgstr "Malkovich Malkovich" - -#: lib/RT/Ticket_Overlay.pm:565 lib/RT/Ticket_Overlay.pm:579 lib/RT/Ticket_Overlay.pm:590 lib/RT/Ticket_Overlay.pm:707 -msgid "Ticket could not be created due to an internal error" -msgstr "Malkovich Malkovich be Malkovich to a Malkovich" - -#: lib/RT/Transaction_Overlay.pm:497 -msgid "Ticket created" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:502 -msgid "Ticket deleted" -msgstr "Malkovich" - -#: etc/initialdata:310 -msgid "Ticket status changed" -msgstr "Malkovich Malkovich" - -#: html/Elements/Tabs:46 -msgid "Tickets" -msgstr "Malkovich" - -#: lib/RT/Tickets_Overlay.pm:1452 -#. ($self->loc($args{'TYPE'}), ($args{'BASE'} || $args{'TICKET'})) -msgid "Tickets %1 %2" -msgstr "Malkovich %1 %2" - -#: lib/RT/Tickets_Overlay.pm:1410 -#. ($self->loc($args{'TYPE'}), ($args{'TARGET'} || $args{'TICKET'})) -msgid "Tickets %1 by %2" -msgstr "Malkovich %1 by %2" - -#: NOT FOUND IN SOURCE -msgid "Tickets from %1" -msgstr "Malkovich %1" - -#: html/Approvals/Elements/ShowDependency:26 -msgid "Tickets which depend on this approval:" -msgstr "Malkovich Malkovich on Malkovich:" - -#: html/Search/Elements/PickBasics:70 html/Ticket/Create.html:156 html/Ticket/Elements/EditBasics:47 -msgid "Time Left" -msgstr "Malkovich" - -#: html/Search/Elements/PickBasics:68 html/Ticket/Create.html:155 html/Ticket/Elements/EditBasics:43 -msgid "Time Worked" -msgstr "Malkovich" - -#: lib/RT/Tickets_Overlay.pm:1201 -msgid "Time left" -msgstr "Malkovich" - -#: html/Elements/Footer:44 -msgid "Time to display" -msgstr "Time to Malkovich" - -#: lib/RT/Tickets_Overlay.pm:1177 -msgid "Time worked" -msgstr "Malkovich" - -#: lib/RT/Ticket_Overlay.pm:1277 -msgid "TimeWorked" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "To generate a diff of this commit:" -msgstr "To Malkovich a diff of Malkovich:" - -#: NOT FOUND IN SOURCE -msgid "To generate a diff of this commit:\\n" -msgstr "To Malkovich a diff of Malkovich:\\n" - -#: lib/RT/Ticket_Overlay.pm:1280 -msgid "Told" -msgstr "Told" - -#: etc/initialdata:252 -msgid "Transaction" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:705 -#. ($self->Data) -msgid "Transaction %1 purged" -msgstr "Malkovich %1 Malkovich" - -#: lib/RT/Transaction_Overlay.pm:136 -msgid "Transaction Created" -msgstr "Malkovich Malkovich" - -#: lib/RT/Transaction_Overlay.pm:92 -msgid "Transaction->Create couldn't, as you didn't specify a ticket id" -msgstr "Malkovich->Malkovich couldn't, as you didn't Malkovich a Malkovich id" - -#: lib/RT/Transaction_Overlay.pm:760 -msgid "Transactions are immutable" -msgstr "Malkovich Malkovich Malkovich" - -#: lib/RT/Date.pm:389 -msgid "Tue." -msgstr "Tue." - -#: html/Admin/Elements/EditCustomField:43 html/Ticket/Elements/AddWatchers:32 html/Ticket/Elements/AddWatchers:43 html/Ticket/Elements/AddWatchers:53 lib/RT/Ticket_Overlay.pm:1278 lib/RT/Tickets_Overlay.pm:1021 -msgid "Type" -msgstr "Type" - -#: lib/RT/ScripCondition_Overlay.pm:103 -msgid "Unimplemented" -msgstr "Malkovich" - -#: html/Admin/Users/Modify.html:67 -msgid "Unix login" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "UnixUsername" -msgstr "Malkovich" - -#: lib/RT/Attachment_Overlay.pm:233 lib/RT/Attachment_Overlay.pm:265 -#. ($self->ContentEncoding) -msgid "Unknown ContentEncoding %1" -msgstr "Malkovich Malkovich %1" - -#: html/Elements/SelectResultsPerPage:36 -msgid "Unlimited" -msgstr "Malkovich" - -#: etc/initialdata:32 -msgid "Unprivileged" -msgstr "Malkovich" - -#: lib/RT/Transaction_Overlay.pm:562 -msgid "Untaken" -msgstr "Malkovich" - -#: html/Search/Bulk.html:32 -msgid "Update" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Update ID" -msgstr "Malkovich ID" - -#: html/Search/Bulk.html:127 html/Ticket/ModifyAll.html:65 html/Ticket/Update.html:48 -msgid "Update Type" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Update all these tickets at once" -msgstr "Malkovich Malkovich at once" - -#: NOT FOUND IN SOURCE -msgid "Update email" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Update name" -msgstr "Malkovich" - -#: lib/RT/Action/CreateTickets.pm:655 lib/RT/Interface/Web.pm:479 -msgid "Update not recorded." -msgstr "Malkovich Malkovich." - -#: html/Search/Bulk.html:78 -msgid "Update selected tickets" -msgstr "Malkovich Malkovich" - -#: NOT FOUND IN SOURCE -msgid "Update signature" -msgstr "Malkovich Malkovich" - -#: html/Ticket/ModifyAll.html:62 -msgid "Update ticket" -msgstr "Malkovich" - -#: html/SelfService/Update.html:24 html/SelfService/Update.html:63 -#. ($Ticket->id) -msgid "Update ticket #%1" -msgstr "Malkovich #%1" - -#: html/Ticket/Update.html:121 -#. ($TicketObj->id, $TicketObj->Subject) -msgid "Update ticket #%1 (%2)" -msgstr "Malkovich #%1 (%2)" - -#: lib/RT/Action/CreateTickets.pm:653 lib/RT/Interface/Web.pm:477 -msgid "Update type was neither correspondence nor comment." -msgstr "Malkovich Malkovich Malkovich Malkovich Malkovich." - -#: html/Elements/SelectDateType:32 html/Ticket/Elements/ShowDates:51 lib/RT/Ticket_Overlay.pm:1281 -msgid "Updated" -msgstr "Malkovich" - -#: etc/initialdata:132 etc/initialdata:206 -msgid "User Defined" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "User ID" -msgstr "User ID" - -#: html/Elements/SelectUsers:25 -msgid "User Id" -msgstr "User Id" - -#: html/Admin/Elements/GroupTabs:46 html/Admin/Elements/QueueTabs:59 html/Admin/Elements/SystemTabs:46 html/Admin/Global/index.html:58 -msgid "User Rights" -msgstr "Malkovich" - -#: html/Admin/Users/Modify.html:252 -#. ($msg) -msgid "User could not be created: %1" -msgstr "Malkovich be Malkovich: %1" - -#: lib/RT/User_Overlay.pm:296 -msgid "User created" -msgstr "Malkovich" - -#: html/Admin/Global/GroupRights.html:66 html/Admin/Groups/GroupRights.html:53 html/Admin/Queues/GroupRights.html:68 -msgid "User defined groups" -msgstr "Malkovich Malkovich" - -#: lib/RT/User_Overlay.pm:558 lib/RT/User_Overlay.pm:575 -msgid "User loaded" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "User view" -msgstr "Malkovich" - -#: html/Admin/Users/Modify.html:47 html/Elements/Login:51 html/Ticket/Elements/AddWatchers:34 -msgid "Username" -msgstr "Malkovich" - -#: html/Admin/Elements/SelectNewGroupMembers:25 html/Admin/Elements/Tabs:31 html/Admin/Groups/Members.html:54 html/Admin/Queues/People.html:67 html/Admin/index.html:28 html/User/Groups/Members.html:57 -msgid "Users" -msgstr "Malkovich" - -#: html/Admin/Users/index.html:64 -msgid "Users matching search criteria" -msgstr "Malkovich Malkovich Malkovich" - -#: lib/RT/Tickets_Overlay_SQL.pm:494 -msgid "Valid Query" -msgstr "Malkovich" - -#: html/Admin/Elements/EditCustomField:56 -msgid "Values" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:84 -msgid "Watch" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:85 -msgid "WatchAsAdminCc" -msgstr "Malkovich" - -#: html/Admin/Elements/QueueTabs:41 -msgid "Watchers" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "WebEncoding" -msgstr "Malkovich" - -#: lib/RT/Date.pm:390 -msgid "Wed." -msgstr "Wed." - -#: etc/initialdata:521 -msgid "When a ticket has been approved by all approvers, add correspondence to the original ticket" -msgstr "When a Malkovich Malkovich by Malkovich, Malkovich Malkovich to the Malkovich" - -#: etc/initialdata:485 -msgid "When a ticket has been approved by any approver, add correspondence to the original ticket" -msgstr "When a Malkovich Malkovich by Malkovich, Malkovich Malkovich to the Malkovich" - -#: etc/initialdata:146 -msgid "When a ticket is created" -msgstr "When a Malkovich is Malkovich" - -#: etc/initialdata:418 -msgid "When an approval ticket is created, notify the Owner and AdminCc of the item awaiting their approval" -msgstr "When a Malkovich is Malkovich, Malkovich the Malkovich and Malkovich of the Malkovich Malkovich Malkovich" - -#: etc/initialdata:151 -msgid "When anything happens" -msgstr "Malkovich Malkovich" - -#: etc/initialdata:199 -msgid "Whenever a ticket is resolved" -msgstr "Malkovich a Malkovich is Malkovich" - -#: etc/initialdata:185 -msgid "Whenever a ticket's owner changes" -msgstr "Malkovich a Malkovich's Malkovich" - -#: etc/initialdata:193 -msgid "Whenever a ticket's queue changes" -msgstr "Malkovich a Malkovich's Malkovich" - -#: etc/initialdata:170 -msgid "Whenever a ticket's status changes" -msgstr "Malkovich a Malkovich's Malkovich" - -#: etc/initialdata:207 -msgid "Whenever a user-defined condition occurs" -msgstr "Malkovich a user-Malkovich Malkovich" - -#: etc/initialdata:164 -msgid "Whenever comments come in" -msgstr "Malkovich Malkovich in" - -#: etc/initialdata:157 -msgid "Whenever correspondence comes in" -msgstr "Malkovich Malkovich Malkovich in" - -#: html/Admin/Users/Modify.html:161 html/User/Prefs.html:67 -msgid "Work" -msgstr "Work" - -#: NOT FOUND IN SOURCE -msgid "WorkPhone" -msgstr "Malkovich" - -#: html/Ticket/Elements/ShowBasics:41 html/Ticket/Update.html:42 -msgid "Worked" -msgstr "Malkovich" - -#: html/autohandler:150 -msgid "XXX CHANGEME You are not an authorized user" -msgstr "MALKOVICH Malkovich a Malkovich" - -#: lib/RT/Ticket_Overlay.pm:3059 -msgid "You already own this ticket" -msgstr "Malkovich Malkovich Malkovich" - -#: html/autohandler:142 -msgid "You are not an authorized user" -msgstr "Malkovich a Malkovich" - -#: NOT FOUND IN SOURCE -msgid "You can access it with the Download button on the right." -msgstr "Malkovich it with the Malkovich on the Malkovich." - -#: lib/RT/Ticket_Overlay.pm:2941 -msgid "You can only reassign tickets that you own or that are unowned" -msgstr "Malkovich Malkovich Malkovich Malkovich or Malkovich Malkovich" - -#: docs/design_docs/string-extraction-guide.txt:47 lib/RT/StyleGuide.pod:760 -#. ($num, $queue) -msgid "You found %1 tickets in queue %2" -msgstr "Malkovich %1 Malkovich in Malkovich %2" - -#: html/NoAuth/Logout.html:30 -msgid "You have been logged out of RT." -msgstr "Malkovich Malkovich of RT." - -#: html/SelfService/Display.html:79 -msgid "You have no permission to create tickets in that queue." -msgstr "Malkovich no Malkovich to Malkovich in that Malkovich." - -#: lib/RT/Ticket_Overlay.pm:2095 -msgid "You may not create requests in that queue." -msgstr "Malkovich Malkovich Malkovich in Malkovich." - -#: html/NoAuth/Logout.html:34 -msgid "You're welcome to login again" -msgstr "You're Malkovich to Malkovich" - -#: etc/initialdata:502 -msgid "Your request has been approved by %1. Other approvals may still be pending." -msgstr "Malkovich Malkovich Malkovich by %1. Malkovich Malkovich be Malkovich." - -#: etc/initialdata:540 -msgid "Your request has been approved." -msgstr "Malkovich Malkovich Malkovich." - -#: etc/initialdata:445 -msgid "Your request was rejected." -msgstr "Malkovich Malkovich." - -#: html/autohandler:177 -msgid "Your username or password is incorrect" -msgstr "Malkovich or Malkovich is Malkovich" - -#: html/Admin/Users/Modify.html:141 html/User/Prefs.html:127 -msgid "Zip" -msgstr "Zip" - -#: html/User/Elements/DelegateRights:58 -#. ($right->PrincipalObj->Object->SelfDescription) -msgid "as granted to %1" -msgstr "as Malkovich to %1" - -#: html/SelfService/Closed.html:27 -msgid "closed" -msgstr "Malkovich" - -#: html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectMatch:33 -msgid "contains" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "content" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "content-type" -msgstr "Malkovich-type" - -#: html/Admin/Queues/Modify.html:76 lib/RT/Date.pm:319 -msgid "days" -msgstr "days" - -#: lib/RT/Queue_Overlay.pm:64 -msgid "deleted" -msgstr "Malkovich" - -#: html/Search/Elements/PickBasics:33 -msgid "does not match" -msgstr "Malkovich" - -#: html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectMatch:34 -msgid "doesn't contain" -msgstr "doesn't Malkovich" - -#: html/Elements/SelectEqualityOperator:37 -msgid "equal to" -msgstr "Malkovich to" - -#: NOT FOUND IN SOURCE -msgid "filename" -msgstr "Malkovich" - -#: html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectEqualityOperator:37 -msgid "greater than" -msgstr "Malkovich" - -#: lib/RT/Group_Overlay.pm:196 -#. ($self->Name) -msgid "group '%1'" -msgstr "Malkovich '%1'" - -#: lib/RT/Date.pm:315 -msgid "hours" -msgstr "Malkovich" - -#: html/Elements/SelectBoolean:31 html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectMatch:35 html/Search/Elements/PickBasics:49 html/Search/Elements/PickBasics:80 html/Search/Elements/PickBasics:97 html/Search/Elements/PickCFs:37 -msgid "is" -msgstr "is" - -#: html/Elements/SelectBoolean:35 html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectMatch:36 html/Search/Elements/PickBasics:50 html/Search/Elements/PickBasics:81 html/Search/Elements/PickBasics:98 html/Search/Elements/PickCFs:38 -msgid "isn't" -msgstr "isn't" - -#: html/Elements/SelectCustomFieldOperator:37 html/Elements/SelectEqualityOperator:37 -msgid "less than" -msgstr "Malkovich" - -#: html/Search/Elements/PickBasics:32 -msgid "matches" -msgstr "Malkovich" - -#: lib/RT/Date.pm:311 -msgid "min" -msgstr "min" - -#: html/Ticket/Update.html:42 -msgid "minutes" -msgstr "Malkovich" - -#: NOT FOUND IN SOURCE -msgid "modifications\\n\\n" -msgstr "Malkovich\\n\\n" - -#: lib/RT/Date.pm:327 -msgid "months" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:59 -msgid "new" -msgstr "new" - -#: html/Admin/Elements/EditCustomFields:42 -msgid "no name" -msgstr "no name" - -#: html/Admin/Elements/EditScrips:42 -msgid "no value" -msgstr "no Malkovich" - -#: html/Admin/Elements/EditQueueWatchers:26 html/Ticket/Elements/EditWatchers:27 -msgid "none" -msgstr "none" - -#: html/Elements/SelectEqualityOperator:37 -msgid "not equal to" -msgstr "Malkovich to" - -#: html/SelfService/Elements/MyRequests:61 lib/RT/Queue_Overlay.pm:60 -msgid "open" -msgstr "open" - -#: lib/RT/Group_Overlay.pm:201 -#. ($self->Name, $user->Name) -msgid "personal group '%1' for user '%2'" -msgstr "Malkovich '%1' Malkovich '%2'" - -#: lib/RT/Group_Overlay.pm:209 -#. ($queue->Name, $self->Type) -msgid "queue %1 %2" -msgstr "Malkovich %1 %2" - -#: lib/RT/Queue_Overlay.pm:63 -msgid "rejected" -msgstr "Malkovich" - -#: lib/RT/Queue_Overlay.pm:62 -msgid "resolved" -msgstr "Malkovich" - -#: lib/RT/Date.pm:307 -msgid "sec" -msgstr "sec" - -#: lib/RT/Queue_Overlay.pm:61 -msgid "stalled" -msgstr "Malkovich" - -#: lib/RT/Group_Overlay.pm:204 -#. ($self->Type) -msgid "system %1" -msgstr "Malkovich %1" - -#: lib/RT/Group_Overlay.pm:215 -#. ($self->Type) -msgid "system group '%1'" -msgstr "Malkovich '%1'" - -#: html/Elements/Error:42 html/SelfService/Error.html:41 -msgid "the calling component did not specify why" -msgstr "the Malkovich Malkovich Malkovich Malkovich" - -#: NOT FOUND IN SOURCE -msgid "ticket #%1" -msgstr "Malkovich #%1" - -#: lib/RT/Group_Overlay.pm:212 -#. ($self->Instance, $self->Type) -msgid "ticket #%1 %2" -msgstr "Malkovich #%1 %2" - -#: lib/RT/Group_Overlay.pm:218 -#. ($self->Id) -msgid "undescribed group %1" -msgstr "Malkovich Malkovich %1" - -#: lib/RT/Group_Overlay.pm:193 -#. ($user->Object->Name) -msgid "user %1" -msgstr "user %1" - -#: lib/RT/Date.pm:323 -msgid "weeks" -msgstr "Malkovich" - -#: lib/RT/Date.pm:331 -msgid "years" -msgstr "Malkovich" - diff --git a/rt/lib/RT/Interface/Web_Vendor.pm b/rt/lib/RT/Interface/Web_Vendor.pm new file mode 100644 index 000000000..5be20e6b9 --- /dev/null +++ b/rt/lib/RT/Interface/Web_Vendor.pm @@ -0,0 +1,95 @@ +# Copyright (c) 2004 Ivan Kohler <ivan-rt@420.am> +# +# 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. + +=head1 NAME + +RT::Interface::Web_Vendor + +=head1 SYNOPSIS + +=head1 DESCRIPTION + +Freeside vendor overlay for RT::Interface::Web. + +=begin testing + +use_ok(RT::Interface::Web_Vendor); + +=end testing + +=cut + +#package RT::Interface::Web; +#use strict; + +package HTML::Mason::Commands; +use strict; + +=head2 ProcessTicketCustomers + +=cut + +sub ProcessTicketCustomers { + my %args = ( + TicketObj => undef, + ARGSRef => undef, + @_ + ); + my @results = (); + + my $Ticket = $args{'TicketObj'}; + my $ARGSRef = $args{'ARGSRef'}; + + ### false laziness w/RT::Interface::Web::ProcessTicketLinks + # Delete links that are gone gone gone. + foreach my $arg ( keys %$ARGSRef ) { + if ( $arg =~ /DeleteLink-(.*?)-(DependsOn|MemberOf|RefersTo)-(.*)$/ ) { + my $base = $1; + my $type = $2; + my $target = $3; + + push @results, + "Trying to delete: Base: $base Target: $target Type $type"; + my ( $val, $msg ) = $Ticket->DeleteLink( Base => $base, + Type => $type, + Target => $target ); + + push @results, $msg; + + } + + } + ### + + my @delete_custnums = + map { /^Ticket-AddCustomer-(\d+)$/; $1 } + grep { /^Ticket-AddCustomer-(\d+)$/ && $ARGSRef->{$_} } + keys %$ARGSRef; + + my @custnums = map { /^Ticket-AddCustomer-(\d+)$/; $1 } + grep { /^Ticket-AddCustomer-(\d+)$/ && $ARGSRef->{$_} } + keys %$ARGSRef; + + foreach my $custnum ( @custnums ) { + my( $val, $msg ) = + $Ticket->AddLink( 'Type' => 'MemberOf', + 'Target' => "freeside://freeside/cust_main/$custnum", + ); + push @results, $msg; + } + + return @results; + +} + +1; + diff --git a/rt/lib/RT/TicketCustomFieldValue.pm b/rt/lib/RT/TicketCustomFieldValue.pm deleted file mode 100644 index 717647266..000000000 --- a/rt/lib/RT/TicketCustomFieldValue.pm +++ /dev/null @@ -1,308 +0,0 @@ -# {{{ BEGIN BPS TAGGED BLOCK -# -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2004 Best Practical Solutions, LLC -# <jesse@bestpractical.com> -# -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: -# -# 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) -# -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. -# -# }}} END BPS TAGGED BLOCK -# Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>) -# WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST. -# -# !! DO NOT EDIT THIS FILE !! -# - -use strict; - - -=head1 NAME - -RT::TicketCustomFieldValue - - -=head1 SYNOPSIS - -=head1 DESCRIPTION - -=head1 METHODS - -=cut - -package RT::TicketCustomFieldValue; -use RT::Record; -use RT::CustomField; -use RT::Ticket; - - -use vars qw( @ISA ); -@ISA= qw( RT::Record ); - -sub _Init { - my $self = shift; - - $self->Table('TicketCustomFieldValues'); - $self->SUPER::_Init(@_); -} - - - - - -=head2 Create PARAMHASH - -Create takes a hash of values and creates a row in the database: - - int(11) 'Ticket'. - int(11) 'CustomField'. - varchar(255) 'Content'. - -=cut - - - - -sub Create { - my $self = shift; - my %args = ( - Ticket => '0', - CustomField => '0', - Content => '', - - @_); - $self->SUPER::Create( - Ticket => $args{'Ticket'}, - CustomField => $args{'CustomField'}, - Content => $args{'Content'}, -); - -} - - - -=head2 id - -Returns the current value of id. -(In the database, id is stored as int(11).) - - -=cut - - -=head2 Ticket - -Returns the current value of Ticket. -(In the database, Ticket is stored as int(11).) - - - -=head2 SetTicket VALUE - - -Set Ticket to VALUE. -Returns (1, 'Status message') on success and (0, 'Error Message') on failure. -(In the database, Ticket will be stored as a int(11).) - - -=cut - - -=head2 TicketObj - -Returns the Ticket Object which has the id returned by Ticket - - -=cut - -sub TicketObj { - my $self = shift; - my $Ticket = RT::Ticket->new($self->CurrentUser); - $Ticket->Load($self->__Value('Ticket')); - return($Ticket); -} - -=head2 CustomField - -Returns the current value of CustomField. -(In the database, CustomField is stored as int(11).) - - - -=head2 SetCustomField VALUE - - -Set CustomField to VALUE. -Returns (1, 'Status message') on success and (0, 'Error Message') on failure. -(In the database, CustomField will be stored as a int(11).) - - -=cut - - -=head2 CustomFieldObj - -Returns the CustomField Object which has the id returned by CustomField - - -=cut - -sub CustomFieldObj { - my $self = shift; - my $CustomField = RT::CustomField->new($self->CurrentUser); - $CustomField->Load($self->__Value('CustomField')); - return($CustomField); -} - -=head2 Content - -Returns the current value of Content. -(In the database, Content is stored as varchar(255).) - - - -=head2 SetContent VALUE - - -Set Content to VALUE. -Returns (1, 'Status message') on success and (0, 'Error Message') on failure. -(In the database, Content will be stored as a varchar(255).) - - -=cut - - -=head2 Creator - -Returns the current value of Creator. -(In the database, Creator is stored as int(11).) - - -=cut - - -=head2 Created - -Returns the current value of Created. -(In the database, Created is stored as datetime.) - - -=cut - - -=head2 LastUpdatedBy - -Returns the current value of LastUpdatedBy. -(In the database, LastUpdatedBy is stored as int(11).) - - -=cut - - -=head2 LastUpdated - -Returns the current value of LastUpdated. -(In the database, LastUpdated is stored as datetime.) - - -=cut - - - -sub _CoreAccessible { - { - - id => - {read => 1, type => 'int(11)', default => ''}, - Ticket => - {read => 1, write => 1, type => 'int(11)', default => '0'}, - CustomField => - {read => 1, write => 1, type => 'int(11)', default => '0'}, - Content => - {read => 1, write => 1, type => 'varchar(255)', default => ''}, - Creator => - {read => 1, auto => 1, type => 'int(11)', default => '0'}, - Created => - {read => 1, auto => 1, type => 'datetime', default => ''}, - LastUpdatedBy => - {read => 1, auto => 1, type => 'int(11)', default => '0'}, - LastUpdated => - {read => 1, auto => 1, type => 'datetime', default => ''}, - - } -}; - - - eval "require RT::TicketCustomFieldValue_Overlay"; - if ($@ && $@ !~ qr{^Can't locate RT/TicketCustomFieldValue_Overlay.pm}) { - die $@; - }; - - eval "require RT::TicketCustomFieldValue_Vendor"; - if ($@ && $@ !~ qr{^Can't locate RT/TicketCustomFieldValue_Vendor.pm}) { - die $@; - }; - - eval "require RT::TicketCustomFieldValue_Local"; - if ($@ && $@ !~ qr{^Can't locate RT/TicketCustomFieldValue_Local.pm}) { - die $@; - }; - - - - -=head1 SEE ALSO - -This class allows "overlay" methods to be placed -into the following files _Overlay is for a System overlay by the original author, -_Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customizations. - -These overlay files can contain new subs or subs to replace existing subs in this module. - -If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line - - no warnings qw(redefine); - -so that perl does not kick and scream when you redefine a subroutine or variable in your overlay. - -RT::TicketCustomFieldValue_Overlay, RT::TicketCustomFieldValue_Vendor, RT::TicketCustomFieldValue_Local - -=cut - - -1; diff --git a/rt/lib/RT/TicketCustomFieldValue_Overlay.pm b/rt/lib/RT/TicketCustomFieldValue_Overlay.pm deleted file mode 100644 index 270c5939a..000000000 --- a/rt/lib/RT/TicketCustomFieldValue_Overlay.pm +++ /dev/null @@ -1,74 +0,0 @@ -# {{{ BEGIN BPS TAGGED BLOCK -# -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2004 Best Practical Solutions, LLC -# <jesse@bestpractical.com> -# -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: -# -# 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) -# -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. -# -# }}} END BPS TAGGED BLOCK -use strict; -no warnings qw(redefine); - - - -=head2 LoadByTicketContentAndCustomField { Ticket => TICKET, CustomField => CUSTOMFIELD, Content => CONTENT } - -Loads a custom field value by Ticket, Content and which CustomField it's tied to - -=cut - - -sub LoadByTicketContentAndCustomField { - my $self = shift; - my %args = ( Ticket => undef, - CustomField => undef, - Content => undef, - @_ - ); - - - $self->LoadByCols( Content => $args{'Content'}, - CustomField => $args{'CustomField'}, - Ticket => $args{'Ticket'}); - - -} - -1; diff --git a/rt/lib/RT/TicketCustomFieldValues.pm b/rt/lib/RT/TicketCustomFieldValues.pm deleted file mode 100644 index 2174afef3..000000000 --- a/rt/lib/RT/TicketCustomFieldValues.pm +++ /dev/null @@ -1,137 +0,0 @@ -# {{{ BEGIN BPS TAGGED BLOCK -# -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2004 Best Practical Solutions, LLC -# <jesse@bestpractical.com> -# -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: -# -# 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) -# -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. -# -# }}} END BPS TAGGED BLOCK -# Autogenerated by DBIx::SearchBuilder factory (by <jesse@bestpractical.com>) -# WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST. -# -# !! DO NOT EDIT THIS FILE !! -# - -use strict; - - -=head1 NAME - - RT::TicketCustomFieldValues -- Class Description - -=head1 SYNOPSIS - - use RT::TicketCustomFieldValues - -=head1 DESCRIPTION - - -=head1 METHODS - -=cut - -package RT::TicketCustomFieldValues; - -use RT::SearchBuilder; -use RT::TicketCustomFieldValue; - -use vars qw( @ISA ); -@ISA= qw(RT::SearchBuilder); - - -sub _Init { - my $self = shift; - $self->{'table'} = 'TicketCustomFieldValues'; - $self->{'primary_key'} = 'id'; - - - return ( $self->SUPER::_Init(@_) ); -} - - -=head2 NewItem - -Returns an empty new RT::TicketCustomFieldValue item - -=cut - -sub NewItem { - my $self = shift; - return(RT::TicketCustomFieldValue->new($self->CurrentUser)); -} - - eval "require RT::TicketCustomFieldValues_Overlay"; - if ($@ && $@ !~ qr{^Can't locate RT/TicketCustomFieldValues_Overlay.pm}) { - die $@; - }; - - eval "require RT::TicketCustomFieldValues_Vendor"; - if ($@ && $@ !~ qr{^Can't locate RT/TicketCustomFieldValues_Vendor.pm}) { - die $@; - }; - - eval "require RT::TicketCustomFieldValues_Local"; - if ($@ && $@ !~ qr{^Can't locate RT/TicketCustomFieldValues_Local.pm}) { - die $@; - }; - - - - -=head1 SEE ALSO - -This class allows "overlay" methods to be placed -into the following files _Overlay is for a System overlay by the original author, -_Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customizations. - -These overlay files can contain new subs or subs to replace existing subs in this module. - -If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line - - no warnings qw(redefine); - -so that perl does not kick and scream when you redefine a subroutine or variable in your overlay. - -RT::TicketCustomFieldValues_Overlay, RT::TicketCustomFieldValues_Vendor, RT::TicketCustomFieldValues_Local - -=cut - - -1; diff --git a/rt/lib/RT/TicketCustomFieldValues_Overlay.pm b/rt/lib/RT/TicketCustomFieldValues_Overlay.pm deleted file mode 100644 index 8cbaca574..000000000 --- a/rt/lib/RT/TicketCustomFieldValues_Overlay.pm +++ /dev/null @@ -1,108 +0,0 @@ -# {{{ BEGIN BPS TAGGED BLOCK -# -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2004 Best Practical Solutions, LLC -# <jesse@bestpractical.com> -# -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: -# -# 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. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) -# -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. -# -# }}} END BPS TAGGED BLOCK -use strict; -no warnings qw(redefine); - -# {{{ sub LimitToCustomField - -=head2 LimitToCustomField FIELD - -Limits the returned set to values for the custom field with Id FIELD - -=cut - -sub LimitToCustomField { - my $self = shift; - my $cf = shift; - return ($self->Limit( FIELD => 'CustomField', - VALUE => $cf, - OPERATOR => '=')); - -} - -# }}} - -# {{{ sub LimitToTicket - -=head2 LimitToTicket TICKETID - -Limits the returned set to values for the ticket with Id TICKETID - -=cut - -sub LimitToTicket { - my $self = shift; - my $ticket = shift; - return ($self->Limit( FIELD => 'Ticket', - VALUE => $ticket, - OPERATOR => '=')); - -} - -# }}} - - -=sub HasEntry VALUE - -Returns true if this CustomFieldValues collection has an entry with content that eq VALUE - -=cut - - -sub HasEntry { - my $self = shift; - my $value = shift; - - #TODO: this could cache and optimize a fair bit. - foreach my $item (@{$self->ItemsArrayRef}) { - return(1) if ($item->Content eq $value); - } - return undef; - -} - -1; - diff --git a/rt/lib/RT/URI/freeside.pm b/rt/lib/RT/URI/freeside.pm new file mode 100644 index 000000000..ff1d38d21 --- /dev/null +++ b/rt/lib/RT/URI/freeside.pm @@ -0,0 +1,285 @@ +# 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 $IntegrationType $URL); +@ISA = qw/RT::URI::base/; + + +=head1 NAME + +RT::URI::freeside + +=head1 DESCRIPTION + +URI handler for freeside URIs. See http://www.sisd.com/freeside/ for +more information on freeside. + + +=head1 Public subroutines + +=over 4 + +=item FreesideGetConfig CONFKEY + +Subroutine that returns the freeside's configuration value(s) for CONFKEY +as a scalar or list. + +=cut + +sub FreesideGetConfig { return undef; } + + +=item FreesideURL + +Returns the URL for freeside's web interface. + +=cut + +sub FreesideURL { return $URL; } + + +=item FreesideVersion + +Returns a string describing the freeside version being used. + +=cut + +sub FreesideVersion { return undef; } + + +=item smart_search + +A wrapper for the FS::cust_main::smart_search subroutine. + +=cut + +sub smart_search { return undef; } + + +=item small_custview + +A wrapper for the FS::CGI::small_custview subroutine. + +=cut + +sub small_custview { return 'Freeside integration error!</A>'; } + + +=back + +=head1 Private methods + +=over 4 + +=item _FreesideGetRecord + +Method returns a hashref of the freeside record referenced in the URI. +Must be called after ParseURI. + +=cut + +sub _FreesideGetRecord { return undef; } + + +=item _FreesideURIPrefix + +Method that returns the URI prefix for freeside URIs. + +=cut + +sub _FreesideURIPrefix { + + my $self = shift; + return($self->Scheme . '://freeside'); + +} + +=item _FreesideURILabel + +Method that returns a short string describing the customer referenced +in the URI. + +=cut + +sub _FreesideURILabel { + + my $self = shift; + + $RT::Logger->debug("Called _FreesideURILabel()"); + + return unless (exists($self->{'fstable'}) and + exists($self->{'fspkey'})); + + my $label; + my ($table, $pkey) = ($self->{'fstable'}, $self->{'fspkey'}); + + if ($table ne 'cust_main') { + warn "FS::${table} not currently supported"; + return; + } + + my $rec = $self->_FreesideGetRecord(); + + if (ref($rec) eq 'HASH' and $table eq 'cust_main') { + my $name = $rec->{'last'} . ', ' . $rec->{'first'}; + $name = $rec->{'company'} . " ($name)" if $rec->{'company'}; + $label = "$pkey: $name"; + } else { + $label = "$pkey: $table"; + } + + if ($label and !$@) { + return($label); + } else { + return; + } + +} + +=item _FreesideURILabelLong + +Method that returns a longer string describing the customer referenced +in the URI. + +=cut + +sub _FreesideURILabelLong { + + my $self = shift; + + return $self->_FreesideURILabel(); + +} + +=back + +=head1 Public methods + +=over 4 + +=cut + +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 $url = $self->FreesideURL(); + + if ($url ne '') { + $self->{'href'} = "${url}/view/${table}.cgi?${pkey}"; + } else { + $self->{'href'} = $self->{'uri'}; + } + + $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; +} + +=item 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; + } +} + +=item AsStringLong + +Return a longer (HTML) string representing the URI object. + +=cut + +sub AsStringLong { + my $self = shift; + my $prettystring; + if ($prettystring = $self->_FreesideURILabelLong || $self->_FreesideURILabel){ + return $prettystring; + } else { + return $self->URI; + } +} + +$IntegrationType ||= 'Internal'; +eval "require RT::URI::freeside::${RT::URI::freeside::IntegrationType}"; +warn $@ if $@; +if ($@ && + $@ !~ qr(^Can't locate RT/URI/freeside/${RT::URI::freeside::IntegrationType}.pm)) { + die $@; +}; + +=back + +=cut + +1; diff --git a/rt/lib/RT/URI/freeside/Internal.pm b/rt/lib/RT/URI/freeside/Internal.pm new file mode 100644 index 000000000..9ca06306d --- /dev/null +++ b/rt/lib/RT/URI/freeside/Internal.pm @@ -0,0 +1,138 @@ +# 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 +# +use strict; +no warnings qw(redefine); + +#use vars qw($conf); + +use FS; +use FS::UID qw(dbh); +use FS::CGI qw(popurl small_custview); +use FS::Conf; +use FS::Record qw(qsearchs qsearch dbdef); +use FS::cust_main; +use FS::cust_svc; + +=head1 NAME + +RT::URI::freeside::Internal + +=head1 DESCRIPTION + +Overlay for the RT::URI::freeside URI handler implementing the Internal integration type. + +See L<RT::URI::freeside> for public/private interface documentation. + +=cut + + + +sub _FreesideGetRecord { + + my $self = shift; + my ($table, $pkey) = ($self->{'fstable'}, $self->{'fspkey'}); + + $RT::Logger->debug("Called _FreesideGetRecord()"); + + #eval "use FS::$table;"; + + my $dbdef = dbdef; + unless ($dbdef) { + $RT::Logger->error("Using Internal freeside integration type, ". + "but it doesn't look like we're running under ". + "freeside's Mason handler."); + return; + } + + my $pkeyfield = $dbdef->table($table)->primary_key; + unless ($pkeyfield) { + $RT::Logger->error("No primary key for freeside table '$table'"); + return; + } + + my $fsrec = qsearchs($table, { $pkeyfield => $pkey }); + unless ($fsrec) { + $RT::Logger->error("Record with '$pkeyfield' == '$pkey' does " . + "not exist in table $table"); + return; + } + + return { $fsrec->hash, '_object' => $fsrec }; + +} + +sub FreesideVersion { + + return $FS::VERSION; + +} + +sub FreesideGetConfig { + + #$conf = new FS::Conf unless ref($conf); + my $conf = new FS::Conf; + + return scalar($conf->config(@_)); + +} + +sub smart_search { #Subroutine + + return map { { $_->hash } } &FS::cust_main::smart_search(@_); + +} + +sub small_custview { + + return &FS::CGI::small_custview(@_); + +} + +sub _FreesideURILabelLong { + + my $self = shift; + + my $table = $self->{'fstable'}; + + if ( $table eq 'cust_main' ) { + + my $rec = $self->_FreesideGetRecord(); + return small_custview( $rec->{'_object'}, + scalar(FS::Conf->new->config('countrydefault')), + 1 #nobalance + ); + + } else { + + return $self->_FreesideURILabel(); + + } + +} + +1; diff --git a/rt/lib/RT/URI/freeside/XMLRPC.pm b/rt/lib/RT/URI/freeside/XMLRPC.pm new file mode 100644 index 000000000..a8a731fcd --- /dev/null +++ b/rt/lib/RT/URI/freeside/XMLRPC.pm @@ -0,0 +1,122 @@ +# 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 + +use strict; +no warnings qw(redefine); + +use vars qw($XMLRPC_URL $_FS_VERSION); + +use Frontier::Client; + +=head1 NAME + +RT::URI::freeside::XMLRPC + +=head1 DESCRIPTION + +Overlay for the RT::URI::freeside URI handler implementing the XMLRPC integration type. + +See L<RT::URI::freeside> for public/private interface documentation. + +=cut + + +sub _XMLRPCRequest { #Subroutine + + my $method = shift; + my @args = @_; + + my $result; + eval { + my $server = new Frontier::Client ( url => $XMLRPC_URL ); + $result = $server->call($method, @args); + }; + + if (not $@ and ref($result) eq 'ARRAY') { + return (scalar(@$result) == 1) ? @$result[0] : @$result; + } else { + $RT::Logger->debug("Freeside XMLRPC: " . $result || $@); + return (); + } + +} + +sub _FreesideGetRecord { + + my $self = shift; + my ($table, $pkey) = ($self->{'fstable'}, $self->{'fspkey'}); + my $record; + + $RT::Logger->debug("Called XMLRPC::_FreesideGetRecord()"); + + #FIXME: Need a better way to get primary keys. + # Maybe create a method for it and cache them like version? + my %table_pkeys = ( + cust_main => 'custnum', + ); + + my $method = 'Record.qsearchs'; + my @args = ($table, { $table_pkeys{$table} => $pkey }); + my ($record) = &_XMLRPCRequest($method, @args); + + return $record; + +} + + +sub FreesideGetConfig { + + return _XMLRPCRequest('Conf.config', @_); + +} + + +sub FreesideVersion { + + return $_FS_VERSION if ($_FS_VERSION =~ /^\d+\.\d+\.\d+/); + + $RT::Logger->debug("Requesting freeside version..."); + ($_FS_VERSION) = &_XMLRPCRequest('version'); + $RT::Logger->debug("Cached freeside version: ${_FS_VERSION}"); + + return $_FS_VERSION; + +} + +sub smart_search { #Subroutine + + return _XMLRPCRequest('cust_main.smart_search', @_); + +} + +sub small_custview { + + return _XMLRPCRequest('CGI.small_custview', @_); + +} + +1; diff --git a/rt/lib/t/00smoke.t.in b/rt/lib/t/00smoke.t.in deleted file mode 100644 index 288dd4aae..000000000 --- a/rt/lib/t/00smoke.t.in +++ /dev/null @@ -1,14 +0,0 @@ -#!@PERL@ - -use Test::More qw(no_plan); - -use lib "@RT_LIB_PATH@"; -use RT; -ok(RT::LoadConfig); -ok(RT::Init, "Basic initialization and DB connectivity"); - -use File::Find; -File::Find::find({wanted => \&wanted}, 'lib/'); -sub wanted { /^*\.pm\z/s && ok(require $_, "Requiring '$_'"); } - - diff --git a/rt/lib/t/01harness.t.in b/rt/lib/t/01harness.t.in deleted file mode 100644 index d132330c2..000000000 --- a/rt/lib/t/01harness.t.in +++ /dev/null @@ -1,12 +0,0 @@ -#!@PERL@ - -use Test::More qw(no_plan); - -use lib "@RT_LIB_PATH@"; -use RT; -ok(RT::LoadConfig); -ok(RT::Init, "Basic initialization and DB connectivity"); - -my $test = shift @ARGV; -require $test; - diff --git a/rt/lib/t/02regression.t.in b/rt/lib/t/02regression.t.in deleted file mode 100644 index c2e3277a9..000000000 --- a/rt/lib/t/02regression.t.in +++ /dev/null @@ -1,47 +0,0 @@ -#!@PERL@ - -use Test::More qw(no_plan); - -use lib "@RT_LIB_PATH@"; -use RT; -ok(RT::LoadConfig); -ok(RT::Init, "Basic initialization and DB connectivity"); - -# Create a new queue -use_ok(RT::Queue); -my $q = RT::Queue->new($RT::SystemUser); - -$q->Load('regression'); -if ($q->id != 0) { - die "Regression tests not starting with a clean DB. Bailing"; -} - -my ($id, $msg) = $q->Create( Name => 'Regression', - Description => 'A regression test queue', - CorrespondAddress => 'correspond@a', - CommentAddress => 'comment@a'); - -isnt($id, 0, "Queue was created sucessfully - $msg"); - -my $q2 = RT::Queue->new($RT::SystemUser); - -ok($q2->Load($id)); -is($q2->id, $id, "Sucessfully loaded the queue again"); -is($q2->Name, 'Regression'); -is($q2->Description, 'A regression test queue'); -is($q2->CorrespondAddress, 'correspond@a'); -is($q2->CommentAddress, 'comment@a'); - - -use File::Find; -File::Find::find({wanted => \&wanted_autogen, - preprocess => sub {return sort @_}}, 'lib/t/autogen'); -sub wanted_autogen { /^autogen.*\.t\z/s && require $_; } - -File::Find::find({wanted => \&wanted_regression, - preprocess => sub {return sort @_}}, 'lib/t/regression'); -sub wanted_regression { /^*\.t\z/s && require $_; } - -require "@RT_LIB_PATH@/t/03web.pl"; -require "@RT_LIB_PATH@/t/04_send_email.pl"; -require "@RT_LIB_PATH@/t/05cronsupport.pl"; diff --git a/rt/lib/t/03web.pl.in b/rt/lib/t/03web.pl.in deleted file mode 100644 index 25c26e711..000000000 --- a/rt/lib/t/03web.pl.in +++ /dev/null @@ -1,170 +0,0 @@ -#!@PERL@ - -use strict; -use WWW::Mechanize; -use HTTP::Request::Common; -use HTTP::Cookies; -use LWP; -use Encode; - -my $cookie_jar = HTTP::Cookies->new; -my $agent = WWW::Mechanize->new(); - -# give the agent a place to stash the cookies - -$agent->cookie_jar($cookie_jar); - - -# get the top page -my $url = "http://localhost".$RT::WebPath."/"; -$agent->get($url); - -is ($agent->{'status'}, 200, "Loaded a page"); - - -# {{{ test a login - -# follow the link marked "Login" - -ok($agent->{form}->find_input('user')); - -ok($agent->{form}->find_input('pass')); -ok ($agent->{'content'} =~ /username:/i); -$agent->field( 'user' => 'root' ); -$agent->field( 'pass' => 'password' ); -# the field isn't named, so we have to click link 0 -$agent->click(0); -is($agent->{'status'}, 200, "Fetched the page ok"); -ok( $agent->{'content'} =~ /Logout/i, "Found a logout link"); - - - -$agent->get($url."Ticket/Create.html?Queue=1"); -is ($agent->{'status'}, 200, "Loaded Create.html"); -$agent->form(3); -# Start with a string containing characters in latin1 -my $string = "I18N Web Testing æøå"; -Encode::from_to($string, 'iso-8859-1', 'utf8'); -$agent->field('Subject' => "Foo"); -$agent->field('Content' => $string); -ok($agent->submit(), "Created new ticket with $string"); - -ok( $agent->{'content'} =~ qr{$string} , "Found the content"); - -$agent->get($url."Ticket/Create.html?Queue=1"); -is ($agent->{'status'}, 200, "Loaded Create.html"); -$agent->form(3); -# Start with a string containing characters in latin1 -my $string = "I18N Web Testing æøå"; -Encode::from_to($string, 'iso-8859-1', 'utf8'); -$agent->field('Subject' => $string); -$agent->field('Content' => "BAR"); -ok($agent->submit(), "Created new ticket with $string"); - -ok( $agent->{'content'} =~ qr{$string} , "Found the content"); - - - -# }}} - -# {{{ Query Builder tests - -my $response = $agent->get($url."Search/Build.html"); -ok( $response->is_success, "Fetched " . $url."Search/Build.html" ); - -# Parsing TicketSQL -# -# Adding items - -# set the first value -ok($agent->form_name('BuildQuery')); -$agent->field("AttachmentField", "Subject"); -$agent->field("AttachmentOp", "LIKE"); -$agent->field("ValueOfAttachment", "aaa"); -$agent->submit(); - -# set the next value -ok($agent->form_name('BuildQuery')); -$agent->field("AttachmentField", "Subject"); -$agent->field("AttachmentOp", "LIKE"); -$agent->field("ValueOfAttachment", "bbb"); -$agent->submit(); - -ok($agent->form_name('BuildQuery')); - -# get the query -my $query = $agent->current_form->find_input("Query")->value; -# strip whitespace from ends -$query =~ s/^\s*//g; -$query =~ s/\s*$//g; - -# collapse other whitespace -$query =~ s/\s+/ /g; - -is ($query, "Subject LIKE 'aaa' AND Subject LIKE 'bbb'"); - -# - new items go one level down -# - add items at currently selected level -# - if nothing is selected, add at end, one level down -# -# move left -# - error if nothing selected -# - same item should be selected after move -# - can't move left if you're at the top level -# -# move right -# - error if nothing selected -# - same item should be selected after move -# - can always move right (no max depth...should there be?) -# -# move up -# - error if nothing selected -# - same item should be selected after move -# - can't move up if you're first in the list -# -# move down -# - error if nothing selected -# - same item should be selected after move -# - can't move down if you're last in the list -# -# toggle -# - error if nothing selected -# - change all aggregators in the grouping -# - don't change any others -# -# delete -# - error if nothing selected -# - delete currently selected item -# - delete all children of a grouping -# - if delete leaves a node with no children, delete that, too -# - what should be selected? -# -# Clear -# - clears entire query -# - clears it from the session, too - -# }}} - -use File::Find; -find ( \&wanted , 'html/'); - -sub wanted { - -f && /\.html$/ && $_ !~ /Logout.html$/ && test_get($File::Find::name); -} - -sub test_get { - my $file = shift; - - - $file =~ s#^html/##; - ok ($agent->get("$url/$file", "GET $url/$file")); - is ($agent->{'status'}, 200, "Loaded $file"); -# ok( $agent->{'content'} =~ /Logout/i, "Found a logout link on $file "); - ok( $agent->{'content'} !~ /Not logged in/i, "Still logged in for $file"); - ok( $agent->{'content'} !~ /System error/i, "Didn't get a Mason compilation error on $file"); - -} - -# }}} - -1; diff --git a/rt/lib/t/04_send_email.pl.in b/rt/lib/t/04_send_email.pl.in deleted file mode 100644 index 39ab0d271..000000000 --- a/rt/lib/t/04_send_email.pl.in +++ /dev/null @@ -1,506 +0,0 @@ -#!@PERL@ -w - -use strict; -use RT::EmailParser; -use RT::Tickets; -use RT::Action::SendEmail; - -my @_outgoing_messages; -my @scrips_fired; - -#We're not testing acls here. -my $everyone = RT::Group->new($RT::SystemUser); -$everyone->LoadSystemInternalGroup('Everyone'); -$everyone->PrincipalObj->GrantRight(Right =>'SuperUser'); - - -is (__PACKAGE__, 'main', "We're operating in the main package"); - - -{ -no warnings qw/redefine/; -sub RT::Action::SendEmail::SendMessage { - my $self = shift; - my $MIME = shift; - - main::_fired_scrip($self->ScripObj); - main::ok(ref($MIME) eq 'MIME::Entity', "hey, look. it's a mime entity"); -} - -} - -# instrument SendEmail to pass us what it's about to send. -# create a regular ticket - -my $parser = RT::EmailParser->new(); - - -# Let's test to make sure a multipart/report is processed correctly -my $content = `cat @RT_LIB_PATH@/t/data/multipart-report` || die "couldn't find new content"; -# be as much like the mail gateway as possible. -use RT::Interface::Email; - -my %args = (message => $content, queue => 1, action => 'correspond'); - RT::Interface::Email::Gateway(\%args); -my $tickets = RT::Tickets->new($RT::SystemUser); -$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); -$tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); -my $tick = $tickets->First(); -ok ($tick->Id, "found ticket ".$tick->Id); - -ok ($tick->Transactions->First->Content =~ /The original message was received/, "It's the bounce"); - - -# make sure it fires scrips. -is ($#scrips_fired, 1, "Fired 2 scrips on ticket creation"); - -undef @scrips_fired; - - - - -$parser->ParseMIMEEntityFromScalar('From: root@localhost -To: rt@example.com -Subject: This is a test of new ticket creation as an unknown user - -Blah! -Foob!'); - - -use Data::Dumper; - -my $ticket = RT::Ticket->new($RT::SystemUser); -my ($id, $tid, $msg ) = $ticket->Create(Requestor => ['root@localhost'], Queue => 'general', Subject => 'I18NTest', MIMEObj => $parser->Entity); -ok ($id,$msg); -my $tickets = RT::Tickets->new($RT::SystemUser); -$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); -$tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); -my $tick = $tickets->First(); -ok ($tick->Id, "found ticket ".$tick->Id); -ok ($tick->Subject eq 'I18NTest', "failed to create the new ticket from an unprivileged account"); - -# make sure it fires scrips. -is ($#scrips_fired, 1, "Fired 2 scrips on ticket creation"); -# make sure it sends an autoreply -# make sure it sends a notification to adminccs - - -# we need to swap out SendMessage to test the new things we care about; -&utf8_redef_sendmessage; - -# create an iso 8859-1 ticket -@scrips_fired = (); - -my $content = `cat @RT_LIB_PATH@/t/data/new-ticket-from-iso-8859-1` || die "couldn't find new content"; - - - -$parser->ParseMIMEEntityFromScalar($content); - - -# be as much like the mail gateway as possible. -use RT::Interface::Email; - -my %args = (message => $content, queue => 1, action => 'correspond'); - RT::Interface::Email::Gateway(\%args); -my $tickets = RT::Tickets->new($RT::SystemUser); -$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); -$tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); -my $tick = $tickets->First(); -ok ($tick->Id, "found ticket ".$tick->Id); - -ok ($tick->Transactions->First->Content =~ /H\x{e5}vard/, "It's signed by havard. yay"); - - -# make sure it fires scrips. -is ($#scrips_fired, 1, "Fired 2 scrips on ticket creation"); -# make sure it sends an autoreply - - -# make sure it sends a notification to adminccs - -# If we correspond, does it do the right thing to the outbound messages? - -$parser->ParseMIMEEntityFromScalar($content); -my ($id, $msg) = $tick->Comment(MIMEObj => $parser->Entity); -ok ($id, $msg); - -$parser->ParseMIMEEntityFromScalar($content); -($id, $msg) = $tick->Correspond(MIMEObj => $parser->Entity); -ok ($id, $msg); - - - - - -# we need to swap out SendMessage to test the new things we care about; -&iso8859_redef_sendmessage; -$RT::EmailOutputEncoding = 'iso-8859-1'; -# create an iso 8859-1 ticket -@scrips_fired = (); - -my $content = `cat @RT_LIB_PATH@/t/data/new-ticket-from-iso-8859-1` || die "couldn't find new content"; -# be as much like the mail gateway as possible. -use RT::Interface::Email; - -my %args = (message => $content, queue => 1, action => 'correspond'); - RT::Interface::Email::Gateway(\%args); -my $tickets = RT::Tickets->new($RT::SystemUser); -$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); -$tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); -my $tick = $tickets->First(); -ok ($tick->Id, "found ticket ".$tick->Id); - -ok ($tick->Transactions->First->Content =~ /H\x{e5}vard/, "It's signed by havard. yay"); - - -# make sure it fires scrips. -is ($#scrips_fired, 1, "Fired 2 scrips on ticket creation"); -# make sure it sends an autoreply - - -# make sure it sends a notification to adminccs - - -# If we correspond, does it do the right thing to the outbound messages? - -$parser->ParseMIMEEntityFromScalar($content); -my ($id, $msg) = $tick->Comment(MIMEObj => $parser->Entity); -ok ($id, $msg); - -$parser->ParseMIMEEntityFromScalar($content); -($id, $msg) = $tick->Correspond(MIMEObj => $parser->Entity); -ok ($id, $msg); - - -sub _fired_scrip { - my $scrip = shift; - push @scrips_fired, $scrip; -} - -sub utf8_redef_sendmessage { - no warnings qw/redefine/; - eval ' - sub RT::Action::SendEmail::SendMessage { - my $self = shift; - my $MIME = shift; - - my $scrip = $self->ScripObj->id; - ok(1, $self->ScripObj->ConditionObj->Name . " ".$self->ScripObj->ActionObj->Name); - main::_fired_scrip($self->ScripObj); - $MIME->make_singlepart; - main::ok( ref($MIME) eq \'MIME::Entity\', - "hey, look. it\'s a mime entity" ); - main::ok( ref( $MIME->head ) eq \'MIME::Head\', - "its mime header is a mime header. yay" ); - main::ok( $MIME->head->get(\'Content-Type\') =~ /utf-8/, - "Its content type is utf-8" ); - my $message_as_string = $MIME->bodyhandle->as_string(); - use Encode; - $message_as_string = Encode::decode_utf8($message_as_string); - main::ok( - $message_as_string =~ /H\x{e5}vard/, -"The message\'s content contains havard\'s name. this will fail if it\'s not utf8 out"); - - }'; -} - -sub iso8859_redef_sendmessage { - no warnings qw/redefine/; - eval ' - sub RT::Action::SendEmail::SendMessage { - my $self = shift; - my $MIME = shift; - - my $scrip = $self->ScripObj->id; - ok(1, $self->ScripObj->ConditionObj->Name . " ".$self->ScripObj->ActionObj->Name); - main::_fired_scrip($self->ScripObj); - $MIME->make_singlepart; - main::ok( ref($MIME) eq \'MIME::Entity\', - "hey, look. it\'s a mime entity" ); - main::ok( ref( $MIME->head ) eq \'MIME::Head\', - "its mime header is a mime header. yay" ); - main::ok( $MIME->head->get(\'Content-Type\') =~ /iso-8859-1/, - "Its content type is iso-8859-1 - " . $MIME->head->get("Content-Type") ); - my $message_as_string = $MIME->bodyhandle->as_string(); - use Encode; - $message_as_string = Encode::decode("iso-8859-1",$message_as_string); - main::ok( - $message_as_string =~ /H\x{e5}vard/, "The message\'s content contains havard\'s name. this will fail if it\'s not utf8 out"); - - }'; -} - -# {{{ test a multipart alternative containing a text-html part with an umlaut - -my $content = `cat @RT_LIB_PATH@/t/data/multipart-alternative-with-umlaut` || die "couldn't find new content"; - -$parser->ParseMIMEEntityFromScalar($content); - - -# be as much like the mail gateway as possible. -¨auts_redef_sendmessage; - -my %args = (message => $content, queue => 1, action => 'correspond'); - RT::Interface::Email::Gateway(\%args); -my $tickets = RT::Tickets->new($RT::SystemUser); -$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); -$tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); -my $tick = $tickets->First(); -ok ($tick->Id, "found ticket ".$tick->Id); - -ok ($tick->Transactions->First->Content =~ /causes Error/, "We recorded the content right as text-plain"); -is ($tick->Transactions->First->Attachments->Count , 3 , "Has three attachments, presumably a text-plain, a text-html and a multipart alternative"); - -sub umlauts_redef_sendmessage { - no warnings qw/redefine/; - eval 'sub RT::Action::SendEmail::SendMessage { }'; -} - -# }}} - -# {{{ test a text-html message with an umlaut - -my $content = `cat @RT_LIB_PATH@/t/data/text-html-with-umlaut` || die "couldn't find new content"; - -$parser->ParseMIMEEntityFromScalar($content); - - -# be as much like the mail gateway as possible. -&text_html_umlauts_redef_sendmessage; - -my %args = (message => $content, queue => 1, action => 'correspond'); - RT::Interface::Email::Gateway(\%args); -my $tickets = RT::Tickets->new($RT::SystemUser); -$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); -$tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); -my $tick = $tickets->First(); -ok ($tick->Id, "found ticket ".$tick->Id); - -ok ($tick->Transactions->First->Attachments->First->Content =~ /causes Error/, "We recorded the content as containing 'causes error'"); -ok ($tick->Transactions->First->Attachments->First->ContentType =~ /text\/html/, "We recorded the content as text/html"); -ok ($tick->Transactions->First->Attachments->Count ==1 , "Has one attachment, presumably a text-html and a multipart alternative"); - -sub text_html_umlauts_redef_sendmessage { - no warnings qw/redefine/; - eval 'sub RT::Action::SendEmail::SendMessage { - my $self = shift; - my $MIME = shift; - use Data::Dumper; - return (1) unless ($self->ScripObj->ScripActionObj->Name eq "Notify AdminCcs" ); - ok (is $MIME->parts, 2, "generated correspondence mime entityis composed of three parts"); - is ($MIME->head->mime_type , "multipart/mixed", "The first part is a multipart mixed". $MIME->head->mime_type); - is ($MIME->parts(0)->head->mime_type , "text/plain", "The second part is a plain"); - is ($MIME->parts(1)->head->mime_type , "text/html", "The third part is an html "); - }'; -} - -# }}} - -# {{{ test a text-html message with russian characters - -my $content = `cat @RT_LIB_PATH@/t/data/text-html-in-russian` || die "couldn't find new content"; - -$parser->ParseMIMEEntityFromScalar($content); - - -# be as much like the mail gateway as possible. -&text_html_russian_redef_sendmessage; - -my %args = (message => $content, queue => 1, action => 'correspond'); - RT::Interface::Email::Gateway(\%args); -my $tickets = RT::Tickets->new($RT::SystemUser); -$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); -$tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); -my $tick = $tickets->First(); -ok ($tick->Id, "found ticket ".$tick->Id); - -ok ($tick->Transactions->First->Attachments->First->ContentType =~ /text\/html/, "We recorded the content right as text-html"); -ok ($tick->Transactions->First->Attachments->Count ==1 , "Has one attachment, presumably a text-html and a multipart alternative"); - -sub text_html_russian_redef_sendmessage { - no warnings qw/redefine/; - eval 'sub RT::Action::SendEmail::SendMessage { - my $self = shift; - my $MIME = shift; - use Data::Dumper; - return (1) unless ($self->ScripObj->ScripActionObj->Name eq "Notify AdminCcs" ); - ok (is $MIME->parts, 2, "generated correspondence mime entityis composed of three parts"); - is ($MIME->head->mime_type , "multipart/mixed", "The first part is a multipart mixed". $MIME->head->mime_type); - is ($MIME->parts(0)->head->mime_type , "text/plain", "The second part is a plain"); - is ($MIME->parts(1)->head->mime_type , "text/html", "The third part is an html "); - my $content_1251; - $content_1251 = $MIME->parts(1)->bodyhandle->as_string(); - ok ($content_1251 =~ qr{Ó÷eáíûé Öeíòp "ÊÀÄÐÛ ÄÅËÎÂÎÃÎ ÌÈÐÀ" ïpèãëaøaeò ía òpeíèíã:}, -"Content matches drugim in codepage 1251" ); - }'; -} - -# }}} - -# {{{ test a message containing a russian subject and NO content type - -unshift (@RT::EmailInputEncodings, 'koi8-r'); -$RT::EmailOutputEncoding = 'koi8-r'; -my $content = `cat @RT_LIB_PATH@/t/data/russian-subject-no-content-type` || die "couldn't find new content"; - -$parser->ParseMIMEEntityFromScalar($content); - - -# be as much like the mail gateway as possible. -&text_plain_russian_redef_sendmessage; -my %args = (message => $content, queue => 1, action => 'correspond'); - RT::Interface::Email::Gateway(\%args); -my $tickets = RT::Tickets->new($RT::SystemUser); -$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); -$tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); -my $tick = $tickets->First(); -ok ($tick->Id, "found ticket ".$tick->Id); - -ok ($tick->Transactions->First->Attachments->First->ContentType =~ /text\/plain/, "We recorded the content type right"); -ok ($tick->Transactions->First->Attachments->Count ==1 , "Has one attachment, presumably a text-plain"); -is ($tick->Subject, "\x{442}\x{435}\x{441}\x{442} \x{442}\x{435}\x{441}\x{442}", "Recorded the subject right"); -sub text_plain_russian_redef_sendmessage { - no warnings qw/redefine/; - eval 'sub RT::Action::SendEmail::SendMessage { - my $self = shift; - my $MIME = shift; - return (1) unless ($self->ScripObj->ScripActionObj->Name eq "Notify AdminCcs" ); - is ($MIME->head->mime_type , "text/plain", "The only part is text/plain "); - my $subject = $MIME->head->get("subject"); - chomp($subject); - #is( $subject , /^=\?KOI8-R\?B\?W2V4YW1wbGUuY39tICM3XSDUxdPUINTF09Q=\?=/ , "The $subject is encoded correctly"); - }; - '; -} - -shift @RT::EmailInputEncodings; -$RT::EmailOutputEncoding = 'utf-8'; -# }}} - - -# {{{ test a message containing a nested RFC 822 message - -my $content = `cat @RT_LIB_PATH@/t/data/nested-rfc-822` || die "couldn't find new content"; -ok ($content, "Loaded nested-rfc-822 to test"); - -$parser->ParseMIMEEntityFromScalar($content); - - -# be as much like the mail gateway as possible. -&text_plain_nested_redef_sendmessage; -my %args = (message => $content, queue => 1, action => 'correspond'); - RT::Interface::Email::Gateway(\%args); -my $tickets = RT::Tickets->new($RT::SystemUser); -$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); -$tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); -my $tick = $tickets->First(); -ok ($tick->Id, "found ticket ".$tick->Id); -is ($tick->Subject, "[Jonas Liljegren] Re: [Para] Niv\x{e5}er?"); -ok ($tick->Transactions->First->Attachments->First->ContentType =~ /multipart\/mixed/, "We recorded the content type right"); -is ($tick->Transactions->First->Attachments->Count , 5 , "Has one attachment, presumably a text-plain and a message RFC 822 and another plain"); -sub text_plain_nested_redef_sendmessage { - no warnings qw/redefine/; - eval 'sub RT::Action::SendEmail::SendMessage { - my $self = shift; - my $MIME = shift; - return (1) unless ($self->ScripObj->ScripActionObj->Name eq "Notify AdminCcs" ); - is ($MIME->head->mime_type , "multipart/mixed", "It is a mixed multipart"); - my $subject = $MIME->head->get("subject"); - $subject = MIME::Base64::decode_base64( $subject); - chomp($subject); - # TODO, why does this test fail - #ok($subject =~ qr{Niv\x{e5}er}, "The subject matches the word - $subject"); - 1; - }'; -} - -# }}} - - -# {{{ test a multipart alternative containing a uuencoded mesage generated by lotus notes - -my $content = `cat @RT_LIB_PATH@/t/data/notes-uuencoded` || die "couldn't find new content"; - -$parser->ParseMIMEEntityFromScalar($content); - - -# be as much like the mail gateway as possible. -¬es_redef_sendmessage; - -my %args = (message => $content, queue => 1, action => 'correspond'); - RT::Interface::Email::Gateway(\%args); -my $tickets = RT::Tickets->new($RT::SystemUser); -$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); -$tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); -my $tick = $tickets->First(); -ok ($tick->Id, "found ticket ".$tick->Id); - -ok ($tick->Transactions->First->Content =~ /from Lotus Notes/, "We recorded the content right"); -is ($tick->Transactions->First->Attachments->Count , 3 , "Has three attachments"); - -sub notes_redef_sendmessage { - no warnings qw/redefine/; - eval 'sub RT::Action::SendEmail::SendMessage { }'; -} - -# }}} - -# {{{ test a multipart that crashes the file-based mime-parser works - -my $content = `cat @RT_LIB_PATH@/t/data/crashes-file-based-parser` || die "couldn't find new content"; - -$parser->ParseMIMEEntityFromScalar($content); - - -# be as much like the mail gateway as possible. -&crashes_redef_sendmessage; - -my %args = (message => $content, queue => 1, action => 'correspond'); - RT::Interface::Email::Gateway(\%args); -my $tickets = RT::Tickets->new($RT::SystemUser); -$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); -$tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); -my $tick = $tickets->First(); -ok ($tick->Id, "found ticket ".$tick->Id); - -ok ($tick->Transactions->First->Content =~ /FYI/, "We recorded the content right"); -is ($tick->Transactions->First->Attachments->Count , 5 , "Has three attachments"); - -sub crashes_redef_sendmessage { - no warnings qw/redefine/; - eval 'sub RT::Action::SendEmail::SendMessage { }'; -} - - - -# }}} - -# {{{ test a multi-line RT-Send-CC header - -my $content = `cat @RT_LIB_PATH@/t/data/rt-send-cc` || die "couldn't find new content"; - -$parser->ParseMIMEEntityFromScalar($content); - - - -my %args = (message => $content, queue => 1, action => 'correspond'); - RT::Interface::Email::Gateway(\%args); -my $tickets = RT::Tickets->new($RT::SystemUser); -$tickets->OrderBy(FIELD => 'id', ORDER => 'DESC'); -$tickets->Limit(FIELD => 'id' ,OPERATOR => '>', VALUE => '0'); -my $tick = $tickets->First(); -ok ($tick->Id, "found ticket ".$tick->Id); - -my $cc = $tick->Transactions->First->Attachments->First->GetHeader('RT-Send-Cc'); -ok ($cc =~ /test1/, "Found test 1"); -ok ($cc =~ /test2/, "Found test 2"); -ok ($cc =~ /test3/, "Found test 3"); -ok ($cc =~ /test4/, "Found test 4"); -ok ($cc =~ /test5/, "Found test 5"); - -# }}} - -# Don't taint the environment -$everyone->PrincipalObj->RevokeRight(Right =>'SuperUser'); -1; diff --git a/rt/lib/t/05cronsupport.pl.in b/rt/lib/t/05cronsupport.pl.in deleted file mode 100644 index a6b3d7451..000000000 --- a/rt/lib/t/05cronsupport.pl.in +++ /dev/null @@ -1,84 +0,0 @@ -#!@PERL@ -w - -use strict; - -### Set up some testing data. Test the testing data because why not? - -# Create a user with rights, a queue, and some tickets. -my $user_obj = RT::User->new($RT::SystemUser); -my ($ret, $msg) = $user_obj->LoadOrCreateByEmail('tara@example.com'); -ok($ret, 'record test user creation'); -$user_obj->SetName('tara'); -$user_obj->PrincipalObj->GrantRight(Right => 'SuperUser'); -my $CurrentUser = RT::CurrentUser->new('tara'); - -# Create our template, which will be used for tests of RT::Action::Record*. - -my $template_content = 'RT-Send-Cc: tla@example.com -RT-Send-Bcc: jesse@example.com - -This is a content string with no content.'; - -my $template_obj = RT::Template->new($CurrentUser); -$template_obj->Create(Queue => '0', - Name => 'recordtest', - Description => 'testing Record actions', - Content => $template_content, - ); - -# Create a queue and some tickets. - -my $queue_obj = RT::Queue->new($CurrentUser); -($ret, $msg) = $queue_obj->Create(Name => 'recordtest', Description => 'queue for Action::Record testing'); -ok($ret, 'record test queue creation'); - -my $ticket1 = RT::Ticket->new($CurrentUser); -my ($id, $tobj, $msg2) = $ticket1->Create(Queue => $queue_obj, - Requestor => ['tara@example.com'], - Subject => 'bork bork bork', - Priority => 22, - ); -ok($id, 'record test ticket creation 1'); -my $ticket2 = RT::Ticket->new($CurrentUser); -($id, $tobj, $msg2) = $ticket2->Create(Queue => $queue_obj, - Requestor => ['root@localhost'], - Subject => 'hurdy gurdy' - ); -ok($id, 'record test ticket creation 2'); - - -### OK. Have data, will travel. - -# First test the search. - -ok(require RT::Search::FromSQL, "Search::FromSQL loaded"); -my $ticketsqlstr = "Requestor.EmailAddress = '" . $CurrentUser->EmailAddress . - "' AND Priority > '20'"; -my $search = RT::Search::FromSQL->new(Argument => $ticketsqlstr, TicketsObj => RT::Tickets->new($CurrentUser), - ); -is(ref($search), 'RT::Search::FromSQL', "search created"); -ok($search->Prepare(), "fromsql search run"); -my $counter = 0; -while(my $t = $search->TicketsObj->Next() ) { - is($t->Id(), $ticket1->Id(), "fromsql search results 1"); - $counter++; -} -is ($counter, 1, "fromsql search results 2"); - -# Right. Now test the actions. - -ok(require RT::Action::RecordComment); -ok(require RT::Action::RecordCorrespondence); - -my ($comment_act, $correspond_act); -ok($comment_act = RT::Action::RecordComment->new(TicketObj => $ticket1, TemplateObj => $template_obj, CurrentUser => $CurrentUser), "RecordComment created"); -ok($correspond_act = RT::Action::RecordCorrespondence->new(TicketObj => $ticket2, TemplateObj => $template_obj, CurrentUser => $CurrentUser), "RecordCorrespondence created"); -ok($comment_act->Prepare(), "Comment prepared"); -ok($correspond_act->Prepare(), "Correspond prepared"); -ok($comment_act->Commit(), "Comment committed"); -ok($correspond_act->Commit(), "Correspondence committed"); - -# Now test for loop suppression. -my ($trans, $desc, $transaction) = $ticket2->Comment(MIMEObj => $template_obj->MIMEObj); -my $bogus_action = RT::Action::RecordComment->new(TicketObj => $ticket1, TemplateObj => $template_obj, TransactionObj => $transaction, CurrentUser => $CurrentUser); -ok(!$bogus_action->Prepare(), "Comment aborted to prevent loop"); diff --git a/rt/lib/t/regression/00placeholder b/rt/lib/t/regression/00placeholder deleted file mode 100644 index 0afc6045c..000000000 --- a/rt/lib/t/regression/00placeholder +++ /dev/null @@ -1 +0,0 @@ -1; diff --git a/rt/sbin/rt-setup-database b/rt/sbin/rt-setup-database deleted file mode 100644 index 58f882f6e..000000000 --- a/rt/sbin/rt-setup-database +++ /dev/null @@ -1,619 +0,0 @@ -#!/usr/bin/perl -w -# 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 - -use strict; -use vars qw($PROMPT $VERSION $Handle $Nobody $SystemUser $item); -use vars - qw(@Groups @Users @ACL @Queues @ScripActions @ScripConditions @Templates @CustomFields @Scrips); - -use lib "/opt/rt3/lib"; - -#This drags in RT's config.pm -# We do it in a begin block because RT::Handle needs to know the type to do its -# inheritance -use RT; -use Carp; -use RT::User; -use RT::CurrentUser; -use RT::Template; -use RT::ScripAction; -use RT::ACE; -use RT::Group; -use RT::User; -use RT::Queue; -use RT::ScripCondition; -use RT::CustomField; -use RT::Scrip; - -RT::LoadConfig(); -use Term::ReadKey; -use Getopt::Long; - -my %args; - -GetOptions( - \%args, - 'prompt-for-dba-password', 'force', 'debug', - 'action=s', 'dba=s', 'dba-password=s', 'datafile=s', - 'datadir=s' -); - -$| = 1; #unbuffer that output. - -require RT::Handle; -my $Handle = RT::Handle->new($RT::DatabaseType); -$Handle->BuildDSN; -my $dbh; - -if ( $args{'prompt-for-dba-password'} ) { - $args{'dba-password'} = get_dba_password(); - chomp( $args{'dba-password'} ); -} - -unless ( $args{'action'} ) { - help(); - die; -} -if ( $args{'action'} eq 'init' ) { - $dbh = DBI->connect( get_system_dsn(), $args{'dba'}, $args{'dba-password'} ) - || die "Failed to connect to " . get_system_dsn() . " as $args{'dba'}: $DBI::errstr"; - print "Now creating a database for RT.\n"; - if ($RT::DatabaseType ne 'Oracle' || - $args{'dba'} ne $RT::DatabaseUser) { - create_db(); - } else { - print "...skipped as ".$args{'dba'} ." is not " . $RT::DatabaseUser . " or we're working with Oracle.\n"; - } - - $dbh->disconnect; - $dbh = DBI->connect( $Handle->DSN, $args{'dba'}, $args{'dba-password'} ) - || die $DBI::errstr; - - print "Now populating database schema.\n"; - insert_schema(); - print "Now inserting database ACLs\n"; - insert_acl() unless ($RT::DatabaseType eq 'Oracle'); - print "Now inserting RT core system objects\n"; - insert_initial_data(); - print "Now inserting RT data\n"; - insert_data( $RT::EtcPath . "/initialdata" ); -} -elsif ( $args{'action'} eq 'drop' ) { - unless ( $dbh = - DBI->connect( get_system_dsn(), $args{'dba'}, $args{'dba-password'} ) ) - { - warn $DBI::errstr; - warn "Database doesn't appear to exist. Aborting database drop."; - exit(0); - } - drop_db(); -} -elsif ( $args{'action'} eq 'insert' ) { - insert_data( $args{'datafile'} ); -} -elsif ($args{'action'} eq 'acl') { - $dbh = DBI->connect( $Handle->DSN, $args{'dba'}, $args{'dba-password'} ) - || die "Failed to connect to " . get_system_dsn() . " as $args{'dba'}: $DBI::errstr"; - insert_acl($args{'datadir'}); -} -elsif ($args{'action'} eq 'schema') { - $dbh = DBI->connect( $Handle->DSN, $args{'dba'}, $args{'dba-password'} ) - || die "Failed to connect to " . get_system_dsn() . " as $args{'dba'}: $DBI::errstr"; - insert_schema($args{'datadir'}); -} - -else { - print STDERR '$0 called with an invalid --action parameter'; - exit(-1); -} - -# {{{ sub insert_schema -sub insert_schema { - my $base_path = (shift || $RT::EtcPath); - my (@schema); - print "Creating database schema.\n"; - - if ( -f $base_path . "/schema." . $RT::DatabaseType ) { - no warnings 'unopened'; - - open( SCHEMA, "<" . $base_path . "/schema." . $RT::DatabaseType ); - open( SCHEMA_LOCAL, "<" . $RT::LocalEtcPath . "/schema." . $RT::DatabaseType ); - - my $statement = ""; - foreach my $line (<SCHEMA>, ($_ = ';;'), <SCHEMA_LOCAL>) { - $line =~ s/\#.*//g; - $line =~ s/--.*//g; - $statement .= $line; - if ( $line =~ /;(\s*)$/ ) { - $statement =~ s/;(\s*)$//g; - push @schema, $statement; - $statement = ""; - } - } - - local $SIG{__WARN__} = sub {}; - my $is_local = 0; # local/etc/schema needs to be nonfatal. - foreach my $statement (@schema) { - if ($statement =~ /^\s*;$/) { $is_local = 1; next; } - print STDERR "SQL: $statement\n" if defined $args{'debug'}; - my $sth = $dbh->prepare($statement) or die $dbh->errstr; - unless ( $sth->execute or $is_local ) { - die "Problem with statement:\n $statement\n" . $sth->errstr; - } - } - - } - else { - die "Couldn't find schema file for " . $RT::DatabaseType . "\n"; - } - print "schema sucessfully inserted\n"; - -} - -# }}} - -# {{{ sub drop_db -sub drop_db { - return if ( $RT::DatabaseType eq 'SQLite' ); - if ( $RT::DatabaseType eq 'Oracle' ) { - print <<END; - -To delete the tables and sequences of the RT Oracle database by running - \@etc/drop.Oracle -through SQLPlus. - -END - return; - } - unless ( $args{'force'} ) { - print <<END; - -About to drop $RT::DatabaseType database $RT::DatabaseName on $RT::DatabaseHost. -WARNING: This will erase all data in $RT::DatabaseName. - -END - exit unless _yesno(); - - } - - print "Dropping $RT::DatabaseType database $RT::DatabaseName.\n"; - - $dbh->do("Drop DATABASE $RT::DatabaseName") or warn $DBI::errstr; -} - -# }}} - -# {{{ sub create_db -sub create_db { - print "Creating $RT::DatabaseType database $RT::DatabaseName.\n"; - if ( $RT::DatabaseType eq 'SQLite' ) { - return; - } - elsif ( $RT::DatabaseType eq 'Pg' ) { - $dbh->do("CREATE DATABASE $RT::DatabaseName WITH ENCODING='UNICODE'"); - if ($DBI::errstr) { - $dbh->do("CREATE DATABASE $RT::DatabaseName") || die $DBI::errstr; - } - } - elsif ($RT::DatabaseType eq 'Oracle') { - insert_acl(); - } - elsif ( $RT::DatabaseType eq 'Informix' ) { - $ENV{DB_LOCALE} = 'en_us.utf8'; - $dbh->do("CREATE DATABASE $RT::DatabaseName WITH BUFFERED LOG"); - } - else { - $dbh->do("CREATE DATABASE $RT::DatabaseName") or die $DBI::errstr; - } -} - -# }}} - -sub get_dba_password { - print -"In order to create a new database and grant RT access to that database,\n"; - print "this script needs to connect to your " - . $RT::DatabaseType - . " instance on " - . $RT::DatabaseHost . " as " - . $args{'dba'} . ".\n"; - print -"Please specify that user's database password below. If the user has no database\n"; - print "password, just press return.\n\n"; - print "Password: "; - ReadMode('noecho'); - my $password = ReadLine(0); - ReadMode('normal'); - return ($password); -} - -# {{{ sub _yesno -sub _yesno { - print "Proceed [y/N]:"; - my $x = scalar(<STDIN>); - $x =~ /^y/i; -} - -# }}} - -# {{{ insert_acls -sub insert_acl { - - my $base_path = (shift || $RT::EtcPath); - - if ( $RT::DatabaseType =~ /^oracle$/i ) { - do $base_path . "/acl.Oracle" - || die "Couldn't find ACLS for Oracle\n" . $@; - } - elsif ( $RT::DatabaseType =~ /^pg$/i ) { - do $base_path . "/acl.Pg" || die "Couldn't find ACLS for Pg\n" . $@; - } - elsif ( $RT::DatabaseType =~ /^mysql$/i ) { - do $base_path . "/acl.mysql" - || die "Couldn't find ACLS for mysql in " . $RT::EtcPath . "\n" . $@; - } - elsif ( $RT::DatabaseType =~ /^informix$/i ) { - do $base_path . "/acl.Informix" - || die "Couldn't find ACLS for Informix in " . $RT::EtcPath . "\n" . $@; - } - elsif ( $RT::DatabaseType =~ /^SQLite$/i ) { - return; - } - else { - die "Unknown RT database type"; - } - - my @acl = acl($dbh); - foreach my $statement (@acl) { - print STDERR $statement if $args{'debug'}; - my $sth = $dbh->prepare($statement) or die $dbh->errstr; - unless ( $sth->execute ) { - die "Problem with statement:\n $statement\n" . $sth->errstr; - } - } -} - -# }}} - -=head2 get_system_dsn - -Returns a dsn suitable for database creates and drops -and user creates and drops - -=cut - -sub get_system_dsn { - - my $dsn = $Handle->DSN; - - #with mysql, you want to connect sans database to funge things - if ( $RT::DatabaseType eq 'mysql' ) { - $dsn =~ s/dbname=$RT::DatabaseName//; - - # with postgres, you want to connect to database1 - } - elsif ( $RT::DatabaseType eq 'Pg' ) { - $dsn =~ s/dbname=$RT::DatabaseName/dbname=template1/; - } - elsif ( $RT::DatabaseType eq 'Informix' ) { - # with Informix, you want to connect sans database: - $dsn =~ s/Informix:$RT::DatabaseName/Informix:/; - } - return $dsn; -} - -sub insert_initial_data { - - RT::InitLogging(); - - #connect to the db, for actual RT work - require RT::Handle; - $RT::Handle = RT::Handle->new(); - $RT::Handle->Connect(); - - #Put together a current user object so we can create a User object - my $CurrentUser = new RT::CurrentUser(); - - print "Checking for existing system user ($CurrentUser)..."; - my $test_user = RT::User->new($CurrentUser); - $test_user->Load('RT_System'); - if ( $test_user->id ) { - print "found!\n\nYou appear to have a functional RT database.\n" - . "Exiting, so as not to clobber your existing data.\n"; - exit(-1); - - } - else { - print "not found. This appears to be a new installation.\n"; - } - - print "Creating system user..."; - my $RT_System = new RT::User($CurrentUser); - - my ( $val, $msg ) = $RT_System->_BootstrapCreate( - Name => 'RT_System', - RealName => 'The RT System itself', - Comments => -'Do not delete or modify this user. It is integral to RT\'s internal database structures', - Creator => '1' ); - - unless ($val) { - print "$msg\n"; - exit(1); - } - print "done.\n"; - $RT::Handle->Disconnect(); - -} - -# load some sort of data into the database - -sub insert_data { - my $datafile = shift; - - #Connect to the database and get RT::SystemUser and RT::Nobody loaded - RT::Init; - - my $CurrentUser = RT::CurrentUser->new(); - $CurrentUser->LoadByName('RT_System'); - - if ( $datafile eq $RT::EtcPath . "/initialdata" ) { - - print "Creating Superuser ACL..."; - - my $superuser_ace = RT::ACE->new($CurrentUser); - $superuser_ace->_BootstrapCreate( - PrincipalId => ACLEquivGroupId( $CurrentUser->Id ), - PrincipalType => 'Group', - RightName => 'SuperUser', - ObjectType => 'RT::System', - ObjectId => '1' ); - - } - - # Slurp in stuff to insert from the datafile. Possible things to go in here:- - # @groups, @users, @acl, @queues, @ScripActions, @ScripConditions, @templates - - require $datafile - || die "Couldn't find initial data for import\n" . $@; - - if (@Groups) { - print "Creating groups..."; - foreach $item (@Groups) { - my $new_entry = RT::Group->new($CurrentUser); - my ( $return, $msg ) = $new_entry->_Create(%$item); - print "(Error: $msg)" unless ($return); - print $return. "."; - } - print "done.\n"; - } - if (@Users) { - print "Creating users..."; - foreach $item (@Users) { - my $new_entry = new RT::User($CurrentUser); - my ( $return, $msg ) = $new_entry->Create(%$item); - print "(Error: $msg)" unless ($return); - print $return. "."; - } - print "done.\n"; - } - if (@Queues) { - print "Creating queues..."; - for $item (@Queues) { - my $new_entry = new RT::Queue($CurrentUser); - my ( $return, $msg ) = $new_entry->Create(%$item); - print "(Error: $msg)" unless ($return); - print $return. "."; - } - print "done.\n"; - } - if (@ACL) { - print "Creating ACL..."; - for my $item (@ACL) { - - my ($princ, $object); - - # Global rights or Queue rights? - if ($item->{'Queue'}) { - $object = RT::Queue->new($CurrentUser); - $object->Load( $item->{'Queue'} ); - } else { - $object = $RT::System; - } - - # Group rights or user rights? - if ($item->{'GroupDomain'}) { - $princ = RT::Group->new($CurrentUser); - if ($item->{'GroupDomain'} eq 'UserDefined') { - $princ->LoadUserDefinedGroup( $item->{'GroupId'} ); - } elsif ($item->{'GroupDomain'} eq 'SystemInternal') { - $princ->LoadSystemInternalGroup( $item->{'GroupType'} ); - } elsif ($item->{'GroupDomain'} eq 'RT::Queue-Role' && - $item->{'Queue'}) { - $princ->LoadQueueRoleGroup( Type => $item->{'GroupType'}, - Queue => $object->id); - } else { - $princ->Load( $item->{'GroupId'} ); - } - } else { - $princ = RT::User->new($CurrentUser); - $princ->Load( $item->{'UserId'} ); - } - - # Grant it - my ( $return, $msg ) = $princ->PrincipalObj->GrantRight( - Right => $item->{'Right'}, - Object => $object ); - - if ($return) { - print $return. "."; - } - else { - print $msg . "."; - - } - - } - print "done.\n"; - } - if (@CustomFields) { - print "Creating custom fields..."; - for $item (@CustomFields) { - my $new_entry = new RT::CustomField($CurrentUser); - my $values = $item->{'Values'}; - delete $item->{'Values'}; - my $q = $item->{'Queue'}; - my $q_obj = RT::Queue->new($CurrentUser); - $q_obj->Load($q); - if ( $q_obj->Id ) { - $item->{'Queue'} = $q_obj->Id; - } - elsif ( $q == 0 ) { - $item->{'Queue'} = 0; - } - else { - print "(Error: Could not find queue " . $q . ")\n" - unless ( $q_obj->Id ); - next; - } - my ( $return, $msg ) = $new_entry->Create(%$item); - - foreach my $value ( @{$values} ) { - my ( $eval, $emsg ) = $new_entry->AddValue(%$value); - print "(Error: $emsg)\n" unless ($eval); - } - - print "(Error: $msg)\n" unless ($return); - print $return. "."; - } - - print "done.\n"; - } - - if (@ScripActions) { - print "Creating ScripActions..."; - - for $item (@ScripActions) { - my $new_entry = RT::ScripAction->new($CurrentUser); - my $return = $new_entry->Create(%$item); - print $return. "."; - } - - print "done.\n"; - } - - if (@ScripConditions) { - print "Creating ScripConditions..."; - - for $item (@ScripConditions) { - my $new_entry = RT::ScripCondition->new($CurrentUser); - my $return = $new_entry->Create(%$item); - print $return. "."; - } - - print "done.\n"; - } - - if (@Templates) { - print "Creating templates..."; - - for $item (@Templates) { - my $new_entry = new RT::Template($CurrentUser); - my $return = $new_entry->Create(%$item); - print $return. "."; - } - print "done.\n"; - } - if (@Scrips) { - print "Creating scrips..."; - - for $item (@Scrips) { - my $new_entry = new RT::Scrip($CurrentUser); - my ( $return, $msg ) = $new_entry->Create(%$item); - if ($return) { - print $return. "."; - } - else { - print "(Error: $msg)\n"; - } - } - print "done.\n"; - } - $RT::Handle->Disconnect(); - -} - -=head2 ACLEquivGroupId - -Given a userid, return that user's acl equivalence group - -=cut - -sub ACLEquivGroupId { - my $username = shift; - my $user = RT::User->new($RT::SystemUser); - $user->Load($username); - my $equiv_group = RT::Group->new($RT::SystemUser); - $equiv_group->LoadACLEquivalenceGroup($user); - return ( $equiv_group->Id ); -} - -sub help { - - print <<EOF; - -$0: Set up RT's database - ---action init Initialize the database - drop Drop the database. - This will ERASE ALL YOUR DATA - insert Insert data into RT's database. - By default, will use RT's installation data. - To use a local or supplementary datafile, specify it - using the '--datafile' option below. - - acl Initialize only the database ACLs - To use a local or supplementary datafile, specify it - using the '--datadir' option below. - - schema Initialize only the database schema - To use a local or supplementary datafile, specify it - using the '--datadir' option below. - ---datafile /path/to/datafile ---datadir /path/to/ Used to specify a path to find the local - database schema and acls to be installed. - - ---dba dba's username ---dba-password dba's password ---prompt-for-dba-password Ask for the database administrator's password interactively - - -EOF - -} - -1; diff --git a/rt/sbin/rt-setup-database.in b/rt/sbin/rt-setup-database.in index 01c7b3cf1..49feba845 100644 --- a/rt/sbin/rt-setup-database.in +++ b/rt/sbin/rt-setup-database.in @@ -151,6 +151,9 @@ elsif ( $args{'action'} eq 'drop' ) { } drop_db(); } +elsif ( $args{'action'} eq 'insert_initial' ) { + insert_initial_data(); +} elsif ( $args{'action'} eq 'insert' ) { insert_data( $args{'datafile'} || ($args{'datadir'}."/content")); } @@ -643,6 +646,8 @@ $0: Set up RT's database --action init Initialize the database drop Drop the database. This will ERASE ALL YOUR DATA + insert_initial + Insert RT's core system objects insert Insert data into RT's database. By default, will use RT's installation data. To use a local or supplementary datafile, specify it diff --git a/rt/sbin/rt-test-dependencies b/rt/sbin/rt-test-dependencies deleted file mode 100644 index c1591b189..000000000 --- a/rt/sbin/rt-test-dependencies +++ /dev/null @@ -1,278 +0,0 @@ -#!/usr/bin/perl -# 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 - -# -# This is just a basic script that checks to make sure that all -# the modules needed by RT before you can install it. -# - -use strict; -no warnings qw(numeric redefine); -use Getopt::Long; -use CPAN; -my %args; -my %deps; -GetOptions(\%args,'install', 'with-MYSQL', 'with-POSTGRESQL|with-pg|with-pgsql', 'with-SQLITE', 'with-ORACLE', 'with-FASTCGI', 'with-SPEEDYCGI', 'with-MODPERL1', 'with-MODPERL2' ,'with-DEV'); - -if (!keys %args) { - help(); - exit(0); -} -if ($args{'with-MODPERL2'}) { - warn_modperl2(); -} - -$args{'with-MASON'} = 1; -$args{'with-CORE'} = 1; -$args{'with-DEV'} =1; -$args{'with-CLI'} =1; -$args{'with-MAILGATE'} =1; -if ($] < 5.007) { -$args{'with-I18N-COMPAT'} = 1; -} - -sub warn_modperl2 { - print <<'.'; - NOTE: mod_perl 2.0 isn't quite ready for prime_time just yet; - Best Practical Solutions strongly recommends that sites use - Apache 1.3 or FastCGI. If you MUST use mod_perl 2.0 (or 1.99), - please read the mailing list archives before asking for help. -. - sleep 5; -} - - -sub help { - - print <<'.'; - -By default, testdeps determine whether you have -installed all the perl modules RT needs to run. - - --install Install missing modules - -The following switches will tell the tool to check for specific dependencies - - --with-mysql Database interface for MySQL - --with-postgresql Database interface for PostgreSQL - --with-sqlite Database interface and driver for SQLite (unsupported) - --with-oracle Database interface for oracle (unsupported) - - --with-fastcgi Libraries needed to support the fastcgi handler - --with-speedycgi Libraries needed to support the speedycgi handler - --with-modperl1 Libraries needed to support the modperl 1 handler - --with-modperl2 Libraries needed to support the modperl 2 handler - - --with-dev Tools needed for RT development -. -} - - -sub _ { - map { /(\S+)\s*(\S*)/; $1 => ($2 ? $2 :'') } split ( /\n/, $_[0] ); -} - -$deps{'CORE'} = [ _( << '.') ]; -Digest::MD5 2.27 -DBI 1.37 -Test::Inline -Class::ReturnValue 0.40 -DBIx::SearchBuilder 0.97 -Text::Template -File::Spec 0.8 -HTML::Entities -Net::Domain -Log::Dispatch 2.0 -Locale::Maketext 1.06 -Locale::Maketext::Lexicon 0.32 -Locale::Maketext::Fuzzy -MIME::Entity 5.108 -Mail::Mailer 1.57 -Net::SMTP -Text::Wrapper -Time::ParseDate -File::Temp -Term::ReadKey -Text::Autoformat -Text::Quoted 1.3 -Scalar::Util -. - -$deps{'MASON'} = [ _( << '.') ]; -Params::Validate 0.02 -Cache::Cache -Exception::Class -HTML::Mason 1.16 -MLDBM -Errno -FreezeThaw -Digest::MD5 2.27 -CGI::Cookie 1.20 -Storable 2.08 -Apache::Session 1.53 -. - -$deps{'MAILGATE'} = [ _( << '.') ]; -HTML::TreeBuilder -HTML::FormatText -Getopt::Long -LWP::UserAgent -. - -$deps{'CLI'} = [ _( << '.') ]; -Getopt::Long 2.24 -. - -$deps{'DEV'} = [ _( << '.') ]; -Regexp::Common -Time::HiRes -Test::Inline -WWW::Mechanize -. - -$deps{'FASTCGI'} = [ _( << '.') ]; -CGI 2.92 -FCGI -CGI::Fast -. - -$deps{'SPEEDYCGI'} = [ _( << '.') ]; -CGI 2.92 -CGI::SpeedyCGI -. - - -$deps{'MODPERL1'} = [ _( << '.') ]; -CGI 2.92 -Apache::Request -Apache::DBI 0.92 -. - -$deps{'MODPERL2'} = [ _( << '.') ]; -CGI 2.92 -Apache::DBI -. - -$deps{'I18N-COMPAT'} = [ _( << '.') ]; -Text::Iconv -Encode::compat 0.04 -. - -$deps{'MYSQL'} = [ _( << '.') ]; -DBD::mysql 2.1018 -. -$deps{'ORACLE'} = [ _( << '.') ]; -DBD::Oracle -. -$deps{'POSTGRESQL'} = [ _( << '.') ]; -DBD::Pg -. - -print "perl:\n"; -print "\t5.8.0"; -eval {require 5.008}; -if ($@) { -print "...missing.\n"; - eval {require 5.006001}; - if ($@) { - print " RT is known to be non-functional on versions of perl older than 5.6.1. Please upgrade to 5.8.0 or newer"; - die; - } else { - print " RT is not supported on perl 5.6.1\n"; - } -} else { - print "...found\n"; - -} - - -foreach my $type (keys %args) { -next unless ($type =~ /^with-(.*?)$/); -my $type = $1; -print "$type dependencies:\n"; - my @deps = (@{$deps{$type}}); - while (@deps) { - my $module = shift @deps; - my $version = shift @deps; -my $ret; - $ret =test_dep($module, $version); - -if ($args{'install'} && !$ret) { - resolve_dep($module); -} -} -} -sub test_dep { - my $module = shift; - my $version = shift; - - print "\t$module $version"; - eval "use $module $version" ; - if ($@) { - my $error = $@; - $error =~ s/\n(.*)$//s; - print "...MISSING\n"; - print "\t\t$error\n" if $error =~ /this is only/; - - return undef; - } else { - print "...found\n"; -return 1; - } -} - -sub resolve_dep { - my $module = shift; - use CPAN; - CPAN::Shell->install($module); - -} - - -sub print_help { - print << "EOF"; - -$0 FLAG DBTYPE - - -$0 is a tool for RT that will tell you if you've got all -the modules RT depends on properly installed. - -Flags: (only one flag is valid for a given run) - --quiet will check to see if we've got everything we need - and will exit with a return code of (1) if we don't. - --warn will tell you what isn't properly installed - --fix will use CPANPLUS.pm or CPAN.pm to magically make everything better - -DBTYPE is one of: - oracle, pg, mysql - -EOF - - exit(0); -} |