diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 8cf4c596c..799e9d58e 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.28.14", + "version": "2.28.15", "bin": "bin/hydrooj.js", "main": "dist/loader.js", "typings": "dist/loader.d.ts", diff --git a/packages/hydrooj/src/handler/contest.ts b/packages/hydrooj/src/handler/contest.ts index 5d260fc23..b0e6601a8 100644 --- a/packages/hydrooj/src/handler/contest.ts +++ b/packages/hydrooj/src/handler/contest.ts @@ -343,24 +343,26 @@ export class ContestDetailProblemSubmitHandler extends ContestProblemHandler { @param('lang', Types.Name) @param('code', Types.Content) @param('pid', Types.Name) - async post(domainId: string, tid: ObjectID, lang: string, code: string, _pid: string) { + @param('pretest', Types.Boolean) + @param('input', Types.String, true) + async post(domainId: string, tid: ObjectID, lang: string, code: string, _pid: string, pretest = false, input = '') { const pid = this.tdoc.pids[parseInt(_pid, 36) - 10]; if (this.response.body.pdoc.config?.langs && !this.response.body.pdoc.config.langs.includes(lang)) { throw new BadRequestError('Language not allowed.'); } await this.limitRate('add_record', 60, 10); - const rid = await record.add(domainId, pid, this.user._id, lang, code, true, { + const rid = await record.add(domainId, pid, this.user._id, lang, code, true, pretest ? input : { type: document.TYPE_CONTEST, tid, }); - const [rdoc] = await Promise.all([ - record.get(domainId, rid), + const rdoc = await record.get(domainId, rid); + await Promise.all([ problem.inc(domainId, pid, 'nSubmit', 1), domain.incUserInDomain(domainId, this.user._id, 'nSubmit'), contest.updateStatus(domainId, tid, this.user._id, rid, pid), ]); bus.boardcast('record/change', rdoc); - if (!contest.canShowRecord.call(this, this.tdoc)) { + if (!pretest && !contest.canShowRecord.call(this, this.tdoc)) { this.response.body = { tid }; this.response.redirect = this.url('contest_detail', { tid }); } else { diff --git a/packages/hydrooj/src/handler/homework.ts b/packages/hydrooj/src/handler/homework.ts index 466805f92..45a20acdf 100644 --- a/packages/hydrooj/src/handler/homework.ts +++ b/packages/hydrooj/src/handler/homework.ts @@ -217,20 +217,22 @@ class HomeworkDetailProblemSubmitHandler extends HomeworkDetailProblemHandler { @param('pid', Types.String) @param('code', Types.Content) @param('lang', Types.Name) - async post(domainId: string, tid: ObjectID, _pid: string, code: string, lang: string) { + @param('pretest', Types.Boolean) + @param('input', Types.String, true) + async post(domainId: string, tid: ObjectID, _pid: string, code: string, lang: string, pretest = false, input = '') { const pid = this.tdoc.pids[parseInt(_pid, 36) - 10]; if (this.response.body.pdoc.config?.langs && !this.response.body.pdoc.config.langs.includes(lang)) { throw new BadRequestError('Language not allowed.'); } await this.limitRate('add_record', 60, 5); - const rid = await record.add(domainId, pid, this.user._id, lang, code, true, { + const rid = await record.add(domainId, pid, this.user._id, lang, code, true, pretest ? input : { type: document.TYPE_HOMEWORK, tid, }); const pdomainId = typeof pid === 'string' ? pid.split(':')[0] : domainId; const ppid = typeof pid === 'number' ? pid : +pid.split(':')[1]; - const [rdoc] = await Promise.all([ - record.get(domainId, rid), + const rdoc = await record.get(domainId, rid); + await Promise.all([ problem.inc(pdomainId, ppid, 'nSubmit', 1), domain.incUserInDomain(domainId, this.user._id, 'nSubmit'), contest.updateStatus(domainId, tid, this.user._id, @@ -239,7 +241,7 @@ class HomeworkDetailProblemSubmitHandler extends HomeworkDetailProblemHandler { bus.boardcast('record/change', rdoc); this.response.body.tid = tid; this.response.body.rid = rid; - if (contest.canShowRecord.call(this, this.tdoc)) this.response.redirect = this.url('record_detail', { rid }); + if (pretest || contest.canShowRecord.call(this, this.tdoc)) this.response.redirect = this.url('record_detail', { rid }); else this.response.redirect = this.url('homework_detail', { tid }); } } diff --git a/packages/hydrooj/src/handler/problem.ts b/packages/hydrooj/src/handler/problem.ts index 0e257270a..76be80a1b 100644 --- a/packages/hydrooj/src/handler/problem.ts +++ b/packages/hydrooj/src/handler/problem.ts @@ -267,18 +267,22 @@ export class ProblemSubmitHandler extends ProblemDetailHandler { @param('lang', Types.Name) @param('code', Types.Content) - async post(domainId: string, lang: string, code: string) { + @param('pretest', Types.Boolean) + @param('input', Types.String, true) + async post(domainId: string, lang: string, code: string, pretest = false, input = '') { if (this.response.body.pdoc.config?.langs && !this.response.body.pdoc.config.langs.includes(lang)) { throw new BadRequestError('Language not allowed.'); } await this.limitRate('add_record', 60, 5); - const rid = await record.add(domainId, this.pdoc.docId, this.user._id, lang, code, true); - const [rdoc] = await Promise.all([ - record.get(domainId, rid), - problem.inc(domainId, this.pdoc.docId, 'nSubmit', 1), - problem.incStatus(domainId, this.pdoc.docId, this.user._id, 'nSubmit', 1), - domain.incUserInDomain(domainId, this.user._id, 'nSubmit'), - ]); + const rid = await record.add(domainId, this.pdoc.docId, this.user._id, lang, code, true, pretest ? input : undefined); + const rdoc = await record.get(domainId, rid); + if (!pretest) { + await Promise.all([ + problem.inc(domainId, this.pdoc.docId, 'nSubmit', 1), + problem.incStatus(domainId, this.pdoc.docId, this.user._id, 'nSubmit', 1), + domain.incUserInDomain(domainId, this.user._id, 'nSubmit'), + ]); + } bus.boardcast('record/change', rdoc); this.response.body = { rid }; this.response.redirect = this.url('record_detail', { rid }); @@ -613,7 +617,6 @@ export async function apply() { Route('problem_random', '/problem/random', ProblemRandomHandler, PERM.PERM_VIEW_PROBLEM); Route('problem_detail', '/p/:pid', ProblemDetailHandler, PERM.PERM_VIEW_PROBLEM); Route('problem_submit', '/p/:pid/submit', ProblemSubmitHandler, PERM.PERM_SUBMIT_PROBLEM); - Route('problem_pretest', '/p/:pid/pretest', ProblemPretestHandler, PERM.PERM_SUBMIT_PROBLEM); Route('problem_edit', '/p/:pid/edit', ProblemEditHandler); Route('problem_files', '/p/:pid/files', ProblemFilesHandler, PERM.PERM_VIEW_PROBLEM); Route('problem_file_download', '/p/:pid/file/:filename', ProblemFileDownloadHandler, PERM.PERM_VIEW_PROBLEM); diff --git a/packages/ui-default/components/scratchpad/ScratchpadToolbarContainer.jsx b/packages/ui-default/components/scratchpad/ScratchpadToolbarContainer.jsx index 1f346d9ec..13771e5f4 100644 --- a/packages/ui-default/components/scratchpad/ScratchpadToolbarContainer.jsx +++ b/packages/ui-default/components/scratchpad/ScratchpadToolbarContainer.jsx @@ -37,10 +37,11 @@ const mapDispatchToProps = (dispatch) => ({ }); }, postPretest(props) { - const req = request.post(UiContext.postPretestUrl, { + const req = request.post(UiContext.postSubmitUrl, { lang: props.editorLang, code: props.editorCode, input: props.pretestInput || ' ', + pretest: true, }); dispatch({ type: 'SCRATCHPAD_POST_PRETEST', diff --git a/packages/ui-default/package.json b/packages/ui-default/package.json index 8938831b8..be9584f79 100644 --- a/packages/ui-default/package.json +++ b/packages/ui-default/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/ui-default", - "version": "4.11.6", + "version": "4.11.7", "author": "undefined ", "license": "AGPL-3.0", "main": "hydro.js", diff --git a/packages/ui-default/templates/problem_detail.html b/packages/ui-default/templates/problem_detail.html index 5f12a0d7d..18dc8a3bd 100644 --- a/packages/ui-default/templates/problem_detail.html +++ b/packages/ui-default/templates/problem_detail.html @@ -5,7 +5,6 @@ {{ set(UiContext, { problemId: pdoc.pid|default(pdoc.docId), problemNumId: pdoc.docId, - postPretestUrl: url('problem_pretest', pid=pdoc.docId), codeLang: handler.user.codeLang, codeTemplate: handler.user.codeTemplate, pdoc: pdoc