示例#1
0
 public IActionResult OpenModifyTask(ChallengesDetailViewModel viewModel, int taskId)
 {
     TempData[EditTask]          = taskId;
     TempData[TempEditChallenge] = Newtonsoft.Json.JsonConvert
                                   .SerializeObject(viewModel.Challenge);
     return(RedirectToAction("Edit", new { id = viewModel.Challenge.Id }));
 }
示例#2
0
        public async Task <IActionResult> Create()
        {
            var site = await GetCurrentSiteAsync();

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

            PageTitle = "Create Challenge";

            var viewModel = new ChallengesDetailViewModel
            {
                BadgeMakerUrl     = GetBadgeMakerUrl(siteUrl, site.FromEmailAddress),
                UseBadgeMaker     = true,
                IgnorePointLimits = UserHasPermission(Permission.IgnorePointLimits),
                MaxPointLimit     = await _challengeService.GetMaximumAllowedPointsAsync(site.Id)
            };

            viewModel = await GetDetailLists(viewModel);

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

            return(View(viewModel));
        }
示例#3
0
        private async Task <ChallengesDetailViewModel> GetDetailLists(ChallengesDetailViewModel model)
        {
            var systemList = (await _siteService.GetSystemList())
                             .OrderByDescending(_ => _.Id == GetId(ClaimType.SystemId))
                             .ThenBy(_ => _.Name);

            model.SystemList = new SelectList(systemList, "Id", "Name");

            var programList = (await _siteService.GetProgramList());

            model.ProgramList = new SelectList(programList, "Id", "Name");

            if (model.Challenge?.LimitToSystemId.HasValue == true)
            {
                var branchList = (await _siteService
                                  .GetBranches(model.Challenge.LimitToSystemId.Value))
                                 .OrderByDescending(_ => _.Id == GetId(ClaimType.BranchId))
                                 .ThenBy(_ => _.Name);
                model.BranchList = new SelectList(branchList, "Id", "Name");
            }
            else
            {
                var branchList = (await _siteService.GetAllBranches())
                                 .OrderByDescending(_ => _.Id == GetId(ClaimType.BranchId))
                                 .ThenBy(_ => _.Name);
                model.BranchList = new SelectList(branchList, "Id", "Name");
            }

            return(model);
        }
        public async Task <IActionResult> ModifyTask(ChallengesDetailViewModel viewModel)
        {
            foreach (string key in ModelState.Keys.Where(m => m.StartsWith("Challenge.")).ToList())
            {
                ModelState.Remove(key);
            }

            if (ModelState.IsValid)
            {
                if (viewModel.Task.ChallengeTaskType == ChallengeTaskType.Action)
                {
                    viewModel.Task.Author = null;
                    viewModel.Task.Isbn   = null;
                    viewModel.Task.Url    = null;
                }
                await _challengeService.EditTaskAsync(viewModel.Task);
            }
            else
            {
                TempData[EditTask] = viewModel.Task.Id;
            }
            TempData[TempEditChallenge] = Newtonsoft.Json.JsonConvert
                                          .SerializeObject(viewModel.Challenge);

            return(RedirectToAction("Edit", new { id = viewModel.Challenge.Id }));
        }
示例#5
0
        public async Task <IActionResult> DeleteTask(ChallengesDetailViewModel viewModel, int id)
        {
            await _challengeService.RemoveTaskAsync(id);

            TempData[TempEditChallenge] = Newtonsoft.Json.JsonConvert
                                          .SerializeObject(viewModel.Challenge);

            return(RedirectToAction("Edit", new { id = viewModel.Challenge.Id }));
        }
示例#6
0
        IncreaseTaskSort(ChallengesDetailViewModel viewModel, int id)
        {
            await _challengeService.IncreaseTaskPositionAsync(id);

            TempData[TempEditChallenge] = Newtonsoft.Json.JsonConvert
                                          .SerializeObject(viewModel.Challenge);

            return(RedirectToAction("Edit", new { id = viewModel.Challenge.Id }));
        }
