Skip to content

Commit 9c92bc4

Browse files
committed
Mitigate nonexistent user entity cases
1 parent bd20bc7 commit 9c92bc4

File tree

5 files changed

+46
-28
lines changed

5 files changed

+46
-28
lines changed

backend/apps/github/common.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,8 @@ def sync_repository(
137137
# Assignees.
138138
issue.assignees.clear()
139139
for gh_issue_assignee in gh_issue.assignees:
140-
issue.assignees.add(User.update_data(gh_issue_assignee))
140+
if issue_assignee := User.update_data(gh_issue_assignee):
141+
issue.assignees.add(issue_assignee)
141142

142143
# Labels.
143144
issue.labels.clear()
@@ -184,7 +185,8 @@ def sync_repository(
184185
# Assignees.
185186
pull_request.assignees.clear()
186187
for gh_pull_request_assignee in gh_pull_request.assignees:
187-
pull_request.assignees.add(User.update_data(gh_pull_request_assignee))
188+
if pull_request_assignee := User.update_data(gh_pull_request_assignee):
189+
pull_request.assignees.add(pull_request_assignee)
188190

189191
# Labels.
190192
pull_request.labels.clear()

backend/apps/github/management/commands/github_update_owasp_organization.py

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -82,31 +82,36 @@ def handle(self, *_args, **options) -> None:
8282
for idx, gh_repository in enumerate(gh_repositories[offset:]):
8383
prefix = f"{idx + offset + 1} of {gh_repositories_count}"
8484
entity_key = gh_repository.name.lower()
85-
print(f"{prefix:<12} https://github.com/OWASP/{entity_key}")
86-
87-
owasp_organization, repository = sync_repository(
88-
gh_repository,
89-
organization=owasp_organization,
90-
user=owasp_user,
91-
)
92-
93-
# OWASP chapters.
94-
if entity_key.startswith("www-chapter-"):
95-
chapters.append(Chapter.update_data(gh_repository, repository, save=False))
96-
97-
# OWASP projects.
98-
elif entity_key.startswith("www-project-"):
99-
projects.append(Project.update_data(gh_repository, repository, save=False))
100-
101-
# OWASP committees.
102-
elif entity_key.startswith("www-committee-"):
103-
committees.append(Committee.update_data(gh_repository, repository, save=False))
85+
repository_url = f"https://github.com/OWASP/{entity_key}"
86+
print(f"{prefix:<12} {repository_url}")
87+
88+
try:
89+
owasp_organization, repository = sync_repository(
90+
gh_repository,
91+
organization=owasp_organization,
92+
user=owasp_user,
93+
)
94+
95+
# OWASP chapters.
96+
if entity_key.startswith("www-chapter-"):
97+
chapters.append(Chapter.update_data(gh_repository, repository, save=False))
98+
99+
# OWASP projects.
100+
elif entity_key.startswith("www-project-"):
101+
projects.append(Project.update_data(gh_repository, repository, save=False))
102+
103+
# OWASP committees.
104+
elif entity_key.startswith("www-committee-"):
105+
committees.append(Committee.update_data(gh_repository, repository, save=False))
106+
except Exception:
107+
logger.exception("Error syncing repository %s", repository_url)
108+
continue
104109

105110
Chapter.bulk_save(chapters)
106111
Committee.bulk_save(committees)
107112
Project.bulk_save(projects)
108113

109-
if repository is None:
114+
if repository is None: # The entire organization is being synced.
110115
# Check repository counts.
111116
local_owasp_repositories_count = Repository.objects.filter(
112117
is_owasp_repository=True,

backend/apps/github/management/commands/github_update_project_related_repositories.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,15 @@ def handle(self, *args, **options) -> None:
6363
project.save(update_fields=("invalid_urls", "related_urls"))
6464
continue
6565

66-
organization, repository = sync_repository(gh_repository)
67-
if organization is not None:
68-
organization.save()
66+
try:
67+
organization, repository = sync_repository(gh_repository)
68+
if organization is not None:
69+
organization.save()
6970

70-
project.repositories.add(repository)
71+
project.repositories.add(repository)
72+
except Exception:
73+
logger.exception("Error syncing repository %s", repository_url)
74+
continue
7175

7276
projects.append(project)
7377

backend/apps/github/models/common.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""Github app common models."""
22

33
from django.db import models
4+
from github.GithubException import UnknownObjectException
45

56

67
class GenericUserModel(models.Model):
@@ -78,4 +79,7 @@ class Meta:
7879
@staticmethod
7980
def get_node_id(node):
8081
"""Extract node_id."""
81-
return node.raw_data["node_id"]
82+
try:
83+
return node.raw_data["node_id"]
84+
except UnknownObjectException:
85+
pass

backend/apps/github/models/user.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ def get_non_indexable_logins() -> set:
102102
}
103103

104104
@staticmethod
105-
def update_data(gh_user, *, save: bool = True) -> User:
105+
def update_data(gh_user, *, save: bool = True) -> User | None:
106106
"""Update GitHub user data.
107107
108108
Args:
@@ -114,6 +114,9 @@ def update_data(gh_user, *, save: bool = True) -> User:
114114
115115
"""
116116
user_node_id = User.get_node_id(gh_user)
117+
if not user_node_id:
118+
return None
119+
117120
try:
118121
user = User.objects.get(node_id=user_node_id)
119122
except User.DoesNotExist:

0 commit comments

Comments
 (0)