Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import logging

from django.core.management import call_command
from django.core.management.base import BaseCommand
from django.db.models import Q, Sum

Expand Down Expand Up @@ -57,3 +58,9 @@ def handle(self, *args, **options):
User.bulk_save(users, fields=("contributions_count",))

User.bulk_save(users, fields=("contributions_count",))

# Sync badges after user data refresh
self.stdout.write("Syncing badges...")

call_command("nest_update_staff_badges")
call_command("nest_update_project_leader_badges")
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
class Command(BaseBadgeCommand):
help = "Sync OWASP Project Leader badges"

badge_css_class = "fa-user-shield"
badge_css_class = "star"
badge_description = "Official OWASP Project Leader"
badge_name = "OWASP Project Leader"
badge_weight = 90
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
class Command(BaseBadgeCommand):
help = "Sync OWASP Staff badges"

badge_css_class = "fa-user-shield"
badge_css_class = "ribbon"
badge_description = "Official OWASP Staff"
badge_name = "OWASP Staff"
badge_weight = 100
Expand Down
2 changes: 1 addition & 1 deletion backend/apps/nest/models/badge.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class Badge(BulkSaveModel, TimestampedModel):

class BadgeCssClass(models.TextChoices):
AWARD = "award", "Award"
BUG_SLASH = "bug_slash", "Bug Slash"
BUG_SLASH = "bugSlash", "Bug Slash"
Comment thread
Isha-upadhyay marked this conversation as resolved.
CERTIFICATE = "certificate", "Certificate"
MEDAL = "medal", "Medal"
RIBBON = "ribbon", "Ribbon"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -237,3 +237,26 @@ def test_handle_with_exact_batch_size(self, mock_repository_contributor, mock_us

assert mock_user.bulk_save.call_count == 2
assert mock_user.bulk_save.call_args_list[-1][0][0] == [mock_user1, mock_user2]

@patch("apps.github.management.commands.github_update_users.call_command")
@patch("apps.github.management.commands.github_update_users.User")
@patch("apps.github.management.commands.github_update_users.RepositoryContributor")
def test_badge_sync_commands_are_called(
self, mock_repository_contributor, mock_user, mock_call_command
):
"""Test that badge sync commands run after user update."""
mock_users_queryset = MagicMock()
mock_users_queryset.count.return_value = 0
mock_users_queryset.__getitem__.return_value = []

mock_user.objects.order_by.return_value = mock_users_queryset

mock_rc_queryset = MagicMock()
mock_rc_queryset.exclude.return_value.values.return_value.annotate.return_value = []
mock_repository_contributor.objects = mock_rc_queryset

command = Command()
command.handle(offset=0)

mock_call_command.assert_any_call("nest_update_staff_badges")
mock_call_command.assert_any_call("nest_update_project_leader_badges")
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ class TestProjectLeaderBadgeCommand(SimpleTestCase):
def test_has_correct_metadata(self):
assert Command.badge_name == "OWASP Project Leader"
assert Command.badge_weight == 90
assert Command.badge_css_class == "star"

@patch("apps.nest.management.commands.nest_update_project_leader_badges.User")
@patch("apps.nest.management.commands.nest_update_project_leader_badges.EntityMember")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ class TestStaffBadgeCommand(SimpleTestCase):
def test_has_correct_metadata(self):
assert Command.badge_name == "OWASP Staff"
assert Command.badge_weight == 100
assert Command.badge_css_class == "ribbon"

@patch("apps.nest.management.commands.nest_update_staff_badges.User")
@patch("apps.nest.management.commands.base_badge_command.UserBadge")
Expand Down
13 changes: 4 additions & 9 deletions frontend/src/components/Badges.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,12 @@ type BadgeProps = {

const DEFAULT_ICON = BADGE_CLASS_MAP['medal']

const normalizeCssClass = (cssClass: string | undefined) => {
if (!cssClass || cssClass.trim() === '') {
return ''
const resolveIcon = (cssClass: string | undefined) => {
if (!cssClass) {
return DEFAULT_ICON
}
// Convert backend snake_case format to frontend camelCase format
return cssClass.trim().replaceAll(/_([a-z])/g, (_, letter) => letter.toUpperCase())
}

const resolveIcon = (cssClass: string | undefined) => {
const normalizedClass = normalizeCssClass(cssClass)
return BADGE_CLASS_MAP[normalizedClass] ?? DEFAULT_ICON
return BADGE_CLASS_MAP[cssClass] ?? DEFAULT_ICON
}

const Badges = ({ name, cssClass, showTooltip = true }: BadgeProps) => {
Expand Down