style: ruff format 全仓库
行宽 180 下把历史遗留的折行表达式合并,无语义改动。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -19,10 +19,7 @@ def bulk_fetch_problemset_progress(user, problem_ids):
|
||||
problemset__status=ProblemSetStatus.ACTIVE,
|
||||
problemset__problemsetproblem__problem_id__in=problem_ids,
|
||||
)
|
||||
.filter(
|
||||
models.Q(problemset__end_time__isnull=True)
|
||||
| models.Q(problemset__end_time__gt=timezone.now())
|
||||
)
|
||||
.filter(models.Q(problemset__end_time__isnull=True) | models.Q(problemset__end_time__gt=timezone.now()))
|
||||
.annotate(matched_problem_id=F("problemset__problemsetproblem__problem_id"))
|
||||
.only("join_time", "progress_detail")
|
||||
)
|
||||
@@ -51,7 +48,6 @@ class ShareSubmissionSerializer(serializers.Serializer):
|
||||
|
||||
|
||||
class SubmissionModelSerializer(serializers.ModelSerializer):
|
||||
|
||||
class Meta:
|
||||
model = Submission
|
||||
fields = "__all__"
|
||||
@@ -92,11 +88,7 @@ class SubmissionListSerializer(serializers.ModelSerializer):
|
||||
# 如果该题目已在题单中做出来了,则恢复显示
|
||||
if obj.user_id == self.user.id and self.user.is_regular_user():
|
||||
progress = self._get_problemset_progress(obj.problem_id)
|
||||
if (
|
||||
progress
|
||||
and obj.create_time < progress.join_time
|
||||
and str(obj.problem_id) not in progress.progress_detail
|
||||
):
|
||||
if progress and obj.create_time < progress.join_time and str(obj.problem_id) not in progress.progress_detail:
|
||||
return False
|
||||
return True
|
||||
|
||||
@@ -111,10 +103,7 @@ class SubmissionListSerializer(serializers.ModelSerializer):
|
||||
problemset__status=ProblemSetStatus.ACTIVE,
|
||||
problemset__problemsetproblem__problem_id=problem_id,
|
||||
)
|
||||
.filter(
|
||||
models.Q(problemset__end_time__isnull=True)
|
||||
| models.Q(problemset__end_time__gt=timezone.now())
|
||||
)
|
||||
.filter(models.Q(problemset__end_time__isnull=True) | models.Q(problemset__end_time__gt=timezone.now()))
|
||||
.only("join_time", "progress_detail")
|
||||
.first()
|
||||
)
|
||||
|
||||
@@ -22,9 +22,7 @@ class SubmissionRejudgeAPI(APIView):
|
||||
if not id:
|
||||
return self.error("Parameter error, id is required")
|
||||
try:
|
||||
submission = Submission.objects.select_related("problem").get(
|
||||
id=id, contest_id__isnull=True
|
||||
)
|
||||
submission = Submission.objects.select_related("problem").get(id=id, contest_id__isnull=True)
|
||||
except Submission.DoesNotExist:
|
||||
return self.error("Submission does not exists")
|
||||
submission.statistic_info = {}
|
||||
@@ -46,17 +44,13 @@ class SubmissionStatisticsAPI(APIView):
|
||||
filters = {"contest_id__isnull": True, "create_time__lte": end}
|
||||
if start:
|
||||
filters["create_time__gte"] = start
|
||||
submissions = Submission.objects.filter(
|
||||
**filters
|
||||
).select_related("problem__created_by")
|
||||
submissions = Submission.objects.filter(**filters).select_related("problem__created_by")
|
||||
|
||||
problem_id = request.GET.get("problem_id")
|
||||
|
||||
if problem_id:
|
||||
try:
|
||||
problem = Problem.objects.get(
|
||||
_id__iexact=problem_id, contest_id__isnull=True, visible=True
|
||||
)
|
||||
problem = Problem.objects.get(_id__iexact=problem_id, contest_id__isnull=True, visible=True)
|
||||
except Problem.DoesNotExist:
|
||||
return self.error("Problem doesn't exist")
|
||||
submissions = submissions.filter(problem=problem)
|
||||
@@ -82,9 +76,7 @@ class SubmissionStatisticsAPI(APIView):
|
||||
)
|
||||
submission_count = submission_stats["total_count"]
|
||||
accepted_count = submission_stats["accepted_count"]
|
||||
correct_rate = (
|
||||
round(accepted_count / submission_count * 100, 2) if submission_count else 0
|
||||
)
|
||||
correct_rate = round(accepted_count / submission_count * 100, 2) if submission_count else 0
|
||||
|
||||
# 优化:获取用户提交统计
|
||||
user_submissions = (
|
||||
@@ -99,20 +91,13 @@ class SubmissionStatisticsAPI(APIView):
|
||||
# 获取所有有提交记录的用户的class_name信息
|
||||
submitted_usernames = {item["username"] for item in user_submissions}
|
||||
if submitted_usernames:
|
||||
submitted_users_dict = {
|
||||
user["username"]: user["class_name"]
|
||||
for user in User.objects.filter(
|
||||
username__in=submitted_usernames
|
||||
).values("username", "class_name")
|
||||
}
|
||||
submitted_users_dict = {user["username"]: user["class_name"] for user in User.objects.filter(username__in=submitted_usernames).values("username", "class_name")}
|
||||
else:
|
||||
submitted_users_dict = {}
|
||||
|
||||
# 预先收集每个用户的提交ID和结果,按时间倒序
|
||||
submission_items_by_user = {}
|
||||
for submission in submissions.values("username", "id", "result").order_by(
|
||||
"-create_time"
|
||||
):
|
||||
for submission in submissions.values("username", "id", "result").order_by("-create_time"):
|
||||
username_key = submission["username"]
|
||||
submission_id = str(submission["id"])
|
||||
submission_items_by_user.setdefault(username_key, []).append(
|
||||
@@ -137,9 +122,7 @@ class SubmissionStatisticsAPI(APIView):
|
||||
"submission_count": item["submission_count"],
|
||||
"accepted_count": item["accepted_count"],
|
||||
"correct_rate": f"{rate}%",
|
||||
"submission_items": submission_items_by_user.get(
|
||||
username_key, []
|
||||
),
|
||||
"submission_items": submission_items_by_user.get(username_key, []),
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
@@ -37,9 +37,7 @@ class SubmissionAPI(AsyncAPIView):
|
||||
auth_method = getattr(request, "auth_method", "")
|
||||
if auth_method == "api_key":
|
||||
return
|
||||
user_bucket = TokenBucket(
|
||||
key=str(request.user.id), redis_conn=cache, **SysOptions.throttling["user"]
|
||||
)
|
||||
user_bucket = TokenBucket(key=str(request.user.id), redis_conn=cache, **SysOptions.throttling["user"])
|
||||
can_consume, wait = user_bucket.consume()
|
||||
if not can_consume:
|
||||
return "Please wait %d seconds" % (int(wait))
|
||||
@@ -52,10 +50,7 @@ class SubmissionAPI(AsyncAPIView):
|
||||
if not request.user.is_contest_admin(contest):
|
||||
user_ip = ipaddress.ip_address(request.session.get("ip"))
|
||||
if contest.allowed_ip_ranges:
|
||||
if not any(
|
||||
user_ip in ipaddress.ip_network(cidr, strict=False)
|
||||
for cidr in contest.allowed_ip_ranges
|
||||
):
|
||||
if not any(user_ip in ipaddress.ip_network(cidr, strict=False) for cidr in contest.allowed_ip_ranges):
|
||||
return self.error("Your IP is not allowed in this contest")
|
||||
|
||||
@login_required
|
||||
@@ -79,9 +74,7 @@ class SubmissionAPI(AsyncAPIView):
|
||||
return self.error(error)
|
||||
|
||||
try:
|
||||
problem = await Problem.objects.aget(
|
||||
id=data["problem_id"], contest_id=data.get("contest_id"), visible=True
|
||||
)
|
||||
problem = await Problem.objects.aget(id=data["problem_id"], contest_id=data.get("contest_id"), visible=True)
|
||||
except Problem.DoesNotExist:
|
||||
return self.error("Problem not exist")
|
||||
if data["language"] not in problem.languages:
|
||||
@@ -108,9 +101,7 @@ class SubmissionAPI(AsyncAPIView):
|
||||
if not submission_id:
|
||||
return self.error("Parameter id doesn't exist")
|
||||
try:
|
||||
submission = await Submission.objects.select_related("problem", "contest").aget(
|
||||
id=submission_id
|
||||
)
|
||||
submission = await Submission.objects.select_related("problem", "contest").aget(id=submission_id)
|
||||
except Submission.DoesNotExist:
|
||||
return self.error("Submission doesn't exist")
|
||||
if not submission.check_user_permission(request.user):
|
||||
@@ -120,26 +111,19 @@ class SubmissionAPI(AsyncAPIView):
|
||||
submission_data = await self.async_serialize_data(SubmissionModelSerializer, submission)
|
||||
else:
|
||||
submission_data = await self.async_serialize_data(SubmissionSafeModelSerializer, submission)
|
||||
submission_data["can_unshare"] = submission.check_user_permission(
|
||||
request.user, check_share=False
|
||||
)
|
||||
submission_data["can_unshare"] = submission.check_user_permission(request.user, check_share=False)
|
||||
return self.success(submission_data)
|
||||
|
||||
@login_required
|
||||
@validate_serializer(ShareSubmissionSerializer)
|
||||
async def put(self, request):
|
||||
try:
|
||||
submission = await Submission.objects.select_related("problem", "contest").aget(
|
||||
id=request.data["id"]
|
||||
)
|
||||
submission = await Submission.objects.select_related("problem", "contest").aget(id=request.data["id"])
|
||||
except Submission.DoesNotExist:
|
||||
return self.error("Submission doesn't exist")
|
||||
if not submission.check_user_permission(request.user, check_share=False):
|
||||
return self.error("No permission to share the submission")
|
||||
if (
|
||||
submission.contest
|
||||
and submission.contest.status == ContestStatus.CONTEST_UNDERWAY
|
||||
):
|
||||
if submission.contest and submission.contest.status == ContestStatus.CONTEST_UNDERWAY:
|
||||
return self.error("Can not share submission now")
|
||||
submission.shared = request.data["shared"]
|
||||
await submission.asave(update_fields=["shared"])
|
||||
@@ -153,9 +137,7 @@ class SubmissionListAPI(AsyncAPIView):
|
||||
if request.GET.get("contest_id"):
|
||||
return self.error("Parameter error")
|
||||
|
||||
submissions = Submission.objects.filter(contest_id__isnull=True).select_related(
|
||||
"problem"
|
||||
).order_by("-create_time")
|
||||
submissions = Submission.objects.filter(contest_id__isnull=True).select_related("problem").order_by("-create_time")
|
||||
problem_id = request.GET.get("problem_id")
|
||||
myself = request.GET.get("myself")
|
||||
result = request.GET.get("result")
|
||||
@@ -163,9 +145,7 @@ class SubmissionListAPI(AsyncAPIView):
|
||||
language = request.GET.get("language")
|
||||
if problem_id:
|
||||
try:
|
||||
problem = await Problem.objects.aget(
|
||||
_id__iexact=problem_id, contest_id__isnull=True, visible=True
|
||||
)
|
||||
problem = await Problem.objects.aget(_id__iexact=problem_id, contest_id__isnull=True, visible=True)
|
||||
except Problem.DoesNotExist:
|
||||
return self.error("Problem doesn't exist")
|
||||
submissions = submissions.filter(problem=problem)
|
||||
@@ -184,9 +164,7 @@ class SubmissionListAPI(AsyncAPIView):
|
||||
submissions = submissions.filter(language=language)
|
||||
if request.GET.get("today") == "1":
|
||||
now = timezone.now()
|
||||
submissions = submissions.filter(
|
||||
create_time__gte=now.replace(hour=0, minute=0, second=0, microsecond=0)
|
||||
)
|
||||
submissions = submissions.filter(create_time__gte=now.replace(hour=0, minute=0, second=0, microsecond=0))
|
||||
|
||||
data = await self.async_paginate_data(request, submissions)
|
||||
results = data["results"]
|
||||
@@ -212,18 +190,14 @@ class ContestSubmissionListAPI(AsyncAPIView):
|
||||
return self.error("Limit is needed")
|
||||
|
||||
contest = self.contest
|
||||
submissions = Submission.objects.filter(contest_id=contest.id).select_related(
|
||||
"problem", "contest"
|
||||
).order_by("-create_time")
|
||||
submissions = Submission.objects.filter(contest_id=contest.id).select_related("problem", "contest").order_by("-create_time")
|
||||
problem_id = request.GET.get("problem_id")
|
||||
myself = request.GET.get("myself")
|
||||
result = request.GET.get("result")
|
||||
username = request.GET.get("username")
|
||||
if problem_id:
|
||||
try:
|
||||
problem = await Problem.objects.aget(
|
||||
_id__iexact=problem_id, contest_id=contest.id, visible=True
|
||||
)
|
||||
problem = await Problem.objects.aget(_id__iexact=problem_id, contest_id=contest.id, visible=True)
|
||||
except Problem.DoesNotExist:
|
||||
return self.error("Problem doesn't exist")
|
||||
submissions = submissions.filter(problem=problem)
|
||||
@@ -245,10 +219,7 @@ class ContestSubmissionListAPI(AsyncAPIView):
|
||||
progress_cache = await sync_to_async(bulk_fetch_problemset_progress)(request.user, problem_ids)
|
||||
else:
|
||||
progress_cache = {}
|
||||
data["results"] = await self.async_serialize_data(
|
||||
SubmissionListSerializer,
|
||||
results, many=True, user=request.user, problemset_progress_cache=progress_cache
|
||||
)
|
||||
data["results"] = await self.async_serialize_data(SubmissionListSerializer, results, many=True, user=request.user, problemset_progress_cache=progress_cache)
|
||||
return self.success(data)
|
||||
|
||||
|
||||
@@ -257,12 +228,7 @@ class SubmissionExistsAPI(AsyncAPIView):
|
||||
async def get(self, request):
|
||||
if not request.GET.get("problem_id"):
|
||||
return self.error("Parameter error, problem_id is required")
|
||||
exists = (
|
||||
request.user.is_authenticated
|
||||
and await Submission.objects.filter(
|
||||
problem_id=request.GET["problem_id"], user_id=request.user.id
|
||||
).aexists()
|
||||
)
|
||||
exists = request.user.is_authenticated and await Submission.objects.filter(problem_id=request.GET["problem_id"], user_id=request.user.id).aexists()
|
||||
return self.success(exists)
|
||||
|
||||
|
||||
@@ -271,13 +237,9 @@ class SubmissionsTodayCount(AsyncAPIView):
|
||||
now = timezone.now()
|
||||
start = now.replace(hour=0, minute=0, second=0, microsecond=0)
|
||||
if request.GET.get("language") == "Flowchart":
|
||||
count = await FlowchartSubmission.objects.filter(
|
||||
create_time__gte=start
|
||||
).acount()
|
||||
count = await FlowchartSubmission.objects.filter(create_time__gte=start).acount()
|
||||
else:
|
||||
count = await Submission.objects.filter(
|
||||
contest_id__isnull=True, create_time__gte=start
|
||||
).acount()
|
||||
count = await Submission.objects.filter(contest_id__isnull=True, create_time__gte=start).acount()
|
||||
return self.success(count)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user