Example #1
0
        private void SaveProblemStandart(viewModels.EditProblemViewModel Model, int ProblemID, DateTime LastModifiedTime)
        {
            // Write model data to App_Data

            string dirName = ProblemID.ToString();
            if (!Directory.Exists(LocalPath.AbsoluteProblemsDirectory + dirName))
            {
                throw new DirectoryNotFoundException("Problem directory not found");
            }

            if (System.IO.File.Exists(LocalPath.AbsoluteProblemsDirectory + dirName + "/" + dirName + ".zip"))
                System.IO.File.Delete(LocalPath.AbsoluteProblemsDirectory + dirName + "/" + dirName + ".zip");

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

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

            if (Model.TestsDropDownID == "other")
            {
                if (Directory.Exists(LocalPath.AbsoluteProblemsDirectory + dirName + "/Tests"))
                {
                    Directory.Delete(LocalPath.AbsoluteProblemsDirectory + dirName + "/Tests", true);
                }
                SaveTests(Model.Tests, dirName);
            }

            // Save attachment
            List<string> attach = new List<string>();
            attach.AddRange(ParseImagesPath(Model.Description));
            attach.AddRange(ParseImagesPath(Model.InputFormat));
            attach.AddRange(ParseImagesPath(Model.OutputFormat));
            SaveImages(attach, LocalPath.AbsoluteProblemsDirectory + dirName);

            // Create zip for tester
            if (System.IO.File.Exists(LocalPath.AbsoluteProblemsDirectory + dirName + ".zip"))
            {
                System.IO.File.Delete(LocalPath.AbsoluteProblemsDirectory + dirName + ".zip");
            }
            ZipFile.CreateFromDirectory(
                LocalPath.AbsoluteProblemsDirectory + dirName,
                LocalPath.AbsoluteProblemsDirectory + dirName + ".zip");

            // Delete description, inputFormat and outputFormat from archive
            using (ZipArchive archive = ZipFile.Open(
                LocalPath.AbsoluteProblemsDirectory + dirName + ".zip", ZipArchiveMode.Update))
            {
                List<ZipArchiveEntry> entriesForDelete = new List<ZipArchiveEntry>();
                foreach (ZipArchiveEntry entry in archive.Entries)
                {
                    if (entry.Name == "Description" ||
                        entry.Name == "InputFormat" ||
                        entry.Name == "OutputFormat")
                    {
                        entriesForDelete.Add(entry);
                    }
                }

                entriesForDelete.Each(e => 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");
            }

            if (Model.SamplesDropDownID == "other")
            {
                if (Directory.Exists(LocalPath.AbsoluteProblemsDirectory + dirName + "/Samples"))
                {
                    Directory.Delete(LocalPath.AbsoluteProblemsDirectory + dirName + "/Samples", true);
                }
                SaveSamples(Model.Samples, dirName);
            }
        }
Example #2
0
        private void SaveProblemOpen(viewModels.EditProblemViewModel Model, int ProblemID, DateTime LastModifiedTime)
        {
            // Write model data to App_Data

            string dirName = ProblemID.ToString();
            if (!Directory.Exists(LocalPath.AbsoluteProblemsDirectory + dirName))
            {
                Directory.CreateDirectory(LocalPath.AbsoluteProblemsDirectory + dirName);
            }

            if (System.IO.File.Exists(LocalPath.AbsoluteProblemsDirectory + dirName + "/" + dirName + ".zip"))
                System.IO.File.Delete(LocalPath.AbsoluteProblemsDirectory + dirName + "/" + dirName + ".zip");

            // 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);

            if (Model.OpenProblemResultDropDownID == "other")
            {
                if (System.IO.File.Exists(LocalPath.AbsoluteProblemsDirectory + dirName + "OpenProblemResult"))
                    System.IO.File.Delete(LocalPath.AbsoluteProblemsDirectory + dirName + "OpenProblemResult");
                SaveOpenProblemResult(Model.OpenProblemResult, dirName);
            }

            // Save attachment
            List<string> attach = new List<string>();
            attach.AddRange(ParseImagesPath(Model.Description));
            attach.AddRange(ParseImagesPath(Model.InputFormat));
            attach.AddRange(ParseImagesPath(Model.OutputFormat));
            SaveImages(attach, LocalPath.AbsoluteProblemsDirectory + dirName);

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

            // 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");
            }
        }
Example #3
0
 private void SaveProblem(viewModels.EditProblemViewModel 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;
     }
 }
Example #4
0
        public ActionResult Update(viewModels.EditProblemViewModel Model, int ProblemID = -1, string Update = null, string Delete = null, string Cancel = null)
        {
            if (ProblemID == -1)
            {
                logger.Warn("Problem with id = " + ProblemID + " not found");
                throw new HttpException(404, "Problem not found");
            }

            if (Delete != null)
                return DeleteProblem(ProblemID);
            if (Cancel != null)
                return CancelProblem();
            if (Update != null)
                return UpdateProblem(Model, ProblemID);

            return CancelProblem();
        }
Example #5
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);
        }
Example #6
0
        private ActionResult UpdateProblem(viewModels.EditProblemViewModel Model, int ProblemID = -1)
        {
            try
            {
                Problem problem = repository.Problems.FirstOrDefault(p => p.ProblemID == ProblemID);

                if (problem == null)
                {
                    logger.Warn("Problem with id = " + ProblemID + " not found");
                    throw new HttpException(404, "Problem not found");
                }

                problem.Name = Model.Name;
                problem.TimeLimit = Model.TimeLimit;
                problem.MemoryLimit = Model.MemoryLimit;
                problem.LastModifiedTime = DateTime.Now.Truncate(TimeSpan.FromSeconds(1));
                problem.CheckPending = Model.CheckPending;
                //problem.Type = (ProblemTypes)Model.ProblemTypesListID;
                if (Model.ProblemTagsListIDs != null)
                {
                    foreach (var tagId in Model.ProblemTagsListIDs)
                    {
                        var tag = repository.ProblemTags.FirstOrDefault(t => t.ProblemTagID == tagId);
                        if (tag != null)
                            problem.Tags.Add(tag);
                    }
                }

                repository.AddProblem(problem);

                SaveProblem(Model, ProblemID, problem.LastModifiedTime);

                logger.Info("User " + WebSecurity.GetUserId(User.Identity.Name) +
                    " \"" + User.Identity.Name + "\" update problem \"" + ProblemID + "\"");

                TestersSingleton.Instance.SendProblem(ProblemID);

                TempData["SuccessMessage"] = "Задача успешно обновлена!";
            }
            catch (Exception ex)
            {
                TempData["ErrorMessage"] = "Произошла ошибка при обновлении задачи.";
                logger.Error("Error occured on user " + WebSecurity.GetUserId(User.Identity.Name) +
                    " \"" + User.Identity.Name + "\" updating problem \"" + ProblemID + "\": ", ex);
            }

            return RedirectToAction("Update", new { ProblemID = ProblemID });
        }