This repository contains the tools and documentation for the way the Python Software Foundation (the PSF) Elections are presently operated. This document will cover the tools in the repository and the processes that the Election Administrator is responsible for.
At least once a year, the PSF runs an election. We (at the time of this writing) use OpaVote. Election administrators should log into OpaVote using one of the options on the front page.
It is best to set your account profile timezone to UTC
in order to ensure
that the start/stop dates configured for elections are correct to your
expectations.
Once signed into OpaVote, locate the button labeled (+) Create Election
.
Click it, and then the administrator will be prompted for the following
information:
-
"Title" - the display title, e.g.,
Python Software Foundation Board of Directors Election 2023
-
"Description" - in the past, administrators used this to explain Approval voting and the importance of the election
List of candidates: https://www.python.org/nominations/elections/2023-python-software-foundation-board/nominees/
This election uses Approval Voting. That is to say that you may Approve as many candidates or bylaws changes as you wish. You may choose to vote for 1, 2, 3, ..., N-1, N, or all N of the candidates. The top M vote-getters will be elected to the board, after all conflict-of-interest, affiliations, and co-affiliation sections of the PSF Bylaws have been satisfied.
The candidates have all been nominated on python.org https://www.python.org/nominations/elections/
Please carefully read the detailed candidate statements linked after each candidate's name. There is a wealth of talent, dedication, diversity, and integrity among these candidates.
It is your responsibility as a voting member of the Python Software Foundation to consider each of these statements. The order that the names appear on this ballot has been randomized and it will not match the order on the nomination page which is also randomized.
Note: Once you have cast your ballot you WILL NOT be able to modify it. Please consider the nominations carefully and cast your ballot once you have come to a decision.
-
"Email text" - Include basic information on the vote, where to find more information, and a notice regarding the end of voting.
The 2023 election for the Board of Directors of the Python Software Foundation is open. The full list of candidates is available at https://python.org/nominations/elections/2023-python-software-foundation-board/nominees.
Voting will close Friday, June 30, 2023 at 11:59 pm UTC as previously announced. See https://www.python.org/nominations/elections/2023-python-software-foundation-board/nominees/ for details on the election as well as helpful countdown clocks.
Note: Once you have cast your ballot you WILL NOT be able to modify it. Please consider the nominations carefully and cast your ballot once you have come to a decision.
-
"Language" -
English
-
"Expert mode" - You MUST enable expert mode! Which will reveal all options following this bullet.
-
"Show results during voting" - "no"
-
"Voting start date" - Optionally this to the date that voting will start. This will automatically send ballots at 12:01 AM that day (In the timezone specified in your account profile).
-
"Voting stop date" - Optionally this to the date that voting will end. This will automatically close the election at 11:59 PM that day (In the timezone specified in your account profile).
-
"Automatic reminders" - "yes"
-
"Anonymous voting" - "yes"
-
"Candidate names" - Add the names of candidates as they appear on the nomination statements, one-per-line.
-
"Method" - "Approval Voting"
-
"Number of winners" - Per Bylaws Section 5.5, 3 or 4 depending on the outgoing cohort size for a given year. It may be more if any additional board vacancies have been created.
-
"Shuffle candidate order": "yes"
-
There may be additional questions such as bylaws changes, if so use the
(+) Add Another Contest
button and use judgement to determine how to add them.
The Election Adminitsrator (EA) will receive a file with the first name, last name, membership type, and email address of a voter. In order to add voters to an election, OpaVote requires they be uploaded in an ASCII text file in the format::
email-address
For example::
The format of the file the election administrator typically gets is of the format::
FirstName,LastName,MembershipType,Email
There is a tool in this repository to handle it called
convert-exported-csv-for-opavote.py
. This will generate the necessary
format for OpaVote from the CSV file the EA receives.
It's important to note here that not all voters have a first or last name and some don't have either.
Running an election begins once the election starts. While an election is in progress, a few things may happen:
-
New voters may need to be added as they were missed when the original voter list was generated
-
Some voters may need you to send/re-send their ballot notification email
The following sub-sections will cover these in detail.
OpaVote allows us to add new voters after an election has begun although the other details of the election or questions cannot be altered. The process for adding new voters is the same as is detailed above in "Setting up Voters". The EA will receive a new file full of the details of the voters who were missed. Using that, the EA can generate a new CSV to upload to OpaVote using the same tooling.
OpaVote provides statistics on pending, in-transit, rejected, and delivered ballot emails. It also tracks opens, clicks, and visits.
If a reminder is necessary, it can be sent from the admin console by finding the voter and clicking "Send Ballot".
If "Automatic reminders" was not selected during election setup, OpaVote will automatically send reminders every three days throughout the election period.
The end of an election requires the EA to verify the results of the election
with OpaVote and then present the results to the Executive Director of the PSF.
The Executive Director will then announce the results to the community.
At that time, the 🌎 Publish Results
button on OpaVote can be used to
publish the full results to all voters.
Caution
OpaVote does not retain history of elections. Ensure that you retrieve
a copy of the voter_list.csv
from the All voter statistics
section of
the election management dashboard. Store it somewhere safe that future
election administrators or PSF staff will have access to.
This data is pertienet to tracking voter participation over time.
The PSF Bylaws_ state that one-third (1/3) of the members elligible to vote will constitute a quorum. See also:
Except as otherwise required by law, by the Certificate of Incorporation or by these Bylaws, one-third (1/3) of the members entitled to vote (the voting members), represented in person or represented by proxy, shall constitute a quorum at a meeting of members.
For electronic votes, a quorum shall be reached as soon as one-third (1/3) of the members entitled to vote (the voting members) have cast their vote. If the voting period ends before a quorum is reached, the vote is declared void.
-- Python Software Foundation Bylaws, Section 3.9. Member Quorum
For example, if there are 999 voters in an election, there must be 333 votes cast at least in order to declare quorum.
In the case of a Board of Directors Election, the top N
candidates are
accepted based on the number of open seats in that Election. If there is a tie
for the Nth
seat, then there is a script that may be used to break the tie
called break-ties.py
(cleverly named, eh?).
Let's say that there is a 4 way tie between "Candidate 0", "Candidate 3", "Candidate 8", and "Candidate 12" and we need 2 more people to round out the total, then we would do::
python3 break-ties.py -n 2 \
-c "Candidate 0" \
-c "Candidate 3" \
-c "Candidate 8" \
-c "Candidate 12"
And it would print the winning candidates. Re-running this script will always result in the same candidates winning the tie breaker. This is by design so that the tie breaker results may be verified by someone other than the EA.