Beispiel #1
0
 def test_folderish(self):
     from repoze.folder import Folder
     from repoze.folder.interfaces import IFolder
     cls = self._getTargetClass()
     self.failUnless(IFolder.implementedBy(cls))
     o = self._makeOne()
     self.failUnless(IFolder.providedBy(o))
     self.failUnless(isinstance(o, Folder))
     self.failUnless(hasattr(o, "data"))
Beispiel #2
0
 def test_folderish(self):
     from repoze.folder import Folder
     from repoze.folder.interfaces import IFolder
     cls = self._getTargetClass()
     self.failUnless(IFolder.implementedBy(cls))
     o = self._makeOne()
     self.failUnless(IFolder.providedBy(o))
     self.failUnless(isinstance(o, Folder))
     self.failUnless(hasattr(o, "data"))
Beispiel #3
0
def add_to_repo(obj, event):
    """
    Add a newly created object to the version repository.

    Intended use is as an IObjectAddedEvent subscriber.
    """
    if find_interface(obj, IIntranets):
        # Exclude /offices from repo
        return

    repo = find_repo(obj)
    if repo is None:
        return

    if not repo.history(obj.docid, True):
        # It is not in the repo, so add it
        adapter = queryAdapter(obj, IObjectVersion)
        if adapter is not None:
            if adapter.comment is None:
                adapter.comment = 'Content created.'
            repo.archive(adapter)

    container = event.parent
    adapter = queryAdapter(container, IContainerVersion)
    if adapter is not None:
        request = get_current_request()
        user = authenticated_userid(request)
        repo.archive_container(adapter, user)

    # Recurse into children if adding a subtree
    if IFolder.providedBy(obj):
        for name, child in obj.items():
            fake_event = FakeEvent()
            fake_event.parent = obj
            add_to_repo(child, fake_event)
Beispiel #4
0
Datei: acl.py Projekt: zagy/karl
def make_acls(node, request, acls=None, offset=0):
    if acls is None:
        acls = []
    path = resource_path(node)
    url = resource_url(node, request)
    acl = getattr(node, '__acl__', None)
    folderish = IFolder.providedBy(node)
    name = node.__name__ or '/'
    has_children = False
    security_state = getattr(node, 'security_state', None)
    if folderish:
        has_children = bool(len(node))
    if (folderish and has_children) or acl is not None:
        acls.append({
            'offset': offset,
            'path': path,
            'acl': acl,
            'name': name,
            'security_state': security_state,
            'url': url
        })
    if folderish:
        children = list(node.items())
        children.sort()
        for childname, child in children:
            make_acls(child, request, acls, offset + 1)
    node._p_deactivate()
    return acls
Beispiel #5
0
def init_repo(repo, context):
    if context.__name__ == 'TEMP':
        return

    if IFolder.providedBy(context):
        for child in context.values():
            init_repo(repo, child)

    try:
        repo.history(context, True)
        return
    except:
        # Not in repo
        pass

    version = queryAdapter(context, IObjectVersion)
    if version is not None:
        print "Updating version for %s" % model_path(context)
        repo.archive(version)

    container = queryAdapter(context, IContainerVersion)
    if container is not None:
        print "Updating container version for %s" % model_path(context)
        user = getattr(context, 'creator', None)
        if user is None:
            user = get_setting(context, 'system_user', 'admin')
        repo.archive_container(container, user)

    context._p_deactivate() # try not to run out of memory
Beispiel #6
0
def add_to_repo(obj, event):
    """
    Add a newly created object to the version repository.

    Intended use is as an IObjectAddedEvent subscriber.
    """
    repo = find_repo(obj)
    if repo is None:
        return

    try:
        # If we're undeleting an object, it might already be in the repo
        repo.history(obj.docid)
    except:
        # It is not in the repo, so add it
        adapter = queryAdapter(obj, IObjectVersion)
        if adapter is not None:
            if adapter.comment is None:
                adapter.comment = 'Content created.'
            repo.archive(adapter)

    container = event.parent
    adapter = queryAdapter(container, IContainerVersion)
    if adapter is not None:
        request = get_current_request()
        user = authenticated_userid(request)
        repo.archive_container(adapter, user)

    # Recurse into children if adding a subtree
    if IFolder.providedBy(obj):
        for name, child in obj.items():
            fake_event = FakeEvent()
            fake_event.parent = obj
            add_to_repo(child, fake_event)
