@@ -137,12 +137,27 @@ def _update_group_combo(self):
137137 with signals_blocked (self .group_combo ):
138138 self .group_combo .clear ()
139139 self .group_combo .addItem ("All" , None )
140- for group in self .gateway . conn . getGroupsMemberOf ():
140+ for group in self ._list_groups ():
141141 self .group_combo .addItem (group .getName (), group .getId ())
142142 if self ._group_wrapper is not None :
143143 self .group_combo .setCurrentText (self ._group_wrapper .getName ())
144144 self ._on_group_changed ()
145145
146+ def _list_groups (self ):
147+ """Return the selectable groups for the current user.
148+
149+ Admins can read every group, so list them all (minus the internal
150+ "user"/"guest" system groups). Regular users only see the groups they
151+ are a member of.
152+ """
153+ conn = self .gateway .conn
154+ if conn .isAdmin ():
155+ roles = conn .getAdminService ().getSecurityRoles ()
156+ hidden = {roles .userGroupId , roles .guestGroupId }
157+ groups = [g for g in conn .listGroups () if g .getId () not in hidden ]
158+ return sorted (groups , key = lambda g : g .getName ().lower ())
159+ return list (conn .getGroupsMemberOf ())
160+
146161 def _update_user_combo (self ):
147162 # List the group owners and other members
148163 current_user = self .user_combo .currentText ()
@@ -167,12 +182,16 @@ def _update_user_combo(self):
167182
168183 def _on_group_changed (self ):
169184 group_id = self .group_combo .currentData ()
170- if group_id is None :
171- group_id = - 1
172185 conn = self .gateway .conn
173- conn .SERVICE_OPTS .setOmeroGroup (group_id )
174- group = conn .getAdminService ().getGroup (group_id )
175- self ._group_wrapper = ExperimenterGroupWrapper (conn , group )
186+ if group_id is None :
187+ # "All" selected: -1 is the cross-group sentinel for SERVICE_OPTS
188+ # but is not a real group id, so don't try to fetch it (see #86).
189+ conn .SERVICE_OPTS .setOmeroGroup (- 1 )
190+ self ._group_wrapper = None
191+ else :
192+ conn .SERVICE_OPTS .setOmeroGroup (group_id )
193+ group = conn .getAdminService ().getGroup (group_id )
194+ self ._group_wrapper = ExperimenterGroupWrapper (conn , group )
176195 self ._update_user_combo ()
177196
178197 def _on_user_changed (self ):
0 commit comments