def test_get_content_specific_content_type(self):
     from voteit.core.models.meeting import Meeting
     from voteit.core.models.agenda_item import AgendaItem
     meeting = Meeting()
     meeting['ai1'] = AgendaItem()
     meeting['ai2'] = AgendaItem()
     meeting['b1'] = self._cut()
     res = meeting.get_content(content_type = 'AgendaItem')
     self.assertEqual(len(res), 2)
 def test_change_states_proposals(self):
     from voteit.core.models.meeting import Meeting
     from voteit.core.models.agenda_item import AgendaItem
     meeting = Meeting()
     ai = AgendaItem()
     meeting['a1'] = ai
     ai = AgendaItem()
     meeting['a2'] = ai
     self.assertEqual(meeting['a1'].get_field_value('order'), 0)
     self.assertEqual(meeting['a2'].get_field_value('order'), 1)
示例#3
0
    def test_get_content_states(self):
        """ To test content states we need to setup workflow and use real content types."""
        from voteit.core.models.meeting import Meeting
        from voteit.core.models.agenda_item import AgendaItem
        self.config.include('pyramid_zcml')
        self.config.load_zcml('voteit.core:configure.zcml')

        meeting = Meeting()
        meeting.title = 'Hello Meeting'
        ai1 = AgendaItem()
        ai1.title = 'Stuff to do'
        ai2 = AgendaItem()
        ai2.title = 'More important things'
        meeting['ai1'] = ai1
        meeting['ai2'] = ai2
        meeting['b1'] = self._cut()

        self.assertEqual(
            meeting.get_content(sort_on='title', states='private'), (ai2, ai1))
        self.assertEqual(
            meeting.get_content(sort_on='title',
                                states=('private', 'upcoming')), (ai2, ai1))
        request = testing.DummyRequest()
        ai1.set_workflow_state(request, 'upcoming')
        self.assertEqual(
            meeting.get_content(sort_on='title', states='private'), (ai2, ))
        self.assertEqual(
            meeting.get_content(sort_on='title',
                                states=('private', 'some_other')), (ai2, ))
        self.assertEqual(
            meeting.get_content(sort_on='title',
                                states=(
                                    'private',
                                    'upcoming',
                                )), (ai2, ai1))
 def test_get_content_by_interface(self):
     from voteit.core.models.meeting import Meeting
     from voteit.core.models.agenda_item import AgendaItem
     from voteit.core.models.interfaces import IAgendaItem
     from voteit.core.models.interfaces import IBaseContent
     meeting = Meeting()
     meeting['ai1'] = AgendaItem()
     meeting['ai2'] = AgendaItem()
     meeting['b1'] = self._cut()
     res = meeting.get_content(iface = IAgendaItem)
     self.assertEqual(len(res), 2)
     #IAgendaItem subclasses IBaseContent
     res = meeting.get_content(iface = IBaseContent)
     self.assertEqual(len(res), 3)
示例#5
0
def _setup_poll_fixture(config):
    # type: (Configurator) -> Poll
    config.testing_securitypolicy('admin', permissive=True)
    # config.include('pyramid_chameleon')
    # Register plugin
    config.include('voteit.stv')
    config.include('arche.testing')
    config.include('arche.testing.workflow')
    config.include('arche.testing.catalog')
    config.include('voteit.core.models.catalog')
    root = bootstrap_and_fixture(config)
    root['m'] = Meeting()
    unrestricted_wf_transition_to(root['m'], 'ongoing')
    root['m']['ai'] = ai = AgendaItem()
    unrestricted_wf_transition_to(ai, 'upcoming')
    unrestricted_wf_transition_to(ai, 'ongoing')
    #Setup poll
    ai['poll'] = Poll()
    poll = ai['poll']
    #Add proposals
    p1 = Proposal(creators = ['dummy'], text = 'first proposal')
    p1.uid = 'p1uid' #To make it simpler to test against
    ai['p1'] = p1
    p2 = Proposal(creators = ['dummy'], text = 'second proposal')
    p2.uid = 'p2uid'
    ai['p2'] = p2
    p3 = Proposal(creators = ['dummy'], text = 'third proposal')
    p3.uid = 'p3uid'
    ai['p3'] = p3
    #Select proposals for this poll
    poll.proposal_uids = (p1.uid, p2.uid, p3.uid)
    #Set poll as ongoing
    unrestricted_wf_transition_to(poll, 'upcoming')
    return poll
 def test_add_form_add_poll(self):
     self.config.registry.settings[
         'default_timezone_name'] = "Europe/Stockholm"
     self.config.registry.settings['default_locale_name'] = 'sv'
     self.config.include('voteit.core.models.date_time_util')
     self.config.scan('voteit.core.models.poll')
     self.config.scan('voteit.core.schemas.poll')
     self.config.include('voteit.core.plugins.majority_poll')
     self.config.include('voteit.core.models.flash_messages')
     meeting = self._fixture()
     from voteit.core.models.agenda_item import AgendaItem
     meeting['ai'] = context = AgendaItem()
     request = testing.DummyRequest(params={'content_type': 'Poll'},
                                    post=MultiDict([
                                        ('add', 'add'),
                                        ('title', 'Dummy poll'),
                                        ('description', 'description'),
                                        ('poll_plugin', 'majority_poll'),
                                        ('__start__', 'proposals:sequence'),
                                        ('__end__', 'proposals:sequence'),
                                        ('reject_proposal_title',
                                         'Reject all proposals'),
                                        ('start_time', '2012-05-15 12:00'),
                                        ('end_time', '2012-05-16 12:00')
                                    ]))
     obj = self._cut(context, request)
     response = obj.add_form()
     self.assertEqual(
         response.location.split('#')[0],
         'http://example.com/m/ai/')  #A redirect with an anchor
示例#7
0
 def _fixture(self):
     from voteit.core.models.agenda_item import AgendaItem
     from voteit.core.models.meeting import Meeting
     root = bootstrap_and_fixture(self.config)
     root['m'] = meeting = Meeting()
     meeting['ai'] = ai = AgendaItem()
     return ai
def active_poll_fixture(config):
    """ This method sets up a site the way it will be when a poll is ready to start
        with admin as voter.
        You can use this if you want a fixture for your poll plugin tests
    """
    from voteit.core.models.poll import Poll
    from voteit.core.models.meeting import Meeting
    from voteit.core.models.agenda_item import AgendaItem
    from voteit.core.models.proposal import Proposal
    root = bootstrap_and_fixture(config)
    request = testing.DummyRequest()
    config = testing.setUp(request = request, registry = config.registry)
    config.include('pyramid_mailer.testing')
    config.include('voteit.core.subscribers.poll')
    root['users']['admin'].set_field_value('email', '*****@*****.**')
    meeting = root['meeting'] = Meeting()
    meeting.add_groups('admin', [ROLE_VOTER])
    meeting.set_workflow_state(request, 'ongoing')
    ai = meeting['ai'] = AgendaItem()
    ai['prop1'] = Proposal(text = u"Proposal 1")
    ai['prop2'] = Proposal(text = u"Proposal 2")
    ai.set_workflow_state(request, 'upcoming')
    ai.set_workflow_state(request, 'ongoing')
    ai['poll'] = Poll(title = 'A poll')
    poll = ai['poll']
    poll.set_field_value('proposals', set([ai['prop1'].uid, ai['prop2'].uid]))
    poll.set_workflow_state(request, 'upcoming')
    return root
 def test_other_context(self):
     from voteit.core.models.agenda_item import AgendaItem
     context = AgendaItem()
     self._reg_dummy_policy(context)
     request = testing.DummyRequest()
     obj = self._cut(context, request)
     self.assertRaises(colander.Invalid, obj, None, ['role:Admin'])
 def test_order_agenda_items_save(self):
     self.config.scan('voteit.core.subscribers.agenda_item')
     self.config.include('voteit.core.models.flash_messages')
     self.config.testing_securitypolicy(userid='dummy', permissive=True)
     context = self._fixture()
     from voteit.core.models.agenda_item import AgendaItem
     context['a1'] = AgendaItem(title='Agenda Item 1')
     context['a2'] = AgendaItem(title='Agenda Item 2')
     context['a3'] = AgendaItem(title='Agenda Item 3')
     request = testing.DummyRequest(post=MultiDict((('save', 'save'),
                                                    ('agenda_items', 'a1'),
                                                    ('agenda_items',
                                                     'a2'), ('agenda_items',
                                                             'a3'))))
     obj = self._cut(context, request)
     response = obj.order_agenda_items()
     self.assertIn('title', response)
