예제 #1
0
        private void SaveProblemOpen(viewModels.NewProblemViewModel Model, int ProblemID, DateTime LastModifiedTime)
        {
            // Write model data to App_Data
            ParseImagesPath(Model.Description);
            string dirName = ProblemID.ToString();

            if (!Directory.Exists(LocalPath.AbsoluteProblemsDirectory + dirName))
            {
                Directory.CreateDirectory(LocalPath.AbsoluteProblemsDirectory + dirName);
            }

            // Write problem legend
            ProblemLegend.Write(LocalPath.AbsoluteProblemsDirectory + dirName,
                                Model.Name, Model.TimeLimit, Model.MemoryLimit, LastModifiedTime, ProblemTypes.Open,
                                Model.Description, Model.InputFormat, Model.OutputFormat);

            SaveChecker(Model.CheckerListID, Model.Checker, dirName);

            SaveOpenProblemResult(Model.OpenProblemResult, dirName);

            // Create zip for tester
            ZipFile.CreateFromDirectory(
                LocalPath.AbsoluteProblemsDirectory + dirName,
                LocalPath.AbsoluteProblemsDirectory + dirName + ".zip");

            // Save attachment
            List <string> attach = new List <string>();

            attach.AddRange(ParseImagesPath(Model.Description));
            attach.AddRange(ParseImagesPath(Model.OutputFormat));
            SaveImages(attach, LocalPath.AbsoluteProblemsDirectory + dirName);

            // Delete description, inputFormat and outputFormat from archive
            using (ZipArchive archive = ZipFile.Open(
                       LocalPath.AbsoluteProblemsDirectory + dirName + ".zip", ZipArchiveMode.Update))
            {
                List <ZipArchiveEntry> forDelete = new List <ZipArchiveEntry>();

                foreach (ZipArchiveEntry entry in archive.Entries)
                {
                    if (entry.Name == "Description" ||
                        entry.Name == "InputFormat" ||
                        entry.Name == "OutputFormat")
                    {
                        forDelete.Add(entry);
                    }
                }

                forDelete.Each(e => archive.Entries.First(en => en == e).Delete());
            }

            // Move tester zip
            if (System.IO.File.Exists(LocalPath.AbsoluteProblemsDirectory + dirName + ".zip"))
            {
                System.IO.File.Move(LocalPath.AbsoluteProblemsDirectory + dirName + ".zip",
                                    LocalPath.AbsoluteProblemsDirectory + dirName + "/" + dirName + ".zip");
            }
        }
예제 #2
0
        //TODO: Tests format - *.in *.out
        public ActionResult Create()
        {
            logger.Debug("User " + WebSecurity.GetUserId(User.Identity.Name) +
                         " \"" + User.Identity.Name + "\" visited ProblemsManagement/Problem/Create");

            var model = new viewModels.NewProblemViewModel();

            return(View(model));
        }
예제 #3
0
        private void SaveProblem(viewModels.NewProblemViewModel Model, int ProblemID, DateTime LastModifiedTime)
        {
            switch ((ProblemTypes)Model.ProblemTypesListID)
            {
            case ProblemTypes.Standart:
                SaveProblemStandart(Model, ProblemID, LastModifiedTime);
                break;

            case ProblemTypes.Open:
                SaveProblemOpen(Model, ProblemID, LastModifiedTime);
                break;
            }
        }
예제 #4
0
        public ActionResult Create(viewModels.NewProblemViewModel Model)
        {
            if (ModelState.IsValid)
            {
                int problemID = -1;

                // Attempt to create new problem
                try
                {
                    Problem problem = new Problem
                    {
                        Name             = Model.Name,
                        TimeLimit        = Model.TimeLimit,
                        MemoryLimit      = Model.MemoryLimit,
                        LastModifiedTime = DateTime.Now.Truncate(TimeSpan.FromSeconds(1)), // Truncate need for comparing dates
                        Type             = (ProblemTypes)Model.ProblemTypesListID,
                        Tags             = new List <ProblemTag>()
                    };

                    foreach (var tagId in Model.ProblemTagsListIDs)
                    {
                        var tag = repository.ProblemTags.FirstOrDefault(t => t.ProblemTagID == tagId);
                        if (tag != null)
                        {
                            problem.Tags.Add(tag);
                        }
                    }

                    int userID = WebSecurity.CurrentUserId;
                    if (userID != 1)
                    {
                        UserProfile user = repository.Users.FirstOrDefault(u => u.UserId == userID);
                        problem.UsersCanModify = new List <UserProfile>();
                        problem.UsersCanModify.Add(user);
                    }
                    problemID = repository.AddProblem(problem);

                    SaveProblem(Model, problemID, problem.LastModifiedTime);

                    problem.Path = LocalPath.RelativeProblemsDirectory + problemID.ToString();

                    // Update problem in repository
                    repository.AddProblem(problem);

                    TestersSingleton.Instance.SendProblem(problem.ProblemID);

                    logger.Info("User " + WebSecurity.GetUserId(User.Identity.Name) +
                                " \"" + User.Identity.Name + "\" create problem " + problemID + " \"" + Model.Name + "\"");

                    return(RedirectToAction("BindTournamentsToProblem", new { problemID = problem.ProblemID }));
                }
                catch (Exception ex)
                {
                    logger.Error("Error occurred on user " + WebSecurity.GetUserId(User.Identity.Name) +
                                 " \"" + User.Identity.Name + "\" creating problem " + problemID + " \"" + Model.Name + "\": ", ex);

                    ModelState.AddModelError("", "Произошла ошибка при создании задачи");

                    repository.DeleteProblem(problemID);
                    if (Directory.Exists(LocalPath.AbsoluteProblemsDirectory + problemID.ToString()))
                    {
                        Directory.Delete(LocalPath.AbsoluteProblemsDirectory + problemID.ToString(), true);
                    }
                }
            }

            return(View(Model));
        }
예제 #5
0
        //TODO: Tests format - *.in *.out
        public ActionResult Create()
        {
            logger.Debug("User " + WebSecurity.GetUserId(User.Identity.Name) +
                " \"" + User.Identity.Name + "\" visited ProblemsManagement/Problem/Create");

            var model = new viewModels.NewProblemViewModel();
            return View(model);
        }