比赛
All checks were successful
Deploy to Server / deploy (push) Successful in 28s

This commit is contained in:
jeremygan2021
2026-03-10 14:25:04 +08:00
parent 03297f3d07
commit 6361b7a522
12 changed files with 414 additions and 108 deletions

View File

@@ -112,30 +112,39 @@ class ProjectViewSet(viewsets.ModelViewSet):
if contestant_id:
queryset = queryset.filter(contestant_id=contestant_id)
# 如果是普通用户,只能看到已提交的项目,或者自己草稿的项目
user = get_current_wechat_user(self.request)
# 1. 基础条件:公开可见且已提交的项目
q = Q(competition__project_visibility='public', status='submitted')
if user:
# 查找用户在这个比赛中的角色
# 如果是评委,可以看到所有项目(包括草稿吗?通常评委只看提交的)
# 这里简化评委看所有submitted用户看所有submitted + 自己的draft
# 找到用户参与的所有比赛角色
enrollments = CompetitionEnrollment.objects.filter(user=user)
judge_competitions = enrollments.filter(role='judge').values_list('competition_id', flat=True)
# 基本查询:所有已提交的项目
q = Q(status='submitted')
# 加上自己创建的项目 (即使是draft)
# 2. 用户自己的项目(始终可见,包括草稿)
q |= Q(contestant__user=user)
# 加上自己是评委的比赛的所有项目 (通常评委只看submitted但如果需要预审可以看draft这里假设只看submitted)
# q |= Q(competition__in=judge_competitions)
# 3. 基于角色的可见性
# 获取用户已通过审核的报名信息
enrollments = CompetitionEnrollment.objects.filter(user=user, status='approved')
queryset = queryset.filter(q)
else:
# 未登录用户只能看已提交
queryset = queryset.filter(status='submitted')
# 获取各角色的比赛ID集合
judge_comp_ids = set(enrollments.filter(role='judge').values_list('competition_id', flat=True))
guest_comp_ids = set(enrollments.filter(role='guest').values_list('competition_id', flat=True))
contestant_comp_ids = set(enrollments.filter(role='contestant').values_list('competition_id', flat=True))
# 'judge' 可见性:仅评委可见
if judge_comp_ids:
q |= Q(competition__project_visibility='judge', competition__in=judge_comp_ids, status='submitted')
# 'guest' 可见性:嘉宾及评委可见
guest_access_ids = judge_comp_ids | guest_comp_ids
if guest_access_ids:
q |= Q(competition__project_visibility='guest', competition__in=guest_access_ids, status='submitted')
# 'contestant' 可见性:选手及以上可见(包括评委、嘉宾)
contestant_access_ids = judge_comp_ids | guest_comp_ids | contestant_comp_ids
if contestant_access_ids:
q |= Q(competition__project_visibility='contestant', competition__in=contestant_access_ids, status='submitted')
queryset = queryset.filter(q)
return queryset.order_by('-final_score', '-created_at')