예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        /// <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);
        }
예제 #4
0
        /// <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)));
        }
예제 #5
0
        /// <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());
            }
        }
예제 #6
0
        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);
        }
예제 #7
0
        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);
            }
        }
예제 #8
0
        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);
        }