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, )
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)
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)
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()
def gh_repo(self): return get_github_client().repository(self.login, self.name)
def gh_issue(self): return get_github_client().issue(self.repo.login, self.repo.name, self.issue_number)