ReviewRequestApprovalHook¶
In Review Board 2.0, review requests have a concept of “approval.” This is a flag exposed in the API on Review Request Resource that indicates if the change on the review request has met the necessary requirements to be committed to the codebase. Pre-commit hooks on the repository can use this to allow or prevent check-ins.
Note
Note that this is purely for integration with extensions and consumers of the API. Review Board does not use approval to enforce any actions itself.)
By default, the flag is set if there’s at least one Ship It! and no open issues, but custom logic can be provided by an extension.
reviewboard.extensions.hooks.ReviewRequestApprovalHook
allows
an extension to make a decision on whether a review request is approved.
To use it, simply subclass and provide a custom is_approved()
function. This takes the review request, the previously calculated approved
state, and the previously calculated approval failure string. (Both the
previously calculated values may come from another
ReviewRequestApprovalHook
or the initial approval checks.)
Based on that information and its calculations, it can return the new approval state and optional failure reason, which will be reflected in the API.
Most often, a hook will want to return False
if the previous approved
value is False
, and pass along the previous failure reason as well.
Example¶
from reviewboard.extensions.base import Extension
from reviewboard.extensions.hooks import ReviewRequestApprovalHook
class SampleApprovalHook(ReviewRequestApprovalHook):
def is_approved(self, review_request, prev_approved, prev_failure):
# Require at least 2 Ship It!'s from everyone but Bob. Bob needs
# at least 3.
if not prev_approved:
return prev_approved, prev_failure
elif (review_request.submitter.username == 'bob' and
review_request.shipit_count < 3):
return False, 'Bob, you need at least 3 "Ship It!\'s."'
elif review_request.shipit_count < 2:
return False, 'You need at least 2 "Ship It!\'s."'
else:
return True
class SampleExtension(Extension):
def initialize(self):
SampleApprovalHook(self)