Example #1
0
def test_context_setters():
    h.set_context('test', 'wiki', neighborhood='Projects')
    assert c.project is not None
    assert c.app is not None
    cfg_id = c.app.config._id
    h.set_context('test', app_config_id=cfg_id, neighborhood='Projects')
    assert c.project is not None
    assert c.app is not None
    h.set_context('test', app_config_id=str(cfg_id), neighborhood='Projects')
    assert c.project is not None
    assert c.app is not None
    c.project = c.app = None
    with h.push_context('test', 'wiki', neighborhood='Projects'):
        assert c.project is not None
        assert c.app is not None
    assert c.project == c.app == None
    with h.push_context('test', app_config_id=cfg_id, neighborhood='Projects'):
        assert c.project is not None
        assert c.app is not None
    assert c.project == c.app == None
    with h.push_context('test', app_config_id=str(cfg_id), neighborhood='Projects'):
        assert c.project is not None
        assert c.app is not None
    assert c.project == c.app == None
    del c.project
    del c.app
    with h.push_context('test', app_config_id=str(cfg_id), neighborhood='Projects'):
        assert c.project is not None
        assert c.app is not None
    assert not hasattr(c, 'project')
    assert not hasattr(c, 'app')
def test_context_setters():
    h.set_context("test", "wiki", neighborhood="Projects")
    assert c.project is not None
    assert c.app is not None
    cfg_id = c.app.config._id
    h.set_context("test", app_config_id=cfg_id, neighborhood="Projects")
    assert c.project is not None
    assert c.app is not None
    h.set_context("test", app_config_id=str(cfg_id), neighborhood="Projects")
    assert c.project is not None
    assert c.app is not None
    c.project = c.app = None
    with h.push_context("test", "wiki", neighborhood="Projects"):
        assert c.project is not None
        assert c.app is not None
    assert c.project == c.app == None
    with h.push_context("test", app_config_id=cfg_id, neighborhood="Projects"):
        assert c.project is not None
        assert c.app is not None
    assert c.project == c.app == None
    with h.push_context("test", app_config_id=str(cfg_id), neighborhood="Projects"):
        assert c.project is not None
        assert c.app is not None
    assert c.project == c.app == None
    del c.project
    del c.app
    with h.push_context("test", app_config_id=str(cfg_id), neighborhood="Projects"):
        assert c.project is not None
        assert c.app is not None
    assert not hasattr(c, "project")
    assert not hasattr(c, "app")
Example #3
0
def test_macro_include_permissions():
    p_nbhd = M.Neighborhood.query.get(name='Projects')
    p_test = M.Project.query.get(shortname='test', neighborhood_id=p_nbhd._id)
    wiki = p_test.app_instance('wiki')
    wiki2 = p_test.app_instance('wiki2')
    with h.push_context(p_test._id, app_config_id=wiki.config._id):
        p = WM.Page.upsert(title='CanRead')
        p.text = 'Can see this!'
        p.commit()
        ThreadLocalORMSession.flush_all()

    with h.push_context(p_test._id, app_config_id=wiki2.config._id):
        role = M.ProjectRole.by_name('*anonymous')._id
        read_perm = M.ACE.allow(role, 'read')
        acl = c.app.config.acl
        if read_perm in acl:
            acl.remove(read_perm)
        p = WM.Page.upsert(title='CanNotRead')
        p.text = 'Can not see this!'
        p.commit()
        ThreadLocalORMSession.flush_all()

    with h.push_context(p_test._id, app_config_id=wiki.config._id):
        c.user = M.User.anonymous()
        md = '[[include ref=CanRead]]\n[[include ref=wiki2:CanNotRead]]'
        html = g.markdown_wiki.convert(md)
        assert_in('Can see this!', html)
        assert_not_in('Can not see this!', html)
        assert_in("[[include: you don't have a read permission for wiki2:CanNotRead]]", html)
Example #4
0
def test_hideawards_macro():
    p_nbhd = M.Neighborhood.query.get(name='Projects')

    app_config_id = ObjectId()
    award = M.Award(app_config_id=app_config_id)
    award.short = u'Award short'
    award.full = u'Award full'
    award.created_by_neighborhood_id = p_nbhd._id

    project = M.Project.query.get(
        neighborhood_id=p_nbhd._id, shortname=u'test')

    M.AwardGrant(
        award=award,
        award_url='http://award.org',
        comment='Winner!',
        granted_by_neighborhood=p_nbhd,
        granted_to_project=project)

    ThreadLocalORMSession.flush_all()

    with h.push_context(p_nbhd.neighborhood_project._id):
        r = g.markdown_wiki.convert('[[projects]]')
        assert_in('<div class="feature"> <a href="http://award.org" rel="nofollow" title="Winner!">'
                  'Award short</a> </div>',
                  squish_spaces(r))

        r = g.markdown_wiki.convert('[[projects show_awards_banner=False]]')
        assert_not_in('Award short', r)
