Merge pull request #4476 from xfalcox/localize-badge-notifications

FIX: Properly localize badge notification on batch grant
This commit is contained in:
Sam 2016-10-12 15:16:35 +11:00 committed by GitHub
commit 3ad8616f44
2 changed files with 39 additions and 10 deletions

View File

@ -274,7 +274,7 @@ class BadgeGranter
/*where*/ /*where*/
RETURNING id, user_id, granted_at RETURNING id, user_id, granted_at
) )
select w.*, username FROM w select w.*, username, locale FROM w
JOIN users u on u.id = w.user_id JOIN users u on u.id = w.user_id
" "
@ -305,15 +305,27 @@ class BadgeGranter
# old bronze badges do not matter # old bronze badges do not matter
next if badge.badge_type_id == BadgeType::Bronze and row.granted_at < 2.days.ago next if badge.badge_type_id == BadgeType::Bronze and row.granted_at < 2.days.ago
# Try to use user locale in the badge notification if possible without too much resources
notification_locale = if SiteSetting.allow_user_locale && row.locale.present?
row.locale
else
SiteSetting.default_locale
end
# Make this variable in this scope
notification = nil
I18n.with_locale(notification_locale) do
notification = Notification.create!( notification = Notification.create!(
user_id: row.user_id, user_id: row.user_id,
notification_type: Notification.types[:granted_badge], notification_type: Notification.types[:granted_badge],
data: { data: {
badge_id: badge.id, badge_id: badge.id,
badge_name: badge.name, badge_name: badge.display_name,
badge_slug: badge.slug, badge_slug: badge.slug,
username: row.username username: row.username
}.to_json ) }.to_json )
end
Badge.exec_sql("UPDATE user_badges SET notification_id = :notification_id WHERE id = :id", Badge.exec_sql("UPDATE user_badges SET notification_id = :notification_id WHERE id = :id",
notification_id: notification.id, notification_id: notification.id,

View File

@ -94,6 +94,23 @@ describe BadgeGranter do
expect(Badge.find(Badge::NiceTopic).grant_count).to eq(1) expect(Badge.find(Badge::NiceTopic).grant_count).to eq(1)
expect(Badge.find(Badge::GoodTopic).grant_count).to eq(1) expect(Badge.find(Badge::GoodTopic).grant_count).to eq(1)
end end
it 'should grant badges in the user locale' do
SiteSetting.allow_user_locale = true
nice_topic = Badge.find(Badge::NiceTopic)
name_english = nice_topic.name
user = Fabricate(:user, locale: 'fr')
post = Fabricate(:post, like_count: 10, user: user)
BadgeGranter.backfill(nice_topic)
notification_badge_name = JSON.parse(post.user.notifications.first.data)['badge_name']
expect(notification_badge_name).not_to eq(name_english)
end
end end
describe 'grant' do describe 'grant' do