diff --git a/oioioi/contests/admin.py b/oioioi/contests/admin.py index c4c64cc4b..9b8fb25bf 100644 --- a/oioioi/contests/admin.py +++ b/oioioi/contests/admin.py @@ -9,7 +9,6 @@ from django.contrib.admin.utils import quote, unquote from django.db.models import Case, F, OuterRef, Q, Subquery, Value, When from django.db.models.functions import Coalesce -from django.forms import ModelForm from django.forms.models import modelform_factory from django.http import HttpResponseRedirect from django.shortcuts import redirect, render @@ -29,6 +28,7 @@ ProblemInstanceForm, SimpleContestForm, TestsSelectionForm, + ContestPermissionAdminForm, ) from oioioi.contests.menu import ( contest_admin_menu_registry, @@ -1016,19 +1016,11 @@ def get_custom_list_select_related(self): order=50, ) - -class ContestPermissionAdminForm(ModelForm): - user = UserSelectionField(label=_("Username")) - - class Meta(object): - model = ContestPermission - fields = ('user', 'contest', 'permission') - - class ContestPermissionAdmin(admin.ModelAdmin): list_display = ['permission', 'user', 'user_full_name'] list_display_links = ['user'] ordering = ['permission', 'user'] + form = ContestPermissionAdminForm def user_full_name(self, instance): diff --git a/oioioi/contests/forms.py b/oioioi/contests/forms.py index 64357e963..0ba00d446 100644 --- a/oioioi/contests/forms.py +++ b/oioioi/contests/forms.py @@ -1,6 +1,7 @@ import json from django import forms +from django.forms import ModelForm from django.contrib.admin import widgets from django.contrib.auth.models import User from django.forms import ValidationError @@ -11,11 +12,22 @@ from oioioi.base.utils.inputs import narrow_input_field, narrow_input_fields from oioioi.base.utils.user_selection import UserSelectionField -from oioioi.contests.models import Contest, ProblemInstance, Round +from oioioi.contests.models import Contest, ProblemInstance, Round, ContestPermission from oioioi.contests.utils import is_contest_basicadmin, submittable_problem_instances from oioioi.programs.models import Test +class ContestPermissionAdminForm(ModelForm): + user = UserSelectionField(label=_("Username")) + + def __init__(self, *args, **kwargs): + super(ContestPermissionAdminForm, self).__init__(*args, **kwargs) + self.fields['user'].hints_url = reverse('teacher_search') + + class Meta(object): + model = ContestPermission + fields = ('user', 'contest', 'permission') + class SimpleContestForm(forms.ModelForm): class Meta(object): model = Contest diff --git a/oioioi/contests/tests/tests.py b/oioioi/contests/tests/tests.py index 0c7433f40..2e1b1f8b4 100644 --- a/oioioi/contests/tests/tests.py +++ b/oioioi/contests/tests/tests.py @@ -2137,6 +2137,29 @@ def test_show_info_about(self): response = self.client.get(url) self.assertEqual(response.status_code, 200) + def test_teachers_list(self): + self.assertTrue(self.client.login(username='test_admin')) + contest = Contest.objects.get() + url = reverse('teacher_search') + response = self.client.get(url, {'substr': ''}) + self.assertEqual(404, response.status_code) + response = self.client.get(url) + self.assertEqual(404, response.status_code) + + response = self.client.get(url, {'substr': 'te'}) + self.assertEqual(200, response.status_code) + response = response.json() + self.assertListEqual( + ['test_admin (Test Admin)', 'test_user (Test User)'], response + ) + + response = self.client.get(url, {'substr': 'test admin'}) + response = response.json() + self.assertListEqual(['test_admin (Test Admin)'], response) + + self.assertTrue(self.client.login(username='test_user')) + check_not_accessible(self, url) + class TestProblemsMenuWithQuizzes(TestCase): fixtures = [ diff --git a/oioioi/contests/urls.py b/oioioi/contests/urls.py index 609c4864f..7d61eecce 100644 --- a/oioioi/contests/urls.py +++ b/oioioi/contests/urls.py @@ -133,6 +133,7 @@ def glob_namespaced_patterns(namespace): name='user_info_redirect', ), re_path(r'^admin/', admin.contest_site.urls), + re_path(r'^teacher-search/$', views.get_teacher_names, name='teacher_search'), ] nonc_patterns = [ diff --git a/oioioi/contests/views.py b/oioioi/contests/views.py index b30997570..e370c804e 100644 --- a/oioioi/contests/views.py +++ b/oioioi/contests/views.py @@ -695,3 +695,8 @@ def reattach_problem_confirm_view(request, problem_instance_id, contest_id): 'contests/reattach_problem_confirm.html', {'problem_instance': problem_instance, 'destination_contest': contest}, ) + +@enforce_condition(is_contest_basicadmin) +def get_teacher_names(request): + queryset = User.objects.filter(teacher__isnull=False) + return get_user_hints_view(request, 'substr', queryset)