public ActionResult TaskPartial(Guid?contestId, int?currentTaskNumber) { if (currentTaskNumber == null || contestId == null) { return(HttpNotFound()); } var contest = _db.Contests.FirstOrDefault(c => c.Id == contestId); if (contest == null) { return(HttpNotFound()); } if (!contest.IsActive) { ViewBag.ErrorMessage = "Произошла ошибка: выбранный контест не активен"; return(PartialView("PartialError")); } var tasks = _db.Tasks.Where(t => t.ContestId == contestId).ToList(); if (tasks.Count < 1) { ViewBag.ErrorMessage = "Произошла ошибка: кол-во задач должно быть больше 0"; return(PartialView("PartialError")); } if (!Directory.Exists(HostingEnvironment.ApplicationPhysicalPath + "Documents/TasksDescriptions")) { TempData["Message"] = "Произошла ошибка: каталог '" + HostingEnvironment.ApplicationPhysicalPath + "Documents/TasksDescriptions' не найден."; return(RedirectToAction("Contests")); //ViewBag.ErrorMessage = "Произошла ошибка: каталог '" + HostingEnvironment.ApplicationPhysicalPath + "Documents/TasksDescriptions' не найден."; //return View("Error"); } var taskFiles = Directory.GetFiles(HostingEnvironment.ApplicationPhysicalPath + "Documents/TasksDescriptions/", (tasks[(int)currentTaskNumber].Id) + ".*"); if (!taskFiles.Any()) { //ViewBag.ErrorMessage = "Произошла ошибка: pdf-файл с описанием задания '" + tasks[(int)currentTaskNumber].Name + "' не найден."; TempData["Message"] = "Произошла ошибка: pdf-файл с описанием задания '" + tasks[(int)currentTaskNumber].Name + "' не найден."; return(RedirectToAction("Contests")); //return Content("Произошла ошибка: pdf-файл с описанием задания '" + tasks[(int)currentTaskNumber].Name + "' не найден."); } var devTools = _db.DevelopmentTools.Where(d => d.ContestId == contestId).ToList(); if (devTools.Count < 1) { ViewBag.ErrorMessage = "Произошла ошибка: кол-во компиляторов должно быть больше 0"; return(PartialView("PartialError")); } var model = new ParticipantTaskPartialViewModel { ContestId = (Guid)contestId, CurrentTask = tasks[(int)currentTaskNumber], CurrentTaskId = tasks[(int)currentTaskNumber].Id, CurrentTaskNumber = (int)currentTaskNumber, DevelopmentTools = new SelectList(devTools, "Id", "Name"), SelectedDevelopmentToolId = devTools.First().Id, TaskDescriptionFileName = GetFirstTaskDescriptionFile(tasks[(int)currentTaskNumber].Id) }; return(PartialView(model)); }
public async System.Threading.Tasks.Task <ActionResult> Participate([Bind(Include = "ContestId, CurrentTaskId, CurrentTaskNumber, SelectedDevelopmentToolId")] ParticipantTaskPartialViewModel model, HttpPostedFileBase fileUpload) { var tasks = await _db.Tasks.Where(t => t.ContestId == model.ContestId).ToListAsync(); if (tasks == null || tasks.Count < 1) { TempData["Message"] = "Произошла ошибка: кол-во задач и компиляторов должно быть больше 0"; return(RedirectToAction("Contests")); //ViewBag.ErrorMessage = "Произошла ошибка: кол-во задач и компиляторов должно быть больше 0"; //return View("Error"); } var model2 = new ParticipantParticipateViewModel { ContestId = model.ContestId, CurrentTaskNumber = model.CurrentTaskNumber, Tasks = tasks }; if (ModelState.IsValid) { if (!string.IsNullOrEmpty(fileUpload?.FileName)) { var ext = Path.GetExtension(fileUpload.FileName); if (_allowedExtForSolutionFiles.Any(e => e == ext)) { byte[] solutionData; using (var binaryReader = new BinaryReader(fileUpload.InputStream)) { solutionData = binaryReader.ReadBytes(fileUpload.ContentLength); } var currentUserId = User.Identity.GetUserId(); var postedSolution = await _db.PostedSolutions.Where( s => s.TaskId == model.CurrentTaskId && s.UserId == currentUserId) .FirstOrDefaultAsync(); if (postedSolution != null) { postedSolution.Solution = solutionData; _db.Entry(postedSolution).State = EntityState.Modified; await _db.SaveChangesAsync(); } else { var postedSolutionId = Guid.NewGuid(); postedSolution = new PostedSolution { Id = postedSolutionId, UserId = User.Identity.GetUserId(), TaskId = model.CurrentTaskId, DevelopmentToolId = model.SelectedDevelopmentToolId, Solution = solutionData, IsChecked = false }; _db.PostedSolutions.Add(postedSolution); _db.SaveChanges(); } var task = postedSolution.Task; var contest = task.Contest; var devTool = _db.DevelopmentTools.Find(model.SelectedDevelopmentToolId); var user = _db.Users.Find(currentUserId); var postedSolutionsRootFolder = ConfigurationManager.AppSettings["PostedSolutionsRootFolder"]; var contestTypeName = contest.ContestsType.Name; var contestName = contest.Name; var userIp = user.Ip; var solutionsFolder = Path.Combine(postedSolutionsRootFolder, contestTypeName, contestName, userIp); if (!Directory.Exists(solutionsFolder)) { Directory.CreateDirectory(solutionsFolder); } var sourcePath = Path.Combine(solutionsFolder, task.ExecutableName) + ext; if (ByteArrayToFile(sourcePath, solutionData)) { try { var taskCheckSolution = new System.Threading.Tasks.Task <Solution>(() => { return(CheckPostedSolution(contest, user, task, devTool, solutionsFolder, LocalFolder, sourcePath)); }); _checkSolutionQueue.AddTask(taskCheckSolution); taskCheckSolution.Wait(); var solution = taskCheckSolution.Result; var userAttempt = new UserAttempt { Id = Guid.NewGuid(), ContestId = contest.Id, TaskId = task.Id, UserId = user.Id, CreatedDate = DateTime.Now, Solution = solutionData, SolutionExtension = ext, Score = solution.WeightedScore, DevelopmentToolId = devTool.Id, FailedRuns = solution.FailedRuns, FailedChecks = solution.FailedChecks }; _db.UserAttempts.Add(userAttempt); postedSolution.IsChecked = true; _db.Entry(postedSolution).State = EntityState.Modified; await _db.SaveChangesAsync(); TempData["Message"] = "Решение было отправлено и проверено. \nБаллов: " + solution.WeightedScore + "\nПроваленных запусков: " + solution.FailedRuns + "\nПроваленных тестов: " + solution.FailedChecks; //ToDo: вывести результат в другом виде? } catch (Exception ex) { var exeptionLog = new ExceptionsLog { Id = Guid.NewGuid(), ContestId = contest.Id, CreatedDate = DateTime.Now, UserId = user.Id, Text = ex.InnerException.Message }; _db.ExceptionsLogs.Add(exeptionLog); _db.SaveChanges(); TempData["Message"] = "При проверке решения возникло исключение: " + ex.InnerException.Message; //ToDo: вывести результат в другом виде? } if (Directory.Exists(postedSolutionsRootFolder)) { Directory.Delete(postedSolutionsRootFolder, true); } } else { TempData["Message"] = "Решение не было сохранено в локальном каталоге участника"; } } else { ModelState.AddModelError("", "Недопустимое расширения загружаемого файла решения"); return(View(model2)); } } else { ModelState.AddModelError("", "Не выбран загружаемый файл решения"); return(View(model2)); } //db.Tasks.Add(task); //await db.SaveChangesAsync(); return(RedirectToAction("Participate", new { id = model.ContestId, currentTaskNumber = model.CurrentTaskNumber })); } return(View(model2)); }