def get_contest_problems(request): if request.method != 'POST': return HttpResponseForbidden() lang = request.user.profile.language course = get_object_or_404(Course, id=request.POST['course_id']) if not course.user_can_edit_course(request.user): return HttpResponseForbidden() contest_id = request.POST['contest_id'] is_error = False error = '' problems = [] got_info, contest_info = get_contest_info(contest_id, lang=lang) if "You're not allowed to view this contest." in contest_info: return HttpResponse(json.dumps({'problems': problems, 'is_error': True, 'error': _(u"net_prav_na_kontest")}), content_type="application/json") problem_req = requests.get(PROBLEMS_API.format(lang=lang, cont_id=str(contest_id)), headers=HEADERS) problem_req = problem_req.json() if 'error' in problem_req: is_error = True if 'IndexOutOfBoundsException' in problem_req['error']['name']: error = _(u'kontesta_ne_sushestvuet') else: error = _(u'oshibka_kontesta') + ' ' + problem_req['error']['message'] else: problems = problem_req['result']['problems'] contest_info_problems = contest_info['problems'] if 'endTime' in contest_info: deadline_msk = datetime.datetime.strptime(contest_info['endTime'][:-9], '%Y-%m-%dT%H:%M:%S') contest_info_deadline = convert_datetime(deadline_msk, settings.CONTEST_TIME_ZONE, request.user.profile.time_zone) contest_info_deadline = contest_info_deadline.strftime('%Y,%m,%d,%H,%M') else: contest_info_deadline = None problems = problems + contest_info_problems + [{'deadline': contest_info_deadline}] return HttpResponse(json.dumps({'problems': problems, 'is_error': is_error, 'error': error}), content_type="application/json")
def get_contest_problems(request): if request.method != 'POST': return HttpResponseForbidden() lang = request.user.get_profile().language course = get_object_or_404(Course, id=request.POST['course_id']) if not course.user_can_edit_course(request.user): return HttpResponseForbidden() contest_id = request.POST['contest_id'] is_error = False error = '' problems = [] got_info, contest_info = get_contest_info(contest_id, lang=lang) if "You're not allowed to view this contest." in contest_info: return HttpResponse(json.dumps({'problems': problems, 'is_error': True, 'error': _(u"net_prav_na_kontest")}), content_type="application/json") problem_req = requests.get(PROBLEMS_API.format(lang=lang, cont_id=str(contest_id)), headers=HEADERS) problem_req = problem_req.json() if 'error' in problem_req: is_error = True if 'IndexOutOfBoundsException' in problem_req['error']['name']: error = _(u'kontesta_ne_sushestvuet') else: error = _(u'oshibka_kontesta') + ' ' + problem_req['error']['message'] else: problems = problem_req['result']['problems'] contest_info_problems = contest_info['problems'] if 'endTime' in contest_info: deadline_msk = datetime.datetime.strptime(contest_info['endTime'][:-9], '%Y-%m-%dT%H:%M:%S') contest_info_deadline = convert_datetime(deadline_msk, settings.CONTEST_TIME_ZONE, request.user.get_profile().time_zone) contest_info_deadline = contest_info_deadline.strftime('%Y,%m,%d,%H,%M') else: contest_info_deadline = None problems = problems + contest_info_problems + [{'deadline': contest_info_deadline}] return HttpResponse(json.dumps({'problems': problems, 'is_error': is_error, 'error': error}), content_type="application/json")
def ajax_update_contest_tasks(request): user = request.user if not request.is_ajax(): raise PermissionDenied if 'tasks_with_contest[]' not in request.POST or 'contest_id' not in request.POST: raise PermissionDenied contest_id = int(request.POST['contest_id']) response = {'is_error': False, 'contest_id': contest_id, 'error': '', 'tasks_title': {}} got_info, contest_info = get_contest_info(contest_id) if got_info: problem_req = FakeResponse() problem_req = requests.get(settings.CONTEST_API_URL + 'problems?contestId=' + str(contest_id), headers={'Authorization': 'OAuth ' + settings.CONTEST_OAUTH}) problems = [] if 'error' in problem_req: response['is_error'] = True if 'IndexOutOfBoundsException' in problem_req['error']['name']: response['error'] = _(u'kontesta_ne_sushestvuet') else: response['error'] = _(u'oshibka_kontesta') + ' ' + problem_req['error']['message'] if 'result' in problem_req.json(): problems = problem_req.json()['result']['problems'] contest_responses = [contest_info, problems] else: response['is_error'] = True if "You're not allowed to view this contest." in contest_info: response['error'] = _(u"net_prav_na_kontest") elif "Contest with specified id does not exist." in contest_info: response['error'] = _(u'kontesta_ne_sushestvuet') else: response['error'] = _(u'oshibka_kontesta') + contest_info if not response['is_error']: for task in Task.objects.filter(id__in=dict(request.POST)['tasks_with_contest[]']): alias = task.problem_id if contest_id != task.contest_id: continue for problem in contest_responses[0]['problems']: if problem['alias'] == alias: task.title = problem['problemTitle'] task.task_text = problem['statement'] if 'endTime' in contest_responses[0]: deadline = contest_responses[0]['endTime'].split('+')[0] task.deadline_time = datetime.datetime.strptime(deadline, '%Y-%m-%dT%H:%M:%S.%f') else: task.deadline_time = None break for problem in contest_responses[1]: if problem['title'] == alias: if 'score' in problem: task.score_max = problem['score'] task.save() reversion.set_user(user) reversion.set_comment("Update from contest") response['tasks_title'][task.id] = task.get_title(user.get_profile().language) return HttpResponse(json.dumps(response), content_type="application/json")
def contest_task_import(request): if not request.method == 'POST': return HttpResponseForbidden() course_id = int(request.POST['course_id']) course = get_object_or_404(Course, id=course_id) contest_id = int(request.POST['contest_id_for_task']) tasks = [] common_params = get_task_params( request, course.issue_status_system.has_accepted_after_deadline()) got_info, contest_info = get_contest_info(contest_id) problem_req = requests.get(PROBLEMS_API.format(lang='ru', cont_id=str(contest_id)), headers=HEADERS) problems = [] if 'result' in problem_req.json(): problems = problem_req.json()['result']['problems'] problems_with_score = { problem['id']: problem.get('score') for problem in problems } if got_info: if problems: sort_order = [problem['id'] for problem in problems] contest_info['problems'].sort( key=lambda x: sort_order.index(x['problemId'])) contest_problems = dict(request.POST)['contest_problems[]'] for problem in contest_info['problems']: if problem['problemId'] in contest_problems: current_params = common_params['attrs'].copy() current_params.update({ 'title': problem['problemTitle'], 'task_text': problem['statement'], 'short_title': current_params['short_title'] or problem['alias'], 'contest_integrated': True, 'contest_id': contest_id, 'problem_id': problem['alias'] }) if not current_params['score_max'] and problems_with_score: current_params['score_max'] = problems_with_score[ problem['problemId']] or 0 if not current_params[ 'deadline_time'] and 'endTime' in contest_info: current_params['deadline_time'] = make_aware( datetime.datetime.strptime( contest_info['endTime'][:-12], '%Y-%m-%dT%H:%M'), timezone(settings.CONTEST_TIME_ZONE)) tasks.append(current_params) elif "You're not allowed to view this contest." in contest_info: return HttpResponse(json.dumps({ 'is_error': True, 'error': _(u"net_prav_na_kontest") }), content_type="application/json") else: return HttpResponseForbidden() if not course.user_can_edit_course(request.user): return HttpResponseForbidden() for task in tasks: real_task = Task() real_task.course = course for attr_name, attr_value in task.items(): setattr(real_task, attr_name, attr_value) real_task.save() task_groups = common_params['groups'] real_task.groups = task_groups real_task.set_position_in_new_group(task_groups) reversion.set_user(request.user) reversion.set_comment("Import task") return HttpResponse("OK")
def contest_task_import(request): if not request.method == 'POST': return HttpResponseForbidden() course_id = int(request.POST['course_id']) course = get_object_or_404(Course, id=course_id) contest_id = int(request.POST['contest_id_for_task']) tasks = [] common_params = get_task_params(request, course.issue_status_system.has_accepted_after_deadline()) got_info, contest_info = get_contest_info(contest_id) problem_req = requests.get(PROBLEMS_API.format(lang='ru', cont_id=str(contest_id)), headers=HEADERS) problems = [] if 'result' in problem_req.json(): problems = problem_req.json()['result']['problems'] problems_with_score = {problem['id']: problem.get('score') for problem in problems} if got_info: if problems: sort_order = [problem['id'] for problem in problems] contest_info['problems'].sort(key=lambda x: sort_order.index(x['problemId'])) contest_problems = dict(request.POST)['contest_problems[]'] for problem in contest_info['problems']: if problem['problemId'] in contest_problems: current_params = common_params['attrs'].copy() current_params.update({ 'title': problem['problemTitle'], 'task_text': problem['statement'], 'short_title': current_params['short_title'] or problem['alias'], 'contest_integrated': True, 'contest_id': contest_id, 'problem_id': problem['alias'] }) if not current_params['score_max'] and problems_with_score: current_params['score_max'] = problems_with_score[problem['problemId']] or 0 if not current_params['deadline_time'] and 'endTime' in contest_info: current_params['deadline_time'] = make_aware( datetime.datetime.strptime(contest_info['endTime'][:-12], '%Y-%m-%dT%H:%M'), timezone(settings.CONTEST_TIME_ZONE) ) tasks.append(current_params) elif "You're not allowed to view this contest." in contest_info: return HttpResponse(json.dumps({'is_error': True, 'error': _(u"net_prav_na_kontest")}), content_type="application/json") else: return HttpResponseForbidden() if not course.user_can_edit_course(request.user): return HttpResponseForbidden() for task in tasks: real_task = Task() real_task.course = course for attr_name, attr_value in task.items(): setattr(real_task, attr_name, attr_value) real_task.save() task_groups = common_params['groups'] real_task.groups = task_groups real_task.set_position_in_new_group(task_groups) reversion.set_user(request.user) reversion.set_comment("Import task") return HttpResponse("OK")