Example #5
0
def test_app_globals():
    with h.push_context('test', 'wiki', neighborhood='Projects'):
        assert g.app_static(
            'css/wiki.css') == '/nf/_static_/wiki/css/wiki.css', g.app_static('css/wiki.css')
        assert g.url(
            '/foo', a='foo bar') == 'http://localhost/foo?a=foo+bar', g.url('/foo', a='foo bar')
        assert g.url('/foo') == 'http://localhost/foo', g.url('/foo')
 def test_merge_request(self):
     to_project = M.Project.query.get(shortname='test2', neighborhood_id=c.project.neighborhood_id)
     r = self.app.post('/src-hg/fork', params=dict(
         project_id=str(to_project._id),
         mount_point='code'))
     assert "{status: 'error'}" not in str(r.follow())
     cloned_from = c.app.repo
     with h.push_context('test2', 'code', neighborhood='Projects'):
         c.app.repo.init_as_clone(
                 cloned_from.full_fs_path,
                 cloned_from.app.config.script_name(),
                 cloned_from.full_fs_path)
     r = self.app.get('/p/test2/code/').follow().follow()
     assert 'Request Merge' in r
     # Request Merge button only visible to repo admins
     kw = dict(extra_environ=dict(username='******'))
     r = self.app.get('/p/test2/code/', **kw).follow(**kw).follow(**kw)
     assert 'Request Merge' not in r, r
     # Request merge controller action only permitted for repo admins
     r = self.app.get('/p/test2/code/request_merge', status=403, **kw)
     r = self.app.get('/p/test2/code/request_merge')
     assert 'Request merge' in r
     # Merge request detail view
     r = r.forms[0].submit().follow()
     assert 'would like you to merge' in r
     mr_num = r.request.url.split('/')[-2]
     # Merge request list view
     r = self.app.get('/p/test/src-hg/merge-requests/')
     assert 'href="%s/"' % mr_num in r
     # Merge request status update
     r = self.app.post('/p/test/src-hg/merge-requests/%s/save' % mr_num,
                       params=dict(status='rejected')).follow()
     assert 'Merge Request #%s:  (rejected)' % mr_num in r, r
    def test_ticket_move(self):
        app1 = c.project.app_instance('bugs')
        app2 = c.project.app_instance('bugs2')
        with h.push_context(c.project._id, app_config_id=app1.config._id):
            ticket = Ticket.new()
            ticket.summary = 'test ticket'
            ticket.description = 'test description'
            ticket.assigned_to_id = User.by_username('test-user')._id
            ticket.discussion_thread.add_post(text='test comment')

        assert_equal(Ticket.query.find({'app_config_id': app1.config._id}).count(), 1)
        assert_equal(Ticket.query.find({'app_config_id': app2.config._id}).count(), 0)
        assert_equal(Post.query.find(dict(thread_id=ticket.discussion_thread._id)).count(), 1)

        t = ticket.move(app2.config)
        assert_equal(Ticket.query.find({'app_config_id': app1.config._id}).count(), 0)
        assert_equal(Ticket.query.find({'app_config_id': app2.config._id}).count(), 1)
        assert_equal(t.summary, 'test ticket')
        assert_equal(t.description, 'test description')
        assert_equal(t.assigned_to.username, 'test-user')
        assert_equal(t.url(), '/p/test/bugs2/1/')

        post = Post.query.find(dict(thread_id=ticket.discussion_thread._id,
                                    text={'$ne': 'test comment'})).first()
        assert post is not None, 'No comment about ticket moving'
        message = 'Ticket moved from /p/test/bugs/1/'
        assert_equal(post.text, message)

        post = Post.query.find(dict(text='test comment')).first()
        assert_equal(post.thread.discussion_id, app2.config.discussion_id)
        assert_equal(post.thread.app_config_id, app2.config._id)
        assert_equal(post.app_config_id, app2.config._id)
    def test_ticket_move_with_different_custom_fields(self):
        app1 = c.project.app_instance('bugs')
        app2 = c.project.app_instance('bugs2')
        app1.globals.custom_fields.extend([
            {'name': '_test', 'type': 'string', 'label': 'Test field'},
            {'name': '_test2', 'type': 'string', 'label': 'Test field 2'}])
        app2.globals.custom_fields.append(
            {'name': '_test', 'type': 'string', 'label': 'Test field'})
        ThreadLocalORMSession.flush_all()
        ThreadLocalORMSession.close_all()
        with h.push_context(c.project._id, app_config_id=app1.config._id):
            ticket = Ticket.new()
            ticket.summary = 'test ticket'
            ticket.description = 'test description'
            ticket.custom_fields['_test'] = 'test val'
            ticket.custom_fields['_test2'] = 'test val 2'

        t = ticket.move(app2.config)
        assert_equal(t.summary, 'test ticket')
        assert_equal(t.description, 'test description')
        assert_equal(t.custom_fields['_test'], 'test val')
        post = Post.query.find(dict(thread_id=ticket.discussion_thread._id)).first()
        assert post is not None, 'No comment about ticket moving'
        message = 'Ticket moved from /p/test/bugs/1/'
        message += '\n\nCan\'t be converted:\n'
        message += '\n- **_test2**: test val 2'
        assert_equal(post.text, message)
    def test_ticket_move_with_users_not_in_project(self):
        app1 = c.project.app_instance('bugs')
        app2 = c.project.app_instance('bugs2')
        app1.globals.custom_fields.extend([
            {'name': '_user_field', 'type': 'user', 'label': 'User field'},
            {'name': '_user_field_2', 'type': 'user', 'label': 'User field 2'}])
        app2.globals.custom_fields.extend([
            {'name': '_user_field', 'type': 'user', 'label': 'User field'},
            {'name': '_user_field_2', 'type': 'user', 'label': 'User field 2'}])
        ThreadLocalORMSession.flush_all()
        ThreadLocalORMSession.close_all()
        from allura.websetup import bootstrap
        bootstrap.create_user('test-user-0')
        with h.push_context(c.project._id, app_config_id=app1.config._id):
            ticket = Ticket.new()
            ticket.summary = 'test ticket'
            ticket.description = 'test description'
            ticket.custom_fields['_user_field'] = 'test-user'  # in project
            ticket.custom_fields['_user_field_2'] = 'test-user-0'  # not in project
            ticket.assigned_to_id = User.by_username('test-user-0')._id  # not in project

        t = ticket.move(app2.config)
        assert_equal(t.assigned_to_id, None)
        assert_equal(t.custom_fields['_user_field'], 'test-user')
        assert_equal(t.custom_fields['_user_field_2'], '')
        post = Post.query.find(dict(thread_id=ticket.discussion_thread._id)).first()
        assert post is not None, 'No comment about ticket moving'
        message = 'Ticket moved from /p/test/bugs/1/'
        message += '\n\nCan\'t be converted:\n'
        message += '\n- **_user_field_2**: test-user-0 (user not in project)'
        message += '\n- **assigned_to**: test-user-0 (user not in project)'
        assert_equal(post.text, message)
Example #10
0
def main():
    args = arguments()

    c.user = M.User.query.get(username='******')

    with h.push_context(args.shortname, args.mountpt, neighborhood='Projects'):

        tool = c.project.app_config_by_tool_type(args.mountpt)

        # create tons of topics
        discussion = Forum.query.get(
            app_config_id=tool._id,
            shortname=args.forumname)

        for i in range(5000):
            subject = 'fake topic {}'.format(str(i))
            thd = discussion.thread_class()(discussion_id=discussion._id, subject=subject)
            # subj = str(uuid.uuid4())[:8]
            p = thd.post(subject, 'a new topic 2')

            for j in range(randint(1, 5)):
                new_post = {'text':'comment text'}
                # post = thd.add_post(**new_post)
                post = thd.add_post(text='comment text for real', subject="test subject")

            if i % 1000:
                session(p).flush()
    def test_milestone_status(self):
        """When importing, if all tickets in a milestone are closed, the
        milestone itself should also be closed.

        """
        here_dir = os.path.dirname(__file__)
        api_ticket = M.ApiTicket(user_id=c.user._id, capabilities={'import': ['Projects','test']},
                                 expires=datetime.utcnow() + timedelta(days=1))
        ming.orm.session(api_ticket).flush()
        self.set_api_token(api_ticket)

        doc_text = open(here_dir + '/data/milestone-tickets.json').read()
        r = self.api_post('/rest/p/test/bugs/perform_import', doc=doc_text,
            options='{"user_map": {"hinojosa4": "test-admin", "ma_boehm": "test-user"}}')
        assert r.json['status'], r.json

        ming.orm.ThreadLocalORMSession.flush_all()
        M.MonQTask.run_ready()
        ming.orm.ThreadLocalORMSession.flush_all()

        with h.push_context('test', mount_point='bugs', neighborhood='Projects'):
            for milestone_fld in c.app.globals.milestone_fields:
                milestone_names = [ms['name'] for ms in milestone_fld['milestones']]
                assert 'open_milestone' in milestone_names, milestone_names
                assert 'closed_milestone' in milestone_names, milestone_names
                for milestone in milestone_fld['milestones']:
                    if milestone['name'] == 'open_milestone':
                        assert milestone['complete'] == False
                    if milestone['name'] == 'closed_milestone':
                        assert milestone['complete'] == True
def test_macro_project_admins():
    user = M.User.by_username('test-admin')
    user.display_name = u'Test Ã…dmin <script>'
    with h.push_context('test', neighborhood='Projects'):
        r = g.markdown_wiki.convert('[[project_admins]]')
    assert_equal(
        r, u'<div class="markdown_content"><h6>Project Admins:</h6>\n<ul class="md-users-list">\n<li><a href="/u/test-admin/">Test \xc5dmin &lt;script&gt;</a></li>\n</ul>\n</div>')
