コード例 #1
0
        public PlanDTO CrateTemplate(Guid planId, string userId)
        {
            PlanDO clonedPlan;

            using (var uow = _unitOfWorkFactory.Create())
            {
                var plan = _planService.GetPlanByActivityId(uow, planId);

                clonedPlan = (PlanDO)PlanTreeHelper.CloneWithStructure(plan);
            }

            clonedPlan.PlanState = PlanState.Inactive;

            //linearlize tree structure
            var planTree = clonedPlan.GetDescendants();
            var idsMap   = new Dictionary <Guid, Guid>();

            foreach (var planNodeDO in planTree)
            {
                var oldId = planNodeDO.Id;

                planNodeDO.Id           = Guid.NewGuid();
                planNodeDO.Fr8Account   = null;
                planNodeDO.Fr8AccountId = null;

                var activity = planNodeDO as ActivityDO;

                if (activity != null)
                {
                    activity.AuthorizationToken = null;
                }

                idsMap.Add(oldId, planNodeDO.Id);
            }

            foreach (var activity in planTree.OfType <ActivityDO>())
            {
                activity.CrateStorage = _crateManager.EmptyStorageAsStr(); // UpdateCrateStorage(activity.CrateStorage, idsMap);
            }

            return(PlanMappingHelper.MapPlanToDto(clonedPlan));
        }
コード例 #2
0
ファイル: Plan.cs プロジェクト: patel-pragnesh/fr8core-dev
        public PlanDO Clone(Guid planId)
        {
            using (var uow = ObjectFactory.GetInstance <IUnitOfWork>())
            {
                var currentUser = _security.GetCurrentAccount(uow);

                var targetPlan = (PlanDO)GetPlanByActivityId(uow, planId);
                if (targetPlan == null)
                {
                    return(null);
                }

                var cloneTag = "Cloned From " + planId;

                //we should clone this plan for current user
                //let's clone the plan entirely
                var clonedPlan = (PlanDO)PlanTreeHelper.CloneWithStructure(targetPlan);
                clonedPlan.Description  = clonedPlan.Name + " - " + "Customized for User " + currentUser.UserName + " on " + DateTime.Now;
                clonedPlan.PlanState    = PlanState.Inactive;
                clonedPlan.Tag          = cloneTag;
                clonedPlan.IsApp        = false; // we don't want apps to duplicate when launching
                clonedPlan.AppLaunchURL = null;

                //linearlize tree structure
                var planTree = clonedPlan.GetDescendantsOrdered();


                //let's replace old id's of cloned plan with new id's
                //and update account information
                //TODO maybe we should do something about authorization tokens too?
                Dictionary <Guid, PlanNodeDO> parentMap = new Dictionary <Guid, PlanNodeDO>();
                foreach (var planNodeDO in planTree)
                {
                    var oldId = planNodeDO.Id;
                    planNodeDO.Id         = Guid.NewGuid();
                    planNodeDO.Fr8Account = currentUser;
                    //if (planNodeDO is ActivityDO)
                    //{
                    //    (planNodeDO as ActivityDO).AuthorizationTokenId = null;
                    //}
                    parentMap.Add(oldId, planNodeDO);
                    planNodeDO.ChildNodes = new List <PlanNodeDO>();
                    if (planNodeDO.ParentPlanNodeId != null)
                    {
                        PlanNodeDO newParent;
                        //find parent from old parent id map
                        if (parentMap.TryGetValue(planNodeDO.ParentPlanNodeId.Value, out newParent))
                        {
                            //replace parent id with parent's new id
                            planNodeDO.ParentPlanNodeId = newParent.Id;
                            newParent.ChildNodes.Add(planNodeDO);
                        }
                        else
                        {
                            //this should never happen
                            throw new Exception("Unable to clone plan");
                        }
                    }
                    else
                    {
                        //this should be a plan because it has null ParentId
                        uow.PlanRepository.Add(planNodeDO as PlanDO);
                    }
                }

                //lets update all existing ids in crateStorages of new activities
                //there might be some fields or crates published with sourceActivityId
                foreach (var idMap in parentMap)
                {
                    foreach (var planNodeDO in planTree)
                    {
                        var activity = planNodeDO as ActivityDO;
                        if (activity == null)
                        {
                            continue;
                        }

                        var oldId = idMap.Key.ToString();
                        var newId = idMap.Value.Id.ToString();
                        activity.CrateStorage = activity.CrateStorage.Replace(oldId, newId);
                    }
                }


                //save new cloned plan
                uow.SaveChanges();

                return(clonedPlan);
            }
        }