@@ -114,6 +114,55 @@ def batch(iterable, n=1):
114114 yield iterable [ndx : min (ndx + n , l )]
115115
116116
117+ def auto_update_reviewer_preferred_annotators (project , new_annotator_ids , requesting_user = None ):
118+ """
119+ After an annotator is added (or un-frozen) in a project, newly added annotators
120+ are added to the preferred annotators list of all annotation reviewers if all were selected,
121+ otherwise not preferred for logged in user as well as reviewers
122+ """
123+ project_id_str = str (project .id )
124+ new_ids_set = set (new_annotator_ids )
125+
126+ frozen_user_ids = set (project .frozen_users .values_list ("id" , flat = True ))
127+ all_active_ids = set (
128+ project .annotators .exclude (id__in = frozen_user_ids ).values_list ("id" , flat = True )
129+ )
130+ previous_annotator_ids = all_active_ids - new_ids_set
131+
132+ users_to_update = set (project .annotation_reviewers .all ())
133+ if requesting_user :
134+ users_to_update .add (requesting_user )
135+
136+ for user in users_to_update :
137+ prefs = user .preferred_task_by_json or {}
138+ if not isinstance (prefs , dict ):
139+ prefs = {}
140+ preferred_annotators = prefs .get ("preferred_annotators" , {})
141+ if not isinstance (preferred_annotators , dict ):
142+ preferred_annotators = {}
143+
144+ saved_ids = set (int (x ) for x in preferred_annotators .get (project_id_str , []))
145+ previous_ids_int = set (int (x ) for x in previous_annotator_ids )
146+
147+ if len (saved_ids ) == 0 :
148+ continue
149+
150+ saved_ids_clean = saved_ids - set (int (x ) for x in new_ids_set )
151+ saved_active_ids = saved_ids_clean .intersection (previous_ids_int )
152+ was_all_selected = (saved_active_ids == previous_ids_int )
153+
154+ if was_all_selected :
155+ final_saved_ids = saved_ids_clean | set (int (x ) for x in new_ids_set )
156+ else :
157+ final_saved_ids = saved_ids_clean
158+
159+ if final_saved_ids != saved_ids :
160+ preferred_annotators [project_id_str ] = list (final_saved_ids )
161+ prefs ["preferred_annotators" ] = preferred_annotators
162+ user .preferred_task_by_json = prefs
163+ user .save (update_fields = ["preferred_task_by_json" ])
164+
165+
117166def get_review_reports (proj_id , userid , start_date , end_date ):
118167 user = User .objects .get (id = userid )
119168 userName = user .username
@@ -1549,6 +1598,8 @@ def remove_frozen_user(self, request, pk=None):
15491598 user = User .objects .get (pk = user_id )
15501599 project .frozen_users .remove (user )
15511600 project .save ()
1601+ auto_update_reviewer_preferred_annotators (project , [user .id ], requesting_user = request .user )
1602+
15521603 return Response (
15531604 {"message" : "Frozen User removed from the project" },
15541605 status = status .HTTP_200_OK ,
@@ -3848,6 +3899,8 @@ def add_project_annotators(self, request, pk=None, *args, **kwargs):
38483899 project .annotators .add (annotator )
38493900 project .save ()
38503901
3902+ auto_update_reviewer_preferred_annotators (project , [annotator .id ], requesting_user = request .user )
3903+
38513904 # Creating Notification
38523905 title = f"{ project .title } :{ project .id } New annotators have been added to the project"
38533906 notification_type = "add_member"
@@ -3912,6 +3965,30 @@ def add_project_reviewers(self, request, pk, *args, **kwargs):
39123965
39133966 project .annotation_reviewers .add (user )
39143967 project .save ()
3968+ project_id_str = str (project .id )
3969+ frozen_user_ids = set (project .frozen_users .values_list ("id" , flat = True ))
3970+ all_active_annotator_ids = set (
3971+ project .annotators .exclude (id__in = frozen_user_ids ).values_list ("id" , flat = True )
3972+ )
3973+
3974+ users_to_update = {user }
3975+
3976+ for u in users_to_update :
3977+ prefs = u .preferred_task_by_json or {}
3978+ if not isinstance (prefs , dict ):
3979+ prefs = {}
3980+ preferred_annotators = prefs .get ("preferred_annotators" , {})
3981+ if not isinstance (preferred_annotators , dict ):
3982+ preferred_annotators = {}
3983+
3984+ saved_ids = set (int (x ) for x in preferred_annotators .get (project_id_str , []))
3985+ saved_ids .update (all_active_annotator_ids )
3986+
3987+ preferred_annotators [project_id_str ] = list (saved_ids )
3988+ prefs ["preferred_annotators" ] = preferred_annotators
3989+ u .preferred_task_by_json = prefs
3990+ u .save (update_fields = ["preferred_task_by_json" ])
3991+
39153992 # Creating Notification
39163993 title = f"{ project .title } :{ project .id } New reviewers have been added to project"
39173994 notification_type = "add_member"
0 commit comments