コード例 #1
0
ファイル: MainLoader.cs プロジェクト: chmielusm/dynamics
        /// <summary>
        /// Parses Excel file resulted with input for processing
        /// </summary>
        /// <param name="definition"></param>
        /// <returns></returns>
        public ImportContent ParseFile(SpreadSheetRangeDefinition definition)
        {
            ImportContent content = new ImportContent()
            {
                Users = new List <User>()
            };

            List <Role> roleList = new List <Role>();
            List <FieldSecurityProfile> profiles = new List <FieldSecurityProfile>();

            var worksheet = _fileContent.Tables[definition.WorksheetName];

            // read roles
            for (int i = definition.SecurityRoles.ToTuple().Item2; i <= definition.SecurityRoles.ToTuple().Item3; i++)
            {
                roleList.Add(new Role()
                {
                    Name = worksheet.Rows[definition.SecurityRoles.ToTuple().Item1][i].ToString()
                });
            }

            // read security profiles
            for (int i = definition.FieldSecurityProfile.ToTuple().Item2; i <= definition.FieldSecurityProfile.ToTuple().Item3; i++)
            {
                profiles.Add(new FieldSecurityProfile()
                {
                    Name = worksheet.Rows[definition.FieldSecurityProfile.ToTuple().Item1][i].ToString()
                });
            }

            //parse user rows
            var startRow = definition.UserName.ToTuple().Item1 + 1;
            var endRow   = worksheet.Rows.Count;

            if (!definition.AllRows)
            {
                startRow = definition.RowsToLoad.ToTuple().Item1;
                endRow   = definition.RowsToLoad.ToTuple().Item2;
                if (endRow == 0)
                {
                    endRow = startRow + 1;
                }
            }

            if (startRow > worksheet.Rows.Count)
            {
                throw new InvalidOperationException($"Invalid row #{startRow+1} for processing. Possible row# {worksheet.Rows.Count}");
            }

            for (int i = startRow; i < endRow; i++)
            {
                User user = new User();

                for (int colCounter = definition.UserName.ToTuple().Item2; colCounter < worksheet.Columns.Count; colCounter++)
                {
                    // user name
                    if (colCounter == definition.UserName.ToTuple().Item2)
                    {
                        user.Name = worksheet.Rows[i][colCounter].ToString();

                        LogProgress($"Parsing user {user.Name}", i);
                    }
                    // manager
                    if (colCounter == definition.Manager.ToTuple().Item2)
                    {
                        user.Manager = new User
                        {
                            Name = worksheet.Rows[i][colCounter].ToString()
                        };
                        user.IsManagerIncluded = true;
                    }
                    // position
                    if (colCounter == definition.Position.ToTuple().Item2)
                    {
                        user.Position = new Position
                        {
                            Name = worksheet.Rows[i][colCounter].ToString()
                        };
                        user.IsPositionIncluded = true;
                    }
                    // site
                    if (colCounter == definition.Site.ToTuple().Item2)
                    {
                        user.Site = new Site
                        {
                            Name = worksheet.Rows[i][colCounter].ToString()
                        };
                        user.IsSiteIncluded = true;
                    }
                    // territory
                    if (colCounter == definition.Territory.ToTuple().Item2)
                    {
                        user.Territory = new Territory
                        {
                            Name = worksheet.Rows[i][colCounter].ToString()
                        };
                        user.IsTerritoryIncluded = true;
                    }
                    // bu
                    if (colCounter == definition.BusinessUnit.ToTuple().Item2)
                    {
                        user.BusinessUnit = new BusinessUnit
                        {
                            Name = worksheet.Rows[i][colCounter].ToString()
                        };
                    }
                    // security roles
                    if (colCounter >= definition.SecurityRoles.ToTuple().Item2&& colCounter <= definition.SecurityRoles.ToTuple().Item3)
                    {
                        content.RoleMemberships.Add(new RoleMembership()
                        {
                            User   = user,
                            Role   = GetRole(roleList[colCounter - definition.SecurityRoles.ToTuple().Item2], user.BusinessUnit),
                            Assign = Helper.ParseBoolean(worksheet.Rows[i][colCounter].ToString())
                        });
                    }
                    // field security profiles
                    if (colCounter >= definition.FieldSecurityProfile.ToTuple().Item2&& colCounter <= definition.FieldSecurityProfile.ToTuple().Item3)
                    {
                        content.ProfileMemberships.Add(new ProfileMembership()
                        {
                            User = user,
                            FieldSecurityProfile = profiles[colCounter - definition.FieldSecurityProfile.ToTuple().Item2],
                            Assign = Helper.ParseBoolean(worksheet.Rows[i][colCounter].ToString())
                        });
                    }
                }

                content.Users.Add(user);
            }

            return(content);
        }
