Exemplo n.º 1
0
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()
Exemplo n.º 2
0
    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."]
Exemplo n.º 3
0
    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
Exemplo n.º 4
0
    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.",
        ]
Exemplo n.º 5
0
    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.']
Exemplo n.º 6
0
    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.']
Exemplo n.º 7
0
 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
Exemplo n.º 8
0
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()
Exemplo n.º 9
0
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()
Exemplo n.º 10
0
    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
Exemplo n.º 11
0
    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
Exemplo n.º 12
0
 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
Exemplo n.º 13
0
    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)
Exemplo n.º 14
0
    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]
Exemplo n.º 15
0
 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)
Exemplo n.º 16
0
    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]
Exemplo n.º 17
0
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/'
Exemplo n.º 18
0
    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
Exemplo n.º 19
0
    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
Exemplo n.º 20
0
    def make_document(root):
        from kotti import DBSession
        from kotti.resources import Document

        content = root["document"] = Document()
        DBSession.flush()
        DBSession.refresh(content)
        return content
Exemplo n.º 21
0
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
Exemplo n.º 22
0
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()
Exemplo n.º 23
0
    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]
Exemplo n.º 24
0
    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
Exemplo n.º 25
0
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'])
Exemplo n.º 26
0
    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."]
Exemplo n.º 27
0
 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)]
Exemplo n.º 28
0
 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)]
Exemplo n.º 29
0
    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
Exemplo n.º 30
0
    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