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, )
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', ) )
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', )
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())
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
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 })
def get_queryset(self): return Problem.get_visible_problems(self.request.user) \ .filter(Q(code__icontains=self.term) | Q(name__icontains=self.term)).distinct()
def get_normal_queryset(self): return Problem.get_visible_problems(self.request.user)