296 lines
7.1 KiB
Python
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
|