示例#1
0
def add_or_update_problem(request, contest, template):
    if 'problem' in request.GET:
        existing_problem = \
                get_object_or_404(Problem, id=request.GET['problem'])
        if contest and not existing_problem.probleminstance_set.filter(
                contest=contest).exists():
            raise Http404
        if not can_admin_problem(request, existing_problem):
            raise PermissionDenied
    else:
        existing_problem = None
        if not request.user.has_perm('problems.problems_db_admin'):
            if contest and (not is_contest_basicadmin(request)):
                raise PermissionDenied

    navbar_links = navbar_links_registry.template_context(request)
    problemset_tabs = generate_problemset_tabs(request)

    context = {
        'existing_problem': existing_problem,
        'navbar_links': navbar_links,
        'problemset_tabs': problemset_tabs
    }
    tab_kwargs = {'contest': contest, 'existing_problem': existing_problem}

    tab_link_params = request.GET.dict()

    def build_link(tab):
        tab_link_params['key'] = tab.key
        return request.path + '?' + six.moves.urllib.parse.urlencode(
            tab_link_params)

    return tabbed_view(request, template, context, problem_sources(request),
                       tab_kwargs, build_link)
示例#2
0
def problem_site_view(request, site_key):
    problem = get_object_or_404(Problem, problemsite__url_key=site_key)
    package = ProblemPackage.objects.filter(problem=problem).first()
    show_add_button, administered_recent_contests = \
        _generate_add_to_contest_metadata(request)
    extra_actions = problem.controller.get_extra_problem_site_actions(problem)
    navbar_links = navbar_links_registry.template_context(request)
    context = {'problem': problem,
               'package': package if package and package.package_file
                        else None,
               'extra_actions': extra_actions,
               'can_admin_problem': can_admin_problem(request, problem),
               'select_problem_src': request.GET.get('select_problem_src'),
               'show_add_button': show_add_button,
               'administered_recent_contests': administered_recent_contests,
               'navbar_links': navbar_links}
    tab_kwargs = {'problem': problem}

    tab_link_params = request.GET.dict()
    if 'page' in tab_link_params:
        del tab_link_params['page']

    def build_link(tab):
        tab_link_params['key'] = tab.key
        return request.path + '?' + six.moves.urllib.parse.urlencode(
                tab_link_params)

    return tabbed_view(request, 'problems/problemset/problem-site.html',
            context, problem_site_tab_registry, tab_kwargs, build_link)
示例#3
0
def add_or_update_problem(request, contest, template):
    if 'problem' in request.GET:
        existing_problem = \
                get_object_or_404(Problem, id=request.GET['problem'])
        if contest and not existing_problem.probleminstance_set.filter(
                contest=contest).exists():
            raise Http404
        if not can_admin_problem(request, existing_problem):
            raise PermissionDenied
    else:
        existing_problem = None
        if not request.user.has_perm('problems.problems_db_admin'):
            if contest and (not is_contest_admin(request)):
                raise PermissionDenied

    navbar_links = navbar_links_registry.template_context(request)

    context = {'existing_problem': existing_problem, 'navbar_links': navbar_links}
    tab_kwargs = {
        'contest': contest,
        'existing_problem': existing_problem
    }

    tab_link_params = request.GET.dict()

    def build_link(tab):
        tab_link_params['key'] = tab.key
        return request.path + '?' + six.moves.urllib.parse.urlencode(
                tab_link_params)

    return tabbed_view(request, template, context,
            problem_sources(request), tab_kwargs, build_link)
示例#4
0
def problemset_add_to_contest_view(request, site_key):
    problem_name = request.GET.get('problem_name')
    if not problem_name:
        raise Http404
    administered = administered_contests(request)
    administered = sorted(administered,
                          key=lambda x: x.creation_date,
                          reverse=True)
    navbar_links = navbar_links_registry.template_context(request)
    problemset_tabs = generate_problemset_tabs(request)
    problemset_tabs.append({
        'name':
        _('Add to contest'),
        'url':
        reverse('problemset_add_to_contest', kwargs={'site_key': site_key}),
    })
    return TemplateResponse(
        request,
        'problems/problemset/select-contest.html',
        {
            'site_key': site_key,
            'administered_contests': administered,
            'problem_name': problem_name,
            'navbar_links': navbar_links,
            'problemset_tabs': problemset_tabs,
        },
    )
