+ def ctime(self):
+ return convertTime(self.project_object["created_at"]) if "created_at" in self.project_object else 0
+
+ def mtime(self):
+ return convertTime(self.project_object["modified_at"]) if "modified_at" in self.project_object else 0
+
+
+
+class SharedDirectory(RecursiveInvalidateDirectory):
+ '''A special directory that represents users or groups who have shared projects with me.'''
+
+ def __init__(self, parent_inode, inodes, api, exclude, poll=False, poll_time=60):
+ super(SharedDirectory, self).__init__(parent_inode)
+ self.current_user = api.users().current().execute()
+ self.inodes = inodes
+ self.api = api
+
+ # try:
+ # arvados.events.subscribe(self.api, [], lambda ev: self.invalidate())
+ # except:
+ self._poll = True
+ self._poll_time = poll_time
+
+ def update(self):
+ #with llfuse.lock_released:
+ all_projects = arvados.util.list_all(self.api.groups().list, filters=[['group_class','=','project']])
+ objects = {}
+ for ob in all_projects:
+ objects[ob['uuid']] = ob
+
+ roots = []
+ root_owners = {}
+ for ob in all_projects:
+ if ob['owner_uuid'] != self.current_user['uuid'] and ob['owner_uuid'] not in objects:
+ roots.append(ob)
+ root_owners[ob['owner_uuid']] = True
+
+ #with llfuse.lock_released:
+ lusers = arvados.util.list_all(self.api.users().list, filters=[['uuid','in', list(root_owners)]])
+ lgroups = arvados.util.list_all(self.api.groups().list, filters=[['uuid','in', list(root_owners)]])
+
+ users = {}
+ groups = {}
+
+ for l in lusers:
+ objects[l["uuid"]] = l
+ for l in lgroups:
+ objects[l["uuid"]] = l
+
+ contents = {}
+ for r in root_owners:
+ if r in objects:
+ obr = objects[r]
+ if "name" in obr:
+ contents[obr["name"]] = obr
+ if "first_name" in obr:
+ contents[u"{} {}".format(obr["first_name"], obr["last_name"])] = obr
+
+ for r in roots:
+ if r['owner_uuid'] not in objects:
+ contents[r['name']] = r
+
+ try:
+ self.merge(contents.items(),
+ lambda i: i[0],
+ lambda a, i: a.uuid == i[1]['uuid'],
+ lambda i: ProjectDirectory(self.inode, self.inodes, self.api, i[1], poll=self._poll, poll_time=self._poll_time))
+ except Exception as e:
+ _logger.exception(e)
+