コード例 #2
0
        /// <summary>
        /// Performs import
        /// </summary>
        private void ImportData()
        {
            btnLoad.Enabled = false;
            MainLoader manager = new MainLoader(Service, _fileContent);

            manager.OnWarning += Manager_OnWarning;

            WorkAsync(new WorkAsyncInfo
            {
                Message = $"Parsing worksheet {this.lstWorksheetName.SelectedItem}...",
                Work    = (mainWorker, mainArgs) =>
                {
                    SpreadSheetRangeDefinition definition = new SpreadSheetRangeDefinition
                    {
                        WorksheetName        = this.lstWorksheetName.SelectedItem.ToString(),
                        UserName             = this.txtUserName.Text,
                        Manager              = this.txtManager.Text,
                        Position             = this.txtOccupancy.Text,
                        Site                 = this.txtSite.Text,
                        Territory            = this.txtTerritory.Text,
                        BusinessUnit         = this.txtBu.Text,
                        SecurityRoles        = this.txtSecurityRole.Text,
                        FieldSecurityProfile = this.txtProfile.Text,
                        AllRows              = this.chkAllRows.Checked,
                        RowsToLoad           = this.txtRowsToImport.Text
                    };

                    mySettings.SpreadSheetRangeDefinition = definition;

                    mainArgs.Result = manager.ParseFile(definition);
                },
                PostWorkCallBack = (mainArgs) =>
                {
                    if (mainArgs.Error != null)
                    {
                        MessageBox.Show(mainArgs.Error.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }
                    var result = mainArgs.Result as ImportContent;
                    if (result != null)
                    {
                        WorkAsync(new WorkAsyncInfo
                        {
                            ProgressChanged = e =>
                            {
                                SetWorkingMessage(e.UserState.ToString());
                            },
                            Message = "Fetching system users, security roles and field security profiles from your Organization...",
                            Work    = (worker, args) =>
                            {
                                args.Result = manager.FetchData(result);
                                var content = args.Result as ImportContent;
                                if (content != null)
                                {
                                    int count = content.Users.Count();
                                    worker.ReportProgress(-1, $"{count} Users to process.");
                                }
                            },
                            PostWorkCallBack = (args) =>
                            {
                                if (args.Error != null)
                                {
                                    MessageBox.Show(args.Error.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                }
                                var res = args.Result as ImportContent;
                                if (res != null)
                                {
                                    WorkAsync(new WorkAsyncInfo
                                    {
                                        ProgressChanged = e =>
                                        {
                                            SetWorkingMessage(e.UserState.ToString());
                                        },
                                        Message = "Please wait... Processing users.",
                                        Work    = (worker, nargs) =>
                                        {
                                            var counter = 1;
                                            foreach (var user in res.Users)
                                            {
                                                worker.ReportProgress(counter, $"Updating user { user.Name }.");
                                                try
                                                {
                                                    manager.UpdateUser(user);
                                                }
                                                catch (Exception e)
                                                {
                                                    LogError(e.Message);
                                                    //ShowErrorNotification(e.Message, null);
                                                }
                                                finally
                                                {
                                                    worker.ReportProgress(counter, $"User { user.Name } has been updated.");
                                                }
                                            }

                                            foreach (var membership in res.RoleMemberships)
                                            {
                                                worker.ReportProgress(counter, $"Processing user { membership.User.Name } and role { membership.Role.Name } memberships.");
                                                try
                                                {
                                                    manager.EnsureSystemUserRoleMembership(membership);
                                                }
                                                catch (Exception e)
                                                {
                                                    LogError(e.Message);
                                                    //ShowErrorNotification(e.Message, null);
                                                }
                                                finally
                                                {
                                                    worker.ReportProgress(counter, $"Processed user { membership.User.Name } and role { membership.Role.Name } memberships completed.");
                                                }
                                            }
                                            foreach (var profile in res.ProfileMemberships)
                                            {
                                                worker.ReportProgress(counter, $"Processing user { profile.User.Name } and security profile { profile.FieldSecurityProfile.Name } memberships.");
                                                try
                                                {
                                                    manager.EnsureSystemUserProfileMembership(profile);
                                                }
                                                catch (Exception e)
                                                {
                                                    LogError(e.Message);
                                                    //ShowErrorNotification(e.Message, null);
                                                }
                                                finally
                                                {
                                                    worker.ReportProgress(counter, $"Processed user { profile.User.Name } and security profile { profile.FieldSecurityProfile.Name } memberships completed.");
                                                }
                                            }
                                        },
                                        PostWorkCallBack = (nargs) =>
                                        {
                                            if (args.Error != null)
                                            {
                                                MessageBox.Show(args.Error.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                            }
                                            this.btnLoad.Enabled = true;
                                            this.lstWorksheetName.SelectedIndex = -1;

                                            if (MessageBox.Show("Import System Users along with their Security roles and Field Security Profiles memberships has been completed. Do you want to review a log file?", "Import", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes)
                                            {
                                                OpenLogFile();
                                            }
                                        }
                                    });
                                }
                            }
                        });
                    }
                }
            });
        }