import logging from django.utils.translation import gettext as _ from rest_framework.response import Response from rest_framework.permissions import IsAdminUser from pingcap_sso.api.base import AdminEndpoint from pingcap_sso.api.permissions import MethodPermission from pingcap_sso.models import User, UserProfileCollections from pingcap_sso.utils import time as ptime from pingcap_sso.lib.blog import blog_user_summary from pingcap_sso.discourse.lib import user_summary as asktug_user_summary class UserContactInfoEndpoint(AdminEndpoint): permission_classes = (IsAdminUser, MethodPermission) perms_map = { 'POST': ['pingcap_sso.view_user_by_search_usernames'] } def post(self, request, *args, **kwargs): """audit_log: 批量查询用户联系方式""" usernames = request.data.get('usernames', '').split('\n') # remove extra space and empty string usernames = list(filter(lambda x: x, map(lambda x: x.strip(), usernames))) users = User.objects.filter(username__in=usernames) user_ids = list(users.values_list('id', flat=True)) profile_users = UserProfileCollections.objects.filter( is_primary=True, user_id__in=user_ids ).values('user_id', 'name', 'company', 'job_title', 'phone', 'email') user_profile_map = {p_u['user_id']: p_u for p_u in profile_users} data = list() for u in users: _asktug_summary = asktug_user_summary(u) _blog_summary = blog_user_summary(u) asktug_topic_count = _asktug_summary['topic_count'] if _asktug_summary else 0 asktug_post_count = _asktug_summary['post_count'] if _asktug_summary else 0 blog_post_count = _blog_summary['published_posts_count'] if _blog_summary else 0 data.append({ 'id': u.id, 'username': u.username, 'name': user_profile_map.get(u.id, {'name': u.name})['name'], 'company': user_profile_map.get(u.id, {'company': u.company_name})['company'], 'job_title': user_profile_map.get(u.id, {'job_title': u.job_title_text})['job_title'], 'phone': user_profile_map.get(u.id, {'phone': u.phone})['phone'], 'email': user_profile_map.get(u.id, {'email': u.email})['email'], 'last_login': ptime.local_time_format(u.last_login, '%Y/%m/%d %H:%M'), 'date_joined': ptime.local_time_format(u.date_joined, '%Y/%m/%d %H:%M'), 'asktug_topic_count': asktug_topic_count, 'asktug_post_count': asktug_post_count, 'blog_post_count': blog_post_count, }) # return data in the same order as usernames sorted_data = sorted(data, key=lambda x: usernames.index(x['username'])) return Response({ 'detail': _('success'), 'data': sorted_data }) class UserContactInfoByCompanyEndpoint(AdminEndpoint): permission_classes = (IsAdminUser, MethodPermission) perms_map = { 'POST': ['pingcap_sso.view_user_by_search_companys'] } def post(self, request, *args, **kwargs): """audit_log: 使用公司名称批量查询用户联系方式""" companys = request.data.get('companys', '').split('\n') # remove extra space and empty string companys = filter(lambda x: x, map(lambda x: x.strip(), companys)) profile_users = UserProfileCollections.objects.filter( company__in=companys, is_primary=True, ).select_related('user') data = list() for pu in profile_users: _asktug_summary = asktug_user_summary(pu.user) _blog_summary = blog_user_summary(pu.user) asktug_topic_count = _asktug_summary['topic_count'] if _asktug_summary else 0 asktug_post_count = _asktug_summary['post_count'] if _asktug_summary else 0 blog_post_count = _blog_summary['published_posts_count'] if _blog_summary else 0 data.append({ 'id': pu.id, 'username': pu.user.username, 'name': pu.name, 'company': pu.company, 'job_title': pu.job_title, 'phone': pu.phone, 'email': pu.email, 'last_login': ptime.local_time_format(pu.user.last_login, '%Y/%m/%d %H:%M'), 'date_joined': ptime.local_time_format(pu.user.date_joined, '%Y/%m/%d %H:%M'), 'asktug_topic_count': asktug_topic_count, 'asktug_post_count': asktug_post_count, 'blog_post_count': blog_post_count, }) return Response({ 'detail': _('success'), 'data': data })