From e07e7d8408e27fef9248de396191fec42413a565 Mon Sep 17 00:00:00 2001 From: kovacspe Date: Sat, 23 Nov 2024 22:21:05 +0100 Subject: [PATCH 1/3] =?UTF-8?q?Pridan=C3=A1=20valid=C3=A1cia=20na=20po?= =?UTF-8?q?=C4=8Det=20bodov?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- competition/models.py | 3 ++- competition/utils/validations.py | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 competition/utils/validations.py diff --git a/competition/models.py b/competition/models.py index 8af195ff..07322ad8 100644 --- a/competition/models.py +++ b/competition/models.py @@ -22,6 +22,7 @@ from competition.querysets import ActiveQuerySet from competition.utils.school_year_manipulation import \ get_school_year_end_by_date +from competition.utils.validations import validate_points from personal.models import Profile, School from user.models import User @@ -657,7 +658,7 @@ class Meta: verbose_name='opravené riešenie', blank=True, upload_to=get_corrected_solution_path) score = models.PositiveSmallIntegerField( - verbose_name='body', null=True, blank=True) + verbose_name='body', null=True, blank=True, validators=[validate_points]) vote = models.IntegerField(choices=Vote.choices, default=Vote.NONE) diff --git a/competition/utils/validations.py b/competition/utils/validations.py new file mode 100644 index 00000000..1ca7479a --- /dev/null +++ b/competition/utils/validations.py @@ -0,0 +1,8 @@ +from django.core.exceptions import ValidationError + + +def validate_points(value: int): + if value < 0 or value > 9: + raise ValidationError( + f'{value} je mimo povoleného rozmedzia pre body' + ) From 970831a8fd434c11a7a2a90755e8fd8863dbf4f3 Mon Sep 17 00:00:00 2001 From: kovacspe Date: Sat, 23 Nov 2024 23:25:29 +0100 Subject: [PATCH 2/3] Pridane validacie na REST actions --- competition/models.py | 2 +- competition/utils/validations.py | 2 +- competition/views.py | 13 +++++++++++-- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/competition/models.py b/competition/models.py index 07322ad8..1b68adc1 100644 --- a/competition/models.py +++ b/competition/models.py @@ -1,6 +1,6 @@ import datetime import json -from typing import Optional +from typing import Iterable, Optional from django.conf import settings from django.contrib.sites.models import Site diff --git a/competition/utils/validations.py b/competition/utils/validations.py index 1ca7479a..a68fccf3 100644 --- a/competition/utils/validations.py +++ b/competition/utils/validations.py @@ -4,5 +4,5 @@ def validate_points(value: int): if value < 0 or value > 9: raise ValidationError( - f'{value} je mimo povoleného rozmedzia pre body' + f'{value} je mimo povoleného rozmedzia pre body. Povolený rozsah je 0-9.' ) diff --git a/competition/views.py b/competition/views.py index de93f33e..c57e48a8 100644 --- a/competition/views.py +++ b/competition/views.py @@ -6,6 +6,7 @@ from operator import itemgetter from typing import Optional +from django.core.exceptions import ValidationError as CoreValidationError from django.core.files import File from django.core.mail import send_mail from django.http import FileResponse, HttpResponse @@ -441,7 +442,11 @@ def upload_solutions_with_points(self, request, pk=None): solution.score = score solution.corrected_solution = File(corrected_solution) - solution.save() + try: + solution.full_clean() + solution.save() + except CoreValidationError: + return Response(status=status.HTTP_422_UNPROCESSABLE_ENTITY) return Response() @@ -460,7 +465,11 @@ def upload_points(self, request, pk=None): if solution.problem != problem: continue solution.score = solution_dict['score'] - solution.save() + try: + solution.full_clean() + solution.save() + except CoreValidationError: + return Response(status=status.HTTP_422_UNPROCESSABLE_ENTITY) return Response(status=status.HTTP_200_OK) From f77fdbb1947961cc95f3903b8d6933eb30d39a65 Mon Sep 17 00:00:00 2001 From: kovacspe Date: Sun, 24 Nov 2024 02:03:04 +0100 Subject: [PATCH 3/3] Remove unused import --- competition/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/competition/models.py b/competition/models.py index 1b68adc1..07322ad8 100644 --- a/competition/models.py +++ b/competition/models.py @@ -1,6 +1,6 @@ import datetime import json -from typing import Iterable, Optional +from typing import Optional from django.conf import settings from django.contrib.sites.models import Site