private DomainObjectData loadFolderAndIncident(DomainObjectDataSet dataSet, GetMailMsgInfoRequest request, IXExecutionContext context) { DomainObjectData xobjFolder; if (request.ObjectType == "Folder") { xobjFolder = dataSet.GetLoadedStub("Folder", request.ObjectID); dataSet.LoadProperty(context.Connection, xobjFolder, "Name"); } else { XDbCommand cmd = context.Connection.CreateCommand( @"SELECT f.ObjectID as FolderID, f.Name as FolderName, i.Name as IncidentName, i.Number as IncidentNumber FROM Incident i JOIN Folder f ON i.Folder=f.ObjectID WHERE i.ObjectID = @IncidentID" ); cmd.Parameters.Add("IncidentID", DbType.Guid, ParameterDirection.Input, false, request.ObjectID); DomainObjectData xobjIncident = dataSet.GetLoadedStub("Incident", request.ObjectID); using (IDataReader reader = cmd.ExecuteReader()) { if (!reader.Read()) { throw new XObjectNotFoundException("Incident", request.ObjectID); } xobjFolder = dataSet.GetLoadedStub("Folder", reader.GetGuid(reader.GetOrdinal("FolderID"))); xobjFolder.SetLoadedPropValue("Name", reader.GetString(reader.GetOrdinal("FolderName"))); xobjIncident.SetLoadedPropValue("Name", reader.GetString(reader.GetOrdinal("IncidentName"))); xobjIncident.SetLoadedPropValue("Number", reader.GetInt32(reader.GetOrdinal("IncidentNumber"))); xobjIncident.SetLoadedPropValue("Folder", xobjFolder.ObjectID); } } return(xobjFolder); }
private void fillDataSetWithChildFoldersWithUpdatedState(XStorageConnection con, DomainObjectDataSet dataSet, Guid objectID, FolderStates folderState) { // зачитаем идентификаторы всех подчиненных папок, состояние которых отличается от требуемого XDbCommand cmd = con.CreateCommand(@" SELECT f.ObjectID FROM Folder f_s WITH(NOLOCK) JOIN Folder f WITH(NOLOCK) ON f.LIndex > f_s.LIndex AND f.RIndex < f_s.RIndex AND f.Customer = f_s.Customer WHERE f_s.ObjectID = @ObjectID AND f.State <> @TargetState " ); // закрытие закрывает все вложенные папки без учета их состояния: // if (folderState == FolderStates.Closed) - Nothing to do // замораживание замораживает открытые и ожидающие закрытия if (folderState == FolderStates.Frozen) { cmd.CommandText = cmd.CommandText + " AND f.State IN (" + FolderStatesItem.Open.IntValue + "," + FolderStatesItem.WaitingToClose.IntValue + ")"; } // перевод в "ожидание закрытие" применим только для открытых (т.е. замороженные и закрытые не трогаются) //else if (folderState == FolderStates.WaitingToClose) //cmd.CommandText = cmd.CommandText + " AND f.State = " + FolderStatesItem.Open.IntValue; cmd.Parameters.Add("ObjectID", DbType.Guid, ParameterDirection.Input, false, objectID); cmd.Parameters.Add("TargetState", DbType.Int16, ParameterDirection.Input, false, (Int16)folderState); using (IDataReader reader = cmd.ExecuteReader()) { DomainObjectData xobjSubFolder; while (reader.Read()) { xobjSubFolder = dataSet.GetLoadedStub("Folder", reader.GetGuid(0)); xobjSubFolder.SetUpdatedPropValue("State", folderState); } } }
private void UpdateChildDepartments(XStorageConnection con, DomainObjectDataSet dataSet, Guid objectID, bool IsArchive) { // Обновляем вложенные департаменты, если мы меняем признак на "Архивный". // Если признак "Архивный" снимается, каскадной разархивации не происходит. // зачитаем идентификаторы всех подчиненных департаментов, состояние которых отличается от требуемого if (IsArchive) { XDbCommand cmd = con.CreateCommand(@" SELECT d.ObjectID FROM dbo.Department as d_s WITH(NOLOCK) JOIN dbo.Department as d WITH(NOLOCK) ON d.LIndex > d_s.LIndex AND d.RIndex < d_s.RIndex AND d.Organization = d_s.Organization WHERE d_s.ObjectID = @ObjectID AND d.IsArchive <> @IsArchive " ); cmd.Parameters.Add("ObjectID", DbType.Guid, ParameterDirection.Input, false, objectID); cmd.Parameters.Add("IsArchive", DbType.Boolean, ParameterDirection.Input, false, IsArchive); using (IDataReader reader = cmd.ExecuteReader()) { DomainObjectData xobjSubDepartment; while (reader.Read()) { xobjSubDepartment = dataSet.GetLoadedStub("Department", reader.GetGuid(0)); xobjSubDepartment.SetUpdatedPropValue("IsArchive", IsArchive); } } } }
/// <summary> /// Выполнение команды - типизированный вариант /// </summary> /// <param name="request">Запрос команды, должен иметь тип XGetPropertyRequest</param> /// <param name="context">Контекст выполнения команды</param> /// <returns>XGetPropertyResponse</returns> public new XGetPropertyResponse Execute(XGetPropertyRequest request, IXExecutionContext context) { DomainObjectDataSet dataSet = new DomainObjectDataSet(context.Connection.MetadataManager.XModel); // создадим болванку объекта DomainObjectData xobj = dataSet.GetLoadedStub(request.TypeName, request.ObjectID); // загрузим свойства dataSet.LoadProperty(context.Connection, xobj, request.PropName); // создадим форматировщик DomainObjectDataXmlFormatter formatter = new DomainObjectDataXmlFormatter(context.Connection.MetadataManager); // и сериализуем свойство в XML XmlElement xmlProperty = formatter.SerializeProperty(xobj, request.PropName); // по всем объектам в свойстве (LoadProperty вызывается не только для объектных свойств - еще для bin и text) // обработаем объект и все вложенные объекты в прогруженных свойства, расставим атрибуты ограничения доступа foreach (XmlElement xmlObject in xmlProperty.SelectNodes("*[*]")) { DomainObjectData xobjValue = xobj.Context.Find(xmlObject.LocalName, new Guid(xmlObject.GetAttribute("oid"))); if (xobjValue == null) { throw new ApplicationException("Не удалось найти в контексте типизированного объекта DomainObjectData для xml-объекта-значения свойства " + xmlProperty.LocalName + " объекта " + xmlObject.LocalName); } XmlObjectRightsProcessor.ProcessObject(xobjValue, xmlObject); } XGetPropertyResponse response = new XGetPropertyResponse(xmlProperty); return(response); }
/// <summary> /// ћетод запуска операции на выполнение, Ђвходна¤ї точка операции /// </summary> /// <param name="request">«апрос на выполнение операции</param> /// <param name="context"> онтекст выполнени¤ операции</param> /// <returns>–езультат выполнени¤</returns> /// <remarks> /// -- ѕ≈–≈√–”∆≈ЌЌџ…, —“–ќ√ќ “»ѕ»«»–ќ¬јЌЌџ… ћ≈“ќƒ, ¬џ«џ¬ј≈“—я яƒ–ќћ /// -- ѕроверка параметров запроса реализована в методе Validate запроса, /// который автоматически вызываетс¤ ядром при получении запроса /// </remarks> public XGetObjectsRightsResponse Execute(XGetObjectsRightsRequest request, IXExecutionContext context) { Boolean[] objectPermissionCheckList = new Boolean[request.Permissions.Length]; IDictionary checkedObjects = new HybridDictionary(); IDictionary checkedTypes = new Hashtable(); XObjectRights rights; int nIndex = -1; DomainObjectDataSet dataSet = new DomainObjectDataSet(context.Connection.MetadataManager.XModel); foreach (XObjectPermission permission in request.Permissions) { bool bHasRight = true; if ((permission.Action & XObjectActionEnum.Create) == XObjectActionEnum.Create) { if (checkedTypes.Contains(permission.TypeName)) { bHasRight = (bool)checkedTypes[permission.TypeName]; } else { bHasRight = XSecurityManager.Instance.GetRightsOnNewObject( dataSet.CreateStubNew(permission.TypeName) ).AllowCreate; checkedTypes[permission.TypeName] = bHasRight; } } if (bHasRight && ( ((permission.Action & XObjectActionEnum.Change) > 0) || ((permission.Action & XObjectActionEnum.Delete) > 0) || ((permission.Action & XObjectActionEnum.Read) > 0) )) { rights = (XObjectRights)checkedObjects[permission.TypeName + ":" + permission.ObjectID]; if (rights == null) { rights = XSecurityManager.Instance.GetObjectRights( dataSet.GetLoadedStub(permission.TypeName, permission.ObjectID) ); checkedObjects[permission.TypeName + ":" + permission.ObjectID] = rights; } bHasRight = ((permission.Action & XObjectActionEnum.Change) > 0) && rights.AllowParticalOrFullChange || ((permission.Action & XObjectActionEnum.Delete) > 0) && rights.AllowDelete || ((permission.Action & XObjectActionEnum.Read) > 0) && rights.AllowParticalOrFullRead; } // «аписываем полученный флаг в результирующий массив objectPermissionCheckList[++nIndex] = bHasRight; } // ‘ормируем результат операции return(new XGetObjectsRightsResponse(objectPermissionCheckList)); }
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); }
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); }