import logging from django.utils.translation import gettext as _ from django.utils import timezone from django.http.response import Http404 from django.db import models from django.contrib.auth.models import Group from rest_framework.response import Response from rest_framework.permissions import IsAdminUser from pingcap_sso.api.base import AdminEndpoint from pingcap_sso.models import User from pingcap_sso.api.permissions import MethodPermission from pingcap_sso.utils import time as ptime from pingcap_sso.forms.admin_staff import NewStaffForm from pingcap_sso.admin_audit_log.models import AdminAuditLog from pingcap_sso.lib.lark import search_lark_staff_by_user, unbind_lark_staff logger = logging.getLogger(__name__) class GroupListEndpoint(AdminEndpoint): permission_classes = (IsAdminUser, MethodPermission) perms_map = { 'GET': ['pingcap_sso.manage_staff'] } def get(self, request, *args, **kwargs): """audit_log: 查看了用户组列表""" return Response({ 'detail': _('success'), 'data': list(Group.objects.values('id', 'name')) }) class StaffListEndpoint(AdminEndpoint): permission_classes = (IsAdminUser, MethodPermission) perms_map = { 'GET': ['pingcap_sso.manage_staff'], 'POST': ['pingcap_sso.manage_staff'] } def get(self, request, *args, **kwargs): """audit_log: 查看了管理员列表""" try: cur_page = int(request.GET.get('currentPage', 1)) per_page = int(request.GET.get('perPage', 10)) search = request.GET.get('search', '') except Exception: return Response({ 'detail': _('wrong params') }, 400) staffs_qs = User.objects.filter( models.Q(is_superuser=True) | models.Q(is_staff=True)) if search: staffs_qs = staffs_qs.filter( models.Q(username__icontains=search) | models.Q(email__icontains=search) | models.Q(phone__icontains=search) | models.Q(name__icontains=search) | models.Q(company_name__icontains=search)) total_num = staffs_qs.count() staffs_qs = staffs_qs[(cur_page - 1) * per_page:cur_page * per_page] data = list() for staff in staffs_qs: data.append({ 'username': staff.username, 'phone': staff.phone, 'email': staff.email, 'is_staff': staff.is_staff, 'is_superuser': staff.is_superuser, 'groups': list(staff.groups.values('id', 'name')), 'permissions': staff.get_all_permissions(), 'last_login': ptime.local_time_format(staff.last_login) }) return Response({ 'detail': _('success'), 'data': data, 'total_num': total_num, 'per_page': per_page, 'cur_page': cur_page }) def post(self, request, *args, **kwargs): """audit_log: 添加新管理员""" form = NewStaffForm(data=request.data) if not form.is_valid(): return Response({ 'detail': _('params error'), 'errors': form.errors }, status=400) user = form.user user.is_staff = True new_groups = Group.objects.filter( id__in=[g['id'] for g in request.data.get('groups', [])] ) user.groups.set(new_groups) user.save() form.lark_staff.user = user form.lark_staff.save() return Response({ 'detail': _('success') }) class StaffDetailEndpoint(AdminEndpoint): permission_classes = (IsAdminUser, MethodPermission) perms_map = { 'DELETE': ['pingcap_sso.manage_staff'] } def delete(self, request, username, *args, **kwargs): """audit_log: 移除了管理员""" try: user = User.objects.get(username=username) except User.DoesNotExist: raise Http404 user.is_staff = False user.is_superuser = False user.groups.clear() user.user_permissions.clear() user.save() unbind_lark_staff(user) return Response({ 'detail': _('success') }) class EditStaffGroupEndpoint(AdminEndpoint): permission_classes = (IsAdminUser, MethodPermission) perms_map = { 'PUT': ['pingcap_sso.manage_staff'] } def put(self, request, username, *args, **kwargs): """audit_log: 修改了管理员权限""" try: user = User.objects.get(username=username) except User.DoesNotExist: raise Http404 new_groups = Group.objects.filter( id__in=[g['id'] for g in request.data.get('groups', [])] ) user.groups.set(new_groups) return Response({ 'detail': _('success') }) class FindLarkStaffEndpoint(AdminEndpoint): permission_classes = (IsAdminUser, MethodPermission) perms_map = { 'GET': ['pingcap_sso.manage_staff'] } def get(self, request, *args, **kwargs): """audit_log: 搜索了 Lark 员工""" username = request.GET.get('username', '') user = User.objects.get(username=username) lark_staffs = search_lark_staff_by_user(user) return Response({ 'detail': _('success'), 'data': lark_staffs, }) class StaffAuditLogListEndpoint(AdminEndpoint): permission_classes = (IsAdminUser, MethodPermission) perms_map = { 'GET': ['pingcap_sso.manage_staff'] } def get(self, request, username, *args, **kwargs): """audit_log: 查看了管理员审计日志""" try: user = User.objects.get(username=username) except User.DoesNotExist: raise Http404 try: cur_page = int(request.GET.get('currentPage', 1)) per_page = int(request.GET.get('perPage', 10)) except Exception: return Response({ 'detail': _('wrong params') }, 400) logs_qs = AdminAuditLog.objects.filter(user=user).order_by('-created_at') total_num = logs_qs.count() logs_qs = logs_qs[(cur_page - 1) * per_page:cur_page * per_page] data = [] for l in logs_qs: data.append({ 'id': l.id, 'request_method': l.request_method, 'request_body': l.request_body, 'response_code': l.response_code, 'ip': l.ip, 'created_at': ptime.local_time_format(l.created_at), 'description': l.description }) return Response({ 'detail': _('success'), 'data': data, 'total_num': total_num, 'per_page': per_page, 'cur_page': cur_page })