Package omero :: Package gateway :: Package scripts :: Module dbhelpers
[hide private]
[frames] | no frames]

Source Code for Module omero.gateway.scripts.dbhelpers

  1  import sys 
  2  sys.path.append('.') 
  3   
  4  import omero 
  5  from omero.rtypes import * 
  6  import os 
  7  import subprocess 
  8  import re 
  9  import time 
 10   
 11  BASEPATH = os.path.dirname(os.path.abspath(__file__)) 
 12   
 13  Gateway = omero.gateway.BlitzGateway 
14 15 -def loginAsRoot ():
16 return login(ROOT)
17
18 -def login (alias):
19 if isinstance(alias, UserEntry): 20 return alias.login() 21 return USERS[alias].login()
22
23 #def addGroupToUser (client, groupname): 24 # a = client.getAdminService() 25 # if not 'system' in [x.name.val for x in a.containedGroups(client._userid)]: 26 # admin = loginAsRoot() 27 # a = admin.getAdminService() 28 # else: 29 # admin = client 30 # try: 31 # g = a.lookupGroup(groupname) 32 # except: 33 # g = omero.model.ExperimenterGroupI() 34 # g.setName(rstring(groupname)) 35 # a.createGroup(g) 36 # g = a.lookupGroup(groupname) 37 # a.addGroups(a.getExperimenter(client._userid), (g,)) 38 39 #def setGroupForSession (client, groupname): 40 # ssuid = client._sessionUuid 41 # ss = client.getSessionService() 42 # sess = ss.getSession(ssuid) 43 # if sess.getDetails().getGroup().getName().val == groupname: 44 # # Already correct 45 # return 46 # a = client.getAdminService() 47 # if not groupname in [x.name.val for x in a.containedGroups(client._userid)]: 48 # UserEntry.addGroupToUser(client, groupname) 49 # g = a.lookupGroup(groupname) 50 # sess.getDetails().setGroup(g) 51 # ss.updateSession(sess) 52 53 -class UserEntry (object):
54 - def __init__ (self, name, passwd, firstname='', lastname='', groupname=None, admin=False):
55 self.name = name 56 self.passwd = passwd 57 self.firstname = firstname 58 self.lastname = lastname 59 self.admin = admin 60 self.groupname = groupname
61
62 - def fullname (self):
63 return '%s %s' % (self.firstname, self.lastname)
64
65 - def login (self):
66 client = Gateway(self.name, self.passwd, group=self.admin and 'system' or None) 67 if not client.connect(): 68 print "Can not connect" 69 return None 70 return client
71
72 - def create (self, client):
73 a = client.getAdminService() 74 try: 75 a.lookupExperimenter(self.name) 76 #print "Already exists: %s" % self.name 77 return False 78 except: 79 #print "Creating: %s" % self.name 80 pass 81 if self.groupname is None: 82 self.groupname = self.name + '_group' 83 try: 84 g = a.lookupGroup(self.groupname) 85 except: 86 g = omero.model.ExperimenterGroupI() 87 g.setName(rstring(self.groupname)) 88 a.createGroup(g) 89 g = a.lookupGroup(self.groupname) 90 u = omero.model.ExperimenterI() 91 u.setOmeName(rstring(self.name)) 92 u.setFirstName(rstring(self.firstname)) 93 u.setLastName(rstring(self.lastname)) 94 a.createUser(u, g.getName().val) 95 if self.admin: 96 u =a.lookupExperimenter(self.name) 97 a.addGroups(u,(a.lookupGroup("system"),)) 98 a.changeUserPassword(u.getOmeName().val, rstring(self.passwd)) 99 return True
100 101 @staticmethod
102 - def addGroupToUser (client, groupname):
103 a = client.getAdminService() 104 if not 'system' in [x.name.val for x in a.containedGroups(client._userid)]: 105 admin = loginAsRoot() 106 a = admin.getAdminService() 107 else: 108 admin = client 109 try: 110 g = a.lookupGroup(groupname) 111 except: 112 g = omero.model.ExperimenterGroupI() 113 g.setName(rstring(groupname)) 114 a.createGroup(g) 115 g = a.lookupGroup(groupname) 116 a.addGroups(a.getExperimenter(client._userid), (g,))
117 118 @staticmethod
119 - def setGroupForSession (client, groupname):
120 sess = client._session 121 if sess.getDetails().getGroup().getName().val == groupname: 122 # Already correct 123 return 124 a = client.getAdminService() 125 if not groupname in [x.name.val for x in a.containedGroups(client._userid)]: 126 UserEntry.addGroupToUser(client, groupname) 127 g = a.lookupGroup(groupname) 128 sess.getDetails().setGroup(g) 129 client.getSessionService().updateSession(sess)
130
131 132 -class ObjectEntry (object):
133 @staticmethod
134 - def chGroup (client, obj, groupname):
135 a = client.getAdminService() 136 if not 'system' in [x.name.val for x in a.containedGroups(client._userid)]: 137 admin = loginAsRoot() 138 a = admin.getAdminService() 139 else: 140 admin = client 141 try: 142 g = a.lookupGroup(groupname) 143 except: 144 g = omero.model.ExperimenterGroupI() 145 g.setName(rstring(groupname)) 146 a.createGroup(g) 147 g = a.lookupGroup(groupname) 148 ao = admin.getQueryService().find(obj.OMERO_CLASS, obj.getId()) 149 ao.getDetails().setGroup(g) 150 admin.getUpdateService().saveObject(ao)
151
152 153 -class ProjectEntry (ObjectEntry):
154 - def __init__ (self, name, owner, create_group=False):
155 self.name = name 156 self.owner = owner 157 self.create_group = create_group
158
159 - def get (self, client, fromCreate=False):
160 for p in client.listProjects(): 161 if p.getName() == self.name: 162 p.__loadedHotSwap__() 163 return p 164 return None
165
166 - def create (self):
167 client = USERS[self.owner].login() 168 p = self.get(client) 169 if p is not None: 170 #print ".. -> project already exists: %s" % self.name 171 return p 172 #print ".. -> create new project: %s" % self.name 173 p = omero.model.ProjectI(loaded=True) 174 p.setName(rstring(self.name)) 175 p.setDescription(rstring(self.name)) 176 p = omero.gateway.ProjectWrapper(client, client.getUpdateService().saveAndReturnObject(p)) 177 if self.create_group: 178 #print "creating group" 179 groupname = 'project_%d' % p.getId() 180 UserEntry.addGroupToUser (client, groupname) 181 self.chGroup(client, p, groupname) 182 return self.get(client, True)
183
184 -class DatasetEntry (ObjectEntry):
185 - def __init__ (self, name, project):
186 self.name = name 187 self.project = project
188
189 - def get (self, client, forceproj=None):
190 if forceproj is None: 191 project = PROJECTS[self.project].get(client) 192 else: 193 project = forceproj 194 for d in project.listChildren(): 195 if d.getName() == self.name: 196 d.__loadedHotSwap__() 197 return d 198 return None
199
200 - def create (self):
201 project = PROJECTS[self.project] 202 user = USERS[project.owner] 203 client = user.login() 204 project = project.get(client) 205 d = self.get(client, project) 206 if d is not None: 207 #print ".. -> dataset already exists: %s" % self.name 208 return d 209 #print ".. -> create new dataset: %s" % self.name 210 UserEntry.setGroupForSession(client, project.getDetails().getGroup().getName()) 211 d = omero.model.DatasetI(loaded=True) 212 d.setName(rstring(self.name)) 213 d.setDescription(rstring(self.name)) 214 project.linkDataset(d) 215 project.save() 216 return self.get(client, project)
217
218 -class ImageEntry (ObjectEntry):
219 - def __init__ (self, name, filename, dataset):
220 self.name = name 221 self.filename = filename # If False will create image without pixels 222 self.dataset = dataset
223
224 - def get (self, client, forceds=None):
225 if forceds is None: 226 dataset = DATASETS[self.dataset].get(client) 227 else: 228 dataset = forceds 229 for i in dataset.listChildren(): 230 if i.getName() == self.name: 231 return i 232 return None
233
234 - def create (self):
235 dataset = DATASETS[self.dataset] 236 project = PROJECTS[dataset.project] 237 client = USERS[project.owner].login() 238 dataset = dataset.get(client) 239 i = self.get(client, dataset) 240 if i is not None: 241 #print ".. -> image already exists: %s" % self.name 242 return i 243 #print ".. -> create new image: %s" % self.name 244 if self.filename is False: 245 UserEntry.setGroupForSession(client, dataset.getDetails().getGroup().getName()) 246 self._createWithoutPixels(client, dataset) 247 return self.get(client, dataset) 248 fpath = os.path.join(BASEPATH, self.filename) 249 if not os.path.exists(fpath): 250 raise IOError('No such file %s' % fpath) 251 host = dataset._conn.c.ic.getProperties().getProperty('omero.host') or 'localhost' 252 port = dataset._conn.c.ic.getProperties().getProperty('omero.port') or '4063' 253 if os.path.exists('../bin/omero'): 254 exe = '../bin/omero' 255 else: 256 exe = 'omero' 257 newconn = dataset._conn.clone() 258 newconn.connect() 259 UserEntry.setGroupForSession(newconn, dataset.getDetails().getGroup().getName()) 260 session = newconn._sessionUuid 261 #print session 262 exe += ' import -s %s -k %s -d %i -p %s -n %s %s' % (host, session, dataset.getId(), port, self.name, fpath) 263 #print exe 264 try: 265 p = subprocess.Popen(exe.split(), shell=False, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 266 except OSError: 267 print "!!Please make sure the 'omero' executable is in PATH" 268 return None 269 pid = re.search('Saving pixels id: (\d*)', p.communicate()[0]).group(1) 270 img = omero.gateway.ImageWrapper(dataset._conn, dataset._conn.getQueryService().find('Pixels', long(pid)).image) 271 #print "imgid = %i" % img.getId() 272 img.setName(self.name) 273 img.save() 274 return img
275
276 - def _createWithoutPixels (self, client, dataset):
277 img = omero.model.ImageI() 278 img.setName(rstring(self.name)) 279 img.setAcquisitionDate(rtime(0)) 280 if not dataset.imageLinksLoaded: 281 print ".!." 282 dataset._obj._imageLinksSeq = [] 283 dataset._obj._imageLinksLoaded = True; 284 dataset.linkImage(img) 285 dataset.save()
286
287 -def getProject (client, alias):
288 return PROJECTS[alias].get(client)
289
290 -def assertCommentAnnotation (object, ns, value):
291 ann = object.getAnnotation(ns) 292 if ann is None or ann.getValue() != value: 293 ann = CommentAnnotationWrapper() 294 ann.setNs(ns) 295 ann.setValue(value) 296 object.linkAnnotation(ann) 297 return ann
298
299 -def getDataset (client, alias, forceproj=None):
300 return DATASETS[alias].get(client, forceproj)
301
302 -def getImage (client, alias, forceds=None):
303 return IMAGES[alias].get(client, forceds)
304
305 -def bootstrap ():
306 # Create users 307 client = loginAsRoot() 308 for k, u in USERS.items(): 309 u.create(client) 310 for k, p in PROJECTS.items(): 311 p.create() 312 #print p.get(client).getDetails().getPermissions().isUserWrite() 313 for k, d in DATASETS.items(): 314 d.create() 315 for k, i in IMAGES.items(): 316 i.create()
317
318 -def cleanup ():
319 client = loginAsRoot() 320 for k, p in PROJECTS.items(): 321 p = p.get(client) 322 if p is not None: 323 update = client.getUpdateService() 324 delete = client.getDeleteService() 325 for d in p.listChildren(): 326 delete.deleteImagesByDataset(d.getId(), True) 327 update.deleteObject(d._obj) 328 #print ".. -> removing project %s" % p.getName() 329 update.deleteObject(p._obj)
330 # What about users? 331 332 333 ROOT=UserEntry('root','ome',admin=True) 334 335 USERS = { 336 #'alias': UserEntry entry, 337 } 338 339 PROJECTS = { 340 #'alias': ProjectEntry entry, 341 } 342 343 DATASETS = { 344 #'alias': DatasetEntry entry, 345 } 346 347 IMAGES = { 348 #'alias': ImageEntry entry, 349 } 350