get what i want

This commit is contained in:
2024-05-07 20:25:59 +08:00
parent c25a314001
commit 7a152d65a3
5 changed files with 29 additions and 22 deletions

View File

@@ -1,19 +1,9 @@
FROM alpine:3.19 AS downloader
WORKDIR /app
RUN <<EOS
set -ex
apk add unzip
wget https://github.com/QingdaoU/OnlineJudgeFE/releases/download/oj_2.7.5/dist.zip
unzip dist.zip
rm -f dist.zip
EOS
FROM python:3.12-alpine FROM python:3.12-alpine
ARG TARGETARCH ARG TARGETARCH
ARG TARGETVARIANT ARG TARGETVARIANT
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories
ENV OJ_ENV production ENV OJ_ENV production
WORKDIR /app WORKDIR /app
@@ -24,13 +14,14 @@ RUN --mount=type=cache,target=/etc/apk/cache,id=apk-cahce-$TARGETARCH$TARGETVARI
--mount=type=cache,target=/root/.cache/pip,id=pip-cahce-$TARGETARCH$TARGETVARIANT-final \ --mount=type=cache,target=/root/.cache/pip,id=pip-cahce-$TARGETARCH$TARGETVARIANT-final \
<<EOS <<EOS
set -ex set -ex
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
apk add gcc libc-dev python3-dev libpq libpq-dev libjpeg-turbo libjpeg-turbo-dev zlib zlib-dev freetype freetype-dev supervisor openssl nginx curl unzip apk add gcc libc-dev python3-dev libpq libpq-dev libjpeg-turbo libjpeg-turbo-dev zlib zlib-dev freetype freetype-dev supervisor openssl nginx curl unzip
pip install -r /app/deploy/requirements.txt pip install -r /app/deploy/requirements.txt
apk del gcc libc-dev python3-dev libpq-dev libjpeg-turbo-dev zlib-dev freetype-dev apk del gcc libc-dev python3-dev libpq-dev libjpeg-turbo-dev zlib-dev freetype-dev
EOS EOS
COPY ./ /app/ COPY ./ /app/
COPY --from=downloader --link /app/dist/ /app/dist/ RUN mkdir -p /app/dist/
RUN chmod -R u=rwX,go=rX ./ && chmod +x ./deploy/entrypoint.sh RUN chmod -R u=rwX,go=rX ./ && chmod +x ./deploy/entrypoint.sh
HEALTHCHECK --interval=5s CMD [ "/usr/local/bin/python3", "/app/deploy/health_check.py" ] HEALTHCHECK --interval=5s CMD [ "/usr/local/bin/python3", "/app/deploy/health_check.py" ]

View File

@@ -376,10 +376,13 @@ class SessionManagementAPI(APIView):
class UserRankAPI(APIView): class UserRankAPI(APIView):
def get(self, request): def get(self, request):
rule_type = request.GET.get("rule") rule_type = request.GET.get("rule")
username = request.GET.get("username")
if not username:
username = ""
if rule_type not in ContestRuleType.choices(): if rule_type not in ContestRuleType.choices():
rule_type = ContestRuleType.ACM rule_type = ContestRuleType.ACM
profiles = UserProfile.objects.filter(user__admin_type=AdminType.REGULAR_USER, user__is_disabled=False) \ profiles = UserProfile.objects.filter(user__admin_type=AdminType.REGULAR_USER, user__is_disabled=False,\
.select_related("user") user__username__icontains=username).select_related("user")
if rule_type == ContestRuleType.ACM: if rule_type == ContestRuleType.ACM:
profiles = profiles.filter(submission_number__gt=0).order_by("-accepted_number", "submission_number") profiles = profiles.filter(submission_number__gt=0).order_by("-accepted_number", "submission_number")
else: else:

View File

@@ -126,6 +126,19 @@ class ProblemSerializer(BaseProblemSerializer):
"spj_code", "spj_version", "spj_compile_ok") "spj_code", "spj_version", "spj_compile_ok")
class ProblemListSerializer(BaseProblemSerializer):
template = serializers.SerializerMethodField("get_public_template")
class Meta:
model = Problem
exclude = ("test_case_score", "test_case_id", "visible", "is_public",
"spj_code", "spj_version", "spj_compile_ok", "description",
"input_description", "output_description", "samples", "hint",
"source", "spj", "spj_language", "time_limit", "memory_limit",
"io_mode", "create_time", "languages", "last_update_time",
"total_score", "statistic_info", "share_submission")
class ProblemSafeSerializer(BaseProblemSerializer): class ProblemSafeSerializer(BaseProblemSerializer):
template = serializers.SerializerMethodField("get_public_template") template = serializers.SerializerMethodField("get_public_template")
@@ -203,7 +216,7 @@ class AddContestProblemSerializer(serializers.Serializer):
display_id = serializers.CharField() display_id = serializers.CharField()
class ExportProblemRequestSerialzier(serializers.Serializer): class ExportProblemRequestSerializer(serializers.Serializer):
problem_id = serializers.ListField(child=serializers.IntegerField(), allow_empty=False) problem_id = serializers.ListField(child=serializers.IntegerField(), allow_empty=False)