Example #13
0
def test_macro_neighborhood_feeds():
    p_nbhd = M.Neighborhood.query.get(name='Projects')
    p_test = M.Project.query.get(shortname='test', neighborhood_id=p_nbhd._id)
    with h.push_context('--init--', 'wiki', neighborhood='Projects'):
        r = g.markdown_wiki.convert('[[neighborhood_feeds tool_name=wiki]]')
        assert 'Home modified by' in r, r
        orig_len = len(r)
        # Make project private & verify we don't see its new feed items
        anon = M.User.anonymous()
        p_test.acl.insert(0, M.ACE.deny(
            M.ProjectRole.anonymous(p_test)._id, 'read'))
        ThreadLocalORMSession.flush_all()
        pg = WM.Page.query.get(title='Home', app_config_id=c.app.config._id)
        pg.text = 'Change'
        with h.push_config(c, user=M.User.by_username('test-admin')):
            pg.commit()
        r = g.markdown_wiki.convert('[[neighborhood_feeds tool_name=wiki]]')
        new_len = len(r)
        assert new_len == orig_len
        p = BM.BlogPost(title='test me',
                        neighborhood_id=p_test.neighborhood_id)
        p.text = 'test content'
        p.state = 'published'
        p.make_slug()
        with h.push_config(c, user=M.User.by_username('test-admin')):
            p.commit()
        ThreadLocalORMSession.flush_all()
        with h.push_config(c, user=anon):
            r = g.markdown_wiki.convert('[[neighborhood_blog_posts]]')
        assert 'test content' in r
Example #14
0
    def test_export_with_attachments(self):
        project = M.Project.query.get(shortname='test')
        blog = project.app_instance('blog')
        with h.push_context('test', 'blog', neighborhood='Projects'):
            post = BM.BlogPost.new(
                title='Test title',
                text='test post',
                labels=['the firstlabel', 'the second label'],
                delete=None
            )
            ThreadLocalORMSession.flush_all()
            test_file1 = FieldStorage()
            test_file1.name = 'file_info'
            test_file1.filename = 'test_file'
            test_file1.file = StringIO('test file1\n')
            p = post.discussion_thread.add_post(text='test comment')
            p.add_multiple_attachments(test_file1)
            ThreadLocalORMSession.flush_all()
        f = tempfile.TemporaryFile()
        temp_dir = tempfile.mkdtemp()
        blog.bulk_export(f, temp_dir, True)
        f.seek(0)
        blog = json.loads(f.read())
        blog['posts'] = sorted(
            blog['posts'], key=lambda x: x['title'], reverse=True)

        file_path = 'blog/{}/{}/{}/test_file'.format(
            post._id,
            post.discussion_thread._id,
            list(post.discussion_thread.post_class().query.find())[0].slug
        )
        assert_equal(blog['posts'][0]['discussion_thread']['posts'][0]
                     ['attachments'][0]['path'], file_path)
        assert os.path.exists(os.path.join(temp_dir, file_path))
Example #15
0
 def setUp(self):
     super(TestFork, self).setUp()
     to_project = M.Project.query.get(
         shortname='test2', neighborhood_id=c.project.neighborhood_id)
     r = self.app.post('/src-git/fork', params=dict(
         project_id=str(to_project._id),
         mount_point='code',
         mount_label='Test forked repository'))
     assert "{status: 'error'}" not in str(r.follow())
     cloned_from = c.app.repo
     with h.push_context('test2', 'code', neighborhood='Projects'):
         c.app.repo.init_as_clone(
             cloned_from.full_fs_path,
             cloned_from.app.config.script_name(),
             cloned_from.full_fs_path)
         # Add commit to a forked repo, thus merge requests will not be empty
         # clone repo to tmp location first (can't add commit to bare repos
         # directly)
         clone_path = tempfile.mkdtemp()
         cloned = c.app.repo._impl._git.clone(clone_path)
         with open(clone_path + '/README', 'w+') as f:
             f.write('Very useful README')
         cloned.index.add(['README'])
         cloned.index.commit('Improve documentation')
         cloned.remotes[0].push()
         c.app.repo.refresh()
         self.forked_repo = c.app.repo
         shutil.rmtree(clone_path, ignore_errors=True)
Example #16
0
def test_app_globals():
    g.oid_session()
    g.oid_session()
    with h.push_context("test", "wiki", neighborhood="Projects"):
        assert g.app_static("css/wiki.css") == "/nf/_static_/wiki/css/wiki.css", g.app_static("css/wiki.css")
        assert g.url("/foo", a="foo bar") == "http://localhost:80/foo?a=foo+bar", g.url("/foo", a="foo bar")
        assert g.url("/foo") == "http://localhost:80/foo", g.url("/foo")
