import logging import requests from celery import shared_task from django.utils import timezone from labs.models.lark_message import LarkMessage logger = logging.getLogger(__name__) @shared_task(bind=True) def send_lark_message(self, lark_message_id: int): try: message = LarkMessage.objects.get(id=lark_message_id) except LarkMessage.DoesNotExist: logger.error(f"Lark message with id {lark_message_id} does not exist") return if message.status == LarkMessage.Status.SUCCEEDED: return send_succeeded, response_body = False, None try: resp = requests.post( message.webhook_url, json=message.payload, timeout=10, ) if resp.status_code != 200: send_succeeded = False logger.error( f"Failed to send lark message with id {lark_message_id}, " f"status code: {resp.status_code}, response: {resp.text}" ) elif resp.json().get("StatusCode") != 0: send_succeeded = False logger.error( f"Failed to send lark message with id {lark_message_id}, " f"status code: {resp.status_code}, response: {resp.text}" ) else: send_succeeded = True response_body = resp.content.decode("utf-8") except Exception as e: send_succeeded = False logger.error( f"Failed to send lark message with id {lark_message_id}, error: {e}" ) message.send_at = timezone.now() message.status = ( LarkMessage.Status.SUCCEEDED if send_succeeded else LarkMessage.Status.FAILED ) message.response_body = response_body message.save() if not send_succeeded: self.retry(countdown=60 * 3) return send_succeeded