357 lines
8.9 KiB
Python
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
|
|
}
|