Example #17
0
    def test_bulk_export(self):
        # Clear out some context vars, to properly simulate how this is run from the export task
        # Besides, it's better not to need c context vars
        c.app = c.project = None

        project = M.Project.query.get(shortname='test')
        blog = project.app_instance('blog')
        with h.push_context('test', 'blog', neighborhood='Projects'):
            post = BM.BlogPost()
            post.title = 'Test title'
            post.text = 'test post'
            post.labels = ['the firstlabel', 'the second label']
            post.make_slug()
            post.commit()
            post.discussion_thread.add_post(text='test comment')
            post2 = BM.BlogPost()
            post2.title = 'Test2 title'
            post2.text = 'test2 post'
            post2.make_slug()
            post2.commit()

        f = tempfile.TemporaryFile()
        blog.bulk_export(f)
        f.seek(0)
        blog = json.loads(f.read())
        blog['posts'] = sorted(
            blog['posts'], key=lambda x: x['title'], reverse=True)
        assert_equal(blog['posts'][0]['title'], 'Test2 title')
        assert_equal(blog['posts'][0]['text'], 'test2 post')
        assert_equal(blog['posts'][1]['title'], 'Test title')
        assert_equal(blog['posts'][1]['text'], 'test post')
        assert_equal(blog['posts'][1]['labels'],
                     ['the firstlabel', 'the second label'])
        assert_equal(blog['posts'][1]['discussion_thread']
                     ['posts'][0]['text'], 'test comment')
Example #18
0
def test_sort_alpha():
    p_nbhd = M.Neighborhood.query.get(name='Projects')

    with h.push_context(p_nbhd.neighborhood_project._id):
        r = g.markdown_wiki.convert('[[projects sort=alpha]]')
        project_list = get_project_names(r)
        assert project_list == sorted(project_list)
Example #19
0
def test_macro_include_extra_br():
    p_nbhd = M.Neighborhood.query.get(name="Projects")
    p_test = M.Project.query.get(shortname="test", neighborhood_id=p_nbhd._id)
    wiki = p_test.app_instance("wiki")
    with h.push_context(p_test._id, app_config_id=wiki.config._id):
        p = WM.Page.upsert(title="Include_1")
        p.text = "included page 1"
        p.commit()
        p = WM.Page.upsert(title="Include_2")
        p.text = "included page 2"
        p.commit()
        p = WM.Page.upsert(title="Include_3")
        p.text = "included page 3"
        p.commit()
        ThreadLocalORMSession.flush_all()
        md = "[[include ref=Include_1]]\n[[include ref=Include_2]]\n[[include ref=Include_3]]"
        html = g.markdown_wiki.convert(md)

    expected_html = """
<div class="markdown_content">
<p>
<div><div class="markdown_content"><p>included page 1</p></div></div>
<div><div class="markdown_content"><p>included page 2</p></div></div>
<div><div class="markdown_content"><p>included page 3</p></div></div>
</p>
</div>
""".strip().replace(
        "\n", ""
    )
    assert html.strip().replace("\n", "") == expected_html, html
Example #20
0
def test_markdown_basics():
    with h.push_context("test", "wiki", neighborhood="Projects"):
        text = g.markdown.convert("# Foo!\n[Home]")
        assert '<a class="alink" href=' in text, text
        text = g.markdown.convert("# Foo!\n[Rooted]")
        assert "<a href=" not in text, text

    assert "<br" in g.markdown.convert("Multi\nLine"), g.markdown.convert("Multi\nLine")
    assert "<br" not in g.markdown.convert("Multi\n\nLine")

    g.markdown.convert("<class 'foo'>")  # should not raise an exception
    assert "<br>" not in g.markdown.convert(
        """# Header

Some text in a regular paragraph

    :::python
    for i in range(10):
        print i
"""
    )
    assert "http://localhost/" in g.forge_markdown(email=True).convert("[Home]")
    assert 'class="codehilite"' in g.markdown.convert(
        """
~~~~
def foo(): pass
~~~~"""
    )
def test_markdown_basics():
    with h.push_context('test', 'wiki', neighborhood='Projects'):
        text = g.markdown.convert('# Foo!\n[Home]')
        assert '<a class="alink" href=' in text, text
        text = g.markdown.convert('# Foo!\n[Rooted]')
        assert '<a href=' not in text, text

    assert '<br' in g.markdown.convert(
        'Multi\nLine'), g.markdown.convert('Multi\nLine')
    assert '<br' not in g.markdown.convert('Multi\n\nLine')

    g.markdown.convert("<class 'foo'>")  # should not raise an exception
    assert '<br>' not in g.markdown.convert('''# Header

Some text in a regular paragraph

    :::python
    for i in range(10):
        print i
''')
    assert 'http://localhost/' in g.forge_markdown(email=True).convert('[Home]')
    assert 'class="codehilite"' in g.markdown.convert('''
~~~~
def foo(): pass
~~~~''')
def test_markdown_within_html():
    with h.push_context('test', neighborhood='Projects'):
        r = g.markdown_wiki.convert(
            '<div style="float:left" markdown>**blah**</div>')
    assert '''<div style="float: left;">
<p><strong>blah</strong></p>
</div>''' in r, r
Example #23
0
def test_macro_include_no_extra_br():
    p_nbhd = M.Neighborhood.query.get(name='Projects')
    p_test = M.Project.query.get(shortname='test', neighborhood_id=p_nbhd._id)
    wiki = p_test.app_instance('wiki')
    with h.push_context(p_test._id, app_config_id=wiki.config._id):
        p = WM.Page.upsert(title='Include_1')
        p.text = 'included page 1'
        p.commit()
        p = WM.Page.upsert(title='Include_2')
        p.text = 'included page 2'
        p.commit()
        p = WM.Page.upsert(title='Include_3')
        p.text = 'included page 3'
        p.commit()
        ThreadLocalORMSession.flush_all()
        md = '[[include ref=Include_1]]\n[[include ref=Include_2]]\n[[include ref=Include_3]]'
        html = g.markdown_wiki.convert(md)

    expected_html = '''<div class="markdown_content"><p></p><div>
<div class="markdown_content"><p>included page 1</p></div>
</div>
<div>
<div class="markdown_content"><p>included page 2</p></div>
</div>
<div>
<div class="markdown_content"><p>included page 3</p></div>
</div>
<p></p></div>'''
    assert_equal(squish_spaces(html), squish_spaces(expected_html))