示例#7
0
        public async Task <IActionResult> DeleteTask(ChallengesDetailViewModel viewModel, int id)
        {
            try
            {
                await _challengeService.RemoveTaskAsync(id);
            }
            catch (GraException gex)
            {
                ShowAlertDanger("Unable to delete task: ", gex);
            }

            TempData[TempEditChallenge] = Newtonsoft.Json.JsonConvert
                                          .SerializeObject(viewModel.Challenge);

            return(RedirectToAction("Edit", new { id = viewModel.Challenge.Id }));
        }
示例#8
0
        public async Task <IActionResult> AddTask(ChallengesDetailViewModel viewModel)
        {
            foreach (string key in ModelState.Keys.Where(m => m.StartsWith("Challenge.")).ToList())
            {
                ModelState.Remove(key);
            }

            if (ModelState.IsValid)
            {
                viewModel.Task.ChallengeId = viewModel.Challenge.Id;
                await _challengeService.AddTaskAsync(viewModel.Task);
            }
            else
            {
                TempData[NewTask] = true;
            }
            TempData[TempEditChallenge] = Newtonsoft.Json.JsonConvert
                                          .SerializeObject(viewModel.Challenge);

            return(RedirectToAction("Edit", new { id = viewModel.Challenge.Id }));
        }
示例#9
0
        public async Task <IActionResult> Create()
        {
            var site = await GetCurrentSiteAsync();

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

            PageTitle = "Create Challenge";


            ChallengesDetailViewModel viewModel = new ChallengesDetailViewModel()
            {
                BadgeMakerUrl = GetBadgeMakerUrl(siteUrl, site.FromEmailAddress),
                UseBadgeMaker = true
            };

            viewModel = await GetDetailLists(viewModel);

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

            return(View(viewModel));
        }
示例#10
0
 public IActionResult CloseTask(ChallengesDetailViewModel viewModel)
 {
     TempData[TempEditChallenge] = Newtonsoft.Json.JsonConvert
                                   .SerializeObject(viewModel.Challenge);
     return(RedirectToAction("Edit", new { id = viewModel.Challenge.Id }));
 }
