11import  datetime 
22
3+ from  django .db .models  import  Exists 
4+ from  django .db .models  import  OuterRef 
5+ from  django .db .models  import  Q 
36from  django .http  import  Http404 
47from  django .utils .timezone  import  now 
58from  django_filters .rest_framework  import  DjangoFilterBackend 
1114from  kolibri .core .auth .api  import  KolibriAuthPermissions 
1215from  kolibri .core .auth .api  import  KolibriAuthPermissionsFilter 
1316from  kolibri .core .auth .constants .collection_kinds  import  ADHOCLEARNERSGROUP 
17+ from  kolibri .core .auth .models  import  FacilityUser 
1418from  kolibri .core .content .models  import  ContentNode 
1519from  kolibri .core .content .utils .annotation  import  total_file_size 
1620from  kolibri .core .exams  import  models 
@@ -103,6 +107,14 @@ def annotate_queryset(self, queryset):
103107
104108    def  serialize_draft (self , queryset ):
105109        objects  =  queryset .values (* self .draft_values )
110+ 
111+         all_exam_learners_set  =  {
112+             learner_id  for  obj  in  objects  for  learner_id  in  obj .get ("learner_ids" , [])
113+         }
114+         non_deleted_learners  =  FacilityUser .objects .filter (
115+             id__in = all_exam_learners_set 
116+         ).values_list ("id" , flat = True )
117+ 
106118        for  item  in  objects :
107119            # Set the draft flag to True 
108120            item ["draft" ] =  True 
@@ -111,6 +123,12 @@ def serialize_draft(self, queryset):
111123            item ["archive" ] =  False 
112124            item ["date_archived" ] =  None 
113125            item ["date_activated" ] =  None 
126+             # Filter out any deleted learners 
127+             item ["learner_ids" ] =  [
128+                 learner_id 
129+                 for  learner_id  in  item .get ("learner_ids" , [])
130+                 if  learner_id  in  non_deleted_learners 
131+             ]
114132        return  objects 
115133
116134    def  filter_querysets (self , exam_queryset , draft_queryset ):
@@ -230,8 +248,15 @@ def consolidate(self, items, queryset):
230248            adhoc_assignments  =  models .ExamAssignment .objects .filter (
231249                exam_id__in = exam_ids , collection__kind = ADHOCLEARNERSGROUP 
232250            )
251+             non_deleted_users_subquery  =  Exists (
252+                 FacilityUser .objects .filter (
253+                     id = OuterRef ("collection__membership__user_id" )
254+                 )
255+             )
233256            adhoc_assignments  =  annotate_array_aggregate (
234-                 adhoc_assignments , learner_ids = "collection__membership__user_id" 
257+                 adhoc_assignments ,
258+                 filter = Q (non_deleted_users_subquery ),
259+                 learner_ids = "collection__membership__user_id" ,
235260            )
236261            adhoc_assignments  =  {
237262                a ["exam" ]: a 
0 commit comments