public static void CopyFrom(this EditProfileModel model, UserInfoData data)
        {
            if (data == null)
                return;

            model.EditMainInfoModel = new EditMainInfoModel
            {
                UserId = data.User.Id,
                UpdateUserName = data.User.UserName,
                UpdateUserEmail = data.User.Email,
                LastName = data.LastName,
                FirstName = data.FirstName,
                SexId = data.SexId,
                ShowEmail = data.User.ShowEmail
            };

            model.EditAdvanceInfoModel = new EditAdvanceInfoModel
            {
                Activity = data.Activity,
                AboutMe = data.AboutMe,
                DateBirth = data.DateBirth.HasValue ? data.DateBirth.Value.ToString(Constants.DateFormat) : string.Empty,
                Country = data.Country,
                Town = data.Town,
                Street = data.Street,
                HomeNum = data.HomeNumber
            };

            model.EditBindInfoModel = new EditBindInfoModel
            {
                SiteLink = data.SiteLink,
                Icq = data.Icq,
                Skype = data.Skype,
                BattleLog = data.BattleLog,
                Steam = data.Steam
            };
        }
        public ActionResult EditMainInfo(EditMainInfoModel model)
        {
            if (ModelIsValid)
            {
                var data = new UserInfoData
                {
                    UserId = model.UserId,
                    UserName = model.UpdateUserName,
                    UserEmail = model.UpdateUserEmail,
                    FirstName = model.FirstName,
                    LastName = model.LastName,
                    SexId = model.SexId,
                    ShowUserEmail = model.ShowEmail
                };

                Execute(() => _accountService.UpdateMainInfo(data));

                if (CurrentUser.IsMe(model.UserId))
                    Execute(() => CurrentUser = _accountService.GetUser(model.UserId));
            }
            return View("_EditMainInfoPartial", model);
        }
        public ActionResult EditBindInfo(EditBindInfoModel model)
        {
            if (ModelIsValid)
            {
                var data = new UserInfoData
                {
                    UserId = model.UserId,
                    SiteLink = model.SiteLink,
                    Icq = model.Icq,
                    Skype = model.Skype,
                    BattleLog = model.BattleLog,
                    Steam = model.Steam
                };

                Execute(() => _accountService.UpdateBindInfo(data));
            }

            return View("_EditBindInfoPartial", model);
        }
        public ActionResult EditAdvanceInfo(EditAdvanceInfoModel model)
        {
            if (ModelIsValid)
            {
                var dateBirth = default(DateTime?);
                if (!string.IsNullOrWhiteSpace(model.DateBirth))
                {
                    DateTime date;
                    if (DateTime.TryParse(model.DateBirth, CultureInfo.CurrentCulture, DateTimeStyles.None, out date))
                        dateBirth = date;
                    else
                        ModelState.AddModelError(string.Empty, "Неверный формат даты.");
                }

                if (ModelIsValid)
                {
                    var data = new UserInfoData
                    {
                        UserId = model.UserId,
                        AboutMe = model.AboutMe,
                        Activity = model.Activity,
                        DateBirth = dateBirth,
                        Country = model.Country,
                        Town = model.Town,
                        Street = model.Street,
                        HomeNumber = model.HomeNum
                    };

                    Execute(() => _accountService.UpdateAdvanceInfo(data));
                }
            }

            return View("_EditAdvanceInfoPartial", model);
        }
        void IAccountService.UpdateMainInfo(UserInfoData data)
        {
            var users = _userRepository.Query(o => o.UserName == data.UserName && o.Id != data.UserId);
            if (users.Any())
                throw new ArgumentException("Пользователь с таким именем существует.");

            users = _userRepository.Query(o => o.Email == data.UserEmail && o.Id != data.UserId);
            if (users.Any())
                throw new ArgumentException("Пользователь с такой электронной почтой существует.");

            var user = _userRepository.Query(o => o.Id == data.UserId).SingleOrDefault();
            if (user == null)
                throw new ArgumentNullException(string.Format("user"));

            user.UserName = data.UserName;
            user.Email = data.UserEmail;
            user.ShowEmail = data.ShowUserEmail;

            var entityUserInfo = _userInfoRepository.Query(o => o.UserId == data.UserId).SingleOrDefault();

            var userInfo = entityUserInfo ?? new UserInfo { User = user };
            userInfo.FirstName = data.FirstName;
            userInfo.LastName = data.LastName;

            var sex = _sexRepository.Query(o => o.Id == data.SexId.Value).SingleOrDefault();
            userInfo.SexId = sex != null ? sex.Id : (int?)null;

            if (entityUserInfo == null)
                _userInfoRepository.Add(userInfo);

            UnitOfWork.Commit();
        }
        void IAccountService.UpdateBindInfo(UserInfoData data)
        {
            var user = _userRepository.Query(o => o.Id == data.UserId).SingleOrDefault();
            if (user == null)
                throw new ArgumentNullException(string.Format("user"));

            var entityUserInfo = _userInfoRepository.Query(o => o.UserId == data.UserId).SingleOrDefault();
            var userInfo = entityUserInfo ?? new UserInfo { User = user };

            userInfo.SiteLink = data.SiteLink;
            userInfo.ICQ = data.Icq;
            userInfo.Skype = data.Skype;
            userInfo.BattleLog = data.BattleLog;
            userInfo.Steam = data.Steam;

            if (entityUserInfo == null)
                _userInfoRepository.Add(userInfo);

            UnitOfWork.Commit();
        }
        void IAccountService.UpdateAdvanceInfo(UserInfoData data)
        {
            var user = _userRepository.Query(o => o.Id == data.UserId).SingleOrDefault();
            if (user == null)
                throw new ArgumentNullException(string.Format("user"));

            var entityUserInfo = _userInfoRepository.Query(o => o.UserId == data.UserId).SingleOrDefault();
            var userInfo = entityUserInfo ?? new UserInfo { User = user };

            userInfo.AboutMe = data.AboutMe;
            userInfo.Activity = data.Activity;
            userInfo.DateBirth = data.DateBirth;
            userInfo.Country = data.Country;
            userInfo.Town = data.Town;
            userInfo.Street = data.Street;
            userInfo.HomeNumber = data.HomeNumber;

            if (entityUserInfo == null)
                _userInfoRepository.Add(userInfo);

            UnitOfWork.Commit();
        }
        public static void CopyFrom(this UserProfileModel model, UserInfoData data)
        {
            if (data == null)
                return;

            model.UserId = data.User.Id;
            model.UserName = data.User.UserName;
            model.UserEmail = data.User.Email;
            model.UserRole = data.User.RoleName;
            model.LastName = data.LastName;
            model.FirstName = data.FirstName;
            model.PhotoPath = data.User.PhotoPath;
            model.SexName = data.SexName;
            model.ShowEmail = data.User.ShowEmail;

            var dateNow = DateTime.UtcNow.UtcToTimeZone(Constants.BelarusTimeZone);
            if (data.DateBirth.HasValue)
            {
                var dateBirthDay = data.DateBirth.Value;
                if (dateNow.Date > dateBirthDay.Date)
                {
                    var years = dateNow.Year - dateBirthDay.Year;
                    if (dateNow.Month < dateBirthDay.Month || dateNow.Month == dateBirthDay.Month && dateNow.Day < dateBirthDay.Day)
                        years--;

                    model.Age = years.GetRussianYears();
                }
            }

            model.Activity = data.Activity;
            model.AboutMe = data.AboutMe;
            model.DateBirth = data.DateBirth;

            var address = new StringBuilder();
            if (!string.IsNullOrWhiteSpace(data.Country))
                address.Append(string.Format("{0}, ", data.Country));

            if (!string.IsNullOrWhiteSpace(data.Town))
                address.Append(string.Format("{0}, ", data.Town));

            if (!string.IsNullOrWhiteSpace(data.Street))
                address.Append(string.Format("{0}, ", data.Street));

            if (!string.IsNullOrWhiteSpace(data.HomeNumber))
                address.Append(string.Format("{0},", data.HomeNumber));

            var str = address.ToString().Trim();
            var index = str.LastIndexOf(',');
            if (index >= 0)
                model.Address = str.Substring(0, index);

            var dateCreate = data.User.CreateDate;
            if (dateNow.Date > dateCreate.Date)
            {
                var days = (int)(dateNow - dateCreate).TotalDays;
                if (days < 32)
                    model.Experience = string.Format("{0}", days.GetRussianDays()).Trim();
                else
                {
                    var years = dateNow.Year - dateCreate.Year;
                    var months = dateNow.Month - dateCreate.Month;

                    if (dateNow.Month < dateCreate.Month || dateNow.Month == dateCreate.Month && dateNow.Day < dateCreate.Day)
                        years--;

                    if (dateNow.Month < dateCreate.Month)
                        months = 12 - (dateCreate.Month - dateNow.Month);

                    model.Experience = string.Format("{0} {1}", years.GetRussianYears(), months.GetRussianMonths()).Trim();
                }
            }

            model.CreateDate = data.User.CreateDate.UtcToTimeZone(Constants.BelarusTimeZone);
            model.LastActivity = data.User.LastActivity.UtcToTimeZone(Constants.BelarusTimeZone);

            model.SiteLink = data.SiteLink;
            model.Icq = data.Icq;
            model.Skype = data.Skype;
            model.BattleLog = data.BattleLog;
            model.Steam = data.Steam;
        }