core: homework: 修正导出逻辑 & record: 添加统计信息

This commit is contained in:
undefined committed 2021-01-25 23:01:40 +08:00
1 parent f0c1b49ac1
commit df0982c690
4 files changed
+20 -9

No files matched your search

+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "hydrooj", "name": "hydrooj",
"version": "2.17.2", "version": "2.17.3",
"bin": "bin/hydrooj.js", "bin": "bin/hydrooj.js",
"main": "dist/loader.js", "main": "dist/loader.js",
"typings": "dist/loader.d.ts", "typings": "dist/loader.d.ts",
+7 -4
View File
@@ -356,7 +356,7 @@ class HomeworkScoreboardHandler extends HomeworkHandler {
]; ];
this.response.template = 'contest_scoreboard.html'; this.response.template = 'contest_scoreboard.html';
this.response.body = { this.response.body = {
tdoc, rows, path, udict, tdoc, rows, path, udict, page_name: 'homework_scoreboard',
}; };
} }
} }
@@ -370,8 +370,8 @@ class HomeworkScoreboardDownloadHandler extends HomeworkHandler {
html: (rows) => this.renderHTML('contest_scoreboard_download_html.html', { rows }), html: (rows) => this.renderHTML('contest_scoreboard_download_html.html', { rows }),
}; };
if (!getContent[ext]) throw new ValidationError('ext'); if (!getContent[ext]) throw new ValidationError('ext');
const [, rows] = await this.getScoreboard(domainId, tid, true, document.TYPE_HOMEWORK); const [tdoc, rows] = await this.getScoreboard(domainId, tid, true, document.TYPE_HOMEWORK);
this.binary(await getContent[ext](rows), `${this.tdoc.title}.${ext}`); this.binary(await getContent[ext](rows), `${tdoc.title}.${ext}`);
} }
} }
@@ -407,7 +407,10 @@ export async function apply() {
Route('homework_create', '/homework/create', HomeworkCreateHandler, PERM.PERM_CREATE_HOMEWORK); Route('homework_create', '/homework/create', HomeworkCreateHandler, PERM.PERM_CREATE_HOMEWORK);
Route('homework_detail', '/homework/:tid', HomeworkDetailHandler, PERM.PERM_VIEW_HOMEWORK); Route('homework_detail', '/homework/:tid', HomeworkDetailHandler, PERM.PERM_VIEW_HOMEWORK);
Route('homework_scoreboard', '/homework/:tid/scoreboard', HomeworkScoreboardHandler, PERM.PERM_VIEW_HOMEWORK_SCOREBOARD); Route('homework_scoreboard', '/homework/:tid/scoreboard', HomeworkScoreboardHandler, PERM.PERM_VIEW_HOMEWORK_SCOREBOARD);
Route('homework_scoreboard', '/homework/:tid/scoreboard/download/:ext', HomeworkScoreboardDownloadHandler, PERM.PERM_VIEW_HOMEWORK_SCOREBOARD); Route(
'homework_scoreboard_download', '/homework/:tid/scoreboard/download/:ext',
HomeworkScoreboardDownloadHandler, PERM.PERM_VIEW_HOMEWORK_SCOREBOARD,
);
Route('homework_detail_problem', '/homework/:tid/p/:pid', HomeworkDetailProblemHandler, PERM.PERM_VIEW_HOMEWORK); Route('homework_detail_problem', '/homework/:tid/p/:pid', HomeworkDetailProblemHandler, PERM.PERM_VIEW_HOMEWORK);
Route('homework_detail_problem_submit', '/homework/:tid/p/:pid/submit', HomeworkDetailProblemSubmitHandler, PERM.PERM_SUBMIT_PROBLEM); Route('homework_detail_problem_submit', '/homework/:tid/p/:pid/submit', HomeworkDetailProblemSubmitHandler, PERM.PERM_SUBMIT_PROBLEM);
Route('homework_code', '/homework/:tid/code', HomeworkCodeHandler, PERM.PERM_VIEW_HOMEWORK); Route('homework_code', '/homework/:tid/code', HomeworkCodeHandler, PERM.PERM_VIEW_HOMEWORK);
+8 -2
View File
@@ -1,6 +1,8 @@
import { FilterQuery, ObjectID } from 'mongodb'; import { FilterQuery, ObjectID } from 'mongodb';
import { PermissionError, RecordNotFoundError } from '../error'; import { PermissionError, RecordNotFoundError } from '../error';
import { PERM, CONSTANT, STATUS } from '../model/builtin'; import {
PERM, CONSTANT, STATUS, PRIV,
} from '../model/builtin';
import * as problem from '../model/problem'; import * as problem from '../model/problem';
import * as record from '../model/record'; import * as record from '../model/record';
import * as contest from '../model/contest'; import * as contest from '../model/contest';
@@ -19,7 +21,8 @@ class RecordListHandler extends RecordHandler {
@param('pid', Types.String, true) @param('pid', Types.String, true)
@param('tid', Types.ObjectID, true) @param('tid', Types.ObjectID, true)
@param('uidOrName', Types.String, true) @param('uidOrName', Types.String, true)
async get(domainId: string, page = 1, pid?: string, tid?: ObjectID, uidOrName?: string) { @param('allDomain', Types.Boolean, true)
async get(domainId: string, page = 1, pid?: string, tid?: ObjectID, uidOrName?: string, all = false) {
this.response.template = 'record_main.html'; this.response.template = 'record_main.html';
const q: FilterQuery<Rdoc> = { 'contest.tid': tid, hidden: false }; const q: FilterQuery<Rdoc> = { 'contest.tid': tid, hidden: false };
if (uidOrName) { if (uidOrName) {
@@ -63,6 +66,9 @@ class RecordListHandler extends RecordHandler {
filterTid: tid, filterTid: tid,
filterUidOrName: uidOrName, filterUidOrName: uidOrName,
}; };
if (this.user.hasPriv(PRIV.PRIV_VIEW_JUDGE_STATISTICS)) {
this.response.body.statistics = await record.stat(all ? undefined : domainId);
}
} }
} }
+4 -2
View File
@@ -58,15 +58,17 @@ export async function get(domainId: string, _id: ObjectID): Promise<Rdoc | null>
} }
export async function stat(domainId?: string) { export async function stat(domainId?: string) {
const [d5min, d1h, d1d, d1m, total] = await Promise.all([ const [d5min, d1h, day, week, month, year, total] = await Promise.all([
coll.find({ _id: { $gte: Time.getObjectID(moment().add(-5, 'minutes')) }, ...domainId ? { domainId } : {} }).count(), coll.find({ _id: { $gte: Time.getObjectID(moment().add(-5, 'minutes')) }, ...domainId ? { domainId } : {} }).count(),
coll.find({ _id: { $gte: Time.getObjectID(moment().add(-1, 'hour')) }, ...domainId ? { domainId } : {} }).count(), coll.find({ _id: { $gte: Time.getObjectID(moment().add(-1, 'hour')) }, ...domainId ? { domainId } : {} }).count(),
coll.find({ _id: { $gte: Time.getObjectID(moment().add(-1, 'day')) }, ...domainId ? { domainId } : {} }).count(), coll.find({ _id: { $gte: Time.getObjectID(moment().add(-1, 'day')) }, ...domainId ? { domainId } : {} }).count(),
coll.find({ _id: { $gte: Time.getObjectID(moment().add(-1, 'week')) }, ...domainId ? { domainId } : {} }).count(),
coll.find({ _id: { $gte: Time.getObjectID(moment().add(-1, 'month')) }, ...domainId ? { domainId } : {} }).count(), coll.find({ _id: { $gte: Time.getObjectID(moment().add(-1, 'month')) }, ...domainId ? { domainId } : {} }).count(),
coll.find({ _id: { $gte: Time.getObjectID(moment().add(-1, 'year')) }, ...domainId ? { domainId } : {} }).count(),
coll.find(domainId ? { domainId } : {}).count(), coll.find(domainId ? { domainId } : {}).count(),
]); ]);
return { return {
d5min, d1h, d1d, d1m, total, d5min, d1h, day, week, month, year, total,
}; };
} }