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
This commit is contained in:
parent
e059539177
commit
e7f05ce2c4
1
.gitignore
vendored
1
.gitignore
vendored
@ -10,4 +10,5 @@ AUTHORS
|
||||
ChangeLog
|
||||
candidates/ptl.rst
|
||||
candidates/tc.rst
|
||||
candidates/events.rst
|
||||
.projects.yaml
|
||||
|
21
doc/source/_exts/events.jinja
Normal file
21
doc/source/_exts/events.jinja
Normal file
@ -0,0 +1,21 @@
|
||||
.. raw:: html
|
||||
|
||||
<span id="eventname"></span>
|
||||
<span id="eventtimer"></span>
|
||||
<script>
|
||||
var events_timeline = [
|
||||
{% for event in events %}
|
||||
{ date: "{{ event['date'] }}", name: "{{ event['name'] }}" },
|
||||
{% endfor %}
|
||||
];
|
||||
</script>
|
||||
<br /><br />
|
||||
|
||||
|
||||
+--------------------------------+---------------------------------+
|
||||
| Events | Date |
|
||||
+================================+=================================+
|
||||
{% for event in events %}
|
||||
| {{ "%29s" % event['name'] }} | {{ "%29s" % event['date_str'] }} |
|
||||
+--------------------------------+---------------------------------+
|
||||
{% endfor %}
|
45
doc/source/_exts/events.py
Normal file
45
doc/source/_exts/events.py
Normal file
@ -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)
|
25
doc/source/_static/event_timer.js
Normal file
25
doc/source/_static/event_timer.js
Normal file
@ -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)
|
@ -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
|
||||
|
@ -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
|
||||
|
8
events.yaml
Normal file
8
events.yaml
Normal file
@ -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'}
|
Loading…
Reference in New Issue
Block a user