Esempio n. 1
0
    def test_problems_list(self):
        for name, user in self.users.items():
            with self.subTest(user=name):
                with self.subTest(list='accessible problems'):
                    # We only care about consistency between Problem.is_accessible_by and Problem.get_visible_problems
                    problem_codes = []
                    for problem in Problem.objects.prefetch_related('authors', 'curators', 'testers', 'organizations'):
                        if problem.is_accessible_by(user):
                            problem_codes.append(problem.code)

                    self.assertCountEqual(
                        Problem.get_visible_problems(user).distinct().values_list('code', flat=True),
                        problem_codes,
                    )

                with self.subTest(list='editable problems'):
                    # We only care about consistency between Problem.is_editable_by and Problem.get_editable_problems
                    problem_codes = []
                    for problem in Problem.objects.prefetch_related('authors', 'curators'):
                        if problem.is_editable_by(user):
                            problem_codes.append(problem.code)

                    self.assertCountEqual(
                        Problem.get_editable_problems(user).distinct().values_list('code', flat=True),
                        problem_codes,
                    )
Esempio n. 2
0
 def get_unfiltered_queryset(self):
     queryset = Submission.objects.all()
     use_straight_join(queryset)
     join_sql_subquery(
         queryset,
         subquery=Problem.get_visible_problems(self.request.user).distinct().only('id').query,
         params=[],
         join_fields=[('problem_id', 'id')],
         alias='visible_problems',
     )
     return (
         queryset
         .select_related('problem', 'user__user', 'language')
         .order_by('id')
         .only(
             'id',
             'problem__code',
             'user__user__username',
             'date',
             'language__key',
             'time',
             'memory',
             'points',
             'result',
         )
     )
Esempio n. 3
0
def filter_submissions_by_visible_problems(queryset, user):
    join_sql_subquery(
        queryset,
        subquery=str(Problem.get_visible_problems(user).distinct().only('id').query),
        params=[],
        join_fields=[('problem_id', 'id')],
        alias='visible_problems',
    )
Esempio n. 4
0
 def get_unfiltered_queryset(self):
     return (Problem.get_visible_problems(
         self.request.user).select_related('group').prefetch_related(
             Prefetch(
                 'types',
                 queryset=ProblemType.objects.only('full_name'),
                 to_attr='type_list',
             ), ).order_by('code').distinct())
Esempio n. 5
0
    def get_queryset(self):
        queryset = self._get_queryset()
        if not self.in_contest:
            join_sql_subquery(
                queryset,
                subquery=str(Problem.get_visible_problems(self.request.user).distinct().only('id').query),
                params=[],
                join_fields=[('problem_id', 'id')],
                alias='visible_problems',
            )

        return queryset
Esempio n. 6
0
def api_v1_problem_list(request):
    queryset = Problem.get_visible_problems(request.user)
    if settings.ENABLE_FTS and 'search' in request.GET:
        query = ' '.join(request.GET.getlist('search')).strip()
        if query:
            queryset = queryset.search(query)
    queryset = queryset.values_list('code', 'points', 'partial', 'name',
                                    'group__full_name')

    return JsonResponse({
        code: {
            'points': points,
            'partial': partial,
            'name': name,
            'group': group,
        }
        for code, points, partial, name, group in queryset
    })
Esempio n. 7
0
 def get_queryset(self):
     return Problem.get_visible_problems(self.request.user) \
                   .filter(Q(code__icontains=self.term) | Q(name__icontains=self.term)).distinct()
Esempio n. 8
0
 def get_normal_queryset(self):
     return Problem.get_visible_problems(self.request.user)