Re: [rt-users] Callback with no TicketObject arg, guidance needed

2014-03-20 Thread Jeff Blaine
Alex, thanks again. I promise to write up what I've learned in the last
week (wiki).

I've hit another wall. While I can prove that the callback I am using is
in the right spot and is called...

The following Limit() IS working for Modify.html hits
(EditCustomFields). That is, hide certain fields for editing when a
control flag (CF) is set a certain way.

The following Limit() is NOT working for *Display.html*
(ShowCustomFields) hits. That is, hide certain fields from display when
a control flag (CF) is set a certain way. The problem is, they are still
showing when the control flag is set to not show them.

The code in both callback files is the same.

 How might I exclude fields X, Y, Z from $CustomFields in my callback?
 
 # Repeat for each name to exclude:
 $CustomFields-Limit(
 FIELD= 'Name',
 OPERATOR = '!=',
 VALUE= 'SomeNameToExclude',
 ENTRYAGGREGATOR = 'AND',
 );

Here is local/html/Elements/ShowCustomFields/MassageCustomFields (right
spot?) with comments relevant here:

%args
$CustomFields = undef
$ARGS = undef
$Object = undef
/%args

%init
#--
# NOTE: If I enable these 4 short-circuit lines, Display.html does
# in fact only show the 'Scope' custom field as a control/test.
# So a) the callback location seems correct and b) it proves we can
# at least control the contents of $CustomFields.
#
#   $CustomFields-Limit(FIELD = 'Name', OPERATOR = '=',
#VALUE = 'Scope', ENTRYAGGREGATOR = 'AND',
#CASESENSITIVE = 0);
#   return;
#--

my $ticket   = $ARGS{'Object'};

# The fields to hide unless 'Noteworthy = Yes'
my @childfields  = (Details, Response, Total emails);

# Default to showing all fields in @childfields
my $showchildren = 1;

# Determine whether to show child fields or not
while (my $cf = $CustomFields-Next) {
my $nam = $cf-Name;
my $val = $ticket-FirstCustomFieldValue($nam);
if ($nam =~ /^noteworthy$/i and $val !~ /^yes$/i) {
$showchildren = 0;
last;
}
}

if (! $showchildren) {
# In theory, this should exclude all fields in @childfields
$CustomFields-Limit(FIELD = 'Name', OPERATOR = '!=', VALUE =
'$_', ENTRYAGGREGATOR = 'AND', CASESENSITIVE = 0) for (@childfields);
}
/%init
%# EOF
-- 
RT Training - Dallas May 20-21
http://bestpractical.com/training


Re: [rt-users] Callback with no TicketObject arg, guidance needed

2014-03-20 Thread Alex Vandiver
On Thu, 2014-03-20 at 17:28 -0400, Jeff Blaine wrote:
 if (! $showchildren) {
 # In theory, this should exclude all fields in @childfields
 $CustomFields-Limit(FIELD = 'Name', OPERATOR = '!=', VALUE =
 '$_', ENTRYAGGREGATOR = 'AND', CASESENSITIVE = 0) for (@childfields);
 }

Perl only interpolates variables in double quotes, not single quotes.
You want « VALUE = $_ »
   or « VALUE = $_ »
  not « VALUE = '$_' »

 - Alex

-- 
RT Training - Dallas May 20-21
http://bestpractical.com/training

Re: [rt-users] Callback with no TicketObject arg, guidance needed

2014-03-19 Thread Alex Vandiver
On Tue, 2014-03-18 at 15:55 -0400, Jeff Blaine wrote:
 This callback in share/html/Elements/EditCustomFields does not pass
 $TicketObj (and it could, but was ommitted, perhaps on purpose?):
 
 %INIT
 ...
 $m-callback( %ARGS, CallbackName = 'MassageCustomFields',
 CustomFields = $CustomFields );
 ...
 /%INIT
 
 In my MassageCustomFields callback code (per above), I am trying to
 determine if a certain CF has a value of /no/i
 
 Given the arguments available to me in the callback, I am not sure how
 to do that. All of my work in the past has involved method calls on
 $TicketObj.
 
 Debug-printing the contents of %ARGS from inside the MassageCustomFields
 callback, I see that ARGS{'Object'} = 'RT::Ticket=HASH(0x7f0b5b540db8)
 
 Just use that as my $TicketObj? Is that sane/safe?

