4ebcecfab4
fix: 修掉重写期间在旧后端发现的 6 个问题
...
这些是做 Bun 重写时逐行对照发现的,旧后端现在还在线上跑,学生今天就在踩。
每条都在本地起 Django + postgres 实跑验证过,**正反两面都验**:越权要挡住、
正常操作要还能用。合计 14 条断言全过。
## 越权(跨教师)
**ACMContestHelper.put** — 只按 pk 取 rank,任何老师都能改**别人比赛**里的
检查标记。而 `contest_id` 明明在 ACMContesHelperSerializer 里、客户端一直在传,
视图完全没用它。改成按 (pk, contest_id) 取 + ensure_created_by。
同类的 get 本来就有 ensure_created_by,是 put 漏了。
**AddContestProblemAPI.post** — 一个权限装饰器都没有,导致两件事:
- 少 problem_permission_required:problem_permission=None 的学生管理员也能建题
- 少 ensure_created_by:任何管理员都能往**别人的比赛**里塞题
另外源题只按 id 取,能把别人比赛里的赛题(或别人未公开的草稿)拷进自己的比赛,
连 answers 参考答案一起拿到。改成源题必须是公开题库题,不可见的要求归属。
(中间件 AdminRoleRequiredMiddleware 只保证"是管理员身份",挡不住这些。)
## 会 500
**ProblemVisibleAPI.put** — `self.error(...)` 漏写 return,题不存在时继续执行到
未赋值的 problem,抛 UnboundLocalError → 500。
## 数据正确性
**ProblemSetAdminAPI.get** — 后台列表写死 filter(visible=True),而列表里就有
可见性开关:一旦关掉,题单从后台消失,教师再也找不到、也无法在界面上打开回来。
后台列表不该过滤 visible,前台该。
**增删题单题目不重算进度** — 题目数是进度的分母。不重算的话学生进度百分比全是
虚高的,原本标"已完成"的人会一直是已完成。更麻烦的是那个手动同步接口
(ProblemSetSyncAPI)前端没有调用点,等于**界面上根本没办法修**。
改成增删之后直接 sync_all_progress_for_problemset。
**移除用户留下孤儿奖章** — 只删了 ProblemSetProgress,UserBadge 还在。学生个人页
会一直挂着一个自己已不在的题单的奖章,而且重新加入时因唯一约束拿不到第二次。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-08 06:50:47 -06:00
7be5975d88
feat(problemset): 用户奖章接口带出所属题单
...
成就页的奖章列表只有奖章本身,看不出来自哪个题单。UserBadgeSerializer
补一个 problemset 字段,查询改 select_related("badge__problemset") —— 这是
异步视图,不预加载会在异步上下文里发同步查询。
2026-08-05 13:53:03 -06:00
3a9ab83ba5
style: ruff format 全仓库
...
行宽 180 下把历史遗留的折行表达式合并,无语义改动。
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com >
2026-08-05 04:45:26 -06:00
8ecfeb5e36
fix(problemset): 奖章判定修复 N+1 与并发冲突并接入通知
2026-08-04 04:40:17 -06:00
385d04505b
feat: open teaching analytics to Teacher Admin
...
StuckProblems, TopACTrend, AI user analysis, and problemset user
progress are now accessible to Teacher Admin (previously super-only).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-06-02 18:17:26 -06:00
f94d29cf93
feat: add Teacher Admin role to four-tier permission system
...
Introduces a four-tier role system: Regular User → Student Admin →
Teacher Admin → Super Admin. Teacher Admin can manage own contests,
problemsets, and view classroom data. Student Admin (renamed from Admin)
retains problem management only.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-06-02 18:13:33 -06:00
6b81856bfd
refactor: replace sync_to_async aggregate with aaggregate in problemset views
2026-05-26 21:48:30 -06:00
57c0572fd9
async
2026-05-26 21:25:26 -06:00
980b803517
feat: update all query filters to treat AST_CHECK_FAILED as accepted
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-25 20:45:15 -06:00
65c48437a9
fix
2026-05-24 20:44:02 -06:00
c3ce76bc47
fix
2026-05-21 18:46:40 -06:00
1d08b29255
fix
2026-05-21 01:55:46 -06:00
f5df51f7b2
fix problemset
2026-05-20 09:31:45 -06:00
e4e8b7759d
update for django6
2026-05-09 05:57:30 -06:00
c466dfd3c6
change enum
2026-05-09 02:30:47 -06:00
e2d566436f
add index for models
2026-04-23 14:10:48 -06:00
028ea6e5f9
fmt
2026-04-23 13:57:56 -06:00
24ff67ec0c
fix
2026-03-30 09:34:38 -06:00
ab62d7bff8
add end_time
2026-03-16 23:44:47 +08:00
afde8dfc40
fix problemset list N+1
2025-12-26 17:11:35 +08:00
72a2de50bf
problemset filtered by completion
2025-12-23 20:56:54 +08:00
37e2599754
fix all problems
2025-12-22 19:21:40 +08:00
b1189e1a0b
fix
2025-12-22 19:06:58 +08:00
8a773ebc74
fix
2025-12-22 18:57:52 +08:00
bf48f7bc34
fix
2025-12-22 18:52:30 +08:00
59a5efd6bd
fix N+1 query
2025-12-22 18:46:17 +08:00
391647785c
fix
2025-12-20 22:09:23 +08:00
a8c7320a6b
fix
2025-11-30 19:02:54 +08:00
765af52bd9
filter by class
2025-11-30 18:41:51 +08:00
70bb6aec1e
fix problemset stats
2025-11-24 20:40:12 +08:00
5900547910
fix
2025-11-02 20:35:15 +08:00
e06b716b78
fix
2025-10-27 18:33:58 +08:00
cf4de8a7fa
update
2025-10-27 17:33:00 +08:00
20c8aeffab
update
2025-10-24 11:19:50 +08:00
e970328c7d
update
2025-10-23 23:22:04 +08:00
1b06e94473
update
2025-10-23 16:09:40 +08:00
03f1bfdf86
update
2025-10-23 12:42:24 +08:00
69b22660ca
update
2025-10-23 10:54:59 +08:00
f0dc86265b
update
2025-10-23 09:36:03 +08:00
32a608476d
update
2025-10-23 00:54:06 +08:00
f4318a069d
fix
2025-10-22 20:36:20 +08:00
c87022793e
fix
2025-10-22 20:29:12 +08:00
07aaff69f2
add problemset
2025-10-22 18:47:40 +08:00