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