def sets(self, args): """List filesets by various criteria Filesets are bundles of original data imported into OMERO 5 and above which represent 1 *or more* images. Examples: bin/omero fs sets --order=newest # Default bin/omero fs sets --order=oldest bin/omero fs sets --order=largest bin/omero fs sets --without-images # Corrupt filesets bin/omero fs sets --with-transfer=ln_s # Symlinked filesets bin/omero fs sets --check # Proof the checksums """ from omero.constants.namespaces import NSFILETRANSFER from omero_sys_ParametersI import ParametersI from omero.rtypes import unwrap client = self.ctx.conn(args) service = client.sf.getQueryService() admin = client.sf.getAdminService() if args.check and not admin.getEventContext().isAdmin: self.error_admin_only(fatal=True) annselect = ( "(select ann.textValue from Fileset f4 " "join f4.annotationLinks fal join fal.child ann " "where f4.id = fs.id and ann.ns =:ns) ") select = ( "select fs.id, fs.templatePrefix, " "(select size(f2.images) from Fileset f2 " "where f2.id = fs.id)," "(select size(f3.usedFiles) from Fileset f3 " "where f3.id = fs.id),") \ + annselect query1 = ( "from Fileset fs " "where 1 = 1 ") query2 = ( "group by fs.id, fs.templatePrefix ") if args.order: if args.order == "newest": query2 += "order by fs.id desc" elif args.order == "oldest": query2 += "order by fs.id asc" elif args.order == "prefix": query2 += "order by fs.templatePrefix" if args.without_images: query = "%s and fs.images is empty %s" % (query1, query2) else: query = "%s %s" % (query1, query2) params = ParametersI() params.addString("ns", NSFILETRANSFER) count = service.projection("select count(fs) " + query1, params, {"omero.group": "-1"}) params.page(args.offset, args.limit) objs = service.projection(select + query, params, {"omero.group": "-1"}) objs = unwrap(objs) count = unwrap(count)[0][0] cols = ["Id", "Prefix", "Images", "Files", "Transfer"] if args.check: cols.append("Check") tb = self._table(args) tb.cols(cols) tb.page(args.offset, args.limit, count) # Map any requested transfers as well if args.with_transfer: restricted = [TRANSFERS.get(x, x) for x in args.with_transfer[0]] else: restricted = None for idx, obj in enumerate(objs): # Map the transfer name to the CLI symbols ns = obj[-1] if ns is None: ns = "" elif ns in TRANSFERS: ns = TRANSFERS[ns] obj[-1] = ns # Filter based on the ns symbols if restricted and ns not in restricted: continue # Now perform check if required if args.check: from omero.grid import RawAccessRequest desc, prx = self.get_managed_repo(client) ctx = client.getContext(group=-1) check_params = ParametersI() check_params.addId(obj[0]) rows = service.projection(( "select h.value, f.hash, " "f.path || '/' || f.name " "from Fileset fs join fs.usedFiles uf " "join uf.originalFile f join f.hasher h " "where fs.id = :id" ), check_params, ctx) if not rows: obj.append("Empty") err = None for row in rows: row = unwrap(row) raw = RawAccessRequest() raw.repoUuid = desc.hash.val raw.command = "checksum" raw.args = map(str, row) try: cb = client.submit(raw) cb.close(True) except CmdError, ce: err = ce.err self.ctx.dbg(err) if err: obj.append("ERROR!") elif rows: obj.append("OK") tb.row(idx, *tuple(obj))
prefix = prep_directory(client, mrepo) self.ctx.err("Renaming Fileset:%s to %s" % (fid, prefix)) tomove = rename_fileset(client, mrepo, fileset, prefix) finally: if new_client is not None: new_client.__del__() if not tomove: self.ctx.die(113, "No files moved!") elif not args.no_move: from omero.grid import RawAccessRequest for from_path, to_path in tomove: raw = RawAccessRequest() raw.repoUuid = root.hash.val raw.command = "mv" raw.args = [from_path, to_path] self.ctx.err("Moving %s to %s" % (from_path, to_path)) try: self.ctx.get_client().submit(raw) except CmdError, ce: self.ctx.die(114, ce.err) else: self.ctx.err( "Done. You will now need to move these files manually:") self.ctx.err( "-----------------------------------------------------") b = "".join([root.path.val, root.name.val]) for from_path, to_path in tomove: t = "/".join([b, to_path]) f = "/".join([b, from_path]) cmd = "mv %s %s" % (f, t)
def sets(self, args): """List filesets by various criteria Filesets are bundles of original data imported into OMERO 5 and above which represent 1 *or more* images. Examples: bin/omero fs sets --order=newest # Default bin/omero fs sets --order=oldest bin/omero fs sets --order=largest bin/omero fs sets --without-images # Corrupt filesets bin/omero fs sets --with-transfer=ln_s # Symlinked filesets bin/omero fs sets --check # Proof the checksums """ from omero.constants.namespaces import NSFILETRANSFER from omero_sys_ParametersI import ParametersI from omero.rtypes import unwrap client = self.ctx.conn(args) service = client.sf.getQueryService() admin = client.sf.getAdminService() if args.check and not admin.getEventContext().isAdmin: self.error_admin_only(fatal=True) annselect = ( "(select ann.textValue from Fileset f4 " "join f4.annotationLinks fal join fal.child ann " "where f4.id = fs.id and ann.ns =:ns) " ) select = ( "select fs.id, fs.templatePrefix, " "(select size(f2.images) from Fileset f2 " "where f2.id = fs.id)," "(select size(f3.usedFiles) from Fileset f3 " "where f3.id = fs.id)," ) + annselect query1 = "from Fileset fs " "where 1 = 1 " query2 = "group by fs.id, fs.templatePrefix " if args.order: if args.order == "newest": query2 += "order by fs.id desc" elif args.order == "oldest": query2 += "order by fs.id asc" elif args.order == "prefix": query2 += "order by fs.templatePrefix" if args.without_images: query = "%s and fs.images is empty %s" % (query1, query2) else: query = "%s %s" % (query1, query2) params = ParametersI() params.addString("ns", NSFILETRANSFER) count = service.projection("select count(fs) " + query1, params, {"omero.group": "-1"}) params.page(args.offset, args.limit) objs = service.projection(select + query, params, {"omero.group": "-1"}) objs = unwrap(objs) count = unwrap(count)[0][0] cols = ["Id", "Prefix", "Images", "Files", "Transfer"] if args.check: cols.append("Check") tb = self._table(args) tb.cols(cols) tb.page(args.offset, args.limit, count) # Map any requested transfers as well if args.with_transfer: restricted = [TRANSFERS.get(x, x) for x in args.with_transfer[0]] else: restricted = None for idx, obj in enumerate(objs): # Map the transfer name to the CLI symbols ns = obj[-1] if ns is None: ns = "" elif ns in TRANSFERS: ns = TRANSFERS[ns] obj[-1] = ns # Filter based on the ns symbols if restricted and ns not in restricted: continue # Now perform check if required if args.check: from omero.grid import RawAccessRequest desc, prx = self.get_managed_repo(client) ctx = client.getContext(group=-1) check_params = ParametersI() check_params.addId(obj[0]) rows = service.projection( ( "select h.value, f.hash, " "f.path || '/' || f.name " "from Fileset fs join fs.usedFiles uf " "join uf.originalFile f join f.hasher h " "where fs.id = :id" ), check_params, ctx, ) if not rows: obj.append("Empty") err = None for row in rows: row = unwrap(row) raw = RawAccessRequest() raw.repoUuid = desc.hash.val raw.command = "checksum" raw.args = map(str, row) try: cb = client.submit(raw) cb.close(True) except CmdError, ce: err = ce.err self.ctx.dbg(err) if err: obj.append("ERROR!") elif rows: obj.append("OK") tb.row(idx, *tuple(obj))
def sets(self, args): """List filesets by various criteria Filesets are bundles of original data imported into OMERO 5 and above which represent 1 *or more* images. Examples: bin/omero fs sets --order=newest # Default bin/omero fs sets --order=oldest bin/omero fs sets --order=largest bin/omero fs sets --without-images # Corrupt filesets bin/omero fs sets --with-transfer=ln_s # Symlinked filesets bin/omero fs sets --check # Proof the checksums """ from omero.constants.namespaces import NSFILETRANSFER from omero_sys_ParametersI import ParametersI from omero.rtypes import unwrap from omero.cmd import OK client = self.ctx.conn(args) service = client.sf.getQueryService() select = ( "select fs.id, fs.templatePrefix, " "(select size(f2.images) from Fileset f2 where f2.id = fs.id)," "(select size(f3.usedFiles) from Fileset f3 where f3.id = fs.id)," "ann.textValue ") query1 = ( "from Fileset fs " "left outer join fs.annotationLinks fal " "left outer join fal.child ann " "where (ann is null or ann.ns = :ns) ") query2 = ( "group by fs.id, fs.templatePrefix, ann.textValue ") if args.order: if args.order == "newest": query2 += "order by fs.id desc" elif args.order == "oldest": query2 += "order by fs.id asc" elif args.order == "prefix": query2 += "order by fs.templatePrefix" if args.without_images: query = "%s and fs.images is empty %s" % (query1, query2) else: query = "%s %s" % (query1, query2) params = ParametersI() params.addString("ns", NSFILETRANSFER) count = service.projection("select count(fs) " + query1, params, {"omero.group": "-1"}) params.page(args.offset, args.limit) objs = service.projection(select + query, params, {"omero.group": "-1"}) objs = unwrap(objs) count = unwrap(count)[0][0] cols = ["Id", "Prefix", "Images", "Files", "Transfer"] if args.check: cols.append("Check") tb = self._table(args) tb.cols(cols) tb.page(args.offset, args.limit, count) for idx, obj in enumerate(objs): # Map the transfer name to the CLI symbols ns = obj[-1] if ns is None: ns = "" elif ns in TRANSFERS: ns = TRANSFERS[ns] obj[-1] = ns # Map any requested transfers as well allowed = args.with_transfer is not None \ and args.with_transfer or [] for idx, x in enumerate(allowed): x = x[0] # Strip argparse wrapper x = TRANSFERS.get(x, x) # map allowed[idx] = x # Filter based on the ns symbols if allowed: if ns not in allowed: continue # Now perform check if required if args.check: from omero.grid import RawAccessRequest desc, prx = self.get_managed_repo(client) ctx = client.getContext(group=-1) check_params = ParametersI() check_params.addId(obj[0]) rows = service.projection(( "select h.value, f.hash, " "f.path || '/' || f.name " "from Fileset fs join fs.usedFiles uf " "join uf.originalFile f join f.hasher h " "where fs.id = :id" ), check_params, ctx) if not rows: obj.append("Empty") err = None for row in rows: row = unwrap(row) raw = RawAccessRequest() raw.repoUuid = desc.hash.val raw.command = "checksum" raw.args = map(str, row) cb = client.submit(raw) try: rsp = cb.getResponse() if not isinstance(rsp, OK): err = rsp break finally: cb.close(True) if err: obj.append("ERROR!") elif rows: obj.append("OK") tb.row(idx, *tuple(obj)) self.ctx.out(str(tb.build()))
self.ctx.err("Renaming Fileset:%s to %s" % (fid, prefix)) tomove = rename_fileset(client, mrepo, fileset, prefix) finally: if new_client is not None: new_client.__del__() if not tomove: self.ctx.die(113, "No files moved!") elif not args.no_move: from omero.grid import RawAccessRequest for from_path, to_path in tomove: raw = RawAccessRequest() raw.repoUuid = root.hash.val raw.command = "mv" raw.args = [from_path, to_path] self.ctx.err("Moving %s to %s" % (from_path, to_path)) try: self.ctx.get_client().submit(raw) except CmdError, ce: self.ctx.die(114, ce.err) else: self.ctx.err("Done. You will now need to move these files manually:") self.ctx.err("-----------------------------------------------------") b = "".join([root.path.val, root.name.val]) for from_path, to_path in tomove: t = "/".join([b, to_path]) f = "/".join([b, from_path]) cmd = "mv %s %s" % (f, t) self.ctx.out(cmd)