import logging from django.db.models.signals import post_save from django.dispatch import receiver from pingcap_sso.models import ( LarkMessage, SiteSetting ) from pingcap_sso import signals as pingcap_signals from pingcap_sso.lib.points import award_points_by_value from pingcap_sso.lib.company import is_first_time_pass_company_verification from pingcap_sso.utils import time as ptime from pingcap_sso.tasks import asktug as asktug_tasks logger = logging.getLogger(__name__) @receiver(post_save, sender="pingcap_sso.CompanyVerifyApplication") def _notify_new_company_application(sender, instance, created, **kwargs): if not created: return notify_lark_webhook = SiteSetting.company_verification_notify_lark_webhook if not notify_lark_webhook: return message = f"""**公司认证申请** - 用户: [{ instance.user.username }](https://accounts.pingcap.cn/manage#/users/{ instance.user.username }/info) - 公司: { instance.company_name } - 职位: { instance.job_title_text } - 申请时间: { ptime.local_time_format(instance.created_at) } [审核链接](https://accounts.pingcap.cn/manage#/company/verifications/{ instance.id }) """ LarkMessage.send( webhook=notify_lark_webhook, message_type=LarkMessage.MESSAGE_TYPE_MARKDOWN, content=message, remark='公司认证申请通知', # Celery worker 不在这个事务中, 它没法立刻读到这条记录, 所以延迟 10 秒发送, 这个事务应在 10 秒内结束 send_countdown=10, ) @receiver(pingcap_signals.company_verification_passed) def _company_verification_was_passed(sender, application, **kwargs): user = application.user if is_first_time_pass_company_verification(user): points = 100 digest = '完成公司认证' else: points = 50 digest = '更新公司认证' award_points_by_value( target_user=user, points=points, exps=0, digest=digest, reason=digest ) asktug_tasks.grant_badge_to_users.delay([user.username], 130) asktug_tasks.mark_user_as_verified.delay(user.username) asktug_tasks.send_private_message.delay( [user.username], 'TiDB 社区认证', """恭喜您已通过认证!""" ) @receiver(pingcap_signals.company_verification_rejected) def _company_verification_was_rejected(sender, application, **kwargs): user = application.user asktug_tasks.revoke_user_badge.delay(user.username, 130) asktug_tasks.mark_user_as_unverified.delay(user.username) asktug_tasks.send_private_message.delay( [user.username], 'TiDB 社区认证', f"""很遗憾, 因 {application.reason}, 认证申请未通过, 请前往 [账号设置 - 公司信息](https://tidb.net/my/company) 重新提交审核!""" )