Ejemplo n.º 1
0
def sync_github_emails_on_signup(sender, request, user, **kwargs):
    sociallogin = kwargs.get('sociallogin')
    if not sociallogin or sociallogin.account.provider != 'github':
        return

    gh_client = get_github_client(sociallogin.token.token)
    gh_emails = list(gh_client.emails())

    # If we don't have an email address, grab one from GitHub
    if not user.email:
        assert not user.emailaddress_set.exists()
        gh_primary_email = next(gh_email for gh_email in gh_emails if gh_email.primary)

        user.email = gh_primary_email.email
        user.save(update_fields=['email'])

        # Add email if we don't already have it on our system
        if not EmailAddress.objects.filter(email=gh_primary_email.email).exists():
            user.emailaddress_set.create(
                email=gh_primary_email.email,
                primary=True,
                verified=gh_primary_email.verified,
            )

    # Create email address objects for all GitHub emails we currently have
    for gh_email in gh_emails:
        if not EmailAddress.objects.filter(email=gh_email.email).exists():
            user.emailaddress_set.get_or_create(
                email=gh_email.email,
                verified=gh_email.verified,
            )
Ejemplo n.º 2
0
def accept_new_repo(self, repo_id):
    try:
        repo = Repository.objects.get(id=repo_id)

        if repo.status != Repository.Status.PendingAccept:
            LOG.warning(
                'Attempted to accept already accepted repo: {}'.format(repo))
            return

        repo_invitation = RepositoryInvitation(repo.original_invitation_data,
                                               get_github_client())
        repo_invitation.accept()

        body = render_to_string('fb_github/initial-issue.txt', {
            'repo': repo,
            'settings': settings,
        })

        gh_issue = repo.gh_repo.create_issue(
            title='Finish adding @{} to your repo'.format(
                settings.GITHUB_BOT_USERNAME),
            body=body,
        )
        repo.initial_issue = Issue.objects.create(
            body=body,
            gh_data=gh_issue.as_dict(),
            issue_number=gh_issue.number,
            repo=repo,
        )

        repo.status = Repository.Status.PendingInviterApproval
        repo.save(update_fields=['status', 'initial_issue'])
    except Exception as exc:
        self.retry(exc=exc, countdown=5)
Ejemplo n.º 3
0
def poll_invitations():
    for repo_invitation in get_github_client().repository_invitations():
        repo, created = Repository.objects.get_or_create(
            login=repo_invitation.repository.owner.login,
            name=repo_invitation.repository.name,
            defaults={
                'inviter_login': repo_invitation.inviter.login,
                'original_invitation_data': repo_invitation.as_dict(),
            },
        )
        if created:
            accept_new_repo.delay(repo.id)
Ejemplo n.º 4
0
def poll_invitations():
    for repo_invitation in get_github_client().repository_invitations():
        repo, created = Repository.objects.get_or_create(
            login=repo_invitation.repository['owner']['login'],
            name=repo_invitation.repository['name'],
            defaults={
                'inviter_login': repo_invitation.inviter['login'],
                'original_invitation_data': repo_invitation.as_dict(),
            },
        )
        if created:
            accept_new_repo.delay(repo.id)
        else:
            # Repository already created, just accept the invitation
            repo_invitation.accept()
Ejemplo n.º 5
0
 def gh_repo(self):
     return get_github_client().repository(self.login, self.name)
Ejemplo n.º 6
0
 def gh_issue(self):
     return get_github_client().issue(self.repo.login, self.repo.name,
                                      self.issue_number)