import logging from django.utils.translation import gettext as _ from django.db import models from rest_framework.response import Response from rest_framework.permissions import IsAdminUser from rest_framework.exceptions import NotFound from pingcap_sso.api.base import AdminEndpoint from pingcap_sso.models import TUGMember, TUGMemberApplication from pingcap_sso.api.permissions import MethodPermission from pingcap_sso.utils import time as ptime from pingcap_sso.lib.tug import approve_application, reject_application logger = logging.getLogger(__name__) class MemberListEndpoint(AdminEndpoint): permission_classes = (IsAdminUser, MethodPermission) perms_map = { 'GET': ['pingcap_sso.manage_tug'] } sorted_fields = { 'created_at': 'created_at' } def get(self, request, *args, **kwargs): """audit_log: 查看了 TUG 成员列表""" try: cur_page = int(request.GET.get('currentPage', 1)) per_page = int(request.GET.get('perPage', 10)) search = request.GET.get('search', '') sortBy = request.GET.get('sortBy', 'experience') sortDesc = request.GET.get('sortDesc', 'true') if sortBy not in self.sorted_fields: sortBy = 'created_at' sortByField = self.sorted_fields[sortBy] sortDesc = '' if sortDesc == 'false' else '-' except Exception: return Response({ 'detail': _('wrong params') }, 400) order_by = '{}{}'.format(sortDesc, sortByField) qs = TUGMember.objects.all().select_related('user') if search: qs = qs.filter( models.Q(user__username__icontains=search) | models.Q(real_name__icontains=search) | models.Q(phone__icontains=search) | models.Q(email__icontains=search) | models.Q(company_name__icontains=search) | models.Q(job_title_text__icontains=search) | models.Q(wechat_id__icontains=search)) qs = qs.order_by(order_by) total_num = qs.count() qs = qs[(cur_page - 1) * per_page:cur_page * per_page] data = list(qs.annotate( username=models.F('user__username') ).values( 'user_id', 'username', 'real_name', 'phone', 'email', 'company_name', 'job_title_text', 'wechat_id', 'referrer', 'created_at' )) data = list() for m in qs: data.append({ 'user_id': m.user_id, 'username': m.user.username, 'real_name': m.real_name, 'phone': m.phone, 'email': m.email, 'company_name': m.company_name, 'job_title_text': m.job_title_text, 'referrer': m.referrer, 'wechat_id': m.wechat_id, 'stage_of_company_use_of_tidb': m.stage_of_company_use_of_tidb, 'reason_for_application': m.reason_for_application, 'preferred_way_of_sharing': m.preferred_way_of_sharing, 'roles_want_to_play': m.roles_want_to_play, 'bio': m.bio, 'channel': m.channel, 'created_at': ptime.local_time_format(m.created_at), }) return Response({ 'detail': _('success'), 'data': data, 'total_num': total_num, 'per_page': per_page, 'cur_page': cur_page, 'order_by': order_by }) class ApplicationListEndpoint(AdminEndpoint): permission_classes = (IsAdminUser, MethodPermission) perms_map = { 'GET': ['pingcap_sso.manage_tug'] } sorted_fields = { 'created_at': 'created_at', 'status': 'status' } def get(self, request, *args, **kwargs): """audit_log: 查看了 TUG 成员申请列表""" try: cur_page = int(request.GET.get('currentPage', 1)) per_page = int(request.GET.get('perPage', 10)) search = request.GET.get('search', '') sortBy = request.GET.get('sortBy', 'experience') sortDesc = request.GET.get('sortDesc', 'true') if sortBy not in self.sorted_fields: sortBy = 'created_at' sortByField = self.sorted_fields[sortBy] sortDesc = '' if sortDesc == 'false' else '-' except Exception: return Response({ 'detail': _('wrong params') }, 400) order_by = '{}{}'.format(sortDesc, sortByField) qs = TUGMemberApplication.objects.all().select_related('user') if search: qs = qs.filter( models.Q(user__username__icontains=search) | models.Q(real_name__icontains=search) | models.Q(phone__icontains=search) | models.Q(email__icontains=search) | models.Q(company_name__icontains=search) | models.Q(job_title_text__icontains=search) | models.Q(wechat_id__icontains=search)) qs = qs.order_by(order_by) total_num = qs.count() qs = qs[(cur_page - 1) * per_page:cur_page * per_page] data = list() for a in qs: data.append({ 'id': a.id, 'user_id': a.user_id, 'username': a.user.username, 'real_name': a.real_name, 'phone': a.phone, 'email': a.email, 'company_name': a.company_name, 'job_title_text': a.job_title_text, 'referrer': a.referrer, 'wechat_id': a.wechat_id, 'status': a.status, 'status_display': a.get_status_display(), 'created_at': ptime.local_time_format(a.created_at) }) return Response({ 'detail': _('success'), 'data': data, 'total_num': total_num, 'per_page': per_page, 'cur_page': cur_page, 'order_by': order_by }) class ApplicationDetailEndpoint(AdminEndpoint): permission_classes = (IsAdminUser, MethodPermission) perms_map = { 'GET': ['pingcap_sso.manage_tug'], 'PUT': ['pingcap_sso.manage_tug'] } def get(self, request, application_id, *args, **kwargs): """audit_log: 查看了 TUG 成员申请详情""" try: application = TUGMemberApplication.objects.get(id=application_id) except TUGMemberApplication.DoesNotExist: raise NotFound return Response({ 'detail': _('success'), 'data': { 'id': application.id, 'real_name': application.real_name, 'phone': application.phone, 'email': application.email, 'company_name': application.company_name, 'job_title_text': application.job_title_text, 'stage_of_company_use_of_tidb': application.stage_of_company_use_of_tidb, 'reason_for_application': application.reason_for_application, 'preferred_way_of_sharing': application.preferred_way_of_sharing, 'roles_want_to_play': application.roles_want_to_play, 'wechat_id': application.wechat_id, 'bio': application.bio, 'channel': application.channel, 'referrer': application.referrer, 'username': application.user.username, 'status': application.status, 'status_display': application.get_status_display(), 'reviewer': application.reviewer.username if application.reviewer else None, 'review_comment': application.review_comment, 'created_at': ptime.local_time_format(application.created_at), 'updated_at': ptime.local_time_format(application.updated_at) } }) def put(self, request, application_id, *args, **kwargs): """audit_log: 更新了 TUG 成员申请列表""" try: application = TUGMemberApplication.objects.get(id=application_id) except TUGMemberApplication.DoesNotExist: raise NotFound is_pass = request.data['is_pass'] reason = request.data['reason'] success = True result = '' if is_pass: success, result = approve_application(application, request.user) else: reject_application(application, request.user, reason) return Response({ 'detail': _('success'), 'data': { 'success': success, 'result': result } })