⌘ K

ServiceDesk Plus · Для администраторов

Основы Deluge

Deluge поддерживает типы данных, условия, циклы, функции и операторы возврата, сравнимые с C++, Python, Java, JavaScript и Swift. Далее подробно рассматриваются основы Deluge.

 

Типы данных

Deluge поддерживает типы text, number, boolean, map и collection и встроенные функции для каждого. В редакторе Deluge введите точку после переменной, чтобы увидеть доступные встроенные функции.

 

Текст (Text)

myText = "Hello World!";

Встроенные функции Text доступны здесь.

 

Число (Number)

number = -123.4;

Встроенные функции Number доступны здесь.

 

Логический (Boolean)

 

result = true;

result = false;

 

Дата и время (Date/Time)

Позволяет хранить дату и время в переменной. Встроенные функции добавляют дни, месяцы, время и другое.

 

Для преобразования стандартного формата даты в другой используйте синтаксис:

 

date='1-Jan-1990 20:50:36';

newDate = date.toTime().toString("yyyy-MM-dd'__Hello__'HH:mm:ss");

 

В этом примере newDate равно 1990-01-01__Hello__20:50:36.

 

Для преобразования времени в миллисекунды:

date='1-Jan-1990 20:50:36';

timeInMs = date.toTime().toLong();

 

В этом примере timeInMs равно 631255836000.

Другие встроенные функции Date-Time доступны здесь.

 

Словарь (Map)

Map хранит пары ключ — значение, как показано ниже:

userEmail = {"john":"john@manageengine.com", "peter":"peter@manageengine.com"};

userEmail.put("Andrew", "andrew@manageengine.com"); //a key-value pair will be added.

emailOfJohn = userEmail.get("john"); //value of 'emailOfJohn' will be 'john@manageengine.com'.

 

Также можно сначала объявить переменную, затем задать значение.

userEmail = map();

userEmail.put("john","john@manageengine.com");

emailOfJohn = userEmail.get("john");

 

Коллекция (Collection)

Collection хранит массив данных; также можно хранить пары ключ — значение. Синтаксис:

userNames = {"john", "peter"};

 

Также можно сначала объявить переменную, затем задать значение.

userNames = Collection();

userNames.put("john");

userNames.put("peter");

 

Для перебора Collection используйте 'for each', как показано ниже:

for each <myvariable> in <collection>

{

}

 

Пример

userNames = {"john","peter"};

for each name in userNames{

info "Name is" + name;

}

 

После отладки получен следующий ответ:

Name is john

Name is peter

 

Встроенные функции Collection доступны здесь.

 

Преобразование типов

Deluge предоставляет функции преобразования переменной из одного типа в другой.

Рассмотрим получение месяца как числа из строки dateInCalendar.

 

dateInCalendar = '01/02/2000';

monthAsString =

dateInCalendar.subString(3,5);

monthAsNumber =

monthAsString.toNumber();

info monthAsNumber;

После отладки получен следующий ответ:

2

 

Другие функции преобразования типов доступны здесь.

 

Условие

Deluge поддерживает if и else if со следующим синтаксисом:

 

if ( <expression> )

{

}

else if ( <expression> )

{

}

else

{

}

 

Пример

a=10;

b=20;

c=30;

if( a > b && a > c){

info "a is big";

}

else if ( b > c && b >a ){

info "b is big";

}

else{

info "c is big";

}

 

После отладки приведённого кода получен следующий ответ:

c is big

 

Вызовы API через Deluge

Deluge позволяет легко вызывать API сторонних приложений из ServiceDesk Plus.

REST API ServiceDesk Plus позволяет выполнять все операции веб-клиента. О доступных API и их структуре см. документацию V3 API в приложении: Admin >> General >> API.
 

API вызывается от имени специалиста, ключ которого настроен в функции. Вызовы других экземпляров службы поддержки доступны при достаточных правах этой учётной записи.

 

Вызовы API внутри ServiceDesk Plus

Для вызовов внутри ServiceDesk Plus используйте синтаксис:

 

response = invokeurl

