统计数据添加没完成的人

This commit is contained in:
2024-10-16 18:27:07 +08:00
parent 1179428e20
commit 78a247acd5

View File

@@ -50,11 +50,13 @@ class SubmissionStatisticsAPI(APIView):
# 统计人数 # 统计人数
person_count = 0 person_count = 0
all_persions = []
if username: if username:
submissions = submissions.filter(username__icontains=username) submissions = submissions.filter(username__icontains=username)
person_count = User.objects.filter(username__icontains=username, all_persions = User.objects.filter(username__icontains=username,
is_disabled=False, is_disabled=False,
admin_type=AdminType.REGULAR_USER).count() admin_type=AdminType.REGULAR_USER).values_list("username", flat=True)
person_count = all_persions.count()
submission_count = submissions.count() submission_count = submissions.count()
accepted_count = submissions.filter(result=JudgeStatus.ACCEPTED).count() accepted_count = submissions.filter(result=JudgeStatus.ACCEPTED).count()
@@ -68,23 +70,25 @@ class SubmissionStatisticsAPI(APIView):
accepted_count=Count("id", filter=Q(result=JudgeStatus.ACCEPTED), distinct=True), accepted_count=Count("id", filter=Q(result=JudgeStatus.ACCEPTED), distinct=True),
).order_by("-submission_count") ).order_by("-submission_count")
data = [] accepted = []
for item in counts: for item in counts:
if item["accepted_count"] > 0: if item["accepted_count"] > 0:
rate = round(item["accepted_count"]/item["submission_count"]*100, 2) rate = round(item["accepted_count"]/item["submission_count"]*100, 2)
item["correct_rate"] = f"{rate}%" item["correct_rate"] = f"{rate}%"
data.append(item) accepted.append(item)
unaccepted = list(set(all_persions) - set([item['username'] for item in accepted]))
# 统计人数完成率 # 统计人数完成率
person_rate = 0 person_rate = 0
if person_count: if person_count:
person_rate = round(len(data)/person_count*100, 2) person_rate = round(len(accepted)/person_count*100, 2)
# 下面是做一些超出 100% 的操作,比如有人已经删号了,但是提交记录还在 # 下面是做一些超出 100% 的操作,比如有人已经删号了,但是提交记录还在
if person_rate >= 100: if person_rate >= 100:
person_rate = 100 person_rate = 100
# 搜出来的人数比提交人数还多的情况 # 搜出来的人数比提交人数还多的情况
if person_count < len(data): if person_count < len(accepted):
person_count = len(data) person_count = len(accepted)
return self.success({ return self.success({
"submission_count": submission_count, "submission_count": submission_count,
@@ -92,6 +96,7 @@ class SubmissionStatisticsAPI(APIView):
"correct_rate": f"{correct_rate}%", "correct_rate": f"{correct_rate}%",
"person_count": person_count, "person_count": person_count,
"person_rate": f"{person_rate}%", "person_rate": f"{person_rate}%",
"data": data, "data": accepted,
"data_unaccepted": unaccepted
}) })