def test__is_valid_view(self, root, config):

        config.add_view(
            context=IContent,
            name='folder_view',
            permission='view',
            renderer='kotti:templates/view/folder.pt',
        )

        context = root
        request = DummyRequest()

        view = DefaultViewSelection(context, request)

        assert view._is_valid_view("folder_view") is True
        assert view._is_valid_view("foo") is False
    def test__is_valid_view(self, root, config):

        config.add_view(
            context=IContent,
            name='folder_view',
            permission='view',
            renderer='kotti:templates/view/folder.pt',
        )

        context = root
        request = DummyRequest()

        view = DefaultViewSelection(context, request)

        assert view._is_valid_view("folder_view") is True
        assert view._is_valid_view("foo") is False
Esempio n. 3
0
    def test_warning_for_non_registered_views(self, root):

        with warnings.catch_warnings(record=True) as w:

            DefaultViewSelection(root, DummyRequest()).default_view_selector()

            assert len(w) == 1
            assert issubclass(w[-1].category, UserWarning)
            assert str(w[-1].message) == "No view called 'folder_view' is registered for <Document 1 at />."  # noqa
    def test_default_views(self, root, config):
        config.add_view(
            context=IContent,
            name='folder_view',
            permission='view',
            renderer='kotti:templates/view/folder.pt',
            )

        context = root
        request = DummyRequest()

        view = DefaultViewSelection(context, request)

        sviews = view.default_view_selector()

        assert 'selectable_default_views' in sviews

        # the root should have at least the default view and the folder_view
        assert len(sviews['selectable_default_views']) > 1

        # the first view is always the default view
        assert sviews['selectable_default_views'][0]['is_current'] is True
        assert sviews['selectable_default_views'][0]['name'] == 'default'
        assert sviews['selectable_default_views'][0]['title'] == 'Default view'

        assert sviews['selectable_default_views'][1]['is_current'] is False

        # set the default view to folder_view view
        request = DummyRequest(GET={'view_name': 'folder_view'})
        view = DefaultViewSelection(context, request)

        assert type(view.set_default_view()) == HTTPFound
        assert context.default_view == 'folder_view'

        # set back to default
        request = DummyRequest(GET={'view_name': 'default'})
        view = DefaultViewSelection(context, request)

        assert type(view.set_default_view()) == HTTPFound
        assert context.default_view is None

        # try to set non existing view
        request = DummyRequest(GET={'view_name': 'nonexisting'})
        view = DefaultViewSelection(context, request)

        assert type(view.set_default_view()) == HTTPFound
        assert context.default_view is None
Esempio n. 5
0
    def test_default_views(self, root, config):
        config.add_view(
            context=IContent,
            name="folder_view",
            permission="view",
            renderer="kotti:templates/view/folder.pt",
        )

        context = root
        request = DummyRequest()

        view = DefaultViewSelection(context, request)

        sviews = view.default_view_selector()

        assert "selectable_default_views" in sviews

        # the root should have at least the default view and the folder_view
        assert len(sviews["selectable_default_views"]) > 1

        # the first view is always the default view
        assert sviews["selectable_default_views"][0]["is_current"] is True
        assert sviews["selectable_default_views"][0]["name"] == "default"
        assert sviews["selectable_default_views"][0]["title"] == "Default view"

        assert sviews["selectable_default_views"][1]["is_current"] is False

        # set the default view to folder_view view
        request = DummyRequest(GET={"view_name": "folder_view"})
        view = DefaultViewSelection(context, request)

        assert type(view.set_default_view()) == HTTPFound
        assert context.default_view == "folder_view"

        # set back to default
        request = DummyRequest(GET={"view_name": "default"})
        view = DefaultViewSelection(context, request)

        assert type(view.set_default_view()) == HTTPFound
        assert context.default_view is None

        # try to set non existing view
        request = DummyRequest(GET={"view_name": "nonexisting"})
        view = DefaultViewSelection(context, request)

        assert type(view.set_default_view()) == HTTPFound
        assert context.default_view is None
Esempio n. 6
0
    def test_default_views(self, root, config):
        config.add_view(
            context=IContent,
            name='folder_view',
            permission='view',
            renderer='kotti:templates/view/folder.pt',
        )

        context = root
        request = DummyRequest()

        view = DefaultViewSelection(context, request)

        sviews = view.default_view_selector()

        assert 'selectable_default_views' in sviews

        # the root should have at least the default view and the folder_view
        assert len(sviews['selectable_default_views']) > 1

        # the first view is always the default view
        assert sviews['selectable_default_views'][0]['is_current'] is True
        assert sviews['selectable_default_views'][0]['name'] == 'default'
        assert sviews['selectable_default_views'][0]['title'] == 'Default view'

        assert sviews['selectable_default_views'][1]['is_current'] is False

        # set the default view to folder_view view
        request = DummyRequest(GET={'view_name': 'folder_view'})
        view = DefaultViewSelection(context, request)

        assert type(view.set_default_view()) == HTTPFound
        assert context.default_view == 'folder_view'

        # set back to default
        request = DummyRequest(GET={'view_name': 'default'})
        view = DefaultViewSelection(context, request)

        assert type(view.set_default_view()) == HTTPFound
        assert context.default_view is None

        # try to set non existing view
        request = DummyRequest(GET={'view_name': 'nonexisting'})
        view = DefaultViewSelection(context, request)

        assert type(view.set_default_view()) == HTTPFound
        assert context.default_view is None
Esempio n. 7
0
def relational_metadata(obj, request, get_user=True,
                        get_type_info=True,
                        get_permissions=True,
                        get_extra_info=True):
    # some of this is just to mimick templates
    relmeta = dict()
    api = JSONTemplateAPI(obj, request)
    if get_user:
        relmeta['current_user'] = serialize_user(obj, request, api=api)

    if get_type_info:
        # type info
        type_info = dict()
        for attr in ['selectable_default_views', 'title', 'name',
                     'addable_to', 'add_permission']:
            type_info[attr] = getattr(obj.type_info, attr)
        if type_info['name'] == 'Image':
            for span in ['span1', 'span4']:
                key = 'image_%s_url' % span
                type_info[key] = request.resource_url(obj, 'image', span)
        relmeta['type_info'] = type_info

    if get_permissions:
        # permissions
        has_permission = dict()
        for key in ['add', 'edit', 'state_change']:
            has_permission[key] = bool(api.has_permission(key).boolval)
        has_permission['admin'] = bool(
            api.has_permission('admin', api.root).boolval)
        relmeta['has_permission'] = has_permission
        

    if not get_extra_info:
        return relmeta
    
    # for top navbar
    navitems = list()
    for item in api.list_children(api.navigation_root):
        if item.in_navigation:
            idata = dict(inside=api.inside(obj, item),
                         url=api.url(item),
                         path=api.path(item),
                         description=item.description,
                         title=item.title)
            navitems.append(idata)
    relmeta['navitems'] = navitems



    relmeta['application_url'] = request.application_url
    relmeta['site_title'] = api.site_title
    relmeta['root_url'] = api.url(api.root)
    
    # for edit bar
    wf = get_workflow(obj, request)
    if wf['current_state'] is not None:
        if 'callback' in wf['current_state'].get('data', dict()):
            del wf['current_state']['data']['callback']
        for state in wf['states']:
            sdata = wf['states'][state].get('data', dict())
            if 'callback' in sdata:
                del sdata['callback']
    relmeta['workflow'] = wf
    relmeta['request_url'] = request.url
    relmeta['api_url'] = api.url()
    
    edit_links = list()
    link_parent = None
    for link in api.edit_links:
        if type(link) is not LinkParent:
            link_info = get_link_info(link, obj, request)
            path = api.path(obj, request)
            resource, command = os.path.split(path)
            link_info['resource'] = resource
            link_info['command'] = command
            edit_links.append(link_info)
        else:
            link_parent = handle_link_parent(link, obj, request, api)
    relmeta['edit_links'] =  edit_links
    relmeta['link_parent'] = link_parent
    
    dfs = DefaultViewSelection(obj, request)
    key = 'selectable_default_views'
    relmeta[key] = dfs.default_view_selector()[key]
    del dfs
    del key
    
    
    # add-dropdown
    factories = get_content_type_factories(obj, request)['factories']
    flist = list()
    for f in factories:
        path = api.path(obj, f.type_info.add_view)
        flist.append(dict(
            url=api.url(obj, f.type_info.add_view),
            resource=os.path.dirname(path),
            command=os.path.basename(path),
            title=f.type_info.title,
            ))
    relmeta['content_type_factories'] = flist
    relmeta['upload_url'] = api.url(obj, 'upload')

    # site_setup_linke
    site_setup_links = list()
    for link in api.site_setup_links:
        site_setup_links.append(get_link_info(link, obj, request))
    # FIXME this fixes a problem where a plugin seems to define an
    # extra settings link
    site_setup_urls = list()
    setup_links = list()
    for link in site_setup_links:
        if link['url'] not in site_setup_urls:
            site_setup_urls.append(link['url'])
            setup_links.append(link)
    relmeta['site_setup_links'] = setup_links

    
    relmeta['navigate_url'] = api.url(obj, '@@navigate')
    relmeta['logout_url'] = api.url(api.root, '@@logout',
                                       query=dict(came_from=request.url))

    # page content
    relmeta['has_location_context'] = api.is_location(obj)
    relmeta['view_needed'] = api.view_needed

    breadcrumbs = list()
    for bc in api.breadcrumbs:
        breadcrumbs.append(dict(id=bc.id,
                                name=bc.name,
                                description=bc.description,
                                url=api.url(bc),
                                path=api.path(bc),
                                title=bc.title))
    relmeta['breadcrumbs'] = breadcrumbs

    lineage = list()
    for node in api.lineage:
        lineage.append(dict(id=node.id,
                            name=node.name,
                            description=node.description,
                            url=api.url(node),
                            path=api.path(node),
                            title=node.title))
    relmeta['lineage'] = lineage
    # FIXME - do this client side
    #http://stackoverflow.com/questions/3705670/best-way-to-create-a-reversed-list-in-python
    #relmeta['lineage_reversed'] = lineage[::-1]
    
    # FIXME figure out what to do about page_slots
    #relmeta['page_slots'] = api.slots
    relmeta['paths'] = {
        'this_path': request.resource_path(obj),
        'child_paths': [request.resource_path(child)
                        for child in obj.children_with_permission(request)],
        'childnames': [child.__name__
                       for child in obj.children_with_permission(request)],
    }
    
    

    # contents_buttons
    cbuttons = [get_button_info(b, obj, request)
                for b in get_contents_buttons(obj, request)]
    relmeta['contents_buttons'] = cbuttons

    return relmeta
