Merge branch 'master' of gitlab.prodcontest.ru:team-15/project

This commit is contained in:
moolcoov
2025-03-01 20:24:34 +03:00
13 changed files with 46 additions and 27 deletions
-1
View File
@@ -166,7 +166,6 @@ http {
} }
location /admin/grafana/ { location /admin/grafana/ {
rewrite ^/admin/grafana/(.*) /$1 break;
proxy_pass http://grafana:3000/; proxy_pass http://grafana:3000/;
proxy_set_header Host $http_host; proxy_set_header Host $http_host;
+4
View File
@@ -4,6 +4,7 @@ from typing import Any
import jwt import jwt
from django.conf import settings from django.conf import settings
from django.http import HttpRequest from django.http import HttpRequest
from ninja.errors import AuthenticationError
from ninja.security import HttpBearer from ninja.security import HttpBearer
from apps.user.models import User from apps.user.models import User
@@ -11,9 +12,12 @@ from apps.user.models import User
class BearerAuth(HttpBearer): class BearerAuth(HttpBearer):
def authenticate(self, request: HttpRequest, token: str) -> Any | None: def authenticate(self, request: HttpRequest, token: str) -> Any | None:
try:
data = jwt.decode(token, settings.SECRET_KEY, algorithms=["HS256"]) data = jwt.decode(token, settings.SECRET_KEY, algorithms=["HS256"])
if data["exp"] < datetime.datetime.now().timestamp(): if data["exp"] < datetime.datetime.now().timestamp():
return None return None
except Exception:
raise AuthenticationError
user = User.objects.get(id=data["id"]) user = User.objects.get(id=data["id"])
return user return user
+4 -3
View File
@@ -1,10 +1,9 @@
from typing import Literal from typing import Literal
from uuid import UUID from uuid import UUID
from django.http import HttpRequest
from ninja import ModelSchema, Schema from ninja import ModelSchema, Schema
from apps.review.models import Reviewer, Review from apps.review.models import Review, Reviewer
from apps.task.models import CompetitionTaskSubmission from apps.task.models import CompetitionTaskSubmission
@@ -34,4 +33,6 @@ class SubmissionsOut(Schema):
@staticmethod @staticmethod
def resolve_submissions(self, context) -> list[SubmissionOut]: def resolve_submissions(self, context) -> list[SubmissionOut]:
return list(Review.objects.filter(reviewer=context.get("request").auth)) return list(
Review.objects.filter(reviewer=context.get("request").auth)
)
+8 -5
View File
@@ -1,4 +1,3 @@
import logging
from http import HTTPStatus as status from http import HTTPStatus as status
from uuid import UUID from uuid import UUID
@@ -8,7 +7,6 @@ from ninja import Router
from api.v1 import schemas as global_schemas from api.v1 import schemas as global_schemas
from api.v1.review import schemas from api.v1.review import schemas
from api.v1.task.schemas import TaskSubmissionIn
from apps.task.models import CompetitionTaskSubmission from apps.task.models import CompetitionTaskSubmission
router = Router(tags=["review"]) router = Router(tags=["review"])
@@ -19,9 +17,11 @@ router = Router(tags=["review"])
response={ response={
status.OK: schemas.SubmissionsOut, status.OK: schemas.SubmissionsOut,
}, },
description="Список отправок, на проверку которых назначен ревьюер" description="Список отправок, на проверку которых назначен ревьюер",
) )
def get_submissions(request: HttpRequest, token: str) -> tuple[status, schemas.SubmissionsOut]: def get_submissions(
request: HttpRequest, token: str
) -> tuple[status, schemas.SubmissionsOut]:
return status.OK, schemas.SubmissionsOut() return status.OK, schemas.SubmissionsOut()
@@ -36,12 +36,15 @@ def get_submissions(request: HttpRequest, token: str) -> tuple[status, schemas.S
def get_reviewer_profile(request: HttpRequest, token: str): def get_reviewer_profile(request: HttpRequest, token: str):
return status.OK, request.auth return status.OK, request.auth
@router.get( @router.get(
"{token}/submissions/{submition_id}", "{token}/submissions/{submition_id}",
response={ response={
status.OK: schemas.SubmissionOut, status.OK: schemas.SubmissionOut,
}, },
) )
def get_submission(request: HttpRequest, token: str, submition_id: UUID) -> tuple[status, schemas.SubmissionsOut]: def get_submission(
request: HttpRequest, token: str, submition_id: UUID
) -> tuple[status, schemas.SubmissionsOut]:
submission = get_object_or_404(CompetitionTaskSubmission, id=submition_id) submission = get_object_or_404(CompetitionTaskSubmission, id=submition_id)
return status.OK, submission return status.OK, submission
+1 -1
View File
@@ -13,9 +13,9 @@ from api.v1.task.schemas import (
) )
from apps.competition.models import State from apps.competition.models import State
from apps.task.models import ( from apps.task.models import (
CompetitionTaskSubmission,
Competition, Competition,
CompetitionTask, CompetitionTask,
CompetitionTaskSubmission,
) )
router = Router(tags=["competition"]) router = Router(tags=["competition"])
+2 -2
View File
@@ -6,7 +6,7 @@ from ninja import Router
from ninja.errors import AuthenticationError from ninja.errors import AuthenticationError
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, ConflictError
from api.v1.user.schemas import ( from api.v1.user.schemas import (
LoginSchema, LoginSchema,
RegisterSchema, RegisterSchema,
@@ -23,6 +23,7 @@ router = Router(tags=["user"])
response={ response={
status.CREATED: TokenSchema, status.CREATED: TokenSchema,
status.BAD_REQUEST: BadRequestError, status.BAD_REQUEST: BadRequestError,
status.CONFLICT: ConflictError,
}, },
auth=None, auth=None,
) )
@@ -45,7 +46,6 @@ def sign_up(request, data: RegisterSchema):
) )
def sign_in(request, data: LoginSchema): def sign_in(request, data: LoginSchema):
user = User.objects.filter(email=data.email).first() user = User.objects.filter(email=data.email).first()
print(check_password(data.password, user.password))
if not user: if not user:
raise AuthenticationError raise AuthenticationError
if not check_password(data.password, user.password): if not check_password(data.password, user.password):
+13 -3
View File
@@ -6,7 +6,17 @@ from apps.task.admin import CompetitionTaskInline
@admin.register(Competition) @admin.register(Competition)
class CompetitionAdmin(admin.ModelAdmin): class CompetitionAdmin(admin.ModelAdmin):
list_display = ("title", "end_date", "type",) list_display = (
search_fields = ("title", "description",) "title",
list_filter = ("type", "participation_type",) "end_date",
"type",
)
search_fields = (
"title",
"description",
)
list_filter = (
"type",
"participation_type",
)
inlines = [CompetitionTaskInline] inlines = [CompetitionTaskInline]
@@ -1,7 +1,6 @@
from datetime import datetime from datetime import datetime
from django.db import models from django.db import models
from tinymce.models import HTMLField
from apps.core.models import BaseModel from apps.core.models import BaseModel
from apps.user.models import User from apps.user.models import User
@@ -49,8 +48,6 @@ class Competition(BaseModel):
def __str__(self): def __str__(self):
return self.title return self.title
class Meta: class Meta:
verbose_name = "соревнование" verbose_name = "соревнование"
verbose_name_plural = "соревнования" verbose_name_plural = "соревнования"
@@ -8,7 +8,7 @@ from django.core.management.base import BaseCommand
from django.utils import timezone from django.utils import timezone
from apps.competition.models import Competition, State from apps.competition.models import Competition, State
from apps.task.models import CompetitionTaskSubmission, CompetitionTask from apps.task.models import CompetitionTask, CompetitionTaskSubmission
from apps.user.models import User, UserRole from apps.user.models import User, UserRole
+7 -2
View File
@@ -10,6 +10,7 @@ class Reviewer(BaseModel):
token = models.CharField(max_length=100) token = models.CharField(max_length=100)
class Review(BaseModel): class Review(BaseModel):
class ReviewStatusChoices(models.TextChoices): class ReviewStatusChoices(models.TextChoices):
NOT_CHECKED = "not_checked" NOT_CHECKED = "not_checked"
@@ -17,6 +18,10 @@ class Review(BaseModel):
CHECKED = "checked" CHECKED = "checked"
reviewer = models.ForeignKey(Reviewer, on_delete=models.CASCADE) reviewer = models.ForeignKey(Reviewer, on_delete=models.CASCADE)
submission = models.ForeignKey(CompetitionTaskSubmission, on_delete=models.CASCADE) submission = models.ForeignKey(
CompetitionTaskSubmission, on_delete=models.CASCADE
)
state = models.CharField(choices=ReviewStatusChoices.choices, max_length=11) state = models.CharField(
choices=ReviewStatusChoices.choices, max_length=11
)
+1 -1
View File
@@ -1,5 +1,5 @@
from django.db import models
from django.contrib.auth.hashers import check_password, make_password from django.contrib.auth.hashers import check_password, make_password
from django.db import models
from apps.core.models import BaseModel from apps.core.models import BaseModel
+1 -1
View File
@@ -463,7 +463,7 @@ TINYMCE_DEFAULT_CONFIG = {
"alignright alignjustify | bullist numlist outdent indent | " "alignright alignjustify | bullist numlist outdent indent | "
"removeformat | help", "removeformat | help",
"skin": "oxide-dark", "skin": "oxide-dark",
"content_css": "dark" "content_css": "dark",
} }
# GUID # GUID
+1 -1
View File
@@ -13,7 +13,7 @@ admin.site.index_title = "DataRush"
urlpatterns = [ urlpatterns = [
# tinymce # tinymce
path('tinymce/', include('tinymce.urls')), path("tinymce/", include("tinymce.urls")),
# Admin urls # Admin urls
path("admin/", admin.site.urls), path("admin/", admin.site.urls),
# API urls # API urls