SOME ABEBE

This commit is contained in:
ITQ
2025-03-01 02:44:45 +03:00
parent 930fb23bbc
commit baacef032a
8 changed files with 75 additions and 9 deletions
+7 -3
View File
@@ -3,9 +3,14 @@ from http import HTTPStatus as status
from ninja import Router from ninja import Router
from ninja.errors import AuthenticationError from ninja.errors import AuthenticationError
from api.v1.user.schemas import LoginSchema, RegisterSchema, TokenSchema, UserSchema
from api.v1.auth import BearerAuth from api.v1.auth import BearerAuth
from api.v1.schemas import BadRequestError, ForbiddenError, NotFoundError from api.v1.schemas import BadRequestError, ForbiddenError, NotFoundError
from api.v1.user.schemas import (
LoginSchema,
RegisterSchema,
TokenSchema,
UserSchema,
)
from apps.user.models import User from apps.user.models import User
router = Router(tags=["user"]) router = Router(tags=["user"])
@@ -56,5 +61,4 @@ def sign_in(request, data: LoginSchema):
status.NOT_FOUND: NotFoundError, status.NOT_FOUND: NotFoundError,
}, },
) )
def get_user(request, user_id: str): def get_user(request, user_id: str): ...
...
@@ -2,6 +2,5 @@ from django.apps import AppConfig
class CompetitionsConfig(AppConfig): class CompetitionsConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "apps.competition" name = "apps.competition"
label = "competition" label = "competition"
-3
View File
@@ -1,7 +1,4 @@
import contextlib
from django.apps import AppConfig from django.apps import AppConfig
from django.core.cache import cache
class CoreConfig(AppConfig): class CoreConfig(AppConfig):
+6
View File
@@ -0,0 +1,6 @@
from django.apps import AppConfig
class CompetitionsConfig(AppConfig):
name = "apps.task"
label = "task"
+34
View File
@@ -0,0 +1,34 @@
from uuid import uuid4
from competition.models import Competition
from core.models import BaseModel
from django.db import models
from apps.task.validators import ContestTaskCriteriesValidator
class CompetitionTask(BaseModel):
class CompetitionTaskType(models.TextChoices):
INPUT = "input"
CHECKER = "checker"
REVIEW = "review"
def answer_file_upload_to(instance, filename) -> str:
return f"/tasks/{instance.id}/answer/{uuid4}"
competition = models.ForeignKey(Competition, on_delete=models.CASCADE)
title = models.TextField(verbose_name="заголовок", max_length=50)
description = models.TextField(verbose_name="описание", max_length=300)
type = models.CharField(choices=CompetitionTaskType)
# only when "input" or "checker" type
correct_answer_file = models.FileField(upload_to=answer_file_upload_to)
# only when "checker" type
answer_file_path = models.TextField()
# only when "review" type
criteries = models.JSONField(blank=True, null=True)
def clean(self):
ContestTaskCriteriesValidator()(self)
+24
View File
@@ -0,0 +1,24 @@
from django.core.exceptions import ValidationError
from pydantic import BaseModel
from pydantic import ValidationError as PydanticValidationError
class Criteria(BaseModel):
name: str
slug: str
max_value: int
min_value: int
class ContestTaskCriteriesValidator:
def __call__(self, instance):
if instance.criterties and not isinstance(instance.criterties, list):
err = "criteries must be a valid dictionary"
raise ValidationError(err)
try:
for criteria in instance.criterties:
Criteria(**criteria)
except PydanticValidationError:
err = "invalid criteries data"
raise ValidationError(err)
+4 -2
View File
@@ -13,9 +13,11 @@ class User(BaseModel):
username = models.SlugField(unique=True, verbose_name="Юзернейм") username = models.SlugField(unique=True, verbose_name="Юзернейм")
password = models.TextField(verbose_name="Пароль") password = models.TextField(verbose_name="Пароль")
status = models.CharField(max_length=10, choices=UserRole.choices, default=UserRole.STUDENT) status = models.CharField(
max_length=10, choices=UserRole.choices, default=UserRole.STUDENT
)
def __str__(self): def __str__(self) -> str:
return self.username return self.username
class Meta: class Meta: