= Poll Pages = First import some stuff and setup some things we'll use in this test. >>> from zope.component import getUtility, getMultiAdapter >>> from zope.publisher.browser import TestRequest >>> from canonical.launchpad.webapp.servers import LaunchpadTestRequest >>> from lp.registry.interfaces.person import IPersonSet >>> from lp.registry.interfaces.poll import IPollSet >>> from datetime import datetime, timedelta >>> login("test@canonical.com") >>> ubuntu_team = getUtility(IPersonSet).getByName('ubuntu-team') == Creating new polls == When creating a new poll, its start date must be at least 12h after it is created. First we attempt to create a poll which starts 11h from now. That will fail with a proper explanation of why it failed. >>> eleven_hours_from_now = datetime.now() + timedelta(hours=11) >>> eleven_hours_from_now = eleven_hours_from_now.strftime( ... '%Y-%m-%d %H:%M:%S') >>> form = { ... 'field.name': 'test-poll', ... 'field.title': 'test-poll', ... 'field.proposition': 'test-poll', ... 'field.allowspoilt': '1', ... 'field.secrecy': 'SECRET', ... 'field.dateopens': eleven_hours_from_now, ... 'field.datecloses': '2025-06-04', ... 'field.actions.continue': 'Continue'} >>> request = LaunchpadTestRequest(method='POST', form=form) >>> new_poll = getMultiAdapter((ubuntu_team, request), name="+newpoll") >>> new_poll.initialize() >>> print "\n".join(new_poll.errors) A poll cannot open less than 12 hours after it's created. Now we successfully create a poll which starts 12h from now. >>> twelve_hours_from_now = datetime.now() + timedelta(hours=12) >>> twelve_hours_from_now = twelve_hours_from_now.strftime( ... '%Y-%m-%d %H:%M:%S') >>> form['field.dateopens'] = twelve_hours_from_now >>> request = LaunchpadTestRequest(method='POST', form=form) >>> new_poll = getMultiAdapter((ubuntu_team, request), name="+newpoll") >>> new_poll.initialize() >>> new_poll.errors [] == Displaying results of condorcet polls == >>> poll = getUtility(IPollSet).getByTeamAndName(ubuntu_team, 'director-2004') >>> poll.type.title 'Condorcet Voting' Although condorcet polls are disabled now, everything is implemented and we're using a pairwise matrix to display the results. It's very trick to create this matrix on page templates, so the view provides a method wich return this matrix as a python list, with the necessary headers (the option's names). >>> poll_results = getMultiAdapter((poll, TestRequest()), name="+index") >>> for row in poll_results.getPairwiseMatrixWithHeaders(): ... print row [None, u'A', u'B', u'C', u'D'] [u'A', None, 2L, 2L, 2L] [u'B', 2L, None, 2L, 2L] [u'C', 1L, 1L, None, 1L] [u'D', 2L, 1L, 2L, None] == Voting on closed polls == This is not allowed, and apart from not linking to the +vote page and not even displaying its content for a closed poll, we also have some lower level checks. >>> request = TestRequest(form={'changevote': 'Change Vote'}) >>> request.method = 'POST' >>> voting_page = getMultiAdapter((poll, request), name="+vote") >>> form_processed = False >>> def form_processing(): ... form_processed = True >>> voting_page.processCondorcetVotingForm = form_processing >>> voting_page.initialize() >>> form_processed False >>> voting_page.feedback 'This poll is not open.'