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"))
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)
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
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
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)
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}
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()
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()
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()
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()
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)
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()
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
def visit(node): if IFolder.providedBy(node): for child in node.values(): for result in visit(child): yield result yield node
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 }