feat: AI Worker 平台 MVP v1.0.0 - 多租户/项目管理/AI Worker/任务编排/HITL审核/成本治理
This commit is contained in:
@@ -0,0 +1,33 @@
|
||||
"""User model - represents both humans and AI worker accounts."""
|
||||
from sqlalchemy import Column, String, Boolean, Integer, Text, ForeignKey
|
||||
from app.models.base import Base, TimestampMixin, TenantMixin
|
||||
|
||||
|
||||
class User(Base, TimestampMixin, TenantMixin):
|
||||
"""A user can be a human or an AI worker proxy.
|
||||
|
||||
- Humans: have email + password, role determines permissions
|
||||
- AI: linked to AIWorker via worker_id, role is typically 'worker'
|
||||
|
||||
Roles: super_admin, tenant_admin, project_manager, reviewer, worker
|
||||
"""
|
||||
__tablename__ = "users"
|
||||
|
||||
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||
email = Column(String(255), nullable=False, index=True)
|
||||
username = Column(String(100), nullable=False)
|
||||
hashed_password = Column(String(255), nullable=True) # null for AI users
|
||||
role = Column(String(50), nullable=False, default="worker")
|
||||
|
||||
# "human" or "ai"
|
||||
user_type = Column(String(20), nullable=False, default="human")
|
||||
|
||||
# If AI user, link to the AIWorker record
|
||||
worker_id = Column(Integer, ForeignKey("ai_workers.id"), nullable=True)
|
||||
|
||||
is_active = Column(Boolean, default=True, nullable=False)
|
||||
avatar = Column(String(500), nullable=True)
|
||||
phone = Column(String(50), nullable=True)
|
||||
|
||||
def __repr__(self):
|
||||
return f"<User {self.email} ({self.role})>"
|
||||
Reference in New Issue
Block a user