From e7f05ce2c4b9bc761bdaac7361d3acda02a78948 Mon Sep 17 00:00:00 2001 From: Tristan Cacqueray Date: Tue, 9 Feb 2016 16:43:25 -0500 Subject: [PATCH] Add events timeline and clock timer This changes add a new 'events' extensions to manage events timeline. Events are described in the events.yaml file. The 'events' extensions will generate an rst document with: * Timer clock for upcoming event * Tabulated events list Change-Id: Ib5c9d96663bd2197beea7aab226a3d46bc82067c --- .gitignore | 1 + doc/source/_exts/events.jinja | 21 +++++++++++++++ doc/source/_exts/events.py | 45 +++++++++++++++++++++++++++++++ doc/source/_static/event_timer.js | 25 +++++++++++++++++ doc/source/conf.py | 4 ++- doc/source/index.rst | 3 ++- events.yaml | 8 ++++++ 7 files changed, 105 insertions(+), 2 deletions(-) create mode 100644 doc/source/_exts/events.jinja create mode 100644 doc/source/_exts/events.py create mode 100644 doc/source/_static/event_timer.js create mode 100644 events.yaml diff --git a/.gitignore b/.gitignore index b46690c5..f8f59cab 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,5 @@ AUTHORS ChangeLog candidates/ptl.rst candidates/tc.rst +candidates/events.rst .projects.yaml diff --git a/doc/source/_exts/events.jinja b/doc/source/_exts/events.jinja new file mode 100644 index 00000000..185578f9 --- /dev/null +++ b/doc/source/_exts/events.jinja @@ -0,0 +1,21 @@ +.. raw:: html + + + + +

+ + ++--------------------------------+---------------------------------+ +| Events | Date | ++================================+=================================+ +{% for event in events %} +| {{ "%29s" % event['name'] }} | {{ "%29s" % event['date_str'] }} | ++--------------------------------+---------------------------------+ +{% endfor %} diff --git a/doc/source/_exts/events.py b/doc/source/_exts/events.py new file mode 100644 index 00000000..f484eca4 --- /dev/null +++ b/doc/source/_exts/events.py @@ -0,0 +1,45 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""Add election timer data +""" + +import os +import yaml + +from jinja2 import FileSystemLoader +from jinja2.environment import Environment +from docutils import nodes + +PATH_PREFIX = 'candidates' + +def build_timer(app): + app.add_javascript("event_timer.js") + data = yaml.load(open("events.yaml").read()) + # add better text for tabulatted planning + for ev in data: + d, h = ev['date'].split('T') + ev['date_str'] = "%s, %s UTC" % (d, h) + output_file = os.path.join(PATH_PREFIX, "events.rst") + with open(output_file, "w") as out: + template_dir = os.path.join(".", "doc", "source", "_exts") + loader = FileSystemLoader(template_dir) + env = Environment(trim_blocks=True, loader=loader) + template = env.get_template("events.jinja") + out.write(template.render({'events':data})) + +def setup(app): + if not os.path.isfile("events.yaml"): + app.info('No events.yaml found, not loading events_timer extension') + return + app.info('loading events_timer extension') + app.connect('builder-inited', build_timer) diff --git a/doc/source/_static/event_timer.js b/doc/source/_static/event_timer.js new file mode 100644 index 00000000..1991b7d5 --- /dev/null +++ b/doc/source/_static/event_timer.js @@ -0,0 +1,25 @@ +/* Licensed under the Apache License, Version 2.0 + */ +var event_date; +var now = parseInt((new Date).getTime() / 1000) +function startTime() { + var delta = parseInt(event_date - (new Date).getTime() / 1000) + var hours = parseInt(delta / 3600) + var minutes = parseInt( delta / 60 ) % 60 + var seconds = delta % 60 + document.getElementById('eventtimer').innerHTML = hours+'h'+minutes+'m'+seconds+'s' + var t = setTimeout(startTime, 500) +} +function setup_timeline() { + for (i = 0; i < events_timeline.length; i++) { + var current_event = events_timeline[i]; + event_date = Date.parse(current_event.date) / 1000 + if (event_date > now) { + document.getElementById('eventname').innerHTML = 'Next event is '+current_event.name+' in' + event_date = Date.parse(current_event.date) / 1000 + startTime(current_event.date) + break + } + } +} +$(document).ready(setup_timeline) diff --git a/doc/source/conf.py b/doc/source/conf.py index 0ac5aa0b..ed903252 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -30,6 +30,7 @@ extensions = [ 'sphinx.ext.extlinks', 'oslosphinx', 'candidates', + 'events', ] todo_include_todos = True @@ -67,7 +68,8 @@ copyright = u'2015, OpenStack' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. -exclude_patterns = ['_build', 'candidates/ptl.rst', 'candidates/tc.rst'] +exclude_patterns = ['_build', 'candidates/ptl.rst', 'candidates/tc.rst', + 'candidates/events.rst'] # The reST default role (used for this markup: `text`) to use for all documents. #default_role = None diff --git a/doc/source/index.rst b/doc/source/index.rst index dfc40610..fc770b1d 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -2,7 +2,8 @@ OpenStack Election ==================== -This page track OpenStack Elections candidates list. +.. include:: ./candidates/events.rst + Below is the official list of candidates for the current round. .. include:: ./candidates/ptl.rst diff --git a/events.yaml b/events.yaml new file mode 100644 index 00000000..5734e0b3 --- /dev/null +++ b/events.yaml @@ -0,0 +1,8 @@ +- {'date': '2016-03-11T00:00', 'name': 'PTL nomination starts'} +- {'date': '2016-03-17T23:59', 'name': 'PTL nomination ends'} +- {'date': '2016-03-18T00:00', 'name': 'PTL elections begins'} +- {'date': '2016-03-24T23:59', 'name': 'PTL elections ends'} +- {'date': '2016-03-25T00:00', 'name': 'TC nomination starts'} +- {'date': '2016-03-31T23:59', 'name': 'TC nomination ends'} +- {'date': '2016-04-01T00:00', 'name': 'TC elections begins'} +- {'date': '2016-04-07T23:59', 'name': 'TC elections ends'}