def results_total_xls(request): """Downloads the combined results from all districts as an Excel spreadsheet with different districts in different sheets.""" sheets = [] session = DBSession() districts = session.query(District).order_by(District.code) for district in districts: if district.code == 0: continue title = u'{0} ({1} kansanedustajapaikka'.format(district.name, district.quota) title += ')' if district.quota == 1 else 'a)' rows = [ (title, u'', u'', u'', u''), (u'', u'', u'', u'', u''), (u'Valitut ehdokkaat', u'', u'', u'', u''), (u'Numero', u'Nimi', u'Puolue', u'Äänimäärä', u'Vertailuluku'), ] for i, record in enumerate(dhont_selection(district)): # Add a separator between the selected and other candidates. if i == district.quota: rows.append((u'', u'', u'', u'', u'')) rows.append((u'Valitsematta jääneet ehdokkaat', u'', u'', u'', u'')) rows.append((u'Numero', u'Nimi', u'Puolue', u'Äänimäärä', u'Vertailuluku')) candidate = record['candidate'] rows.append((candidate.number, candidate.fullname(), candidate.party.name, record['absolute_votes'], record['proportional_votes'])) sheets.append((district.name, rows)) request.add_response_callback(disable_caching_explorer) return xls_response_multiple(sheets, filename='nuorisovaalit2011-valtakunnalliset-tulokset.xls', num_formats=(None, '@', '@', None, None), col_widths=(None, 8000, 14000, 3000, 3000))
def results_xls(request): """Downloads the district specific combined results as an Excel sheet. """ user = authenticated_user(request) if user is None: raise Forbidden district = user.school.district title = u'{0} ({1} kansanedustajapaikka'.format(district.name, district.quota) title += ')' if district.quota == 1 else 'a)' rows = [ (title, u'', u'', u'', u''), (u'', u'', u'', u'', u''), (u'Valitut ehdokkaat', u'', u'', u'', u''), (u'Numero', u'Nimi', u'Puolue', u'Äänimäärä', u'Vertailuluku'), ] for i, record in enumerate(dhont_selection(user.school.district)): # Add a separator between the selected and other candidates. if i == district.quota: rows.append((u'', u'', u'', u'', u'')) rows.append((u'Valitsematta jääneet ehdokkaat', u'', u'', u'', u'')) rows.append((u'Numero', u'Nimi', u'Puolue', u'Äänimäärä', u'Vertailuluku')) candidate = record['candidate'] rows.append((candidate.number, candidate.fullname(), candidate.party.name, record['absolute_votes'], record['proportional_votes'])) request.add_response_callback(disable_caching_explorer) return xls_response(rows, filename='nuorisovaalit2011-tulokset.xls', num_formats=(None, '@', '@', None, None), col_widths=(None, 8000, 14000, 3000, 3000))
def test_no_votes(self): """Test for a case when no candidates have received any votes. Not likely to happen in reality. """ from nuorisovaalit.results import dhont_selection district = self._populate(quota=8) # group 1 self._add_votes(district.candidates[0], 0) self._add_votes(district.candidates[1], 0) # group 2 self._add_votes(district.candidates[2], 0) self._add_votes(district.candidates[3], 0) # group 3 self._add_votes(district.candidates[4], 0) self._add_votes(district.candidates[5], 0) self._add_votes(district.candidates[6], 0) # group 4 self._add_votes(district.candidates[7], 0) winners = dhont_selection(district) # Assert quota self.assertEquals(8, len(winners)) # Assert the secondary sorting key ordering. The expected ordering # was determined manually by evaluating the hashes in an interpreter. self.assertOrdering( district.candidates[2], district.candidates[6], district.candidates[5], district.candidates[7], district.candidates[0], district.candidates[4], district.candidates[3], district.candidates[1], ) # Because all the vote counts are zero the ordering of the candidates # is based entirely on the secondary sorting key. # First selected candidate self.assertCandidate(winners[0], { 'name': u'2, Candidate', 'proportional_votes': Decimal('0'), 'absolute_votes': 0, }) # Second selected candidate self.assertCandidate(winners[1], { 'name': u'6, Candidate', 'proportional_votes': Decimal('0'), 'absolute_votes': 0, }) # Third selected candidate self.assertCandidate(winners[2], { 'name': u'5, Candidate', 'proportional_votes': Decimal('0'), 'absolute_votes': 0, }) # Fourth selected candidate self.assertCandidate(winners[3], { 'name': u'7, Candidate', 'proportional_votes': Decimal('0'), 'absolute_votes': 0, }) # Fifth selected candidate self.assertCandidate(winners[4], { 'name': u'0, Candidate', 'proportional_votes': Decimal('0'), 'absolute_votes': 0, }) # Sixth selected candidate self.assertCandidate(winners[5], { 'name': u'4, Candidate', 'proportional_votes': Decimal('0'), 'absolute_votes': 0, }) # Seventh selected candidate self.assertCandidate(winners[6], { 'name': u'3, Candidate', 'proportional_votes': Decimal('0'), 'absolute_votes': 0, }) # Eighth selected candidate self.assertCandidate(winners[7], { 'name': u'1, Candidate', 'proportional_votes': Decimal('0'), 'absolute_votes': 0, })
def test_tie_in_both_vote_types(self): """Tests for the case when there are ties in both the absolute votes and the proportional votes. """ from nuorisovaalit.results import dhont_selection district = self._populate(quota=3) # Votes are created so that they result in ties. # The second and third group both have a total sum of 6 votes in # addition to the individual candidates having the same number of # votes. # group 1 self._add_votes(district.candidates[0], 1) self._add_votes(district.candidates[1], 1) # group 2 self._add_votes(district.candidates[2], 3) self._add_votes(district.candidates[3], 3) # group 3 self._add_votes(district.candidates[4], 2) self._add_votes(district.candidates[5], 2) self._add_votes(district.candidates[6], 2) # group 4 self._add_votes(district.candidates[7], 3) winners = dhont_selection(district) self.assertEquals(8, len(winners)) # Assert the secondary sorting key ordering. The expected ordering # was determined manually by evaluating the hashes in an interpreter. self.assertOrdering( district.candidates[2], district.candidates[6], district.candidates[5], district.candidates[7], district.candidates[0], district.candidates[4], district.candidates[3], district.candidates[1], ) # First selected candidate. The first position is a tie between the # second and third group. In each group the candidates have tied also. # Of the five possible candidates the secondary sorting key favors # candidate 3. self.assertCandidate(winners[0], { 'name': u'2, Candidate', 'proportional_votes': Decimal('6'), 'absolute_votes': 3, }) # Second selected candidate. self.assertCandidate(winners[1], { 'name': u'6, Candidate', 'proportional_votes': Decimal('6'), 'absolute_votes': 2, }) # Third selected candidate. The third position is a tie between # the left overs from groups two and three with group four. Out of # these candidates the secondary sorting key favors candidate 5. self.assertCandidate(winners[2], { 'name': u'5, Candidate', 'proportional_votes': Decimal('3'), 'absolute_votes': 2, }) # The remaining candidates that did not fit the quota. self.assertCandidate(winners[3], { 'name': u'7, Candidate', 'proportional_votes': Decimal('3'), 'absolute_votes': 3, }) self.assertCandidate(winners[4], { 'name': u'3, Candidate', 'proportional_votes': Decimal('3'), 'absolute_votes': 3, }) self.assertCandidate(winners[5], { 'name': u'0, Candidate', 'proportional_votes': Decimal('2'), 'absolute_votes': 1, }) self.assertCandidate(winners[6], { 'name': u'4, Candidate', 'proportional_votes': Decimal('2'), 'absolute_votes': 2, }) self.assertCandidate(winners[7], { 'name': u'1, Candidate', 'proportional_votes': Decimal('1'), 'absolute_votes': 1, })
def test_tie_in_proportional_votes(self): """Tests for the case when two or more candidates get the same amount of proportional votes. """ from nuorisovaalit.results import dhont_selection district = self._populate(quota=3) # Votes are distributed so that each group has the same number of # total votes resulting in the tie in the proportional votes. # group 1 self._add_votes(district.candidates[0], 2) self._add_votes(district.candidates[1], 6) # group 2 self._add_votes(district.candidates[2], 5) self._add_votes(district.candidates[3], 3) # group 3 self._add_votes(district.candidates[4], 2) self._add_votes(district.candidates[5], 2) self._add_votes(district.candidates[6], 4) # group 4 self._add_votes(district.candidates[7], 8) winners = dhont_selection(district) self.assertEquals(8, len(winners)) # Assert the secondary sorting key ordering. The expected ordering # was determined manually by evaluating the hashes in an interpreter. self.assertOrdering( district.candidates[2], district.candidates[6], district.candidates[5], district.candidates[7], district.candidates[0], district.candidates[4], district.candidates[3], district.candidates[1], ) # First selected candidate. self.assertCandidate(winners[0], { 'name': u'2, Candidate', 'proportional_votes': Decimal('8'), 'absolute_votes': 5, }) # Second selected candidate. self.assertCandidate(winners[1], { 'name': u'6, Candidate', 'proportional_votes': Decimal('8'), 'absolute_votes': 4, }) # Third selected candidate. self.assertCandidate(winners[2], { 'name': u'7, Candidate', 'proportional_votes': Decimal('8'), 'absolute_votes': 8, }) self.assertCandidate(winners[3], { 'name': u'1, Candidate', 'proportional_votes': Decimal('8'), 'absolute_votes': 6, }) self.assertCandidate(winners[4], { 'name': u'5, Candidate', 'proportional_votes': Decimal('4'), 'absolute_votes': 2, }) self.assertCandidate(winners[5], { 'name': u'0, Candidate', 'proportional_votes': Decimal('4'), 'absolute_votes': 2, }) self.assertCandidate(winners[6], { 'name': u'3, Candidate', 'proportional_votes': Decimal('4'), 'absolute_votes': 3, }) self.assertCandidate(winners[7], { 'name': u'4, Candidate', 'proportional_votes': Decimal('8') / Decimal('3'), 'absolute_votes': 2, })
def test_candidates_less_than_quota(self): """Test for a case where a quota for a district is larger than the number of candidates. In reality this will most likely never happen. """ from nuorisovaalit.results import dhont_selection district = self._populate(quota=20) self._add_votes(district.candidates[0], 2) self._add_votes(district.candidates[1], 3) self._add_votes(district.candidates[2], 2) self._add_votes(district.candidates[3], 4) self._add_votes(district.candidates[4], 1) self._add_votes(district.candidates[5], 2) self._add_votes(district.candidates[6], 4) self._add_votes(district.candidates[7], 3) winners = dhont_selection(district) # We can only get back the number of candidates there are, even if it # is less than the quota. self.assertEquals(8, len(winners)) # Assert the secondary sorting key ordering. The expected ordering # was determined manually by evaluating the hashes in an interpreter. self.assertOrdering( district.candidates[2], district.candidates[6], district.candidates[5], district.candidates[7], district.candidates[0], district.candidates[4], district.candidates[3], district.candidates[1], ) # First selected candidate self.assertCandidate(winners[0], { 'name': u'6, Candidate', 'proportional_votes': Decimal('7'), 'absolute_votes': 4, }) # Second selected candidate self.assertCandidate(winners[1], { 'name': u'3, Candidate', 'proportional_votes': Decimal('6'), 'absolute_votes': 4, }) # Third selected candidate self.assertCandidate(winners[2], { 'name': u'1, Candidate', 'proportional_votes': Decimal('5'), 'absolute_votes': 3, }) # Fourth selected candidate self.assertCandidate(winners[3], { 'name': u'5, Candidate', 'proportional_votes': Decimal('3.5'), 'absolute_votes': 2, }) # Fifth selected candidate self.assertCandidate(winners[4], { 'name': u'2, Candidate', 'proportional_votes': Decimal('3'), 'absolute_votes': 2, }) # Sixth selected candidate self.assertCandidate(winners[5], { 'name': u'7, Candidate', 'proportional_votes': Decimal('3'), 'absolute_votes': 3, }) # Seventh selected candidate self.assertCandidate(winners[6], { 'name': u'0, Candidate', 'proportional_votes': Decimal('2.5'), 'absolute_votes': 2, }) # Eighth selected candidate self.assertCandidate(winners[7], { 'name': u'4, Candidate', 'proportional_votes': Decimal('7') / Decimal('3'), 'absolute_votes': 1, })
def test_mixed_coalitions(self): """Tests when some parties are part of coalitions""" from nuorisovaalit.models import Coalition from nuorisovaalit.results import dhont_selection session = DBSession() district = self._populate(quota=3) # Create a coalition for Köyhien asialla and Piraattipuolue self._add_coalition(u'Red coalition', district, district.candidates[0].party, district.candidates[2].party) self.assertEquals(1, session.query(Coalition).count()) # Create votes for red coalition self._add_votes(district.candidates[0], 2) self._add_votes(district.candidates[1], 3) self._add_votes(district.candidates[2], 2) self._add_votes(district.candidates[3], 4) # Create votes for Suomen työväenpuolue self._add_votes(district.candidates[4], 1) self._add_votes(district.candidates[5], 2) self._add_votes(district.candidates[6], 4) # Create votes for valitsijalista self._add_votes(district.candidates[7], 8) winners = dhont_selection(district) # Assert the secondary sorting key ordering. The expected ordering # was determined manually by evaluating the hashes in an interpreter. self.assertOrdering( district.candidates[2], district.candidates[6], district.candidates[5], district.candidates[7], district.candidates[0], district.candidates[4], district.candidates[3], district.candidates[1], ) # First selected candidate self.assertCandidate(winners[0], { 'name': u'3, Candidate', 'proportional_votes': Decimal('11'), 'absolute_votes': 4, }) # Second selected candidate self.assertCandidate(winners[1], { 'name': u'7, Candidate', 'proportional_votes': Decimal('8'), 'absolute_votes': 8, }) # Third selected candidate self.assertCandidate(winners[2], { 'name': u'6, Candidate', 'proportional_votes': Decimal('7'), 'absolute_votes': 4, }) self.assertCandidate(winners[3], { 'name': u'1, Candidate', 'proportional_votes': Decimal('5.5'), 'absolute_votes': 3, }) self.assertCandidate(winners[4], { 'name': u'2, Candidate', 'proportional_votes': Decimal('11') / Decimal('3'), 'absolute_votes': 2, }) self.assertCandidate(winners[5], { 'name': u'5, Candidate', 'proportional_votes': Decimal('3.5'), 'absolute_votes': 2, }) self.assertCandidate(winners[6], { 'name': u'0, Candidate', 'proportional_votes': Decimal('2.75'), 'absolute_votes': 2, }) self.assertCandidate(winners[7], { 'name': u'4, Candidate', 'proportional_votes': Decimal('7') / Decimal('3'), 'absolute_votes': 1, })
def test_no_coalitions(self): """Test the results when there are no coalitions.""" from nuorisovaalit.results import dhont_selection district = self._populate(quota=3) # group 1 self._add_votes(district.candidates[0], 2) self._add_votes(district.candidates[1], 3) # group 2 self._add_votes(district.candidates[2], 2) self._add_votes(district.candidates[3], 4) # group 3 self._add_votes(district.candidates[4], 1) self._add_votes(district.candidates[5], 2) self._add_votes(district.candidates[6], 4) # group 4 self._add_votes(district.candidates[7], 3) winners = dhont_selection(district) self.assertEquals(8, len(winners)) # Assert the secondary sorting key ordering. The expected ordering # was determined manually by evaluating the hashes in an interpreter. self.assertOrdering( district.candidates[2], district.candidates[6], district.candidates[5], district.candidates[7], district.candidates[0], district.candidates[4], district.candidates[3], district.candidates[1], ) # First selected candidate self.assertCandidate(winners[0], { 'name': u'6, Candidate', 'proportional_votes': Decimal('7'), 'absolute_votes': 4, }) # Second selected candidate self.assertCandidate(winners[1], { 'name': u'3, Candidate', 'proportional_votes': Decimal('6'), 'absolute_votes': 4, }) # Third selected candidate self.assertCandidate(winners[2], { 'name': u'1, Candidate', 'proportional_votes': Decimal('5'), 'absolute_votes': 3, }) self.assertCandidate(winners[3], { 'name': u'5, Candidate', 'proportional_votes': Decimal('3.5'), 'absolute_votes': 2, }) self.assertCandidate(winners[4], { 'name': u'2, Candidate', 'proportional_votes': Decimal('3'), 'absolute_votes': 2, }) self.assertCandidate(winners[5], { 'name': u'7, Candidate', 'proportional_votes': Decimal('3'), 'absolute_votes': 3, }) self.assertCandidate(winners[6], { 'name': u'0, Candidate', 'proportional_votes': Decimal('2.5'), 'absolute_votes': 2, }) self.assertCandidate(winners[7], { 'name': u'4, Candidate', 'proportional_votes': Decimal('7') / Decimal('3'), 'absolute_votes': 1, })