This commit is contained in:
2026-03-18 14:50:24 +08:00
parent 3a58925764
commit 7e5e02c7e6
10 changed files with 231 additions and 25 deletions

View File

@@ -6,6 +6,7 @@ from ninja.pagination import paginate
from ninja.errors import HttpError
from .schemas import (
BatchUsersIn,
ClassStudentEntry,
LeaderboardEntry,
UserListSchema,
UserRegistrationSchema,
@@ -96,7 +97,7 @@ def batch_create(request, payload: BatchUsersIn):
# 批量创建用户
for username in usernames:
password = generate_password()
user = User(username=username)
user = User(username=username, classname=payload.classname)
user.set_password(password)
users_to_create.append(user)
@@ -135,3 +136,28 @@ def leaderboard(request):
LeaderboardEntry(rank=i + 1, username=p.user.username, total_score=p.total_score)
for i, p in enumerate(profiles)
]
@router.get("/classes", response=List[str])
def list_classes(request):
"""返回所有不重复的非空班级名列表,按字典序升序"""
return (
User.objects.filter(classname__gt="")
.values_list("classname", flat=True)
.distinct()
.order_by("classname")
)
@router.get("/names", response=List[ClassStudentEntry])
def list_names_by_class(request, classname: str):
"""返回指定班级的学生姓名和用户名列表"""
prefix = "web" + classname
users = User.objects.filter(
classname=classname,
username__startswith=prefix,
).order_by("username")
return [
ClassStudentEntry(name=u.username[len(prefix):], username=u.username)
for u in users
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 6.0.1 on 2026-03-18 02:33
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('account', '0002_alter_profile_total_score'),
]
operations = [
migrations.AddField(
model_name='user',
name='classname',
field=models.CharField(blank=True, default='', max_length=50, verbose_name='班级'),
),
]

View File

@@ -27,6 +27,12 @@ class User(AbstractUser):
blank=True,
verbose_name="明文密码",
)
classname = models.CharField(
max_length=50,
blank=True,
default="",
verbose_name="班级",
)
def save(self, *args, **kwargs):
if self.username:

View File

@@ -52,3 +52,8 @@ class LeaderboardEntry(Schema):
rank: int
username: str
total_score: float
class ClassStudentEntry(Schema):
name: str
username: str