示例#1
0
        public async Task <IActionResult> Edit(int id)
        {
            var site = await GetCurrentSiteAsync();

            var siteUrl = await _siteService.GetBaseUrl(Request.Scheme, Request.Host.Value);

            Challenge challenge = new Challenge();

            try
            {
                challenge = await _challengeService.MCGetChallengeDetailsAsync(id);

                if (TempData.ContainsKey(TempEditChallenge))
                {
                    var storedChallenge = Newtonsoft.Json.JsonConvert
                                          .DeserializeObject <Challenge>((string)TempData[TempEditChallenge]);

                    challenge.Name             = storedChallenge.Name;
                    challenge.Description      = storedChallenge.Description;
                    challenge.PointsAwarded    = storedChallenge.PointsAwarded;
                    challenge.TasksToComplete  = storedChallenge.TasksToComplete;
                    challenge.LimitToSystemId  = storedChallenge.LimitToSystemId;
                    challenge.LimitToBranchId  = storedChallenge.LimitToBranchId;
                    challenge.LimitToProgramId = storedChallenge.LimitToProgramId;
                }
            }
            catch (GraException gex)
            {
                ShowAlertWarning("Unable to view challenge: ", gex);
                return(RedirectToAction("Index"));
            }

            if (challenge.TasksToComplete > challenge.Tasks.Count())
            {
                AlertInfo = "The challenge does not have enough tasks to be completable";
            }

            bool canActivate = challenge.IsValid &&
                               !challenge.IsActive &&
                               (UserHasPermission(Permission.ActivateAllChallenges) ||
                                (UserHasPermission(Permission.ActivateSystemChallenges) &&
                                 challenge.RelatedSystemId == GetId(ClaimType.SystemId)));

            ChallengesDetailViewModel viewModel = new ChallengesDetailViewModel()
            {
                Challenge = challenge,
                TaskTypes = Enum.GetNames(typeof(ChallengeTaskType))
                            .Select(m => new SelectListItem {
                    Text = m, Value = m
                }).ToList(),
                CanActivate       = canActivate,
                CanViewTriggers   = UserHasPermission(Permission.ManageTriggers),
                DependentTriggers = await _challengeService.GetDependentsAsync(challenge.Id),
                BadgeMakerUrl     = GetBadgeMakerUrl(siteUrl, site.FromEmailAddress),
                UseBadgeMaker     = true
            };

            if (site.MaxPointsPerChallengeTask.HasValue)
            {
                viewModel.MaxPointsMessage = $"(Up to {site.MaxPointsPerChallengeTask.Value} points per required task)";
            }

            if (challenge.BadgeId != null)
            {
                var challengeBadge = await _badgeService.GetByIdAsync((int)challenge.BadgeId);

                if (challengeBadge != null)
                {
                    viewModel.BadgePath = _pathResolver.ResolveContentPath(challengeBadge.Filename);
                }
            }

            if (TempData.ContainsKey(NewTask))
            {
                TempData.Remove(NewTask);
                TempData.Remove(EditTask);
                viewModel.AddTask = true;
            }
            else if (TempData.ContainsKey(EditTask))
            {
                viewModel.Task = await _challengeService
                                 .GetTaskAsync((int)TempData[EditTask]);
            }
            PageTitle = $"Edit Challenge - {viewModel.Challenge.Name}";

            viewModel = await GetDetailLists(viewModel);

            return(View("Edit", viewModel));
        }
