From 8791d36b375769a48842f37b9a48e0458834303b Mon Sep 17 00:00:00 2001 From: Tristan Cacqueray Date: Mon, 30 Jan 2017 01:01:23 +0000 Subject: [PATCH] Rewrite the event logic in javascript The current events extension is computing the statuses at build time, which is getting incorrect when an event is outdated until there is a rebuild. This change fix that by doing the event status computation at load time in javascript. Moreover this change removes an unused import in utils. Change-Id: Ifd1b84ff0182cf9bb7950da3d59f36c83019ac30 --- doc/source/_exts/events.jinja | 2 +- doc/source/_exts/events.py | 25 --------------------- doc/source/_static/event_timer.js | 36 ++++++++++++++++++++++--------- openstack_election/config.py | 4 +++- openstack_election/utils.py | 1 - 5 files changed, 30 insertions(+), 38 deletions(-) diff --git a/doc/source/_exts/events.jinja b/doc/source/_exts/events.jinja index e7d07467..9f252db1 100644 --- a/doc/source/_exts/events.jinja +++ b/doc/source/_exts/events.jinja @@ -16,6 +16,6 @@ | Events | Start Date | End Date | Status | +====================================+====================================+====================================+===========+ {% for event in events %} -| {{ "%29s" % event['name_str'] }} | {{ "%29s" % event['start_str'] }} | {{ "%29s" % event['end_str'] }} | {{ "%7s" % event['status'] }} | +| {{ "%29s" % event['name'] }} | {{ "%29s" % event['start_str'] }} | {{ "%29s" % event['end_str'] }} | | +------------------------------------+------------------------------------+------------------------------------+-----------+ {% endfor %} diff --git a/doc/source/_exts/events.py b/doc/source/_exts/events.py index 278a7446..cd6b3932 100644 --- a/doc/source/_exts/events.py +++ b/doc/source/_exts/events.py @@ -13,40 +13,15 @@ """Add election timer data """ -import datetime import jinja2 import jinja2.environment import os -import pytz from openstack_election import utils def build_timer(app): app.add_javascript("event_timer.js") - now = datetime.datetime.utcnow().replace(tzinfo=pytz.utc) - first_event = True - for ev in utils.conf['timeline']: - if ev['start'] > now: - ev['status'] = 'future' - elif ev['end'] > now: - ev['status'] = 'current' - else: - ev['status'] = 'past' - - if first_event and ev['status'] == 'future': - ev['status'] = 'next' - first_event = False - - mark = '' - if ev['status'] == 'current': - mark = '**' - elif ev['status'] == 'past': - mark = '*' - - ev['start_iso'] = ev['start'].strftime("%Y-%m-%dT%H:%M") - ev['end_iso'] = ev['end'].strftime("%Y-%m-%dT%H:%M") - ev['name_str'] = "%s%s%s" % (mark, ev['name'], mark) output_file = os.path.join(".", "doc", "source", "events.rst") with open(output_file, "w") as out: template_dir = os.path.join(".", "doc", "source", "_exts") diff --git a/doc/source/_static/event_timer.js b/doc/source/_static/event_timer.js index f58eedf2..06d4e241 100644 --- a/doc/source/_static/event_timer.js +++ b/doc/source/_static/event_timer.js @@ -1,7 +1,6 @@ /* 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); @@ -13,20 +12,37 @@ function startTime() { var t = setTimeout(startTime, 500); } +function set_event_status(event_name, event_status) { + var td = $("td:contains('"+event_name+"')"); + if (event_status == 'Next' || event_status == 'Current') { + td.css("font-weight", "bold") + } + td.next().next().next().html(event_status); +} + function setup_timeline() { + var now = parseInt((new Date).getTime() / 1000); for (i = 0; i < events_timeline.length; i++) { var current_event = events_timeline[i]; - event_date = Date.parse(current_event.start) / 1000; - if (event_date > now) { - document.getElementById('eventname').innerHTML = current_event.name+' starts in'; - startTime(); - break; + var current_event_start = Date.parse(current_event.start) / 1000; + var current_event_end = Date.parse(current_event.end) / 1000; + if (now > current_event_end) { + set_event_status(current_event.name, 'Past'); } - event_date = Date.parse(current_event.end) / 1000; - if (event_date > now) { - document.getElementById('eventname').innerHTML = current_event.name+' ends in'; + else if (event_date == undefined && now < current_event_start) { + document.getElementById('eventname').innerHTML = current_event.name+' starts in'; + set_event_status(current_event.name, 'Next'); + event_date = current_event_start; startTime(); - break; + } + else if (event_date == undefined && now < current_event_end) { + document.getElementById('eventname').innerHTML = current_event.name+' ends in'; + set_event_status(current_event.name, 'Current'); + event_date = current_event_end; + startTime(); + } + else if (now < current_event_start) { + set_event_status(current_event.name, 'Future'); } } } diff --git a/openstack_election/config.py b/openstack_election/config.py index 2116cc89..203d3a0d 100644 --- a/openstack_election/config.py +++ b/openstack_election/config.py @@ -16,11 +16,12 @@ import yaml TIME_FMT = "%b %d, %Y %H:%M %Z" +ISO_FMT = "%Y-%m-%dT%H:%M" # Load configuration.yaml and create datetime objects def parse_datetime(iso_format): - date = datetime.datetime.strptime(iso_format, "%Y-%m-%dT%H:%M") + date = datetime.datetime.strptime(iso_format, ISO_FMT) return date.replace(tzinfo=pytz.utc) @@ -34,5 +35,6 @@ def load_conf(): for key in ('start', 'end'): date = parse_datetime(event[key]) event[key] = date + event[key+'_iso'] = date.strftime(ISO_FMT) event[key+'_str'] = date.strftime(TIME_FMT) return conf diff --git a/openstack_election/utils.py b/openstack_election/utils.py index a67dcdb3..7ffd4e6c 100644 --- a/openstack_election/utils.py +++ b/openstack_election/utils.py @@ -21,7 +21,6 @@ import pickle import pytz import re import requests -import six import subprocess import time import yaml