Package omero :: Package plugins :: Module group
[hide private]
[frames] | no frames]

Source Code for Module omero.plugins.group

  1  #!/usr/bin/env python 
  2  """ 
  3     Group administration plugin 
  4   
  5     Copyright 2009 Glencoe Software, Inc. All rights reserved. 
  6     Use is subject to license terms supplied in LICENSE.txt 
  7   
  8  """ 
  9   
 10  import os 
 11  import sys 
 12   
 13  from omero.cli import BaseControl, CLI, ExceptionHandler 
 14   
 15  HELP="""Group administration methods""" 
 16   
17 -class GroupControl(BaseControl):
18
19 - def _configure(self, parser):
20 21 self.exc = ExceptionHandler() 22 23 sub = parser.sub() 24 add = parser.add(sub, self.add, "Add a new group with given permissions") 25 add.add_argument("--ignore-existing", action="store_true", default=False, help="Do not fail if user already exists") 26 add.add_argument("name", help="ExperimenterGroup.name value") 27 28 perms = parser.add(sub, self.perms, "Modify a group's permissions") 29 perms.add_argument("id_or_name", help="ExperimenterGroup's id or name") 30 31 for x in (add, perms): 32 group = x.add_mutually_exclusive_group() 33 group.add_argument("--perms", help="Group permissions set as string, e.g. 'rw----' ") 34 group.add_argument("--type", help="Group permission set symbollically", 35 choices=("private", "read-only", "collaborative")) 36 37 list = parser.add(sub, self.list, "List current groups") 38 list.add_argument("--long", action="store_true", help = "Print comma-separated list of all groups, not just counts") 39 40 copy = parser.add(sub, self.copy, "Copy the members of one group to another group") 41 copy.add_argument("from_group", type=long, help = "Source group ID whose members will be copied") 42 copy.add_argument("to_group", type=long, help = "Target group ID which will have new members added") 43 44 insert = parser.add(sub, self.insert, "Insert one or more users into a group") 45 insert.add_argument("GROUP", metavar="group", type=long, help = "ID of the group which is to have users added") 46 insert.add_argument("user", type=long, nargs="+", help = "ID of user to be inserted")
47
48 - def parse_perms(self, args):
49 perms = getattr(args, "perms", None) 50 if not perms: 51 if args.type == "private": 52 perms = "rw----" 53 elif args.type == "read-only": 54 perms = "rwr---" 55 elif args.type == "collaborative": 56 perms = "rwrw--" 57 if not perms: 58 perms = "rw----" 59 return perms
60
61 - def add(self, args):
62 63 import omero, Ice 64 from omero.rtypes import rstring 65 from omero_model_PermissionsI import PermissionsI as Perms 66 from omero_model_ExperimenterGroupI import ExperimenterGroupI as Grp 67 68 perms = self.parse_perms(args) 69 c = self.ctx.conn(args) 70 p = c.ic.getProperties() 71 g = Grp() 72 g.name = rstring(args.name) 73 g.details.permissions = Perms(perms) 74 admin = c.getSession().getAdminService() 75 try: 76 grp = admin.lookupGroup(args.name) 77 if grp: 78 if args.ignore_existing: 79 self.ctx.out("Group exists: %s (id=%s)" % (args.name, grp.id.val)) 80 return 81 else: 82 self.ctx.die(3, "Group exists: %s (id=%s)" % (args.name, grp.id.val)) 83 except omero.ApiUsageException, aue: 84 pass # Apparently no such group exists 85 86 try: 87 id = admin.createGroup(g) 88 self.ctx.out("Added group %s (id=%s) with permissions %s" % (id, args.name, perms)) 89 except omero.ValidationException, ve: 90 # Possible, though unlikely after previous check 91 if self.exc.is_constraint_violation(ve): 92 self.ctx.die(66, "Group already exists: %s" % args.name) 93 else: 94 self.ctx.die(67, "Unknown ValidationException: %s" % ve.message) 95 except omero.SecurityViolation, se: 96 self.ctx.die(68, "Security violation: %s" % se.message) 97 except omero.ServerError, se: 98 self.ctx.die(4, "%s: %s" % (type(se), se.message))
99 100
101 - def perms(self, args):
102 103 import omero 104 from omero_model_ExperimenterGroupI import ExperimenterGroupI as Grp 105 from omero_model_PermissionsI import PermissionsI as Perms 106 107 perms = self.parse_perms(args) 108 c = self.ctx.conn(args) 109 a = c.sf.getAdminService() 110 111 try: 112 try: 113 gid = long(args.id_or_name) 114 g = a.getGroup(gid) 115 except ValueError: 116 g = a.lookupGroup(args.id_or_name) 117 gid = g.id.val 118 except omero.ApiUsageException: 119 self.ctx.die(503, "Unknown group: %s" % gid) 120 121 122 old_perms = str(g.details.permissions) 123 if old_perms == perms: 124 self.ctx.out("Permissions for group %s (id=%s) already %s" % (g.name.val, gid, perms)) 125 else: 126 try: 127 a.changePermissions(Grp(gid, False), Perms(perms)) 128 self.ctx.out("Changed permissions for group %s (id=%s) to %s" % (g.name.val, gid, perms)) 129 except omero.GroupSecurityViolation: 130 import traceback 131 self.ctx.dbg(traceback.format_exc()) 132 self.ctx.die(504, "Cannot change permissions for group %s (id=%s) to %s" % (g.name.val, gid, perms))
133 134
135 - def list(self, args):
136 c = self.ctx.conn(args) 137 groups = c.sf.getAdminService().lookupGroups() 138 from omero.util.text import TableBuilder 139 if args.long: 140 tb = TableBuilder("id", "name", "perms", "owner ids", "member ids") 141 else: 142 tb = TableBuilder("id", "name", "perms", "# of owners", "# of members") 143 for group in groups: 144 row = [group.id.val, group.name.val, str(group.details.permissions)] 145 if args.long: 146 row.append(",".join(sorted([str(x.child.id.val) for x in group.copyGroupExperimenterMap() if x.owner.val]))) 147 row.append(",".join(sorted([str(x.child.id.val) for x in group.copyGroupExperimenterMap() if not x.owner.val]))) 148 else: 149 row.append(len([x for x in group.copyGroupExperimenterMap() if x.owner.val])) 150 row.append(len([x for x in group.copyGroupExperimenterMap() if not x.owner.val])) 151 tb.row(*tuple(row)) 152 self.ctx.out(str(tb.build()))
153
154 - def copy(self, args):
155 import omero 156 c = self.ctx.conn(args) 157 a = c.sf.getAdminService() 158 f_grp = a.getGroup(args.from_group) 159 t_grp = a.getGroup(args.to_group) 160 161 to_add = [(x.child.id.val, x.child.omeName.val) for x in f_grp.copyGroupExperimenterMap()] 162 already = [x.child.id.val for x in t_grp.copyGroupExperimenterMap()] 163 for add in list(to_add): 164 if add[0] in already: 165 self.ctx.out("%s already in group %s" % (add[1], args.to_group)) 166 to_add.remove(add) 167 self.addusersbyid(c, t_grp, [x[0] for x in to_add]) 168 self.ctx.out("%s coped to %s" % (args.from_group, args.to_group))
169
170 - def insert(self, args):
171 import omero 172 c = self.ctx.conn(args) 173 a = c.sf.getAdminService() 174 grp = a.getGroup(args.GROUP) 175 self.addusersbyid(c, grp, args.user) 176 self.ctx.out("Added %s users to %s" % (len(args.user), args.GROUP))
177
178 - def addusersbyid(self, c, group, users):
179 import omero 180 a = c.sf.getAdminService() 181 for add in list(users): 182 a.addGroups(omero.model.ExperimenterI(add, False), [group]) 183 self.ctx.out("Added %s" % add)
184 185 try: 186 register("group", GroupControl, HELP) 187 except NameError: 188 if __name__ == "__main__": 189 cli = CLI() 190 cli.register("group", GroupControl, HELP) 191 cli.invoke(sys.argv[1:]) 192