1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 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 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 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
|
from irods.models import Resource
from irods.meta import iRODSMetaCollection
class iRODSResource:
def __init__(self, manager, result=None):
self._hierarchy_string = ""
self._parent_name = ""
self._parent_id = ""
"""
self.id = result[Resource.id]
self.name = result[Resource.name]
self.zone_name = result[Resource.zone_name]
self.type = result[Resource.type]
self.class_name = result[Resource.class_name]
self.location = result[Resource.location]
self.vault_path = result[Resource.vault_path]
self.free_space = result[Resource.free_space]
self.free_space_time = result[Resource.free_space_time]
self.comment = result[Resource.comment]
self.create_time = result[Resource.create_time]
self.modify_time = result[Resource.modify_time]
self.status = result[Resource.status]
self.children = result[Resource.children]
self.context = result[Resource.context]
self.parent = result[Resource.parent]
self.parent_context = result[Resource.parent_context]
"""
self.manager = manager
if result:
for attr, value in Resource.__dict__.items():
if not attr.startswith("_"):
try:
setattr(self, attr, result[value])
except KeyError:
# backward compatibility with older schema versions
pass
self._meta = None
## Cached properties to expose parent id or name regardless whether the DB model is iRODS 4.1- or 4.2+
def modify(self, attribute, value):
self.manager.modify(self.name, attribute, value)
@property
def parent_id(self):
if self.parent is None:
return None
if self._parent_id == "":
sess = self.manager.sess
if sess.server_version >= (4, 2, 0):
self._parent_id = self.parent
else:
self._parent_id = (
sess.query(Resource)
.filter(Resource.name == self.parent)
.one()[Resource.id]
)
return int(self._parent_id)
@property
def parent_name(self):
if self.parent is None:
return None
if self._parent_name == "":
sess = self.manager.sess
if sess.server_version < (4, 2, 0):
self._parent_name = self.parent
else:
self._parent_name = (
sess.query(Resource)
.filter(Resource.id == self.parent)
.one()[Resource.name]
)
return self._parent_name
## Cached property to expose resource hierarchy string
@property
def hierarchy_string(self):
if self._hierarchy_string == "":
self._hierarchy_string = ";".join(
r.name for r in self.hierarchy_as_list_of_resource_objects()
)
return self._hierarchy_string
## Retrieve chain of parent objects to top level parent
def hierarchy_as_list_of_resource_objects(self):
trace_to_root = [self]
sess = self.manager.sess
r = self.parent_id
while r is not None:
parent = sess.query(Resource).filter(Resource.id == r).one()
trace_to_root.append(iRODSResource(self.manager, parent))
r = trace_to_root[-1].parent_id
return list(reversed(trace_to_root))
@property
def metadata(self):
if not self._meta:
self._meta = iRODSMetaCollection(
self.manager.sess.metadata, Resource, self.name
)
return self._meta
@property
def context_fields(self):
return dict(pair.split("=") for pair in self.context.split(";"))
@property
def children(self):
try:
return self._children
except AttributeError:
# the children have not yet been resolved
session = self.manager.sess
version = session.server_version
if version >= (4, 2, 0):
# iRODS 4.2+: find parent by resource id
parent = self.id
elif version >= (4, 0, 0):
# iRODS 4.0/4.1: find parent by resource name
parent = self.name
else:
raise RuntimeError("Resource composition not supported")
# query for children and cache results
query = session.query(Resource).filter(
Resource.parent == "{}".format(parent)
)
self._children = [self.__class__(self.manager, res) for res in query]
return self._children
@children.setter
def children(self, children):
pass
def __repr__(self):
return "<iRODSResource {id} {name} {type}>".format(**vars(self))
def remove(self, test=False):
self.manager.remove(self.name, test)
|