From 16230de70cfd8ad4bd72d1c24f890f31fda1f6a7 Mon Sep 17 00:00:00 2001
From: Mateusz Kolpa
Date: Wed, 13 Mar 2024 17:07:20 +0100
Subject: [PATCH] `Add user to contest` form doesn't have an option for direct
add (#307)
* Add some functionality
* Finish add user to contest
* Fix indentation
* Simplify teacher check
* Simplify add_user_to_contest view
* Add some tests
* Gotta improve tests
* Works on tests
* Some works...
* Idk what to do...
* Finalize the PR with some cherries on top
* Shorten some lines
* Shorten some lines
---
easy_toolbox.py | 4 +-
oioioi/teachers/forms.py | 28 ++++-
.../teachers/templates/teachers/members.html | 19 ++++
oioioi/teachers/tests.py | 102 +++++++++++++++++-
oioioi/teachers/urls.py | 9 ++
oioioi/teachers/utils.py | 65 +++++++++++
oioioi/teachers/views.py | 44 +++++++-
7 files changed, 265 insertions(+), 6 deletions(-)
create mode 100644 oioioi/teachers/utils.py
diff --git a/easy_toolbox.py b/easy_toolbox.py
index f617208eb..77d196b09 100755
--- a/easy_toolbox.py
+++ b/easy_toolbox.py
@@ -3,7 +3,7 @@
# pip requirements:
# python ^3.6
# inquirer (only for GUI)
-#
+#
# system:
# docker
# docker-compose
@@ -37,7 +37,7 @@
("test", "Run unit tests.", "{exec} web ../oioioi/test.sh"),
("test-slow", "Run unit tests. (--runslow)", "{exec} web ../oioioi/test.sh --runslow"),
("test-abc", "Run specific test file. (edit the toolbox)",
- "{exec} web ../oioioi/test.sh -v oioioi/problems/tests/test_task_archive.py"),
+ "{exec} web ../oioioi/test.sh -v oioioi/teachers/tests.py"),
("test-coverage", "Run coverage tests.",
"{exec} 'web' ../oioioi/test.sh oioioi/problems --cov-report term --cov-report xml:coverage.xml --cov=oioioi"),
("cypress-apply-settings", "Apply settings for CyPress.",
diff --git a/oioioi/teachers/forms.py b/oioioi/teachers/forms.py
index 179ec764b..ea9a68e09 100644
--- a/oioioi/teachers/forms.py
+++ b/oioioi/teachers/forms.py
@@ -2,11 +2,14 @@
from django.urls import reverse
from django.utils.safestring import mark_safe
from django.utils.translation import gettext_lazy as _
+from django.contrib import messages
+from django.core.exceptions import ValidationError
from oioioi.contests.forms import SimpleContestForm
-from oioioi.teachers.models import Teacher
+from oioioi.teachers.models import ContestTeacher, Teacher
from oioioi.base.utils.user_selection import UserSelectionField
-
+from oioioi.participants.models import Participant
+from oioioi.teachers.utils import validate_can_add_user_to_contest, add_user_to_contest_as
class TeacherContestForm(SimpleContestForm):
@@ -83,3 +86,24 @@ def __init__(self, *args, **kwargs):
def clean_school(self):
data = self.cleaned_data['school']
return ' '.join(data.splitlines())
+
+
+class AddUserToContestForm(forms.Form):
+ user = UserSelectionField()
+
+ def __init__(self, member_type, contest, *args, **kwargs):
+ self.member_type = member_type
+ self.contest = contest
+ super(AddUserToContestForm, self).__init__(*args, **kwargs)
+
+ def clean(self):
+ clean_data = super().clean()
+
+ if self.is_valid():
+ user = self.cleaned_data['user']
+ try:
+ validate_can_add_user_to_contest(user, self.contest, self.member_type)
+ except ValidationError as e:
+ self.add_error('user', e.message)
+
+ return clean_data
diff --git a/oioioi/teachers/templates/teachers/members.html b/oioioi/teachers/templates/teachers/members.html
index dfc7c0774..9d6468e4b 100644
--- a/oioioi/teachers/templates/teachers/members.html
+++ b/oioioi/teachers/templates/teachers/members.html
@@ -176,6 +176,25 @@
{% endif %}
+
+
{% if member_type == 'pupil' and usergroups_active and members %}