b4809462aa
The close_election command treats TC elections as a single-team PTL election, essentially. The leaderless list, however, is generated from the full list of projects included in an election which, in a parallel TC/PTL election will include more projects than just the TC. Rather than heavily refactor the utility function where that data is summarized, just delete the leaderless list from the election results when reporting for the TC round in a parallel TC/PTL election. Change-Id: Ia8bb11addb9f70283b3e676d90e5e7b48494b8e1
102 lines
3.7 KiB
Python
Executable File
102 lines
3.7 KiB
Python
Executable File
# 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.
|
|
|
|
import argparse
|
|
import os
|
|
import yaml
|
|
|
|
from openstack_election import utils
|
|
|
|
|
|
def check_elected_candidate(candidates):
|
|
for candidate in candidates:
|
|
if candidate.get('elected'):
|
|
return True
|
|
return False
|
|
|
|
|
|
def process(db, round):
|
|
dirty = False
|
|
|
|
# Remove un-needed project
|
|
if round == 'tc' and len(db['projects']) != 1:
|
|
dirty = True
|
|
db['projects'] = ['TC']
|
|
db['candidates'] = {'TC': db['candidates']['TC']}
|
|
del db['leaderless']
|
|
if round == 'ptl' and 'TC' in db['projects']:
|
|
dirty = True
|
|
db['projects'].remove('TC')
|
|
del db['candidates']['TC']
|
|
|
|
# Check for missing and elected candidates
|
|
for project in db['projects']:
|
|
candidates = db['candidates'][project]
|
|
if len(candidates) == 0:
|
|
print("[W] Appoints candidate for %s" % project)
|
|
candidates.append({
|
|
'ircname': 'INSERT_IRCNAME',
|
|
'email': 'INSERT_EMAIL',
|
|
'fullname': 'INSERT_FULLNAME',
|
|
'elected': 'TC-APPOINTED_OR_INCUMBENT-PTL',
|
|
})
|
|
dirty = True
|
|
elif len(candidates) > 1:
|
|
if not check_elected_candidate(candidates):
|
|
print("[W] Set elected attribute for winner of %s" % project)
|
|
for candidate in candidates:
|
|
candidate['elected'] = False
|
|
dirty = True
|
|
if project not in db.setdefault('elections_results', {}):
|
|
print("[W] Set election id for %s" % project)
|
|
db['elections_results'][project] = 'INSERT-RESULT-LINK'
|
|
dirty = True
|
|
elif not candidates[0].get('elected'):
|
|
candidates[0]['elected'] = True
|
|
dirty = True
|
|
return dirty
|
|
|
|
|
|
def main():
|
|
desc = 'Generate or update an election archive for site rendering'
|
|
parser = argparse.ArgumentParser(description=desc)
|
|
parser.add_argument('-v', '--verbose', action="count", default=0,
|
|
help='Increase program verbosity')
|
|
parser.add_argument('-r', '--release', default=utils.conf['release'],
|
|
help='Which nominations to look at')
|
|
parser.add_argument('-b', '--basedir',
|
|
default=os.getcwd(),
|
|
help='Path to git clone of openstack/election')
|
|
parser.add_argument('--round', default=utils.conf['election_type'],
|
|
choices=('ptl', 'tc'))
|
|
|
|
args = parser.parse_args()
|
|
|
|
args.outputdir = os.path.join(args.basedir, 'doc', 'source',
|
|
'results', args.release)
|
|
args.outputdir = os.path.expanduser(args.outputdir)
|
|
|
|
if not os.path.isdir(args.outputdir):
|
|
os.mkdir(args.outputdir, 0o755)
|
|
|
|
db_file = os.path.join(args.outputdir, "%s.yaml" % args.round)
|
|
|
|
if os.path.isfile(db_file):
|
|
print("[+] Reloading candidate list %s" % db_file)
|
|
db = yaml.safe_load(open(db_file))
|
|
else:
|
|
db = utils.build_candidates_list(args.release)
|
|
|
|
if process(db, args.round):
|
|
open(db_file, "w").write(yaml.safe_dump(db, default_flow_style=False))
|
|
print("[W] Proceed to manual update of %s" % db_file)
|