mirror of
https://gitlab.com/megazordpobeda/DataRush.git
synced 2026-05-23 21:27:10 +00:00
SOME ABEBE
This commit is contained in:
@@ -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"
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class CompetitionsConfig(AppConfig):
|
||||||
|
name = "apps.task"
|
||||||
|
label = "task"
|
||||||
@@ -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)
|
||||||
@@ -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)
|
||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user