示例#11
0
        public async Task <IActionResult> Edit(ChallengesDetailViewModel model, string Submit)
        {
            var site = await GetCurrentSiteAsync();

            if (site.MaxPointsPerChallengeTask.HasValue && model.Challenge.TasksToComplete.HasValue &&
                model.Challenge.TasksToComplete != 0)
            {
                double pointsPerChallenge = (double)model.Challenge.PointsAwarded / model.Challenge.TasksToComplete.Value;
                if (pointsPerChallenge > site.MaxPointsPerChallengeTask)
                {
                    ModelState.AddModelError("Challenge.PointsAwarded", $"Too many points awarded.");
                }
            }
            if (model.BadgeUploadImage != null &&
                (string.IsNullOrWhiteSpace(model.BadgeMakerImage) || !model.UseBadgeMaker))
            {
                if (Path.GetExtension(model.BadgeUploadImage.FileName).ToLower() != ".jpg" &&
                    Path.GetExtension(model.BadgeUploadImage.FileName).ToLower() != ".jpeg" &&
                    Path.GetExtension(model.BadgeUploadImage.FileName).ToLower() != ".png")
                {
                    ModelState.AddModelError("BadgeUploadImage", "Please use a .jpg or .png image");
                }
            }
            if (ModelState.IsValid)
            {
                var challenge = model.Challenge;
                if (model.BadgeUploadImage != null ||
                    !string.IsNullOrWhiteSpace(model.BadgeMakerImage))
                {
                    byte[] badgeBytes;
                    string filename;
                    if (!string.IsNullOrWhiteSpace(model.BadgeMakerImage) &&
                        (model.BadgeUploadImage != null || model.UseBadgeMaker))
                    {
                        var badgeString = model.BadgeMakerImage.Split(',').Last();
                        badgeBytes = Convert.FromBase64String(badgeString);
                        filename   = "badge.png";
                    }
                    else
                    {
                        using (var fileStream = model.BadgeUploadImage.OpenReadStream())
                        {
                            using (var ms = new MemoryStream())
                            {
                                fileStream.CopyTo(ms);
                                badgeBytes = ms.ToArray();
                            }
                        }
                        filename = Path.GetFileName(model.BadgeUploadImage.FileName);
                    }
                    if (challenge.BadgeId == null)
                    {
                        Badge newBadge = new Badge()
                        {
                            Filename = filename
                        };
                        var badge = await _badgeService.AddBadgeAsync(newBadge, badgeBytes);

                        challenge.BadgeId = badge.Id;
                    }
                    else
                    {
                        var existing = await _badgeService
                                       .GetByIdAsync((int)challenge.BadgeId);

                        existing.Filename = Path.GetFileName(model.BadgePath);
                        await _badgeService.ReplaceBadgeFileAsync(existing, badgeBytes);
                    }
                }
                try
                {
                    var savedChallenge = await _challengeService.EditChallengeAsync(challenge);

                    AlertSuccess = $"Challenge '<strong>{challenge.Name}</strong>' was successfully modified";
                    if (Submit == "Activate" &&
                        (UserHasPermission(Permission.ActivateAllChallenges) ||
                         (UserHasPermission(Permission.ActivateSystemChallenges) &&
                          challenge.RelatedSystemId == GetId(ClaimType.SystemId))))
                    {
                        if (savedChallenge.IsValid)
                        {
                            await _challengeService.ActivateChallengeAsync(savedChallenge);

                            AlertSuccess = $"Challenge '<strong>{challenge.Name}</strong>' was successfully modified and activated";
                        }
                    }
                }
                catch (GraException gex)
                {
                    ShowAlertWarning("Unable to edit challenge: ", gex.Message);
                }
                return(RedirectToAction("Edit", new { id = model.Challenge.Id }));
            }
            else
            {
                var tasks = await _challengeService.GetChallengeTasksAsync(model.Challenge.Id);

                model.Challenge.Tasks = tasks.ToList();
                PageTitle             = $"Edit Challenge - {model.Challenge.Name}";
                model = await GetDetailLists(model);

                model.DependentTriggers = await _challengeService
                                          .GetDependentsAsync(model.Challenge.Id);

                return(View(model));
            }
        }
示例#12
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));
        }
示例#13
0
        public async Task <IActionResult> ModifyTask(ChallengesDetailViewModel viewModel)
        {
            if (!string.IsNullOrWhiteSpace(viewModel.Task.Url))
            {
                try
                {
                    viewModel.Task.Url = new UriBuilder(
                        viewModel.Task.Url).Uri.AbsoluteUri;
                }
                catch (Exception)
                {
                    ShowAlertDanger("Invalid URL");
                    return(RedirectToAction("Edit", new { id = viewModel.Challenge.Id }));
                }
            }

            foreach (string key in ModelState
                     .Keys
                     .Where(m => m.StartsWith("Challenge.", StringComparison.OrdinalIgnoreCase))
                     .ToList())
            {
                ModelState.Remove(key);
            }

            if (viewModel.TaskUploadFile != null &&
                !ValidUploadExtensions.Contains(Path
                                                .GetExtension(viewModel.TaskUploadFile.FileName)
                                                .ToLowerInvariant()))
            {
                ModelState.AddModelError("BadgeUploadImage", $"File upload must be one of the following types: {string.Join(", ", ValidUploadExtensions)}");
            }

            if (ModelState.IsValid)
            {
                byte[] fileBytes = null;
                if (viewModel.Task.ChallengeTaskType == ChallengeTaskType.Action)
                {
                    viewModel.Task.Author = null;
                    viewModel.Task.Isbn   = null;
                }
                if (viewModel.TaskUploadFile != null)
                {
                    viewModel.Task.Filename = viewModel.TaskUploadFile.FileName;
                    using (var fileStream = viewModel.TaskUploadFile.OpenReadStream())
                    {
                        using (var ms = new MemoryStream())
                        {
                            fileStream.CopyTo(ms);
                            fileBytes = ms.ToArray();
                        }
                    }
                }
                await _challengeService.EditTaskAsync(viewModel.Task, fileBytes);
            }
            else
            {
                TempData[EditTask] = viewModel.Task.Id;
            }
            TempData[TempEditChallenge] = Newtonsoft.Json.JsonConvert
                                          .SerializeObject(viewModel.Challenge);

            return(RedirectToAction("Edit", new { id = viewModel.Challenge.Id }));
        }
