/// <summary> /// 从给定的题目句柄创建新的数据模型对象。 /// </summary> /// <param name="handle">题目句柄。</param> /// <exception cref="ArgumentNullException"/> public static ProblemDisplayModel FromProblemHandle(ProblemHandle handle) { if (handle == null) { throw new ArgumentNullException(nameof(handle)); } ProblemDisplayModel model = new ProblemDisplayModel(); Markdown markdown = new Markdown(); using (ProblemDataProvider data = ProblemDataProvider.Create(handle, true)) { model.ProblemId = data.ProblemId; model.Title = data.Title; model.Description = markdown.Transform(data.Description); model.InputDescription = markdown.Transform(data.InputDescription); model.OutputDescription = markdown.Transform(data.OutputDescription); model.InputExample = markdown.Transform(data.InputExample); model.OutputExample = markdown.Transform(data.OutputExample); model.Hint = markdown.Transform(data.Hint); model.Source = data.Source; model.Author = data.Author; model.TimeLimit = data.TimeLimit; model.MemoryLimit = data.MemoryLimit; model.IsSpecialJudge = data.IsSpecialJudge; } return(model); }
/// <summary> /// 从给定的题目句柄创建 ProblemDetailModel 类的新实例。 /// </summary> /// <param name="handle">题目句柄。</param> /// <exception cref="ArgumentNullException"/> public static ProblemDetailModel FromProblemHandle(ProblemHandle handle) { if (handle == null) { throw new ArgumentNullException(nameof(handle)); } ProblemDetailModel model = new ProblemDetailModel(); using (ProblemDataProvider data = ProblemDataProvider.Create(handle, true)) { model.ProblemId = data.ProblemId; model.Title = data.Title; model.Description = data.Description; model.InputDescription = data.InputDescription; model.OutputDescription = data.OutputDescription; model.InputExample = data.InputExample; model.OutputExample = data.OutputExample; model.Hint = data.Hint; model.Source = data.Source; model.Author = data.Author; model.UserGroupName = UsergroupConvert.ConvertToString(data.AuthorizationGroup); } return(model); }
/// <summary> /// 从给定的用户提交句柄创建 SubmissionDetailModel 类的新实例。 /// </summary> /// <param name="handle">用户提交句柄。</param> /// <returns>从给定的句柄创建的 SubmissionDetailModel 类的新实例。</returns> /// <exception cref="ArgumentNullException"/> public static SubmissionDetailModel FromSubmissionHandle(SubmissionHandle handle) { if (handle == null) { throw new ArgumentNullException(nameof(handle)); } SubmissionDetailModel model = new SubmissionDetailModel(); using (SubmissionDataProvider submissionData = SubmissionDataProvider.Create(handle, true)) { model.SubmissionId = submissionData.SubmissionId; model.ProblemId = submissionData.ProblemId; model.ContestId = submissionData.ContestId; model.Username = submissionData.Username; model.TeamId = submissionData.TeamId; model.CreationTime = submissionData.CreationTimeStamp; model.Language = submissionData.Language; model.ExecutionTime = submissionData.ExecutionTime; model.ExecutionMemory = submissionData.ExecutionMemory; model.VerdictStatus = submissionData.VerdictStatus; model.Verdict = submissionData.Verdict; model.VerdictMessage = submissionData.VerdictMessage; using (ProblemDataProvider problemData = ProblemDataProvider.Create(new ProblemHandle(submissionData.ProblemId), true)) { model.ProblemTitle = problemData.Title; } } return(model); }
/// <summary> /// 从给定的用户提交句柄创建 SubmissionFetchHandle 类的新实例。 /// </summary> /// <param name="handle">用户提交句柄。</param> /// <returns>相应的 SubmissionFetchModel 数据模型对象。</returns> /// <exception cref="ArgumentNullException"/> public static SubmissionFetchResponseModel FromSubmissionHandle(SubmissionHandle handle) { if (handle == null) { throw new ArgumentNullException(nameof(handle)); } SubmissionFetchResponseModel model = new SubmissionFetchResponseModel(); using (SubmissionDataProvider submissionData = SubmissionDataProvider.Create(handle, true)) { model.SubmissionId = submissionData.SubmissionId; model.ProblemId = submissionData.ProblemId; model.Language = (int)submissionData.Language; model.Code = submissionData.Code; using (ProblemDataProvider problemData = ProblemDataProvider.Create(new ProblemHandle(submissionData.ProblemId), true)) { model.TimeLimit = problemData.TimeLimit; model.MemoryLimit = problemData.MemoryLimit; model.UseSpecialJudge = problemData.IsSpecialJudge ? BooleanTrue : BooleanFalse; } } return(model); }
/// <summary> /// 在题目库中使用给定的新题目 ID 创建已存在题目的精确副本。 /// </summary> /// <param name="newProblemId">要创建的新题目 ID。</param> /// <param name="oldProblemId">已存在的题目 ID。</param> /// <returns>新题目句柄。</returns> /// <exception cref="ArgumentNullException"/> /// <exception cref="ProblemNotExistException"/> /// <exception cref="ProblemAlreadyExistException"/> public ProblemHandle CloneProblem(string newProblemId, string oldProblemId) { if (newProblemId == null) { throw new ArgumentNullException(nameof(newProblemId)); } if (oldProblemId == null) { throw new ArgumentNullException(nameof(oldProblemId)); } ProblemHandle oldHandle = new ProblemHandle(oldProblemId); ProblemHandle newHandle = CreateProblem(newProblemId); using (ProblemDataProvider newData = ProblemDataProvider.Create(newHandle, false)) { using (ProblemDataProvider oldData = ProblemDataProvider.Create(oldHandle, true)) { oldData.CopyTo(newData); // 维护评测数据集源链接。 if (oldData.TestSuiteOrigin != null) { newData.TestSuiteOrigin = oldData.TestSuiteOrigin; } else { newData.TestSuiteOrigin = oldData.ProblemId; } } } return(newHandle); }
public ActionResult AddProblem(ProblemDetailModel model) { // 检查参数。 if (string.IsNullOrEmpty(Request.QueryString["id"])) { return(Redirect("~/Contest")); } int contestId; if (!int.TryParse(Request.QueryString["id"], out contestId)) { return(Redirect("~/Contest")); } if (!ContestManager.Default.IsContestExist(contestId)) { return(Redirect("~/Contest")); } // 验证数据模型。 if (!TryValidateModel(model)) { ViewBag.TitleErrorMessage = ModelStateHelper.GetFirstError(ModelState, "Title"); return(View(model)); } ContestHandle contestHandle = new ContestHandle(contestId); using (ContestDataProvider contestData = ContestDataProvider.Create(contestHandle, false)) { // 验证用户操作权限。 if (!UserSession.IsAuthorized(Session) || string.Compare(contestData.Creator, UserSession.GetUsername(Session), false) != 0) { return(Redirect("~/Error/AccessDenied")); } // 在题目库中创建题目。 ProblemHandle problemHandle = ProblemArchieveManager.Default.CreateProblem( contestData.PeekNextProblemId()); model.ResetNullStrings(); model.SaveTo(problemHandle); // 为避免死锁,该句不应放置在下面的 using 块中。 using (ProblemDataProvider problemData = ProblemDataProvider.Create(problemHandle, false)) { problemData.ContestId = contestId; problemData.AuthorizationGroup = UserGroup.Guests; } // 将创建的题目添加至当前比赛中。 contestData.AddProblem(problemHandle); } return(Redirect($"~/Contest/Show?id={contestId}")); }
/// <summary> /// 检查给定的用户能否访问给定的题目。 /// </summary> /// <param name="problemHandle">题目句柄。</param> /// <param name="userHandle">用户句柄。若当前会话尚未活动登录用户,传入 null。</param> /// <returns>一个值,该值只是给定身份权限的用户能否访问给定的题目。</returns> /// <exception cref="ArgumentNullException"/> public static DataAccess GetUserAccess(ProblemHandle problemHandle, UserHandle userHandle) { if (problemHandle == null) { throw new ArgumentNullException(nameof(problemHandle)); } /* * 检查顺序如下: * 1. 用户为管理员; * 2. 题目为比赛题目; * 3. 用户用户组权限低于题目要求的最低用户组权限。 * */ // 检查用户是否为管理员身份。 if (userHandle != null && UserAuthorization.CheckAccessRights(UserGroup.Administrators, UserAuthorization.GetUserGroup(userHandle))) { return(DataAccess.ReadWrite); } using (ProblemDataProvider problemData = ProblemDataProvider.Create(problemHandle, true)) { if (problemData.ContestId != -1) { // 比赛题目。 if (userHandle == null) { return(DataAccess.None); } ContestHandle contestHandle = ContestManager.Default.QueryContestById(problemData.ContestId); return(ContestAuthorization.GetUserAccess(contestHandle, userHandle)); } else { // 主题目库题目 UserGroup usergroup = (userHandle == null) ? UserGroup.Guests : UserAuthorization.GetUserGroup(userHandle); if (UserAuthorization.CheckAccessRights(problemData.AuthorizationGroup, usergroup)) { return(DataAccess.Read); } else { return(DataAccess.None); } } } }
// GET: Archieve/TestSet?id={ProblemID} public ActionResult TestSet() { // 执行用户身份验证。 if (!UserSession.IsAuthorized(Session)) { return(Redirect("~/Error/AccessDenied")); } // 检查查询参数。 if (string.IsNullOrEmpty(Request.QueryString["id"])) { return(Redirect("~/Archieve")); } string problemId = Request.QueryString["id"]; ProblemHandle problemHandle = ProblemArchieveManager.Default.GetProblemById(problemId); if (problemHandle == null) { // 给定的题目不存在。 return(Redirect("~/Archieve")); } using (ProblemDataProvider problemData = ProblemDataProvider.Create(problemHandle, true)) { // 执行进一步身份验证。 if (problemData.ContestId == -1) { if (!UserAuthorization.CheckAccessRights(UserGroup.Administrators, UserSession.GetUserGroup(Session))) { return(Redirect("~/Error/AccessDenied")); } } else { ContestHandle contestHandle = new ContestHandle(problemData.ContestId); using (ContestDataProvider contestData = ContestDataProvider.Create(contestHandle, true)) { if (string.Compare(contestData.Creator, UserSession.GetUsername(Session), false) != 0) { return(Redirect("~/Error/AccessDenied")); } } } } // TODO: 完成 Archieve/TestSet 控制器逻辑。 return(View()); }
public ActionResult AddArchieveProblem(FormCollection form) { // 验证参数。 if (string.IsNullOrEmpty(Request.QueryString["contestId"]) || string.IsNullOrEmpty(form["ProblemId"])) { return(new ContentResult()); } string problemId = form["ProblemId"]; int contestId; if (!int.TryParse(Request.QueryString["contestId"], out contestId)) { return(new ContentResult()); } if (!ProblemArchieveManager.Default.IsProblemExist(problemId) || !ContestManager.Default.IsContestExist(contestId)) { return(new ContentResult()); } using (ContestDataProvider contestData = ContestDataProvider.Create(new ContestHandle(contestId), false)) { // 检查用户操作权限。 if (!UserSession.IsAuthorized(Session) || string.Compare(contestData.Creator, UserSession.GetUsername(Session), false) != 0) { return(new ContentResult()); } // 执行操作。 // 创建源题目的精确副本到当前比赛中。 ProblemHandle newProblemHandle = ProblemArchieveManager.Default.CloneProblem( contestData.PeekNextProblemId(), problemId); using (ProblemDataProvider problemData = ProblemDataProvider.Create(newProblemHandle, false)) { problemData.ContestId = contestId; } contestData.AddProblem(newProblemHandle); } return(new ContentResult()); }
public ActionResult Environment(ProblemEnvironmentModel model) { // 检查操作权限。 if (!UserSession.IsAuthorized(Session) || !UserAuthorization.CheckAccessRights(UserGroup.Administrators, UserSession.GetUserGroup(Session))) { return(Redirect("~/Error/AccessDenied")); } if (!TryValidateModel(model)) { if (ModelState["TimeLimit"] != null && ModelState["TimeLimit"].Errors.Count > 0) { ViewBag.TimeLimitErrorMessage = ModelState["TimeLimit"].Errors[0].ErrorMessage; } if (ModelState["MemoryLimit"] != null && ModelState["MemoryLimit"].Errors.Count > 0) { ViewBag.MemoryLimitErrorMessage = ModelState["MemoryLimit"].Errors[0].ErrorMessage; } return(View(model)); } if (string.IsNullOrEmpty(Request.Form["ProblemId"])) { return(Redirect("~/Archieve")); } // 更新数据库数据。 ProblemHandle handle = ProblemArchieveManager.Default.GetProblemById(model.ProblemId); if (handle == null) { return(Redirect("~/Error/ProblemNotExist")); } using (ProblemDataProvider data = ProblemDataProvider.Create(handle, false)) { data.TimeLimit = model.TimeLimit; data.MemoryLimit = model.MemoryLimit; data.IsSpecialJudge = model.UseSpecialJudge; } return(Redirect(string.Format("~/Archieve/ShowProblem?id={0}", model.ProblemId))); }
/// <summary> /// 从给定的题目句柄创建 ProblemEnvironmentModel 数据对象。 /// </summary> /// <param name="handle">题目句柄。</param> /// <returns>从给定题目句柄创建的 ProblemEnvironmentModel 对象。</returns> /// <exception cref="ArgumentNullException"/> public static ProblemEnvironmentModel FromProblemHandle(ProblemHandle handle) { if (handle == null) { throw new ArgumentNullException(nameof(handle)); } ProblemEnvironmentModel model = new ProblemEnvironmentModel(); using (ProblemDataProvider data = ProblemDataProvider.Create(handle, true)) { model.ProblemId = data.ProblemId; model.Title = data.Title; model.TimeLimit = data.TimeLimit; model.MemoryLimit = data.MemoryLimit; model.UseSpecialJudge = data.IsSpecialJudge; } return(model); }
/// <summary> /// 从给定的题目句柄创建 ProblemInfoModel 对象。 /// </summary> /// <param name="handle">题目句柄。</param> /// <returns>从给定的题目句柄创建的 ProblemInfoModel 对象。</returns> /// <exception cref="ArgumentNullException"/> public static ProblemBriefModel FromProblemHandle(ProblemHandle handle) { if (handle == null) { throw new ArgumentNullException(nameof(handle)); } using (ProblemDataProvider data = ProblemDataProvider.Create(handle, true)) { return(new ProblemBriefModel() { ProblemId = handle.ProblemId, Title = data.Title, Categories = data.GetCategories(), TotalSubmissions = data.TotalSubmissions, TotalAccepted = data.AcceptedSubmissions, AuthorizationGroup = data.AuthorizationGroup, }); } }
/// <summary> /// 将当前对象中的数据写入给定的题目中。 /// </summary> /// <param name="handle">题目句柄。</param> /// <exception cref="ArgumentNullException"/> public void SaveTo(ProblemHandle handle) { if (handle == null) { throw new ArgumentNullException(nameof(handle)); } using (ProblemDataProvider data = ProblemDataProvider.Create(handle, false)) { data.Title = Title; data.Description = Description; data.InputDescription = InputDescription; data.OutputDescription = OutputDescription; data.InputExample = InputExample; data.OutputExample = OutputExample; data.Hint = Hint; data.Source = Source; data.Author = Author; data.AuthorizationGroup = UsergroupConvert.ConvertFromString(UserGroupName); } }
/// <summary> /// 将当前数据模型对象中的数据存入给定的题目数据提供器。 /// </summary> /// <param name="data">要存入的题目数据提供器。</param> /// <exception cref="ArgumentNullException"/> /// <exception cref="InvalidOperationException"/> public void SaveTo(ProblemHandle handle) { if (handle == null) { throw new ArgumentNullException(nameof(handle)); } using (ProblemDataProvider data = ProblemDataProvider.Create(handle, false)) { data.Title = Title; data.Description = Description; data.InputDescription = InputDescription; data.OutputDescription = OutputDescription; data.InputExample = InputExample; data.OutputExample = OutputExample; data.Hint = Hint; data.Source = Source; data.Author = Author; data.TimeLimit = TimeLimit; data.MemoryLimit = MemoryLimit; data.IsSpecialJudge = IsSpecialJudge; } }