核心功能:
- 用户模型扩展:linked_agents 字段存储绑定龙虾
- 登录 API 支持 3 种模式:human_only / agent_only / both
- 龙虾管理 API:绑定/解绑/列表
- 扫描本机龙虾 API:从注册实例获取
API 端点:
- POST /api/v1/auth/login/ - 支持 login_mode 和 selected_agent_id
- GET /api/v1/user/linked-agents/ - 获取绑定龙虾
- POST /api/v1/user/linked-agents/ - 添加绑定龙虾
- DELETE /api/v1/user/linked-agents/{id}/ - 移除龙虾
- GET /api/v1/user/scan-local-agents/ - 扫描本机龙虾
登录模式:
1. human_only - 纯人类身份(1 个座位)
2. agent_only - 纯龙虾身份(1 个座位)
3. both - 双重身份(2 个座位)
测试:
- test_multi_identity.py: 完整测试通过
使用场景:
- 普通用户参会 → human_only
- 龙虾独立参会 → agent_only
- 用户带龙虾助理 → both
135 lines
4.9 KiB
Python
135 lines
4.9 KiB
Python
# Generated by Django 6.0.3 on 2026-04-04 04:52
|
|
|
|
import django.contrib.auth.models
|
|
import django.contrib.auth.validators
|
|
import django.utils.timezone
|
|
from django.db import migrations, models
|
|
|
|
|
|
class Migration(migrations.Migration):
|
|
|
|
initial = True
|
|
|
|
dependencies = [
|
|
("auth", "0012_alter_user_first_name_max_length"),
|
|
]
|
|
|
|
operations = [
|
|
migrations.CreateModel(
|
|
name="User",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.BigAutoField(
|
|
auto_created=True,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
("password", models.CharField(max_length=128, verbose_name="password")),
|
|
(
|
|
"last_login",
|
|
models.DateTimeField(
|
|
blank=True, null=True, verbose_name="last login"
|
|
),
|
|
),
|
|
(
|
|
"is_superuser",
|
|
models.BooleanField(
|
|
default=False,
|
|
help_text="Designates that this user has all permissions without explicitly assigning them.",
|
|
verbose_name="superuser status",
|
|
),
|
|
),
|
|
(
|
|
"username",
|
|
models.CharField(
|
|
error_messages={
|
|
"unique": "A user with that username already exists."
|
|
},
|
|
help_text="Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.",
|
|
max_length=150,
|
|
unique=True,
|
|
validators=[
|
|
django.contrib.auth.validators.UnicodeUsernameValidator()
|
|
],
|
|
verbose_name="username",
|
|
),
|
|
),
|
|
(
|
|
"first_name",
|
|
models.CharField(
|
|
blank=True, max_length=150, verbose_name="first name"
|
|
),
|
|
),
|
|
(
|
|
"last_name",
|
|
models.CharField(
|
|
blank=True, max_length=150, verbose_name="last name"
|
|
),
|
|
),
|
|
(
|
|
"is_staff",
|
|
models.BooleanField(
|
|
default=False,
|
|
help_text="Designates whether the user can log into this admin site.",
|
|
verbose_name="staff status",
|
|
),
|
|
),
|
|
(
|
|
"is_active",
|
|
models.BooleanField(
|
|
default=True,
|
|
help_text="Designates whether this user should be treated as active. Unselect this instead of deleting accounts.",
|
|
verbose_name="active",
|
|
),
|
|
),
|
|
(
|
|
"date_joined",
|
|
models.DateTimeField(
|
|
default=django.utils.timezone.now, verbose_name="date joined"
|
|
),
|
|
),
|
|
("email", models.EmailField(max_length=254, unique=True)),
|
|
("created_at", models.DateTimeField(auto_now_add=True)),
|
|
(
|
|
"linked_agents",
|
|
models.JSONField(
|
|
blank=True, default=list, verbose_name="绑定的龙虾"
|
|
),
|
|
),
|
|
(
|
|
"groups",
|
|
models.ManyToManyField(
|
|
blank=True,
|
|
help_text="The groups this user belongs to. A user will get all permissions granted to each of their groups.",
|
|
related_name="user_set",
|
|
related_query_name="user",
|
|
to="auth.group",
|
|
verbose_name="groups",
|
|
),
|
|
),
|
|
(
|
|
"user_permissions",
|
|
models.ManyToManyField(
|
|
blank=True,
|
|
help_text="Specific permissions for this user.",
|
|
related_name="user_set",
|
|
related_query_name="user",
|
|
to="auth.permission",
|
|
verbose_name="user permissions",
|
|
),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "用户",
|
|
"verbose_name_plural": "用户",
|
|
"db_table": "users",
|
|
},
|
|
managers=[
|
|
("objects", django.contrib.auth.models.UserManager()),
|
|
],
|
|
),
|
|
]
|