Bewährte Methode zur Automatisierung von Titeln nach Gruppe + Vertrauensstufe-Kombinationen

Hallo,

ich suche nach der besten Methode, um Benutzertitel automatisch basierend auf einer Kombination aus Gruppenzugehörigkeit und Vertrauensstufe zuzuweisen. Zum Beispiel:

  • Wenn ein Benutzer in Gruppe A ist und Vertrauensstufe 1 hat, sollte sein Titel „A TL1“ lauten.
  • Wenn ein Benutzer in Gruppe A ist und Vertrauensstufe 2 hat, sollte sein Titel „A TL2“ lauten.
  • Wenn ein Benutzer in Gruppe B ist und Vertrauensstufe 1 hat, sollte sein Titel „B TL1“ lauten.
  • …und so weiter

Nach allem, was ich bisher gefunden habe, ist die Hauptmethode:

  1. Erstellen Sie eine separate Gruppe für jede Gruppen- + Vertrauensstufen-Kombination (z. B. a-tl1, a-tl2, b-tl1 usw.) mit dem Plugin „Dynamic Groups“.
  2. Legen Sie für jede dieser Gruppen einen Standardtitel fest.

Obwohl dies zu funktionieren scheint, erfordert es die Erstellung und Pflege einer großen Anzahl von Gruppen, wenn es viele Kombinationen gibt.

Meine Fragen:

  • Ist diese Einrichtung (viele dynamische Gruppen und jede mit ihrem eigenen Standardtitel) die beste oder einzige Möglichkeit, Titel automatisch synchron zu halten?
  • Gibt es einen anderen Ansatz (unter Verwendung von Discourse-Kernfunktionen, Automatisierungen oder einem anderen Plugin), um Titel dynamisch basierend auf Bedingungen wie Gruppe + Vertrauensstufe zuzuweisen, ohne so viele zusätzliche Gruppen verwalten zu müssen?

Jeder Rat oder geteilte Erfahrungen wären sehr willkommen. Vielen Dank im Voraus!

Würde es für Sie funktionieren, den Titel basierend auf der Gruppenzugehörigkeit (A oder B) zu konfigurieren und eine Komponente zu haben, die den Titel basierend auf der dahinterliegenden Vertrauensstufe hinzufügt?

Ich denke, dann bräuchten Sie nicht all diese kombinierten Untergruppen :thinking:

Eine andere Idee: Vielleicht könnte das Plugin, das automatisch die Vertrauensstufe als Titel festlegt, als Basis für ein komplexeres Titel-Update basierend auf Vertrauensstufe und Gruppenzugehörigkeit verwendet werden.

3 „Gefällt mir“

Vielen Dank für Ihre Vorschläge

Leider habe ich selbst keine Programmiererfahrung und kann daher keine Plugins entwickeln oder modifizieren. Ich habe den Plugin-Autor bereits kontaktiert, um zu fragen, ob diese Funktion (Kombination von Gruppenmitgliedschaft und Vertrauensstufe für Titel) hinzugefügt werden könnte oder ob er Ratschläge hat.

Wenn es sich um die primären Gruppen des Benutzers handelt, dann, wie Sie in dem anderen Thema erwähnt haben, würde dies die Dinge erheblich erleichtern.

Dann können Sie ihre primäre Gruppe über user.primary_group abrufen und dann den Titel mit user.title festlegen.

@joo Ich habe die Einstellung add_primary_group_title (standardmäßig aus) hinzugefügt, die:

  • die primäre Gruppe des Benutzers als Titel hinzufügt
  • Text hinter dem Titel, z. B.:

          kann wie bisher über die Einstellungen bearbeitet werden.

Ich habe einen Hauch von ask.discourse.com-Magie verwendet.

P.S. Wenn Sie sich fragen, wie ich das „kann“ eingerückt habe, habe ich   verwendet. Tut mir leid, Leute.

1 „Gefällt mir“

Hallo! Vielen Dank für Ihr Update und Ihre Unterstützung!

Ich habe meine Anforderung möglicherweise nicht klar genug erklärt, daher möchte ich sie mit einem leicht verständlichen Beispiel noch einmal verdeutlichen:

Angenommen, unser Forum hat zwei Hauptgruppen:

  • Gruppe A: Designer
  • Gruppe B: Entwickler

Für jede Gruppe möchte ich, dass Benutzer mit unterschiedlichen Vertrauensstufen einen völlig anderen Titel erhalten, wie folgt:

Für die Gruppe Designer:
Vertrauensstufe 1 → „Junior Designer“
Vertrauensstufe 2 → „Designer“
Vertrauensstufe 3 → „Senior Designer“
Vertrauensstufe 4 → „Chief Designer“

Für die Gruppe Entwickler:
Vertrauensstufe 1 → „Junior Developer“
Vertrauensstufe 2 → „Developer“
Vertrauensstufe 3 → „Senior Developer“
Vertrauensstufe 4 → „Tech Lead“

Wenn also jemand in „Designer“ mit TL3 ist, sollte sein Titel „Senior Designer“ lauten.
Wenn er in „Entwickler“ mit TL2 ist, sollte der Titel „Developer“ lauten.

Ich möchte diese Regeln für jede Gruppe und Vertrauensstufe festlegen können und die Titel automatisch zuweisen lassen, wenn sich die Gruppen oder Vertrauensstufen der Benutzer ändern.

Haben Sie Ratschläge, wie ich dies erreichen kann, oder würden Sie erwägen, dies als neue Funktion in Ihr Plugin aufzunehmen?

Vielen Dank!

1 „Gefällt mir“

Außerdem versuche ich, dies auf meiner Testseite zu erreichen: http://ask.discourse.com/.
Ich habe keine Programmiererfahrung, daher bin ich mir nicht sicher, ob es möglich ist, dies selbst zu implementieren.

Ich werde vielleicht einen Platzhalterwert verwenden, z. B. {group_nane} im Textfeld, damit der Titel leichter bearbeitet werden kann. Ich werde mir das ansehen.

Vielleicht möchten Sie sich Folgendes ansehen:

Hallo!

Ich habe das Plugin an meine Bedürfnisse angepasst und möchte gerne mitteilen, was ich getan habe, meinen aktuellen Workflow und ein paar Fragen/Bitten um Rat.


1. Meine Modifikationen

Dateipfad und Inhalt:

Datei: app/jobs/scheduled/update-all-titles.rb

# frozen_string_literal: true

module AddTitleBasedOnTrustLevel
  class UpdateTitles < ::Jobs::Scheduled
    every SiteSetting.update_title_frequency.hours

    def execute(args)
      group_titles = JSON.parse(SiteSetting.group_trust_level_titles || "{}")

      User.find_each do |user|
        # Überspringe Admins und Moderatoren, aktualisiere deren Titel nicht
        next if user.admin? || user.moderator?

        group_id = user.primary_group_id
        next unless group_id

        group = Group.find_by(id: group_id)
        next unless group

        group_key = group.name.downcase
        tl = user.trust_level

        titles = group_titles[group_key]
        next unless titles.is_a?(Array)
        next unless tl >= 1 && tl <= 4

        new_title = titles[tl]
        next unless new_title.present?

        user.update_column(:title, new_title) if user.title != new_title
      end
    end
  end
end

Datei: config/settings.yml

plugins:
  add_title_based_on_trust_level_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

2. Wie ich getestet habe

Ich führe diese Logik derzeit manuell über die Rails-Konsole aus, um zu überprüfen, ob die Funktion funktioniert. Sie aktualisiert Benutzertitel in großen Mengen gemäß meinen Anforderungen.


3. Problem mit dem Plugin-Einstellungs-Eintrag

Auf der Seite /admin/plugins gibt es keinen „Einstellungen“-Button für dieses Plugin. Um die Konfiguration zu ändern, muss ich derzeit direkt /admin/plugins/add-title-based-on-trust-level/settings besuchen. Gibt es eine Möglichkeit, den Einstellungsbutton oder Link auf der Plugin-Seite anzuzeigen, um den Zugriff zu erleichtern?


4. Meine aktuellen Einstellungen

Dies ist meine aktuelle JSON-Konfiguration (ich werde auch einen Screenshot anhängen):