示例#5
0
def problem_site_view(request, site_key):
    problem = get_object_or_404(Problem, problemsite__url_key=site_key)
    package = ProblemPackage.objects.filter(problem=problem).first()
    show_add_button, administered_recent_contests = \
        generate_add_to_contest_metadata(request)
    extra_actions = problem.controller.get_extra_problem_site_actions(problem)
    navbar_links = navbar_links_registry.template_context(request)
    problemset_tabs = generate_problemset_tabs(request)
    problemset_tabs.append({'name': _('Problem view'), 'url': reverse('problem_site', kwargs={'site_key': site_key})})
    context = {'problem': problem,
               'package': package if package and package.package_file
                        else None,
               'extra_actions': extra_actions,
               'can_admin_problem': can_admin_problem(request, problem),
               'select_problem_src': request.GET.get('select_problem_src'),
               'show_add_button': show_add_button,
               'show_proposal_form': show_proposal_form(problem, request.user),
               'administered_recent_contests': administered_recent_contests,
               'navbar_links': navbar_links,
               'problemset_tabs': problemset_tabs}
    tab_kwargs = {'problem': problem}

    tab_link_params = request.GET.dict()
    if 'page' in tab_link_params:
        del tab_link_params['page']

    def build_link(tab):
        tab_link_params['key'] = tab.key
        return request.path + '?' + six.moves.urllib.parse.urlencode(
                tab_link_params)

    return tabbed_view(request, 'problems/problemset/problem-site.html',
            context, problem_site_tab_registry, tab_kwargs, build_link)
示例#6
0
def task_archive_view(request):
    origin_tags = OriginTag.objects.all() \
            .prefetch_related('localizations').order_by('name')

    navbar_links = navbar_links_registry.template_context(request)
    return TemplateResponse(request, 'problems/task-archive.html', {
        'navbar_links': navbar_links,
        'origin_tags': origin_tags,
    })
示例#7
0
def task_archive_tag_view(request, origin_tag):
    origin_tag = OriginTag.objects.filter(name=origin_tag).prefetch_related(
        'localizations',
        'info_categories__localizations',
        'info_categories__parent_tag__localizations',
        'info_categories__values__localizations',
        'info_categories__values__parent_tag__localizations',
    )
    origin_tag = get_object_or_404(origin_tag)

    categories = origin_tag.info_categories.all()
    # We use getparams for filtering by OriginInfo - make sure they are valid
    for getparam in _filter_neutral_get_params(request.GET.keys()):
        if not categories.filter(name=getparam).exists():
            raise Http404

    problems = (origin_tag.problems.all().select_related(
        'problemsite', 'main_problem_instance').prefetch_related(
            'origininfovalue_set__localizations',
            'origininfovalue_set__category'))
    problems = _filter_problems_prefetched(problems, request.GET)

    # We want to achieve something like Django's regroup, but with dynamic keys:

    # 1. Don't use categories with Null order for grouping
    categories = sorted([cat for cat in categories if cat.order],
                        key=lambda cat: cat.order)

    # 2. Stable sort the problem list by each category in reverse order.
    #    This gives the correct order for the final grouping.
    for cat in categories[::-1]:
        problems.sort(
            key=lambda problem: get_prefetched_value(problem, cat).order)

    # 3. Now we can recursively group the problem list by each category.

    user_results = _get_results_info(request, problems)

    problems_root_node = _recursive_group_problems(problems, user_results,
                                                   categories, 'problemgroups')

    navbar_links = navbar_links_registry.template_context(request)
    return TemplateResponse(
        request,
        'problems/task-archive-tag.html',
        {
            'origin_tag': origin_tag,
            'problems': problems_root_node,
            'navbar_links': navbar_links,
        },
    )
