Skip to content

Commit

Permalink
Improve VVVote integration
Browse files Browse the repository at this point in the history
- Open links to VVVote in new tabs
- Use random order for multiple propositions per ballot
- Use qualification date to order ballots
- Send ballot id and rand part of proposition id to VVVote instead of sequential numbers
  • Loading branch information
kaenganxt committed Oct 23, 2023
1 parent 32246a8 commit 88f4cea
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@
ul.votings
for title, url in votings
li
a.btn.btn-primary.btn-sm(href=url)
a.btn.btn-primary.btn-sm(href=url,target='_blank')
i.fas.fa-sign-in-alt  
= _('register_now_with_voting_module', title=title)

Expand All @@ -65,7 +65,7 @@
ul.votings
for title, url in votings
li
a.btn.btn-primary.btn-sm(href=url)
a.btn.btn-primary.btn-sm(href=url,target='_blank')
i.fas.fa-person-booth  
= _('vote_now_with_voting_module', title=title)

Expand All @@ -74,7 +74,7 @@
ul.votings
for title, url in voting_results
li
a.btn.btn-secondary.btn-sm(href=url)
a.btn.btn-secondary.btn-sm(href=url,target='_blank')
i.fas.fa-poll-h  
= _('show_results_with_voting_module', title=title)

Expand Down
10 changes: 5 additions & 5 deletions src/ekklesia_portal/concepts/voting_phase/voting_phase_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -192,12 +192,12 @@ def retrieve_voting(self, request):

with start_action(action_type="apply_election_results") as action:
result_objs = []
for ii, ballot in enumerate(self.ballots, start=1):
result = results.get(str(ii))
if result:
for ballot in self.ballots:
if str(ballot.id) in results:
result = results.get(str(ballot.id))
result_obj = {}
for option_id, proposition in enumerate(ballot.propositions, start=1):
if option_id in result:
for proposition in ballot.propositions:
if int(proposition.id) & ((2 ** 22) - 1) in result:
res = OpenSlidesVotingResult.ACCEPTED
else:
res = OpenSlidesVotingResult.REJECTED
Expand Down
31 changes: 23 additions & 8 deletions src/ekklesia_portal/lib/vvvote/election_config.py
Original file line number Diff line number Diff line change
@@ -1,22 +1,29 @@
import random
from uuid import uuid4

import ekklesia_portal.lib.vvvote.schema as vvvote_schema


def ballot_to_vvvote_question(ballot, question_id=1):
def ballot_to_vvvote_question(ballot):
options = []
voting_scheme_yes_no = vvvote_schema.YesNoScheme(
name='yesNo', abstention=True, abstentionAsNo=False, quorum=2, mode=vvvote_schema.SchemeMode.QUORUM
name=vvvote_schema.SchemeName.YES_NO, abstention=True, abstentionAsNo=False, quorum=2, mode=vvvote_schema.SchemeMode.QUORUM
)

voting_scheme_score = vvvote_schema.ScoreScheme(name='score', minScore=0, maxScore=3)
proposition_count = len(ballot.propositions)
voting_scheme_score = vvvote_schema.ScoreScheme(
name=vvvote_schema.SchemeName.SCORE, minScore=0, maxScore=3 if proposition_count <= 5 else 9)

voting_scheme = [voting_scheme_yes_no, voting_scheme_score]

for option_id, proposition in enumerate(ballot.propositions, start=1):
# Random order of propositions in ballot
propositions = list(ballot.propositions)
random.shuffle(propositions)

for proposition in propositions:
proponents = [s.member.name for s in proposition.propositions_member if s.submitter]
option = vvvote_schema.Option(
optionID=option_id,
optionID=int(proposition.id) & ((2 ** 22) - 1), # Only use the random bits (64bit not supported in JSON)
proponents=proponents,
optionTitle=proposition.title,
optionDesc=proposition.content,
Expand All @@ -31,17 +38,25 @@ def ballot_to_vvvote_question(ballot, question_id=1):

question = vvvote_schema.Question(
questionWording=question_wording,
questionID=question_id,
questionID=ballot.id,
scheme=voting_scheme,
options=options,
findWinner=['yesNo', 'score', 'random']
findWinner=[vvvote_schema.SchemeName.YES_NO, vvvote_schema.SchemeName.SCORE, vvvote_schema.SchemeName.RANDOM]
)

return question


def get_ballot_sort_key(ballot):
props = list(ballot.propositions)
props.sort(key=lambda prop: prop.qualified_at)
return props[0].qualified_at


def voting_phase_to_vvvote_election_config(module_config, phase) -> vvvote_schema.ElectionConfig:
questions = [ballot_to_vvvote_question(b, ii) for ii, b in enumerate(phase.ballots, start=1)]
ballots = list(phase.ballots)
ballots.sort(key=get_ballot_sort_key)
questions = [ballot_to_vvvote_question(ballot) for ballot in ballots]

if phase.registration_start is None:
raise ValueError("Cannot create voting for phase {phase}, registration_start is None")
Expand Down

0 comments on commit 88f4cea

Please sign in to comment.