public virtual IActionResult Create(ResearcherModel model, bool continueEditing)
        {
            if (!_permissionService.Authorize(StandardPermissionProvider.ManageResearchers))
            {
                return(AccessDeniedView());
            }

            if (ModelState.IsValid)
            {
                var researcher = model.ToEntity <Researcher>();

                if (model.ParseDateOfBirth() != null)
                {
                    researcher.Birthdate = model.ParseDateOfBirth();
                }
                researcher.IsActive = true;
                _researcherService.InsertResearcher(researcher);

                var address = model.AddressModel.ToEntity <Address>();
                SaveAddress(model.AddressModel, address);
                if (address.Id != 0)
                {
                    researcher.AddressId = address.Id;
                    _researcherService.UpdateResearcher(researcher);
                }


                SuccessNotification("Admin.ContentManagement.Researchers.Added");

                //activity log
                //_userActivityService.InsertActivity("AddNewResearcher", "ActivityLog.AddNewResearcher", researcher);

                if (!continueEditing)
                {
                    return(RedirectToAction("List"));
                }

                //selected tab
                SaveSelectedTabName();

                return(RedirectToAction("Edit", new { id = researcher.Id }));
            }

            //prepare model
            model = _researcherModelFactory.PrepareResearcherModel(model, null, true);

            //if we got this far, something failed, redisplay form
            return(View(model));
        }
        /// <summary>
        /// Register user
        /// </summary>
        /// <param name="request">Request</param>
        /// <returns>Result</returns>
        public virtual UserRegistrationResult RegisterUser(UserRegistrationRequest request)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            if (request.User == null)
            {
                throw new ArgumentException("Can't load current user");
            }

            var result = new UserRegistrationResult();

            if (request.User.IsSearchEngineAccount())
            {
                result.AddError("Search engine can't be registered");
                return(result);
            }

            if (request.User.IsBackgroundTaskAccount())
            {
                result.AddError("Background task account can't be registered");
                return(result);
            }

            if (request.User.IsRegistered())
            {
                result.AddError("Current user is already registered");
                return(result);
            }

            if (string.IsNullOrEmpty(request.Email))
            {
                result.AddError("EmailIsNotProvided");
                return(result);
            }

            if (!CommonHelper.IsValidEmail(request.Email))
            {
                result.AddError("WrongEmail");
                return(result);
            }

            if (string.IsNullOrWhiteSpace(request.Password))
            {
                result.AddError("Password Is Not Provided");
                return(result);
            }

            if (_userSettings.UsernamesEnabled && string.IsNullOrEmpty(request.Username))
            {
                result.AddError("Username Is Not Provided");
                return(result);
            }

            //validate unique user
            if (_userService.GetUserByEmail(request.Email) != null)
            {
                result.AddError("Email Already Exists");
                return(result);
            }

            //at this point request is valid
            request.User.UserName = request.Username;
            request.User.Email    = request.Email;

            var userPassword = new UserPassword
            {
                UserId         = request.User.Id,
                PasswordFormat = request.PasswordFormat,
                CreatedOnUtc   = DateTime.UtcNow
            };

            switch (request.PasswordFormat)
            {
            case PasswordFormat.Clear:
                userPassword.Password = request.Password;
                break;

            case PasswordFormat.Encrypted:
                userPassword.Password = _encryptionService.EncryptText(request.Password);
                break;

            case PasswordFormat.Hashed:
                var saltKey = _encryptionService.CreateSaltKey(ResearchUserServiceDefaults.PasswordSaltKeySize);
                userPassword.PasswordSalt = saltKey;
                userPassword.Password     = _encryptionService.CreatePasswordHash(request.Password, saltKey, _userSettings.HashedPasswordFormat);
                break;
            }

            _userService.InsertUserPassword(userPassword);
            //add to 'researcherRole' role
            var researcherRole = _userService.GetUserRoleBySystemName(ResearchUserDefaults.ResearchersRoleName);

            if (researcherRole == null)
            {
                throw new ResearchException("'Researchers' role could not be loaded");
            }

            request.User.UserUserRoleMappings.Add(new UserUserRoleMapping {
                UserRole = researcherRole
            });
            //remove from 'Guests' role
            var guestRole = request.User.UserRoles.FirstOrDefault(cr => cr.SystemName == ResearchUserDefaults.GuestsRoleName);

            if (guestRole != null)
            {
                request.User.UserUserRoleMappings
                .Remove(request.User.UserUserRoleMappings.FirstOrDefault(mapping => mapping.UserRoleId == guestRole.Id));
            }
            //_userService.UpdateUser(request.User);
            var researcher = new Researcher
            {
                ResearcherCode = _researcherService.GetNextNumber(),
                Email          = request.User.Email,
                AgencyId       = request.User.AgencyId,
                FirstName      = request.User.FirstName,
                LastName       = request.User.LastName,
                IDCard         = request.IDCard,
                TitleId        = request.User.TitleId,
                Gender         = request.Gender,
                IsActive       = true,
                PersonalTypeId = (int)PersonalType.Academic,
            };

            _researcherService.InsertResearcher(researcher);
            request.User.ResearcherId = researcher.Id;
            request.User.Roles        = researcherRole.SystemName;
            _userService.UpdateUser(request.User);
            //_workContext.CurrentUser = request.User;

            return(result);
        }