Non, le code précédent que j’ai essayé avec une IA n’a pas fonctionné non plus. Après avoir tout configuré, rien ne s’est passé.
Je voulais vous montrer le code complet de ma dernière tentative. J’espérais que vous pourriez voir ce que je fais de mal.
1. plugin.rb
# name: add-title-by-group-trust-level
# about: attribuer des titres via le groupe principal + niveau de confiance en utilisant SQL
# version: 0.2
# authors: your-name
# Note : Je ne suis pas sûr d'avoir besoin d'une ligne 'require' ici pour charger le fichier de tâche.
# Je soupçonne que c'est peut-être la pièce manquante.
enabled_site_setting :add_title_by_group_trust_enabled
2. app/jobs/scheduled/update-all-titles.rb
module ::Jobs
class UpdateTitles < ::Jobs::Scheduled
every SiteSetting.update_title_frequency.hours
def execute(args)
return unless SiteSetting.add_title_by_group_trust_enabled
mappings = JSON.parse(SiteSetting.group_trust_level_titles || '{}')
User.transaction do
mappings.each do |group_key, titles|
next unless titles.is_a?(Array)
(1...titles.size).each do |tl|
title = titles[tl]
next if title.blank?
group = Group.find_by("LOWER(name) = ?", group_key.downcase)
next unless group
User.where(primary_group_id: group.id, trust_level: tl, admin: false, moderator: false)
.where.not(title: title)
.update_all(title: title)
end
end
end
end
end
end
3. config/settings.yml
plugins:
add_title_by_group_trust_enabled:
default: false
client: true
group_trust_level_titles:
default: '{"designers":["", "Junior Designer", "Designer", "Senior Designer", "Chief Designer"],"developers":["", "Junior Developer", "Developer", "Senior Developer", "Tech Lead"]}'
type: string
client: true
multiline: true
update_title_frequency:
default: 24
type: integer
Voici comment je l’ai configuré dans les paramètres du site :
J’ai collé ce JSON dans le paramètre group_trust_level_titles :
{
"designers": ["", "Junior Designer", "Designer", "Senior Designer", "Chief Designer"],
"developers": ["", "Junior Developer", "Developer", "Senior Developer", "Tech Lead"]
}
Le problème :
La tâche UpdateTitles n’apparaît pas dans le planificateur Sidekiq (/sidekiq/scheduler).
Cependant, je l’ai testée dans la console Rails selon la méthode que l’IA m’a donnée, et la logique principale est parfaitement correcte, affichant correctement tous les utilisateurs qui remplissent les conditions.
Voici le script de test que j’ai utilisé dans la console Rails :
mappings = JSON.parse(SiteSetting.group_trust_level_titles || '{}')
mappings.each do |group_key, titles|
next unless titles.is_a?(Array)
(1...titles.size).each do |tl|
title = titles[tl]
next if title.blank?
group = Group.find_by("LOWER(name) = ?", group_key.downcase)
unless group
puts "Impossible de trouver le groupe : #{group_key}"
next
end
users = User.where(primary_group_id: group.id, trust_level: tl, admin: false, moderator: false)
.where.not(title: title)
next if users.empty?
puts "====== Groupe : #{group.name} Niveau de confiance : #{tl} Nouveau titre : '#{title}' ======"
users.each do |user|
puts "Utilisateur id:#{user.id}, nom d'utilisateur:#{user.username}, titre actuel:'#{user.title}'"
end
end
end
Il semble donc que la logique elle-même soit correcte, mais Discourse n’enregistre pas la tâche planifiée. Quoi qu’il en soit, plus j’essaie de la modifier, plus cela devient confus… Je ne suis pas sûr que ce soit la bonne approche, et comme je ne sais pas coder, cela semble très difficile à mettre en œuvre. Avez-vous une meilleure méthode ?