def populate(): """ Create the root node (:class:`~kotti.resources.Document`) and the 'about' subnode in the nodes tree if there are no nodes yet. """ lrm = LocalizerRequestMixin() lrm.registry = get_current_registry() # noinspection PyPropertyAccess lrm.locale_name = get_settings()["pyramid.default_locale_name"] localizer = lrm.localizer if DBSession.query(Node.id).count() == 0: localized_root_attrs = { k: localizer.translate(v) for k, v in _ROOT_ATTRS.items() } root = Document(**localized_root_attrs) root.__acl__ = SITE_ACL DBSession.add(root) localized_about_attrs = { k: localizer.translate(v) for k, v in _ABOUT_ATTRS.items() } root["about"] = Document(**localized_about_attrs) wf = get_workflow(root) if wf is not None: DBSession.flush() # Initializes workflow wf.transition_to_state(root, None, "public") populate_users()
def test_multi_rename(self, root): from kotti.resources import Document from kotti.views.edit.actions import NodeActions self.setUp() root["child1"] = Document(title="Child 1") root["child2"] = Document(title="Child 2") request = DummyRequest() request.POST = MultiDict() id1 = str(root["child1"].id) id2 = str(root["child2"].id) request.POST.add("children-to-rename", id1) request.POST.add("children-to-rename", id2) request.POST.add(id1 + "-name", "") request.POST.add(id1 + "-title", "Unhappy Child") request.POST.add(id2 + "-name", "happy-child") request.POST.add(id2 + "-title", "") request.POST.add("rename_nodes", "rename_nodes") NodeActions(root, request).rename_nodes() assert request.session.pop_flash("error") == ["Name and title are required."] request.POST.add(id1 + "-name", "unhappy-child") request.POST.add(id1 + "-title", "Unhappy Child") request.POST.add(id2 + "-name", "happy-child") request.POST.add(id2 + "-title", "Happy Child") request.POST.add("rename_nodes", "rename_nodes") NodeActions(root, request).rename_nodes() assert request.session.pop_flash("success") == ["Your changes have been saved."]
def test_set_modification_date(self, root, db_session, events): from time import sleep from kotti.resources import Document # create 2 documents d1 = root['d1'] = Document(title='One') d2 = root['d2'] = Document(title='Two') assert d1.position == 0 assert d2.position == 1 db_session.flush() md1 = d1.modification_date md2 = d2.modification_date # changing positions should not update modification_date sleep(1) d1.position = 1 d2.position = 0 db_session.flush() assert d1.position == 1 assert d2.position == 0 assert d1.modification_date == md1 assert d2.modification_date == md2 # changing anything else should update modification_date d1.title = 'Eins' d2.title = 'Zwei' db_session.flush() assert d1.modification_date != md1 assert d2.modification_date != md2
def test_multi_delete(self, root): from kotti.resources import Document from kotti.resources import File from kotti.views.edit.actions import NodeActions root["child1"] = Document(title="Child 1") root["child2"] = Document(title="Child 2") root["file1"] = File(title="File 1") request = DummyRequest() request.POST = MultiDict() id1 = str(root["child1"].id) id2 = str(root["child2"].id) id3 = str(root["file1"].id) request.POST.add("delete_nodes", "delete_nodes") NodeActions(root, request).delete_nodes() assert request.session.pop_flash("info") == ["Nothing was deleted."] request.POST.add("children-to-delete", id1) request.POST.add("children-to-delete", id2) request.POST.add("children-to-delete", id3) NodeActions(root, request).delete_nodes() assert request.session.pop_flash("success") == [ "${title} was deleted.", "${title} was deleted.", "${title} was deleted.", ]
def test_multi_rename(self, root): from kotti.resources import Document from kotti.views.edit.actions import NodeActions self.setUp() root['child1'] = Document(title="Child 1") root['child2'] = Document(title="Child 2") request = DummyRequest() request.POST = MultiDict() id1 = str(root['child1'].id) id2 = str(root['child2'].id) request.POST.add('children-to-rename', id1) request.POST.add('children-to-rename', id2) request.POST.add(id1 + '-name', '') request.POST.add(id1 + '-title', 'Unhappy Child') request.POST.add(id2 + '-name', 'happy-child') request.POST.add(id2 + '-title', '') request.POST.add('rename_nodes', 'rename_nodes') NodeActions(root, request).rename_nodes() assert request.session.pop_flash('error') ==\ ['Name and title are required.'] request.POST.add(id1 + '-name', 'unhappy-child') request.POST.add(id1 + '-title', 'Unhappy Child') request.POST.add(id2 + '-name', 'happy-child') request.POST.add(id2 + '-title', 'Happy Child') request.POST.add('rename_nodes', 'rename_nodes') NodeActions(root, request).rename_nodes() assert request.session.pop_flash('success') ==\ ['Your changes have been saved.']
def test_multi_delete(self, root): from kotti.resources import Document from kotti.resources import File from kotti.views.edit.actions import NodeActions root['child1'] = Document(title="Child 1") root['child2'] = Document(title="Child 2") root['file1'] = File(title="File 1") request = DummyRequest() request.POST = MultiDict() id1 = str(root['child1'].id) id2 = str(root['child2'].id) id3 = str(root['file1'].id) request.POST.add('delete_nodes', 'delete_nodes') NodeActions(root, request).delete_nodes() assert request.session.pop_flash('info') ==\ ['Nothing was deleted.'] request.POST.add('children-to-delete', id1) request.POST.add('children-to-delete', id2) request.POST.add('children-to-delete', id3) NodeActions(root, request).delete_nodes() assert request.session.pop_flash('success') == \ ['${title} was deleted.', '${title} was deleted.', '${title} was deleted.']
def test_after_delete3(self, dummy_request): from kotti.resources import Document document1 = Document() document1.request = dummy_request document2 = Document() document2.request = dummy_request from kotti_es.sqla import _after_delete _after_delete(None, None, document1) _after_delete(None, None, document2) assert len(getattr(dummy_request, '_index_list')) == 2
def populate(): if DBSession.query(Node).count() == 0: root = Document(**_ROOT_ATTRS) root.__acl__ = SITE_ACL DBSession.add(root) root['about'] = Document(**_ABOUT_ATTRS) if DBSession.query(Settings).count() == 0: settings = Settings(data={'kotti.db_version': get_version()}) DBSession.add(settings) populate_users()
def populate(): if DBSession.query(Node).count() == 0: root = Document(**_ROOT_ATTRS) root.__acl__ = SITE_ACL DBSession.add(root) root['about'] = Document(**_ABOUT_ATTRS) wf = get_workflow(root) if wf is not None: DBSession.flush() # Initializes workflow wf.transition_to_state(root, None, u'public') populate_users()
def test_move_up(self, root): from kotti.resources import Document from kotti.views.edit.actions import NodeActions root["child1"] = Document(title="Child 1") root["child2"] = Document(title="Child 2") assert root["child1"].position < root["child2"].position request = DummyRequest() request.session["kotti.selected-children"] = [str(root["child2"].id)] NodeActions(root, request).up() assert request.session.pop_flash("success") == ["${title} was moved."] assert root["child1"].position > root["child2"].position
def test_move_up(self, root): from kotti.resources import Document from kotti.views.edit.actions import NodeActions root['child1'] = Document(title=u"Child 1") root['child2'] = Document(title=u"Child 2") assert root['child1'].position < root['child2'].position request = DummyRequest() request.session['kotti.selected-children'] = [str(root['child2'].id)] NodeActions(root, request).up() assert request.session.pop_flash('success') ==\ [u'${title} was moved.'] assert root['child1'].position > root['child2'].position
def make_document(self, root): from kotti.resources import Document doc = root['doc'] = Document() from kotti import DBSession DBSession.flush() DBSession.refresh(doc) return doc
def test_after_commit_delete(self, dummy_request): from kotti.resources import Document from kotti_es.sqla import _after_delete from kotti_es.sqla import _after_commit document = Document() document.request = dummy_request _after_delete(None, None, document) import mock with mock.patch('kotti_es.sqla.get_current_request') as \ get_current_request: get_current_request.return_value = dummy_request with mock.patch('kotti_es.sqla.get_client') as \ get_client: magic = mock.MagicMock() get_client.return_value = magic session = mock.Mock() session.configure_mock( **{ 'query.return_value.filter_by.' 'return_value.one.return_value': document }) _after_commit(session) magic.delete_object.assert_called_with(document, immediate=True)
def test_contenttypefactories_with_invalid_add_link(self, config): from kotti.resources import Document, File from kotti.resources import default_type_info from kotti.views.edit import content from kotti.views.edit.actions import content_type_factories class TestContent: type_info = default_type_info.copy( name="TestContent", title="Test Content", add_view=None, addable_to=["Document"], ) config.include(content) req = DummyRequest() root = Document("") with patch("kotti.views.edit.actions.get_settings") as gs: gs.return_value = {"kotti.available_types": [TestContent, Document, File]} res = content_type_factories(root, req) assert res["factories"] == [Document, File] TestContent.type_info.add_view = "add_document" res = content_type_factories(root, req) assert res["factories"] == [TestContent, Document, File]
def test_verify_adapter(self): from pyramid_es.interfaces import IElastic from kotti_es.elastic import BaseElasticKottiContent from zope.interface.verify import verifyObject from kotti.resources import Document adapter = BaseElasticKottiContent(Document()) assert verifyObject(IElastic, adapter)
def test_contenttypefactories_with_invalid_add_link(self, config): from kotti.resources import Document, File from kotti.resources import default_type_info from kotti.views.edit import content from kotti.views.edit.actions import content_type_factories class TestContent(object): type_info = default_type_info.copy( name='TestContent', title='Test Content', add_view=None, addable_to=['Document'], ) config.include(content) req = DummyRequest() root = Document('') with patch('kotti.views.edit.actions.get_settings') as gs: gs.return_value = {'kotti.available_types': [TestContent, Document, File]} res = content_type_factories(root, req) assert res['factories'] == [Document, File] TestContent.type_info.add_view = 'add_document' res = content_type_factories(root, req) assert res['factories'] == [TestContent, Document, File]
def test_populate_triggers_indexing(solr, db_session): get_root()['bar'] = Document(title=u'bar', description=u'blah!') db_session.flush() results = list(solr.query(title='bar')) assert len(results) == 1 assert results[0]['id'] == 'document-2' assert results[0]['description'] == u'blah!' assert results[0]['path'] == u'/bar/'
def make_document(self, root): from kotti import DBSession from kotti.resources import Document content = root['doc'] = Document(title=u'MyDocument') DBSession.flush() DBSession.refresh(content) return content
def make_document(self): from kotti import DBSession from kotti.resources import Document content = self.root['document'] = Document() DBSession.flush() DBSession.refresh(content) return content
def make_document(root): from kotti import DBSession from kotti.resources import Document content = root["document"] = Document() DBSession.flush() DBSession.refresh(content) return content
def test_tile_content_call(db_session, dummy_request, root): from kotti_grid.widget import tile_content from kotti.resources import Document root['doc1'] = Document(title=u'Tile Doc', description=u'I am the doc') content = tile_content(root, dummy_request, url='/doc1') # here we have to extend the config with our configurator assert content is None
def populate(): """ Create the root node (:class:`~kotti.resources.Document`) and the 'about' subnode in the nodes tree if there are no nodes yet. """ if DBSession.query(Node).count() == 0: root = Document(**_ROOT_ATTRS) root.__acl__ = SITE_ACL DBSession.add(root) root['about'] = Document(**_ABOUT_ATTRS) wf = get_workflow(root) if wf is not None: DBSession.flush() # Initializes workflow wf.transition_to_state(root, None, u'public') populate_users()
def test_contenttypefactories_add_links(self, config): from kotti.views.edit.actions import content_type_factories from kotti.resources import Document, File from kotti.views.edit import content config.include(content) res = content_type_factories(Document(''), DummyRequest()) assert res['factories'] == [Document, File]
def test_forbidden_view_webtest(self, root, webtest, db_session): from kotti.resources import Document root[u'doc'] = doc = Document(title=u'document') db_session.flush() assert doc.state == 'private' resp = webtest.get('/doc', headers={'Accept': '*/json'}, status=403) assert resp.status_code == 403 assert 'substancek_cms_theme' in resp.body
def test_add_document_triggers_indexing(solr, db_session, request): get_root()['doc'] = Document(title=u'foo', body=u'bar!', description=u'foo!') db_session.flush() results = list(solr.query(title='foo')) assert len(results) == 1 assert results[0]['id'] == u'document-2' assert results[0]['description'] == 'foo!' assert results[0]['path'] == request.resource_path(get_root()['doc'])
def test_rename_to_empty_name(self, root): from kotti.resources import Document from kotti.views.edit.actions import NodeActions child = root["child"] = Document(title="Child") request = DummyRequest() request.params["rename"] = "on" request.params["name"] = "" request.params["title"] = "foo" NodeActions(child, request).rename_node() assert request.session.pop_flash("error") == ["Name and title are required."]
def test_after_insert(self, dummy_request): from kotti.resources import Document document = Document() document.id = 1 document.request = dummy_request assert hasattr(document.request, '_index_list') is False from kotti_es.sqla import _after_insert_update from kotti_es.sqla import INSERT_CODE _after_insert_update(None, None, document) assert getattr(document.request, '_index_list') == [(document, document.id, INSERT_CODE)]
def test_after_delete2(self, dummy_request): from kotti.resources import Document document = Document() document.id = 1 document.request = dummy_request document.request._index_list = [] from kotti_es.sqla import _after_delete from kotti_es.sqla import DELETE_CODE _after_delete(None, None, document) assert getattr(document.request, '_index_list') == [(document, document.id, DELETE_CODE)]
def test_move_down(self, db_session): from kotti.resources import get_root from kotti.resources import Document from kotti.views.edit.actions import NodeActions root = get_root() root['child1'] = Document(title=u"Child 1") root['child2'] = Document(title=u"Child 2") root['child3'] = Document(title=u"Child 3") assert root['child1'].position < root['child3'].position assert root['child2'].position < root['child3'].position request = DummyRequest() ids = [str(root['child1'].id), str(root['child2'].id)] request.session['kotti.selected-children'] = ids NodeActions(root, request).down() assert request.session.pop_flash('success') ==\ [u'${title} moved.', u'${title} moved.'] assert root['child1'].position > root['child3'].position assert root['child2'].position > root['child3'].position
def test_special_chars_in_feed(self): from kotti_feed.views import rss_view from kotti.resources import Document, get_root root = get_root() request = DummyRequest() settings()['kotti_feed.content_types'] = 'document image' root['doc1'] = Document(title=u'L\xc3\xb6vely Document') feed = rss_view(request.context, request) assert u'L\xc3\xb6vely Document' in feed.text assert u'encoding="utf-8"' in feed.text