Esempio n. 8
0
def relational_metadata(obj, request):
    # some of this is just to mimick templates
    relmeta = dict()
    api = TemplateAPI(obj, request)
    
    navitems = list()
    for item in api.list_children(api.navigation_root):
        if item.in_navigation:
            idata = dict(inside=api.inside(obj, item),
                        url=api.url(item),
                        description=item.description,
                        title=item.title)
            navitems.append(idata)
    relmeta['navitems'] = navitems

    # type info
    type_info = dict()
    for attr in ['selectable_default_views', 'title',
                 'addable_to', 'add_permission']:
        type_info[attr] = getattr(obj.type_info, attr)
    relmeta['type_info'] = type_info

    # permissions
    has_permission = dict()
    for key in ['add', 'edit', 'state_change']:
        has_permission[key] = bool(api.has_permission(key).boolval)
    has_permission['admin'] = bool(api.has_permission('admin', api.root).boolval)
    relmeta['has_permission'] = has_permission
        

    # for top navbar
    relmeta['application_url'] = request.application_url
    relmeta['site_title'] = api.site_title
    relmeta['root_url'] = api.url(api.root)
    
    # for edit bar
    wf = get_workflow(obj, request)
    if wf['current_state'] is not None:
        if 'callback' in wf['current_state'].get('data', dict()):
            del wf['current_state']['data']['callback']
        for state in wf['states']:
            sdata = wf['states'][state].get('data', dict())
            if 'callback' in sdata:
                del sdata['callback']
    relmeta['workflow'] = wf
    relmeta['request_url'] = request.url
    relmeta['api_url'] = api.url()
    
    edit_links = list()
    link_parent = None
    for link in api.edit_links:
        if type(link) is not LinkParent:
            edit_links.append(get_link_info(link, obj, request))
        else:
            link_parent = handle_link_parent(link, obj, request)
    relmeta['edit_links'] =  edit_links
    relmeta['link_parent'] = link_parent
    
    dfs = DefaultViewSelection(obj, request)
    key = 'selectable_default_views'
    relmeta[key] = dfs.default_view_selector()[key]
    del dfs
    del key
    
    
    # add-dropdown
    factories = get_content_type_factories(obj, request)['factories']
    flist = list()
    for f in factories:
        flist.append(dict(
            url=api.url(obj, f.type_info.add_view),
            title=f.type_info.title,
            ))
    relmeta['content_type_factories'] = flist
    relmeta['upload_url'] = api.url(obj, 'upload')

    # site_setup_linke
    site_setup_links = list()
    for link in api.site_setup_links:
        site_setup_links.append(get_link_info(link, obj, request))
    # FIXME this fixes a problem where a plugin seems to define an
    # extra settings link
    site_setup_urls = list()
    setup_links = list()
    for link in site_setup_links:
        if link['url'] not in site_setup_urls:
            site_setup_urls.append(link['url'])
            setup_links.append(link)
    relmeta['site_setup_links'] = setup_links

    
    relmeta['navigate_url'] = api.url(obj, '@@navigate')
    relmeta['logout_url'] = api.url(api.root, '@@logout',
                                       query=dict(came_from=request.url))

    # page content
    relmeta['has_location_context'] = api.is_location(obj)
    relmeta['view_needed'] = api.view_needed

    breadcrumbs = list()
    for bc in api.breadcrumbs:
        breadcrumbs.append(dict(id=bc.id,
                                name=bc.name,
                                description=bc.description,
                                url=api.url(bc),
                                title=bc.title))
    relmeta['breadcrumbs'] = breadcrumbs
    
    # FIXME figure out what to do about page_slots
    #relmeta['page_slots'] = api.slots
    relmeta['paths'] = {
        'this_path': request.resource_path(obj),
        'child_paths': [request.resource_path(child)
                        for child in obj.children_with_permission(request)],
        'childnames': [child.__name__
                       for child in obj.children_with_permission(request)],
    }
    
    relmeta['current_user'] = serialize_user(obj, request, api=api)
    
    #import pdb ; pdb.set_trace()
    return relmeta
    def test_default_views(self, root, config):
        config.add_view(
            context=IContent,
            name="folder_view",
            permission="view",
            renderer="kotti:templates/view/folder.pt",
        )

        context = root
        request = DummyRequest()

        view = DefaultViewSelection(context, request)

        sviews = view.default_view_selector()

        assert "selectable_default_views" in sviews

        # the root should have at least the default view and the folder_view
        assert len(sviews["selectable_default_views"]) > 1

        # the first view is always the default view
        assert sviews["selectable_default_views"][0]["is_current"] is True
        assert sviews["selectable_default_views"][0]["name"] == "default"
        assert sviews["selectable_default_views"][0]["title"] == "Default view"

        assert sviews["selectable_default_views"][1]["is_current"] is False

        # set the default view to folder_view view
        request = DummyRequest(GET={"view_name": "folder_view"})
        view = DefaultViewSelection(context, request)

        assert type(view.set_default_view()) == HTTPFound
        assert context.default_view == "folder_view"

        # set back to default
        request = DummyRequest(GET={"view_name": "default"})
        view = DefaultViewSelection(context, request)

        assert type(view.set_default_view()) == HTTPFound
        assert context.default_view is None

        # try to set non existing view
        request = DummyRequest(GET={"view_name": "nonexisting"})
        view = DefaultViewSelection(context, request)

        assert type(view.set_default_view()) == HTTPFound
        assert context.default_view is None
