election/openstack_election/cmds/close_election.py
Jeremy Stanley b4809462aa Omit leaderless list from TC election results
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
2021-03-10 19:51:44 +00:00

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)