[rt-users] Time Worked Report
Kenneth Crocker
kfcrocker at lbl.gov
Mon Mar 28 12:33:15 EDT 2011
Walid,
What I mean is this; it is *highly recommended* that any changes you make to
RT code be done in a *"local"* version. RT will automatically look to $Home/
*local/*.../.../ (where $home is usually opt/rt3/) for *any override
code*that an installation may have developed. In this example
(TimeWorkedReport),
I copied the various /$home*/share/*.../... directories & files listed in
the "readme' for that report into a /$home/*local/*.../... *version/copy* of
those *directoryies & files*. I did *NOT* make any changes to any */share/
version* of RT code. This is recommended for a couple reasons; the least of
which it is *easier to maintain later versions* of RT without wiping out
your local code (provided you keep a copy of that code). Also, industry wide
for about the last 40 years, it has been considered a *best practice* to *
never* mess with original code, but to provide a method that allows you to
use other code instead.
So, my advice is to first; return all /share/ code to it's original state.
Then create $home*/local/*html/Tools/Reports directories in order to
copy/create the files mentioned in the "TimeWorkedReport" documentation.
That's what I did:
1) If it exists,type *“/opt/rt3/local/html/Elements/” <enter>* otherwise,
create it.
2) Copy the *“delivered”* file (from .../share/...) *SelectQueue* over to
this directory with a the new name.
A) Type *“cp /opt/rt3/share/html/Elements/SelectQueue SelectMultiQueue”
<enter>*.
3) Replace the code in *“SelectMultiQueue”* with the code specified for this
file from the document the *“TimeWorkedReport".*
4) If it exists, type *“/opt/rt3/local/html/Tools/” <enter>*, otherwise,
create it.
5) Create new directories:
A) Create *“Reports”* directory within *“Tools”
*B) Get into *“Reports*” directory.
C) Create *“Elements”* directory within *“Tools/Reports”*
6) Copy the *“delivered”* files (from .../share/...) (*Tabs, index.html*)
over to the new directories:
A) Copy the *“Tabs”* file over to *“Tools/Reports/Elements”*:
1) Within *“Elements”,* type *“cp
/opt/rt3/share/html/Tools/Reports/Elements/Tabs .” <enter>*.
2) Go back 1 directory level to get to *“/Tools/Reports”*.
3) Copy the *“index.html”* file over to *“Tools/Reports” twice:*
a) Within *“Tools/Reports”,* type *“cp
/opt/rt3/share/html/Tools/index.html .” <enter>*.
b) Within *“Tools/Reports”,* type *“cp
/opt/rt3/share/html/Tools/index.html TimeWorkedReport.html” <enter>*.
7) Modify/Replace the code in *“Tabs”, “index.html” & “TimeWorkedReport” *with
the code specified for these files from the document the *“Time Worked
Report”*.
Anyway, This is the procedure I followed and I had absolutely no problems
AND I didn't have to worry about Production being messed up.
Also, I'm in 3.8.7 so I made sure to follow the 3.8 instructions.
Hope this helps.
Kenn
LBNL
On Mon, Mar 28, 2011 at 2:53 AM, Walid Haider <walid.haider at movensis.com>wrote:
> Hi Ken,
>
>
>
> Thanks for the swift response.
>
>
>
> I am not sure what you mean by “copy the ..../share/... directories/files
> to .../local/..... directories/files”. Below are the steps I followed:
>
>
>
> 1) edit /usr/share/rt3/html/Tools/Reports/index.html and add the following
> lines in the my $tabs section after:
>
>
>
> ...
>
> C => {
>
> title => loc('Created in a date range'),
>
> path => '/Tools/Reports/CreatedByDates.html',
>
> description => loc('Examine tickets created in a queue between two
> dates'),
>
> },
>
> ...
>
>
>
> ++++++++++ ADD THIS SECTION ++++++++++++++++++++++++
>
> D => {
>
> title => loc('Time Worked Report'),
>
> path => '/Tools/Reports/TimeWorkedReport.html',
>
> description => loc('A Time Worked Report'),
>
> },
>
> ++++++++++++++++++++++++++++++++++++++++++++++++++++
>
>
>
>
>
> 2) edit /usr/share/rt3/html/Tools/Reports/Elements/Tabs and add the
> following lines in the my $tabs section after:
>
>
>
> ...
>
> c => {
>
> title => loc('Created in a date range'),
>
> path => 'Tools/Reports/CreatedByDates.html',
>
> },
>
> ...
>
>
>
> ++++++++++ ADD THIS SECTION ++++++++++++++++++++++++
>
> d => {
>
> title => loc('Time Worked Report'),
>
> path => 'Tools/Reports/TimeWorkedReport.html',
>
> },
>
> ++++++++++++++++++++++++++++++++++++++++++++++++++++
>
>
>
>
>
> 3) Create the file /usr/share/rt3/html/Elements/SelectMultiQueue, with the
> following content:
>
>
>
> %# BEGIN BPS TAGGED BLOCK {{{
>
> %#
>
> %# COPYRIGHT:
>
> %#
>
> %# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC
>
> %# <jesse at 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., 51 Franklin Street, Fifth Floor, Boston, MA
>
> %# 02110-1301 or visit their web page on the internet at
>
> %# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
>
> %#
>
> %#
>
> %# 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 }}}
>
> % if ($Lite) {
>
> % my $d = new RT::Queue($session{'CurrentUser'});
>
> % $d->Load($Default);
>
> <input name="<%$Name%>" size="25" value="<%$d->Name%>" class="<%$Class%>"
> />
>
> % }
>
> % else {
>
> % # $Default will be an arrayref if multiple queues are selected, or a
>
> % # scalar if 0-1 queues are selected. Hence, this ugly processing
> logic.
>
> % my %selected;
>
> % if (ref $Default) {
>
> % for (@$Default) {
>
> % $selected{$_} = 1;
>
> % }
>
> % } else {
>
> % $selected{$Default} = 1;
>
> % }
>
> <select name="<%$Name%>" <% ($OnChange) ? 'onchange="'.$OnChange.'"' : ''
> |n %> class=" <%$Class%>" MULTIPLE>
>
> % if ($ShowNullOption) {
>
> <option value="">-</option>
>
> % }
>
> % for my $queue (@{$session{$cache_key}}) {
>
> <option value="<% ($NamedValues ? $queue->{Name} : $queue->{Id}) %>"
>
>
>
> %# if ($queue->{Id} eq ($Default||'') || $queue->{Name} eq ($Default||''))
> {
>
> % if($selected{$queue->{Id}}) {
>
> selected="selected"
>
> % }
>
>
>
> >
>
> <%$queue->{Name}%>
>
>
>
> % if ($Verbose and $queue->{Description}) {
>
> (<%$queue->{Description}%>)
>
> % }
>
> </option>
>
> % }
>
> </select>
>
> % }
>
> <%args>
>
> $CheckQueueRight => 'CreateTicket'
>
> $ShowNullOption => 1
>
> $ShowAllQueues => 1
>
> $Name => undef
>
> $Verbose => undef
>
> $NamedValues => 0
>
> $Default => 0
>
> $Lite => 0
>
> $OnChange => undef
>
> $Class => 'select-queue'
>
> </%args>
>
> <%init>
>
> my $cache_key = "SelectQueue---"
>
> . $session{'CurrentUser'}->Id
>
> . "---$CheckQueueRight---$ShowAllQueues";
>
>
>
> if (not defined $session{$cache_key} and not $Lite) {
>
> my $q = new RT::Queues($session{'CurrentUser'});
>
> $q->UnLimit;
>
>
>
> while (my $queue = $q->Next) {
>
> if ($ShowAllQueues ||
> $queue->CurrentUserHasRight($CheckQueueRight)) {
>
> push @{$session{$cache_key}}, {
>
> Id => $queue->Id,
>
> Name => $queue->Name,
>
> Description => $queue->Description,
>
> };
>
> }
>
> }
>
> }
>
> </%init>
>
>
>
>
>
>
>
> 4) Create the file /usr/share/rt3/html/Tools/Reports/TimeWorkedReport.html,
> with the following content:
>
>
>
> <%args>
>
> $startdate => undef
>
> $enddate => undef
>
> $queues => undef
>
> $byticket => undef
>
> </%args>
>
>
>
> <& /Elements/Header, Title => $title &>
>
> <& /Tools/Reports/Elements/Tabs, current_tab =>
> 'Tools/Reports/TimeWorkedReport.html', Title => $title &>
>
> <hr>
>
>
>
> <%init>
>
> my ($start_date, $end_date, $effective_end_date, $title);
>
>
>
> $title = loc('Time worked report');
>
>
>
> $start_date = RT::Date->new($session{'CurrentUser'});
>
> $end_date = RT::Date->new($session{'CurrentUser'});
>
>
>
> # If we have a value for start date, parse it into an RT::Date object
>
> if ($startdate) {
>
> $start_date->Set(Format => 'unknown', Value => $startdate);
>
> # And then get it back as an ISO string for display purposes, in the
> form field and
>
> # report header
>
> $startdate = $start_date->AsString(Format => 'ISO', Timezone =>
> 'server');
>
> }
>
>
>
> # Same treatment for end date
>
> if ($enddate) {
>
> $end_date->Set(Format => 'unknown', Value => $enddate);
>
> $enddate = $end_date->AsString(Format => 'ISO', Timezone => 'server');
>
> }
>
>
>
> </%init>
>
>
>
> <form method="post" action="TimeWorkedReport.html">
>
> <br />
>
> <&|/l&>Start date</&>:
>
> <& /Elements/SelectDate, Name => 'startdate', Default => ($startdate) ?
> $start_date->AsString(Format => 'ISO', Timezone => 'server') : ''&>
>
> (report will start from midnight on this day unless you indicate
> otherwise)
>
> <br />
>
> <&|/l&>End date</&>:
>
> <& /Elements/SelectDate, Name => 'enddate', Default => ($enddate) ?
> $end_date->AsString(Format => 'ISO', Timezone => 'server') : ''&>
>
> (report will -not- be inclusive of this day unless you change the time
> from midnight)
>
> <br />
>
> <&|/l&>Queues</&>:
>
> <& /Elements/SelectMultiQueue, Name => 'queues', Default => ($queues) ?
> $queues : ''&>
>
> <br />
>
> <& /Elements/Checkbox, Name => 'byticket', Default => ($byticket) ?
> 'checked' : ''&>
>
> Organize report by ticket instead of by person
>
> <& /Elements/Submit&>
>
>
>
> </form>
>
>
>
>
>
> <%perl>
>
> # TimeWorkedReport
>
> # Version 0.04 2009-09-28
>
> #
>
> # Fran Fabrizio, UAB CIS, fran at cis.uab.edu
>
>
>
> use strict;
>
>
>
> # if we are just getting here and the form values are empty, we are done
>
> if (!$startdate || !$enddate) {
>
> return;
>
> }
>
>
>
> # get the queue object(s)
>
> my $queuesobj = new RT::Queues($session{CurrentUser});
>
> my ($queuelist, %queuesofinterest);
>
>
>
> # The user's choice of queues will come in from the web form in the
> $queues variable, which is
>
> # mapped to the SELECT field on the web interface for the report.
> Unfortunately, if the user
>
> # chooses just one queue, $queues will have a scalar value, but if the
> user chooses multiple
>
> # queues, it will be an arrayref. So we need to check for each case and
> process differently.
>
> #
>
> # What we want to construct is the %queuesofinterest simple lookup hash
> which defines a key
>
> # that is the queue ID for each queue selected, and the $queuelist string,
> which is just for
>
> # displaying the list of queues in the report header
>
> if (ref $queues) {
>
> # multiple queues selected
>
> for (@$queues) {
>
> $queuesobj->Limit(FIELD => "Id", OPERATOR => "=", VALUE => $_,
> ENTRYAGGREGATOR => "OR");
>
> $queuesofinterest{$_} = 1;
>
> }
>
> $queuelist = join ", ", map {$_->Name} @{$queuesobj->ItemsArrayRef};
>
> } else {
>
> my $queue = new RT::Queue;
>
> $queue->Load(Id => $queues);
>
> $queuesofinterest{$queues} = 1;
>
> $queuelist = $queue->Name;
>
> }
>
>
>
> # hash to hold statistics
>
> # %stats will be a multilevel hash - first level keys are the usernames,
> second level keys are
>
> # the ticket IDs, and for each ticket, we store an anonymous hash with
> keys Subject and TimeWorked
>
> # (this implies that a single ticket can live under two+ users if they
> both worked the ticket)
>
> my %stats;
>
>
>
> # Get a new transactions object to hold transaction search results for
> this ticket
>
> my $trans = new RT::Transactions($session{'CurrentUser'});
>
>
>
> # only in the period of interest
>
> $trans->Limit(FIELD => 'Created', OPERATOR => '>', VALUE => $startdate);
>
> $trans->Limit(FIELD => 'Created', OPERATOR => '<', VALUE => $enddate,
> ENTRYAGGREGATOR => 'AND');
>
>
>
> # now start counting all the TimeTaken by examining transactions
> associated with this ticket
>
> while (my $tr = $trans->Next) {
>
>
>
> # did this transaction take any time? RT records this -either- in
> TimeTaken column or by
>
> # indicating "TimeWorked" in the Field column, depending on how the user
> inputted the time.
>
> if (($tr->TimeTaken != 0) || ($tr->Field && $tr->Field eq 'TimeWorked'))
> {
>
> # Got a hot one - what ticket is this?
>
> my $t = new RT::Ticket($session{'CurrentUser'});
>
> $t->Load($tr->ObjectId);
>
>
>
> if (!$t) {
>
> # unable to retrieve a ticket for this transaction
>
> # hopefully we don't ever reach here!
>
> next;
>
> } else {
>
> # Is this ticket in a queue we care about?
>
> if (!$queuesofinterest{$t->Queue}) {
>
> next;
>
> }
>
> }
>
>
>
> # If this is time logged by user RT_System, it's the result of a ticket
> merge
>
> # In order to avoid double-counting minutes in --byticket mode, or the
> less serious
>
> # issue of displaying a report for user RT_System in normal mode, we
> skip this entirely
>
> if ($tr->CreatorObj->Name eq 'RT_System') {
>
> next;
>
> }
>
>
>
> # we've got some time to account for
>
>
>
> # is this the first time this person is charging time to this ticket?
>
> # if so, add this ticket subject to the data structure
>
> if (!exists($stats{$tr->CreatorObj->Name}{$t->id}{Subject})) {
>
> $stats{$tr->CreatorObj->Name}{$t->id}{Subject} = $t->Subject;
>
> }
>
>
>
> if ($tr->TimeTaken != 0) {
>
> # this was a comment or correspondence where the user also added some
> time worked
>
> # value of interest appears in Transaction's TimeTaken column
>
> $stats{$tr->CreatorObj->Name}{$t->id}{TimeWorked} += $tr->TimeTaken;
>
> } else {
>
> # this was a direct update of the time worked field from the Basics
> or Jumbo ticket update page
>
> # values of interest appear in Transaction's OldValue and NewValue
> columns
>
> # RT does not use the TimeTaken column in this instance.
>
> $stats{$tr->CreatorObj->Name}{$t->id}{TimeWorked} += $tr->NewValue -
> $tr->OldValue;
>
> }
>
> }
>
> }
>
>
>
> # report output starts here
>
> # output:
>
> # normal user: their own time worked report, most worked ticket to least
> worked ticket
>
> # superuser: everyone's time worked report, in username alpha order,
> then by most worked to least worked
>
> # superuser+byticket: most worked ticket first, with everyone's
> contribution ranked by biggest contribution to smallest
>
>
>
> print "<h2>TIME WORKED REPORT FOR QUEUE(S) " . $queuelist . "</h2>";
>
> print "<h3>Date Range: $startdate TO $enddate</h3>";
>
> if ($byticket) {
>
> print "<h3>Organized by Ticket</h3>";
>
> }
>
> print "<hr>";
>
>
>
> # if this person is not a superuser, we should only show them the report
> for themselves
>
> # which means we should remove all keys from %stats except their own
> username
>
> if (!($session{'CurrentUser'}->HasRight(Right => 'SuperUser', Object =>
> $RT::System))) {
>
> my %tempstats;
>
> $tempstats{$session{CurrentUser}->Name} =
> $stats{$session{CurrentUser}->Name};
>
> %stats = %tempstats;
>
> }
>
>
>
> if ($byticket) {
>
> # if we're going to organize this by ticket, we need to transform the
> data first
>
> # HAVE ENTRIES LIKE: $stats{JoeUser}{12345}{TimeWorked} = 150
>
> # $stats{JoeUser}{12345}{Subject} = "Fix the Fubar
> Widget"
>
> # WANT ENTRIES LIKE: $tstats{12345}{TotalTime} = 250
>
> # $tstats{12345}{Subject} = "Fix the Fubar Widget"
>
> # $tstats{12345}{People}{JoeUser} = 150
>
> # $tstats{12345}{People}{JaneDoe} = 100
>
>
>
> my %tstats;
>
> for my $person (keys %stats) {
>
> for my $tid (keys %{$stats{$person}}) {
>
> # grab the subject line if you don't have it already
>
> if (!exists($tstats{$tid}{Subject})) {
>
> $tstats{$tid}{Subject} = $stats{$person}{$tid}{Subject};
>
> }
>
> # now increment total time for this ticket
>
> $tstats{$tid}{TotalTime} += $stats{$person}{$tid}{TimeWorked};
>
> # and record this user's contribution to this ticket
>
> $tstats{$tid}{People}{$person} = $stats{$person}{$tid}{TimeWorked};
>
> }
>
> }
>
>
>
> # Now emit the report
>
> for my $tid (sort {$tstats{$b}{TotalTime} <=> $tstats{$a}{TotalTime}}
> keys %tstats) {
>
> my $subject = $tstats{$tid}{Subject};
>
> print "<H3><A TARGET=\"_TimeWorked\"
> HREF=\"/Ticket/Display.html?id=$tid\">$tid: $subject</A></H3>";
>
> print "<TABLE BORDER=0 CELLSPACING=5>";
>
> printf("<TR><TH WIDTH=30></TH><TH>%dm</TH><TH>%.1fh</TH><TH>TOTAL
> TIME</TH></TR>", $tstats{$tid}{TotalTime},($tstats{$tid}{TotalTime} / 60));
>
> for my $person (sort {$tstats{$tid}{People}{$b} <=>
> $tstats{$tid}{People}{$a}} keys %{$tstats{$tid}{People}}) {
>
> my $minutes = $tstats{$tid}{People}{$person};
>
>
> printf("<TR><TD></TD><TD>%dm</TD><TD>%.1fh</TD><TD>%s</TD></TR>",$minutes,($minutes
> /60),$person);
>
> }
>
> print "</TABLE>";
>
> }
>
> } else {
>
> # the existing %stats data structure is perfect for the default report,
> no data transform needed
>
> for my $person (sort keys %stats) {
>
> # get the person object, so we can get the FriendlyName to use as
> header
>
> my $personobj = new RT::User($session{CurrentUser});
>
> $personobj->Load($person);
>
>
>
> print "<h3>" . $personobj->FriendlyName . "</h3>";
>
> print "<TABLE BORDER=0 CELLSPACING=5>";
>
> print "<TR><TH>MINUTES</TH><TH>HOURS</TH><TH>TICKET</TH></TR>";
>
> my $totalMinutes = 0;
>
> for my $tid (sort {$stats{$person}{$b}{TimeWorked} <=>
> $stats{$person}{$a}{TimeWorked}} keys %{$stats{$person}}) {
>
> my $minutes = $stats{$person}{$tid}{TimeWorked};
>
> my $subject = $stats{$person}{$tid}{Subject};
>
> print "<TR><TD ALIGN=RIGHT>${minutes}m</TD><TD ALIGN=RIGHT>" .
> sprintf("%.1fh",($minutes/60)) . "</TD>" .
>
> "<TD><A TARGET=\"_TimeWorked\"
> HREF=\"/Ticket/Display.html?id=$tid\">$tid: $subject</A></TD></TR>";
>
> $totalMinutes += $minutes;
>
> }
>
> print "<TR><TD ALIGN=RIGHT><B>${totalMinutes}m</B></TD><TD
> ALIGN=RIGHT><B>" . sprintf("%.1fh",($totalMinutes/60)) .
> "</B></TD><TD><B>TOTALS</B></TD></TR>";
>
> print "</TABLE>";
>
> }
>
> }
>
>
>
> ##### helper functions below
>
>
>
> sub form_date_string {
>
> # expects seven input params - year, month, day, hour, minute, second,
> offset
>
> my $year = $_[0] - 1900;
>
> my $mon = $_[1] - 1;
>
> my $day = $_[2];
>
> my $hour = $_[3] ? $_[3] : 0;
>
> my $min = $_[4] ? $_[4] : 0;
>
> my $sec = $_[5] ? $_[5] : 0;
>
> my $offset = $_[6] ? $_[6] : 0;
>
>
>
> # convert to seconds since epoch, then adjust for the $offset, which is
> also in seconds
>
> # we do this so we don't have to do fancy date arithmetic - we can just
> subtract one seconds
>
> # value from the other seconds value
>
> my $starttime = timelocal($sec,$min,$hour,$day,$mon,$year) - $offset;
>
>
>
> # convert back to component parts now that we've adjusted for offset
>
> # this gives us the components which represent the GMT time for the local
> time that was entered
>
> # on the command line
>
> ($sec,$min,$hour,$day,$mon,$year) = localtime($starttime);
>
>
>
> # format the date string, padding with zeros if needed
>
> return sprintf("%04d-%02d-%02d %02d:%02d:%02d", ($year+1900), ($mon+1),
> $day, $hour, $min, $sec);
>
> }
>
>
>
> </%perl>
>
>
>
> 5) Restart the RT Server
>
>
>
>
>
> Thanking you in anticipation,
>
> Walid
>
>
>
> *From:* rt-users-bounces at lists.bestpractical.com [mailto:
> rt-users-bounces at lists.bestpractical.com] *On Behalf Of *Kenneth Crocker
> *Sent:* quinta-feira, 24 de Março de 2011 17:02
> *To:* rt-users at lists.bestpractical.com
> *Subject:* Re: [rt-users] Time Worked Report
>
>
>
> Walid,
>
> Did you copy the ..../share/... directories/files to .../local/.....
> directories/files and make your modifications there? That a WAY safer way to
> make modifications. You may have forgotten one and that is the problem?
>
> Kenn
> LBNL
>
> On Thu, Mar 24, 2011 at 9:51 AM, Walid Haider <walid.haider at movensis.com>
> wrote:
>
> Hi,
>
>
>
> I am a bit of a newbie with RT, and was wondering if you could help me.
>
>
>
> After following the installation your instructions at
> http://requesttracker.wikia.com/wiki/TimeWorkedReport, I get the following
> errors when clicking on the Time Worked Report link in RT:
>
>
>
> Error during compilation of /usr/share/rt3/html/Elements/SelectMultiQueue:
> Global symbol "$d" requires explicit package name at
> /usr/share/rt3/html/Elements/SelectMultiQueue line 51. Global symbol
> "$queue" requires explicit package name at
> /usr/share/rt3/html/Elements/SelectMultiQueue line 69. Global symbol
> "$queue" requires explicit package name at
> /usr/share/rt3/html/Elements/SelectMultiQueue line 69. Global symbol
> "$queue" requires explicit package name at
> /usr/share/rt3/html/Elements/SelectMultiQueue line 77. Global symbol
> "$queue" requires explicit package name at
> /usr/share/rt3/html/Elements/SelectMultiQueue line 80.
>
>
>
> Although the requirement states RT 3.8.5, I decided to give it a go on
> 3.8.4. Must I definitely upgrade in order to get this report to work?
>
>
>
> I am running RT on the following setup:
>
> Fedora Core 12, Apache 2.2.14, MYSQL 5.1
>
>
>
>
>
> Thanks in advance.
>
>
>
> Regards,
>
> Walid
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.bestpractical.com/pipermail/rt-users/attachments/20110328/75c3470e/attachment.htm>
More information about the rt-users
mailing list