コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
        /// <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);
        }
コード例 #4
0
        /// <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);
        }
コード例 #5
0
        /// <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);
        }
コード例 #6
0
        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}"));
        }
コード例 #7
0
        /// <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);
                    }
                }
            }
        }
コード例 #8
0
        // 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());
        }
コード例 #9
0
        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());
        }
コード例 #10
0
        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)));
        }
コード例 #11
0
        /// <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);
        }
コード例 #12
0
        /// <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,
                });
            }
        }
コード例 #13
0
        /// <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);
            }
        }
コード例 #14
0
        /// <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;
            }
        }