示例#2
0
        public async Task <IActionResult> Edit(int id)
        {
            var site = await GetCurrentSiteAsync();

            var siteUrl = await _siteService.GetBaseUrl(Request.Scheme, Request.Host.Value);

            Challenge challenge;

            try
            {
                challenge = await _challengeService.MCGetChallengeDetailsAsync(id);

                foreach (var task in challenge.Tasks)
                {
                    if (task.ChallengeTaskType == ChallengeTaskType.Action)
                    {
                        task.Description = CommonMark.CommonMarkConverter.Convert(task.Title);
                    }
                    if (!string.IsNullOrWhiteSpace(task.Filename))
                    {
                        var contentPath = _pathResolver.ResolveContentPath(task.Filename);
                        task.Filename = $"{siteUrl}/{contentPath}";
                    }
                }
                if (TempData.ContainsKey(TempEditChallenge))
                {
                    var storedChallenge = Newtonsoft.Json.JsonConvert
                                          .DeserializeObject <Challenge>((string)TempData[TempEditChallenge]);

                    challenge.Name                = storedChallenge.Name;
                    challenge.Description         = storedChallenge.Description;
                    challenge.PointsAwarded       = storedChallenge.PointsAwarded;
                    challenge.TasksToComplete     = storedChallenge.TasksToComplete;
                    challenge.LimitToSystemId     = storedChallenge.LimitToSystemId;
                    challenge.LimitToBranchId     = storedChallenge.LimitToBranchId;
                    challenge.AssociatedProgramId = storedChallenge.AssociatedProgramId;
                    challenge.CategoryIds         = storedChallenge.CategoryIds;
                }
                else
                {
                    challenge.CategoryIds = challenge.Categories.Select(_ => _.Id).ToList();
                }
            }
            catch (GraException gex)
            {
                ShowAlertWarning("Unable to view challenge: ", gex);
                return(RedirectToAction("Index"));
            }

            if (challenge.TasksToComplete > challenge.Tasks.Count())
            {
                AlertInfo = "The challenge does not have enough tasks to be completable";
            }

            bool canActivate = challenge.IsValid &&
                               !challenge.IsActive &&
                               (UserHasPermission(Permission.ActivateAllChallenges) ||
                                (UserHasPermission(Permission.ActivateSystemChallenges) &&
                                 challenge.RelatedSystemId == GetId(ClaimType.SystemId)));

            var viewModel = new ChallengesDetailViewModel
            {
                Challenge           = challenge,
                CanActivate         = canActivate,
                CanEditGroups       = UserHasPermission(Permission.EditChallengeGroups),
                CanManageEvents     = UserHasPermission(Permission.ManageEvents),
                CanViewParticipants = UserHasPermission(Permission.ViewParticipantDetails),
                CanViewTriggers     = UserHasPermission(Permission.ManageTriggers),
                CreatedByName       = await _userService.GetUsersNameByIdAsync(challenge.CreatedBy),
                DependentTriggers   = await _challengeService.GetDependentsAsync(challenge.Id),
                Groups            = await _challengeService.GetGroupsByChallengeId(challenge.Id),
                RelatedEvents     = await _eventService.GetByChallengeIdAsync(challenge.Id),
                BadgeMakerUrl     = GetBadgeMakerUrl(siteUrl, site.FromEmailAddress),
                UseBadgeMaker     = true,
                IgnorePointLimits = UserHasPermission(Permission.IgnorePointLimits),
                MaxPointLimit     = await _challengeService.GetMaximumAllowedPointsAsync(site.Id)
            };

            if (viewModel.MaxPointLimit.HasValue)
            {
                viewModel.MaxPointsMessage = $"(Up to {viewModel.MaxPointLimit.Value} points per required task)";
            }
            if (challenge.TasksToComplete.HasValue &&
                viewModel.MaxPointLimit.HasValue)
            {
                double pointsPerChallenge = (double)viewModel.Challenge.PointsAwarded
                                            / viewModel.Challenge.TasksToComplete.Value;
                if (pointsPerChallenge > viewModel.MaxPointLimit)
                {
                    viewModel.MaxPointsWarningMessage = $"This Challenge exceeds the maximum of {viewModel.MaxPointLimit.Value} points per required task - only Administrators can edit it.";
                }
            }

            if (challenge.BadgeId != null)
            {
                var challengeBadge = await _badgeService.GetByIdAsync((int)challenge.BadgeId);

                if (challengeBadge != null)
                {
                    viewModel.BadgePath = _pathResolver.ResolveContentPath(challengeBadge.Filename);
                }
            }

            if (TempData.ContainsKey(NewTask))
            {
                TempData.Remove(NewTask);
                TempData.Remove(EditTask);
                viewModel.AddTask = true;
            }
            else if (TempData.ContainsKey(EditTask))
            {
                viewModel.Task = await _challengeService
                                 .GetTaskAsync((int)TempData[EditTask]);

                if (!string.IsNullOrWhiteSpace(viewModel.Task.Filename))
                {
                    var contentPath = _pathResolver.ResolveContentPath(viewModel.Task.Filename);
                    viewModel.TaskFilePath = $"{siteUrl}/{contentPath}";
                }
            }
            PageTitle = $"Edit Challenge - {viewModel.Challenge.Name}";

            viewModel = await GetDetailLists(viewModel);

            return(View("Edit", viewModel));
        }