Beispiel #7
0
def copy_context(context, request, va, **kw):
    #Copying objects with subobjects aren't supported yet, since subobjects and references need to be updated.
    if IFolder.providedBy(context) and len(context):
        return ""
    if context != kw['view'].root:
        return """<li><a href="%(url)s">%(title)s</a></li>""" %\
            {'url': request.resource_url(context, '__copy_context__'),
             'title': va.title}
Beispiel #8
0
 def visit(node):
     if IFolder.providedBy(node):
         for child in node.values():
             for result in visit(child):
                 yield result
                 # attempt to not run out of memory
     yield node
     if hasattr(node, '_p_deactivate'):
         node._p_deactivate()
Beispiel #9
0
 def visit(node):
     if IFolder.providedBy(node):
         for child in node.values():
             for result in visit(child):
                 yield result
     yield node
     if hasattr(node, '_p_deactivate'):
         # attempt to not run out of memory
         node._p_deactivate()
Beispiel #10
0
    def traverse(node):
        sys.stdout.write('.'); sys.stdout.flush()
        visit(node)
        if IFolder.providedBy(node):
            for child in node.values():
                traverse(child)
        leave(node)

        if hasattr(node, '_p_deactivate'):
            # attempt to not run out of memory
            node._p_deactivate()
Beispiel #11
0
    def visit(node, path, container):
        if IFolder.providedBy(node):
            for key in node.keys():
                child = node[key]
                path.append(key)
                for result, desc_path, desc_container in visit(child, path, node):
                    yield result, desc_path, desc_container
                path.pop(-1)

        yield node, path, container
        if hasattr(node, "_p_deactivate"):
            node._p_deactivate()
Beispiel #12
0
def add_to_repo(obj, event, update_container=True):
    """
    Add a newly created object to the version repository.

    Intended use is as an IObjectAddedEvent subscriber.
    """
    if find_interface(obj, IIntranets):
        # Exclude /offices from repo
        return

    repo = find_repo(obj)
    if repo is None:
        return

    if not repo.history(obj.docid, True):
        # It is not in the repo, so add it
        adapter = queryAdapter(obj, IObjectVersion)
        if adapter is not None:
            if adapter.comment is None:
                adapter.comment = 'Content created.'
            repo.archive(adapter)
            blobs = getattr(adapter, 'blobs', None)
            if blobs:
                for blob in adapter.blobs.values():
                    blob.close()

    if update_container:
        container = event.parent
        adapter = queryAdapter(container, IContainerVersion)
        if adapter is not None:
            # In some cases, a sibling might not have been added to the archive
            # yet.  Archiving the container before all of its children are
            # archived can result in an integrity constraint violation, so we
            # should check for this case and handle it.
            for name, docid in adapter.map.items():
                if docid == obj.docid:
                    continue
                if not repo.history(docid, True):
                    orphan = container[name]
                    log.warn("Adding object to archive: %s" %
                             resource_path(orphan))
                    add_to_repo(orphan, event, update_container=False)

            request = get_current_request()
            user = authenticated_userid(request)
            repo.archive_container(adapter, user)

    # Recurse into children if adding a subtree
    if IFolder.providedBy(obj):
        for name, child in obj.items():
            fake_event = FakeEvent()
            fake_event.parent = obj
            add_to_repo(child, fake_event)
Beispiel #13
0
    def visit(node, path, container):
        if IFolder.providedBy(node):
            for key in node.keys():
                child = node[key]
                path.append(key)
                for result, desc_path, desc_container in visit(
                        child, path, node):
                    yield result, desc_path, desc_container
                path.pop(-1)

        yield node, path, container
        if hasattr(node, '_p_deactivate'):
            node._p_deactivate()
Beispiel #14
0
def make_acls(node, request, acls=None, offset=0):
    if acls is None:
        acls = []
    path = model_path(node)
    url = model_url(node, request)
    acl = getattr(node, '__acl__', None)
    folderish = IFolder.providedBy(node)
    name = node.__name__ or '/'
    has_children = False
    if folderish:
        has_children = bool(len(node))
    if (folderish and has_children) or acl is not None:
        acls.append({'offset':offset, 'path':path, 'acl':acl, 'name':name,
                     'url':url})
    if folderish:
        children = list(node.items())
        children.sort()
        for childname, child in children:
            make_acls(child, request, acls, offset+1)
    node._p_deactivate()
    return acls
Beispiel #15
0
 def visit(node):
     if IFolder.providedBy(node):
         for child in node.values():
             for result in visit(child):
                 yield result
     yield node
Beispiel #16
0
def vocabulary_view(context, request):
    try:
        attributes = json.loads(request.params.get('attributes', '["title", "id"]'))
    except:
        attributes = ['title', 'id']
    if 'UID' in attributes:
        # always put in anyways
        attributes.remove('UID')

    try:
        batch = json.loads(request.params.get('batch'))
    except:
        batch = DEFAULT_BATCH

    query = normalize_query(json.loads(request.params['query']))
    criteria = parse_query(query)

    resolver = ResovlerFactory(context)
    if 'UID' in query:
        docids = query['UID']
        if type(docids) not in (list, tuple):
            docids = [docids]
        # convert to ints
        new_docids = []
        for docid in docids:
            try:
                new_docids.append(int(docid))
            except:
                pass
        docids = new_docids
        numdocs = len(docids)
    else:
        criteria.append(Any('allowed', effective_principals(request)))
        if 'title' not in query:
            # we default to requiring a title in these results or
            # else we get a bunch of junky results
            criteria.append(NotEq('title', ''))
        catalog = find_catalog(context)
        numdocs, docids = catalog.query(And(*criteria))

    if batch and ('size' not in batch or 'page' not in batch):
        batch = DEFAULT_BATCH
    if batch:
        # must be slicable for batching support
        page = int(batch['page'])
        # page is being passed in is 1-based
        start = (max(page - 1, 0)) * int(batch['size'])
        end = start + int(batch['size'])
        # Try __getitem__-based slice, then iterator slice.
        # The iterator slice has to consume the iterator through
        # to the desired slice, but that shouldn't be the end
        # of the world because at some point the user will hopefully
        # give up scrolling and search instead.
        try:
            docids = docids[start:end]
        except TypeError:
            docids = itertools.islice(docids, start, end)

    # build result items
    items = []
    for docid in docids:
        result = resolver(docid)
        if result is None:
            continue
        data = {
            'UID': docid
        }
        for attribute in attributes:
            attr = attribute
            if attribute in _attribute_mapping:
                attr = _attribute_mapping[attribute]
            if attr in ('Type', 'portal_type'):
                value = 'Page'
                if IImage.providedBy(result):
                    value = 'Image'
                elif ICommunityFile.providedBy(result):
                    value = 'File'
                elif IFolder.providedBy(result):
                    value = 'Folder'
            elif attr == 'getURL':
                value = resource_url(result, request)
            elif attr == 'path':
                # a bit weird here...
                value = resource_path(result, request).split('/GET')[0]
            else:
                value = getattr(result, attr, None)
            data[attribute] = value
        items.append(data)
    return {
        'results': items,
        'total': numdocs
    }
Beispiel #17
0
 def visit(node):
     if IFolder.providedBy(node):
         for child in node.values():
             for result in visit(child):
                 yield result
     yield node