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)
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)
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)
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, }, )
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)
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, })
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, }, )
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})
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 })