Example #1
0
        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));
        }
Example #2
0
        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));
        }