示例#8
0
def problemset_generate_view(request, page_title, problems, query_string, view_type):
    # We want to show "Add to contest" button only
    # if user is contest admin for any contest.
    show_add_button, administered_recent_contests = \
        _generate_add_to_contest_metadata(request)
    show_tags = settings.PROBLEM_TAGS_VISIBLE
    show_statistics = settings.PROBLEM_STATISTICS_AVAILABLE
    col_proportions = {
        'id': 2,
        'name': 2,
        'tags': 4,
        'statistics1': 1,
        'statistics2': 1,
        'statistics3': 1,
        'add_button': 1
    }
    if not show_add_button:
        col_proportions['tags'] += col_proportions.pop('add_button')
    if not show_statistics:
        col_proportions['id'] += col_proportions.pop('statistics1')
        col_proportions['name'] += col_proportions.pop('statistics2')
        col_proportions['tags'] += col_proportions.pop('statistics3')
    if not show_tags:
        col_proportions['name'] += col_proportions.pop('tags')
    assert sum(col_proportions.values()) == 12

    form = ProblemsetSourceForm("")

    navbar_links = navbar_links_registry.template_context(request)

    return TemplateResponse(request,
       'problems/problemset/problem-list.html',
      {'problems': problems,
       'navbar_links': navbar_links,
       'page_title': page_title,
        'select_problem_src': request.GET.get('select_problem_src'),
       'problem_search': query_string,
       'show_tags': show_tags,
       'show_statistics': show_statistics,
       'show_search_bar': True,
       'show_add_button': show_add_button,
       'administered_recent_contests': administered_recent_contests,
       'col_proportions': col_proportions,
       'form': form,
       'view_type': view_type})
示例#9
0
def problemset_generate_view(request, page_title, problems, view_type):
    # We want to show "Add to contest" button only
    # if user is contest admin for any contest.
    show_add_button, administered_recent_contests = \
        generate_add_to_contest_metadata(request)
    show_tags = settings.PROBLEM_TAGS_VISIBLE
    show_statistics = settings.PROBLEM_STATISTICS_AVAILABLE
    show_user_statistics = show_statistics and request.user.is_authenticated
    show_filters = settings.PROBLEM_STATISTICS_AVAILABLE and request.user.is_authenticated
    col_proportions = {
        'id': 1,
        'name': 2,
        'tags': 5,
        'statistics1': 1,
        'statistics2': 1,
        'statistics3': 1,
        'user_score': 1,
        'add_button': 1,
    }
    if not show_add_button:
        col_proportions['tags'] += col_proportions.pop('add_button')
    if not show_statistics:
        col_proportions['id'] += col_proportions.pop('statistics1')
        col_proportions['name'] += col_proportions.pop('statistics2')
        col_proportions['tags'] += col_proportions.pop('statistics3')
    if not show_user_statistics:
        col_proportions['tags'] += col_proportions.pop('user_score')
    if not show_tags:
        col_proportions['name'] += col_proportions.pop('tags')
    assert sum(col_proportions.values()) == 13
    form = ProblemsetSourceForm("")

    navbar_links = navbar_links_registry.template_context(request)
    problemset_tabs = generate_problemset_tabs(request)

    origintags = {}
    for param in request.GET.getlist('origin'):
        param = param.split('_')
        if len(param) in (1, 2):
            if param[0] not in origintags:
                origintags[param[0]] = []
            if len(param) == 2:
                origintags[param[0]].append(param[1])
        else:
            raise Http404

    return TemplateResponse(
        request, 'problems/problemset/problem-list.html', {
            'problems': problems,
            'navbar_links': navbar_links,
            'problemset_tabs': problemset_tabs,
            'page_title': page_title,
            'select_problem_src': request.GET.get('select_problem_src'),
            'problem_search': request.GET.get('q', ''),
            'tags': request.GET.getlist('tag'),
            'origintags': origintags,
            'algorithmtags': request.GET.getlist('algorithm'),
            'difficultytags': request.GET.getlist('difficulty'),
            'show_tags': show_tags,
            'show_statistics': show_statistics,
            'show_user_statistics': show_user_statistics,
            'show_filters': show_filters,
            'show_search_bar': True,
            'show_add_button': show_add_button,
            'administered_recent_contests': administered_recent_contests,
            'col_proportions': col_proportions,
            'form': form,
            'view_type': view_type
        })