示例#14
0
        public async Task <IActionResult> Edit(ChallengesDetailViewModel model, string Submit)
        {
            byte[] badgeBytes = null;

            model.IgnorePointLimits = UserHasPermission(Permission.IgnorePointLimits);
            model.MaxPointLimit     = await _challengeService
                                      .GetMaximumAllowedPointsAsync(GetCurrentSiteId());

            if (model.Challenge.TasksToComplete.HasValue &&
                model.Challenge.TasksToComplete != 0 &&
                model.Challenge.PointsAwarded != 0 &&
                !model.IgnorePointLimits)
            {
                double pointsPerChallenge =
                    (double)model.Challenge.PointsAwarded / model.Challenge.TasksToComplete.Value;
                if (pointsPerChallenge > model.MaxPointLimit)
                {
                    ModelState.AddModelError("Challenge.PointsAwarded",
                                             $"A challenge with {model.Challenge.TasksToComplete} tasks may award a maximum of {model.MaxPointLimit.Value * model.Challenge.TasksToComplete} points.");
                }
            }

            if (model.BadgeUploadImage != null &&
                (string.IsNullOrWhiteSpace(model.BadgeMakerImage) || !model.UseBadgeMaker))
            {
                if (!ValidImageExtensions.Contains(Path
                                                   .GetExtension(model.BadgeUploadImage.FileName)
                                                   .ToLowerInvariant()))
                {
                    ModelState.AddModelError("BadgeUploadImage", $"Image must be one of the following types: {string.Join(", ", ValidImageExtensions)}");
                }

                try
                {
                    using (var ms = new MemoryStream())
                    {
                        await model.BadgeUploadImage.CopyToAsync(ms);

                        badgeBytes = ms.ToArray();
                    }
                    await _badgeService.ValidateBadgeImageAsync(badgeBytes);
                }
                catch (GraException gex)
                {
                    ModelState.AddModelError("BadgeUploadImage", gex.Message);
                }
            }
            if (ModelState.IsValid)
            {
                var challenge = model.Challenge;
                if (model.BadgeUploadImage != null ||
                    !string.IsNullOrWhiteSpace(model.BadgeMakerImage))
                {
                    string filename;
                    if (!string.IsNullOrWhiteSpace(model.BadgeMakerImage) &&
                        (model.BadgeUploadImage == null || model.UseBadgeMaker))
                    {
                        var badgeString = model.BadgeMakerImage.Split(',').Last();
                        badgeBytes = Convert.FromBase64String(badgeString);
                        filename   = "badge.png";
                    }
                    else
                    {
                        if (badgeBytes == null)
                        {
                            using (var ms = new MemoryStream())
                            {
                                await model.BadgeUploadImage.CopyToAsync(ms);

                                badgeBytes = ms.ToArray();
                            }
                        }
                        filename = Path.GetFileName(model.BadgeUploadImage.FileName);
                    }
                    if (challenge.BadgeId == null)
                    {
                        var newBadge = new Badge
                        {
                            Filename = filename
                        };
                        var badge = await _badgeService.AddBadgeAsync(newBadge, badgeBytes);

                        challenge.BadgeId = badge.Id;
                    }
                    else
                    {
                        var existing = await _badgeService
                                       .GetByIdAsync((int)challenge.BadgeId);

                        existing.Filename = Path.GetFileName(model.BadgePath);
                        await _badgeService.ReplaceBadgeFileAsync(existing,
                                                                  badgeBytes,
                                                                  model.BadgeUploadImage.FileName);
                    }
                }
                try
                {
                    var serviceResult = await _challengeService.EditChallengeAsync(challenge);

                    if (serviceResult.Status == ServiceResultStatus.Warning &&
                        !string.IsNullOrWhiteSpace(serviceResult.Message))
                    {
                        ShowAlertWarning(serviceResult.Message);
                    }
                    AlertSuccess = $"Challenge '<strong>{challenge.Name}</strong>' was successfully modified";

                    var hasPermissions = UserHasPermission(Permission.ActivateAllChallenges) ||
                                         UserHasPermission(Permission.ActivateSystemChallenges);

                    if (Submit == "Activate" &&
                        hasPermissions &&
                        challenge.RelatedSystemId == GetId(ClaimType.SystemId) &&
                        serviceResult.Data.IsValid)
                    {
                        await _challengeService.ActivateChallengeAsync(serviceResult.Data);

                        AlertSuccess = $"Challenge '<strong>{challenge.Name}</strong>' was successfully modified and activated";
                    }
                }
                catch (GraException gex)
                {
                    ShowAlertWarning("Unable to edit challenge: ", gex.Message);
                }
                return(RedirectToAction("Edit", new { id = model.Challenge.Id }));
            }
            else
            {
                var tasks = await _challengeService.GetChallengeTasksAsync(model.Challenge.Id);

                model.Challenge.Tasks = tasks.ToList();
                PageTitle             = $"Edit Challenge - {model.Challenge.Name}";
                model = await GetDetailLists(model);

                model.DependentTriggers = await _challengeService
                                          .GetDependentsAsync(model.Challenge.Id);

                model.Groups = await _challengeService.GetGroupsByChallengeId(model.Challenge.Id);

                model.RelatedEvents = await _eventService.GetByChallengeIdAsync(model.Challenge.Id);

                if (model.MaxPointLimit.HasValue)
                {
                    model.MaxPointsMessage = $"(Up to {model.MaxPointLimit.Value} points per required task)";

                    var currentChallenge = await _challengeService
                                           .MCGetChallengeDetailsAsync(model.Challenge.Id);

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


                return(View(model));
            }
        }
示例#15
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));
        }
