check-review-status: update age calc
This patch changes the approval script to allow approving the change after 7 days. This should also clarify all the "earliest" dates by making sure they have a time in UTC. Co-Authored-By: Nate Johnston <nate.johnston@redhat.com> Co-Authored-By: Jean-Philippe Evrard <jean-philippe@evrard.me> Change-Id: I611dd4e44928c42dae35fd9527a62fa948a2cc3f
This commit is contained in:
parent
74fe33aadc
commit
dbcfd6656c
@ -31,6 +31,14 @@ LOG = logging.getLogger(__name__)
|
|||||||
|
|
||||||
TC_SIZE = 13
|
TC_SIZE = 13
|
||||||
|
|
||||||
|
# For formal-vote votes, age in days that a change has to have existed
|
||||||
|
# before it can be approved
|
||||||
|
creation_age_threshold = datetime.timedelta(days=7)
|
||||||
|
|
||||||
|
# For formal-vote votes, age in days since a change has reached a
|
||||||
|
# the necessary amount of votes before it can be approved
|
||||||
|
reached_votes_age_threshold = datetime.timedelta(days=3)
|
||||||
|
|
||||||
|
|
||||||
def decode_json(raw):
|
def decode_json(raw):
|
||||||
"""Trap JSON decoding failures and provide more detailed errors
|
"""Trap JSON decoding failures and provide more detailed errors
|
||||||
@ -192,8 +200,8 @@ def get_one_status(change, delegates, tc_members):
|
|||||||
|
|
||||||
latest = find_latest_revision(change)
|
latest = find_latest_revision(change)
|
||||||
latest_created = to_datetime(latest['created'])
|
latest_created = to_datetime(latest['created'])
|
||||||
now = datetime.datetime.now()
|
now = datetime.datetime.utcnow()
|
||||||
age = now.date() - latest_created.date()
|
age = now - latest_created
|
||||||
earliest = ''
|
earliest = ''
|
||||||
|
|
||||||
code_reviews = count_votes(change, 'Code-Review')
|
code_reviews = count_votes(change, 'Code-Review')
|
||||||
@ -211,6 +219,7 @@ def get_one_status(change, delegates, tc_members):
|
|||||||
|
|
||||||
elif verified[-1]:
|
elif verified[-1]:
|
||||||
can_approve = 'NO, verification failure'
|
can_approve = 'NO, verification failure'
|
||||||
|
earliest = 'when passing'
|
||||||
|
|
||||||
elif topic == 'on-hold':
|
elif topic == 'on-hold':
|
||||||
can_approve = 'on hold'
|
can_approve = 'on hold'
|
||||||
@ -225,23 +234,28 @@ def get_one_status(change, delegates, tc_members):
|
|||||||
votes_to_approve = votes[1] >= necessary_votes and votes[1] > votes[-1]
|
votes_to_approve = votes[1] >= necessary_votes and votes[1] > votes[-1]
|
||||||
reached_necessary_votes = when_majority(change, necessary_votes)
|
reached_necessary_votes = when_majority(change, necessary_votes)
|
||||||
|
|
||||||
parts.append('last change on {}'.format(latest_created.date()))
|
parts.append('last change on {}'.format(
|
||||||
|
latest_created.isoformat(timespec='minutes')
|
||||||
|
))
|
||||||
|
|
||||||
# At least 7 days old.
|
# At least creation_age_threshold days old.
|
||||||
if age < datetime.timedelta(8):
|
if age < creation_age_threshold:
|
||||||
time_to_approve = False
|
time_to_approve = False
|
||||||
parts.append('has not been open 7 days')
|
parts.append("has not been open %d days" %
|
||||||
earliest = str(latest_created.date() + datetime.timedelta(8))
|
creation_age_threshold.days)
|
||||||
|
earliest = str(latest_created + creation_age_threshold)
|
||||||
elif reached_necessary_votes:
|
elif reached_necessary_votes:
|
||||||
# Wait at least 3 days after reaching necessary votes.
|
# Wait at least reached_votes_age_threshold days
|
||||||
|
# after reaching necessary votes.
|
||||||
earliest = str(
|
earliest = str(
|
||||||
reached_necessary_votes.date() + datetime.timedelta(4)
|
reached_necessary_votes + reached_votes_age_threshold
|
||||||
)
|
)
|
||||||
since_necessary_votes = now.date() - reached_necessary_votes.date()
|
since_necessary_votes = now.date() - reached_necessary_votes.date()
|
||||||
time_to_approve = since_necessary_votes > datetime.timedelta(3)
|
time_to_approve = since_necessary_votes > reached_votes_age_threshold
|
||||||
else:
|
else:
|
||||||
time_to_approve = False
|
time_to_approve = False
|
||||||
earliest = '4 days after {} positive votes'.format(necessary_votes)
|
earliest = "{} days after {} positive votes".format(
|
||||||
|
reached_votes_age_threshold.days, necessary_votes)
|
||||||
|
|
||||||
if votes_to_approve and time_to_approve:
|
if votes_to_approve and time_to_approve:
|
||||||
parts.append('YES')
|
parts.append('YES')
|
||||||
@ -312,11 +326,19 @@ def get_one_status(change, delegates, tc_members):
|
|||||||
|
|
||||||
can_approve = ',\n'.join(parts)
|
can_approve = ',\n'.join(parts)
|
||||||
|
|
||||||
elif topic in ('code-change', 'documentation-change', 'election-results', 'typo-fix'):
|
elif topic in (
|
||||||
|
'code-change',
|
||||||
|
'documentation-change',
|
||||||
|
'election-results',
|
||||||
|
'typo-fix',
|
||||||
|
):
|
||||||
# https://governance.openstack.org/tc/reference/house-rules.html#code-changes
|
# https://governance.openstack.org/tc/reference/house-rules.html#code-changes
|
||||||
# https://governance.openstack.org/tc/reference/house-rules.html#documentation-changes
|
# https://governance.openstack.org/tc/reference/house-rules.html#documentation-changes
|
||||||
# https://governance.openstack.org/tc/reference/house-rules.html#election-results
|
# https://governance.openstack.org/tc/reference/house-rules.html#election-results
|
||||||
# https://governance.openstack.org/tc/reference/house-rules.html#typo-fixes
|
# https://governance.openstack.org/tc/reference/house-rules.html#typo-fixes
|
||||||
|
|
||||||
|
earliest = 'Can be voted anytime'
|
||||||
|
|
||||||
if votes[-1] or code_reviews[-1]:
|
if votes[-1] or code_reviews[-1]:
|
||||||
can_approve = 'dissenting votes'
|
can_approve = 'dissenting votes'
|
||||||
elif votes[1] < 2:
|
elif votes[1] < 2:
|
||||||
@ -340,7 +362,7 @@ def get_one_status(change, delegates, tc_members):
|
|||||||
# https://governance.openstack.org/tc/reference/house-rules.html#other-project-team-updates
|
# https://governance.openstack.org/tc/reference/house-rules.html#other-project-team-updates
|
||||||
|
|
||||||
# At least 7 days old.
|
# At least 7 days old.
|
||||||
earliest = str(latest_created.date() + datetime.timedelta(8))
|
earliest = str(latest_created + creation_age_threshold)
|
||||||
|
|
||||||
if votes[-1] or code_reviews[-1]:
|
if votes[-1] or code_reviews[-1]:
|
||||||
can_approve = 'dissenting votes'
|
can_approve = 'dissenting votes'
|
||||||
@ -353,7 +375,7 @@ def get_one_status(change, delegates, tc_members):
|
|||||||
# https://governance.openstack.org/tc/reference/house-rules.html#goal-updates-from-ptls
|
# https://governance.openstack.org/tc/reference/house-rules.html#goal-updates-from-ptls
|
||||||
|
|
||||||
# At least 7 days old.
|
# At least 7 days old.
|
||||||
earliest = str(latest_created.date() + datetime.timedelta(8))
|
earliest = str(latest_created + creation_age_threshold)
|
||||||
|
|
||||||
if votes[-1]:
|
if votes[-1]:
|
||||||
can_approve = 'dissenting votes'
|
can_approve = 'dissenting votes'
|
||||||
@ -402,7 +424,7 @@ def get_one_status(change, delegates, tc_members):
|
|||||||
'Can Approve': can_approve,
|
'Can Approve': can_approve,
|
||||||
'Status': '\n'.join([topic, can_approve,
|
'Status': '\n'.join([topic, can_approve,
|
||||||
'{} days old'.format(age.days),
|
'{} days old'.format(age.days),
|
||||||
earliest]),
|
'earliest: {}'.format(earliest)]),
|
||||||
'Earliest': earliest,
|
'Earliest': earliest,
|
||||||
'Votes': votes,
|
'Votes': votes,
|
||||||
'Members': member_votes,
|
'Members': member_votes,
|
||||||
|
Loading…
Reference in New Issue
Block a user