core&ui: add contest/homework group filter (#589)

This commit is contained in:
panda authored and GitHub committed 2023-06-09 16:01:26 +08:00
1 parent 93bf79e6ad
commit 6f6bdee077
5 files changed
+47 -12

No files matched your search

+10 -5
View File
@@ -73,32 +73,37 @@ ScheduleModel.Worker.addHandler('contest', async (doc) => {
export class ContestListHandler extends Handler {
@param('rule', Types.Range(contest.RULES), true)
@param('group', Types.Name, true)
@param('page', Types.PositiveInt, true)
async get(domainId: string, rule = '', page = 1) {
async get(domainId: string, rule = '', group = '', page = 1) {
if (rule && contest.RULES[rule].hidden) throw new BadRequestError();
const groups = (await user.listGroup(domainId, this.user._id)).map((i) => i.name);
if (group && !groups.includes(group)) throw new NotAssignedError(group);
const rules = Object.keys(contest.RULES).filter((i) => !contest.RULES[i].hidden);
const q = {
...this.user.hasPerm(PERM.PERM_VIEW_HIDDEN_CONTEST)
...this.user.hasPerm(PERM.PERM_VIEW_HIDDEN_CONTEST) && !group
? {}
: {
$or: [
{ maintainer: this.user._id },
{ owner: this.user._id },
{ assign: { $in: this.user.group } },
{ assign: { $in: groups } },
{ assign: { $size: 0 } },
],
},
...rule ? { rule } : { rule: { $in: rules } },
...group ? { assign: { $in: [group] } } : {},
};
const cursor = contest.getMulti(domainId, q);
const qs = rule ? `rule=${rule}` : '';
let qs = rule ? `rule=${rule}` : '';
if (group) qs += qs ? `&group=${group}` : `group=${group}`;
const [tdocs, tpcount] = await paginate<Tdoc>(cursor, page, system.get('pagination.contest'));
const tids = [];
for (const tdoc of tdocs) tids.push(tdoc.docId);
const tsdict = await contest.getListStatus(domainId, this.user._id, tids);
this.response.template = 'contest_main.html';
this.response.body = {
page, tpcount, qs, rule, tdocs, tsdict,
page, tpcount, qs, rule, tdocs, tsdict, groups, group,
};
}
}