update
This commit is contained in:
@@ -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
|
||||
]
|
||||
|
||||
18
account/migrations/0003_user_classname.py
Normal file
18
account/migrations/0003_user_classname.py
Normal 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='班级'),
|
||||
),
|
||||
]
|
||||
@@ -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:
|
||||
|
||||
@@ -52,3 +52,8 @@ class LeaderboardEntry(Schema):
|
||||
rank: int
|
||||
username: str
|
||||
total_score: float
|
||||
|
||||
|
||||
class ClassStudentEntry(Schema):
|
||||
name: str
|
||||
username: str
|
||||
|
||||
Reference in New Issue
Block a user