You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
iTi-System/iti_system/routes/user_attribute.py

103 lines
4.1 KiB
Python

from __future__ import annotations
from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session
from iti.auth import require_permission
from iti.db import get_db
from iti.responses import ok
from iti_system.models import User
from iti_system.schemas import AttributeBatch, AttributeItem, AttributeSet
from iti_system.services import current_user, get_or_404, upsert_attribute
router = APIRouter(prefix="/sys/user-attributes", tags=["system.user_attributes"])
@router.get("/current")
def get_current_attributes(group: str | None = None, user: User = Depends(current_user)):
data = user.attribute_map
return ok({"attributes": data.get(group, {}) if group else data})
@router.put("/current")
def set_current_attributes(payload: AttributeSet, user: User = Depends(current_user), db: Session = Depends(get_db)):
_set_attributes(user, payload.attributes)
db.commit()
return ok({"attributes": user.attribute_map})
@router.get("/{user_id}", dependencies=[Depends(require_permission("system:user:edit"))])
def get_attributes(user_id: str, group: str | None = None, db: Session = Depends(get_db)):
user = get_or_404(db, User, user_id, "用户不存在")
data = user.attribute_map
return ok({"attributes": data.get(group, {}) if group else data})
@router.put("/{user_id}", dependencies=[Depends(require_permission("system:user:edit"))])
def set_attributes(user_id: str, payload: AttributeSet, db: Session = Depends(get_db)):
user = get_or_404(db, User, user_id, "用户不存在")
_set_attributes(user, payload.attributes)
db.commit()
return ok({"attributes": user.attribute_map})
@router.delete("/{user_id}/{group}", dependencies=[Depends(require_permission("system:user:edit"))])
def delete_attribute_group(user_id: str, group: str, db: Session = Depends(get_db)):
user = get_or_404(db, User, user_id, "用户不存在")
for item in list(user.attributes):
if item.attr_group == group:
db.delete(item)
db.commit()
return ok()
@router.get("/{user_id}/{group}/{key}", dependencies=[Depends(require_permission("system:user:edit"))])
def get_attribute_item(user_id: str, group: str, key: str, db: Session = Depends(get_db)):
user = get_or_404(db, User, user_id, "用户不存在")
return ok({"value": user.attribute_map.get(group, {}).get(key)})
@router.put("/{user_id}/{group}/{key}", dependencies=[Depends(require_permission("system:user:edit"))])
def set_attribute_item(user_id: str, group: str, key: str, payload: AttributeItem, db: Session = Depends(get_db)):
user = get_or_404(db, User, user_id, "用户不存在")
upsert_attribute(user, group, key, payload.value, payload.attr_type, payload.description, payload.sort)
db.commit()
return ok()
@router.delete("/{user_id}/{group}/{key}", dependencies=[Depends(require_permission("system:user:edit"))])
def delete_attribute_item(user_id: str, group: str, key: str, db: Session = Depends(get_db)):
user = get_or_404(db, User, user_id, "用户不存在")
for item in list(user.attributes):
if item.attr_group == group and item.attr_key == key:
db.delete(item)
db.commit()
return ok()
@router.post("/{user_id}/batch", dependencies=[Depends(require_permission("system:user:edit"))])
def batch_set_attributes(user_id: str, payload: AttributeBatch, db: Session = Depends(get_db)):
user = get_or_404(db, User, user_id, "用户不存在")
_set_attributes(user, payload.items)
db.commit()
return ok({"attributes": user.attribute_map})
def _set_attributes(user: User, attributes: dict):
for group, values in attributes.items():
for key, value in values.items():
if isinstance(value, dict) and "value" in value:
upsert_attribute(
user,
group,
key,
value.get("value"),
value.get("attrType") or value.get("attr_type") or "string",
value.get("description"),
int(value.get("sort", 0)),
)
else:
upsert_attribute(user, group, key, value)