{
  "designers": ["", "Junior Designer", "Designer", "Senior Designer", "Chief Designer"],
  "developers": ["", "Junior Developer", "Developer", "Senior Developer", "Tech Lead"]
}


5. Fragen / Mögliche Verbesserungen

  • Birgt dieser Ansatz (Durchlaufen jedes Benutzers und Aktualisieren seines Titels) Leistungsprobleme, wenn es viele Benutzer gibt? Gibt es eine bessere Vorgehensweise dafür?
  • Gibt es Ratschläge zur Optimierung, entweder für den geplanten Job oder für die Admin-Einstellungs-UI?
  • Gibt es etwas Unsicheres oder Problematisches an meiner Methode, worauf ich achten sollte?

Vielen Dank für Ihre großartige Arbeit und dieses nützliche Plugin!
Wenn Sie Vorschläge haben oder planen, die Konfiguration von Gruppen- und Vertrauensstufen-Titeln in Zukunft zu verbessern, würde ich mich freuen, Ihre Gedanken zu hören.

2 „Gefällt mir“

@joo Wirklich tolle Idee!

Wenn du dir das Plugin jetzt ansiehst, glaube ich, dass ich das auch gemacht habe (habe einige letzte Tests durchgeführt). Ich sehe, dass du jeden Benutzer durchlaufen hast, aber in großen Foren kann das eine Weile dauern.

Deshalb habe ich ein SQL UPDATE gemacht:

(Ich habe die Abfrage von Ask Discourse angepasst und modifiziert)

Auf diese Weise kannst du in der Einstellung tl1_title_on_promotion etwas wie Junior {group_name} verwenden, sodass der Titel dann Junior Developer lautet.

Beachte, dass du auch add_primary_group_title aktivieren musst, damit es funktioniert.

1 „Gefällt mir“

Danke für die Erklärung, ich verstehe jetzt, wie Ihre {group_name}-Vorlage funktioniert.

Aber das ist genau das, was ich mit dem Unterschied in der Logik meinte. Meine Kernanforderung ist es, völlig unterschiedliche Titelstrukturen für dasselbe Vertrauensniveau basierend auf unterschiedlichen Benutzergruppen anwenden zu können.

Zum Beispiel für Vertrauensstufe 3:

  • Der Titel für die Gruppe „Designer“ sollte „Senior Designer“ sein.
  • Der Titel für die Gruppe „Entwickler“ sollte „Tech Lead“ sein.

Diese beiden Titel haben völlig unterschiedliche Strukturen.

Ich habe versucht, diese Funktion mit einer KI zu implementieren, aber ich war nicht erfolgreich. Ich habe mich gefragt, ob es vielleicht möglich wäre, das Plugin zu modifizieren, um diese granularere Logik zu unterstützen?

Ah, ich glaube, ich habe Sie dann missverstanden.

Hat Ihr obiger Code also funktioniert?

Nein, der vorherige Code, den ich mit einer KI ausprobiert habe, funktionierte auch nicht. Nachdem alles eingerichtet war, passierte überhaupt nichts.

Ich wollte Ihnen den vollständigen Code meines letzten Versuchs zeigen. Ich hoffte, Sie könnten sehen, was ich falsch mache.

1. plugin.rb

# name: add-title-by-group-trust-level
# about: weise Titel über die primäre Gruppe + Vertrauensstufe mittels SQL zu
# version: 0.2
# authors: your-name

# Hinweis: Ich bin mir nicht sicher, ob ich hier eine 'require'-Zeile benötige, um die Job-Datei zu laden.
# Ich vermute, das könnte das fehlende Stück sein.
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

So habe ich es in den Site-Einstellungen konfiguriert:

Ich habe diesen JSON in die Einstellung group_trust_level_titles eingefügt:

{
  "designers": ["", "Junior Designer", "Designer", "Senior Designer", "Chief Designer"],
  "developers": ["", "Junior Developer", "Developer", "Senior Developer", "Tech Lead"]
}

Das Problem:
Der Job UpdateTitles erscheint nicht im Sidekiq-Scheduler (/sidekiq/scheduler).

