Скрипт уточнения права доступа

Описание скрипта

Скрипт уточняет право на определенное действие, выданное профилю пользователя.

Место настройки скрипта

В матрице прав, см. Настройка матрицы прав.

Когда выполняется скрипт

При проверке наличия права в момент совершения указанного действия с объектом.

Результат выполнения скрипта

  • Возвращает true (верно) — пользователю выдаются права на указанное действие.
  • Возвращает false (ложь) — прав нет.

Переменные и их значения

Глобальные переменные:

  • user — текущий сотрудник, пользователь. Является объектом класса "Сотрудник" (employee).
  • ip — ip-адрес рабочего места пользователя user. Если действие выполняется автоматически системой (а не пользователем), то переменная не определяется.
  • appVersion — версия приложения.
  • api — используется для обращения к методам api, например api.utils, api.ldap, api.timing, см. Методы API;
  • modules — используется для обращения к скриптовому модулю и конкретному методу, определенному в нем, с помощью конструкции: modules.{код модуля}.{имя метода}({параметры метода}...), см. Скрипт текста модуля;
  • logger — используется для отладки скриптов и позволяет вывести в лог на указанный уровень переданную строку, см. Оформление и отладка скриптов.
  • utils — синоним api.utils.

Переменные контекста:

  • subject — объект, относительно которого проверяется право (скрипт уточнения прав добавлен в матрице прав класса этого объекта).
  • oldSubject — объект, для которого проверяется право, до выполнения редактирования. Не null, когда subject не null. Если происходит изменение атрибутов, то в oldSubject хранятся значения до редактирования. Переменная может быть использована только для пользовательских атрибутов.

    При использовании переменной значение атрибутов типа "Обратная ссылка" всегда будет равно null.

    При проверке маркеров прав "Редактирование комментариев" и "Удаление комментариев", содержит объект комментария, для которого проверяются права.

  • sourceObject — объект, относительно которого проверяется право (запрос, соглашение, сотрудник, отдел, команда и т.д).

    При редактировании объекта в этой переменной null.

    При проверке на право добавления объекта, в скрипте, в переменной sourceObject будет находиться объект, на карточке которого проверялась возможность добавления объекта. В том числе, при добавлении объекта из списков, расположенных на карточке компании, в переменной sourceObject будет лежать объект "компания"(root$101).

    При добавлении объекта в скрипте уточнения прав на редактирование атрибута, выведенного на форму добавления, в переменной будет находится добавляемый объект.

    Известные исключения:

    • При добавлении объекта по кнопке добавления из верхнего меню sourceObject = null при добавлении объекта с любой карточки.
    • При добавлении объекта класса "Запрос" (serviceCall) по общей кнопке добавления из верхнего меню sourceObject = "объект сотрудник" (employee$...) при добавлении объекта с любой карточки.
    • При добавлении объекта из быстрой формы добавления, вызванной с быстрой формы добавления sourceObject = UUID временного объекта с родительской формы.
    • При проверке прав комментариев и файлов sourceObject = null. В этом случае объект, к которому добавляется комментарий или файл, находится в subject.
  • initialValues — набор значений, которые будут доступны на форме добавления объекта (в том числе форме добавления, вызванной с другой формы). Исходя из initialValues скрипт вернет true или false (есть право или нет).

    В матрице прав нужно использовать следующий механизм получения данных из initialValues: initialValues.get('PropertyCode')

    При выборе объекта в списке в скрипте уточнения права на редактирование атрибутов initialValues содержит только параметр #checkingForMassOperation = true. Параметр означает, что проверка выполняется для массовых операций в списке объектов.

  • process — код текущего процесса с объектом. Не null, если происходит изменение объекта (сохранение формы). При сохранении изменений заполняется кодом текущего запущенного процесса.

    Возможные значения: AddObject (в момент сохранения формы добавления объекта), EditObject (в момент сохранения формы редактирования объекта) и DeleteObject (в момент подтверждения удаления объекта).

    Пример использования переменной — скрипт для маркера прав "Добавление объекта", определяющий право добавления файла только на форме добавления объекта:

    if (oldSubject==null) 
    {return true}
    else
    {
    if (process=='AddObject') 
    {return true}
    else
    {return false} 
    }
  • cardObject — объект, карточка которого открывается. Если действие инициировано не из карточки объекта, то cardObject = null.

    Переменная не поддерживается в мобильном приложении.

    Переменную cardObject использовать не рекомендуется.

  • origin — тип месторасположения.

    Переменная не поддерживается в мобильном приложении.

    Возможные значения:

    • readForm (форма для чтения) — скрипт вычисляется на карточке объекта, на сложной форме добавления и редактирования связей (расширенная форма редактирования), в списке по ссылке на отдельной странице, в списке на странице результатов поиска, при нажатии на кнопку вызова действий в строке списка;
    • addForm — скрипт вычисляется на форме добавления, на быстрой форме добавления;
    • editForm — скрипт вычисляется на форме редактирования объекта, на форме редактирования атрибутов, вызванной из контента "Параметры объекта", на форме редактирования в ячейке списка, на форме быстрого редактирования, на форме массового редактирования, на форме смены типа; на форме смены ответственного, на форме смены привязки (переклассификации), на форме работы с массовостью (управление массовостью запроса), на форме смены статуса, на форме перемещения (смены родителя);
    • addFormComment/editFormComment — скрипт вычисляется на форме добавления/редактирования комментария;
    • addFormFile/editFormFile — скрипт вычисляется на форме добавления/редактирования файла.

Примеры скрипта

1. Скрипт разрешает создавать запросы только с привязкой к объектам указанных типов.

// Типы объектов(fqn), из которых можно добавить запрос. Можно указать сотрудников, отделы, команды.
def ACCEPTED_TYPES= ['employee$management','employee$ITeng'];
if(!sourceObject)
{
return true
}
return ACCEPTED_TYPES.contains(sourceObject.metaClass.toString())

2. Скрипт дает право на просмотр карточки объекта, если последний находится в одном из указанных статусов .

//ПАРАМЕТРЫ------------------------------------------------------------
//Коды статусов запроса. 
//Когда запрос будет находиться в одном из этих статусов, скрипт будет возвращать true (давать права).
def STATES = ['registered','closed']
//ОСНОВНОЙ БЛОК--------------------------------------------------------
return (subject == null && STATES.contains('registered')) || (subject != null && STATES.contains(subject.state))

3. Скрипт для маркера "Редактирование комментариев" матрицы прав, дающий право редактировать созданный комментарий только в течение какого-то времени.

// количество секунд, в течение которых комментарий будет доступен для редактирования
def ALLOWED_TIME_IN_SECONDS = 2 * 60 // 2 минуты = 2 * 60 секунд
//ОСНОВНОЙ БЛОК--------------------------------------------------------
return System.currentTimeMillis() - oldSubject.creationDate.time < ALLOWED_TIME_IN_SECONDS * 1000