1 import sys
2 sys.path.append('.')
3
4 import omero.gateway
5 import omero.model
6 from omero.rtypes import *
7 import os
8 import subprocess
9 import re
10 import time
11 import urllib2
12
13 from types import StringTypes
14 from path import path
15
16 BASEPATH = os.path.dirname(os.path.abspath(__file__))
17 TESTIMG_URL = 'http://users.openmicroscopy.org.uk/~cneves-x/'
18
19 if not omero.gateway.BlitzGateway.ICE_CONFIG:
20 try:
21 import settings
22 omero.gateway.BlitzGateway.ICE_CONFIG = os.path.join(settings.OMERO_HOME, 'etc', 'ice.config')
23 except ImportError:
24 pass
25 except AttributeError:
26 pass
38
42
43 -def login (alias, pw=None):
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81 -class UserEntry (object):
82 - def __init__ (self, name, passwd, firstname='', middlename='', lastname='', email='',
83 groupname=None, groupperms='rw----', admin=False):
84 self.name = name
85 self.passwd = passwd
86 self.firstname = firstname
87 self.middlename = middlename
88 self.lastname = lastname
89 self.email = email
90 self.admin = admin
91 self.groupname = groupname
92 self.groupperms = groupperms
93
94 - def fullname (self):
95 return '%s %s' % (self.firstname, self.lastname)
96
98 client = omero.gateway.BlitzGateway(self.name, self.passwd, group=self.groupname, try_super=self.admin)
99 if not client.connect():
100 print "Can not connect"
101 return None
102 if self.groupname is not None and client.getEventContext().groupName != self.groupname:
103 try:
104 a = client.getAdminService()
105 g = a.lookupGroup(self.groupname)
106 client.setGroupForSession(g.getId().val)
107 except:
108 pass
109 return client
110
111 @staticmethod
112 - def _getOrCreateGroup (client, groupname, groupperms='rw----'):
113 a = client.getAdminService()
114 try:
115 g = a.lookupGroup(groupname)
116 except:
117 g = omero.model.ExperimenterGroupI()
118 g.setName(omero.gateway.omero_type(groupname))
119 p = omero.model.PermissionsI()
120
121 for n, f in enumerate((p.setUserRead, p.setUserWrite,
122 p.setGroupRead, p.setGroupWrite,
123 p.setWorldRead, p.setWorldWrite)):
124 f(groupperms[n] != '-')
125 g.details.setPermissions(p)
126 a.createGroup(g)
127 g = a.lookupGroup(groupname)
128 return g
129
130 - def create (self, client):
131 a = client.getAdminService()
132 try:
133 a.lookupExperimenter(self.name)
134
135 return False
136 except:
137
138 pass
139 if self.groupname is None:
140 self.groupname = self.name + '_group'
141 g = UserEntry._getOrCreateGroup(client, self.groupname, self.groupperms)
142 u = omero.model.ExperimenterI()
143 u.setOmeName(omero.gateway.omero_type(self.name))
144 u.setFirstName(omero.gateway.omero_type(self.firstname))
145 u.setMiddleName(omero.gateway.omero_type(self.middlename))
146 u.setLastName(omero.gateway.omero_type(self.lastname))
147 u.setEmail(omero.gateway.omero_type(self.email))
148 a.createUser(u, g.getName().val)
149 if self.admin:
150 u = a.lookupExperimenter(self.name)
151 a.addGroups(u,(a.lookupGroup("system"),))
152 client.c.sf.setSecurityPassword(ROOT.passwd)
153 a.changeUserPassword(u.getOmeName().val, omero.gateway.omero_type(self.passwd))
154 return True
155
156 - def changePassword (self, client, password):
160
161 @staticmethod
162 - def addGroupToUser (client, groupname, groupperms='rw----'):
163 a = client.getAdminService()
164 if not 'system' in [x.name.val for x in a.containedGroups(client._userid)]:
165 admin = loginAsRoot()
166 a = admin.getAdminService()
167 else:
168 admin = client
169 g = UserEntry._getOrCreateGroup(client, groupname, groupperms)
170 a.addGroups(a.getExperimenter(client._userid), (g,))
171 a.seppuku()
172
173 @staticmethod
174 - def setGroupForSession (client, groupname):
175 a = client.getAdminService()
176 if not groupname in [x.name.val for x in a.containedGroups(client._userid)]:
177 UserEntry.addGroupToUser(client, groupname)
178 g = a.lookupGroup(groupname)
179 client.setGroupForSession(g.getId().val)
180
181
182 -class ObjectEntry (object):
184
185 -class ProjectEntry (ObjectEntry):
186 - def __init__ (self, name, owner, create_group=False, group_perms=False):
187 self.name = name
188 self.owner = owner
189 self.create_group = create_group
190 self.group_perms = group_perms
191
192 - def get (self, client=None, fromCreate=False):
193 if client is None:
194 client = USERS[self.owner].login()
195 for p in client.listProjects():
196 if p.getName() == self.name:
197 p.__loadedHotSwap__()
198 return p
199 return None
200
201 - def create (self, client=None):
202 if client is None:
203 client = USERS[self.owner].login()
204 p = self.get(client)
205 if p is not None:
206 return p
207 p = omero.model.ProjectI(loaded=True)
208 p.setName(omero.gateway.omero_type(self.name))
209 p.setDescription(omero.gateway.omero_type(self.name))
210 if self.create_group:
211 if isinstance(self.create_group, StringTypes):
212 groupname = self.create_group
213 else:
214 raise ValueError('group must be string')
215 groupname = 'project_test'
216 s = loginAsRoot()
217 UserEntry.addGroupToUser (s, groupname)
218 s.seppuku()
219 UserEntry.setGroupForSession(client, groupname)
220 p = omero.gateway.ProjectWrapper(client, client.getUpdateService().saveAndReturnObject(p))
221 return self.get(client, True)
222
223 -class DatasetEntry (ObjectEntry):
224 - def __init__ (self, name, project, description=None, callback=None):
225 self.name = name
226 self.project = project
227 self.description = description
228 self.callback = callback
229
230 - def get (self, client, forceproj=None):
231 if forceproj is None:
232 if isinstance(self.project, StringTypes):
233 project = PROJECTS[self.project].get(client)
234 elif isinstance(self.project, ProjectEntry):
235 project = self.project.get(client)
236 else:
237 project = self.project
238 else:
239 project = forceproj
240 for d in project.listChildren():
241 if d.getName() == self.name and ((self.description is None and d.getDescription() == '') or (self.description is not None and omero.gateway.omero_type(d.getDescription()) == omero.gateway.omero_type(self.description))):
242 d.__loadedHotSwap__()
243 return d
244 return None
245
247 if isinstance(self.project, StringTypes):
248 project = PROJECTS[self.project]
249 user = USERS[project.owner]
250 client = user.login()
251 project = project.get(client)
252 else:
253 project = self.project
254 client = project._conn
255 d = self.get(client, project)
256 if d is not None and ((self.description is None and d.getDescription() == '') or (self.description is not None and omero.gateway.omero_type(d.getDescription()) == omero.gateway.omero_type(self.description))):
257 return d
258 d = omero.model.DatasetI(loaded=True)
259 d.setName(omero.gateway.omero_type(self.name))
260 if self.description is not None:
261 d.setDescription(omero.gateway.omero_type(self.description))
262 project.linkDataset(d)
263 project.save()
264 rv = self.get(client, project)
265 if self.callback:
266 self.callback(rv)
267 return rv
268
269 -class ImageEntry (ObjectEntry):
270 - def __init__ (self, name, filename, dataset, callback=None):
271 self.name = name
272 self.filename = filename
273 if self.name is None and filename:
274 self.name = os.path.basename(filename)
275 self.dataset = dataset
276 self.callback = callback
277
278 - def get (self, client, forceds=None):
279 if forceds is None:
280 dataset = DATASETS[self.dataset].get(client)
281 else:
282 dataset = forceds
283 for i in dataset.listChildren():
284 if i.getName() == self.name:
285 return i
286 return None
287
289 if isinstance(self.dataset, StringTypes):
290 dataset = DATASETS[self.dataset]
291 project = PROJECTS[dataset.project]
292 client = USERS[project.owner].login()
293 dataset = dataset.get(client)
294 else:
295 dataset = self.dataset
296 client = dataset._conn
297 i = self.get(client, dataset)
298 if i is not None:
299
300 return i
301
302 sys.stderr.write('I')
303 if self.filename is False:
304 UserEntry.setGroupForSession(client, dataset.getDetails().getGroup().getName())
305 self._createWithoutPixels(client, dataset)
306 return self.get(client, dataset)
307 fpath = os.path.join(BASEPATH, self.filename)
308 if not os.path.exists(fpath):
309 if not os.path.exists(os.path.dirname(fpath)):
310 os.makedirs(os.path.dirname(fpath))
311
312 try:
313
314 sys.stderr.write('<')
315 f = urllib2.urlopen(TESTIMG_URL + self.filename)
316 open(fpath, 'wb').write(f.read())
317 except urllib2.HTTPError:
318 raise IOError('No such file %s' % fpath)
319 host = dataset._conn.c.ic.getProperties().getProperty('omero.host') or 'localhost'
320 port = dataset._conn.c.ic.getProperties().getProperty('omero.port') or '4063'
321
322
323 exe = path(".") / ".." / "bin" /"omero"
324 if not exe.exists():
325 exe = path(".") / ".." / ".."/ ".." / "dist" / "bin" / "omero"
326 if not exe.exists():
327 print "\n\nNo omero found! Add OMERO_HOME/bin to your PATH variable (See #5176)\n\n"
328 exe = "omero"
329
330 newconn = dataset._conn.clone()
331 newconn.connect()
332 UserEntry.setGroupForSession(newconn, dataset.getDetails().getGroup().getName())
333 session = newconn._sessionUuid
334
335 exe += ' -s %s -k %s -p %s import -d %i -n' % (host, session, port, dataset.getId())
336 exe = exe.split() + [self.name, fpath]
337 try:
338 p = subprocess.Popen(exe, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
339 except OSError:
340 print "!!Please make sure the 'omero' executable is in PATH"
341 return None
342
343 pid = p.communicate()
344
345 try:
346 img = omero.gateway.ImageWrapper(dataset._conn, dataset._conn.getQueryService().find('Pixels', long(pid[0].split('\n')[0].strip())).image)
347 except ValueError:
348 print pid
349 raise
350
351 img.setName(self.name)
352
353 img.save()
354 if self.callback:
355 self.callback(img)
356 return img
357
358 - def _createWithoutPixels (self, client, dataset):
359 img = omero.model.ImageI()
360 img.setName(omero.gateway.omero_type(self.name))
361 img.setAcquisitionDate(rtime(0))
362 if not dataset.imageLinksLoaded:
363 print ".!."
364 dataset._obj._imageLinksSeq = []
365 dataset._obj._imageLinksLoaded = True;
366 dataset.linkImage(img)
367 dataset.save()
368
371
380
383
384 -def getImage (client, alias, forceds=None):
386
404
426
427
428
429 ROOT=UserEntry('root','ome',admin=True)
430
431 USERS = {
432
433 }
434
435 PROJECTS = {
436
437 }
438
439 DATASETS = {
440
441 }
442
443 IMAGES = {
444
445 }
446