[

url: "http://servername:portnumber/api/v3/<....>"

type: POST\GET\PUT\DELETE

parameters: {"input_data":<INPUT_DATA>,"TECHNICIAN_KEY":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","PORTALID":<HELPDESKID>}

];

 

Примеры вызовов API

1. Получение списка заявок ИТ-службы поддержки

resp = invokeurl

[

url: "http://servername:portnumber/api/v3/requests"

type:GET

parameters: {"TECHNICIAN_KEY":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","PORTALID":<HELPDESKID>}

];

 

 

2. Получение первых 50 созданных в приложении открытых заявок

resp = invokeurl

[

url: "http://servername:portnumber/api/v3/requests"

type:GET

parameters: {"input_data":{"list_info":{"row_count":"50","search_criteria":{"field":"status.name","condition":"is","value":"Open"}}},"TECHNICIAN_KEY":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","PORTALID":<HELPDESKID>}

];

 

 

3. Создание заявки с темой 'New Issue'

 

resp = invokeurl

[

url: "http://servername:portnumber/api/v3/requests"

type: POST

parameters: {"input_data":{"request":{"subject":"new issue"}},"TECHNICIAN_KEY":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","PORTALID":helpdeskID}

];

 

Ответ API в переменной resp имеет формат JSON, поскольку V3 API ServiceDesk Plus возвращает JSON. Далее resp используется как обычная переменная. Ответ API нужно обрабатывать как Map.

 

Задачи интеграции

Задачи интеграции — стандартные функции Deluge, упрощающие взаимодействие с API.

 

Раньше invokeURL отправлял в ServiceDesk Plus внешние HTTP-запросы, как стороннее приложение. Задачи интеграции выполняют вызовы внутри приложения встроенными методами, без ручного создания HTTP-соединений и прохождения сетевого уровня.

 

Поддерживаемые модули: пользовательские модули веб-вкладок с включёнными функциями, заявки, проблемы, изменения, проекты и релизы.
  
 

Синтаксис

Синтаксис задачи интеграции: 

sdp*.<poral_short_name>.<entity*>.<action*>(<parameters*>); 

Автодополнение редактора Deluge предлагает соответствующие сущности и действия при вводе.

 

Структура параметров:

Элемент

Описание

*

Обозначает обязательные параметры синтаксиса.

<portal_short_name>

Короткое имя экземпляра, к данным модуля которого требуется доступ или изменение. Подробнее.

<entity>

Имя модуля для доступа или изменения данных. Для вложенной сущности укажите иерархию с именами родительских сущностей через точки.

<action>

Операция над сущностью, например create, update или get.

<parameters>

Значения параметров действия через запятую. Укажите все параметры; для необязательных используйте NULL.

 

 Примечание: можно использовать portalID или короткое имя портала. 

 

ТИП ОПЕРАЦИИ

СТРУКТУРА ПАРАМЕТРОВ

HTTP POST

sdp.<entity>.<action>( inputData,  portalID,  <connection> );                     

Example: sdp.requests.add(input_data, 901, "admin" );

 

sdp.<parent_entity>.<entity>.<action>( parentURL,  inputData,  portalID,  <connection> );           

Example: sdp.cm_cm1s.cm_custom_sub_entities.add("/cm_cm1s/1", input_data, null, "sdpop" );

 

sdp.<poral_short_name>.<entity>.<action> ( inputData, <connection> );    

Example: sdp.hr.cm_custom_records.add(inputData , "admin" );

 

sdp.<poral_short_name>.<parent_entity>.<entity>.<action>( parentURL,  inputData,  <connection> );

Example: sdp.as1.changes.tasks.comments.add("/changes/100000012/tasks/100000066" , inputData, "admin" );

HTTP PUT

sdp.<entity>.<action>( entityID, inputData,  portalID,  <connection> );      

Example: sdp.releases.assign(100000087, inputData, 301, "admin_integ" );

 

sdp.<parent_entity>.<entity>.<action>( parentURL,  entityID, inputData,  portalID,  <connection> );  

Example: sdp.projects.members.edit("/projects/3", ids, inputData, 1, "admin_integ" );

 

sdp.<poral_short_name>.<entity>.<action> ( entityID, inputData, <connection> );

Example: sdp.hr.changes.close_change(200000009, inputData, "admin_integ" );

 

sdp.<poral_short_name>.<parent_entity>.<entity>.<action>( parentURL,  entityID, inputData,  <connection> );

Example:  sdp.fh.problems.tasks.mark("/problems/100000004", 100000001, inputData, "admin_integ" );

HTTP DELETE

sdp.<entity>.<action>( entityID,  portalID,  <connection> );    

Example:  sdp.requests.move_to_trash(IDs, null, "admin_integ" );

 

sdp.<parent_entity>.<entity>.<action>( parentURL,  entityID,  portalID,  <connection> );

Example: sdp.problems.tasks.comments.delete("/problems/100000001/tasks/100000001", 11, 301, "admin" );  

 

sdp.<poral_short_name>.<entity>.<action> ( entityID,  <connection> );    

Example:  sdp.bla.cm_cm1s.delete(100000001, "admin_integ" );

 

sdp.<poral_short_name>.<parent_entity>.<entity>.<action>( parentURL,  entityID,  <connection> );  

Example: sdp.fh.releases.tasks.delete("/releases/100000004", 100000001, "admin_integ" );

ВСПОМОГАТЕЛЬНЫЕ ОПЕРАЦИИ GET

sdp.<entity>.<action>( entityID, inputData,  portalID,  <connection> );      

Example: sdp.requests.get_approval_notification_content(1, null, null, "sdpop" );

 

sdp.<parent_entity>.<entity>.<action>( parentURL,  entityID, inputData,  portalID,  <connection> );  

Example : sdp.projects.milestones.tasks.worklogs.get_time_spent("/projects/300000004/milestones/300000003/tasks/3000000010", 300000001, inputData, 901, "admin_integ" );

 

sdp.<poral_short_name>.<entity>.<action> ( entityID, inputData, <connection> );

Example: sdp.hr.changes.get_permissions(100000001, null, "sdpop" );

 

sdp.<poral_short_name>.<parent_entity>.<entity>.<action>( parentURL,  entityID, inputData,  <connection> );

Example: sdp.fh.requests.worklogs.summary("/requests/300000003", 300000045, null, "admin_integ" );

ПОЛУЧЕНИЕ ОДНОЙ СУЩНОСТИ

sdp.<entity>.get( entityID,  portalID,  <connection> );     

Example : sdp.requests.get(300000045, 901, "admin" );

 

sdp.<parent_entity>.<entity>.get( parentURL,  entityID,  portalID,  <connection> );      

Example :  sdp.projects.members.get("/projects/3", 5, 1, "admin_integ" );

 

sdp.<poral_short_name>.<entity>.get( entityID,  <connection> );  

Example :  sdp.bla.cm_cm1s.get(100000001, "admin_integ" );

 

sdp.<poral_short_name>.<parent_entity>.<entity>.get( parentURL,  entityID,  <connection> );    

Example :  sdp.fh.requests.worklogs.get("/requests/300000003", 300000045, "admin_integ" );

ПОЛУЧЕНИЕ СПИСКА

sdp.<entity>.get_list( inputData,  portalID,  <connection> );

Example : sdp.requests.get(inputData, 901, "admin" );  

 

sdp.<parent_entity>.<entity>.get_list( parentURL,  inputData,  portalID,  <connection> );     

Example:  sdp.projects.members.get("/projects/3", null, 1, "admin_integ" );

 

sdp.<poral_short_name>.<entity>.get_list( inputData,  <connection> )  
Example :  sdp.bla.cm_cm1s.get(null, "admin_integ" );

 

sdp.<poral_short_name>.<parent_entity>.<entity>.get_list( parentURL,  inputData,  <connection> );

Example :  sdp.fh.requests.worklogs.get("/requests/300000003", inputData, "admin_integ" );

 

Синтаксис параметров

Параметр

Тип

Описание

parentURL

Текст (Text)

Сведения о родительской сущности в URL без /api/v3 и конечной точки самой сущности.

Пример: для https://zylker.com/api/v3/requests/1/tasks/1 параметр parentURL может быть /requests/1.

entityID

Число, список (Number, List)

ID сущности, над которой выполняется действие.

portalID

Число (Number)

Используйте параметр, если имя портала не указано в синтаксисе.

В подсказках перечислены все доступные пользователю порталы. Retired и порталы с истёкшими лицензиями не показываются.

Используйте Null или 1 для IT-портала и соответствующие ID для остальных. Вызовы API возможны между порталами.

inputData

JSON, Map

Входные данные в JSON.

connection

Текст (Text)

Имя ссылки соединения.

Соединения можно создавать, аутентифицировать и управлять ими прямо со страницы функций через Manage в подсказках либо кнопку Connections в правом верхнем углу.

Вызовы API внешних приложений

Для вызовов внешних приложений используйте следующий синтаксис:

resp = invokeurl[

url: <URL>

type: <GET|POST|PUT|DELETE|PATCH>

parameters: <PARAMETERS>

headers: <HEADERS>

files: <FILE_NAME>

connection: <CONNECTIONS>

];

 

Заполните сведения функции по следующим указаниям:

<URL>: Provide your API URL.

<PARAMETERS>: Specify the parameters of your API.

<HEADERS>: Provide the authorization details of the third-party application. For example, if your API accepts 'authtoken', then provide the authtoken generated for the third party application.

<FILE_NAME>: If you are triggering an API to submit a file (received from another API's response), specify the file name in this space.

<CONNECTIONS>: Select stored authorization details instead of hard-coding the credentials. You can also create and manage connections directly from the Custom Function :
* Для создания соединения нажмите Manage или Connections. 
* Для существующего соединения нажмите <connection> и выберите его из подсказок.

 

Иллюстрация 1: Основы Deluge