Skip to content

Commit dff67fb

Browse files
Improve group handling when admin (#141)
Co-authored-by: Johannes Soltwedel <38459088+jo-mueller@users.noreply.github.com>
1 parent e58eb4c commit dff67fb

1 file changed

Lines changed: 25 additions & 6 deletions

File tree

src/napari_omero/widgets/main.py

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)