示例#11
0
 def _fixture(self):
     from voteit.core.models.agenda_item import AgendaItem
     from voteit.core.models.meeting import Meeting
     root = bootstrap_and_fixture(self.config)
     root['users']['admin'].email = '*****@*****.**'
     root['m'] = meeting = Meeting()
     meeting['ai'] = ai = AgendaItem()
     return ai
示例#12
0
 def _agenda_item_with_proposals_fixture(self):
     """ Create an agenda item with a poll and two proposals. """
     from voteit.core.models.agenda_item import AgendaItem
     from voteit.core.models.proposal import Proposal
     agenda_item = AgendaItem()
     agenda_item['prop1'] = Proposal()
     agenda_item['prop2'] = Proposal()
     return agenda_item
示例#13
0
 def test_move_object(self):
     root = active_poll_fixture(self.config)
     from voteit.core.models.agenda_item import AgendaItem
     ai = root['meeting']['ai']
     ai2 = root['meeting']['ai2'] = AgendaItem()
     self._fut(ai['prop1'], ai2)
     self.assertIn('prop1', root['meeting']['ai2'])
     self.assertNotIn('prop1', root['meeting']['ai'])
 def _fixture(self):
     from voteit.core.models.meeting import Meeting
     from voteit.core.models.agenda_item import AgendaItem
     from voteit.core.models.user import User
     root = bootstrap_and_fixture(self.config)
     root.users['some_user'] = User()
     root['m'] = Meeting()
     root['m']['ai'] = AgendaItem()
     return root['m']['ai']
    def _make_obj(self):
        from voteit.core.plugins.majority_poll import MajorityPollPlugin
        from voteit.core.models.poll import Poll
        from voteit.core.models.agenda_item import AgendaItem

        ai = AgendaItem()
        ai['poll'] = self.poll = Poll()

        return MajorityPollPlugin(ai['poll'])
示例#16
0
 def test_context_is_agenda_item(self):
     from voteit.core.models.agenda_item import AgendaItem
     context = AgendaItem()
     request = testing.DummyRequest()
     self.assertEqual(
         self._fut(None, {
             'context': context,
             'request': request
         }), u"")
示例#17
0
 def _make_obj(self):
     from voteit.core.plugins.majority_poll import MajorityPollPlugin
     from voteit.core.models.poll import Poll
     from voteit.core.models.agenda_item import AgendaItem
     self.config.include('arche.testing.catalog')
     self.root = bootstrap_and_fixture(self.config)
     self.root['ai'] = ai = AgendaItem()
     ai['poll'] = self.poll = Poll()
     return MajorityPollPlugin( ai['poll'] )
示例#18
0
 def test_delete_form(self):
     self.config.include('voteit.core.models.flash_messages')
     meeting = self._fixture()
     from voteit.core.models.agenda_item import AgendaItem
     meeting['ai'] = context = AgendaItem()
     request = testing.DummyRequest()
     obj = self._cut(context, request)
     response = obj.delete_form()
     self.assertIn('form', response)
示例#19
0
 def test_delete_form_cancel(self):
     self.config.include('voteit.core.models.flash_messages')
     meeting = self._fixture()
     from voteit.core.models.agenda_item import AgendaItem
     meeting['ai'] = context = AgendaItem()
     request = testing.DummyRequest(post={'cancel': 'cancel'})
     obj = self._cut(context, request)
     response = obj.delete_form()
     self.assertEqual(response.location, 'http://example.com/m/ai/')
