286 lines
6.8 KiB
Python
286 lines
6.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
user_api.py
|
|
"""
|
|
from __future__ import print_function, unicode_literals, absolute_import, division
|
|
from flask import request, g
|
|
from playhouse.shortcuts import model_to_dict, fn
|
|
|
|
from domain_admin.config import DEFAULT_BEFORE_EXPIRE_DAYS
|
|
from domain_admin.enums.role_enum import RoleEnum
|
|
from domain_admin.model.address_model import AddressModel
|
|
from domain_admin.model.domain_info_model import DomainInfoModel
|
|
from domain_admin.model.domain_model import DomainModel
|
|
from domain_admin.model.group_model import GroupModel
|
|
from domain_admin.model.notify_model import NotifyModel
|
|
from domain_admin.model.user_model import UserModel
|
|
from domain_admin.service import auth_service
|
|
from domain_admin.utils import datetime_util, bcrypt_util, secret_util
|
|
from domain_admin.utils.flask_ext.app_exception import AppException, DataNotFoundAppException
|
|
|
|
|
|
@auth_service.permission(role=RoleEnum.USER)
|
|
def get_user_info():
|
|
"""
|
|
获取当前用户信息
|
|
:return:
|
|
"""
|
|
current_user_id = g.user_id
|
|
|
|
row = UserModel.get_by_id(current_user_id)
|
|
|
|
data = model_to_dict(
|
|
model=row,
|
|
extra_attrs=['is_default_password'],
|
|
exclude=[UserModel.password],
|
|
)
|
|
|
|
return data
|
|
|
|
|
|
@auth_service.permission(role=RoleEnum.USER)
|
|
def update_user_info():
|
|
"""
|
|
更新当前用户信息
|
|
:return:
|
|
"""
|
|
current_user_id = g.user_id
|
|
|
|
# avatar_url = request.json.get('avatar_url')
|
|
before_expire_days = request.json.get('before_expire_days') or DEFAULT_BEFORE_EXPIRE_DAYS
|
|
# email_list = request.json.get('email_list')
|
|
|
|
UserModel.update({
|
|
# 'avatar_url': avatar_url,
|
|
'before_expire_days': int(before_expire_days),
|
|
# 'email_list_raw': json.dumps(email_list, ensure_ascii=False),
|
|
'update_time': datetime_util.get_datetime()
|
|
}).where(
|
|
UserModel.id == current_user_id
|
|
).execute()
|
|
|
|
|
|
@auth_service.permission(role=RoleEnum.USER)
|
|
def update_user_password():
|
|
"""
|
|
更新用户密码
|
|
:return:
|
|
"""
|
|
current_user_id = g.user_id
|
|
|
|
password = request.json.get('password')
|
|
new_password = request.json.get('new_password')
|
|
|
|
user_row = UserModel.get_by_id(current_user_id)
|
|
|
|
if not bcrypt_util.check_password(password, user_row.password):
|
|
raise AppException('旧密码不正确')
|
|
|
|
UserModel.update(
|
|
{
|
|
'password': bcrypt_util.encode_password(new_password),
|
|
}
|
|
).where(
|
|
UserModel.id == current_user_id
|
|
).execute()
|
|
|
|
|
|
@auth_service.permission(role=RoleEnum.USER)
|
|
def get_user_list_by_name():
|
|
"""
|
|
精确搜索,普通用户端可用
|
|
"""
|
|
username = request.json.get('keyword')
|
|
|
|
query = UserModel.select().where(
|
|
UserModel.username == username
|
|
)
|
|
total = query.count()
|
|
|
|
lst = list(map(lambda m: model_to_dict(
|
|
model=m,
|
|
only=[
|
|
UserModel.id,
|
|
UserModel.username,
|
|
],
|
|
), query))
|
|
|
|
return {
|
|
'list': lst,
|
|
'total': total
|
|
}
|
|
|
|
|
|
@auth_service.permission(role=RoleEnum.ADMIN)
|
|
def get_user_list():
|
|
"""
|
|
获取用户列表
|
|
:return:
|
|
"""
|
|
page = request.json.get('page', 1)
|
|
size = request.json.get('size', 10)
|
|
keyword = request.json.get('keyword')
|
|
|
|
query = UserModel.select()
|
|
|
|
if keyword:
|
|
query = query.where(UserModel.username.contains(keyword))
|
|
|
|
total = query.count()
|
|
|
|
lst = query.order_by(
|
|
UserModel.create_time.desc(),
|
|
UserModel.id.desc(),
|
|
).paginate(page, size)
|
|
|
|
lst = list(map(lambda m: model_to_dict(
|
|
model=m,
|
|
exclude=[
|
|
UserModel.password,
|
|
],
|
|
extra_attrs=[
|
|
'create_time_label'
|
|
]
|
|
), lst))
|
|
|
|
row_ids = [row['id'] for row in lst]
|
|
|
|
# 证书数量
|
|
domain_groups = DomainModel.select(
|
|
DomainModel.user_id,
|
|
fn.COUNT(DomainModel.id).alias('count')
|
|
).where(
|
|
DomainModel.user_id.in_(row_ids)
|
|
).group_by(DomainModel.user_id)
|
|
|
|
domain_groups_map = {
|
|
str(row.user_id): row.count
|
|
for row in domain_groups
|
|
}
|
|
|
|
for row in lst:
|
|
row['cert_count'] = domain_groups_map.get(str(row['id']), 0)
|
|
|
|
# 域名数量
|
|
domain_info_groups = DomainInfoModel.select(
|
|
DomainInfoModel.user_id,
|
|
fn.COUNT(DomainInfoModel.id).alias('count')
|
|
).where(
|
|
DomainInfoModel.user_id.in_(row_ids)
|
|
).group_by(DomainInfoModel.user_id)
|
|
|
|
domain_info_groups_map = {
|
|
str(row.user_id): row.count
|
|
for row in domain_info_groups
|
|
}
|
|
|
|
for row in lst:
|
|
row['domain_count'] = domain_info_groups_map.get(str(row['id']), 0)
|
|
|
|
# 通知渠道
|
|
notify_groups = NotifyModel.select(
|
|
NotifyModel.user_id,
|
|
fn.COUNT(NotifyModel.id).alias('count')
|
|
).where(
|
|
NotifyModel.user_id.in_(row_ids)
|
|
).group_by(NotifyModel.user_id)
|
|
|
|
notify_groups_map = {
|
|
str(row.user_id): row.count
|
|
for row in notify_groups
|
|
}
|
|
|
|
for row in lst:
|
|
row['notify_count'] = notify_groups_map.get(str(row['id']), 0)
|
|
|
|
# 分组数量
|
|
group_groups = GroupModel.select(
|
|
GroupModel.user_id,
|
|
fn.COUNT(GroupModel.id).alias('count')
|
|
).where(
|
|
GroupModel.user_id.in_(row_ids)
|
|
).group_by(GroupModel.user_id)
|
|
|
|
group_groups_map = {
|
|
str(row.user_id): row.count
|
|
for row in group_groups
|
|
}
|
|
|
|
for row in lst:
|
|
row['group_count'] = group_groups_map.get(str(row['id']), 0)
|
|
|
|
return {
|
|
'list': lst,
|
|
'total': total
|
|
}
|
|
|
|
|
|
@auth_service.permission(role=RoleEnum.ADMIN)
|
|
def add_user():
|
|
"""
|
|
添加用户
|
|
:return:
|
|
"""
|
|
username = request.json.get('username')
|
|
password = request.json.get('password')
|
|
|
|
row = UserModel.select().where(
|
|
UserModel.username == username
|
|
).get_or_none()
|
|
|
|
if row:
|
|
raise AppException('用户已存在')
|
|
|
|
UserModel.create(
|
|
username=username,
|
|
password=bcrypt_util.encode_password(password)
|
|
)
|
|
|
|
|
|
@auth_service.permission(role=RoleEnum.ADMIN)
|
|
def update_user_status():
|
|
"""
|
|
更新账号可用状态
|
|
:return:
|
|
"""
|
|
user_id = request.json.get('user_id')
|
|
status = request.json.get('status')
|
|
|
|
UserModel.update({
|
|
'status': status
|
|
}).where(
|
|
UserModel.id == user_id
|
|
).execute()
|
|
|
|
|
|
@auth_service.permission(role=RoleEnum.ADMIN)
|
|
def reset_user_password():
|
|
"""
|
|
重置用户密码
|
|
:return:
|
|
"""
|
|
user_id = request.json.get('user_id')
|
|
|
|
password = secret_util.get_random_password()
|
|
|
|
UserModel.update({
|
|
'password': bcrypt_util.encode_password(password)
|
|
}).where(
|
|
UserModel.id == user_id
|
|
).execute()
|
|
|
|
return {
|
|
'password': password
|
|
}
|
|
|
|
|
|
@auth_service.permission(role=RoleEnum.ADMIN)
|
|
def delete_user():
|
|
"""
|
|
删除用户账号
|
|
:return:
|
|
"""
|
|
user_id = request.json.get('user_id')
|
|
|
|
UserModel.delete_by_id(user_id)
|