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
17
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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
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
77 return False
78 except:
79
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
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
167 client = USERS[self.owner].login()
168 p = self.get(client)
169 if p is not None:
170
171 return p
172
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
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
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
208 return d
209
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
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
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
242 return i
243
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
262 exe += ' import -s %s -k %s -d %i -p %s -n %s %s' % (host, session, dataset.getId(), port, self.name, fpath)
263
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
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
289
298
301
302 -def getImage (client, alias, forceds=None):
304
317
330
331
332
333 ROOT=UserEntry('root','ome',admin=True)
334
335 USERS = {
336
337 }
338
339 PROJECTS = {
340
341 }
342
343 DATASETS = {
344
345 }
346
347 IMAGES = {
348
349 }
350