For reference I have been following this guide. viewtopic.php?t=42070 and I'm running Znuny 6.4.3
I am using pyOTRS library and have the web service running to call LinkAdd.
I can make the call, and it links the ticket, but I get a parse error on the return response that then breaks the script.
Any ideas?
pyOTRS error
Code: Select all
Traceback (most recent call last):
File "C:\scripts\ZnunyCreateBulkTickets\run.py", line 76, in <module>
res = client.link_add(new_ticket_id,new_parent_ticket_id)
File "C:\Program Files\Python310\lib\site-packages\pyotrs\lib.py", line 1742, in link_add
return self._parse_and_validate_response(self._send_request(payload))
File "C:\Program Files\Python310\lib\site-packages\pyotrs\lib.py", line 2196, in _parse_and_validate_response
raise ResponseParseError("Unknown key in response JSON DICT!")
pyotrs.lib.ResponseParseError: Unknown key in response JSON DICT!
Code: Select all
$VAR1 = {
'SessionID' => 'kbUNsqbKVJtrtf<removed>',
'SourceKey' => 146847,
'SourceObject' => 'Ticket',
'State' => 'Valid',
'TargetKey' => 146846,
'TargetObject' => 'Ticket',
'Type' => 'Normal'
};
Outgoing data before mapping (<remove>, debug)
$VAR1 = {
'Result' => 1
};
Returning provider data to remote system (HTTP Code: 200) (<removed>, debug)
{"Result":1}
Created GenericInterfaceLinkObjectConnector.xml in /opt/otrs/Kernel/Config/Files/XML/.
Code: Select all
<?xml version="1.0" encoding="utf-8"?>
<otrs_config version="2.0" init="Application">
<Setting Name="GenericInterface::Operation::Module###LinkObject::LinkAdd" Required="0" Valid="1">
<Description Translatable="1">GenericInterface module registration for the operation layer.</Description>
<Navigation>GenericInterface::Operation::ModuleRegistration</Navigation>
<Value>
<Hash>
<Item Key="Name">LinkAdd</Item>
<Item Key="Controller">LinkObject</Item>
<Item Key="ConfigDialog">AdminGenericInterfaceOperationDefault</Item>
</Hash>
</Value>
</Setting>
</otrs_config>
Code: Select all
# --
# Copyright (C) 2019–present Efflux GmbH, https://efflux.de/
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (GPL). If you
# did not receive this file, see https://www.gnu.org/licenses/gpl-3.0.txt.
# --
package Kernel::GenericInterface::Operation::LinkObject::LinkAdd;
use strict;
use warnings;
use Kernel::System::LinkObject;
use Kernel::System::VariableCheck qw(IsStringWithData IsHashRefWithData);
use parent qw(
Kernel::GenericInterface::Operation::Common
);
sub new {
my ($Type, %Param) = @_;
my $Self = {};
bless($Self, $Type);
# check needed objects
for my $Needed (qw(DebuggerObject WebserviceID)) {
if (!$Param{$Needed}) {
return {
Success => 0,
ErrorMessage => "Got no $Needed!",
};
}
$Self->{$Needed} = $Param{$Needed};
}
return $Self;
}
=head2 Run()
my $Result = $OperationObject->Run(
Data => {
SourceObject => 'Ticket',
SourceKey => '321',
TargetObject => 'Ticket',
TargetKey => '12345',
Type => 'ParentChild',
State => 'Valid',
UserID => 1,
},
);
$Result = {
Success => 1, # 0 or 1
ErrorMessage => '', # In case of an error
Data => {
Result => 1, # 0 or 1
},
};
=cut
sub Run {
my ($Self, %Param) = @_;
my ($UserID, $UserType) = $Self->Auth(%Param);
return $Self->ReturnError(
ErrorCode => 'LinkAdd.AuthFail',
ErrorMessage => "LinkAdd: Authorization failing!",
) if !$UserID;
# Check needed parameters.
for my $Needed (qw(SourceObject SourceKey TargetObject TargetKey Type State)) {
if (!$Param{Data}->{$Needed}) {
return $Self->ReturnError(
ErrorCode => 'LinkAdd.MissingParameter',
ErrorMessage => "LinkAdd: $Needed parameter is missing!",
);
}
}
$Param{Data}->{UserID} = $UserID; # Comment this out if you want to pass the UserID in your request.
my $Success = $Kernel::OM->Get('Kernel::System::LinkObject')->LinkAdd(%{$Param{Data}});
return {
Success => 1,
ErrorMessage => '', # In case of an error. TODO: Add debugging if wanted.
Data => {
Result => $Success, # 0 or 1
},
};
}
1;
Rebuild Config and Deleted Cache
Code: Select all
/opt/otrs/bin/otrs.Console.pl Maint::Cache::Delete
/opt/otrs/bin/otrs.Console.pl Maint::Config::Rebuild
Created Webservice GenericLinkConnectorREST
Code: Select all
---
Debugger:
DebugThreshold: debug
TestMode: '0'
Description: ''
FrameworkVersion: 6.4.3
Provider:
Operation:
LinkAdd:
Description: ''
IncludeTicketData: '0'
Type: LinkObject::LinkAdd
Transport:
Config:
AdditionalHeaders: ~
KeepAlive: ''
MaxLength: '100000000'
RouteOperationMapping:
LinkAdd:
ParserBackend: JSON
RequestMethod: []
Route: /LinkAdd
Type: HTTP::REST
RemoteSystem: ''
Requester:
Transport:
Type: ''