def test_multiple_parents_and_types(self): from kotti.resources import get_root from kotti.resources import Content from kotti.resources import Document from kotti.views.util import addable_types # A scenario where we can add multiple types to multiple folders: root = get_root() request = DummyRequest() with contents_addable(): # We should be able to add both to the child and to the parent: child = root['child'] = Document(title=u"Child") possible_parents, possible_types = addable_types(child, request) child_parent, root_parent = possible_parents self.assertEqual(child_parent['node'], child) self.assertEqual(root_parent['node'], root) self.assertEqual(child_parent['factories'], [Document, Content]) self.assertEqual(root_parent['factories'], [Document, Content]) document_info, node_info = possible_types self.assertEqual(document_info['factory'], Document) self.assertEqual(node_info['factory'], Content) self.assertEqual(document_info['nodes'], [child, root]) self.assertEqual(node_info['nodes'], [child, root])
def test_multiple_types(self): from kotti.views.util import addable_types # Test a scenario where we may add multiple types to a folder: root = get_root() request = DummyRequest() with contents_addable(): # We should be able to add both Nodes and Documents now: possible_parents, possible_types = addable_types(root, request) self.assertEqual(len(possible_parents), 1) self.assertEqual(possible_parents[0]['factories'], [Document, Content]) document_info, node_info = possible_types self.assertEqual(document_info['factory'], Document) self.assertEqual(node_info['factory'], Content) self.assertEqual(document_info['nodes'], [root]) self.assertEqual(node_info['nodes'], [root])
def test_multiple_types(self): from kotti.views.util import addable_types # Test a scenario where we may add multiple types to a folder: session = DBSession() root = session.query(Node).get(1) request = testing.DummyRequest() with nodes_addable(): # We should be able to add both Nodes and Documents now: possible_parents, possible_types = addable_types(root, request) self.assertEqual(len(possible_parents), 1) self.assertEqual(possible_parents[0]['factories'], [Document, Node]) document_info, node_info = possible_types self.assertEqual(document_info['factory'], Document) self.assertEqual(node_info['factory'], Node) self.assertEqual(document_info['nodes'], [root]) self.assertEqual(node_info['nodes'], [root])
def test_multiple_parents_and_types(self): from kotti.views.util import addable_types # A scenario where we can add multiple types to multiple folders: session = DBSession() root = session.query(Node).get(1) request = testing.DummyRequest() with nodes_addable(): # We should be able to add both to the child and to the parent: child = root['child'] = Document(title=u"Child") possible_parents, possible_types = addable_types(child, request) child_parent, root_parent = possible_parents self.assertEqual(child_parent['node'], child) self.assertEqual(root_parent['node'], root) self.assertEqual(child_parent['factories'], [Document, Node]) self.assertEqual(root_parent['factories'], [Document, Node]) document_info, node_info = possible_types self.assertEqual(document_info['factory'], Document) self.assertEqual(node_info['factory'], Node) self.assertEqual(document_info['nodes'], [child, root]) self.assertEqual(node_info['nodes'], [child, root])
def add_node(context, request): """This view's responsibility is to present the user with a form where they can choose between locations to add to, and types of nodes to add, and redirect to the actual add form based on this information. """ all_types = configuration['kotti.available_types'] if request.POST: what, where = request.POST['what'], request.POST['where'] session = DBSession() what = [t for t in all_types if t.type_info.name == what][0] where = session.query(Node).get(int(where)) location = resource_url( where, request, what.type_info.add_view) return HTTPFound(location=location) possible_parents, possible_types = addable_types(context, request) if len(possible_parents) == 1 and len(possible_parents[0]['factories']) == 1: # Redirect to the add form straight away if there's only one # choice of parents and addable types: parent = possible_parents[0] add_view = parent['factories'][0].type_info.add_view location = resource_url(parent['node'], request, add_view) return HTTPFound(location=location) # Swap first and second possible parents if there's no content in # 'possible_parents[0]' yet. This makes the parent then the # default choice in the form: api = TemplateAPIEdit(context, request) if not api.list_children() and len(possible_parents) > 1: possible_parents[0], possible_parents[1] = ( possible_parents[1], possible_parents[0]) return { 'api': api, 'possible_parents': possible_parents, 'possible_types': possible_types, }