This commit is contained in:
@@ -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')
|
||||
|
||||
|
||||
Reference in New Issue
Block a user