logo

[ELMA3] Назначение прав доступа к задаче пользователю в сценарии

В системе ELMA права на просмотр задачи имеют ее автор, исполнитель, соисполнители и начальники исполнителя. Но на практике встречаются случаи, когда такой логики недостаточно для удобного использования системы.

Примечание
Актуальная документация по PublicAPI доступна по ссылке.
Внимание!
Сценарий, указанный ниже, актуален для версий системы ELMA с 3.13 включительно.
В сценарии используются следующие переменные:
  • task – переменная типа Базовый класс задачи, список. Содержит задачи, на которые необходимо выдать права;
  • context.user – переменная типа Пользователь. Содержит пользователя, которому необходимо выдать права на просмотр.

Пример сценария с использованием PublicAPI

Пространство имен:
using EleWise.ELMA.API;
Текст сценария:
IEnumerable<TaskBase> taskList = null;
PublicAPI.Services.Security.RunWithElevatedPrivilegies(() => taskList = PublicAPI.Portal.TaskBase.Find("EndWorkDate is NULL AND Category = 1"));//EntityManager<TaskBase, long>.Instance.Find(string.Format("EndWorkDate is NULL AND Category = 1")));//фильтруем задачи по заданным критериям. Запускаем код с повышенными привелегиями (без учета прав доступа на задачи)
foreach (var task in taskList)
			{
				if (task.Permissions.Any(p => p.User == context.User))//проверяем, если у пользователя уже есть права на задачу, переходим к следующей итерации
				{
					break;
				} else//если у пользователя нет прав на задачу, создаем новый элемент набора прав для context.User
				{
					Console.WriteLine(task.Subject);
					var newPermissin = PublicAPI.Portal.Objects.Tasks.TaskBasePermission.Create();//создаем объект типа Привилегия для задачи (Привилегии на просмотр задачи)
					newPermissin.Target = task;//указываем задачу
					newPermissin.AllowChief = false;//указываем, выдавать ли права руководителю
					newPermissin.TypeRole = "CustomPermission";//указываем название роли
					newPermissin.User = context.User;//указываем пользователя
					newPermissin.UserSecuritySetCacheId = EleWise.ELMA.Security.UserSecuritySetHelper.GetUserMask(context.User.Id);//находим идентификатор кэша набора безопасности пользователя
					newPermissin.Save();// сохраняем объект типа Привилегия для задачи
				}
			}

Пример сценария без использования PublicAPI

Для корректной работы сценария необходимо подключить пространство имен:

using EleWise.ELMA.Security;
using EleWise.ELMA.Services;
using EleWise.ELMA.Tasks.Models;
using EleWise.ELMA.Model.Services;
using EleWise.ELMA.Tasks.Models;

Текст сценария:

IEnumerable<TaskBase> taskList = null;
Locator.GetServiceNotNull<SecurityService>().RunWithElevatedPrivilegies(() => taskList = EntityManager<TaskBase, long>.Instance.Find(string.Format("EndWorkDate is NULL AND Category = 1")));//фильтруем задачи по заданным критериям. Запускаем код с повышенными привелегиями (без учета прав доступа на задачи)
foreach (var task in taskList)
			{
				if (task.Permissions.Any(p => p.User == context.User))//проверяем, если у пользователя уже есть права на задачу, переходим к следующей итерации
				{
					break;
				} else//если у пользователя нет прав на задачу, создаем новый элемент набора прав для context.User
				{
					Console.WriteLine(task.Subject);
					var newPermissin = EntityManager<TaskBasePermission, long>.Instance.Create();//создаем объект типа Привилегия для задачи (Привилегии на просмотр задачи)
					newPermissin.Target = task;//указываем задачу
					newPermissin.AllowChief = false;//указываем, выдавать ли права руководителю
					newPermissin.TypeRole = "CustomPermission";//указываем название роли
					newPermissin.User = context.User;//указываем пользователя
					newPermissin.UserSecuritySetCacheId = EleWise.ELMA.Security.UserSecuritySetHelper.GetUserMask(context.User.Id);//находим идентификатор кэша набора безопасности пользователя
					newPermissin.Save();// сохраняем объект типа Привилегия для задачи
				}
			}
Внимание!
Сценарий, указанный ниже, актуален для версий системы ELMA до 3.12.1 включительно.

В сценарии используются следующие переменные:

  • task – переменная типа Базовый класс задачи, она содержит ту задачу, на которую назначаются права доступа для Заместителя;
  • nachalnik – переменная типа Пользователь, она содержит пользователя, занимающего должность начальника;
  • zamestitel – переменная типа Пользователь, она содержит пользователя, занимающего должность заместителя.

Пример сценария с использованием PublicAPI

Пространство имен:

using EleWise.ELMA.API;

Текст сценария:

//если Заместитель уже имеет права на задачу
if (task.Permissions.Any(p => p.User == zamestitel))
  //прекращаем выполнение сценария
  return;
//получаем набор прав Начальника на задачу
var permissions = task.Permissions.Where(p => p.User == nachalnik).ToList();
//если права не найдены, то прекращаем выполнение сценария
if (permissions.Count == 0)
  return;
//для каждого элемента набора прав
foreach (var permission in permissions)
{
  //создаем новый элемент набора прав для Заместителя и передаем ему те же привилегии
     var newPermissin = PublicAPI.Portal.Objects.Tasks.TaskBasePermission.Create();
  newPermissin.Target = permission.Target;
  newPermissin.TypeRole = permission.TypeRole;
  newPermissin.AllowChief = permission.AllowChief; // можно установить false, чтобы не выдавать права доступа начальникам заместителя (всякие ситуации бывают)
  newPermissin.User = zamestitel;  
//добавляем созданный элемент в набор прав доступа к задаче  
task.Permissions.Add(newPermissin);
}
//сохраняем изменения для задачи
task.Save();

Пример сценария без использования PublicAPI

Пространства имен:

using EleWise.ELMA.Model.Services;
using EleWise.ELMA.Tasks.Models;

Текст сценария:

//если Заместитель уже имеет права на задачу
if (task.Permissions.Any(p => p.User == zamestitel))
  //прекращаем выполнение сценария
  return;
//получаем набор прав Начальника на задачу
var permissions = task.Permissions.Where(p => p.User == nachalnik).ToList();
//если права не найдены, то прекращаем выполнение сценария
if (permissions.Count == 0)
  return;
//для каждого элемента набора прав
foreach (var permission in permissions)
{
  //создаем новый элемент набора прав для Заместителя и передаем ему те же привилегии
  var newPermissin = InterfaceActivator.Create<TaskBasePermission>();
  newPermissin.Target = permission.Target;
  newPermissin.TypeRole = permission.TypeRole;
  newPermissin.AllowChief = permission.AllowChief; // можно установить false, чтобы не выдавать права доступа начальникам заместителя (всякие ситуации бывают)
newPermissin.User = zamestitel;
//добавляем созданный элемент в набор прав доступа к задаче
task.Permissions.Add(newPermissin);
}
//сохраняем изменения для задачи
task.Save();

В результате после выполнения сценария пользователь, содержащийся в переменной zamestitel, получит права доступа к той задаче, которая записана в переменную task.