示例#16
0
        public async Task <IActionResult> Create(ChallengesDetailViewModel model)
        {
            byte[] badgeBytes = null;

            model.IgnorePointLimits = UserHasPermission(Permission.IgnorePointLimits);
            model.MaxPointLimit     = await _challengeService
                                      .GetMaximumAllowedPointsAsync(GetCurrentSiteId());

            if (!model.IgnorePointLimits &&
                model.Challenge.TasksToComplete.HasValue &&
                model.Challenge.TasksToComplete != 0)
            {
                double pointsPerChallenge = (double)model.Challenge.PointsAwarded / model.Challenge.TasksToComplete.Value;
                if (pointsPerChallenge > model.MaxPointLimit)
                {
                    ModelState.AddModelError("Challenge.PointsAwarded",
                                             $"A challenge with {model.Challenge.TasksToComplete} tasks may award a maximum of {model.MaxPointLimit * model.Challenge.TasksToComplete} points.");
                }
            }
            if (model.BadgeUploadImage != null &&
                (string.IsNullOrWhiteSpace(model.BadgeMakerImage) || !model.UseBadgeMaker))
            {
                if (!ValidImageExtensions.Contains(Path
                                                   .GetExtension(model.BadgeUploadImage.FileName)
                                                   .ToLowerInvariant()))
                {
                    ModelState.AddModelError("BadgeUploadImage", $"Image must be one of the following types: {string.Join(", ", ValidImageExtensions)}");
                }

                try
                {
                    using (var ms = new MemoryStream())
                    {
                        await model.BadgeUploadImage.CopyToAsync(ms);

                        badgeBytes = ms.ToArray();
                    }
                    await _badgeService.ValidateBadgeImageAsync(badgeBytes);
                }
                catch (GraException gex)
                {
                    ModelState.AddModelError("BadgeUploadImage", gex.Message);
                }
            }
            if (ModelState.IsValid)
            {
                try
                {
                    var challenge = model.Challenge;
                    if (model.BadgeUploadImage != null ||
                        !string.IsNullOrWhiteSpace(model.BadgeMakerImage))
                    {
                        string filename;
                        if (!string.IsNullOrWhiteSpace(model.BadgeMakerImage) &&
                            (model.BadgeUploadImage == null || model.UseBadgeMaker))
                        {
                            var badgeString = model.BadgeMakerImage.Split(',').Last();
                            badgeBytes = Convert.FromBase64String(badgeString);
                            filename   = "badge.png";
                        }
                        else
                        {
                            if (badgeBytes == null)
                            {
                                using (var ms = new MemoryStream())
                                {
                                    await model.BadgeUploadImage.CopyToAsync(ms);

                                    badgeBytes = ms.ToArray();
                                }
                            }
                            filename = Path.GetFileName(model.BadgeUploadImage.FileName);
                        }
                        var newBadge = new Badge
                        {
                            Filename = filename
                        };
                        var badge = await _badgeService.AddBadgeAsync(newBadge, badgeBytes);

                        challenge.BadgeId = badge.Id;
                    }
                    var serviceResult = await _challengeService.AddChallengeAsync(challenge);

                    if (serviceResult.Status == ServiceResultStatus.Warning &&
                        !string.IsNullOrWhiteSpace(serviceResult.Message))
                    {
                        ShowAlertWarning(serviceResult.Message);
                    }
                    AlertSuccess = $"Challenge '<strong>{serviceResult.Data.Name}</strong>' was successfully created";
                    return(RedirectToAction("Edit", new { id = serviceResult.Data.Id }));
                }
                catch (GraException gex)
                {
                    ShowAlertWarning("Unable to add challenge: ", gex.Message);
                }
            }

            PageTitle = "Create Challenge";
            model     = await GetDetailLists(model);

            if (model.MaxPointLimit.HasValue)
            {
                model.MaxPointsMessage = $"(Up to {model.MaxPointLimit.Value} points per required task)";
            }

            return(View(model));
        }
