Пример #1
0
        public async Task <IActionResult> Edit(int pid, int tid, TestcaseUploadModel model)
        {
            try
            {
                var last = await Store.FindAsync(pid, tid);

                if (last == null)
                {
                    return(NotFound());
                }

                (byte[], string)? input = null, output = null;
                if (model.InputContent != null)
                {
                    input = await model.InputContent.ReadAsync();
                }
                if (model.OutputContent != null)
                {
                    output = await model.OutputContent.ReadAsync();
                }

                if (input.HasValue)
                {
                    last.Md5sumInput = input.Value.Item2;
                    last.InputLength = input.Value.Item1.Length;
                    await Problems.WriteFileAsync(Problem, $"t{tid}.in", input.Value.Item1);
                }

                if (output.HasValue)
                {
                    last.Md5sumOutput = output.Value.Item2;
                    last.OutputLength = output.Value.Item1.Length;
                    await Problems.WriteFileAsync(Problem, $"t{tid}.out", output.Value.Item1);
                }

                last.Description = model.Description ?? last.Description;
                last.IsSecret    = model.IsSecret;
                last.Point       = model.Point;
                await Store.UpdateAsync(last);

                await HttpContext.AuditAsync("modified", $"{last.TestcaseId}");

                StatusMessage = $"Testcase t{tid} updated successfully.";
                return(RedirectToAction(nameof(Testcases)));
            }
            catch (Exception ex)
            {
                return(Message(
                           "Testcase Upload",
                           "Upload failed. Please contact XiaoYang. " + ex,
                           MessageType.Danger));
            }
        }
Пример #2
0
        public async Task <IActionResult> Create(int pid, TestcaseUploadModel model)
        {
            if (model.InputContent == null)
            {
                return(Message("Create testcase", "No input file specified.", MessageType.Danger));
            }
            if (model.OutputContent == null)
            {
                return(Message("Create testcase", "No output file specified.", MessageType.Danger));
            }

            try
            {
                var input = await model.InputContent.ReadAsync();

                var output = await model.OutputContent.ReadAsync();

                int rk = await Store.CountAsync(Problem);

                var e = await Store.CreateAsync(new Testcase
                {
                    Description  = model.Description ?? "1",
                    IsSecret     = model.IsSecret,
                    Point        = model.Point,
                    Md5sumInput  = input.Item2,
                    Md5sumOutput = output.Item2,
                    InputLength  = input.Item1.Length,
                    OutputLength = output.Item1.Length,
                    ProblemId    = pid,
                    Rank         = rk + 1
                });

                int tid = e.TestcaseId;

                await Problems.WriteFileAsync(Problem, $"t{tid}.in", input.Item1);

                await Problems.WriteFileAsync(Problem, $"t{tid}.out", output.Item1);

                await HttpContext.AuditAsync("modified", $"{tid}");

                StatusMessage = $"Testcase t{tid} created successfully.";
                return(RedirectToAction(nameof(Testcases)));
            }
            catch (Exception ex)
            {
                return(Message(
                           "Testcase Upload",
                           "Upload failed. Please contact XiaoYang. " + ex,
                           MessageType.Danger));
            }
        }
Пример #3
0
        public async Task <IActionResult> Edit(
            int pid, int tid, TestcaseUploadModel model,
            [FromServices] UserManager userManager)
        {
            try
            {
                var last = await DbContext.Testcases
                           .Where(t => t.TestcaseId == tid && t.ProblemId == pid)
                           .FirstOrDefaultAsync();

                if (last == null)
                {
                    return(NotFound());
                }

                (byte[], string)? input = null, output = null;
                if (model.InputContent != null)
                {
                    input = await model.InputContent.ReadAsync();
                }
                if (model.OutputContent != null)
                {
                    output = await model.OutputContent.ReadAsync();
                }

                if (input.HasValue)
                {
                    last.Md5sumInput = input.Value.Item2;
                    last.InputLength = input.Value.Item1.Length;
                    await IoContext.WriteBinaryAsync($"p{pid}", $"t{tid}.in", input.Value.Item1);
                }

                if (output.HasValue)
                {
                    last.Md5sumOutput = output.Value.Item2;
                    last.OutputLength = output.Value.Item1.Length;
                    await IoContext.WriteBinaryAsync($"p{pid}", $"t{tid}.out", output.Value.Item1);
                }

                last.Description = model.Description ?? last.Description;
                last.IsSecret    = model.IsSecret;
                last.Point       = model.Point;
                DbContext.Testcases.Update(last);

                DbContext.AuditLogs.Add(new AuditLog
                {
                    UserName  = userManager.GetUserName(User),
                    ContestId = 0,
                    Resolved  = true,
                    Time      = DateTimeOffset.Now,
                    Type      = AuditLog.TargetType.Testcase,
                    Comment   = "modified",
                    EntityId  = last.TestcaseId,
                });

                await DbContext.SaveChangesAsync();

                StatusMessage = $"Testcase t{tid} updated successfully.";
                return(RedirectToAction(nameof(Testcases)));
            }
            catch (Exception ex)
            {
                return(Message(
                           "Testcase Upload",
                           "Upload failed. Please contact XiaoYang. " + ex,
                           MessageType.Danger));
            }
        }
Пример #4
0
        public async Task <IActionResult> Create(
            int pid, TestcaseUploadModel model,
            [FromServices] UserManager userManager)
        {
            if (model.InputContent == null)
            {
                return(Message("Create testcase", "No input file specified.", MessageType.Danger));
            }
            if (model.OutputContent == null)
            {
                return(Message("Create testcase", "No output file specified.", MessageType.Danger));
            }

            try
            {
                var input = await model.InputContent.ReadAsync();

                var output = await model.OutputContent.ReadAsync();

                int rk = await DbContext.Testcases
                         .Where(p => p.ProblemId == pid)
                         .CountAsync();

                var e = DbContext.Testcases.Add(new Testcase
                {
                    Description  = model.Description ?? "1",
                    IsSecret     = model.IsSecret,
                    Point        = model.Point,
                    Md5sumInput  = input.Item2,
                    Md5sumOutput = output.Item2,
                    InputLength  = input.Item1.Length,
                    OutputLength = output.Item1.Length,
                    ProblemId    = pid,
                    Rank         = rk + 1
                });

                await DbContext.SaveChangesAsync();

                int tid = e.Entity.TestcaseId;

                DbContext.AuditLogs.Add(new AuditLog
                {
                    UserName  = userManager.GetUserName(User),
                    ContestId = 0,
                    Resolved  = true,
                    Time      = DateTimeOffset.Now,
                    Type      = AuditLog.TargetType.Testcase,
                    Comment   = "modified",
                    EntityId  = tid,
                });

                await IoContext.WriteBinaryAsync($"p{pid}", $"t{tid}.in", input.Item1);

                await IoContext.WriteBinaryAsync($"p{pid}", $"t{tid}.out", output.Item1);

                await DbContext.SaveChangesAsync();

                StatusMessage = $"Testcase t{tid} created successfully.";
                return(RedirectToAction(nameof(Testcases)));
            }
            catch (Exception ex)
            {
                return(Message(
                           "Testcase Upload",
                           "Upload failed. Please contact XiaoYang. " + ex,
                           MessageType.Danger));
            }
        }