Files
MemoryBear/api/app/models/user_model.py
wxy bd31aa5abf feat: remove username uniqueness constraint for community edition
- Remove unique=True from username column in User model
- Remove username duplicate check in create_user and create_superuser
- Add migration to drop unique index on username, keep email unique
2026-03-20 16:11:50 +08:00

38 lines
1.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import datetime
import uuid
from sqlalchemy import Column, String, Boolean, DateTime, ForeignKey, text
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.orm import relationship
from app.db import Base
class User(Base):
__tablename__ = "users"
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, index=True)
username = Column(String, index=True, nullable=False) # 社区版:用户名不唯一,仅邮箱唯一
email = Column(String, unique=True, index=True, nullable=False)
hashed_password = Column(String, nullable=False)
is_active = Column(Boolean, default=True, nullable=False)
is_superuser = Column(Boolean, default=False, nullable=False)
created_at = Column(DateTime, default=datetime.datetime.now)
updated_at = Column(DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now)
last_login_at = Column(DateTime, nullable=True) # 最后登录时间,可为空
# SSO 外部关联字段
external_id = Column(String(100), nullable=True) # 外部用户ID
external_source = Column(String(50), nullable=True) # 来源系统
# 用户语言偏好
preferred_language = Column(String(10), server_default=text("'zh'"), default='zh', nullable=False, index=True) # 用户偏好语言,默认中文
current_workspace_id = Column(UUID(as_uuid=True), ForeignKey("workspaces.id"), nullable=True) # 当前工作空间ID可为空
# Foreign key to tenant - each user belongs to exactly one tenant
tenant_id = Column(UUID(as_uuid=True), ForeignKey("tenants.id"), nullable=False)
# Relationship to workspace memberships - users collaborate in workspaces through membership
workspaces = relationship("WorkspaceMember", back_populates="user")
# Relationship to tenant - one-to-one relationship
tenant = relationship("Tenants", back_populates="users")