示例#17
0
        public async Task <IActionResult> Create(ChallengesDetailViewModel model)
        {
            var site = await GetCurrentSiteAsync();

            if (site.MaxPointsPerChallengeTask.HasValue && model.Challenge.TasksToComplete.HasValue &&
                model.Challenge.TasksToComplete != 0)
            {
                double pointsPerChallenge = (double)model.Challenge.PointsAwarded / model.Challenge.TasksToComplete.Value;
                if (pointsPerChallenge > site.MaxPointsPerChallengeTask)
                {
                    ModelState.AddModelError("Challenge.PointsAwarded", $"Too many points awarded.");
                }
            }
            if (model.BadgeUploadImage != null &&
                (string.IsNullOrWhiteSpace(model.BadgeMakerImage) || !model.UseBadgeMaker))
            {
                if (Path.GetExtension(model.BadgeUploadImage.FileName).ToLower() != ".jpg" &&
                    Path.GetExtension(model.BadgeUploadImage.FileName).ToLower() != ".jpeg" &&
                    Path.GetExtension(model.BadgeUploadImage.FileName).ToLower() != ".png")
                {
                    ModelState.AddModelError("BadgeUploadImage", "Please use a .jpg or .png image");
                }
            }
            if (ModelState.IsValid)
            {
                try
                {
                    var challenge = model.Challenge;
                    if (model.BadgeUploadImage != null ||
                        !string.IsNullOrWhiteSpace(model.BadgeMakerImage))
                    {
                        byte[] badgeBytes;
                        string filename;
                        if (!string.IsNullOrWhiteSpace(model.BadgeMakerImage) &&
                            (model.BadgeUploadImage != null || model.UseBadgeMaker))
                        {
                            var badgeString = model.BadgeMakerImage.Split(',').Last();
                            badgeBytes = Convert.FromBase64String(badgeString);
                            filename   = "badge.png";
                        }
                        else
                        {
                            using (var fileStream = model.BadgeUploadImage.OpenReadStream())
                            {
                                using (var ms = new MemoryStream())
                                {
                                    fileStream.CopyTo(ms);
                                    badgeBytes = ms.ToArray();
                                }
                            }
                            filename = Path.GetFileName(model.BadgeUploadImage.FileName);
                        }
                        Badge newBadge = new Badge()
                        {
                            Filename = filename
                        };
                        var badge = await _badgeService.AddBadgeAsync(newBadge, badgeBytes);

                        challenge.BadgeId = badge.Id;
                    }
                    challenge = await _challengeService.AddChallengeAsync(challenge);

                    AlertSuccess = $"Challenge '<strong>{challenge.Name}</strong>' was successfully created";
                    return(RedirectToAction("Edit", new { id = challenge.Id }));
                }
                catch (GraException gex)
                {
                    ShowAlertWarning("Unable to add challenge: ", gex.Message);
                }
            }
            PageTitle = "Create Challenge";
            model     = await GetDetailLists(model);

            return(View(model));
        }
