No, anche il codice precedente che ho provato con un’IA non ha funzionato. Dopo aver configurato tutto, non è successo assolutamente nulla.
Volevo mostrarti il codice completo del mio ultimo tentativo. Speravo che potessi vedere cosa sto sbagliando.
1. plugin.rb
# name: add-title-by-group-trust-level
# about: assegna titoli tramite gruppo primario + livello di fiducia usando SQL
# version: 0.2
# authors: your-name
# Nota: non sono sicuro se ho bisogno di una riga 'require' qui per caricare il file del job.
# Sospetto che questo possa essere il pezzo mancante.
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
Ecco come l’ho configurato nelle Impostazioni del Sito:
Ho incollato questo JSON nell’impostazione group_trust_level_titles:
{
"designers": ["", "Junior Designer", "Designer", "Senior Designer", "Chief Designer"],
"developers": ["", "Junior Developer", "Developer", "Senior Developer", "Tech Lead"]
}
Il Problema:
Il job UpdateTitles non appare nello scheduler di Sidekiq (/sidekiq/scheduler).
Tuttavia, l’ho testato nella console Rails secondo il metodo fornito dall’IA e la logica principale funziona perfettamente, stampando correttamente tutti gli utenti che soddisfano le condizioni.
Questo è lo script di test che ho usato nella 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 "Impossibile trovare il gruppo: #{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 "====== Gruppo: #{group.name} Livello di fiducia: #{tl} Nuovo titolo: '#{title}' ======"
users.each do |user|
puts "ID utente:#{user.id}, nome utente:#{user.username}, titolo attuale:'#{user.title}'"
end
end
end
Quindi sembra che la logica in sé sia corretta, ma Discourse non registra il job pianificato. Comunque, più cerco di cambiarlo, più diventa confuso… Non sono sicuro che questo sia l’approccio giusto e, dato che non so programmare, mi sembra molto difficile implementarlo. Hai un metodo migliore?