@@ -669,24 +669,51 @@ def sitk_image(self):
669669
670670 return sitk_image
671671
672- def update_viewer_groups_permissions ( # noqa: C901
673- self , * , exclude_jobs = None
672+ def update_viewer_groups_permissions (
673+ self ,
674+ * ,
675+ exclude_jobs = None ,
676+ exclude_archive_items = None ,
677+ exclude_display_sets = None ,
674678 ):
675- """
676- Update the permissions for the algorithm jobs viewers groups to
677- view this image.
679+ expected_groups = set ()
678680
679- Parameters
680- ----------
681- exclude_jobs
682- Exclude these results from being considered. This is useful
683- when a many to many relationship is being cleared to remove this
684- image from the results image set, and is used when the pre_clear
685- signal is sent.
686- """
681+ expected_groups .update (
682+ self ._get_expected_job_viewer_groups (exclude_jobs = exclude_jobs )
683+ )
684+
685+ expected_groups .update (
686+ self ._get_expected_archive_item_viewer_groups (
687+ exclude_archive_items = exclude_archive_items
688+ )
689+ )
690+
691+ expected_groups .update (
692+ self ._get_expected_display_set_viewer_groups (
693+ exclude_display_sets = exclude_display_sets
694+ )
695+ )
696+
697+ expected_groups .update (self ._get_expected_reader_study_answer_groups ())
698+
699+ current_groups = get_groups_with_perms (self , attach_perms = True )
700+ current_groups = {
701+ group
702+ for group , perms in current_groups .items ()
703+ if "view_image" in perms
704+ }
705+
706+ groups_missing_perms = expected_groups - current_groups
707+ groups_with_extra_perms = current_groups - expected_groups
708+
709+ for g in groups_missing_perms :
710+ assign_perm ("view_image" , g , self )
711+
712+ for g in groups_with_extra_perms :
713+ remove_perm ("view_image" , g , self )
714+
715+ def _get_expected_job_viewer_groups (self , exclude_jobs ):
687716 from grandchallenge .algorithms .models import Job
688- from grandchallenge .archives .models import Archive
689- from grandchallenge .reader_studies .models import ReaderStudy
690717
691718 expected_groups = set ()
692719
@@ -709,49 +736,89 @@ def update_viewer_groups_permissions( # noqa: C901
709736 logger .error (error , exc_info = True )
710737 raise
711738
712- for archive in Archive .objects .filter (
713- items__values__image = self
714- ).select_related ("editors_group" , "uploaders_group" , "users_group" ):
739+ return expected_groups
740+
741+ def _get_expected_archive_item_viewer_groups (
742+ self , * , exclude_archive_items
743+ ):
744+ from grandchallenge .archives .models import ArchiveItem
745+
746+ expected_groups = set ()
747+
748+ archive_items_queryset = (
749+ ArchiveItem .objects .filter (values__image = self )
750+ .select_related (
751+ "archive__editors_group" ,
752+ "archive__uploaders_group" ,
753+ "archive__users_group" ,
754+ )
755+ .only (
756+ "archive__editors_group" ,
757+ "archive__uploaders_group" ,
758+ "archive__users_group" ,
759+ )
760+ )
761+
762+ if exclude_archive_items is not None :
763+ archive_items_queryset = archive_items_queryset .exclude (
764+ pk__in = {ai .pk for ai in exclude_archive_items }
765+ )
766+
767+ for archive_item in archive_items_queryset :
715768 expected_groups .update (
716769 [
717- archive .editors_group ,
718- archive .uploaders_group ,
719- archive .users_group ,
770+ archive_item . archive .editors_group ,
771+ archive_item . archive .uploaders_group ,
772+ archive_item . archive .users_group ,
720773 ]
721774 )
722775
723- for rs in ReaderStudy .objects .filter (
724- display_sets__values__image = self
725- ).select_related ("editors_group" , "readers_group" ):
776+ return expected_groups
777+
778+ def _get_expected_display_set_viewer_groups (self , * , exclude_display_sets ):
779+ from grandchallenge .reader_studies .models import DisplaySet
780+
781+ expected_groups = set ()
782+
783+ display_set_queryset = (
784+ DisplaySet .objects .filter (values__image = self )
785+ .select_related (
786+ "reader_study__editors_group" ,
787+ "reader_study__readers_group" ,
788+ )
789+ .only (
790+ "reader_study__editors_group" ,
791+ "reader_study__readers_group" ,
792+ )
793+ )
794+
795+ if exclude_display_sets is not None :
796+ display_set_queryset = display_set_queryset .exclude (
797+ pk__in = {ds .pk for ds in exclude_display_sets }
798+ )
799+
800+ for display_set in display_set_queryset :
726801 expected_groups .update (
727802 [
728- rs .editors_group ,
729- rs .readers_group ,
803+ display_set . reader_study .editors_group ,
804+ display_set . reader_study .readers_group ,
730805 ]
731806 )
732807
808+ return expected_groups
809+
810+ def _get_expected_reader_study_answer_groups (self ):
733811 # Reader study editors for reader studies that have answers that
734812 # include this image.
813+
814+ expected_groups = set ()
815+
735816 for answer in self .answer_set .select_related (
736817 "question__reader_study__editors_group"
737818 ).all ():
738819 expected_groups .add (answer .question .reader_study .editors_group )
739820
740- current_groups = get_groups_with_perms (self , attach_perms = True )
741- current_groups = {
742- group
743- for group , perms in current_groups .items ()
744- if "view_image" in perms
745- }
746-
747- groups_missing_perms = expected_groups - current_groups
748- groups_with_extra_perms = current_groups - expected_groups
749-
750- for g in groups_missing_perms :
751- assign_perm ("view_image" , g , self )
752-
753- for g in groups_with_extra_perms :
754- remove_perm ("view_image" , g , self )
821+ return expected_groups
755822
756823 def assign_view_perm_to_creator (self ):
757824 for answer in self .answer_set .all ():
0 commit comments