Example #24
0
    def move(self, app_config, notify=True):
        """Move ticket from current tickets app to tickets app with given app_config"""
        app = app_config.project.app_instance(app_config)
        prior_url = self.url()
        prior_app = self.app
        prior_ticket_num = self.ticket_num
        attachments = self.attachments
        attach_metadata = BaseAttachment.metadata_for(self)
        prior_cfs = [(cf["name"], cf["type"], cf["label"]) for cf in prior_app.globals.custom_fields or []]
        new_cfs = [(cf["name"], cf["type"], cf["label"]) for cf in app.globals.custom_fields or []]
        skipped_fields = []
        user_fields = []
        for cf in prior_cfs:
            if cf not in new_cfs:  # can't convert
                skipped_fields.append(cf)
            elif cf[1] == "user":  # can convert and field type == user
                user_fields.append(cf)
        messages = []
        for cf in skipped_fields:
            name = cf[0]
            messages.append("- **%s**: %s" % (name, self.custom_fields.get(name, "")))
        for cf in user_fields:
            name = cf[0]
            username = self.custom_fields.get(name, None)
            user = app_config.project.user_in_project(username)
            if not user or user == User.anonymous():
                messages.append("- **%s**: %s (user not in project)" % (name, username))
                self.custom_fields[name] = ""
        # special case: not custom user field (assigned_to_id)
        user = self.assigned_to
        if user and not app_config.project.user_in_project(user.username):
            messages.append("- **assigned_to**: %s (user not in project)" % user.username)
            self.assigned_to_id = None

        custom_fields = {}
        for cf in new_cfs:
            fn, ft, fl = cf
            old_val = self.custom_fields.get(fn, None)
            if old_val is None:
                custom_fields[fn] = None if ft == "user" else ""
            custom_fields[fn] = old_val
        self.custom_fields = custom_fields

        # move ticket. ensure unique ticket_num
        while True:
            with h.push_context(app_config.project_id, app_config_id=app_config._id):
                ticket_num = app.globals.next_ticket_num()
            self.ticket_num = ticket_num
            self.app_config_id = app_config._id
            new_url = app_config.url() + str(self.ticket_num) + "/"
            try:
                session(self).flush(self)
                h.log_action(log, "moved").info("Ticket %s moved to %s" % (prior_url, new_url))
                break
            except OperationFailure, err:
                if "duplicate" in err.args[0]:
                    log.warning("Try to create duplicate ticket %s when moving from %s" % (new_url, prior_url))
                    session(self).expunge(self)
                    continue
Example #25
0
def test_sort_updated():
    p_nbhd = M.Neighborhood.query.get(name="Projects")

    with h.push_context(p_nbhd.neighborhood_project._id):
        r = g.markdown_wiki.convert("[[projects sort=last_updated]]")
        project_names = get_project_names(r)
        updated_at = get_projects_property_in_the_same_order(project_names, "last_updated")
        assert updated_at == sorted(updated_at, reverse=True)
Example #26
0
def test_sort_registered():
    p_nbhd = M.Neighborhood.query.get(name='Projects')

    with h.push_context(p_nbhd.neighborhood_project._id):
        r = g.markdown_wiki.convert('[[projects sort=last_registered]]')
        project_names = get_project_names(r)
        ids = get_projects_property_in_the_same_order(project_names, '_id')
        assert ids == sorted(ids, reverse=True)
def test_limit_tools_macro():
    p_nbhd = M.Neighborhood.query.get(name='Adobe')
    with h.push_context(p_nbhd.neighborhood_project._id, 'wiki'):
        r = g.markdown_wiki.convert('[[projects]]')
        assert '<span>Admin</span>' in r
        r = g.markdown_wiki.convert('[[projects grid_view_tools=wiki]]')
        assert '<span>Admin</span>' not in r
        r = g.markdown_wiki.convert('[[projects grid_view_tools=wiki,admin]]')
        assert '<span>Admin</span>' in r
Example #28
0
def test_limit_tools_macro():
    p_nbhd = M.Neighborhood.query.get(name="Adobe")
    with h.push_context(p_nbhd.neighborhood_project._id, "wiki"):
        r = g.markdown_wiki.convert("[[projects]]")
        assert "<span>Admin</span>" in r
        r = g.markdown_wiki.convert("[[projects grid_view_tools=wiki]]")
        assert "<span>Admin</span>" not in r
        r = g.markdown_wiki.convert("[[projects grid_view_tools=wiki,admin]]")
        assert "<span>Admin</span>" in r
