def action(self, member, permission): member = member.text log.debug('permission action %s' % member) resource = data_service.get_resource(member, view='short') log.debug('GOT %s' % etree.tostring (resource)) resource.set('permission', permission) data_service.update(resource) return None
def add_query(self, duri, resource_tag, tag_query, **kw): """Append query results to a dataset @param duri: dataset uri of an existing dataset @param resource_tag:resource type tag i.e. images @param tag_query: expression of tag search """ log.info ("dataset: addquery members of %s tag %s query %s " , duri, resource_tag, tag_query) dataset = data_service.get_resource(duri, view='deep') members = dataset.xpath('./value') for n, val in enumerate(members): val.set('index', str(n)) items = data_service.query (resource_tag, tag_query=tag_query, **kw) count = len(members) for resource in items: # check if already there: found = dataset.xpath('./value[text()="%s"]' % resource.get('uri')) if len(found) == 0: val = etree.SubElement(dataset, 'value', type='object', index = str(count)) val.text =resource.get('uri') count += 1 log.debug ("members = %s" % etree.tostring (dataset)) r = data_service.update(dataset) return etree.tostring(r)
def _create_default_mounts(self, root=None): 'translate system stores into mount (store) resources' #for x in range(subtrans_attempts): # with optional_cm(subtrans): update = False user_name = identity.current.user_name if root is None: update = True root = etree.Element('store', name="(root)", resource_unid="(root)") etree.SubElement(root, 'tag', name='order', value = ','.join (self.drivers.keys())) for store_name,driver in self.drivers.items(): mount_path = string.Template(driver['mounturl']).safe_substitute(datadir = data_url_path(), user = user_name) etree.SubElement(root, 'store', name = store_name, resource_unid=store_name, value=config2url(mount_path)) else: storeorder = get_tag(root, 'order') if storeorder is None: log.warn ("order tag missing from root store adding") storeorder = etree.SubElement(root, 'tag', name='order', value = ','.join (self.drivers.keys())) update = True elif len(storeorder) == 1: storeorder = storeorder[0] else: log.warn("Multible order tags on root store") # Check for store not already initialized user_stores = dict ((x.get ('name'), x) for x in root.xpath('store')) for store_name, driver in self.drivers.items(): if store_name not in user_stores: store = etree.SubElement (root, 'store', name = store_name, resource_unid = store_name) # If there is a new store defined, better just to reset it to the default #ordervalue = [ x.strip() for x in storeorder.get ('value', '').split(',') ] #if store_name not in ordervalue: # ordervalue.append(store_name) # storeorder.set ('value', ','.join(ordervalue)) storeorder.set ('value', ','.join (self.drivers.keys())) else: store = user_stores[store_name] if store.get ('value') is None: mounturl = driver.get ('mounturl') mounturl = string.Template(mounturl).safe_substitute(datadir = data_url_path(), user = user_name) # ensure no $ are left mounturl = mounturl.split('$', 1)[0] store.set ('value', config2url(mounturl)) log.debug ("setting store %s value to %s", store_name, mounturl) update = True if update: log.debug ("updating %s", etree.tostring(root)) return data_service.update(root, new_resource=root, replace=False, view='full') return root
def action(self, member, action, tagdoc, **kw): """Modify the tags of the member @param member: the memeber of the dataset @param action: a string :append, delete, edit_value, edit_name, change_name @poarag tagdoc """ member = member.text if isinstance(tagdoc, basestring): tagdoc = etree.XML(tagdoc) log.debug ('TagEdit (%s) %s with %s' % (action, member, etree.tostring(tagdoc))) # These update operation should be done in the database # However, I don't want to think about it now # so here's the brute-force way if action=="append": resource = data_service.get_resource(member, view='short') resource.append(tagdoc) data_service.update(resource) elif action=='delete': resource = data_service.get_resource(member, view='full') for tag in tagdoc.xpath('./tag'): resource_tags = resource.xpath('./tag[@name="%s"]' % tag.get('name')) for killtag in resource_tags: data_service.del_resource(killtag.get('uri')) elif action=='edit_value': resource = data_service.get_resource(member, view='full') for tag in tagdoc.xpath('./tag'): resource_tags = resource.xpath('./tag[@name="%s"]' % tag.get('name')) for mtag in resource_tags: mtag.set('value', tag.get('value')) data_service.update(resource) elif action=='edit_name': resource = data_service.get_resource(member, view='full') for tag in tagdoc.xpath('./tag'): resource_tags = resource.xpath('./tag[@value="%s"]' % tag.get('value')) for mtag in resource_tags: mtag.set('name', tag.get('name')) data_service.update(resource) elif action=='change_name': resource = data_service.get_resource(member, view='full') for tag in tagdoc.xpath('./tag'): resource_tags = resource.xpath('./tag[@name="%s"]' % tag.get('name')) for mtag in resource_tags: mtag.set('name', tag.get('value')) data_service.update(resource) return None
def move(self, path, destination, user=None, **kw): ' Move a resource identified by path ' log.info("move(%s,%s) %s %s", path, destination, tg.request.method, kw) if user is not None and identity.is_admin(): identity.current.set_current_user(user) # sanity check resource = etree.Element('resource', value=destination) store, driver = self.mounts.valid_store_ref(resource) if store is None: abort(400, "%s is not a valid store " % destination) resource = data_service.query("file|image", resource_value=path, wpublic='1', cache=False) for child in resource: old_store, old_driver = self.mounts.valid_store_ref(child) if old_store is None: abort(400, "%s is not a valid store " % destination) # Remove links in directory hierarchy self.mounts.delete_links(child) # Change the location child.set('value', destination) child.set('name', os.path.basename(destination)) resource = data_service.update(child) # Update the tag q1 = data_service.query('tag', parent=resource, name='filename') if len(q1): q1[0].set('value', os.path.basename(destination)) data_service.update(q1[0]) # update the links partial_path = destination.replace(driver.mount_url, '') self.mounts.insert_mount_path(store, partial_path, resource) return etree.tostring(resource)
def _update_mounts(drivers): update = False user_name = identity.current.user_name user_root = data_service.query('store', resource_unid='(root)', view='full') if len(user_root) == 0: log.warn("No store found") elif len(user_root) == 1: user_root = user_root[0] elif len(user_root) > 1: log.error( "Root store created more than once for %s: %s please check DB", user_name, etree.tostring(user_root)) return None user_stores = dict((x.get('name'), x) for x in user_root.xpath('store')) storeorder = get_tag(user_root, 'order') if storeorder is None: log.warn("order tag missing from root store adding") storeorder = etree.SubElement(user_root, 'tag', name='order', value=','.join(drivers.keys())) update = True elif len(storeorder) == 1: storeorder = storeorder[0] storelist = ','.join(drivers.keys()) if storeorder.get('value') != storelist: storeorder.set('value', storelist) update = True for store_name, driver in drivers.items(): if store_name not in user_stores: print("Need to create new store : %s" % store_name) mount_path = string.Template(driver['mounturl']).safe_substitute( datadir=data_url_path(), user=user_name) etree.SubElement(user_root, 'store', name=store_name, resource_unid=store_name, value=config2url(mount_path)) update = True continue store = user_stores[store_name] mounturl = driver.get('mounturl') mounturl = string.Template(mounturl).safe_substitute( datadir=data_url_path(), user=user_name) # ensure no $ are left mounturl = mounturl.split('$', 1)[0] mounturl = config2url(mounturl) store_value = store.get('value') print("examining store %s with %s" % (store_name, store_value)) if store_value is None or store_value != mounturl: print("Updating store with value %s to %s" % (store_value, mounturl)) store.set('value', mounturl) update = True if update: return data_service.update(user_root, new_resource=user_root, replace=False, view='full')
def process_bix(self, bixfile, name_map={}): if bixfile == None or bixfile == '': return '', '' self.import_files = name_map fullname = self.fullname(bixfile) log.debug("BIX:" + fullname) self.resource = None et = etree.parse(fullname) # Scan tree for special nodes. try: preprocess = [ 'image_visibility', 'image_plane_order', 'image_num_z', 'image_num_t', 'filename' ] for tag in preprocess: log.debug('trying tag:' + tag) items = et.getroot().xpath('./item[name="%s"]' % tag) log.debug('got ' + str(items)) if items and hasattr(self, 'tag_' + tag): handler = getattr(self, 'tag_' + tag) handler(items[0]) rr = self.save_file(bixfile) self.import_files[bixfile] = rr.get('uri') self.import_files['BIX'] = rr.get('uri') e = etree.SubElement(self.resource, 'tag', name='attached-file') etree.SubElement(e, 'tag', name='original-name', value=bixfile) etree.SubElement(e, 'tag', name='url', type='file', value=rr.get('uri')) # Process all other nodes for config in et.getroot().getiterator('config'): etree.SubElement(self.resource, 'tag', name='image_type', value=config.get('type')) for item in et.getroot().getiterator('item'): name = item[0].text # item[0] == <name> value = self.parseValue(item[1]) # item[1] == <value> if name in preprocess: continue if hasattr(self, 'tag_' + name): # Use a special tag parser handler = getattr(self, 'tag_' + name) handler(item) else: # BIX Files come encoded in UTF-8 # DO not change encoding here. t = etree.SubElement(self.resource, 'tag', name=name, value=value) log.debug('tag ' + name + ':' + value) if self.permission_flag == 'published': for child in self.resource.iter(): child.set('permission', self.permission_flag) # Should check if we have local changes (redirect to DS) log.debug("update image" + etree.tostring(self.resource)) data_service.update(self.resource) except BIXError, e: log.error("Exception" + e)
def permission(self, duri, **kw): log.info ("dataset: permission members of %s to %s" , duri, kw.get ('permission')) ds = etree.Element ('dataset', uri = duri, permission= kw["permission"]) data_service.update(ds) return self.iterate(duri, operation='permission', **kw)