import math import requests from celery.utils.log import get_task_logger from social_django.models import UserSocialAuth from pingcap_sso.celery import app as celery_app from pingcap_sso.discourse import api as discourse_api from pingcap_sso.models import TiDBContributor, User logger = get_task_logger(__name__) ASKTUG_CONTRIBUTOR_BADGE_ID = 111 OSSINSIGHT_CONTRIBUTORS_API = 'https://api.ossinsight.io/q/organizations/list-merged-pr-creators?orgs=pingcap&orgs=tikv&orgs=chaos-mesh' @celery_app.task def sync_contributors(): for c in get_contributos_from_ossinsight(): c_instance, _ = TiDBContributor.objects.get_or_create( github_id=c['github_id'] ) c_instance.github_username = c['github_login'] c_instance.pr_count = c['pr_count'] c_instance.save() User.objects.filter( id__in=UserSocialAuth.objects.filter( provider='github', uid__in=TiDBContributor.objects.all().values_list('github_id', flat=True) ).values_list('user_id', flat=True) ).update(is_contributor=True) contributors = User.objects.filter(is_contributor=True).values_list('username', flat=True) step = 200 for i in range(math.ceil(len(contributors) / step)): sliced_usernames = contributors[i * step: (i + 1) * step] if sliced_usernames: discourse_api.grant_badge_to_users(sliced_usernames, ASKTUG_CONTRIBUTOR_BADGE_ID) def get_contributos_from_ossinsight(): try: resp = requests.get( OSSINSIGHT_CONTRIBUTORS_API, headers={ 'Content-Type': 'application/json; charset=utf-8', }, timeout=10 ) if resp.status_code == 200: return resp.json()['data'] return [] except Exception as e: logger.error(f'failed to get contributors from ossinsight: {e}') return []