import requests import logging from django.conf import settings from django.db import transaction from django.db.models import F from django.utils.translation import gettext_lazy as _ from pingcap_sso.models import ( Organization, OrganizationUser, OrganizationTopicUrgency, OrganizationApply, OrganizationUserAction, ) from pingcap_sso.discourse.models import ( DiscourseSingleSignOnRecord, DiscourseTopic, ) from pingcap_sso.discourse.consts import QA_HELP_CATEGORIES from pingcap_sso.utils import time as ptime from pingcap_sso import signals logger = logging.getLogger(__name__) def search_company(word): # 天眼查 API Docs: https://open.tianyancha.com/open/816 companys = list() try: resp = requests.get( 'http://open.api.tianyancha.com/services/open/search/2.0', params={'word': word, 'pageSize': 30, 'pageNum': 1}, headers={'Authorization': settings.TIANYANCHA_TOKEN}, timeout=3 ) except Exception as e: logger.error(e) return companys # 有 SQL 注入的时候, 天眼查 WAF 可能会返回 418 if resp.status_code == 418: logger.warning('Search companys failed, word: {}, status_code: {}'.format(word, resp.status_code)) return companys if resp.status_code != 200: logger.error('Search companys failed, status_code: {}'.format(resp.status_code)) return companys result = resp.json() # Empty Reult if result.get('error_code') == 300000: return [] if result.get('error_code') != 0: logger.error('Search company from tianyancha failed' ', error_code: {}, response: {}'.format(result['error_code'], result)) return [] companys = [{ 'name': i['name'], 'credit_code': i['creditCode'], 'base': i['base'] } for i in result['result']['items'] if i.get('creditCode')] return companys def topics_list(organization, page, page_size): query_start = page_size * (page - 1) query_end = page_size * page user_openids = OrganizationUser.objects.select_related('user').filter( organization=organization).values( 'user_id', 'user__openid', 'user__avatar_url', 'user__username') user_openid_info_map = dict([d['user__openid'], d] for d in user_openids) user_openids = list(user_openid_info_map.keys()) or [None] discourse_sso_records = DiscourseSingleSignOnRecord.objects.filter( external_id__in=user_openids).values_list('user_id', 'external_id') discourse_user_id_openid_map = dict(discourse_sso_records) discourse_user_ids = list(discourse_user_id_openid_map.keys()) or [None] topics_qs = DiscourseTopic.objects.filter( user_id__in=discourse_user_ids, deleted_by_id__isnull=True, archetype='regular', ).exclude(archetype='private_message').order_by('-created_at') topics_count = topics_qs.count() topics = topics_qs.annotate( category_name=F('category__name'), category_slug=F('category__slug') ).values( 'id', 'slug', 'category_id', 'title', 'excerpt', 'like_count', 'reply_count', 'views', 'created_at', 'user_id', 'category_slug', 'category_name' )[query_start:query_end] data = [] for t in topics: openid = discourse_user_id_openid_map[t['user_id']] sso_user_info = user_openid_info_map[openid] data.append({ 'id': t['id'], 'slug': t['slug'], 'category': { 'id': t['category_id'], 'slug': t['category_slug'], 'name': t['category_name'], }, 'is_qa_topic': t['category_id'] in QA_HELP_CATEGORIES, 'title': t['title'], 'excerpt': t['excerpt'], 'like_count': t['like_count'], 'reply_count': t['reply_count'], 'views': t['views'], 'created_at': ptime.local_time_format(t['created_at'], '%Y-%m-%d %H:%M'), 'creator': { 'id': sso_user_info['user_id'], 'username': sso_user_info['user__username'], 'avatar_url': sso_user_info['user__avatar_url'] }, 'urgencies': topic_urgencies(organization, t['id']) }) return data, topics_count def topic_urgencies(organization, topic_id): urgencies = list(OrganizationTopicUrgency.objects.select_related('creator').filter( organization=organization, topic_id=topic_id).values( 'created_at', 'creator_id', 'creator__username', 'creator__avatar_url')) return [{ 'created_at': ptime.local_time_format(u['created_at'], '%Y-%m-%d %H:%M'), 'creator': { 'id': u['creator_id'], 'username': u['creator__username'], 'avatar_url': u['creator__avatar_url'] } } for u in urgencies] def approve_application(application, audit_staff): if Organization.objects.filter(name=application.name).exists(): return False, '该组织名称 {} 已被使用'.format(application.name) if OrganizationUser.objects.filter(user=application.created_by_user).exists(): return False, '该用户已经属于其他组织,不能创建新组织了' with transaction.atomic(): organization = Organization.objects.create( name=application.name, company_name=application.company_name, industry_type_code=application.industry_type_code, industry_type_text=application.industry_type_text, member_range_code=application.member_range_code, member_range_text=application.member_range_text, job_title_code=application.job_title_code, job_title_text=application.job_title_text, company_base_code=application.company_base_code, company_base_text=application.company_base_text, incumbency_cert=application.incumbency_cert, contact_phone=application.contact_phone, contact_email=application.email, created_by_user=application.created_by_user ) OrganizationUser.objects.create( organization=organization, user=application.created_by_user, role=OrganizationUser.ROLE_ADMIN, created_by=audit_staff ) application.organization = organization application.audit_status = application.AUDIT_STATUS_PASS application.audit_staff = audit_staff application.save() OrganizationApply.objects.filter( created_by_user=application.created_by_user).update(display=False) OrganizationUserAction.objects.create( organization=organization, user=application.created_by_user, action_type=OrganizationUserAction.ACTION_ORG_APPLICATION_APPROVED, role=OrganizationUser.ROLE_ADMIN, acting_user=audit_staff ) OrganizationUserAction.objects.create( organization=organization, user=application.created_by_user, action_type=OrganizationUserAction.ACTION_JOIN_ORG, role=OrganizationUser.ROLE_ADMIN, acting_user=audit_staff ) signals.join_organization.send( sender='lib.organization.approve_application', organization=organization, user=application.created_by_user, invitation=None) return True, '' def reject_application(application, audit_staff, reason): application.audit_reason = reason application.audit_status = application.AUDIT_STATUS_DENY application.audit_staff = audit_staff application.save() OrganizationUserAction.objects.create( organization=None, user=application.created_by_user, action_type=OrganizationUserAction.ACTION_ORG_APPLICATION_DENIED, role='', acting_user=audit_staff )