50 lines
1.3 KiB
Python
50 lines
1.3 KiB
Python
from __future__ import annotations
|
|
|
|
import csv
|
|
from datetime import datetime
|
|
from io import BytesIO, StringIO
|
|
from typing import Any, Optional
|
|
|
|
from fastapi import APIRouter, Depends, File, HTTPException, Query, UploadFile, status
|
|
from pydantic import BaseModel
|
|
from sqlalchemy import and_, delete, func, or_, select, update
|
|
from sqlalchemy.exc import IntegrityError
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from ...core.database import get_db
|
|
from ...dependencies import (
|
|
get_current_active_user,
|
|
get_current_user,
|
|
get_tenant_id,
|
|
require_roles,
|
|
require_self_or_manager,
|
|
)
|
|
from ...models import (
|
|
SkillTag,
|
|
Task,
|
|
User,
|
|
UserProject,
|
|
UserRole,
|
|
UserSkillBinding,
|
|
UserStatus,
|
|
UserWorkload,
|
|
)
|
|
from ...schemas import (
|
|
UserCreate,
|
|
UserResetPasswordRequest,
|
|
UserResponse,
|
|
UserStatusPatchRequest,
|
|
UserUpdate,
|
|
)
|
|
from ...services import skill as skill_service
|
|
from ...services.ai_pmo.ai_pmo_kernel import AIPMOKernelService
|
|
from ...services.auth import AuthService
|
|
from ...services.operation_log_service import log_operation
|
|
from ...utils.timezone import now_cn_naive
|
|
|
|
router = APIRouter(tags=["users"])
|
|
|
|
COMPLETED_TASK_STATUSES = {"done", "completed", "closed", "resolved", "archived"}
|
|
MANAGER_ROLE_SET = {"BOSS", "ADMIN"}
|
|
VALID_ROLE_VALUES = {r.value for r in UserRole}
|