diff --git a/doc/source/results/ocata/ptl.yaml b/doc/source/results/ocata/ptl.yaml index 0df4f853..dfc284b4 100644 --- a/doc/source/results/ocata/ptl.yaml +++ b/doc/source/results/ocata/ptl.yaml @@ -387,6 +387,25 @@ elections_results: Kolla: http://civs.cs.cornell.edu/cgi-bin/results.pl?id=E_9fa13adc6f6e7148 Magnum: http://civs.cs.cornell.edu/cgi-bin/results.pl?id=E_2fd00175baa579a6 Quality_Assurance: http://civs.cs.cornell.edu/cgi-bin/results.pl?id=E_745c895dcf12c405 +election_statistics: + - Freezer: + electorate: 39 + votes_cast: 34 + - Ironic: + electorate: 222 + votes_cast: 96 + - Keystone: + electorate: 229 + votes_cast: 96 + - Kolla: + electorate: 174 + votes_cast: 77 + - Magnum: + electorate: 140 + votes_cast: 63 + - Quality_Assurance: + electorate: 418 + votes_cast: 138 projects: - Astara - Barbican diff --git a/doc/source/results/pike/ptl.yaml b/doc/source/results/pike/ptl.yaml index f9632255..70c978ac 100644 --- a/doc/source/results/pike/ptl.yaml +++ b/doc/source/results/pike/ptl.yaml @@ -399,6 +399,22 @@ elections_results: Neutron: http://civs.cs.cornell.edu/cgi-bin/results.pl?id=E_6df9c8e056680402 Quality_Assurance: http://civs.cs.cornell.edu/cgi-bin/results.pl?id=E_99413ba03ba1c6b3 Stable_Branch_Maintenance: http://civs.cs.cornell.edu/cgi-bin/results.pl?id=E_b719c6a5a681033b +election_statistics: + - Keystone: + electorate: 185 + votes_cast: 75 + - Ironic: + electorate: 210 + votes_cast: 112 + - Neutron: + electorate: 380 + votes_cast: 161 + - Quality_Assurance: + electorate: 330 + votes_cast: 134 + - Stable_Branch_Maintenance: + electorate: 805 + votes_cast: 249 projects: - Barbican - Chef_OpenStack diff --git a/doc/source/results/queens/ptl.yaml b/doc/source/results/queens/ptl.yaml index 99d0e4e7..333e40a3 100644 --- a/doc/source/results/queens/ptl.yaml +++ b/doc/source/results/queens/ptl.yaml @@ -360,6 +360,13 @@ election: queens elections_results: Documentation: http://civs.cs.cornell.edu/cgi-bin/results.pl?id=E_d5d9fb5a2354e2a0 Ironic: http://civs.cs.cornell.edu/cgi-bin/results.pl?id=E_0fb06bb4edfd3d08 +election_statistics: + - Documentation: + electorate: 271 + votes_cast: 73 + - Ironic: + electorate: 221 + votes_cast: 72 projects: - Barbican - Chef_OpenStack diff --git a/doc/source/results/rocky/ptl.yaml b/doc/source/results/rocky/ptl.yaml index a8bcdeb9..0fee24a9 100644 --- a/doc/source/results/rocky/ptl.yaml +++ b/doc/source/results/rocky/ptl.yaml @@ -396,6 +396,16 @@ elections_results: Kolla: https://civs.cs.cornell.edu/cgi-bin/results.pl?id=E_eb44669f6742dd4b Mistral: https://civs.cs.cornell.edu/cgi-bin/results.pl?id=E_74983fd83cf5adab Quality_Assurance: https://civs.cs.cornell.edu/cgi-bin/results.pl?id=E_274f37d8e5497358 +election_statistics: + - Kolla: + electorate: 186 + votes_cast: 71 + - Mistral: + electorate: 81 + votes_cast: 35 + - Quality_Assurance: + electorate: 269 + votes_cast: 117 projects: - Barbican - Blazar diff --git a/doc/source/results/stein/ptl.yaml b/doc/source/results/stein/ptl.yaml index a75292d0..a1d14b58 100644 --- a/doc/source/results/stein/ptl.yaml +++ b/doc/source/results/stein/ptl.yaml @@ -385,6 +385,13 @@ election: stein elections_results: Senlin: http://civs.cs.cornell.edu/cgi-bin/results.pl?id=E_5655e3b3821ece95 Tacker: http://civs.cs.cornell.edu/cgi-bin/results.pl?id=E_fe41cc8acc6ead91 +election_statistics: + - Senlin: + electorate: 59 + votes_cast: 16 + - Tacker: + electorate: 54 + votes_cast: 20 projects: - Adjutant - Barbican diff --git a/tools/ptl-election-summary.py b/tools/ptl-election-summary.py new file mode 100755 index 00000000..ba206e67 --- /dev/null +++ b/tools/ptl-election-summary.py @@ -0,0 +1,88 @@ +#!/usr/bin/env python +# +# 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. + +from __future__ import division +from __future__ import print_function + +import glob +import os +import prettytable +import yaml + +data = [] +names = [] +name_map = {} + + +def change(data, current, key): + """Look for old elections for thew same project team and compare.""" + retval = float('NaN') + team = current['team'] + for previous_election_name in names: + old_election_name = '%s - %s' % (previous_election_name, team) + if old_election_name in name_map: + idx = name_map[old_election_name] + break + else: + idx = -1 + + if idx != -1: + idx = name_map[old_election_name] + retval = 100 * ((current[key] / data[idx][key]) - 1) + return retval + + +election_name = None +election_dbs = sorted(glob.glob(os.path.join('doc/source/results', + '*', 'ptl.yaml'))) +for election_db in election_dbs: + with open(election_db) as f: + election_data = yaml.safe_load(f) + + election_name = election_data['election'].capitalize() + for election_statistics in election_data.get('election_statistics', []): + team_name = list(election_statistics.keys())[0] + current = {} + current['election'] = '%s - %s' % (election_name, team_name) + current['team'] = team_name + current['electorate'] = election_statistics[team_name]['electorate'] + current['votes_cast'] = election_statistics[team_name]['votes_cast'] + current['turnout'] = 100 * (current['votes_cast'] / + current['electorate']) + current['results'] = election_data['elections_results'][team_name] + current['electorate_change'] = change(data, current, 'electorate') + current['voter_change'] = change(data, current, 'votes_cast') + current['turnout_change'] = change(data, current, 'turnout') + + name_map[current['election']] = len(data) + data.append(current) + names.insert(0, election_name) + +pt = prettytable.PrettyTable(['Election', + 'Electorate (delta %)', + 'Voted (delta %)', + 'Turnout % (delta %)']) +pt.align['Election'] = 'l' +for idx, current in enumerate(data): + pt.add_row(['%(election)-8s' % current, + '%(electorate)10d (%(electorate_change)7.2f)' % current, + '%(votes_cast)5d (%(voter_change)7.2f)' % current, + ' %(turnout)7.2f (%(turnout_change)7.2f)' % current]) + +print(pt) +print("\nElection CIVS links") + +for election in data: + if 'results' in election: + print("%(election)8s: %(results)s" % election)