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.

84 lines
2.4 KiB
Python

from apiflask import APIBlueprint
from iti.applications.extensions import db, sys_log
from iti.applications.common.utils import success, page_schema, page
from iti.applications.models import (
IotAlertPush,
IotAlertPushSchema,
)
from .schemas.alert_push import (
AlertPushQuery,
AlertPushAddRequest,
AlertPushUpdateRequest,
)
from iti.applications.common import ModelFilter
from iti.applications.common.exceptions.biz_exp import BizException
from flask_jwt_extended import jwt_required
from sqlalchemy import select, delete, exists
from sqlalchemy.sql.functions import func
from sqlalchemy.orm import noload
from iti.applications.common import permission
bp = APIBlueprint("iot_alert_push", __name__, url_prefix="/alertPush", tag="消息通知")
@bp.get("/list")
@jwt_required()
@bp.doc(security="JWT")
@permission("iot:alertPush:list")
@bp.input(AlertPushQuery.Schema(partial=True), location="query")
@bp.output(IotAlertPushSchema(many=True))
def list_alert_push(query_data: AlertPushQuery):
"""
获取消息通知列表
"""
return success(get_list_or_page(query_data))
@bp.get("/page")
@jwt_required()
@bp.doc(security="JWT")
@permission("iot:alertPush:list")
@bp.input(AlertPushQuery.Schema(partial=True), location="query")
@bp.output(page_schema(IotAlertPushSchema))
def page_alert_push(query_data: AlertPushQuery):
"""
获取消息通知分页列表
"""
return success(get_list_or_page(query_data))
@bp.post("/add")
@jwt_required()
@bp.doc(security="JWT")
@permission("iot:alertPush:add")
@bp.input(AlertPushAddRequest,location="json")
def add_alert_push(json_data: dict):
"""
添加消息通知
"""
alert_push = IotAlertPush(**json_data)
alert_push.status = 0
db.session.add(alert_push)
db.session.commit()
return success()
def get_list_or_page(query_data: AlertPushQuery):
"""
获取消息通知列表
"""
query = select(IotAlertPush).order_by(IotAlertPush.created_at.desc())
if query_data.keyword:
kw = ModelFilter.escape_like(query_data.keyword)
query = query.filter(
IotAlertPush.target_name.like(f"%{kw}%")
)
if query_data.status is not None:
query = query.filter(IotAlertPush.status == query_data.status)
if query_data.page and query_data.size:
return db.paginate(query, page=query_data.page, per_page=query_data.size)
else:
return db.session.scalars(query).all()