Ejemplo n.º 1
0
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")
Ejemplo n.º 2
0
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")
Ejemplo n.º 3
0
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")
Ejemplo n.º 4
0
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")
Ejemplo n.º 5
0
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")
Ejemplo n.º 6
0
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")