Esempio n. 10
0
def test_news_item_list_views(db_session, dummy_request):

    root = get_root()
    d = date.today()

    # Add some news items
    for i in range(10):

        n = NewsItem(
            title=u"News Item %s Title" % (i + 1),
            description=u"News Item %s description" % (i + 1),
            )

        if i == 9:
            # Set date to future for the last news item
            # this will fail in leap years on february 29th, which is acceptable
            # as this is only a test.
            n.publish_date = date(d.year + 1, d.month, d.day)
        else:
            # Set date to random year in the past
            n.publish_date = date(d.year - randint(0, 100), d.month, d.day)

        root["news_item_%s" % (i + 1)] = n
        db_session.add(n)
        db_session.flush()

    dummy_request.registry.settings['kotti_newsitem.widget.num_news'] = 4
    view = NewsItemListViews(root, dummy_request)

    assert len(view.news_items()) == 9
    assert len(view.news_items(5)) == 5

    assert len(view.all_news()['items']) == 9
    assert len(view.recent_news()['items']) == 4

    # Test order
    d = date.today()
    for n in view.news_items():
        assert n.publish_date <= d
        d = n.publish_date

    dummy_request.registry.settings['kotti_newsitem.num_news'] = 4

    assert len(view.news_listing()['items']) == 4

    root['news'] = Document(title=u'News')

    # What default views should be, and indeed are that in interactive
    # testing:
    #
    # default_views = [('default', u'Default view'),
    #                  ('folder_view', u'Folder view'),
    #                  ('news_listing', u'News Listing'), ]
    #
    # The assert below fails because it shows as a list with duplicated News
    # Listing items (second item should not be News Listing):
    #
    #    [('default', u'Default view'),
    #     ('news_listing', u'News Listing'),
    #     ('news_listing', u'News Listing'), ]
    #
    # assert root['news'].type_info.selectable_default_views == default_views

    request = DummyRequest(GET={'view_name': 'news_listing'})
    default_view = DefaultViewSelection(root["news"], request)
    assert type(default_view.set_default_view()) == HTTPFound

    view = NewsItemListViews(root['news'], dummy_request)
    assert len(view.news_listing()['items']) == 4