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

296 lines
7.1 KiB
Python

# -*- coding: utf-8 -*-
from __future__ import print_function, unicode_literals, absolute_import, division
from operator import itemgetter
from flask import request, g
from peewee import fn
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.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.group_user_model import GroupUserModel
from domain_admin.service import group_service, operation_service, group_user_service, auth_service
from domain_admin.utils.flask_ext.app_exception import ForbiddenAppException, DataNotFoundAppException
@auth_service.permission(role=RoleEnum.USER)
@operation_service.operation_log_decorator(
model=GroupModel,
operation_type_id=OperationEnum.CREATE,
primary_key='id'
)
def add_group():
"""
添加
:return:
"""
current_user_id = g.user_id
name = request.json['name']
row = GroupModel.create(
name=name,
user_id=current_user_id
)
return {'id': row.id}
@auth_service.permission(role=RoleEnum.USER)
@operation_service.operation_log_decorator(
model=GroupModel,
operation_type_id=OperationEnum.UPDATE,
primary_key='id'
)
def update_group_by_id():
"""
更新数据
:return:
"""
current_user_id = g.user_id
group_id = request.json['id']
name = request.json.get('name')
# group_service.check_group_permission(group_id, current_user_id)
# check data
group_row = GroupModel.select().where(
GroupModel.id == group_id,
GroupModel.user_id == current_user_id
).first()
if not group_row:
raise DataNotFoundAppException()
GroupModel.update(
name=name,
).where(
GroupModel.id == group_id
).execute()
@auth_service.permission(role=RoleEnum.USER)
@operation_service.operation_log_decorator(
model=GroupModel,
operation_type_id=OperationEnum.DELETE,
primary_key='id'
)
def delete_group_by_id():
"""
删除
:return:
"""
current_user_id = g.user_id
group_id = request.json['id']
# check data
group_row = GroupModel.select().where(
GroupModel.id == group_id,
GroupModel.user_id == current_user_id
).first()
if not group_row:
raise DataNotFoundAppException()
GroupModel.delete_by_id(group_row.id)
# 重置已分类的证书 和 域名
DomainModel.update(
group_id=0
).where(
DomainModel.group_id == group_id
).execute()
DomainInfoModel.update(
group_id=0
).where(
DomainInfoModel.group_id == group_id
).execute()
GroupUserModel.delete().where(
GroupUserModel.group_id == group_id
).execute()
@auth_service.permission(role=RoleEnum.USER)
@operation_service.operation_log_decorator(
model=GroupModel,
operation_type_id=OperationEnum.BATCH_DELETE,
primary_key='group_ids'
)
def delete_group_by_ids():
"""
批量删除
:return:
"""
current_user_id = g.user_id
group_ids = request.json['group_ids']
GroupModel.delete().where(
GroupModel.id.in_(group_ids),
GroupModel.user_id == current_user_id
).execute()
# 重置已分类的证书 和 域名
DomainModel.update(
group_id=0
).where(
DomainModel.group_id.in_(group_ids)
).execute()
DomainInfoModel.update(
group_id=0
).where(
DomainInfoModel.group_id.in_(group_ids)
).execute()
GroupUserModel.delete().where(
GroupUserModel.group_id.in_(group_ids)
).execute()
@auth_service.permission(role=RoleEnum.USER)
def get_group_list():
"""
获取域名列表
:return:
"""
# page = request.json.get('page', 1)
# size = request.json.get('size', 10)
keyword = request.json.get('keyword')
role = request.json.get('role')
current_user_id = g.user_id
# 分组列表数据
query = GroupModel.select()
# 所在分组
group_user_list = list(GroupUserModel.select().where(
GroupUserModel.user_id == current_user_id
))
user_group_ids = [row.group_id for row in group_user_list]
group_user_map = {row.group_id: row.has_edit_permission for row in group_user_list}
if role == RoleEnum.ADMIN:
pass
elif user_group_ids:
query = query.where(
(GroupModel.user_id == current_user_id)
| (GroupModel.id.in_(user_group_ids))
)
else:
query = query.where(
GroupModel.user_id == current_user_id
)
if keyword:
query = query.where(GroupModel.name.contains(keyword))
total = query.count()
# bugfix: 分组不需要分页
rows = query.order_by(
GroupModel.create_time.asc(),
GroupModel.id.asc()
)
rows = list(rows)
# 证书分组统计
cert_groups = DomainModel.select(
DomainModel.group_id,
fn.COUNT(DomainModel.id).alias('count')
).group_by(DomainModel.group_id)
cert_groups_map = {
row.group_id: row.count
for row in cert_groups
}
# 域名分组统计
domain_groups = DomainInfoModel.select(
DomainInfoModel.group_id,
fn.COUNT(DomainInfoModel.id).alias('count')
).group_by(DomainInfoModel.group_id)
domain_groups_map = {
row.group_id: row.count
for row in domain_groups
}
# 成员分组统计
group_ids = [row.id for row in rows]
domain_groups = GroupUserModel.select(
GroupUserModel.group_id,
fn.COUNT(GroupUserModel.id).alias('count')
).where(
GroupUserModel.group_id.in_(group_ids)
).group_by(GroupUserModel.group_id)
group_user_groups_map = {
row.group_id: row.count
for row in domain_groups
}
lst = []
for row in rows:
row_dict = model_to_dict(row)
row_dict['cert_count'] = cert_groups_map.get(row.id, 0)
row_dict['domain_count'] = domain_groups_map.get(row.id, 0)
row_dict['group_user_count'] = group_user_groups_map.get(row.id, 0) + 1
# 组权限
if role == RoleEnum.ADMIN:
has_edit_permission = True
elif row.user_id == current_user_id:
has_edit_permission = True
else:
has_edit_permission = group_user_map.get(row.id, False)
row_dict['has_edit_permission'] = has_edit_permission
row_dict['is_leader'] = row.user_id == current_user_id
lst.append(row_dict)
lst.sort(key=itemgetter('is_leader', 'has_edit_permission'), reverse=True)
return {
'list': lst,
'total': total,
}
@auth_service.permission(role=RoleEnum.USER)
def get_group_by_id():
"""
获取
:return:
"""
current_user_id = g.user_id
group_id = request.json['id']
# group_service.check_group_permission(group_id, current_user_id)
# check data
group_row = GroupModel.select().where(
GroupModel.id == group_id,
GroupModel.user_id == current_user_id
).first()
if not group_row:
raise DataNotFoundAppException()
return group_row