Skip to content

Commit de5d478

Browse files
-- Resolved issue #409 with a new method registration_status and a new template. -- Fixed a minor bug in models.py. (#458)
* -- Resolved issue #409 with a new method `registration_status` and a new template. -- Fixed a minor bug in `models.py`. * Update settings.py.template * -- Resolved issue #409 with a new method `registration_status` and a new template. -- Fixed a minor bug in `models.py`.
1 parent 7ed172a commit de5d478

File tree

7 files changed

+71
-3
lines changed

7 files changed

+71
-3
lines changed

oioioi/contests/models.py

+19-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
from oioioi.contests.fields import ScoreField
2525
from oioioi.contests.problem_instance_controller import ProblemInstanceController
2626
from oioioi.filetracker.fields import FileField
27+
from enum import Enum
2728

2829

2930
def make_contest_filename(instance, filename):
@@ -357,6 +358,10 @@ class Meta(object):
357358
registration_availability_options.register('NO', _("Closed"))
358359
registration_availability_options.register('CONFIG', _("Configuration"))
359360

361+
class RegistrationStatus(Enum):
362+
OPEN = 1
363+
CLOSED = 2
364+
NOT_OPEN_YET = 3
360365

361366
@date_registry.register(
362367
'registration_available_from', name_generator=(lambda obj: _("Make registration available"))
@@ -405,12 +410,25 @@ def is_registration_open(self, timestamp):
405410
return self.registration_available_from <= timestamp <= self.registration_available_to
406411
return False
407412

413+
414+
def registration_status(self, timestamp):
415+
if self.enabled == 'YES':
416+
return RegistrationStatus.OPEN
417+
if self.enabled == 'CONFIG':
418+
if self.registration_available_from <= timestamp <= self.registration_available_to:
419+
return RegistrationStatus.OPEN
420+
elif self.registration_available_to < timestamp:
421+
return RegistrationStatus.CLOSED
422+
elif timestamp < self.registration_available_to:
423+
return RegistrationStatus.NOT_OPEN_YET
424+
return RegistrationStatus.CLOSED
425+
408426
def clean(self):
409427
if self.enabled == 'CONFIG':
410428
if self.registration_available_from is None or self.registration_available_to is None:
411429
raise ValidationError(_("If registration availability is set to Configuration, then "
412430
"'Available from' and 'Available to' must be set."))
413-
if self.available_from > self.registration_available_to:
431+
if self.registration_available_from > self.registration_available_to:
414432
raise ValidationError(_("'Available from' must be before 'available to'."))
415433

416434

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{% extends "base-with-menu.html" %}
2+
{% load i18n %}
3+
4+
{% block title %}{% trans "Registration Form" %}{% endblock %}
5+
6+
{% block main-content %}
7+
<h1>{% trans "Registration not open yet" %}</h1>
8+
<p>{% trans "Please check back later" %}</p>
9+
{% endblock %}

oioioi/contests/tests/tests.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -3760,7 +3760,7 @@ def set_registration_availability(rvc, enabled, available_from=None, available_t
37603760
rvc.save()
37613761

37623762

3763-
def check_registration(self, expected_status_code, availability, available_from=None, available_to=None):
3763+
def check_registration(self, expected_status_code, availability, available_from=None, available_to=None, expected_template=None):
37643764
contest = Contest.objects.get()
37653765
contest.controller_name = 'oioioi.oi.controllers.OIContestController'
37663766
contest.save()
@@ -3773,6 +3773,8 @@ def check_registration(self, expected_status_code, availability, available_from=
37733773
set_registration_availability(rvc, availability, available_from, available_to)
37743774
response = self.client.get(url)
37753775
self.assertEqual(expected_status_code, response.status_code)
3776+
if expected_template == 'registration_not_open_yet':
3777+
self.assertTemplateUsed(response, 'contests/registration_not_open_yet.html')
37763778

37773779

37783780
class TestOpenRegistration(TestCase):
@@ -3797,7 +3799,7 @@ def test_configured_registration_closed_before(self):
37973799
now = datetime.utcnow()
37983800
available_from = now + timedelta(hours=1)
37993801
available_to = now + timedelta(days=1)
3800-
check_registration(self, 403, 'CONFIG', available_from, available_to)
3802+
check_registration(self, 200, 'CONFIG', available_from, available_to, 'registration_not_open_yet')
38013803

38023804
def test_configured_registration_closed_after(self):
38033805
now = datetime.utcnow()

oioioi/mp/controllers.py

+9
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from oioioi.participants.utils import is_participant
1414
from oioioi.programs.controllers import ProgrammingContestController
1515
from oioioi.rankings.controllers import DefaultRankingController
16+
from oioioi.contests.models import RegistrationStatus
1617

1718
CONTEST_RANKING_KEY = 'c'
1819

@@ -49,7 +50,15 @@ def visible_contests_query(self, request):
4950
def can_register(self, request):
5051
return super().is_registration_open(request)
5152

53+
def get_registration_status(self, request):
54+
return super().registration_status(request)
55+
5256
def registration_view(self, request):
57+
58+
registration_status = self.get_registration_status(request)
59+
if registration_status == RegistrationStatus.NOT_OPEN_YET:
60+
return TemplateResponse(request, 'contests/registration_not_open_yet.html')
61+
5362
participant = self._get_participant_for_form(request)
5463

5564
if 'mp_mpregistrationformdata' in request.session:

oioioi/oi/controllers.py

+9
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
from oioioi.participants.utils import is_participant
2929
from oioioi.programs.controllers import ProgrammingContestController
3030
from oioioi.scoresreveal.utils import is_revealed
31+
from oioioi.contests.models import RegistrationStatus
3132

3233
auditLogger = logging.getLogger(__name__ + ".audit")
3334

@@ -59,10 +60,18 @@ def visible_contests_query(self, request):
5960
def can_register(self, request):
6061
return super().is_registration_open(request)
6162

63+
def get_registration_status(self, request):
64+
return super().registration_status(request)
65+
6266
def can_unregister(self, request, participant):
6367
return False
6468

6569
def registration_view(self, request):
70+
71+
registration_status = self.get_registration_status(request)
72+
if registration_status == RegistrationStatus.NOT_OPEN_YET:
73+
return TemplateResponse(request, 'contests/registration_not_open_yet.html')
74+
6675
participant = self._get_participant_for_form(request)
6776

6877
if 'oi_oiregistrationformdata' in request.session:

oioioi/pa/controllers.py

+10
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
from oioioi.participants.utils import is_participant
2626
from oioioi.programs.controllers import ProgrammingContestController
2727
from oioioi.rankings.controllers import CONTEST_RANKING_KEY, DefaultRankingController
28+
from oioioi.contests.models import RegistrationStatus
29+
2830

2931
auditLogger = logging.getLogger(__name__ + ".audit")
3032

@@ -61,10 +63,18 @@ def visible_contests_query(self, request):
6163
def can_register(self, request):
6264
return super().is_registration_open(request)
6365

66+
def get_registration_status(self, request):
67+
return super().registration_status(request)
68+
6469
def can_unregister(self, request, participant):
6570
return False
6671

6772
def registration_view(self, request):
73+
74+
registration_status = self.get_registration_status(request)
75+
if registration_status == RegistrationStatus.NOT_OPEN_YET:
76+
return TemplateResponse(request, 'contests/registration_not_open_yet.html')
77+
6878
participant = self._get_participant_for_form(request)
6979

7080
if 'pa_paregistrationformdata' in request.session:

oioioi/participants/controllers.py

+11
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
RegistrationModel,
2323
TermsAcceptedPhrase,
2424
)
25+
from oioioi.contests.models import RegistrationStatus
2526

2627
auditLogger = logging.getLogger(__name__ + ".audit")
2728

@@ -209,6 +210,16 @@ def is_registration_open(self, request):
209210
auditLogger.warning("RegistrationAvailabilityConfig does not exist for contest %s", request.contest)
210211
return True
211212

213+
def registration_status(self, request):
214+
if is_contest_archived(request):
215+
return RegistrationStatus.CLOSED
216+
try:
217+
rvc = RegistrationAvailabilityConfig.objects.get(contest=request.contest)
218+
return rvc.registration_status(request.timestamp)
219+
except RegistrationAvailabilityConfig.DoesNotExist:
220+
auditLogger.warning("RegistrationAvailabilityConfig does not exist for contest %s", request.contest)
221+
return RegistrationStatus.OPEN
222+
212223

213224
class OpenParticipantsController(ParticipantsController):
214225
@property

0 commit comments

Comments
 (0)