Ich habe ihn jedoch in der Rails-Konsole gemäß der Methode, die mir die KI gegeben hat, getestet, und die Kernlogik ist einwandfrei und gibt korrekt alle Benutzer aus, die die Bedingungen erfüllen.

Dies ist das Testskript, das ich in der Rails-Konsole verwendet habe:

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 "Konnte Gruppe nicht finden: #{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 "====== Gruppe: #{group.name} Vertrauensstufe: #{tl} Neuer Titel: '#{title}' ======"
    users.each do |user|
      puts "Benutzer ID:#{user.id}, Benutzername:#{user.username}, aktueller Titel:'#{user.title}'"
    end
  end
end

Es scheint also, dass die Logik selbst korrekt ist, aber Discourse den geplanten Job nicht registriert. Wie auch immer, je mehr ich versuche, es zu ändern, desto verwirrender wird es… Ich bin mir nicht sicher, ob dies der richtige Ansatz ist, und da ich nicht programmieren kann, fühlt es sich sehr schwierig an, dies zu implementieren. Haben Sie eine bessere Methode?

Hmm… vielleicht möchten Sie die Objekteinstellungen verwenden:

Mit Feldern wie Vertrauensstufe, Gruppe, Titel.

1 „Gefällt mir“

Ich wollte nur ein Update geben und mich bei allen bedanken, die geholfen haben.

Mit den neuesten Änderungen funktioniert das Plugin jetzt genau wie beabsichtigt! Es weist korrekt unterschiedliche Titel basierend auf der primären Gruppe und dem Vertrauenslevel des Benutzers zu.

Ich poste den endgültigen funktionierenden Code unten. Er scheint korrekt zu sein, aber da ich kein Entwickler bin, habe ich mich gefragt, ob es Bereiche für Verbesserungen oder Optimierungen gibt, die ich vielleicht übersehen habe.

app/jobs/scheduled/update-all-titles.rb

# frozen_string_literal: true

module ::Jobs
  class AssignGroupBasedTitles < ::Jobs::Scheduled
    every SiteSetting.update_title_frequency.hours

    def execute(args)
      return unless SiteSetting.add_title_by_group_trust_enabled

      # Holen Sie sich den Einstellungswert, der jetzt eine JSON-Zeichenfolge ist
      rules_json_string = SiteSetting.group_based_title_rules
      return if rules_json_string.blank?

      begin
        # Dies ist die wichtigste Korrektur: Parsen Sie die JSON-Zeichenfolge manuell in ein Ruby-Array
        rules = JSON.parse(rules_json_string)
      rescue JSON::ParserError
        # Wenn das JSON-Format falsch ist, beenden Sie direkt, um zu verhindern, dass der Task fehlschlägt
        Rails.logger.error("Group-Based Titles Plugin: Failed to parse group_based_title_rules JSON.")
        return
      end
      
      return unless rules.is_a?(Array) && rules.present?

      User.transaction do
        rules.each do |rule|
          group_id = rule["group_id"]
          trust_level = rule["trust_level"]
          title = rule["title"]

          next if group_id.blank? || trust_level.blank? || title.blank?

          User.where(primary_group_id: group_id, trust_level: trust_level)
              .where.not(title: title)
              .update_all(title: title)
        end
      end
    end
  end
end

config/settings.yml

plugins:
  add_title_by_group_trust_enabled:
    default: true
    client: true

  # Dies MUSS type: objects sein. Dies war die Fehlerquelle.
  group_based_title_rules:
    type: objects
    default: []
    schema:
      properties:
        group_id:
          type: integer
          name: "Benutzergruppe"
          component: "group-chooser"
        trust_level:
          type: integer
          name: "Vertrauenslevel"
          min: 1
          max: 4
        title:
          type: string
          name: "Titel"
  
  update_title_frequency:
    default: 24
    type: integer

plugin.rb

# frozen_string_literal: true

# name: add-title-by-group-trust-level
# about: Titel basierend auf primärer Gruppe und Vertrauenslevel zuweisen.
# version: 2.1.0
# authors: Your Name

enabled_site_setting :add_title_by_group_trust_enabled

after_initialize do
  require_relative "./app/jobs/scheduled/update-all-titles.rb"
end
1 „Gefällt mir“