示例#18
0
        public async Task <IActionResult> AddTask(ChallengesDetailViewModel viewModel)
        {
            if (!string.IsNullOrWhiteSpace(viewModel.Task.Url))
            {
                try
                {
                    viewModel.Task.Url = new UriBuilder(
                        viewModel.Task.Url).Uri.AbsoluteUri;
                }
                catch (Exception)
                {
                    ShowAlertDanger("Invalid URL");
                    return(RedirectToAction("Edit", new { id = viewModel.Challenge.Id }));
                }
            }

            foreach (string key in ModelState.Keys.Where(m => m.StartsWith("Challenge.")).ToList())
            {
                ModelState.Remove(key);
            }

            if (viewModel.TaskUploadFile != null)
            {
                if (Path.GetExtension(viewModel.TaskUploadFile.FileName).ToLower() != ".jpg" &&
                    Path.GetExtension(viewModel.TaskUploadFile.FileName).ToLower() != ".jpeg" &&
                    Path.GetExtension(viewModel.TaskUploadFile.FileName).ToLower() != ".png" &&
                    Path.GetExtension(viewModel.TaskUploadFile.FileName).ToLower() != ".pdf")
                {
                    ModelState.AddModelError("BadgeUploadImage", "Only .jpg, .png and .pdf files are allowed.");
                }
            }

            if (ModelState.IsValid)
            {
                byte[] fileBytes = null;
                if (viewModel.Task.ChallengeTaskType == ChallengeTaskType.Action)
                {
                    viewModel.Task.Author = null;
                    viewModel.Task.Isbn   = null;
                    viewModel.Task.Url    = null;
                }
                if (viewModel.TaskUploadFile != null)
                {
                    viewModel.Task.Filename = viewModel.TaskUploadFile.FileName;
                    using (var fileStream = viewModel.TaskUploadFile.OpenReadStream())
                    {
                        using (var ms = new MemoryStream())
                        {
                            fileStream.CopyTo(ms);
                            fileBytes = ms.ToArray();
                        }
                    }
                }
                viewModel.Task.ChallengeId = viewModel.Challenge.Id;
                await _challengeService.AddTaskAsync(viewModel.Task, fileBytes);
            }
            else
            {
                TempData[NewTask] = true;
            }
            TempData[TempEditChallenge] = Newtonsoft.Json.JsonConvert
                                          .SerializeObject(viewModel.Challenge);

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