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
Exemple #5
0
    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)
Exemple #6
0
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')
Exemple #7
0
    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)