BPMApps. Создание модуля с собственными привилегиями к объекту или модулю
Пример отображения данных

Рис. 1. Страница со списком объектов MyObject

Рис. 2. Расширенная карточка объекта MyObject
Пример реализации
Перед созданием модуля необходимо создать объекты MyObject и MyObjectPermissions. Структура объектов:
Рис. 3. Структура объекта MyObject

Рис. 4. Структура объекта MyObjectPermissions
В объекте MyObjectSettings необходимо добавить реализуемый интерфейс EleWise.ELMA.Security.Services.ISecuritySetIdHolder, а также установить флажок Дополнительный код, как представлено на рис. 5.
Рис. 5. Реализуемый интерфейс и установка галочки «Дополнительный код»
Дополнительный код:
using System;
using EleWise.ELMA.Model.Entities;
using EleWise.ELMA.Security.Models;
using EleWise.ELMA.Security.Services;
namespace EleWise.ELMA.ConfigurationModel
{
public partial class MyObjectPermissions
{
public virtual IEntity Assigned
{
get //Получаем значение свойства в зависимости от обладателя привилегии
{
if (User != null)
return User;
if (Group != null)
return Group;
if (OrganizationItem != null)
return OrganizationItem;
if (this.OrganizationItemEmployee != null)
return OrganizationItemEmployee;
return null;
}
set //Определяем тип значения и задаем его в созданное свойство обладателя привилегии
{
if (value is User)
User = (User)value;
else if (value is UserGroup)
Group = (UserGroup)value;
else if (value is OrganizationItem)
{
var organizationItem = (OrganizationItem)value;
if (organizationItem.ItemType == OrganizationItemType.Position)
OrganizationItem = organizationItem;
else
OrganizationItemEmployee = organizationItem;
}
else
throw new ArgumentException(value.ToString());
}
}
public virtual object Target
{
get { return MyObject; } // Получаем значение сущности, на которую предоставлена привилегия
set { MyObject = (MyObject)value; } // Задаем значение свойства с приведением к типу
}
public virtual Guid TypeRoleId
{
get { return PermissionRole; } // Получаем значение
set { PermissionRole = value; } // Задаем значение свойства
}
}
}
На вкладке Сценарии в подразделе Глобальные модули был создан новый модуль Permissions. В модулях можно реализовывать различные точки расширения, например, как в данном примере, реализовать права доступа, изменить ссылку на попап-окно и так далее. Для того, чтобы начать разработку модуля, необходимо нажать на кнопку Добавить файл, дать ему название и реализовать его. Данный файл эквивалентен классу в Visual Studio. В том случае, если необходимо подключить дополнительные сборки, следует в дереве справа вызвать контекстное меню (правой кнопкой мыши) и нажать на кнопку Добавить ссылку на сборку. Чтобы Ваш модуль начал работать, его необходимо опубликовать, а затем перезапустить сервер.
Для реализации точек расширения по добавлению собственных прав доступа была использована следующая статья.

Рис. 6. Структура модуля Permissions
В объекте MyObject изменены представления просмотра и редактирования. Представления реализованы при помощи конструктора форм с дополнительным кодом для кнопки в тулбаре. Отображение карточки объекта MyObject представлено на рис. 1. Представление также реализовано в Дизайнере ELMA. Данная реализация необходима для добавления дополнительной кнопки в тулбаре формы просмотра объекта, в данном примере этой кнопкой является кнопка Настройки, представленной на рис. 2.
Рис. 7. Конструктор форм объекта IMyObject
В формах Редактирование и Создание добавлено только одно поле Наименование, тогда как в форму Просмотр была добавлена панель с дополнительным кодом, которая представлена на рис. 8.
Рис. 8. Панель с дополнительным кодом в форме "Просмотр" объекта IMyObject
Код формы Razor MyObjectView:
@inherits RootViewItemControl<MyObject>
@using EleWise.ELMA.ConfigurationModel
@using EleWise.ELMA.Web.Mvc.Views.ViewItem
@using EleWise.ELMA.Model.Services
@using EleWise.ELMA.Web.Mvc.ExtensionPoints
@(Html.Toolbar()
.Group("tb-group1")
.Button(b => b
.Uid("toolbar-action-Settings")
.Text(SR.T("Настройки"))
.IconUrl("#x32/settings.png")
.Url(Url.Action("EntityPermissionSettings", "PermissionManagment", new { area = "EleWise.ELMA.BPM.Web.Security", id = Model.Id, type = EleWise.ELMA.Model.Services.InterfaceActivator.TypeOf<IMyObject>().AssemblyQualifiedName }))
)
)

