def test_tags(self): meeting = self._add_mock_meeting() from voteit.core.models.discussion_post import DiscussionPost obj = DiscussionPost(text='#test') meeting['post'] = obj self.assertEqual(self.search(tags='test')[0], 1) obj.set_field_appstruct({'text': 'test'}) self.assertEqual(self.search(tags='test')[0], 0)
def test_tags(self): meeting = self._add_mock_meeting() from voteit.core.models.discussion_post import DiscussionPost obj = DiscussionPost(text = '#test') meeting['post'] = obj self.assertEqual(self.search(tags='test')[0], 1) obj.set_field_appstruct({'text': 'test'}) self.assertEqual(self.search(tags='test')[0], 0)
def _extra_fixtures(self, root): from voteit.core.models.meeting import Meeting from voteit.core.models.proposal import Proposal from voteit.core.models.discussion_post import DiscussionPost settings = self.config.registry.settings root['m']['p1'] = Proposal(text=u"Prop p1", creators=['admin']) root['m']['d1'] = DiscussionPost(text="Disc d1", creators=['admin']) root['m2'] = Meeting() root['m2']['p2'] = Proposal(text=u"Prop p2", creators=['admin']) root['m2']['d2'] = DiscussionPost(text=u"Disc d2", creators=['admin'])
def test_tags(self): meeting = self._add_mock_meeting() from voteit.core.models.discussion_post import DiscussionPost obj = DiscussionPost(text='#test') meeting['post'] = obj def _get_metadata(): result = self.search(content_type='DiscussionPost') doc_id = result[1][0] return self.get_metadata(doc_id) self.assertEqual(_get_metadata()['tags'], ('test', )) obj.set_field_appstruct({'text': 'test'}) self.assertEqual(_get_metadata()['tags'], ())
def test_tags(self): meeting = self._add_mock_meeting() from voteit.core.models.discussion_post import DiscussionPost obj = DiscussionPost(text = '#test') meeting['post'] = obj def _get_metadata(): result = self.search(content_type = 'DiscussionPost') doc_id = result[1][0] return self.get_metadata(doc_id) self.assertEqual(_get_metadata()['tags'], ('test',)) obj.set_field_appstruct({'text': 'test'}) self.assertEqual(_get_metadata()['tags'], ())
def test_context_unread(self): register_catalog(self.config) self.config.testing_securitypolicy('admin', permissive=True) root = bootstrap_and_fixture(self.config) from voteit.core.models.meeting import Meeting from voteit.core.models.agenda_item import AgendaItem from voteit.core.models.discussion_post import DiscussionPost root['m'] = Meeting() ai = root['m']['ai'] = AgendaItem() ai['d1'] = DiscussionPost() ai['d2'] = DiscussionPost() request = testing.DummyRequest() obj = self._cut(ai, request) self.assertEqual(len(obj.context_unread), 2)
def test_discussion_post(self): ai = self._fixture() from voteit.core.models.discussion_post import DiscussionPost ai['o'] = obj = DiscussionPost(text="@admin") self._fut(obj, None) mailer = get_mailer(self.request) self.assertEqual(len(mailer.outbox), 1)
def test_discussion_redirect_to_agenda_item_not_found(self): self._enable_catalog() from voteit.core.models.discussion_post import DiscussionPost context = DiscussionPost() request = testing.DummyRequest() from voteit.core.views.redirect import discussion_redirect_to_agenda_item self.assertRaises(NotFound, discussion_redirect_to_agenda_item, context, request)
def test_is_brain_unread(self): register_catalog(self.config) self.config.testing_securitypolicy('admin', permissive=True) root = bootstrap_and_fixture(self.config) from voteit.core.models.meeting import Meeting from voteit.core.models.agenda_item import AgendaItem from voteit.core.models.discussion_post import DiscussionPost root['m'] = Meeting() ai = root['m']['ai'] = AgendaItem() ai['d1'] = DiscussionPost(title='Hello world') ai['d2'] = DiscussionPost() request = testing.DummyRequest() obj = self._cut(ai, request) from voteit.core.models.catalog import metadata_for_query d1_brain = metadata_for_query(root.catalog, title='Hello world')[0] self.assertTrue(obj.is_brain_unread(d1_brain))
def test_update_contained_in_ai(self): self.config.include('arche.testing.setup_auth') self.config.include('arche.testing') self.config.include('voteit.core.models.meeting') self.config.include('voteit.core.models.discussion_post') from voteit.core.models.discussion_post import DiscussionPost from voteit.core.models.meeting import Meeting from voteit.core.models.user import User root = self._fixture() root['users']['john'] = User() root['m'] = Meeting() root['m'].add_groups('john', [security.ROLE_VIEWER]) root['m']['ai'] = ai = self._ai(title='New object') ai['dp'] = dp = DiscussionPost() #To make sure dp got catalogued self.assertEqual(root.catalog.search(uid=dp.uid)[0], 1) #The discussion post shouldn't be visible now, since the ai is private self.assertEqual( root.catalog.search(uid=dp.uid, allowed_to_view=[security.ROLE_VIEWER])[0], 0) #When the ai is made upcoming, it should be visible security.unrestricted_wf_transition_to(ai, 'upcoming') self.assertEqual( root.catalog.search(uid=dp.uid, allowed_to_view=[security.ROLE_VIEWER])[0], 1)
def test_like_userids(self): meeting = self._add_mock_meeting() from voteit.core.models.discussion_post import DiscussionPost obj = DiscussionPost() obj.title = 'Hello' meeting['post'] = obj self.assertEqual(self.search(like_userids='admin')[0], 0) #Set like from voteit.core.models.interfaces import IUserTags user_tags = self.config.registry.getAdapter(obj, IUserTags) user_tags.add('like', 'admin') self.assertEqual(self.search(like_userids='admin')[0], 1) user_tags.remove('like', 'admin') self.assertEqual(self.search(like_userids='admin')[0], 0)
def test_discussion_redirect_to_agenda_item(self): self._enable_catalog() ai = self._fixture() from voteit.core.models.discussion_post import DiscussionPost ai['d'] = context = DiscussionPost() request = testing.DummyRequest() from voteit.core.views.redirect import discussion_redirect_to_agenda_item response = discussion_redirect_to_agenda_item(context, request) self.assertEqual(response.location, 'http://example.com/m/ai/#%s' % context.uid)
def test_unread(self): meeting = self._add_mock_meeting() self._register_security_policies() self.config.include('voteit.core.models.unread') #Discussion posts are unread aware from voteit.core.models.discussion_post import DiscussionPost obj = DiscussionPost() obj.title = 'Hello' meeting['post'] = obj from voteit.core.models.catalog import reindex_indexes reindex_indexes(self.root.catalog) self.assertEqual(self.search(unread='admin')[0], 1) unread = self.config.registry.queryAdapter(obj, IUnread) unread.mark_as_read('admin') self.assertEqual(self.search(unread='admin')[0], 0)
def _extra_fixtures(self, root): from voteit.core.models.meeting import Meeting from voteit.core.models.proposal import Proposal from voteit.core.models.discussion_post import DiscussionPost from voteit.core.models.catalog import reindex_indexes settings = self.config.registry.settings settings['default_locale_name'] = 'sv' settings['default_timezone_name'] = 'Europe/Stockholm' self.config.include('voteit.core.models.date_time_util') root['m']['p1'] = Proposal(creators = ['admin']) root['m']['p1'].title = u"Prop p1" root['m']['d1'] = DiscussionPost(creators = ['admin']) root['m']['d1'].title = u"Disc d1" root['m2'] = Meeting() root['m2']['p2'] = Proposal(creators = ['admin']) root['m2']['p2'].title = u"Prop p2" root['m2']['d2'] = DiscussionPost(creators = ['admin']) root['m2']['d2'].title = u"Disc d2" reindex_indexes(root.catalog)
def test_discussion_post_already_mentioned(self): ai = self._fixture() from voteit.core.models.discussion_post import DiscussionPost ai['o'] = obj = DiscussionPost() obj.mentioned['admin'] = 'now' self._fut(obj, None) obj.title = '@admin' self._fut(obj, None) mailer = get_mailer(self.request) self.assertEqual(len(mailer.outbox), 0)
def _context(self): register_catalog(self.config) self.config.testing_securitypolicy('admin', permissive=True) root = bootstrap_and_fixture(self.config) from voteit.core.models.meeting import Meeting from voteit.core.models.agenda_item import AgendaItem from voteit.core.models.discussion_post import DiscussionPost root['m'] = Meeting() ai = root['m']['ai'] = AgendaItem() ai['d1'] = dp = DiscussionPost() return dp
def test_discussion_more(self): self.config.testing_securitypolicy(userid='dummy', permissive=True) self.config.include('voteit.core.models.fanstatic_resources') ai = self._fixture() from voteit.core.models.discussion_post import DiscussionPost ai['dp'] = context = DiscussionPost() context.title = "Testing read more view" request = testing.DummyRequest() aiv = self._cut(context, request) response = aiv.discussion_more() self.assertEqual(response['body'], context.title)
def _fixture(self): """ DiscussionPosts check parents state and change their ACL depending on what state the meeting or agenda item is in. """ from voteit.core.models.meeting import Meeting from voteit.core.models.agenda_item import AgendaItem from voteit.core.models.discussion_post import DiscussionPost m = Meeting() m['ai'] = AgendaItem() m['ai']['d'] = DiscussionPost() return m
def _fixture(self): root = bootstrap_and_fixture(self.config) from voteit.core.models.agenda_item import AgendaItem from voteit.core.models.discussion_post import DiscussionPost from voteit.core.models.proposal import Proposal from voteit.core.models.meeting import Meeting root['m'] = meeting = Meeting() meeting['ai'] = ai = AgendaItem() ai['p1'] = Proposal(text = "I dream of a #free world", creator = ['admin']) ai['p2'] = Proposal(text = "#free as in #freedom, not #free #beer", creator = ['admin']) ai['d1'] = DiscussionPost(text = "I agree with #admin-2", creator = ['admin']) return root
def _fixture(self, num=10): root = bootstrap_voteit(echo=False) from voteit.core.models.meeting import Meeting from voteit.core.models.agenda_item import AgendaItem from voteit.core.models.discussion_post import DiscussionPost from voteit.core import security root['m'] = m = Meeting() m.local_roles.add('admin', [security.MODERATE_MEETING, security.VIEW]) m['ai'] = ai = AgendaItem() for i in range(num): ai['d%s' % i] = DiscussionPost() return root
def test_mentioned_email(self): request = testing.DummyRequest() self.config = testing.setUp(request=request) self.config.include('pyramid_mailer.testing') self.config.scan('voteit.core.models.site') self.config.scan('voteit.core.models.agenda_template') self.config.scan('voteit.core.models.agenda_templates') self.config.scan('voteit.core.models.user') self.config.scan('voteit.core.models.users') self.config.scan('voteit.core.subscribers.mention') self.config.include('voteit.core.models.user_tags') self.config.include('voteit.core.models.catalog') self.config.scan('betahaus.pyracont.fields.password') from voteit.core.bootstrap import bootstrap_voteit root = bootstrap_voteit(echo=False) root.users['admin'].set_field_value('email', '*****@*****.**') from voteit.core.models.meeting import Meeting meeting = Meeting() root['meeting'] = meeting from voteit.core.models.agenda_item import AgendaItem agenda_item = AgendaItem() meeting['agenda_item'] = agenda_item from voteit.core.models.discussion_post import DiscussionPost discussion_post = DiscussionPost() discussion_post.set_field_value('text', '@admin') agenda_item['discussion_post'] = discussion_post mailer = get_mailer(request) self.assertEqual(len(mailer.outbox), 1) msg = mailer.outbox[0] self.failUnless(resource_url(discussion_post, request) in msg.html)
def test_docid(self): """ docid should be part of metadata too. """ from voteit.core.models.agenda_item import AgendaItem from voteit.core.models.discussion_post import DiscussionPost meeting = self._add_mock_meeting() self._register_security_policies() meeting['ai'] = AgendaItem() meeting['ai']['disc'] = DiscussionPost() result = self.search(content_type='DiscussionPost') doc_id = result[1][0] brain = self.get_metadata(doc_id) self.failUnless('docid' in brain) self.assertEqual(brain['docid'], doc_id)
def test_like_userids(self): meeting = self._add_mock_meeting() from voteit.core.models.discussion_post import DiscussionPost obj = DiscussionPost() meeting['post'] = obj def _get_metadata(): result = self.search(content_type='DiscussionPost') doc_id = result[1][0] return self.get_metadata(doc_id) self.assertEqual(_get_metadata()['like_userids'], ()) #Set like from voteit.core.models.interfaces import IUserTags user_tags = self.config.registry.getAdapter(obj, IUserTags) user_tags.add('like', 'admin') self.assertEqual(_get_metadata()['like_userids'], ('admin', )) user_tags.remove('like', 'admin') self.assertEqual(_get_metadata()['like_userids'], ())
def _extra_fixtures(self, root): from voteit.core.models.meeting import Meeting from voteit.core.models.proposal import Proposal from voteit.core.models.discussion_post import DiscussionPost from voteit.core.models.catalog import reindex_indexes settings = self.config.registry.settings settings['default_locale_name'] = 'sv' settings['default_timezone_name'] = 'Europe/Stockholm' self.config.include('voteit.core.models.date_time_util') root['m']['p1'] = Proposal(creators=['admin']) root['m']['p1'].title = u"Prop p1" root['m']['d1'] = DiscussionPost(creators=['admin']) root['m']['d1'].title = u"Disc d1" root['m2'] = Meeting() root['m2']['p2'] = Proposal(creators=['admin']) root['m2']['p2'].title = u"Prop p2" root['m2']['d2'] = DiscussionPost(creators=['admin']) root['m2']['d2'].title = u"Disc d2" reindex_indexes(root.catalog)
def test_with_tags(self): from voteit.core.models.discussion_post import DiscussionPost context = DiscussionPost(text='#HELLO #world') self.assertEqual(self._fut(None, {'context': context}), u"hello world")
(request.application_url, brain['path'], api.translate(va.title)) @view_action('metadata_listing', 'tag', permission=VIEW) def meta_tag(context, request, va, **kw): api = kw['api'] brain = kw['brain'] if not brain['content_type'] == 'Proposal': return u'' return '<span><a class="tag" ' \ 'href="?tag=%s" ' \ '>#%s</a> (%s) </span>' % (brain['aid'], brain['aid'], api.get_tag_count(brain['aid'])) @view_action('metadata_listing', 'delete') def meta_delete(context, request, va, **kw): api = kw['api'] brain = kw['brain'] if not brain[ 'content_type'] == 'DiscussionPost' and api.userid not in brain[ 'creators']: return u'' obj = find_resource(api.root, brain['path']) if not api.context_has_permission(DELETE, obj): return u'' return u'<span><a class="delete" href="%s">%s</a></span>' % ( request.resource_url(obj, 'delete'), api.translate(_(u"Delete"))) _dummy = {'Proposal': Proposal(), 'DiscussionPost': DiscussionPost()}