Skip to content

Commit c47f541

Browse files
committed
added fields updated tests
1 parent 059b096 commit c47f541

File tree

4 files changed

+42
-31
lines changed

4 files changed

+42
-31
lines changed

backend/apps/owasp/management/commands/owasp_update_leaders.py

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -64,27 +64,26 @@ def process_entities(self, model_class, users_list, threshold):
6464

6565
entity_type = ContentType.objects.get_for_model(model_class)
6666

67-
for entity in model_class.objects.all():
67+
for entity in model_class.objects.filter(is_active=True, has_active_repositories=True):
6868
if not entity.leaders_raw:
6969
continue
7070

7171
for index, leader_name in enumerate(entity.leaders_raw):
72-
matched_user = self.find_single_user_matches(leader_name, users_list, threshold)
72+
matched_users = self.find_all_user_matches(leader_name, users_list, threshold)
7373

74-
if not matched_user:
74+
if not matched_users:
7575
continue
7676

77-
self.stdout.write(f"Match for '{leader_name}': {matched_user['login']}")
78-
79-
new_members_to_create.append(
77+
new_members_to_create.extend(
8078
EntityMember(
8179
entity_type=entity_type,
8280
entity_id=entity.pk,
83-
member_id=matched_user["id"],
81+
member_id=user["id"],
8482
kind=EntityMember.MemberKind.LEADER,
8583
is_reviewed=False,
8684
order=((index + 1) * 10),
8785
)
86+
for user in matched_users
8887
)
8988

9089
if new_members_to_create:
@@ -106,29 +105,27 @@ def is_valid_user(self, login, name):
106105
"""Check if GitHub user meets minimum requirements."""
107106
return len(login) >= ID_MIN_LENGTH and len(name or "") >= ID_MIN_LENGTH
108107

109-
def find_single_user_matches(self, leader_name, users_list, threshold):
108+
def find_all_user_matches(self, leader_name, users_list, threshold):
110109
"""Find user matches for a list of raw leader names."""
111110
if not leader_name:
112-
return None
111+
return []
113112

114113
leader_lower = leader_name.lower()
115114

116-
for user in users_list:
117-
if user["login"].lower() == leader_lower or (
118-
user["name"] and user["name"].lower() == leader_lower
119-
):
120-
return user
121-
122-
best_fuzzy_match = None
123-
highest_score = threshold - 1
115+
matches = [
116+
user
117+
for user in users_list
118+
if user["login"].lower() == leader_lower
119+
or (user["name"] and user["name"].lower() == leader_lower)
120+
]
124121

125-
for user in users_list:
126-
score = fuzz.token_sort_ratio(leader_lower, user["login"].lower())
127-
if user["name"]:
128-
score = max(score, fuzz.token_sort_ratio(leader_lower, user["name"].lower()))
122+
if not matches:
123+
for user in users_list:
124+
score = fuzz.token_sort_ratio(leader_lower, user["login"].lower())
125+
if user["name"]:
126+
score = max(score, fuzz.token_sort_ratio(leader_lower, user["name"].lower()))
129127

130-
if score > highest_score:
131-
highest_score = score
132-
best_fuzzy_match = user
128+
if score >= threshold:
129+
matches.append(user)
133130

134-
return best_fuzzy_match
131+
return list({user["id"]: user for user in matches}.values())

backend/apps/owasp/migrations/0048_entitymember.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,13 @@ class Migration(migrations.Migration):
3131
(
3232
"is_reviewed",
3333
models.BooleanField(
34-
default=False, help_text="Indicates if the membership is verified"
34+
default=False, help_text="Indicates if the membership is reviewed"
35+
),
36+
),
37+
(
38+
"is_active",
39+
models.BooleanField(
40+
default=False, help_text="Indicates if the membership is active"
3541
),
3642
),
3743
(

backend/apps/owasp/models/entity_member.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,13 @@ class Meta:
3535
entity = GenericForeignKey("entity_type", "entity_id")
3636
entity_id = models.PositiveIntegerField()
3737
entity_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
38+
is_active = models.BooleanField(
39+
default=False,
40+
help_text="Indicates if the membership is active",
41+
)
3842
is_reviewed = models.BooleanField(
3943
default=False,
40-
help_text="Indicates if the membership is verified",
44+
help_text="Indicates if the membership is reviewed",
4145
)
4246
kind = models.CharField(
4347
max_length=6,

backend/tests/apps/owasp/management/commands/owasp_update_leaders_test.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def test_command_creates_members_with_correct_order(
4242
active_users = [u for u in mock_users_data if u["id"] != 4]
4343
mock_user.objects.values.return_value = active_users
4444

45-
mock_chapter.objects.all.return_value = [
45+
mock_chapter.objects.filter.return_value = [
4646
self._create_mock_entity(1, "Ordered Chapter", ["jane.doe", "john.doe", "peter_jones"])
4747
]
4848
mock_chapter.__name__ = "Chapter"
@@ -65,6 +65,10 @@ def entity_member_constructor(*_, **kwargs):
6565
out = io.StringIO()
6666
call_command("owasp_update_leaders", "chapter", stdout=out)
6767

68+
mock_chapter.objects.filter.assert_called_once_with(
69+
is_active=True, has_active_repositories=True
70+
)
71+
6872
mock_em.objects.bulk_create.assert_called_once()
6973
created_members = mock_em.objects.bulk_create.call_args[0][0]
7074

@@ -87,7 +91,7 @@ def test_fuzzy_match_below_threshold(
8791
self, mock_user, mock_chapter, mock_ct, mock_em, mock_users_data
8892
):
8993
mock_user.objects.values.return_value = mock_users_data
90-
mock_chapter.objects.all.return_value = [
94+
mock_chapter.objects.filter.return_value = [
9195
self._create_mock_entity(1, "Fuzzy Chapter", ["Jone Doe"])
9296
]
9397
mock_chapter.__name__ = "Chapter"
@@ -107,7 +111,7 @@ def test_is_valid_user_filtering(
107111
self, mock_chapter, mock_user, mock_ct, mock_em, mock_users_data
108112
):
109113
mock_user.objects.values.return_value = mock_users_data
110-
mock_chapter.objects.all.return_value = [
114+
mock_chapter.objects.filter.return_value = [
111115
self._create_mock_entity(99, "Invalid Chapter", ["a"])
112116
]
113117
mock_chapter.__name__ = "Chapter"
@@ -129,7 +133,7 @@ def test_exact_match_is_preferred_over_fuzzy(
129133
self, mock_chapter, mock_user, mock_ct, mock_em, mock_fuzz, mock_users_data
130134
):
131135
mock_user.objects.values.return_value = mock_users_data
132-
mock_chapter.objects.all.return_value = [
136+
mock_chapter.objects.filter.return_value = [
133137
self._create_mock_entity(1, "Exact Chapter", ["john.doe"])
134138
]
135139
mock_chapter.__name__ = "Chapter"

0 commit comments

Comments
 (0)