Files
2026-07-13 12:31:34 +08:00

357 lines
8.9 KiB
Python

# -*- coding: utf-8 -*-
"""
@File : notify_api.py
@Date : 2022-10-14
@Author : Peng Shiyu
"""
from __future__ import print_function, unicode_literals, absolute_import, division
import json
import random
import traceback
from datetime import datetime, timedelta
from flask import request, g
from playhouse.shortcuts import model_to_dict
from domain_admin.enums.operation_enum import OperationEnum
from domain_admin.enums.role_enum import RoleEnum
from domain_admin.enums.status_enum import StatusEnum
from domain_admin.log import logger
from domain_admin.model.group_model import GroupModel
from domain_admin.model.notify_model import NotifyModel
from domain_admin.service import notify_service, operation_service, auth_service
from domain_admin.utils import datetime_util
from domain_admin.utils.flask_ext.app_exception import DataNotFoundAppException
@auth_service.permission(role=RoleEnum.USER)
def get_notify_list_of_user():
"""
获取用户通知配置
:return:
"""
current_user_id = g.user_id
page = request.json.get('page', 1)
size = request.json.get('size', 10)
order_prop = request.json.get('order_prop') or 'create_time'
order_type = request.json.get('order_type') or 'descending'
query = NotifyModel.select().where(
NotifyModel.user_id == current_user_id
)
total = query.count()
lst = []
if total > 0:
ordering = []
# order by event_id
if order_prop == 'event_id':
if order_type == 'descending':
ordering.append(NotifyModel.event_id.desc())
else:
ordering.append(NotifyModel.event_id.asc())
# order by type_id
if order_prop == 'type_id':
if order_type == 'descending':
ordering.append(NotifyModel.type_id.desc())
else:
ordering.append(NotifyModel.type_id.asc())
# order by expire_days
if order_prop == 'expire_days':
if order_type == 'descending':
ordering.append(NotifyModel.expire_days.desc())
else:
ordering.append(NotifyModel.expire_days.asc())
# order by status
if order_prop == 'status':
if order_type == 'descending':
ordering.append(NotifyModel.status.desc())
else:
ordering.append(NotifyModel.status.asc())
ordering.append(NotifyModel.id.desc())
rows = query.order_by(*ordering).paginate(page, size)
lst = list(map(lambda m: model_to_dict(
model=m,
exclude=[NotifyModel.value_raw],
extra_attrs=[
'value',
'groups',
]
), rows))
group_ids = []
for row in lst:
group_ids.extend(row['groups'])
group_rows = GroupModel.select().where(
GroupModel.id.in_(list(set(group_ids)))
)
group_dict = {
row.id: row
for row in group_rows
}
for row in lst:
group_list = []
for group in row['groups']:
# bugfix: 如果用户删除分组后,分组数据不存在会出现null问题
if group in group_dict:
group_list.append(group_dict.get(group))
row['group_list'] = group_list
return {
'list': lst,
'total': total
}
@auth_service.permission(role=RoleEnum.USER)
@operation_service.operation_log_decorator(
model=NotifyModel,
operation_type_id=OperationEnum.CREATE,
primary_key='id'
)
def add_notify():
"""
添加用户通知配置
:return:
"""
current_user_id = g.user_id
type_id = request.json['type_id']
event_id = request.json['event_id']
value = request.json['value']
expire_days = request.json['expire_days']
groups = request.json.get('groups') or []
comment = request.json.get('comment') or ''
value_raw = json.dumps(value, ensure_ascii=False)
groups_raw = json.dumps(groups, ensure_ascii=False)
row = NotifyModel.create(
user_id=current_user_id,
event_id=event_id,
type_id=type_id,
value_raw=value_raw,
groups_raw=groups_raw,
expire_days=expire_days,
comment=comment,
status=StatusEnum.Enabled
)
return {'id': row.id}
@auth_service.permission(role=RoleEnum.USER)
@operation_service.operation_log_decorator(
model=NotifyModel,
operation_type_id=OperationEnum.DELETE,
primary_key='notify_id'
)
def delete_notify_by_id():
"""
删除用户通知配置
:return:
"""
current_user_id = g.user_id
notify_id = request.json['notify_id']
# data check
notify_row = NotifyModel.select().where(
NotifyModel.id == notify_id,
NotifyModel.user_id == current_user_id,
).first()
if not notify_row:
raise DataNotFoundAppException()
NotifyModel.delete_by_id(notify_row.id)
@auth_service.permission(role=RoleEnum.USER)
def get_notify_by_id():
"""
获取用户通知配置
:return:
"""
current_user_id = g.user_id
notify_id = request.json['notify_id']
# data check
notify_row = NotifyModel.select().where(
NotifyModel.id == notify_id,
NotifyModel.user_id == current_user_id,
).first()
if not notify_row:
raise DataNotFoundAppException()
data = model_to_dict(
model=notify_row,
exclude=[NotifyModel.value_raw],
extra_attrs=[
'value',
'groups',
])
return data
@auth_service.permission(role=RoleEnum.USER)
@operation_service.operation_log_decorator(
model=NotifyModel,
operation_type_id=OperationEnum.UPDATE,
primary_key='notify_id'
)
def update_notify_by_id():
"""
更新用户通知配置
:return:
"""
current_user_id = g.user_id
notify_id = request.json['notify_id']
event_id = request.json['event_id']
value = request.json['value']
expire_days = request.json['expire_days']
comment = request.json.get('comment') or ''
groups = request.json.get('groups') or []
value_raw = json.dumps(value, ensure_ascii=False)
groups_raw = json.dumps(groups, ensure_ascii=False)
# data check
notify_row = NotifyModel.select().where(
NotifyModel.id == notify_id,
NotifyModel.user_id == current_user_id,
).first()
if not notify_row:
raise DataNotFoundAppException()
NotifyModel.update(
event_id=event_id,
value_raw=value_raw,
groups_raw=groups_raw,
expire_days=expire_days,
comment=comment,
).where(
NotifyModel.id == notify_row.id
).execute()
@auth_service.permission(role=RoleEnum.USER)
@operation_service.operation_log_decorator(
model=NotifyModel,
operation_type_id=OperationEnum.UPDATE,
primary_key='notify_id'
)
def update_notify_status_by_id():
"""
更新用户通知配置状态
:return:
"""
current_user_id = g.user_id
notify_id = request.json['notify_id']
status = request.json['status']
# data check
notify_row = NotifyModel.select().where(
NotifyModel.id == notify_id,
NotifyModel.user_id == current_user_id,
).first()
if not notify_row:
raise DataNotFoundAppException()
NotifyModel.update(
status=status,
).where(
NotifyModel.id == notify_row.id
).execute()
@auth_service.permission(role=RoleEnum.USER)
def handle_test_notify_by_id():
"""
测试通知配置
:return:
"""
current_user_id = g.user_id
notify_id = request.json['notify_id']
# data check
notify_row = NotifyModel.select().where(
NotifyModel.id == notify_id,
NotifyModel.user_id == current_user_id,
).first()
if not notify_row:
raise DataNotFoundAppException()
# days = random.randint(1, 365)
# start_date = datetime.now()
# expire_date = start_date + timedelta(days=days)
# lst = [
# {
# 'domain': 'www.demo.com',
# 'start_date': datetime_util.format_date(start_date),
# 'expire_date': datetime_util.format_date(expire_date),
# 'expire_days': days
# }
# ]
# return notify_service.notify_user(notify_row, lst)
return notify_service.notify_user_about_some_event(notify_row)
@auth_service.permission(role=RoleEnum.USER)
def handle_notify_by_event_id():
"""
触发用户的某一类通知操作
:return:
"""
current_user_id = g.user_id
event_id = request.json['event_id']
rows = NotifyModel.select().where(
NotifyModel.event_id == event_id,
NotifyModel.user_id == current_user_id
)
total = 0
success = 0
for row in rows:
try:
notify_service.notify_user_about_some_event(row)
success = success + 1
except:
logger.error(traceback.format_exc())
total = total + 1
return {
'total': total,
'success': success
}