import logging from django.utils.translation import gettext as _ from rest_framework.response import Response from rest_framework.exceptions import NotFound from rest_framework.permissions import IsAdminUser from django.http.response import HttpResponse from django.core.files.storage import default_storage from pingcap_sso.api.base import AdminEndpoint from pingcap_sso.api.permissions import MethodPermission from pingcap_sso.models import ( CompanyVerifyApplication ) from pingcap_sso.lib.company import ( approve_application, reject_application ) from pingcap_sso.utils import time as ptime logger = logging.getLogger(__name__) class ApplicationListEndpoint(AdminEndpoint): permission_classes = (IsAdminUser, MethodPermission) perms_map = { 'GET': ['pingcap_sso.review_company_verification'] } 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)) status = request.GET.get('status', '0') if status: status_filter = list(map( lambda a: int(a), status.split(',') )) else: status_filter = [] except Exception as e: return Response({ 'detail': _('wrong params') }, 400) qs = CompanyVerifyApplication.objects.select_related( 'user' ).filter( status__in=status_filter ) total_num = qs.count() qs = qs.order_by('-created_at')[(cur_page - 1) * per_page:cur_page * per_page] data = [] for a in qs: data.append({ 'id': a.id, 'username': a.user.username, 'company_name': a.company_name, 'job_title': a.job_title_text, '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 }) class ApplicationDetailEndpoint(AdminEndpoint): permission_classes = (IsAdminUser, MethodPermission) perms_map = { 'GET': ['pingcap_sso.review_company_verification'], 'PUT': ['pingcap_sso.review_company_verification'] } def get(self, request, application_id, *args, **kwargs): """audit_log: 查看了公司信息认证详情""" try: application = CompanyVerifyApplication.objects.get(id=application_id) except CompanyVerifyApplication.DoesNotExist: raise NotFound histories = [] for h in CompanyVerifyApplication.objects.filter( user=application.user ).exclude( id=application.id ).order_by('-created_at'): histories.append({ 'id': h.id, 'company_name': h.company_name, 'job_title': h.job_title_text, 'status': h.status, 'status_display': h.get_status_display(), 'reason': h.reason, 'created_at': ptime.local_time_format(h.created_at), }) return Response({ 'detail': _('success'), 'data': { 'id': application.id, 'username': application.user.username, 'company_name': application.company_name, 'job_title': application.job_title_text, 'verification_method': application.verification_method, 'verification_method_display': application.get_verification_method_display(), 'email': application.email, 'incumbency_cert_id': application.incumbency_cert.id if application.incumbency_cert else None, 'status': application.status, 'status_display': application.get_status_display(), 'reason': application.reason, 'created_at': ptime.local_time_format(application.created_at), 'histories': histories, } }) def put(self, request, application_id, *args, **kwargs): """audit_log: 审核了公司信息认证申请""" try: application = CompanyVerifyApplication.objects.get(id=application_id) except CompanyVerifyApplication.DoesNotExist: raise NotFound if application.status != CompanyVerifyApplication.STATUS_PENDING: return Response({ 'detail': _('wrong status') }, 409) is_pass = request.data['action'] reason = request.data['reason'] if is_pass: approve_application(application, request.user) else: reject_application(application, request.user, reason) return Response({ 'detail': _('success') }) class ApplicationCertEndpoint(AdminEndpoint): permission_classes = (IsAdminUser, MethodPermission) perms_map = { 'GET': ['pingcap_sso.review_company_verification'] } def get(self, request, application_id, *args, **kwargs): """audit_log: 查看了公司信息认证申请中的在职证明""" try: application = CompanyVerifyApplication.objects.get(id=application_id) except CompanyVerifyApplication.DoesNotExist: raise NotFound if not application.incumbency_cert: raise NotFound try: _file = default_storage.open(application.incumbency_cert.path) return HttpResponse(_file, content_type=application.incumbency_cert.extension) except Exception: raise NotFound