Рис. 9. Пример создания представления MyObjectView в Дизайнере
В данном примере помимо реализации прав доступа была реализована страница со списком объектов IMyObject. На вкладке Интерфейс была добавлена новая страница. В контекст страницы был добавлен блок с единственным полем Наименование типа MyObject. В контроллере был использован следующий код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using EleWise.ELMA.Model.Common;
using EleWise.ELMA.Model.Entities;
using EleWise.ELMA.Model.Managers;
using EleWise.ELMA.Model.Types.Settings;
using EleWise.ELMA.ConfigurationModel;
using Permissions;
using EleWise.ELMA.API;
using EleWise.ELMA.UI.Controllers;
using EleWise.ELMA.UI.Models;
using EleWise.ELMA.UI.Results;
namespace EleWise.ELMA.UI.Pages
{
/// <summary>
/// Контроллер страницы "Список объектов"
/// </summary>
public partial class ObjectsListController : PageController<ObjectsList.Index>
{
/// <summary>
/// Загрузка страницы
/// </summary>
public override void Index_Load (PageLoadViewModel<ObjectsList.Index> page)
{
var current = PublicAPI.Portal.Security.User.GetCurrentUser();
bool visible = false;
if (PublicAPI.Services.Security.HasPermission(current, ModulePermissions.ModuleAccessPermission))
{
visible = true;
var myObjectItems = PublicAPI.Objects.UserObjects.UserMyObject.Find(FetchOptions.All);
foreach (var item in myObjectItems) {
var block = EntityManager<ObjectsList.Index_SpisokObjektov>.Create();
block.Object = (MyObject)item;
page.Context.SpisokObjektov.Add (block);
}
}
page.Form.For(c => c.SpisokObjektov).Visible(visible);
}
/// <summary>
/// Add
/// </summary>
/// <param name="page"></param>
public virtual void Add (PageViewModel<ObjectsList.Index> page)
{
var uid = PublicAPI.Objects.UserObjects.UserMyObject.TypeUid.ToString();
page.RedirectToUrl(string.Format("/Common/Catalogs/Add?uid={0}", uid));
}
}
}
В коде контроллера также присутствует реализация для кнопки, которая была добавлена на вкладке Панель кнопок. Данная кнопка будет отвечать за создание новой записи в объекте. Как можно заметить, при нажатии на кнопку будет совершен переход по адресу "/Common/Catalogs/Add?uid=, который отвечает за добавление новой записи в объект MyObject.
Как Вы можете заметить, в коде контроллера страницы используется проверка прав доступа к модулю, реализованная в модуле Permissions. Чтобы появилась возможность использовать методы модуля, необходимо подключить его. Для этого нужно в дереве справа нажать правой кнопкой мыши, затем появится контекстное меню, где можно выбрать Добавить ссылку на сборку, в появившемся окне перейти на вкладку Глобальные модули и выбрать доступный модуль, в котором реализованы необходимые методы. После добавления модуля он должен появиться в дереве справа в папке Модули.

Рис. 10. Добавление модуля в ссылки
Чтобы страница стала доступна в веб-приложении, её необходимо опубликовать, перезапуск сервера при этом не требуется.
Чтобы использовать созданную Вами страницу, можно добавить новый пункт меню в интерфейсах в администрировании, в котором при добавлении ссылки в появившемся диалоговом окне нажать на кнопку Дополнительно, в появившемся дереве найти пункт Страницы конфигурации и выбрать Вашу страницу. Теперь при переходе в созданный Вами пункт меню будет осуществлен переход на Вашу страницу.
Рис. 11. Добавление пункта меню со ссылкой на страницу

Рис. 12. Добавление прав доступа на страницу