Example #29
0
def test_wiki_artifact_links():
    text = g.markdown.convert('See [18:13:49]')
    assert 'See <span>[18:13:49]</span>' in text, text
    with h.push_context('test', 'wiki', neighborhood='Projects'):
        text = g.markdown.convert('Read [here](Home) about our project')
        assert '<a class="" href="/p/test/wiki/Home/">here</a>' in text, text
        text = g.markdown.convert('[Go home](test:wiki:Home)')
        assert '<a class="" href="/p/test/wiki/Home/">Go home</a>' in text, text
        text = g.markdown.convert('See [test:wiki:Home]')
        assert '<a class="alink" href="/p/test/wiki/Home/">[test:wiki:Home]</a>' in text, text
Example #30
0
    def _check_security(self):
        require_authenticated()

        enable_editing = config.get('trovecategories.enableediting', 'false')
        if enable_editing == 'admin':
            with h.push_context(config.get('site_admin_project', 'allura'),
                                neighborhood=config.get('site_admin_project_nbhd', 'Projects')):
                require_access(c.project, 'admin')
        elif enable_editing != 'true':
            raise HTTPForbidden()
def test_macros():
    file_name = 'neo-icon-set-454545-256x350.png'
    file_path = os.path.join(allura.__path__[0], 'nf', 'allura', 'images',
                             file_name)
    curr_project = c.project

    p_nbhd = M.Neighborhood.query.get(name='Projects')
    p_test = M.Project.query.get(shortname='test', neighborhood_id=p_nbhd._id)
    c.project = p_test
    icon_file = open(file_path)
    M.ProjectFile.save_image(file_name,
                             icon_file,
                             content_type='image/png',
                             square=True,
                             thumbnail_size=(48, 48),
                             thumbnail_meta=dict(project_id=c.project._id,
                                                 category='icon'))
    icon_file.close()
    p_test2 = M.Project.query.get(shortname='test2',
                                  neighborhood_id=p_nbhd._id)
    c.project = p_test2
    icon_file = open(file_path)
    M.ProjectFile.save_image(file_name,
                             icon_file,
                             content_type='image/png',
                             square=True,
                             thumbnail_size=(48, 48),
                             thumbnail_meta=dict(project_id=c.project._id,
                                                 category='icon'))
    icon_file.close()
    p_sub1 = M.Project.query.get(shortname='test/sub1',
                                 neighborhood_id=p_nbhd._id)
    c.project = p_sub1
    icon_file = open(file_path)
    M.ProjectFile.save_image(file_name,
                             icon_file,
                             content_type='image/png',
                             square=True,
                             thumbnail_size=(48, 48),
                             thumbnail_meta=dict(project_id=c.project._id,
                                                 category='icon'))
    icon_file.close()
    p_test.labels = ['test', 'root']
    p_sub1.labels = ['test', 'sub1']
    # Make one project private
    p_test.private = False
    p_sub1.private = False
    p_test2.private = True

    ThreadLocalORMSession.flush_all()

    with h.push_context(p_nbhd.neighborhood_project._id):
        r = g.markdown_wiki.convert('[[projects]]')
        assert '<img alt="test Logo"' in r, r
        assert '<img alt="sub1 Logo"' in r, r
        r = g.markdown_wiki.convert('[[projects labels=root]]')
        assert '<img alt="test Logo"' in r, r
        assert '<img alt="sub1 Logo"' not in r, r
        r = g.markdown_wiki.convert('[[projects labels=sub1]]')
        assert '<img alt="test Logo"' not in r, r
        assert '<img alt="sub1 Logo"' in r, r
        r = g.markdown_wiki.convert('[[projects labels=test]]')
        assert '<img alt="test Logo"' in r, r
        assert '<img alt="sub1 Logo"' in r, r
        r = g.markdown_wiki.convert('[[projects labels=test,root]]')
        assert '<img alt="test Logo"' in r, r
        assert '<img alt="sub1 Logo"' not in r, r
        r = g.markdown_wiki.convert('[[projects labels=test,sub1]]')
        assert '<img alt="test Logo"' not in r, r
        assert '<img alt="sub1 Logo"' in r, r
        r = g.markdown_wiki.convert('[[projects labels=root|sub1]]')
        assert '<img alt="test Logo"' in r, r
        assert '<img alt="sub1 Logo"' in r, r
        r = g.markdown_wiki.convert('[[projects labels=test,root|root,sub1]]')
        assert '<img alt="test Logo"' in r, r
        assert '<img alt="sub1 Logo"' not in r, r
        r = g.markdown_wiki.convert('[[projects labels=test,root|test,sub1]]')
        assert '<img alt="test Logo"' in r, r
        assert '<img alt="sub1 Logo"' in r, r
        r = g.markdown_wiki.convert('[[projects show_total=True sort=random]]')
        assert '<p class="macro_projects_total">3 Projects</p>' in r, r
        r = g.markdown_wiki.convert(
            '[[projects show_total=True private=True sort=random]]')
        assert '<p class="macro_projects_total">1 Projects</p>' in r, r
        assert '<img alt="test2 Logo"' in r, r
        assert '<img alt="test Logo"' not in r, r
        assert '<img alt="sub1 Logo"' not in r, r
        r = g.markdown_wiki.convert("""[TOC]

# Header 1

## Header 2""")
        assert '<a class="" href="#header-1">Header 1</a>' in r, r

        r = g.markdown_wiki.convert("""  <?xml version="1.0" encoding="UTF-8"?>
  <project xmlns="0"></project>""")
        assert 'The markdown supplied could not be parsed correctly.' in r, r

        r = g.markdown_wiki.convert('[[projects show_proj_icon=True]]')
        assert '<img alt="test Logo"' in r
        r = g.markdown_wiki.convert('[[projects show_proj_icon=False]]')
        assert '<img alt="test Logo"' not in r

    c.project = curr_project
    r = g.markdown_wiki.convert('[[project_admins]]')
    assert r == '<div class="markdown_content"><p><a href="/u/test-admin/">Test Admin</a><br /></p></div>'
    r = g.markdown_wiki.convert('[[download_button]]')
    assert_equal(
        r,
        '<div class="markdown_content"><p><span class="download-button-%s" style="margin-bottom: 1em; display: block;"></span></p></div>'
        % p_test._id)
    h.set_context('--init--', 'wiki', neighborhood='Projects')
    r = g.markdown_wiki.convert('[[neighborhood_feeds tool_name=Wiki]]')
    assert 'WikiPage Home modified by' in r, r
    orig_len = len(r)
    # Make project private & verify we don't see its new feed items
    proj = M.Project.query.get(shortname='test', neighborhood_id=p_nbhd._id)
    c.user = M.User.anonymous()
    proj.acl.insert(0, M.ACE.deny(c.user.project_role(proj)._id, 'read'))
    ThreadLocalORMSession.flush_all()
    pg = WM.Page.query.get(title='Home', app_config_id=c.app.config._id)
    pg.text = 'Change'
    pg.commit()
    r = g.markdown_wiki.convert('[[neighborhood_feeds tool_name=Wiki]]')
    new_len = len(r)
    assert new_len == orig_len
    p = BM.BlogPost(title='test me', neighborhood_id=p_test.neighborhood_id)
    p.text = 'test content'
    p.state = 'published'
    p.make_slug()
    p.commit()
    ThreadLocalORMSession.flush_all()
    r = g.markdown_wiki.convert('[[neighborhood_blog_posts]]')
    assert 'test content' in r
 def push_upstream_context(self):
     project, rest = h.find_project(self.upstream_repo.name)
     with h.push_context(project._id):
         app = project.app_instance(rest[0])
     return h.push_context(project._id, app_config_id=app.config._id)
 def push_downstream_context(self):
     return h.push_context(self.downstream.project_id,
                           self.downstream.mount_point)
 def test_ticket_numbers_are_independent(self):
     with h.push_context('test', 'doc-bugs', neighborhood='Projects'):
         assert_equal(c.app.globals.next_ticket_num(), 1)
     with h.push_context('test', 'bugs', neighborhood='Projects'):
         assert_equal(c.app.globals.next_ticket_num(), 1)
