summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsdfsdf <sdfsdf@sfsdfsdf>2016-09-10 13:25:36 +0000
committerMiklos Vajna <vmiklos@collabora.co.uk>2017-12-04 17:14:55 +0100
commit1576cc5e4f59a93313738bff8baf1ec223590bef (patch)
tree2af9c8665ca7e3139cea478f894e1725ef7e04db
parent9cc8d6505c546b9f7b8457bba723612b29d0a418 (diff)
new voting
-rw-r--r--vote/2016-mc/Makefile.am14
-rw-r--r--vote/2016-mc/candidates.wml176
-rw-r--r--vote/2016-mc/index.wml58
-rwxr-xr-xvote/2016-mc/mkical.py252
-rw-r--r--vote/2016-mc/rules.wml58
-rw-r--r--vote/2016-mc/shuffle.js8
-rw-r--r--vote/2016-mc/timeline.ics71
-rw-r--r--vote/2016-mc/voting-instructions.txt38
-rw-r--r--vote/include/step2-choose.php2
-rw-r--r--vote/include/step3-confirm.php3
-rw-r--r--vote/index.wml1
11 files changed, 679 insertions, 2 deletions
diff --git a/vote/2016-mc/Makefile.am b/vote/2016-mc/Makefile.am
new file mode 100644
index 0000000..b7b182f
--- /dev/null
+++ b/vote/2016-mc/Makefile.am
@@ -0,0 +1,14 @@
+SUBDIRS =
+
+urlpath = /vote/2014-mc
+
+page_SCRIPTS = \
+ index.html \
+ candidates.html\
+ rules.html
+
+page_DATA = \
+ timeline.ics
+ mkical.py
+
+include $(top_srcdir)/rules.common
diff --git a/vote/2016-mc/candidates.wml b/vote/2016-mc/candidates.wml
new file mode 100644
index 0000000..6759614
--- /dev/null
+++ b/vote/2016-mc/candidates.wml
@@ -0,0 +1,176 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+
+ <head>
+ <title>The Document Foundation 2016 Membership Committee Election Candidates</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+ </head>
+
+ <body>
+ <h1>Candidates for The Document Foundation 2016 Membership Committee Election</h1>
+
+ <p>
+Below you will find a list of candidates who are running for The Document Foundation Membership Committee. A short summary statement from each candidate and a link to their full candidacy announcement is provided to help you learn more about them. We encourage all voters to read the full candidacy statements and related discussions on <a href="http://listarchives.documentfoundation.org/www/board-discuss/">board-discuss@documentfoundation.org</a>.
+ </p>
+
+ <p> When deciding whom you should vote for, please carefully
+ consider the various tasks Membership Committee seat holders must
+ perform. This <a href="../overview-mc.html">overview</a> may be
+ helpful. Keep in mind that the committee will decide on granting
+ membership, and renewal thereof, and also plays an important role
+ as a counter-balance to the board of directors. It is a good idea
+ to strive for a well-balanced committee, consisting of people with
+ various backgrounds, skills, and perspectives. </p>
+
+ <p>
+ Additional elections details can be found in the
+ <a href="http://www.documentfoundation.org/satzung.pdf">Document Foundation statutes</a> (and the non-binding
+ <a href="http://www.documentfoundation.org/statutes.pdf">English version</a>).
+ </p>
+
+ <p>
+ If you have any questions, please send them to either
+ <a href="mailto:board-discuss@documentfoundation.org">board-discuss@documentfoundation.org</a> (public list)
+ or in private to the Board of Directors at <a
+ href="mailto:elections@documentfoundation.org">elections@documentfoundation.org</a>.
+ </p>
+
+ <h2>Candidates for The Document Foundation Membership Committee</h2>
+
+ <p>In random order:</p>
+
+ <ol>
+ <li><strong>Miklos Vajna</strong><br />
+ Affiliation: <em>Collabora</em><br />
+ <blockquote>
+ I am hacking on LibreOffice since its birth, contributing features and
+fixes mostly around Writer. I would like to be part of the Membership
+Committee to ensure that every aspect of the TDF community is
+represented in the committee, including developers. Given my background,
+I'm happy to help the work of the committee also at a technical level
+(git, gerrit issues).
+ </blockquote>
+ <!-- Verified Member -->
+ </li>
+ <li><strong>Charles-H. Schulz</strong><br />
+ Affiliation: <em>none</em><br />
+ <blockquote>
+I would like to continue my work inside the Membership Committee for another term. I therefore declare my candidacy for the Membership Committee. I have been among the founders of the Document Foundation, a former board member and these days I'm mostly active in social networking and website edition for the LibreOffice project.
+ </blockquote>
+ <!-- Verified Member -->
+ </li>
+ <li><strong>Gabriele Ponzo</strong><br />
+ Affiliation: <em> external collaborations with Studio Storti</em><br />
+ <blockquote>
+I would like to continue my work inside the Membership Committee for another term. I therefore declare my candidacy for the Membership Committee. I've been part of LibreUmbria and LibreDifesa projects as well as of other migrations as TDF Certified Trainer and Migration expert. It's been an interesting and challenging experience to be part of current MC and I'd like to continue serving our great community and Foundation.
+ </blockquote>
+ <!-- Verified Member -->
+ </li>
+ <li><strong>Andras Timar</strong><br />
+ Affiliation: <em>Collabora</em><br />
+ <blockquote>
+ I would like to continue my work inside the Membership Committee for another term. I therefore declare my candidacy for the Membership Committee. (I have been working as a deputy member of Membership Committee since 2014.) I have been involved in OpenOffice.org, then LibreOffice for 14 years, I know a lot of people from the community, and I have a good overview of development and localization. I have time and desire to serve in this position.
+ </blockquote>
+ <!-- Verified Member -->
+ </li>
+ <li><strong>Noel John Grandin</strong><br />
+ Affiliation: <em>Peralex Electronics, Collabora UK</em><br />
+ <blockquote>
+ Running for membership committee, 3+ years of contributing my own special brand of disruption to the LibreOffice codebase, 20+ years of experience in the software industry. 30+ years of programming.
+ </blockquote>
+ <!-- Verified Member -->
+ </li>
+ <li><strong>Katarina Behrens</strong><br />
+ Affiliation: <em>CIB</em><br />
+ <blockquote>
+ I'm a long-time LibreOffice code contributor, working for CIB as a professional
+LibreOffice bug squasher. I'd like to put my connection with both code and design community (together
+with the knowledge of multiple languages) to good use in the Membership
+Committee. By serving there, I'd love to help building a diverse community,
+where everyone regardless of their gender, ethnicity or disability has their
+say and where both code and non-code contributions are equally valued.
+ </blockquote>
+ <!-- Verified Member -->
+ </li>
+ <li><strong>Antonio Faccioli</strong><br />
+ Affiliation: <em>Studio Storti</em><br />
+ <blockquote>
+ I would like to make available to all members of the Foundation my passion and my determination to consolidate and bring more people to the community LibreOffice. I think a large and cohesive group of members can only strengthen the project.
+ </blockquote>
+ <!-- Verified Member -->
+ </li>
+ <li><strong>Cor Nouws</strong><br />
+ Affiliation: <em>Nou&amp;Off</em><br />
+ <blockquote>
+ I would like to be a candidate for the Membership Committee (MC) with
+the upcoming elections. Since quite early (say 2004 ) I'm an active member of this community
+with some emphasis on QA, marketing but also contributions to UX, l10n
+and tiny bits for development. I help in the Dutch language community
+and run a small company dedicated to make organizations happy and smart
+users of LibreOffice. The great variety in our community inspires me;
+therefore as member of the MC (too), I try to help building a diverse,
+strong community.
+ </blockquote>
+ <!-- Verified Member -->
+ </li>
+ <li><strong>Klaus-Jürgen Weghorn</strong><br />
+ Affiliation: <em>none</em><br />
+ <blockquote>
+I am a civil engineer and urban planner and therefore more familiar with the user side than with the development. For LibO I'm working e.g on some marketing stuff like the presentations and logos for our conferences and the badges for our Month of LibreOffice.
+Currently I'm a member of the Membership Committee and would like to continue my work there.
+ </blockquote>
+ <!-- Verified Member -->
+ </li>
+ <li><strong>Stephan Bergmann</strong><br />
+ Affiliation: <em>Red Hat, Inc.</em><br />
+ <blockquote>
+ I've been around the LibreOffice (and formerly StarOffice/OpenOffice.org) ecosystem for nearly two decades now. And still feel excited about the enthusiasm of the LO community in my daily work. So I'd like to give back some of that enthusiasm by serving on the Membership Committee.
+ </blockquote>
+ <!-- Verified Member -->
+ </li>
+ <li><strong>Gustavo Buzzatti Pacheco</strong><br />
+ Affiliation: <em>none</em><br />
+ <blockquote>
+ I'm from Porto Alegre, Brazil. I have been working in our Community since 2003, mainly in the Brazilian project in many areas (documentation, digital inclusion, marketing, extensions,...). Currently, I'm the hand behind the @opendocument account on Twitter where I spread the news about LibreOffice, OpenDocument and Free Software around the World. I think our Membership Committee should continue to represent our global and plural project, so I would like to contribute with my colaborative experience.
+ </blockquote>
+ <!-- Verified Member -->
+ </li>
+ <li><strong>Ellen Pape</strong><br />
+ Affiliation: <em>none</em><br />
+ <blockquote>
+I am an instructor in IT business, teacher in a distance learning school and
+social media manager. My collaboration with Open Office startet, when I made
+the membership administration for FrODeV, the entity that helped to create
+the TDF. Since then I represented Libre Office in various opportunities.
+Last was the Didacta Fair in Cologne. Under
+https://blog.documentfoundation.org/blog/2016/03/02/libreoffice-didacta/ you
+can see our report (in English) and download in German, Spanish and French).
+Also I am taking care of the german account of Libre Office in Facebook,
+Twitter and Google+. I would like to contribute in the membership committee.
+ </blockquote>
+ <!-- Verified Member -->
+ </li>
+ </ol>
+
+
+
+ <h2>Additional elections-related Information</h2>
+
+ <p>
+ Note, that according to the
+ <a href="http://www.documentfoundation.org/satzung.pdf">Document Foundation statutes</a> (and the non-binding
+ <a href="http://www.documentfoundation.org/statutes.pdf">English version</a>),
+ there is a 1/3 maximum on the number of people affiliated with any one company that can be on the committee or
+ amongst the deputies. For details refer to the statutes. You will be able to vote for up to 9 candidates of your choice, with no
+ restrictions, except that you cannot vote more than once for the same candidate.
+ </p>
+
+ <p>
+ If you have any futher question, please consult the
+ <a href="rules.html">Rules for this election</a> or write to
+ <a href="mailto:elections@documentfoundation.org">elections@documentfoundation.org</a>.
+</p>
+ <script src="shuffle.js" />
+ </body>
+</html>
diff --git a/vote/2016-mc/index.wml b/vote/2016-mc/index.wml
new file mode 100644
index 0000000..682f75e
--- /dev/null
+++ b/vote/2016-mc/index.wml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+
+ <head>
+ <title>The Document Foundation 2016 Membership Committee Election</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ </head>
+
+ <body>
+
+ <h1>The Document Foundation 2016 Membership Committee Election</h1>
+
+ <p>
+ The Document Foundation Membership currently elects the
+ Membership Committee during autumn of every other year. Any
+ member can nominate
+ themself to run in the elections. The overall elections process
+ is overseen by the Board of Directors, which can
+ be reached at <a
+ href="mailto:elections&#64;documentfoundation&#46;org">elections&#64;documentfoundation&#46;org</a>.
+ </p>
+
+ <p>
+ The elections results from the 2016 Membership Committee elections
+ will be archived here for public access.
+ </p>
+
+ <h2>2016 Membership Committee Elections Materials:</h2>
+ <ul>
+ <li>
+ <a href="../results.php?election_id=8">Detailed election results</a>
+ </li>
+ <li>
+ <a href="../votes.php?election_id=8">List of all votes</a>
+ </li>
+ <li>
+ <a href="../vote.php?election_id=8">Interface to vote</a>
+ </li>
+ <li>
+ <a href="candidates.html">List of candidates for the Membership Committee</a>
+ </li>
+
+ <li>
+ <a href="http://www.documentfoundation.org/governance/members/">List of registered voters</a>
+ </li>
+
+ <li>
+ <a href="rules.html">Elections Rules and Timeline</a>
+ </li>
+
+ <li>
+ <a href="../overview-mc.html">Overview of the Membership Committee work</a>
+ </li>
+ </ul>
+
+ </body>
+</html>
diff --git a/vote/2016-mc/mkical.py b/vote/2016-mc/mkical.py
new file mode 100755
index 0000000..9c8b784
--- /dev/null
+++ b/vote/2016-mc/mkical.py
@@ -0,0 +1,252 @@
+#!/usr/bin/env python
+'''
+This Python script creates a simple iCal file based on hardcoded events
+in this file.
+'''
+
+import calendar
+import datetime
+import logging
+import math
+import os
+import vobject
+
+
+#### Configure these variables
+YEAR = 2016
+CANDIDATES_OPENED_DATE = (YEAR, 7, 25) # In 2012, begin earlier in May
+CANDIDATES_CLOSED_DATE = (YEAR, 8, 31)
+CANDIDATES_ANNOUNCED_DATE = (YEAR, 9, 8)
+VOTING_OPENED_DATE = (YEAR, 9, 8)
+VOTING_CLOSED_DATE = (YEAR, 9, 14)
+PRELIMINARY_RESULTS_DATE = (YEAR, 9, 15)
+CHALLENGE_CLOSED_DATE = (YEAR, 9, 17)
+
+
+
+### I'm sorry that these functions clutter your calendar-creating experience
+### Please scroll down a bit to edit the description texts
+
+#### Application Data
+def c(multilinestring):
+ '''
+ A helper functions which cleans up a multiline string, so that
+ it doesn't contain any newlines or multiple whitespaces
+ '''
+ stripped = [l.strip() for l in multilinestring.splitlines()]
+ ret = " ".join (stripped)
+ return ret
+
+def d(year, month, day):
+ '''
+ Just a tiny wrapper around datetime.datetime to create a datetime object
+ '''
+ return datetime.date(year, month, day)
+
+
+
+CANDIDATES_OPENED = (
+ d(*CANDIDATES_OPENED_DATE),
+ 'Announcements and list of candidates opens',
+ c("""If you are a member of The Document Foundation and are interested
+ in running for election, you may nominate yourself by sending an
+ e-mail to elections@documentfoundation.org with your name, e-mail
+ address, corporate affiliation (if any), and a description of why
+ you'd like to serve, before
+ %s (23:59 UTC).""" % d(*CANDIDATES_CLOSED_DATE)) + '''
+ ''' + c("""
+ You should also send a summary of your candidacy announcement
+ (75 words or less) to board-discuss@documentfoundation.org. """) + '''
+ '''
+)
+
+CANDIDATES_CLOSED = (
+ d(*CANDIDATES_CLOSED_DATE),
+ 'List of candidates closed',
+ CANDIDATES_OPENED[2] # Get the same text again
+)
+
+CANDIDATES_ANNOUNCED = (
+ d(*CANDIDATES_ANNOUNCED_DATE),
+ 'List of candidates announced',
+ 'You may now start to send your questions to the candidates'
+)
+
+VOTING_OPENED = (
+ d(*VOTING_OPENED_DATE),
+ 'Instructions to vote are sent',
+ 'Please read your email and follow these instructions and submit your vote by %s' % d(*VOTING_CLOSED_DATE)
+)
+VOTING_CLOSED = (
+ d(*VOTING_CLOSED_DATE),
+ 'Votes must be returned',
+ 'Preliminary results are announced on %s' % d(*PRELIMINARY_RESULTS_DATE)
+)
+
+
+PRELIMINARY_RESULTS = (
+ d(*PRELIMINARY_RESULTS_DATE),
+ 'Preliminary results are announced',
+ 'The preliminary results can be challenged until %s' % d(*CHALLENGE_CLOSED_DATE)
+)
+
+CHALLENGE_CLOSED = (
+ d(*CHALLENGE_CLOSED_DATE),
+ 'Challenges to the results closed',
+ "If there weren't any challenges, preliminary results are valid"
+)
+
+
+
+
+def create_ical(eventlist):
+ '''Generates an ical stream based on the list given as eventlist.
+ The list shall contain elements with a tuple with a
+ (date, string, string) object, serving as date when the event takes place,
+ summary and description respectively.
+ '''
+ log = logging.getLogger('create_ical')
+
+ cal = vobject.iCalendar()
+ cal.add('method').value = 'PUBLISH'
+ cal.add('calscale').value = 'GREGORIAN'
+ cal.add('x-wr-timezone').value = 'UTC'
+
+ for (timestamp, summary, description) in eventlist:
+ log.debug('creating %s, %s', timestamp, description)
+ vevent = cal.add('vevent')
+ vevent.add('dtstart').value = timestamp
+ vevent.add('dtend').value = timestamp + datetime.timedelta(1)
+ vevent.add('summary').value = summary
+ vevent.add('description').value = description
+
+ stream = cal.serialize()
+ return stream
+
+
+def wraptext(s, width):
+ '''Wraps a string @s at @width characters.
+
+ >>> wraptext('fooo', 2)
+ ['fo','oo']
+ '''
+ l = len(s)
+ nr_frames = int(math.ceil(float(l)/width))
+ print nr_frames
+ frames = []
+ for i in xrange(nr_frames):
+ start, end = i*width, (i+1) * width
+ frames.append(s[start:end])
+ # One could (and prolly should) yield that
+ return frames
+
+def ordinal(n):
+ n = int(n)
+ if 10 <= n % 100 < 20:
+ return str(n) + 'th'
+ else:
+ return str(n) + {1 : 'st', 2 : 'nd', 3 : 'rd'}.get(n % 10, "th")
+
+
+def cal_for_month(month, events, width=80, year=datetime.datetime.now().year):
+ '''Generates a textual calendar for the @month in @year.
+ It will return a string with the calendar on the left hand side and the
+ events on the right hand side.
+ @events shall be a list with tuples: timestamp, summary, description.
+
+ Returns a string with the calendar
+ '''
+ log = logging.getLogger('cal_for_month')
+
+ cal = calendar.TextCalendar()
+ calstrings = cal.formatmonth(year, month, 3).splitlines()
+
+ for (timestamp, summary, description) in events:
+ log.debug('creating %s, %s', timestamp, summary)
+ year, month, day = timestamp.year, timestamp.month, timestamp.day
+ maxwidth = max([len(cs) for cs in calstrings])
+ rightwidth = 80 - maxwidth
+ for i, line in enumerate(calstrings):
+ needles = (" %d " % day,
+ " %d\n" % day)
+ replacement = "(%d)" % day
+ # Find the day so that we can highlight it and add a comment
+ day_in_week = False
+ for needle in needles:
+ if needle in line+"\n":
+ # k, this looks a bit weird but we have that corner
+ # case with the day being at the end of the line
+ # which in turn will have been split off
+ day_in_week = True
+ break # Set the needle to the found one
+ if day_in_week == False: # Nothing found, try next week
+ log.debug('Day (%d) not found in %s', day, line)
+ continue
+ else:
+ log.debug('Day (%d) found in %s', day, line)
+ new_line = (line+"\n").replace(needle, replacement).rstrip()
+ new_line += " %s (%s)" % (summary, ordinal(day))
+ # Replace in-place for two events in the same week
+ # FIXME: This has bugs :-(
+ calstrings[i] = new_line
+
+ return os.linesep.join(calstrings)
+
+def create_textcal(eventlist):
+ '''Generates a multiline string containing a calendar with the
+ events written on the side
+ The list shall contain elements with a tuple with a
+ (date, string, string) object, serving as date when the event takes place,
+ summary and description respectively.
+ '''
+ log = logging.getLogger('textcal')
+ log.debug('Generating from %s', eventlist)
+ months = set(map(lambda x: x[0].month, eventlist))
+ year = set(map(lambda x: x[0].year, eventlist)).pop()
+
+ final_cal = []
+ for month in months:
+ events = filter(lambda x: x[0].month == month, eventlist)
+ log.debug('Events for %d: %s', month, events)
+ month_cal = cal_for_month(month, events, year=year)
+ final_cal.append(month_cal)
+
+ return os.linesep.join(final_cal)
+
+if __name__ == "__main__":
+ from optparse import OptionParser
+ parser = OptionParser("usage: %prog [options]")
+ parser.add_option("-l", "--loglevel", dest="loglevel", help="Sets the loglevel to one of debug, info, warn, error, critical",
+ default=None)
+ parser.add_option("-i", "--ical",
+ action="store_true", dest="ical", default=False,
+ help="print iCal file to stdout")
+ parser.add_option("-t", "--textcal",
+ action="store_true", dest="tcal", default=False,
+ help="print textual calendar to stdout")
+ (options, args) = parser.parse_args()
+
+ loglevel = {'debug': logging.DEBUG, 'info': logging.INFO,
+ 'warn': logging.WARNING, 'error': logging.ERROR,
+ 'critical': logging.CRITICAL}.get(options.loglevel, logging.WARNING)
+ logging.basicConfig( level=loglevel )
+ log = logging.getLogger()
+
+ eventlist = [
+ CANDIDATES_OPENED,
+ CANDIDATES_CLOSED,
+ CANDIDATES_ANNOUNCED,
+ VOTING_OPENED,
+ VOTING_CLOSED,
+ PRELIMINARY_RESULTS,
+ CHALLENGE_CLOSED,
+ ]
+
+ if not any([options.ical, options.tcal]):
+ parser.error("You want to select either ical or textcal output. See --help for details")
+ if options.ical:
+ ical = create_ical( eventlist )
+ print ical
+ if options.tcal:
+ tcal = create_textcal( eventlist )
+ print tcal
diff --git a/vote/2016-mc/rules.wml b/vote/2016-mc/rules.wml
new file mode 100644
index 0000000..64368bb
--- /dev/null
+++ b/vote/2016-mc/rules.wml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+
+ <head>
+ <title>The Document Foundation 2016 Membership Committee Election Rules</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ </head>
+
+ <body>
+
+ <h1>Rules &amp; Timeline for The Document Foundation 2016 Membership Committee Election</h1>
+
+ <h2>Election Rules</h2>
+
+ <ol>
+ <li>
+ See the <a href="http://www.documentfoundation.org/satzung.pdf">Document Foundation statutes</a> (and the non-binding
+ <a href="http://www.documentfoundation.org/statutes.pdf">English version</a>)
+ for general rules.
+ </li>
+ <li>
+ There are 5 committee seats and 4 deputy roles that are to be filled during these elections.
+ </li>
+<li>As per § 12 II of our statues, the Membership Committee's term lasts two years. The current committee started its duty on September 19, 2014. Therefore, the old committee remains in charge until the end of September 18, 2016, so the new committee will be in charge the day after that, which is September 19, 2016.</li>
+
+<li>As per § 6 III, only members of the Board of Trustees of The Document Foundation, as well as current members of any of its bodies, are eligible to be elected into the Membership Committee, and the election is overseen by the Board of Directors (§ 12 II).</li>
+
+<li>The active electoral right is reserved to those who have been members of the Board of Trustees before this announcement (§ 12 II).</li>
+
+<li>§ 6 III also states that members of the Board of Directors or their deputies may not be members of the Membership Committee and vice versa. This means that current members of the Board of Directors are eligible to be elected, but given that with the acceptance of their new role they lose their current role in the board, they would have to step down from the Board of Directors the minute before accepting to become a member of the Membership Committee.</li>
+
+<li>There is one more notable limitation: Per § 8 IV of the statutes, a maximum of 1/3 members of the Membership Committee is allowed to work on an employment basis for the same company, organization, entities, affiliates or subdivisions.</li>
+
+<li>Nomination of candidates fulfilling the above requirements, as well as self nomination is welcome. In total, at least five Membership Committee members are required, and given there are enough candidates, up to four deputies can be elected (§ 12 II).</li>
+
+<li>Re-election of current members of the Membership Committee is explicitly permitted (§ 12 II).</li>
+
+<li>Votes will be held confidential during the elections, but an anonymized archive of all submitted votes will be made publicly accessible at its conclusion.</li>
+
+<li>The Document Foundation Board of Directors is responsible for counting the votes.</li>
+
+<li>All discussion related to the elections should be held on board-discuss@documentfoundation.org. Members are invited to ask questions to one or all candidates on that list.</li>
+ </ol>
+
+ <h2>Timeline</h2>
+ <ul>
+ <li>1. 2016-07-25: announcement of the elections; and start of the nomination phase</li>
+ <li>2. 2016-08-31, 24:00 CET/UTC+2: end of the nomination phase (one week before the election starts, as per § 12 II)</li>
+ <li>3. 2016-09-08, 00:00 CET/UTC+2: official start of the elections (at least 45 days after #1, as per § 12 II)</li>
+ <li>4. 2016-09-14, 24:00 CET/UTC+2: end of the elections</li>
+ <li>5. 2016-09-15: announcement of the preliminary results; and start of the challenging phase</li>
+ <li>6. 2016-09-17, 24:00 CET/UTC+2: end of the challenging phase</li>
+ <li>7. 2016-09-18: official announcement of the final results</li>
+ <li>8. 2016-09-19: new Membership Committee officially in charge</li>
+ </ul>
+ </body>
+</html>
diff --git a/vote/2016-mc/shuffle.js b/vote/2016-mc/shuffle.js
new file mode 100644
index 0000000..49a939a
--- /dev/null
+++ b/vote/2016-mc/shuffle.js
@@ -0,0 +1,8 @@
+window.onload = shuffle;
+
+function shuffle() {
+ var ol = document.querySelector('ol');
+ for (var i = ol.children.length; i >= 0; i--) {
+ ol.appendChild(ol.children[Math.random() * i | 0]);
+ }
+}
diff --git a/vote/2016-mc/timeline.ics b/vote/2016-mc/timeline.ics
new file mode 100644
index 0000000..033d07c
--- /dev/null
+++ b/vote/2016-mc/timeline.ics
@@ -0,0 +1,71 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+PRODID:-//PYVOBJECT//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:20140903T203120Z-39764@thinkpad.bad.example
+DTSTART;VALUE=DATE:20140719
+DTEND;VALUE=DATE:20140720
+DESCRIPTION:If you are a member of The Document Foundation and are interes
+ ted in running for election\, you may nominate yourself by sending an e-ma
+ il to elections@documentfoundation.org with your name\, e-mail address\, c
+ orporate affiliation (if any)\, and a description of why you'd like to ser
+ ve\, before 2014-08-27 (23:59 UTC).\n You should also send a summary o
+ f your candidacy announcement (75 words or less) to discuss@documentfounda
+ tion.org.\n
+SUMMARY:Announcements and list of candidates opens
+END:VEVENT
+BEGIN:VEVENT
+UID:20140903T203120Z-54301@thinkpad.bad.example
+DTSTART;VALUE=DATE:20140827
+DTEND;VALUE=DATE:20140828
+DESCRIPTION:If you are a member of The Document Foundation and are interes
+ ted in running for election\, you may nominate yourself by sending an e-ma
+ il to elections@documentfoundation.org with your name\, e-mail address\, c
+ orporate affiliation (if any)\, and a description of why you'd like to ser
+ ve\, before 2014-08-27 (23:59 UTC).\n You should also send a summary o
+ f your candidacy announcement (75 words or less) to discuss@documentfounda
+ tion.org.\n
+SUMMARY:List of candidates closed
+END:VEVENT
+BEGIN:VEVENT
+UID:20140903T203120Z-30891@thinkpad.bad.example
+DTSTART;VALUE=DATE:20140904
+DTEND;VALUE=DATE:20140905
+DESCRIPTION:You may now start to send your questions to the candidates
+SUMMARY:List of candidates announced
+END:VEVENT
+BEGIN:VEVENT
+UID:20140903T203120Z-50351@thinkpad.bad.example
+DTSTART;VALUE=DATE:20140904
+DTEND;VALUE=DATE:20140905
+DESCRIPTION:Please read your email and follow these instructions and submi
+ t your vote by 2014-09-11
+SUMMARY:Instructions to vote are sent
+END:VEVENT
+BEGIN:VEVENT
+UID:20140903T203120Z-84459@thinkpad.bad.example
+DTSTART;VALUE=DATE:20140911
+DTEND;VALUE=DATE:20140912
+DESCRIPTION:Preliminary results are announced on 2014-09-12
+SUMMARY:Votes must be returned
+END:VEVENT
+BEGIN:VEVENT
+UID:20140903T203120Z-50923@thinkpad.bad.example
+DTSTART;VALUE=DATE:20140912
+DTEND;VALUE=DATE:20140913
+DESCRIPTION:The preliminary results can be challenged until 2014-09-17
+SUMMARY:Preliminary results are announced
+END:VEVENT
+BEGIN:VEVENT
+UID:20140903T203120Z-36315@thinkpad.bad.example
+DTSTART;VALUE=DATE:20140917
+DTEND;VALUE=DATE:20140918
+DESCRIPTION:If there weren't any challenges\, preliminary results are vali
+ d
+SUMMARY:Challenges to the results closed
+END:VEVENT
+X-WR-TIMEZONE:UTC
+END:VCALENDAR
+
diff --git a/vote/2016-mc/voting-instructions.txt b/vote/2016-mc/voting-instructions.txt
new file mode 100644
index 0000000..4f41b10
--- /dev/null
+++ b/vote/2016-mc/voting-instructions.txt
@@ -0,0 +1,38 @@
+elections@documentfoundation.org
+elections@documentfoundation.org
+Your Document Foundation 2016 Membership Committee Elections Voting Token
+Dear $member,
+
+The election of The Document Foundation Membership Committee will soon
+be open.
+
+Voting will run from 2016-09-08, 00:00 CET/UTC+2
+until 2016-09-14, 24:00 CET/UTC+2.
+
+To vote, please go to
+https://elections.documentfoundation.org/vote.php?election_id=8
+and follow the instructions there.
+
+A list of candidates and their reasons for running is available at
+https://elections.documentfoundation.org/2016-mc/candidates.html
+
+When instructed to do so, enter the following details:
+
+ E-mail: $email
+ Vote token: $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,
+ Thorsten Behrens
+ On behalf of The Document Foundation Board of Directors
diff --git a/vote/include/step2-choose.php b/vote/include/step2-choose.php
index 5cbf78b..01fdcae 100644
--- a/vote/include/step2-choose.php
+++ b/vote/include/step2-choose.php
@@ -14,7 +14,7 @@ function step2_do () {
$result .= "Once you are happy with the order, submit your vote. You will have ";
$result .= "the chance to review and confirm your ballot on the next page.</p>";
- $result .= "<p>You can vote for up to 10 candidates of your choice, with no restrictions. ";
+ $result .= "<p>You can vote for up to 9 candidates of your choice, with no restrictions. ";
$result .= "Your vote will be counted for your first choice candidate as ";
$result .= "long as the candidate is still in the race, and when the candidate is eliminated, your ";
$result .= "vote will transfer to the next preference candidate still in the ";
diff --git a/vote/include/step3-confirm.php b/vote/include/step3-confirm.php
index 560d424..6e4e179 100644
--- a/vote/include/step3-confirm.php
+++ b/vote/include/step3-confirm.php
@@ -41,7 +41,8 @@ function step3_do () {
}
$result .= "<p>To confirm this vote, please continue to the next step. ";
- $result .= "To modify your choice, hit the \"Back\" button in your browser.</p>\n";
+ /*$result .= "To modify your choice, hit the \"Back\" button in your browser.</p>\n";*/
+ $result .= "To modify your choice, please close your browser and start the voting process again.</p>\n";
return $result;
}
diff --git a/vote/index.wml b/vote/index.wml
index 1bc3e23..00d9413 100644
--- a/vote/index.wml
+++ b/vote/index.wml
@@ -42,6 +42,7 @@
<li><a href="2013-board/">Material from the 2013 board of directors elections</a></li>
<li><a href="2014-mc/">Material from the 2014 Membership Committee Elections</a></li>
<li><a href="2015-board/">Material from the 2015 Board of Directors elections</a></li>
+ <li><a href="2016-mc/">Material from the 2016 Membership Committee Elections</a></li>
</ul>
<!-- Do not close the body or html tag because we still add stuff to the footer -->