protected XObjectRightsDescr createObjectRightsDescr(XObjectRights rights) { XObjectRightsDescr rightsDescr = new XObjectRightsDescr(); rightsDescr.DenyDelete = !rights.AllowDelete; rightsDescr.DenyChange = !rights.AllowParticalOrFullChange; ICollection readOnlyPropNames = rights.GetReadOnlyPropNames(); rightsDescr.ReadOnlyProps = new string[readOnlyPropNames.Count]; readOnlyPropNames.CopyTo(rightsDescr.ReadOnlyProps, 0); return(rightsDescr); }
private XTreeMenuInfo getMenuForEmployee(Guid ObjectID, DomainObjectDataSet dataSet, IXExecutionContext context) { XTreeMenuInfo menu = new XTreeMenuInfo("@@Title", true); menu.CacheMode = XTreeMenuCacheMode.NoCache; menu.ExecutionHandlers.Add(new XUserCodeWeb("CompanyTree_Menu_ExecutionHandler")); // просмотр // Раскоментировать после удаления ссылок на НСИ //menu.Items.AddActionItem("Просмотр", StdActions.DoView).Parameters.Add("ReportURL", StdMenuUtils.GetEmployeeReportURL(context.Config, ObjectID)); DomainObjectData xobj = dataSet.GetLoadedStub("Employee", ObjectID); XObjectRights rights = XSecurityManager.Instance.GetObjectRights(xobj); // Редактировать if (rights.AllowParticalOrFullChange) { menu.Items.AddActionItem("Редактировать", StdActions.DoEdit).Default = true; } // Удалить if (rights.AllowDelete) { menu.Items.AddActionItem("Удалить", StdActions.DoDelete); } // Секция "Отчеты" //XMenuActionItem item; //XMenuSection sec = menu.Items.AddSection("Отчеты"); //item = sec.Items.AddActionItem("Сальдо ДС", "DoView"); //item.Parameters.Add("ReportURL", "x-get-report.aspx?name=r-EmployeeSaldoDS.xml&EmployeeID=@@ObjectID"); /* * item = sec.Items.AddActionItem("Инциденты и списания времени сотрудника", "DoRunReport"); * item.Parameters.Add("ReportName", "ReportEmployeeExpensesList"); * item.Parameters.Add("UrlParams", ".Employee=" + ObjectID); * item = sec.Items.AddActionItem("Баланс списаний сотрудника", "DoRunReport"); * item.Parameters.Add("ReportName", "EmployeeExpensesBalance"); * item.Parameters.Add("UrlParams", ".Employee=" + ObjectID); * item = sec.Items.AddActionItem("Плановая занятость сотрудников", "DoRunReport"); * item.Parameters.Add("ReportName", "Employment"); * item.Parameters.Add("UrlParams", ".Employees=" + ObjectID + "&.Organizations=&.Departments="); */ // Секция "Информация" XMenuSection sec = menu.Items.AddSection("Информация"); fillEmployeeInfoSection(sec, ObjectID, context.Connection); return(menu); }
/// <summary> /// Получение меню в runtime для уровня (treeLevelInfo задан) или пустой иерархии (treeLevelInfo равен null) /// </summary> /// <param name="treeLevelInfo">описание уровня, для которого запрашивается меню, или null</param> /// <param name="request">параметры с клиента</param> /// <returns></returns> public XTreeMenuInfo GetMenu(XTreeLevelInfoIT treeLevelInfo, XGetTreeMenuRequest request, IXExecutionContext context) { DomainObjectDataSet dataSet = new DomainObjectDataSet(context.Connection.MetadataManager.XModel); DomainObjectData xobj = dataSet.GetLoadedStub(request.Path.PathNodes[0].ObjectType, request.Path.PathNodes[0].ObjectID); XTreeMenuInfo menu = new XTreeMenuInfo("@@Title", true); menu.CacheMode = XTreeMenuCacheMode.NoCache; XMenuActionItem item; XObjectRights rights = XSecurityManager.Instance.GetObjectRights(xobj); if (rights.AllowParticalOrFullChange) { item = menu.Items.AddActionItem("Редактировать", StdActions.DoEdit); item.Hotkey = "VK_ENTER"; item.Parameters.Add("RefreshFlags", "TRM_NODE+TRM_PARENTNODE"); } XNewObjectRights create_rights = XSecurityManager.Instance.GetRightsOnNewObject(dataSet.CreateNew(xobj.ObjectType, true)); if (create_rights.AllowCreate) { item = menu.Items.AddActionItem("Создать", StdActions.DoCreate); item.Hotkey = "VK_INS"; item.Parameters.Add("RefreshFlags", "TRM_TREE"); if (rights.AllowDelete) { menu.Items.AddSeparatorItem(); } } if (rights.AllowDelete) { item = menu.Items.AddActionItem("Удалить", StdActions.DoDelete); item.Hotkey = "VK_DEL"; item.Parameters.Add("RefreshFlags", "TRM_TREE"); } return(menu); }
/// <summary> /// Метод выполнения операции, типизированная реализация /// </summary> /// <param name="oRequest">Объект-запрос на выполнение операции</param> /// <param name="oContext">Представление контекста выполнения операции</param> /// <returns> /// Экземпляр объекта-результата выполнения операции /// </returns> public XResponse Execute(XDeleteObjectRequest oRequest, IXExecutionContext oContext) { // Проверка параметров запроса XRequest.ValidateRequiredArgument(oRequest.TypeName, "XDeleteObjectRequest.TypeName"); XRequest.ValidateRequiredArgument(oRequest.ObjectID, "XDeleteObjectRequest.ObjectID"); DomainObjectData objData = DomainObjectData.CreateStubLoaded(oContext.Connection, oRequest.TypeName, oRequest.ObjectID); XObjectRights rights = XSecurityManager.Instance.GetObjectRights(objData); if (!rights.AllowDelete) { throw new XSecurityException(String.Format( "Выполнение операции невозможно: нет прав на удаление объекта \"{0}\" ({1}[oid='{2}'])", objData.TypeInfo.Description, oRequest.TypeName, oRequest.ObjectID )); } // Вызываем метод подсистемы Storage (уровень Level-2); экземпляр // Storage представлен в рамках контекста выполнения опеарции return(new XDeleteObjectResponse(XStorageGateway.Delete(oContext, oRequest.TypeName, oRequest.ObjectID))); }
/// <summary> /// Метод записи прав на существующий объект в параметр "ObjectRights" объекта-пункта меню /// </summary> /// <param name="menuitem">объект - пункт меню</param> /// <param name="rights">права на существующий объект</param> public static void Write(XMenuActionItem menuitem, XObjectRights rights) { StringBuilder bld = new StringBuilder(); //права на удаление if (!rights.AllowDelete) { bld.Append(".deny-delete:1;"); } //права на изменение свойств if (!rights.AllowParticalOrFullChange) { bld.Append(".deny-change:1;"); } //если есть свойства,доступные только для чтения - также записываем их else if (rights.HasReadOnlyProps) { writeReadOnlyProps(bld, rights.GetReadOnlyPropNames()); } if (bld.Length > 0) { menuitem.Parameters.Add("ObjectRights", bld.ToString()); } }
private XTreeMenuInfo getMenuForOrganization(Guid ObjectID, DomainObjectDataSet dataSet, IXExecutionContext context) { XTreeMenuInfo menu = new XTreeMenuInfo("@@Title", true); XMenuActionItem item; menu.CacheMode = XTreeMenuCacheMode.NoCache; menu.ExecutionHandlers.Add(new XUserCodeWeb("CompanyTree_Menu_ExecutionHandler")); // Создать отдел DomainObjectData xobjDep = dataSet.CreateNew("Department", true); xobjDep.SetUpdatedPropValue("Organization", ObjectID); XNewObjectRights create_right = XSecurityManager.Instance.GetRightsOnNewObject(xobjDep); if (create_right.AllowCreate) { item = menu.Items.AddActionItem("Создать отдел", StdActions.DoCreate); item.Parameters.Add("ObjectType", "Department"); item.Parameters.Add("URLPARAMS", ".Organization=@@ObjectID&IsHomeOrg=@@IsHomeOrg"); item.Parameters.Add("RefreshFlags", "TRM_CHILDS+TRM_NODE"); } // Создать сотрудника DomainObjectData xobj = dataSet.CreateNew("Employee", true); xobj.SetUpdatedPropValue("Organization", ObjectID); create_right = XSecurityManager.Instance.GetRightsOnNewObject(xobj); if (create_right.AllowCreate) { item = menu.Items.AddActionItem("Создать сотрудника", StdActions.DoCreate); item.Parameters.Add("RefreshFlags", "TRM_CHILDS+TRM_NODE"); item.Parameters.Add("ObjectType", "Employee"); item.Parameters.Add("URLPARAMS", ".Organization=@@ObjectID&IsHomeOrg=@@IsHomeOrg"); } if (menu.Items.Count > 0) { menu.Items.AddSeparatorItem(); } xobj = dataSet.GetLoadedStub("Organization", ObjectID); XObjectRights rights = XSecurityManager.Instance.GetObjectRights(xobj); // Редактировать if (rights.AllowParticalOrFullChange) { item = menu.Items.AddActionItem("Редактировать", StdActions.DoEdit); item.Default = true; item.Hotkey = "VK_ENTER"; item.Parameters.Add("RefreshFlags", "TRM_CHILDS+TRM_NODE"); } // Удалить if (rights.AllowDelete) { menu.Items.AddActionItem("Удалить отдел", StdActions.DoDelete).SeparatorBefore = true; } // Секция "Информация" /* * XMenuSection sec = menu.Items.AddSection("Информация"); * sec.Items.AddInfoItem("", "@@IsTemporary"); * sec = menu.Items.AddSection("Отчеты"); * item = sec.Items.AddActionItem("Норма рабочего времени", "DoRunReport"); * item.Parameters.Add("ReportName", "EmployeesRate"); * item.Parameters.Add("UrlParams", ".Department=" + Guid.Empty + "&.Organization=" + ObjectID); * item = sec.Items.AddActionItem("Плановая занятость сотрудников", "DoRunReport"); * item.Parameters.Add("ReportName", "Employment"); * item.Parameters.Add("UrlParams", ".Employees=&.Departments=&.Organizations=" + ObjectID); */ return(menu); }
public const string ATTR_CHANGE_RIGHT = "change-right"; // атрибут объекта - запрещено изменять весь объект public static void ProcessObject(DomainObjectData xobj, XmlElement xmlObject) { if (xobj == null) { throw new ArgumentNullException("xobj", "Не задано типизированное представление объекта"); } if (xmlObject == null) { throw new ArgumentNullException("xmlObject"); } if (xobj.Context == null) { throw new ArgumentException("Экземпляр DomainObjectData должен находиться в контексте (DomainObjectDataSet)"); } XmlElement xmlProp; // получим права текущего пользователя приложения на загруженный объект XObjectRights rights = XSecurityManager.Instance.GetObjectRights(xobj); if (!rights.AllowParticalOrFullRead) { throw new XSecurityException("Чтение объекта " + xobj.ObjectType + "[" + xobj.ObjectID.ToString() + "] запрещено"); } // право на удаление объекта xmlObject.SetAttribute(ATTR_DELETE_RIGHT, rights.AllowDelete ? "1" : "0"); // если объект запрещено изменять (хотя бы одно свойство) - поменям атрибутом xmlObject.SetAttribute(ATTR_CHANGE_RIGHT, rights.AllowParticalOrFullChange ? "1" : "0"); if (rights.AllowParticalOrFullChange && rights.HasReadOnlyProps) { // можно изменять объект, но есть read-only свойства foreach (string sProp in rights.GetReadOnlyPropNames()) { xmlProp = (XmlElement)xmlObject.SelectSingleNode(sProp); /* Убрано за ненадобностью * if (xmlProp == null) * throw new ApplicationException("Подсистема ограничения доступа вернула в описании прав на объект " + xmlObject.LocalName + " read-only свойство, которое отсутствует в xml-объекте: " + sProp); */ if (xmlProp != null) { xmlProp.SetAttribute(ATTR_READONLY, "1"); } } } if (rights.HasHiddenProps) { foreach (string sProp in rights.GetHiddenPropNames()) { xmlProp = (XmlElement)xmlObject.SelectSingleNode(sProp); if (xmlProp != null) { xmlObject.RemoveChild(xmlProp); } } } // по всем объектам-значениям в прогруженных свойствах foreach (XmlElement xmlObjectValue in xmlObject.SelectNodes("*/*[*]")) { DomainObjectData xobjValue = xobj.Context.Find(xmlObjectValue.LocalName, new Guid(xmlObjectValue.GetAttribute("oid"))); if (xobjValue == null) { throw new ApplicationException("Не удалось найти в контексте типизированного объекта DomainObjectData для xml-объекта-значения свойства " + xmlObjectValue.ParentNode.LocalName + " объекта " + xmlObject.LocalName); } ProcessObject(xobjValue, xmlObjectValue); } }
private XTreeMenuInfo getMenuForIncidentCategory(Guid objectID, DomainObjectDataSet dataSet, IXExecutionContext context) { // загрузим текущую категорию DomainObjectData xobj = dataSet.Load(context.Connection, "IncidentCategory", objectID); DomainObjectData xobjNew; XTreeMenuInfo menu = new XTreeMenuInfo("@@Title", true); menu.CacheMode = XTreeMenuCacheMode.NoCache; menu.ExecutionHandlers.Add(new XUserCodeWeb("IncidentCategoryMenu_ExecutionHandler")); XMenuActionItem item; Guid incidentTypeID = (Guid)xobj.GetLoadedPropValue("IncidentType"); // —оздать (на том же уровне, в том же типе инцидента) xobjNew = dataSet.CreateStubNew(xobj.ObjectType); xobjNew.SetUpdatedPropValue("IncidentType", incidentTypeID); xobjNew.SetUpdatedPropValue("Parent", xobj.GetLoadedPropValue("Parent")); XNewObjectRights create_rights = XSecurityManager.Instance.GetRightsOnNewObject(xobjNew); if (create_rights.AllowCreate) { item = menu.Items.AddActionItem("—оздать", StdActions.DoCreate); item.Hotkey = "VK_INS"; item.Parameters.Add("RefreshFlags", "TRM_PARENT"); StringBuilder bld = new StringBuilder(".IncidentType="); bld.Append(incidentTypeID); if (xobj.GetLoadedPropValue("Parent") is Guid) { bld.Append("&.Parent="); bld.Append((Guid)xobj.GetLoadedPropValue("Parent")); } item.Parameters.Add("UrlParams", bld.ToString()); } // —оздать подчиненную (в том же типе инцидента) xobjNew = dataSet.CreateStubNew(xobj.ObjectType); xobjNew.SetUpdatedPropValue("IncidentType", incidentTypeID); xobjNew.SetUpdatedPropValue("Parent", xobj.ObjectID); create_rights = XSecurityManager.Instance.GetRightsOnNewObject(xobjNew); if (create_rights.AllowCreate) { item = menu.Items.AddActionItem("—оздать подчиненную", StdActions.DoCreate); item.Hotkey = "VK_INS"; item.Parameters.Add("RefreshFlags", "TRM_NODE+TRM_CHILDS"); item.Parameters.Add("UrlParams", ".IncidentType=" + incidentTypeID.ToString() + "&.Parent=" + xobj.ObjectID); } XObjectRights rights = XSecurityManager.Instance.GetObjectRights(xobj); // –едактировать if (rights.AllowParticalOrFullChange) { item = menu.Items.AddActionItem("–едактировать", StdActions.DoEdit); item.Hotkey = "VK_ENTER"; item.Parameters.Add("RefreshFlags", "TRM_NODE"); item.Default = true; } // ”далить if (rights.AllowDelete) { item = menu.Items.AddActionItem("”далить", StdActions.DoDelete); item.Hotkey = "VK_DEL"; item.Parameters.Add("RefreshFlags", "TRM_TREE"); } // ƒл¤ некорневых - "—делать корневой" if (xobj.GetLoadedPropValue("Parent") is Guid) { item = menu.Items.AddActionItem("—делать корневой", "DoMakeRoot"); item.Parameters.Add("RefreshFlags", "TRM_TREE"); } // ѕеренести if (rights.HasPropChangeRight("Parent")) { item = menu.Items.AddActionItem("ѕеренести", "DoMoveCategory"); } return(menu); }