import json from django.core.management.base import BaseCommand from university.models import OnlineExam, UserOnlineExam from pingcap_cookie_sso.models import SingleSignOnRecord class Command(BaseCommand): def handle(self, *args, **options): exam = OnlineExam.objects.get(pk=1) user_score = {} user_exam_score = self.calculate_score(exam) user_ids = set(list(user_exam_score.keys())) for uid in user_ids: sso = SingleSignOnRecord.objects.get(external_id=uid) user_score[uid] = { 'exam': user_exam_score.get(uid, {}).get('exam'), 'name': sso.user.exam_real_name, 'chinese_id': sso.user.exam_chinese_id_number } print(json.dumps(user_score)) def calculate_score(self, exam): user_score = {} paper = exam.structure exam_answer = exam.answers part_0_question_ids = [q['id'] for q in paper[0]['questions']] part_1_question_ids = [q['id'] for q in paper[1]['questions']] for user_exam in UserOnlineExam.objects.filter( online_exam=exam, status=UserOnlineExam.STATUS_FINISHED): sso = SingleSignOnRecord.objects.get(user=user_exam.user) _answers = {k: (v, user_exam.answers.get(k)) for k, v in exam_answer.items()} _part_0_score, _part_1_score = 0, 0 for k, v in _answers.items(): _flag = False if isinstance(v[0], str): if isinstance(v[1], str) and v[0] == v[1]: _flag = True if isinstance(v[1], list) and len(v[0]) == 1 and v[0] == v[1][0]: _flag = True if isinstance(v[0], list) and isinstance(v[1], list) and (set(v[0]) == set(v[1])): _flag = True if _flag: if k in part_0_question_ids: _part_0_score += 1 elif k in part_1_question_ids: _part_1_score += 1 else: raise Exception('fuck') total_score = _part_0_score + _part_1_score percent = round(total_score / exam.total_score * 100, 2) user_exam.score = total_score user_exam.passed = total_score >= exam.passing_score user_exam.save(update_fields=['score', 'passed']) user_score[sso.external_id] = { 'exam': { 'part_0_score': _part_0_score, 'part_1_score': _part_1_score, 'total_score': total_score, 'percent': percent, 'is_passed': user_exam.passed }, 'name': sso.user.exam_real_name } return user_score # def handle(self, *args, **options): # user_answer = {"5": ["E"], "8": "E", "10": ["A", "D", "B", "E"], "17": ["A", "C"], "18": ["A", "B", "D", "E"], "21": ["D", "B"], "23": ["C", "B", "A"], "27": ["A", "B", "C", "E"], "92": ["C", "B", "D", "A", "E"], "93": ["C", "A", "B"], "95": "A", "96": ["C", "D", "A", "B"], "97": ["D", "B", "A", "E"], "159": ["C", "A", "D", "E"], "167": "E", "168": ["B", "A", "E"], "171": "E", "198": ["A", "E"], "201": "D", "206": ["D", "A", "C"], "211": "D", "215": ["D", "A", "C", "E"], "813": ["B", "C", "A", "D", "E"], "817": ["D", "A", "C", "B"], "818": "B", "824": "B", "826": "C", "834": ["A", "B"], "840": ["C"], "841": ["D", "E"], "843": ["A"], "844": ["C"], "851": ["A", "B", "D", "C", "E"], "858": "A", "859": ["B", "C"], "861": "E", "862": ["A", "B", "D", "E"], "864": ["D", "C", "E"], "866": ["A", "C", "B"], "869": ["A", "B", "D"], "873": ["B", "C"], "878": "E", "879": ["B", "D", "A", "C", "E"], "887": "D", "890": ["A"], "892": "D", "898": ["C"], "902": "B", "904": ["D", "C"], "925": "D", "931": ["C", "B", "A", "E"], "932": "C", "937": "A", "938": "C", "939": ["A", "D", "E"], "944": ["C", "A", "E"], "948": ["D", "B", "C"], "953": ["A", "C"], "954": ["C", "D", "B"], "961": "A"} # exam_answer = {"5": "E", "8": "A", "10": "C", "17": ["A", "C"], "18": ["A", "B", "D", "E"], "21": ["B", "D"], "23": ["A", "B", "C", "E"], "27": "C", "92": ["A", "B", "C", "D", "E"], "93": ["A", "C"], "95": "A", "96": ["A", "B", "C", "D"], "97": ["A", "B", "D", "E"], "159": ["A", "B", "C", "D", "E"], "167": "E", "168": ["A", "B", "D", "E"], "171": "B", "198": "C", "201": "D", "206": ["A", "C", "E"], "211": "D", "215": ["A", "C"], "813": ["A", "B", "C", "D"], "817": ["A", "B", "C", "D"], "818": "B", "824": "B", "826": "C", "834": ["A", "B", "D"], "840": "C", "841": ["B", "C", "E"], "843": "A", "844": "C", "851": ["A", "B", "C", "D", "E"], "858": "A", "859": ["B", "C", "D", "E"], "861": "E", "862": ["A", "D", "E"], "864": ["B", "C", "D", "E"], "866": ["A", "B", "D", "E"], "869": ["A", "B", "D"], "873": ["A", "B", "C"], "878": "C", "879": ["A", "B", "C", "D", "E"], "887": "D", "890": ["A", "E"], "892": "A", "898": "C", "902": "D", "904": ["D", "E"], "925": "A", "931": ["A", "B", "C", "E"], "932": "A", "937": "D", "938": "B", "939": "C", "944": "B", "948": "C", "953": "C", "954": ["A", "B", "D"], "961": "A"} # count = 0 # _answers = {k: (v, user_answer.get(k)) for k, v in exam_answer.items()} # for k, v in _answers.items(): # if isinstance(v[0], str): # if isinstance(v[1], str) and v[0] == v[1]: # count += 1 # continue # if isinstance(v[1], list) and len(v[0]) == 1 and v[0] == v[1][0]: # count += 1 # continue # if isinstance(v[0], list) and isinstance(v[1], list) and (set(v[0]) == set(v[1])): # count += 1 # continue # print('\033[32m恭喜你,答对了 {} 道题\033[0m'.format(count))