示例#20
0
 def test_edit_form_validation_error(self):
     self.config.scan('voteit.core.models.agenda_item')
     self.config.scan('voteit.core.schemas.agenda_item')
     meeting = self._fixture()
     from voteit.core.models.agenda_item import AgendaItem
     meeting['ai'] = context = AgendaItem()
     request = testing.DummyRequest(post={'update': 'update', 'title': ''})
     obj = self._cut(context, request)
     response = obj.edit_form()
     self.assertIn('form', response)
示例#21
0
 def _fixture(self):
     self.config.include('pyramid_mailer.testing')
     from voteit.core.models.agenda_item import AgendaItem
     from voteit.core.models.meeting import Meeting
     from voteit.core.models.proposal import Proposal
     root = bootstrap_and_fixture(self.config)
     root['users']['admin'].set_field_value('email', '*****@*****.**')
     root['m'] = meeting = Meeting()
     meeting['ai'] = ai = AgendaItem()
     return ai
示例#22
0
    def test_minutes(self):
        self.config.include('voteit.core.testing_helpers.register_catalog')
        self.config.scan('voteit.core.subscribers.agenda_item')
        self.config.include('voteit.core.models.flash_messages')
        self.config.testing_securitypolicy(userid='dummy', permissive=True)
        context = self._fixture()
        request = testing.DummyRequest()

        from voteit.core.models.agenda_item import AgendaItem
        context['a1'] = AgendaItem(title='Agenda Item 1')
        context['a1'].set_workflow_state(request, 'upcoming')
        context['a2'] = AgendaItem(title='Agenda Item 2')
        context['a2'].set_workflow_state(request, 'upcoming')
        context['a3'] = AgendaItem(title='Agenda Item 3')
        context['a3'].set_workflow_state(request, 'upcoming')

        obj = self._cut(context, request)
        response = obj.minutes()
        self.assertIn('agenda_items', response)
示例#23
0
 def test_get_type_count(self):
     meeting, request = self._fixture()
     from voteit.core.models.agenda_item import AgendaItem
     from voteit.core.models.proposal import Proposal
     meeting['ai'] = ai = AgendaItem()
     obj = self._cut(ai, request)
     ai['p1'] = Proposal()
     self.assertEqual(obj.get_type_count('Proposal'), 1)
     ai['p2'] = Proposal()
     self.assertEqual(obj.get_type_count('Proposal'), 2)
示例#24
0
 def _make_obj(self):
     """ Poll object need to be in the context of an Agenda Item to work properly
     """
     from voteit.core.models.proposal import Proposal
     from voteit.core.models.agenda_item import AgendaItem
     ai = AgendaItem()
     ai['poll'] = self._cut()
     proposal = Proposal()
     ai['poll'].set_field_value('proposals', set(proposal.uid))
     return ai['poll']
 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
示例#26
0
 def test_get_read_type(self):
     meeting, request = self._fixture()
     from voteit.core.models.agenda_item import AgendaItem
     from voteit.core.models.proposal import Proposal
     meeting['ai'] = ai = AgendaItem()
     obj = self._cut(ai, request)
     self.assertEqual(obj.get_read_type('Proposal', 'anders'), 0)
     ai['p1'] = Proposal()
     self.assertEqual(obj.get_read_type('Proposal', 'anders'), 0)
     obj.mark_read('p1', 'anders')
     self.assertEqual(obj.get_read_type('Proposal', 'anders'), 1)
示例#27
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
示例#28
0
 def _fixture_and_setup(self):
     root = bootstrap_and_fixture(self.config)
     from voteit.core.models.user import User
     from voteit.core.models.agenda_item import AgendaItem
     #from voteit.core.models.meeting import Meeting
     from voteit.core.models.proposal import Proposal
     for userid in ('fredrik', 'anders', 'hanna', 'robin'):
         root.users[userid] = User()
     root['ai'] = AgendaItem()
     security.unrestricted_wf_transition_to(root['ai'], 'upcoming')
     root['ai']['p'] = Proposal()
     return root['ai']['p']
