from celery.utils.log import get_task_logger from django.db import models from pingcap_sso.celery import app as celery_app from pingcap_sso.models import User, Evangelist from pingcap_sso.blog.models import Post from pingcap_sso.discourse.models import DiscourseUserBadge from pingcap_sso.discourse.lib import badge_list logger = get_task_logger(__name__) EVANGELIST_BADGES = [ # 156, # 文从字顺, 文章数 >= 1 # 157, # 行云流水, 文章数 >= 5 # 158, # 拍案叫绝, 文章数 >= 20 # 159, # 妙笔生花, 文章数 >= 50 136, # 2019 MVA 137, # 2020 MVA 139, # 2021 MVA 143, # 2022 MVA 170, # 2023 MVA 171, # 2023 MOA 182, # 2024 MVA 183, # 2024 MOA ] @celery_app.task def update_evangelist_via_tidb_community_blog(): evangelists = Post.objects.filter( status=Post.STATUS_PUBLISHED, created_at__isnull=False, ).values( 'creator__openid' ).annotate( first_published_at=models.Min('created_at') ) for item in evangelists: try: user = User.objects.get(openid=item['creator__openid']) except User.DoesNotExist: continue ev, _ = Evangelist.objects.get_or_create( user=user ) if ev.join_at != item['first_published_at']: ev.join_at = item['first_published_at'] asktug_badges = list(filter( lambda x: x['id'] in EVANGELIST_BADGES and x['has_badge'] == True, badge_list(user) or [] )) ev.asktug_honor_badges = asktug_badges ev.save(update_fields=['join_at', 'asktug_honor_badges'])