Exemplo n.º 1
0
        public async Task <ProblemIdModel> UpdateProblemConfig([FromBody] ProblemEditModel model)
        {
            var(user, privilege) = await GetUserPrivilegeAsync();

            var ret = new ProblemIdModel {
                IsSucceeded = true
            };

            if (!HasTeacherPrivilege(privilege))
            {
                ret.IsSucceeded  = false;
                ret.ErrorMessage = "没有权限";
                return(ret);
            }


            using (var db = new ApplicationDbContext(_dbContextOptions))
            {
                var problem = model.Id == 0 ? new Problem() : await db.Problem.FindAsync(model.Id);

                if (problem == null)
                {
                    ret.IsSucceeded  = false;
                    ret.ErrorMessage = "题目不存在";
                    return(ret);
                }

                problem.Name  = model.Name;
                problem.Level = model.Level;
                for (var i = (model.Config?.ExtraFiles?.Count ?? 0) - 1; i >= 0; i--)
                {
                    if (string.IsNullOrEmpty(model.Config.ExtraFiles[i]))
                    {
                        model.Config.ExtraFiles.RemoveAt(i);
                    }
                }
                problem.Config      = JsonConvert.SerializeObject(model.Config);
                problem.Type        = model.Type;
                problem.Description = model.Description;
                problem.Hidden      = model.Hidden;

                if (model.Id == 0)
                {
                    problem.CreationTime = DateTime.Now;
                    problem.UserId       = user.Id;
                    await db.Problem.AddAsync(problem);
                }
                ;

                await db.SaveChangesAsync();

                ret.Id = problem.Id;
                return(ret);
            }
        }
Exemplo n.º 2
0
        public async Task <ProblemEditModel> GetProblemConfig(int pid)
        {
            var(user, privilege) = await GetUserPrivilegeAsync();

            var model = new ProblemEditModel {
                IsSucceeded = true
            };

            if (!HasTeacherPrivilege(privilege))
            {
                model.IsSucceeded  = false;
                model.ErrorMessage = "没有权限";
                return(model);
            }
            if (pid == 0)
            {
                model.Level = 1;
                model.Type  = 1;
                return(model);
            }

            using (var db = new ApplicationDbContext(_dbContextOptions))
            {
                var problem = await db.Problem.FindAsync(pid);

                if (problem == null)
                {
                    model.IsSucceeded  = false;
                    model.ErrorMessage = "题目不存在";
                    return(model);
                }
                model.Id          = problem.Id;
                model.Name        = problem.Name;
                model.Level       = problem.Level;
                model.Config      = JsonConvert.DeserializeObject <ProblemConfiguration>(problem.Config ?? "{}");
                model.Description = problem.Description;
                model.Type        = problem.Type;
                model.Hidden      = problem.Hidden;
                return(model);
            }
        }
Exemplo n.º 3
0
        public async Task <IActionResult> Edit(int pid, ProblemEditModel model)
        {
            if (model.RunScript == "upload" && model.UploadedRun == null)
            {
                ModelState.AddModelError("XYS::RunScript", "No run script was selected.");
            }
            if (model.CompareScript == "upload" && model.UploadedCompare == null)
            {
                ModelState.AddModelError("XYS::CmpScript", "No compare script was selected.");
            }
            if (!new[] { "compare", Problem.CompareScript, "upload" }.Contains(model.CompareScript))
            {
                ModelState.AddModelError("XYS::CmpScript", "Error compare script defined.");
            }
            if (!new[] { "run", Problem.RunScript, "upload" }.Contains(model.RunScript))
            {
                ModelState.AddModelError("XYS::RunScript", "Error run script defined.");
            }

            if (!ModelState.IsValid)
            {
                TempData["StatusMessage"] = "Error validating problem.\n" +
                                            string.Join('\n', ModelState.Values
                                                        .SelectMany(m => m.Errors)
                                                        .Select(e => e.ErrorMessage));
                return(View(model));
            }

            if (model.RunScript == "upload")
            {
                var cont = await model.UploadedRun.ReadAsync();

                var execid = $"p{pid}run";

                var exec = await DbContext.Executable
                           .Where(e => e.ExecId == execid)
                           .FirstOrDefaultAsync();

                bool newone = exec == null;
                exec             = exec ?? new Executable();
                exec.ExecId      = execid;
                exec.Description = $"run pipe for p{pid}";
                exec.Md5sum      = cont.Item2;
                exec.ZipFile     = cont.Item1;
                exec.Type        = "run";
                exec.ZipSize     = cont.Item1.Length;

                if (newone)
                {
                    DbContext.Executable.Add(exec);
                }
                else
                {
                    DbContext.Executable.Update(exec);
                }
                await DbContext.SaveChangesAsync();

                model.RunScript = execid;
            }

            if (model.CompareScript == "upload")
            {
                var cont = await model.UploadedCompare.ReadAsync();

                var execid = $"p{pid}cmp";

                var exec = await DbContext.Executable
                           .Where(e => e.ExecId == execid)
                           .FirstOrDefaultAsync();

                bool newone = exec == null;
                exec             = exec ?? new Executable();
                exec.ExecId      = execid;
                exec.Description = $"output validator for p{pid}";
                exec.Md5sum      = cont.Item2;
                exec.ZipFile     = cont.Item1;
                exec.Type        = "compare";
                exec.ZipSize     = cont.Item1.Length;

                if (newone)
                {
                    DbContext.Executable.Add(exec);
                }
                else
                {
                    DbContext.Executable.Update(exec);
                }
                await DbContext.SaveChangesAsync();

                model.CompareScript = execid;
            }

            Problem.RunScript          = model.RunScript;
            Problem.CompareScript      = model.CompareScript;
            Problem.ComapreArguments   = model.CompareArgument;
            Problem.MemoryLimit        = model.MemoryLimit;
            Problem.OutputLimit        = model.OutputLimit;
            Problem.TimeLimit          = model.TimeLimit;
            Problem.Title              = model.Title;
            Problem.Source             = model.Source ?? "";
            Problem.CombinedRunCompare = model.RunAsCompare;
            DbContext.Problems.Update(Problem);
            await DbContext.SaveChangesAsync();

            return(RedirectToAction(nameof(Overview)));
        }