Example #35
0
 def revoke(self):
     require_access(self.neighborhood, 'admin')
     self.grant.delete()
     with h.push_context(self.project._id):
         g.post_event('project_updated')
     redirect(request.referer)
Example #36
0
def test_markdown_and_html():
    with h.push_context('test', neighborhood='Projects'):
        r = g.markdown_wiki.convert('<div style="float:left">blah</div>')
    assert '<div style="float: left;">blah</div>' in r, r
Example #37
0
def test_markdown_within_html():
    with h.push_context('test', neighborhood='Projects'):
        r = g.markdown_wiki.convert(
            '<div style="float:left" markdown>**blah**</div>')
    assert_in('<div style="float: left;"><p><strong>blah</strong></p></div>',
              r.replace('\n', ''))
Example #38
0
def test_macro_nbhd_feeds():
    with h.push_context('--init--', 'wiki', neighborhood='Projects'):
        r = g.markdown_wiki.convert('[[neighborhood_feeds tool_name=wiki]]')
        assert 'Home modified by ' in r, r
        assert '&lt;div class="markdown_content"&gt;' not in r
Example #39
0
 def _check_security(self):
     with h.push_context(config.get('site_admin_project', 'allura'),
                         neighborhood=config.get('site_admin_project_nbhd',
                                                 'Projects')):
         require_access(c.project, 'admin')
Example #40
0
def test_app_globals():
    with h.push_context('test', 'wiki', neighborhood='Projects'):
        assert g.app_static(
            'css/wiki.css') == '/nf/_static_/wiki/css/wiki.css', g.app_static('css/wiki.css')