import time import requests from celery.utils.log import get_task_logger from django.conf import settings from pingcap_sso.celery import app as celery_app from pingcap_sso.models import PointProductRedemptionRecord logger = get_task_logger(__name__) @celery_app.task def issue_pe_exchange_code(redemption_record_id): try: record = PointProductRedemptionRecord.objects.get(id=redemption_record_id) except PointProductRedemptionRecord.DoesNotExist: logger.error(f"PointProductRedemptionRecord {redemption_record_id} does not exist") return if not record.product.pe_exchange_code_id: return exchange_code_id = record.product.pe_exchange_code_id # If the record has been issued, do nothing if record.courier_company or record.tracking_number: return request_session = requests.Session() login_url = 'https://learn.pingkai.cn/api/login' login_data = { 'username': settings.PE_ADMIN_USERNAME, 'password': settings.PE_ADMIN_PASSWORD, 'siteId': 1 } login_response = request_session.post( login_url, data=login_data, headers={ 'content-type': 'application/x-www-form-urlencoded', 'charset': 'utf-8' } ) if login_response.status_code != 200: logger.error(f"Login to PE failed: {login_response.text}") return issue_url = f'https://learn.pingkai.cn/api/market/exchange/code/{exchange_code_id}?codeNum=1' issue_response = request_session.post(issue_url) if issue_response.status_code != 200: logger.error(f"Issue PE exchange code failed, code: {issue_response.status_code}, {issue_response.text}") return # I don't know why, but the pe frontend do it like this time.sleep(5) code_list_url = f'https://learn.pingkai.cn/api/market/exchange/code/{exchange_code_id}/list?sort=createdDate,desc' code_list_response = request_session.get(code_list_url) if code_list_response.status_code != 200: logger.error(f"Get PE exchange code list failed, code: {code_list_response.status_code}, {code_list_response.text}") return code = code_list_response.json()['content'][0] if code['used']: logger.error(f"PE exchange code status is not unused: {code}") return record.courier_company = '无' record.tracking_number = code['code'] logger.info(f"PE exchange code issued: {code['code']}, redemption_record_id: {redemption_record_id}") record.save()