Skip to content

Commit 0257bc3

Browse files
authored
Refresh user photos from github profiles (boostorg#1853) (boostorg#1855)
1 parent cbf0061 commit 0257bc3

File tree

3 files changed

+38
-2
lines changed

3 files changed

+38
-2
lines changed

config/celery.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,9 @@ def setup_periodic_tasks(sender, **kwargs):
6363
crontab(day_of_week="sat", hour=20, minute=3),
6464
app.signature("libraries.tasks.release_tasks", generate_report=True),
6565
)
66+
67+
# Update users' profile photos from GitHub. Executes daily at 3:30 AM.
68+
sender.add_periodic_task(
69+
crontab(hour=3, minute=30),
70+
app.signature("users.tasks.refresh_users_github_photos"),
71+
)

core/githubhelper.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -510,7 +510,11 @@ def get_tree(self, repo_slug: str = None, tree_sha: str = None) -> dict:
510510

511511
def get_user_by_username(self, username: str) -> dict:
512512
"""Return the response from GitHub's /users/{username}/"""
513-
return self.api.users.get_by_username(username=username)
513+
try:
514+
return self.api.users.get_by_username(username=username)
515+
except HTTP404NotFoundError:
516+
logger.warning(f"{username=} not found on GitHub.")
517+
return None
514518

515519
def get_artifacts(self, owner="", repo_slug="", name=None):
516520
"""Return a list of artifacts from the GH api.

users/tasks.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from time import sleep
2+
13
import structlog
24

35
from django.contrib.auth import get_user_model
@@ -34,11 +36,35 @@ def update_user_github_photo(user_pk):
3436

3537
client = GithubAPIClient()
3638
response = client.get_user_by_username(user.github_username)
39+
# response can be None if the user does not exist on GitHub
40+
if not response:
41+
return
3742
avatar_url = response["avatar_url"]
38-
user.save_image_from_github(avatar_url)
43+
user.save_image_from_provider(avatar_url)
3944
logger.info("users_tasks_update_gh_photo_finished", user_pk=user_pk)
4045

4146

47+
@app.task
48+
def refresh_users_github_photos():
49+
"""
50+
Refreshes the GitHub photos for all users who have a GitHub username.
51+
This is intended to be run periodically to ensure user photos are up-to-date.
52+
"""
53+
users = User.objects.exclude(github_username="")
54+
for user in users:
55+
try:
56+
logger.info(f"updating {user.pk=}")
57+
update_user_github_photo.delay(user.pk)
58+
# not strictly necessary, but helps to avoid hammering the GitHub API
59+
sleep(0.5)
60+
except UserMissingGithubUsername:
61+
logger.warning(
62+
"users_tasks_refresh_gh_photos_no_github_username",
63+
user_pk=user.pk,
64+
github_username=user.github_username,
65+
)
66+
67+
4268
# OAuth2 Tasks
4369

4470

0 commit comments

Comments
 (0)