2929
3030def project_detail_query_set (
3131 * ,
32- team_member_uuids : Optional [list [UUID ]] = None ,
33- label_uuids : Optional [list [UUID ]] = None ,
34- unassigned_tasks : Optional [bool ] = None ,
35- unlabeled_tasks : Optional [bool ] = None ,
32+ filter_by_team_members : Optional [QuerySet [TeamMember ]] = None ,
33+ filter_by_labels : Optional [QuerySet [Label ]] = None ,
34+ # TODO rename to filter_by_unassigned
35+ unassigned_tasks : bool = False ,
36+ # TODO rename to filter_by_unlabeled
37+ unlabeled_tasks : bool = False ,
3638 task_search_query : Optional [str ] = None ,
3739 who : Optional [User ] = None ,
3840) -> QuerySet [Project ]:
@@ -46,39 +48,51 @@ def project_detail_query_set(
4648 task_count = Count ("tasklabel" , filter = project_not_archived ),
4749 )
4850 )
51+
4952 task_q = Q ()
50- assignee_uuid = Q (assignee__uuid__in = team_member_uuids )
53+
54+ # Annotate team members in side nav with whether they're filtered or not
55+ assignee_contained = Q (assignee__in = filter_by_team_members )
5156 assignee_empty = Q (assignee__isnull = True )
52- match team_member_uuids , unassigned_tasks :
53- case None , None | False :
57+ team_member_is_filtered : Union [Value , Exists ] = Value (False )
58+ match filter_by_team_members , unassigned_tasks :
59+ case None , False :
5460 pass
5561 case None , True :
5662 task_q = task_q & assignee_empty
57- case uuids , None | False :
58- task_q = task_q & assignee_uuid
59- team_member_qs = team_member_qs . annotate (
60- is_filtered = Q ( uuid__in = uuids )
63+ case QuerySet (), False :
64+ task_q = task_q & assignee_contained
65+ team_member_is_filtered = Exists (
66+ filter_by_team_members . filter ( pk = OuterRef ( "pk" ) )
6167 )
62- case uuids , True :
63- task_q = task_q & (assignee_uuid & assignee_empty )
64- team_member_qs = team_member_qs . annotate (
65- is_filtered = Q ( uuid__in = uuids )
68+ case QuerySet () , True :
69+ task_q = task_q & (assignee_contained | assignee_empty )
70+ team_member_is_filtered = Exists (
71+ filter_by_team_members . filter ( pk = OuterRef ( "pk" ) )
6672 )
73+ team_member_qs = team_member_qs .annotate (
74+ is_filtered = team_member_is_filtered
75+ )
6776
68- labels_uuid = Q (labels__uuid__in = label_uuids )
77+ # Annotate labels shown in side nav with whether they're filtered or not
78+ label_contained = Q (labels__in = filter_by_labels )
6979 labels_empty = Q (labels__isnull = True )
70- label_is_filtered : Union [Value , Q ] = Value (False )
71- match label_uuids , unlabeled_tasks :
72- case None , None | False :
80+ label_is_filtered : Union [Value , Exists ] = Value (False )
81+ match filter_by_labels , unlabeled_tasks :
82+ case None , False :
7383 pass
7484 case None , True :
7585 task_q = task_q & labels_empty
76- case uuids , None | False :
77- task_q = task_q & labels_uuid
78- label_is_filtered = Q (uuid__in = uuids )
79- case uuids , True :
80- task_q = task_q & (labels_uuid | labels_empty )
81- label_is_filtered = Q (uuid__in = uuids )
86+ case QuerySet (), False :
87+ task_q = task_q & label_contained
88+ label_is_filtered = Exists (
89+ filter_by_labels .filter (pk = OuterRef ("pk" ))
90+ )
91+ case QuerySet (), True :
92+ task_q = task_q & (label_contained | labels_empty )
93+ label_is_filtered = Exists (
94+ filter_by_labels .filter (pk = OuterRef ("pk" ))
95+ )
8296 label_qs = label_qs .annotate (is_filtered = label_is_filtered )
8397
8498 if task_search_query is not None :
0 commit comments