Não, o código anterior que tentei com uma IA também não funcionou. Depois de configurar tudo, nada aconteceu.
Eu queria te mostrar o código completo da minha última tentativa. Eu esperava que você pudesse ver o que estou fazendo de errado.
1. plugin.rb
# name: add-title-by-group-trust-level
# about: atribui títulos por grupo primário + nível de confiança usando SQL
# version: 0.2
# authors: seu-nome
# Nota: Não tenho certeza se preciso de uma linha 'require' aqui para carregar o arquivo de job.
# Suspeito que esta possa ser a peça que falta.
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
Aqui está como eu configurei nas Configurações do Site:
Eu colei este JSON na configuração group_trust_level_titles:
{
"designers": ["", "Junior Designer", "Designer", "Senior Designer", "Chief Designer"],
"developers": ["", "Junior Developer", "Developer", "Senior Developer", "Tech Lead"]
}
O Problema:
O job UpdateTitles não aparece no agendador do Sidekiq (/sidekiq/scheduler).
No entanto, eu testei no console Rails de acordo com o método que a IA me deu, e a lógica principal está perfeitamente bem, imprimindo corretamente todos os usuários que atendem às condições.
Este é o script de teste que usei no 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 "Não foi possível encontrar o grupo: #{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 "====== Grupo: #{group.name} Nível de Confiança: #{tl} Novo Título: '#{title}' ======"
users.each do |user|
puts "Usuário id:#{user.id}, username:#{user.username}, título atual:'#{user.title}'"
end
end
end
Portanto, parece que a lógica em si está correta, mas o Discourse não está registrando o job agendado. De qualquer forma, quanto mais eu tento mudar, mais confuso fica… Não tenho certeza se essa é a abordagem correta, e como não sei codificar, parece muito difícil implementar isso. Você tem um método melhor?