Yes -- ish.  Note that custom fields can exist on things that aren't
tickets, and Elements/EditCustomFields is also used for them.  All
that's promised is that $Object ISA RT::Record, so you should check
$Object-isa(RT::Ticket) before you carry on.

 Additionally, if my intention is to ultimately use MassageCustomFields
 to modify $CustomFields, isn't that going to fail due to the callback
 not being passed a hash _reference_ ?

$CustomFields is an object (which are references).  So if you modify the
object (by calling -Limit on it, for instance) those changes are
preserved in the calling site.  You can't say $CustomFields =
RT::CustomFields-new(...), but you can $CustomFields-CleanSlate and
then re-add arbitrary limits.
 - Alex

-- 
RT Training - Dallas May 20-21
http://bestpractical.com/training


Re: [rt-users] Callback with no TicketObject arg, guidance needed

2014-03-19 Thread Jeff Blaine
 Yes -- ish.  Note that custom fields can exist on things that aren't
 tickets, and Elements/EditCustomFields is also used for them.  All
 that's promised is that $Object ISA RT::Record, so you should check
 $Object-isa(RT::Ticket) before you carry on.

Thanks!

Follow-up question if I may:

How might I exclude fields X, Y, Z from $CustomFields in my callback?

I saw in RT-Extension-MandatoryOnTransition some code for INcluding some
named fields with 'Limit'.

I'm not familiar with Limit (and hopefully its friends).

Should I just perldoc these files where 'sub Limit ' is found and start
digging around for comprehension?

./lib/RT/Articles.pm
./lib/RT/CustomFieldValues/External.pm
./lib/RT/Tickets.pm
./lib/RT/Links.pm
./lib/RT/Queues.pm
./lib/RT/Users.pm
./lib/RT/SearchBuilder.pm
-- 
RT Training - Dallas May 20-21
http://bestpractical.com/training


Re: [rt-users] Callback with no TicketObject arg, guidance needed

2014-03-19 Thread Alex Vandiver
On Wed, 2014-03-19 at 11:57 -0400, Jeff Blaine wrote:
 Follow-up question if I may:
 
 How might I exclude fields X, Y, Z from $CustomFields in my callback?

# Repeat for each name to exclude:
$CustomFields-Limit(
FIELD= 'Name',
OPERATOR = '!=',
VALUE= 'SomeNameToExclude',
ENTRYAGGREGATOR = 'AND',
);

 I'm not familiar with Limit (and hopefully its friends).
 
 Should I just perldoc these files where 'sub Limit ' is found and start
 digging around for comprehension?

Limit comes from DBIx::SearchBuilder -
https://metacpan.org/pod/DBIx::SearchBuilder#Limit
 - Alex

-- 
RT Training - Dallas May 20-21
http://bestpractical.com/training


[rt-users] Callback with no TicketObject arg, guidance needed

2014-03-18 Thread Jeff Blaine
Using RT 4.2.3

Hi all,

This callback in share/html/Elements/EditCustomFields does not pass
$TicketObj (and it could, but was ommitted, perhaps on purpose?):

%INIT
...
$m-callback( %ARGS, CallbackName = 'MassageCustomFields',
CustomFields = $CustomFields );
...
/%INIT

In my MassageCustomFields callback code (per above), I am trying to
determine if a certain CF has a value of /no/i

Given the arguments available to me in the callback, I am not sure how
to do that. All of my work in the past has involved method calls on
$TicketObj.

Debug-printing the contents of %ARGS from inside the MassageCustomFields
callback, I see that ARGS{'Object'} = 'RT::Ticket=HASH(0x7f0b5b540db8)

Just use that as my $TicketObj? Is that sane/safe?

Additionally, if my intention is to ultimately use MassageCustomFields
to modify $CustomFields, isn't that going to fail due to the callback
not being passed a hash _reference_ ?

-- 
RT Training - Dallas May 20-21
http://bestpractical.com/training