示例#29
0
 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
示例#30
0
 def test_add_also_adds_to_proposal(self):
     from voteit.core.models.agenda_item import AgendaItem
     from voteit.core.models.proposal import Proposal
     meeting = self._meeting()
     meeting['ai'] = ai = AgendaItem()
     obj = self._cut(meeting)
     ai['p1'] = prop = Proposal(creators=['BennyBoy'])
     obj.add(prop)
     self.assertIn('aid', prop.field_storage)
     self.assertIn('aid_int', prop.field_storage)
     self.assertEqual(prop.get_field_value('aid'), u"BennyBoy-1")
     self.assertEqual(prop.get_field_value('aid_int'), 1)
示例#31
0
    def test_get_content_states(self):
        """ To test content states we need to setup workflow and use real content types."""
        from voteit.core.models.meeting import Meeting
        from voteit.core.models.agenda_item import AgendaItem
        self.config.include('pyramid_zcml')
        self.config.load_zcml('voteit.core:configure.zcml')

        meeting = Meeting()
        meeting.title = 'Hello Meeting'
        ai1 = AgendaItem()
        ai1.title = 'Stuff to do'
        ai2 = AgendaItem()
        ai2.title = 'More important things'
        meeting['ai1'] = ai1
        meeting['ai2'] = ai2
        meeting['b1'] = self._cut()
        
        self.assertEqual(meeting.get_content(sort_on = 'title', states='private'), (ai2, ai1))
        self.assertEqual(meeting.get_content(sort_on = 'title', states=('private', 'upcoming')), (ai2, ai1))
        request = testing.DummyRequest()
        ai1.set_workflow_state(request, 'upcoming')
        self.assertEqual(meeting.get_content(sort_on = 'title', states='private'), (ai2,))
        self.assertEqual(meeting.get_content(sort_on = 'title', states=('private', 'some_other')), (ai2,))
        self.assertEqual(meeting.get_content(sort_on = 'title', states=('private', 'upcoming',)), (ai2, ai1))
示例#32
0
    def test_agenda_item_states(self):
        obj = AgendaItem()
        request = testing.DummyRequest()

        workflow = get_workflow(AgendaItem, AgendaItem.__name__, obj)
        obj.workflow.initialize(obj)
        self.assertEqual(obj.get_workflow_state(), u"private")

        obj.make_workflow_transition(request, "private_to_upcoming")
        self.assertEqual(obj.get_workflow_state(), u"upcoming")

        obj.make_workflow_transition(request, "upcoming_to_ongoing")
        self.assertEqual(obj.get_workflow_state(), u"ongoing")

        obj.workflow.initialize(obj)
        obj.make_workflow_transition(request, "private_to_upcoming")
        obj.make_workflow_transition(request, "upcoming_to_closed")
        self.assertEqual(obj.get_workflow_state(), u"closed")

        obj.workflow.initialize(obj)
        obj.make_workflow_transition(request, "private_to_upcoming")
        obj.make_workflow_transition(request, "upcoming_to_ongoing")
        obj.make_workflow_transition(request, "ongoing_to_upcoming")
        self.assertEqual(obj.get_workflow_state(), u"upcoming")

        obj.workflow.initialize(obj)
        obj.make_workflow_transition(request, "private_to_upcoming")
        obj.make_workflow_transition(request, "upcoming_to_ongoing")
        obj.make_workflow_transition(request, "ongoing_to_closed")
        self.assertEqual(obj.get_workflow_state(), u"closed")

        obj.workflow.initialize(obj)
        obj.make_workflow_transition(request, "private_to_upcoming")
        obj.make_workflow_transition(request, "upcoming_to_closed")
        obj.make_workflow_transition(request, "closed_to_ongoing")
        self.assertEqual(obj.get_workflow_state(), u"ongoing")