View File

@@ -26,7 +26,7 @@ from ..serializers import (CreateContestProblemSerializer, CompileSPJSerializer,
CreateProblemSerializer, EditProblemSerializer, EditContestProblemSerializer, CreateProblemSerializer, EditProblemSerializer, EditContestProblemSerializer,
ProblemAdminSerializer, TestCaseUploadForm, ContestProblemMakePublicSerializer, ProblemAdminSerializer, TestCaseUploadForm, ContestProblemMakePublicSerializer,
AddContestProblemSerializer, ExportProblemSerializer, AddContestProblemSerializer, ExportProblemSerializer,
ExportProblemRequestSerialzier, UploadProblemForm, ImportProblemSerializer, ExportProblemRequestSerializer, UploadProblemForm, ImportProblemSerializer,
FPSProblemSerializer) FPSProblemSerializer)
from ..utils import TEMPLATE_BASE, build_problem_template from ..utils import TEMPLATE_BASE, build_problem_template
@@ -527,7 +527,7 @@ class ExportProblemAPI(APIView):
arcname=f"{index}/testcase/{v['output_name']}", arcname=f"{index}/testcase/{v['output_name']}",
compress_type=compression) compress_type=compression)
@validate_serializer(ExportProblemRequestSerialzier) @validate_serializer(ExportProblemRequestSerializer)
def get(self, request): def get(self, request):
problems = Problem.objects.filter(id__in=request.data["problem_id"]) problems = Problem.objects.filter(id__in=request.data["problem_id"])
for problem in problems: for problem in problems:

View File

@@ -3,7 +3,7 @@ from django.db.models import Q, Count
from utils.api import APIView from utils.api import APIView
from account.decorators import check_contest_permission from account.decorators import check_contest_permission
from ..models import ProblemTag, Problem, ProblemRuleType from ..models import ProblemTag, Problem, ProblemRuleType
from ..serializers import ProblemSerializer, TagSerializer, ProblemSafeSerializer from ..serializers import ProblemSerializer, TagSerializer, ProblemSafeSerializer, ProblemListSerializer
from contest.models import ContestRuleType from contest.models import ContestRuleType
@@ -62,7 +62,7 @@ class ProblemAPI(APIView):
if not limit: if not limit:
return self.error("Limit is needed") return self.error("Limit is needed")
problems = Problem.objects.select_related("created_by").filter(contest_id__isnull=True, visible=True) problems = Problem.objects.select_related("created_by").filter(contest_id__isnull=True, visible=True).order_by("-create_time")
# 按照标签筛选 # 按照标签筛选
tag_text = request.GET.get("tag") tag_text = request.GET.get("tag")
if tag_text: if tag_text:
@@ -78,7 +78,7 @@ class ProblemAPI(APIView):
if difficulty: if difficulty:
problems = problems.filter(difficulty=difficulty) problems = problems.filter(difficulty=difficulty)
# 根据profile 为做过的题目添加标记 # 根据profile 为做过的题目添加标记
data = self.paginate_data(request, problems, ProblemSerializer) data = self.paginate_data(request, problems, ProblemListSerializer)
self._add_problem_status(request, data) self._add_problem_status(request, data)
return self.success(data) return self.success(data)
@@ -113,7 +113,7 @@ class ContestProblemAPI(APIView):
contest_problems = Problem.objects.select_related("created_by").filter(contest=self.contest, visible=True) contest_problems = Problem.objects.select_related("created_by").filter(contest=self.contest, visible=True)
if self.contest.problem_details_permission(request.user): if self.contest.problem_details_permission(request.user):
data = ProblemSerializer(contest_problems, many=True).data data = ProblemListSerializer(contest_problems, many=True).data
self._add_problem_status(request, data) self._add_problem_status(request, data)
else: else:
data = ProblemSafeSerializer(contest_problems, many=True).data data = ProblemSafeSerializer(contest_problems, many=True).data