python-icat A Library for Writing ICAT Clients in Python Rolf Krahl ICAT Meeting, Dublin, Mar 2014 Introduction SOAP is used as the access protocol for ICAT. Clients exist for different programming languages, including Java and Python. The most popular SOAP library for Python is Suds. python-icat aims to make writing ICAT clients with Python simpler. RolfKrahl (HZB) python-icat 2/19 Design Goals python-icat is build on top of Suds. Goals Keep the general structure and flexibility of Suds. Simplify things where possible. Try to remove annoying details. Make use object oriented design. A typical python-icat program might be mistaken for a generic Suds program at first glance. It’s just somewhat simpler. RolfKrahl (HZB) python-icat 3/19 Using python-icat dataset = client .search("Dataset[name=’e201215 ’]")[0] format = client .search("DatafileFormat[name=’NeXus ’]")[0] datafile = client .new("datafile") datafile.dataset = dataset datafile.datafileFormat = format datafile.name = "e201215−7.nxs" datafile.create() Example: Add a Datafile Using plain Suds dataset = client .service.search(sessionId , "Dataset[name=’e201215 ’]")[0] format = client .service.search(sessionId , "DatafileFormat[name=’NeXus ’]")[0] datafile = client .factory.create("datafile") datafile.dataset = dataset datafile.datafileFormat = format datafile.name = "e201215−7.nxs" datafile.id = client .service.create(sessionId , datafile) RolfKrahl (HZB) python-icat 4/19 Example: Add a Datafile Using plain Suds dataset = client .service.search(sessionId , "Dataset[name=’e201215 ’]")[0] format = client .service.search(sessionId , "DatafileFormat[name=’NeXus ’]")[0] datafile = client .factory.create("datafile") datafile.dataset = dataset datafile.datafileFormat = format datafile.name = "e201215−7.nxs" datafile.id = client .service.create(sessionId , datafile) Using python-icat dataset = client .search("Dataset[name=’e201215 ’]")[0] format = client .search("DatafileFormat[name=’NeXus ’]")[0] datafile = client .new("datafile") datafile.dataset = dataset datafile.datafileFormat = format datafile.name = "e201215−7.nxs" datafile.create() RolfKrahl (HZB) python-icat 4/19 Example: Add a Datafile Or even: Using python-icat dataset = client .search("Dataset[name=’e201215 ’]")[0] format = client .search("DatafileFormat[name=’NeXus ’]")[0] client .new("datafile", dataset=dataset , datafileFormat=format , name="e201215−7.nxs").create() RolfKrahl (HZB) python-icat 5/19 Notes client.new(...) creates a new ICAT entity objects. Use this in place of client.factory.create(...). client.new(...) optionally accepts keyword/value arguments to set attributes. ICAT API methods are defined as methods in the python-icat client. Replace client.service.<method>(...) by client.<method>(...). Don’t care about the session id, the python-icat client remembers it and adds it to the ICAT method calls as needed. ICAT entity objects have their own methods: e.g. datafile.create(). RolfKrahl (HZB) python-icat 6/19 Using python-icat investigation = client .search( "Investigation[name=’2010−E2−0489−1’]")[0] investigation.addKeywords(["Foo", "Bar", "Baz"]) Example: Add Keywords to an Investigation Using plain Suds investigation = client .service.search(sessionId , "Investigation[name=’2010−E2−0489−1’]")[0] keywords = [] for k in ["Foo", "Bar", "Baz"]: keyword = client .factory.create("keyword") keyword.name = k keyword.investigation = investigation keywords.append(keyword) client .service.createMany(sessionId , keywords) RolfKrahl (HZB) python-icat 7/19 Example: Add Keywords to an Investigation Using plain Suds investigation = client .service.search(sessionId , "Investigation[name=’2010−E2−0489−1’]")[0] keywords = [] for k in ["Foo", "Bar", "Baz"]: keyword = client .factory.create("keyword") keyword.name = k keyword.investigation = investigation keywords.append(keyword) client .service.createMany(sessionId , keywords) Using python-icat investigation = client .search( "Investigation[name=’2010−E2−0489−1’]")[0] investigation.addKeywords(["Foo", "Bar", "Baz"]) RolfKrahl (HZB) python-icat 7/19 Using python-icat users = [ jbotu , jdoe , nbour ] group = client .createGroup("investigation_42_reader", users) Example: Create a Group Using plain Suds users = [ jbotu , jdoe , nbour ] group = client .factory.create("group") group.name = "investigation_42_reader" group.id = client .service.create(sessionId , group) ugs = [] for u in users: ug = client .factory.create("userGroup") ug.user = u ug.group = group ugs.append(ug) client .service.createMany(sessionId , ugs) RolfKrahl (HZB) python-icat 8/19
Description: