'Given team objects, kick off a review process by:
1. creating an issue in our project review repo on GitHub, and
2. sending an email notification to the owner of the team(s).
It\'s a bug to pass in teams that don\'t all have the same owner.
:return: the URL of the new review issue'

def start(self, *teams):

    if (not teams):
        raise NoTeams()
    nteams = len(teams)
    if (nteams == 1):
        title = teams[0].name
    elif (nteams == 2):
        title = u'{}    and    {}'.format(*[t.name for t in teams])
    else:
        title = u'{}    and    {}    other    projects'.format(teams[0].name, (nteams - 1))
    body = []
    team_ids = []
    owner_usernames = set()
    for team in teams:
        team_ids.append(team.id)
        owner_usernames.add(team.owner)
        body.append(u'https://gratipay.com{}'.format(team.url_path))
    assert (len(owner_usernames) == 1), owner_usernames
    body.extend([u'', u'(This    application    will    remain    open    for    at    least    a    week.)'])
    data = json.dumps({u'title': title, u'body': u'\n'.join(body)})
    review_url = self._poster.post(data)
    self.db.run(u'UPDATE    teams    SET    review_url=%s    WHERE    id    =    ANY(%s)', (review_url, team_ids))
    [team.set_attributes(review_url=review_url) for team in teams]
    owner = Participant.from_username(owner_usernames.pop())
    self.email_queue.put(owner, u'project-review', review_url=team.review_url, include_unsubscribe=False, _user_initiated=False)
    return review_url
