In order to prepare a GNOME Board of Directors election, the rough workflow is like this:
- figure out a timeline
- create web pages
- send announcements
- set up voting
- prepare the results
We hope to be able to guide you through these steps.
Firstly, clone the foundation-web git module as holds the web page which is served as http://vote.gnome.org. You can achieve that with:
git clone ssh://USERNAME@git.gnome.org/git/foundation-web
You will then need to copy an old election to a new one, i.e.:
cp -rf ./vote/2010 ./vote/2011
Within that directory, adapt the vote/index.wml, vote/Makefile.am, vote/2011/Makefile.am, and index.wml as well as other files. To make the website build properly, you need to update configure.in in the root directory to include the Makefile of the newly added directory. Please remember that you will have to update htaccess to make /electionrules.html point to the current election rules, i.e. ./elections/2011/rules.html.
Especially have a look at mkical.py and define the dates for the timeline there. If you want, you can align the dates on Sundays, so that people have time to submit votes. You do want to leave enough time at the end, either because there might be challenges or because problems appear. If the board is to be elected in July, it seems wise to plan to close challenges by mid-June, leaving a very good week for resolving problems.
Once you have populated mkical.py with your dates, you can run to obtain a textual representation of the election timeline:
python mkical.py --text
With that, you can write an email like this and send it to the board-list, asking for a quick review, just to make sure that everything is alright and everybody is satisfied:
To: email@example.com "Dear Board, for the upcoming elections we are proposing the following schedule: May 2011 Mon Tue Wed Thu Fri Sat Sun 1 2 3 4 5 6 7 8 (9) 10 11 12 13 14 15 Announcements and list of candidates opens (9th) 16 17 18 19 20 21 (22) List of candidates closed (22nd) 23 24 (25) 26 27 28 (29) List of candidates announced (25th) 30 31 Instructions to vote are sent (29th) June 2011 Mon Tue Wed Thu Fri Sat Sun 1 2 3 4 5 6 7 8 9 10 11 (12) Votes must be returned (12th) 13 (14) 15 16 17 18 19 Preliminary results are announced (14th) 20 (21) 22 23 24 25 26 Challenges to the results closed (21st) 27 28 29 30 Please review the schedule. If there are no issue with the schedule, we'll send the announcement by Monday, 9th, latest. Thanks in advance"
If the schedule is not challenged, you can created an ical file, if you wish, using mkical.py --ical > timeline.ics.
Once you have done the necessary changes to the files, you can upload your changes:
git commit -a git push
Announcing the upcoming elections
You may then send an announcement to the following mailing lists:
To: firstname.lastname@example.org Cc: email@example.com In-Reply-To: firstname.lastname@example.org "Dear Foundation Members, As part of the Membership and Elections Committee, I am pleased to announce the upcoming elections for the Board of Directors in Spring 2011. The most important deadlines (UTC) in the timeline are the following: *GNOME Board Elections 2011* 2011-05-22: List of candidates closed 2011-05-29: Voting Begins 2011-06-12: Voting Ends 2011-06-21: Challenges End ELECTIONS ========= The seven members of our current Board of Directors are ruling GNOME for 12 month now. We, the GNOME Foundation Members, will have to either replace or reelect current members. CANDIDACY ========= If you want to run for one of the seven places in the Board of Directors, send an email to email@example.com with your full name, e-mail, corporate affiliation (if any), and a description of your reasons for wanting to serve as a director. Candidacies must be announced prior to 2011-05-22, 23:59 UTC. All discussion related to the elections should be held on foundation-list. Members are invited to ask questions to one or all candidates on that list (see below). A list of candidates will be announced on 2011-05-25. You are invited to ask questions by sending them to foundation-list. After all, the candidates might become your representative. So do not hesitate to ask a question. But please try to avoid duplicates and bear in mind, that the candidates invest a lot of time answering questions, thus please be reasonable with the amount and scope of the questions. You might want to send your question to firstname.lastname@example.org instead, so that we can collect, sift and sort the questions before we send them out. But again: if you feel the need to ask your question directly, please do so. ELECTORATE ========== Every GNOME foundation member whose membership is valid in the range of the full voting period, including challenges (2011-05-29 - 2011-06-21) is eligible to vote. If you are not a member yet, please consider to apply ASAP. Late applications will most likely not be processed in time. We will inform the people that might need to renew via email. You might want to double check yourself though. Please verify that the email address, that is associated with your GNOME Foundation membership, is valid and that your able to read emails sent to this address. You can check whether you are a member or what email address is recorded on this website: <http://www.gnome.org/foundation/membership/>. If you have any issues, please write to email@example.com. VOTING ====== The Electorate will receive complete instructions on how to vote by 2011-05-29 via email. The 7 candidates voted for most as counted by a single transferable vote system (Scottish STV) will be elected, except that no more than two individuals affiliated with any one corporation may be elected. In the event of a tie for the final slot on the board, the Elections Committee will schedule run-off elections as soon as possible. CALENDAR ======== May 2011 Mon Tue Wed Thu Fri Sat Sun 1 2 3 4 5 6 7 8 (9) 10 11 12 13 14 15 Announcements and list of candidates opens (9th) 16 17 18 19 20 21 (22) List of candidates closed (22nd) 23 24 (25) 26 27 28 (29) List of candidates announced (25th) 30 31 Instructions to vote are sent (29th) June 2011 Mon Tue Wed Thu Fri Sat Sun 1 2 3 4 5 6 7 8 9 10 11 (12) Votes must be returned (12th) 13 (14) 15 16 17 18 19 Preliminary results are announced (14th) 20 (21) 22 23 24 25 26 Challenges to the results closed (21st) 27 28 29 30 Happy Voting"
You need to find out the members that had a valid membership for the last elections, but not for the current one.
You should have access to the foundation's database. If not, ask the Membership Committee's Chairman to do that for you.
You could use a MySQL Query like that:
SET names 'utf8'; use foundation; SELECT CONCAT(firstname, ';', lastname, ';', email, ';', las$ FROM foundationmembers WHERE last_renewed_on >= DATE_SUB( CONCAT( YEAR( DATE_SUB(CURDATE(), INTERVAL 1 YEAR) ), '-07-01' ), INTERVAL 2 YEAR ) AND last_renewed_on <= DATE_SUB( CONCAT(YEAR(CURDATE()), '-07-01'), INTERVAL 2 YEAR ) ORDER BY last_renewed_on;
Or a script which is in the foundation-web module, known as "get_renewees.py".
Meanwhile, follow foundation-announce and check via Mango if the candidates are actually members. Edit the list of candidates in the git module, i.e. the candidates.wml page.
In the case someone withdraws before the ballots have been sent out, the withdrawer should mail firstname.lastname@example.org and the MembershipCommittee will take the needed actions, such as removing the name from the list or the database.
In the case the withdrawal happens after the ballots have been sent out, the election continues as planned and the withdrawer, if elected, may resign immediately. The Board may pick a replacement as per the bylaws.
Note: If there are fewer candidacies than seats, the election runs as planned. The elected Board can fill the missing seats, as per the bylaws.
Once the deadline to announce candidacies has passed, you can send an email to foundation-announce with a compiled list of candidates and some encouraging words to ask questions:
To: email@example.com Reply-To: firstname.lastname@example.org Subject: GNOME Board of Directors Foundation Elections Spring 2012 - The candidates "Dear Foundation Members, I am glad to announce the following list of candidates for the Board of Directors. * Shaun McCance * Andrea Veri * Rodrigo Moya * Emmanuele Bassi * Pockey Lam * Stormy Peters * Bastien Nocera * Brian Cameron * Lionel Dricot * Germán Póo-Caamaño * Andre Klapper * Ryan Lortie * Diego Escalante Urrelo Please see <http://vote.gnome.org/2012/candidates.html> for details. We are having discussions on foundation-list already. That's fine. You are invited to ask questions by sending them to foundation-list. But please try to avoid duplicates and bear in mind, that the candidates invest a lot of time answering questions, thus please be reasonable with the amount and scope of the questions. You might want to send your question to email@example.com instead, so that we can collect, sift and sort the questions before we send them out shortly after the ballots were sent. But again: if you feel the need to ask your question directly, please do so. If you have any questions, do not hesitate to ask them at firstname.lastname@example.org or email@example.com Cheers"
After that's made official you have to prepare an SQL statement for later insertion in to the database. But before we do that, ssh to window and make a backup of the database:
mysqldump --lock-tables=FALSE foundation > ~/elections/foundation-db-`date +'%Y-%m-%d-%R'`.sql
Better make ~/elections/ non readable to others. You can then submit the SQL statement:
SET NAMES 'utf8'; INSERT INTO elections (type, name, voting_start, voting_end, choices_nb, question) VALUES ("elections", "2011 Spring Board of Directors Election", "2011-05-29 00:00:00", "2011-06-12 23:59:59", "7", "Which candidates would you like to see in the GNOME Foundation Board?"); set @el_id = @@IDENTITY; INSERT INTO election_choices (election_id, choice) VALUES (@el_id, 'Shaun McCance'), (@el_id, 'Andrea Veri'), (@el_id, 'Rodrigo Moya'), (@el_id, 'Emmanuele Bassi'), (@el_id, 'Pockey Lam'), (@el_id, 'Stormy Peters'), (@el_id, 'Bastien Nocera'), (@el_id, 'Brian Cameron'), (@el_id, 'Lionel Dricot'), (@el_id, 'Germán Póo-Caamaño'), (@el_id, 'Andre Klapper'), (@el_id, 'Ryan Lortie'), (@el_id, 'Diego Escalante Urrelo');
For the next years, try to make the columns of the table election_tmp_tokens NOTNULL.
Next, the ballots need to be created. The ballots are basically a random string that is used to authentify the elector. To do that, you can simply do smth like (ideally in the very same MySQL Shell that you used for the above mentioned query):
INSERT INTO election_tmp_tokens (election_id, member_id, tmp_token) SELECT @el_id, id, SUBSTRING(MD5(RAND()) FROM 1 FOR 24) AS tmp_token FROM electorate;
If @election_id is not set, you will end up having tokens defined for the election "0". That's not a problem. Either DELETE them or UPDATE with the appropriate election_id which you get with somehting like a SELECT * FROM elections.
After the tokens are generated, we want to send them off. You have to prepare the voting-instructions.txt, which should look like this:
firstname.lastname@example.org GNOME Foundation Board election - Voting instructions Dear <member>, The election of the GNOME Foundation Board is now open. Voting will run from May 25th until June 08th 2014, 23:59 UTC. To vote, please go to https://vote.gnome.org/vote.php?id=22 and follow the instructions there. A list of candidates and their reasons for running is available at https://vote.gnome.org/2014/candidates.html When instructed to do so, enter the following details: E-mail: Vote token: The election has 4 steps - first, you must identify yourself using the voting token above. Then select your preferred candidates in order of preference. A third step will show you your choice, and ask you to confirm or return to the previous step. Finally, after confirming your choice, a unique identifier will be given to you which will allow you to verify after the election that your vote was counted correctly. To ensure anonymity, no link will be kept between this token and your identifiers, so please keep this token safe. Once you have voted, you will not be able to vote again. Thank you for your vote! Regards, Fabiana Simões on behalf of the GNOME Membership and Elections Commitee
Once you've done that, you can send the ballots out, using the mail-instructions.py script. The script requires a list of firstnames, lstnames and tokens you can retrieve by querying the database with: (assuming election ID is 21)
SELECT CONCAT(firstname, ' ', lastname, ';', email, ';', tmp_token) FROM election_tmp_tokens, foundationmembers WHERE election_id = 21 AND member_id = id;
Once done, populate a maildata file with the sanitized result of the above query, then test the script by including your lastname, firstname and token. Once tested send the ballots with the following command:
python mail-instructions.py maildata mail-instructions.txt
The email specified on the very first line of the mail-instructions.txt file above is needed by the script to work properly as that will be the mail address used as the To: field on the generated mails.
Finally, announce that the tokens have been sent, as it follows:
To: foundation-announce Reply-To: foundation-list Subject: GNOME Board of Directors Elections 2011 - Voting Instructions sent "Dear Foundation Members, we have just sent the ballots to the registered email addresses of the electorate. If you have not received your voting instructions, have a look on the list of eligible voters on <http://www.gnome.org/foundation/membership/> and check the email account that is associated with you. Also check the SPAM folder. In case you are not on the list of eligible voters but think you should be, write us an email (see below). If you have any questions, do not hesitate to ask them at email@example.com or firstname.lastname@example.org Happy Voting"
People will come and complain about the token that they haven't received. It either went missing or the email address was wrongly noted in the database. In any case, you need to find the ID of the member, i.e. using Mango (the URL of a member reveals its ID). With the ID do something like:
SELECT * FROM election_tmp_tokens WHERE election_id = 17 AND member_id = $ID;
Send that information along with the above mentioned voting-instructions.
Once the elections are over, you can download the .blt file from the election website, as an example from past elections, feel free to follow this link. Also, you might want to put that ballot file into the git repository to have it archived.
To get the results, you need OpenSTV. Version 1.4 is GPL while 2.0 is not. You may get it from this link. If you can't find that version easily, you might as well try the Debian/Ubuntu repositories, as they ship openstv at the time of writing (2012). But you may need a patch like this:
--- ballots.py.orig 2009-06-07 21:45:56.391744128 +0200 +++ ballots.py 2009-06-07 21:33:01.532619218 +0200 @@ -440,7 +440,7 @@ self.index = 0 self.fName = fName f = open(self.fName, "r") - self.buffer = f.read() + self.buffer = f.read().decode("utf8") f.close()
Once you have the results, announce them, stating that there is a grace period for challenges.
To prepare the results for the web page, you need to export the results to HTML. The body of the HTML needs to get into the database somehow. The easiest will probably be to to prepare a simple file like this:
use foundation set names 'utf8'; REPLACE INTO election_results VALUES (17, 'Rest of the HTML');
And then just do:
mysql foundation < /tmp/results.sql
If there are no challenges, then you're done! Congratulations, you've just carried out an election!