def add_reviewer(cls, change_id, account_id, force=False): """Add a reviewer Sends a POST request to Gerrit to add one user or all members of one group as reviewer to the change. :param change_id: any identification number for the change (UUID, Change-Id, or legacy numeric change ID) :type change_id: str :param account_id: any identification string for an account (name, username, email) :type account_id: str :param force: do not prompt the user for confirmation if gerrit needs a confirmation to add multiple reviewers at once (group). Defaults to False :type force: bool :rtype: tuple(AccountInfo) :raise: PyCRError if the Gerrit server returns an error """ cls.log.debug('Assign review to %s: %s', account_id, change_id) payload = {'reviewer': account_id} headers = {'content-type': 'application/json'} try: endpoint = changes.reviewers(change_id) _, response = RequestFactory.post(endpoint, data=json.dumps(payload), headers=headers) except RequestError as why: if why.status_code == 404: raise NoSuchChangeError(change_id) raise UnexpectedError(why) if 'confirm' in response: assert 'error' in response, 'missing "error" field in response' cls.log.debug('Assigning review: confirmation requested') do_add_reviewers = True if force else confirm(response['error']) if not do_add_reviewers: info('reviewer not added, aborting...') return None try: payload['confirmed'] = True _, response = RequestFactory.post(endpoint, data=json.dumps(payload), headers=headers) except RequestError as why: raise UnexpectedError(why) assert 'reviewers' in response, '"reviewers" not in HTTP response' return tuple([AccountInfo.parse(r) for r in response['reviewers']])
def get_account(cls, account_id='self'): """Fetch Gerrit account details :param account_id: identifier that uniquely identifies one account :type account: str :rtype: AccountInfo :raise: PyCRError on any other error """ cls.log.debug('List Gerrit accounts') try: _, response = RequestFactory.get(accounts.account(account_id)) except RequestError as why: if why.status_code == 404: raise QueryError('no such account') raise UnexpectedError(why) return AccountInfo.parse(response)