mirror of
https://gitcode.com/gh_mirrors/hy/Hydro.git
synced 2026-10-17 17:36:08 +08:00
core: allow coping copied problems
This commit is contained in:
2 files changed
+19
-9
No files matched your search
@@ -13,8 +13,8 @@ import {
|
||||
BadRequestError, ContestNotAttendedError, ContestNotEndedError, ContestNotFoundError, ContestNotLiveError,
|
||||
FileLimitExceededError, HackFailedError, NoProblemError, NotFoundError,
|
||||
PermissionError, ProblemAlreadyExistError, ProblemAlreadyUsedByContestError, ProblemConfigError,
|
||||
ProblemIsReferencedError, ProblemNotAllowLanguageError, ProblemNotAllowPretestError, ProblemNotFoundError,
|
||||
RecordNotFoundError, SolutionNotFoundError, ValidationError,
|
||||
ProblemIsReferencedError, ProblemNotAllowCopyError, ProblemNotAllowLanguageError, ProblemNotAllowPretestError,
|
||||
ProblemNotFoundError, RecordNotFoundError, SolutionNotFoundError, ValidationError,
|
||||
} from '../error';
|
||||
import {
|
||||
ProblemDoc, ProblemSearchOptions, ProblemStatusDoc, RecordDoc, User,
|
||||
@@ -414,15 +414,24 @@ export class ProblemDetailHandler extends ContestDetailBaseHandler {
|
||||
}
|
||||
|
||||
@param('target', Types.String)
|
||||
async postCopy(domainId: string, target: string) {
|
||||
if (this.pdoc.reference) throw new BadRequestError('Cannot copy a referenced problem');
|
||||
const t = `,${this.domain.share || ''},`;
|
||||
if (t !== ',*,' && !t.includes(`,${target},`)) throw new PermissionError(target);
|
||||
const ddoc = await domain.get(target);
|
||||
async postCopy({ }, target: string) {
|
||||
let t = `,${this.domain.share || ''},`;
|
||||
if (t !== ',*,' && !t.includes(`,${target},`)) throw new ProblemNotAllowCopyError(this.domain._id, target);
|
||||
let ddoc = await domain.get(target);
|
||||
if (!ddoc) throw new NotFoundError(target);
|
||||
const dudoc = await user.getById(target, this.user._id);
|
||||
let pdoc = this.pdoc;
|
||||
if (this.pdoc.reference) {
|
||||
[pdoc, ddoc] = await Promise.all([
|
||||
problem.get(this.pdoc.reference.domainId, this.pdoc.reference.pid),
|
||||
domain.get(this.pdoc.reference.domainId),
|
||||
]);
|
||||
if (!pdoc) throw new ProblemNotFoundError(this.pdoc.reference.domainId, this.pdoc.reference.pid);
|
||||
t = `,${ddoc.domain.share || ''},`;
|
||||
if (t !== ',*,' && !t.includes(`,${target},`)) throw new ProblemNotAllowCopyError(ddoc._id, target);
|
||||
}
|
||||
if (!dudoc.hasPerm(PERM.PERM_CREATE_PROBLEM)) throw new PermissionError(PERM.PERM_CREATE_PROBLEM);
|
||||
const docId = await problem.copy(domainId, this.pdoc.docId, target);
|
||||
const docId = await problem.copy(pdoc.domainId, pdoc.docId, target);
|
||||
this.response.redirect = this.url('problem_detail', { domainId: target, pid: docId });
|
||||
}
|
||||
|
||||
@@ -980,7 +989,7 @@ export class ProblemCreateHandler extends Handler {
|
||||
|
||||
@post('title', Types.Title)
|
||||
@post('content', Types.Content)
|
||||
@post('pid', Types.ProblemId, true, (i) => /^[a-zA-Z]+[a-zA-Z0-9]*$/i.test(i))
|
||||
@post('pid', Types.ProblemId, true, (i) => /^([a-zA-Z0-9]{1,10}-)?[a-zA-Z]+[a-zA-Z0-9]*$/i.test(i))
|
||||
@post('hidden', Types.Boolean)
|
||||
@post('difficulty', Types.PositiveInt, (i) => +i <= 10, true)
|
||||
@post('tag', Types.Content, true, null, parseCategory)
|
||||
|
||||
Reference in new issue
Block a user