import requests from django.utils import timezone from celery import shared_task from celery.utils.log import get_task_logger from university.utils.aliyun_face import aliyun_face from university.models import OnlineExamEvent, UserOnlineExamFace logger = get_task_logger(__name__) @shared_task def async_send_alert_to_wechat(hook_url, msg_content): try: resp = requests.post( hook_url, json={'msgtype': 'markdown', 'markdown': {'content': msg_content}}, headers={'content-type': 'application/json'}, timeout=5) if resp.status_code != 200 or resp.json()['errcode'] != 0: logger.error('Deliver to wechat failed, status: {}, msg_content: {}'.format( resp.status_code, msg_content)) except Exception as e: logger.error(e) @shared_task def async_validate_examinee_id_face(face_db_id): try: exam_face = UserOnlineExamFace.objects.get(id=face_db_id) except Exception: logger.error('UserOnlineExamFace Objects not found, id: {}'.format(face_db_id)) return user_online_exam = exam_face.user_online_exam passed = aliyun_face.verity_chinese_id_with_capture( exam_face.face.oss_sign_url, exam_face.user_online_exam.examinee_chinese_id, exam_face.user_online_exam.examinee_name ) if passed: comment = '实人认证通过' else: # 每个人仅允许重试一次 if user_online_exam.face_identity_num > 0: comment = '身份校验失败,您无法继续进行考试,如有疑问,请扫描下方二维码,联系工作人员' user_online_exam.is_force_submitted = True user_online_exam.force_submit_reason = comment user_online_exam.save(update_fields=['is_force_submitted', 'force_submit_reason']) OnlineExamEvent.objects.create( user=user_online_exam.user, online_exam=user_online_exam.online_exam, user_online_exam=user_online_exam, event_type=OnlineExamEvent.EVENT_ADMIN_FORCE_SUBMIT, comment=comment ) user_online_exam.send_admin_force_submit_ws_message(comment) else: comment = '实人认证未通过' OnlineExamEvent.objects.create( user=user_online_exam.user, online_exam=user_online_exam.online_exam, user_online_exam=user_online_exam, event_type=OnlineExamEvent.EVENT_IDENTITY_FAILED, comment=comment ) user_online_exam.send_identity_failed_complete_information_ws_message(comment) user_online_exam.face_identity_passed = passed user_online_exam.face_identity_num += 1 user_online_exam.face_identity_at = timezone.now() user_online_exam.save(update_fields=[ 'face_identity_passed', 'face_identity_num', 'face_identity_at']) exam_face.status = UserOnlineExamFace.STATUS_PASSED if passed else UserOnlineExamFace.STATUS_FAILED exam_face.comment = comment exam_face.save() @shared_task def async_check_examinee_face(face_db_id): try: exam_face = UserOnlineExamFace.objects.get(id=face_db_id) except Exception: logger.error('UserOnlineExamFace Objects not found, id: {}'.format(face_db_id)) return user_online_exam = exam_face.user_online_exam face_count = aliyun_face.detect_face(exam_face.face.oss_sign_url) passed, comment = True, '' if face_count == 0: passed = False comment = '考生不在画面内, 请调整坐姿' elif face_count > 1: passed = False comment = '画面异常,请注意考场秩序' if not passed: OnlineExamEvent.objects.create( user=user_online_exam.user, online_exam=user_online_exam.online_exam, user_online_exam=user_online_exam, event_type=OnlineExamEvent.EVENT_FACE_CHECK_FAILED, comment=comment ) user_online_exam.send_warning_ws_message(comment) exam_face.status = UserOnlineExamFace.STATUS_PASSED if passed else UserOnlineExamFace.STATUS_FAILED exam_face.comment = comment exam_face.save()