Source code for oioioi.testspackages.views

import os

from django.core.exceptions import PermissionDenied
from django.shortcuts import get_object_or_404
from django.urls import reverse
from django.http import Http404

from oioioi.base.permissions import enforce_condition, not_anonymous
from oioioi.base.utils import request_cached
from oioioi.contests.attachment_registration import (
    attachment_registry,
    attachment_registry_problemset,
)
from oioioi.contests.utils import (
    can_enter_contest,
    contest_exists,
    is_contest_admin,
    is_contest_basicadmin,
    visible_problem_instances,
)
from oioioi.contests.models import ProblemInstance
from oioioi.filetracker.utils import stream_file
from oioioi.problems.utils import can_admin_problem
from oioioi.testspackages.models import TestsPackage


@request_cached
[docs]def visible_tests_packages(request): problems = [pi.problem for pi in visible_problem_instances(request)] tests_packages = TestsPackage.objects.filter(problem__in=problems) return [ tp for tp in tests_packages if tp.package is not None and ( is_contest_basicadmin(request) or tp.is_visible(request.timestamp) ) ]
@attachment_registry.register
[docs]def get_tests(request): tests = [] for tp in visible_tests_packages(request): t = { 'category': tp.problem, 'name': os.path.basename(tp.name) + '.zip', 'description': tp.description, 'link': reverse( 'test', kwargs={'contest_id': request.contest.id, 'package_id': tp.id} ), 'pub_date': tp.publish_date, } tests.append(t) return tests
@attachment_registry_problemset.register
[docs]def get_tests_for_problem(request, problem): tests = [] if can_admin_problem(request, problem): tests_packages = TestsPackage.objects.filter(problem=problem) for tp in tests_packages: t = { 'category': tp.problem, 'name': os.path.basename(tp.name) + '.zip', 'description': tp.description, 'link': reverse('test_for_problem', kwargs={'package_id': tp.id}), 'pub_date': tp.publish_date, } tests.append(t) return tests
[docs]def get_tests_package_file(test_package): file_name = '%s.zip' % test_package.name return stream_file(test_package.package, name=file_name)
@enforce_condition(not_anonymous & contest_exists & can_enter_contest)
[docs]def test_view(request, package_id): tp = get_object_or_404(TestsPackage, id=package_id) # Check if TestPackage is attached to requested contest if not ProblemInstance.objects.filter( problem=tp.problem, contest=request.contest ).exists(): raise Http404 if not is_contest_admin(request) and not tp.is_visible(request.timestamp): raise PermissionDenied return get_tests_package_file(tp)
@enforce_condition(not_anonymous)
[docs]def test_view_for_problem(request, package_id): tp = get_object_or_404(TestsPackage, id=package_id) if not can_admin_problem(request, tp.problem): raise PermissionDenied return get_tests_package_file(tp)