أفضل الممارسات لأتمتة العناوين حسب مجموعات + مستويات الثقة

مرحباً،

أبحث عن أفضل طريقة لتعيين ألقاب المستخدمين تلقائيًا بناءً على مزيج من العضوية في المجموعة ومستوى الثقة. على سبيل المثال:

  • إذا كان المستخدم في المجموعة أ ولديه مستوى ثقة 1، فيجب أن يكون لقبه “أ TL1”
  • إذا كان المستخدم في المجموعة أ ولديه مستوى ثقة 2، فيجب أن يكون لقبه “أ TL2”
  • إذا كان المستخدم في المجموعة ب ولديه مستوى ثقة 1، فيجب أن يكون لقبه “ب TL1”
  • … وهكذا

حسب ما وجدته حتى الآن، فإن الطريقة الرئيسية هي:

  1. إنشاء مجموعة منفصلة لكل مجموعة + مزيج مستوى الثقة (مثل a-tl1، a-tl2، b-tl1، إلخ) باستخدام المكون الإضافي للمجموعات الديناميكية (Dynamic Groups)،
  2. تعيين لقب افتراضي لكل من هذه المجموعات.

بينما يبدو أن هذا يعمل، فإنه يتطلب إنشاء وصيانة عدد كبير من المجموعات إذا كانت هناك العديد من التركيبات.

أسئلتي:

  • هل هذا الإعداد (العديد من المجموعات الديناميكية ولكل منها لقبها الافتراضي) هو أفضل أو الطريقة الوحيدة للحفاظ على تزامن الألقاب تلقائيًا؟
  • هل هناك نهج آخر (باستخدام نواة Discourse، أو الأتمتة، أو مكون إضافي آخر) لتعيين الألقاب ديناميكيًا بناءً على شروط مثل المجموعة + مستوى الثقة، دون الحاجة إلى إدارة العديد من المجموعات الإضافية؟

أي نصائح أو تجارب مشتركة ستكون موضع تقدير كبير. شكراً مقدماً!

هل سيعمل لديك تكوين العنوان بناءً على عضوية المجموعة (أ أو ب) ووجود مكون يضيف العنوان بناءً على مستوى الثقة خلف ذلك؟

أعتقد أنك لن تحتاج إلى كل هذه المجموعات الفرعية المدمجة :thinking:

فكرة أخرى: ربما يمكن استخدام المكون الإضافي الذي يضبط مستوى الثقة تلقائيًا كعنوان كأساس لتحديث عنوان أكثر تعقيدًا بناءً على مستوى الثقة وعضوية المجموعة.

3 إعجابات

شكراً على اقتراحاتك

للأسف، ليس لدي أي خبرة في البرمجة، لذلك لا أستطيع تطوير أو تعديل الإضافات. لقد تواصلت بالفعل مع مؤلف الإضافة لأطلب ما إذا كان يمكن إضافة هذه الميزة (الجمع بين عضوية المجموعة ومستوى الثقة للألقاب)، أو إذا كان لديهم أي نصائح.

إذا كانت هذه هي المجموعات الأساسية للمستخدم، أعتقد أنه كما ذكرت في الموضوع الآخر، فإن ذلك سيسهل الأمور كثيرًا.

بعد ذلك، يمكنك الحصول على مجموعته الأساسية عبر user.primary_group ثم تعيين العنوان باستخدام user.title.

@joo لقد أضفت الإعداد add_primary_group_title (الافتراضي معطل) الذي:

  • يضيف المجموعة الأساسية للمستخدم كعنوان
  • النص خلف العنوان، على سبيل المثال:

          يمكن تعديله باستخدام الإعدادات كما كان من قبل.

استخدمت لمسة من سحر ask.discourse.com.

ملاحظة: إذا كنت تتساءل كيف قمت بتسطير كلمة ‘can’، فقد استخدمت  . آسف يا رفاق.

إعجاب واحد (1)

أهلاً! شكراً لتحديثك ودعمك!

ربما لم أشرح متطلبي بوضوح من قبل، لذا أريد توضيحه مرة أخرى بمثال سهل الفهم:

لنفترض أن منتدانا لديه مجموعتان رئيسيتان:

  • المجموعة أ: المصممون
  • المجموعة ب: المطورون

لكل مجموعة، أريد أن يحصل المستخدمون ذوو مستويات الثقة المختلفة على لقب مختلف تمامًا، مثل هذا:

لمجموعة المصممين:
مستوى الثقة 1 → “مصمم مبتدئ”
مستوى الثقة 2 → “مصمم”
مستوى الثقة 3 → “مصمم أول”
مستوى الثقة 4 → “كبير المصممين”

لمجموعة المطورين:
مستوى الثقة 1 → “مطور مبتدئ”
مستوى الثقة 2 → “مطور”
مستوى الثقة 3 → “مطور أول”
مستوى الثقة 4 → “قائد تقني”

لذلك، إذا كان شخص ما في “المصممين” مع مستوى ثقة 3، فيجب أن يكون لقبه “مصمم أول”.
إذا كانوا في “المطورين” مع مستوى ثقة 2، فيجب أن يكون اللقب “مطور”.

أود أن أكون قادرًا على تعيين هذه القواعد لكل مجموعة ومستوى ثقة، وأن يتم تعيين الألقاب تلقائيًا مع تغير مجموعات المستخدمين أو مستويات ثقتهم.

هل هناك أي نصائح يمكنك مشاركتها حول كيفية تحقيق ذلك، أو هل ستفكر في إضافة هذا كميزة جديدة في المكون الإضافي الخاص بك؟

شكراً جزيلاً لك!

إعجاب واحد (1)

أيضًا، أحاول تحقيق ذلك على موقع الاختبار الخاص بي: http://ask.discourse.com/.
ليس لدي خبرة برمجية، لذا لست متأكدًا مما إذا كان من الممكن تنفيذ ذلك بنفسي.

قد أستخدم قيمة عنصر نائب، على سبيل المثال {group_nane} في مربع النص حتى يسهل تعديل العنوان. سألقي نظرة.

قد ترغب في الاطلاع على:

مرحباً!

لقد قمت بتعديل المكون الإضافي ليناسب احتياجاتي، وأود أن أشارك ما فعلته، وسير عملي الحالي، وبعض الأسئلة/الطلبات للحصول على المشورة.


1. تعديلاتي

مسار الملف والمحتوى:

الملف: 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|
        # تخطي المسؤولين والمشرفين، لا تقم بتحديث ألقابهم
        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

الملف: 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. كيف اختبرت

أقوم حاليًا بتشغيل هذا المنطق يدويًا عبر وحدة تحكم Rails للتحقق مما إذا كانت الوظيفة تعمل. إنها تقوم بتحديث ألقاب المستخدمين بشكل جماعي وفقًا لمتطلباتي.


3. مشكلة إدخال إعدادات المكون الإضافي

لا يوجد زر “إعدادات” لهذا المكون الإضافي في صفحة /admin/plugins. في الوقت الحالي، لتغيير التكوين، يتعين عليّ زيارة /admin/plugins/add-title-based-on-trust-level/settings مباشرةً. هل هناك طريقة لجعل زر الإعدادات أو الرابط يظهر في صفحة المكونات الإضافية لسهولة الوصول؟


4. إعداداتي الحالية

هذا هو تكوين JSON الحالي الخاص بي (سأرفق لقطة شاشة أيضًا):

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


5. أسئلة / تحسينات محتملة

  • هل هذا النهج (التكرار عبر كل مستخدم وتحديث لقبه) يخاطر بمشاكل الأداء إذا كان هناك الكثير من المستخدمين؟ هل هناك أفضل ممارسة أفضل لهذا؟
  • أي نصيحة بشأن التحسين، سواء للوظيفة المجدولة أو لواجهة مستخدم إعدادات المسؤول؟
  • هل هناك أي شيء غير آمن أو إشكالي في طريقتي يجب أن أكون حذرًا بشأنه؟

شكراً جزيلاً على عملكم الرائع وهذا المكون الإضافي المفيد!
إذا كانت لديك أي اقتراحات، أو إذا كنت تخطط لتحسين تكوين ألقاب المجموعات + مستويات الثقة في المستقبل، فسأحب أن أسمع أفكارك.

إعجابَين (2)

@joo فكرة رائعة حقًا!

إذا نظرت إلى المكون الإضافي الآن، أعتقد أنني فعلت ذلك أيضًا (كنت أجري بعض الاختبارات النهائية). أرى أنك قمت بالتكرار عبر كل مستخدم، ولكن في المنتديات الكبيرة، قد يستغرق هذا بعض الوقت.

لذلك، قمت بتحديث SQL:

(لقد قمت بتكييف استعلام Ask Discourse وتعديله)

بهذه الطريقة، في الإعداد tl1_title_on_promotion، يجب أن تكون قادرًا على استخدام شيء مثل Junior {group_name}، بحيث يصبح العنوان Junior Developer.

لاحظ أنه سيتعين عليك أيضًا تحديد add_primary_group_title لكي يعمل.

إعجاب واحد (1)

شكرًا على الشرح، أفهم الآن كيف يعمل قالب {group_name} الخاص بك.

ولكن هذا هو بالضبط ما قصدته بالاختلاف في المنطق. متطلبي الأساسي هو أن أكون قادرًا على تطبيق هياكل عناوين مختلفة تمامًا لنفس مستوى الثقة، بناءً على مجموعات المستخدمين المختلفة.

على سبيل المثال، لمستوى الثقة 3:

  • يجب أن يكون عنوان مجموعة “المصممين” هو “مصمم أول”.
  • يجب أن يكون عنوان مجموعة “المطورين” هو “قائد تقني”.

هذان العنوانان لهما هياكل مختلفة تمامًا.

لقد حاولت تنفيذ هذه الميزة باستخدام الذكاء الاصطناعي، لكنني لم أنجح. كنت أتساءل عما إذا كان من الممكن تعديل المكون الإضافي لدعم هذا المنطق الأكثر تفصيلاً؟

أوه، أعتقد أنني أسأت فهمك إذن.

إذًا، هل نجح الكود الخاص بك أعلاه؟

لا، الكود السابق الذي جربته مع الذكاء الاصطناعي لم يعمل أيضًا. بعد إعداد كل شيء، لم يحدث شيء على الإطلاق.

أردت أن أريك الكود الكامل من محاولتي الأخيرة. كنت آمل أن تتمكن من رؤية ما أفعله بشكل خاطئ.

1. plugin.rb

# name: add-title-by-group-trust-level
# about: assign titles via primary group + trust level using SQL
# version: 0.2
# authors: your-name

# Note: I'm not sure if I need a 'require' line here to load the job file.
# I suspect this might be the missing piece.
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

هذه هي الطريقة التي قمت بتكوينها في إعدادات الموقع:

لقد قمت بلصق هذا JSON في إعداد group_trust_level_titles:

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

المشكلة:
لا يظهر مهمة UpdateTitles في مجدول Sidekiq (/sidekiq/scheduler).

ومع ذلك، اختبرتها في وحدة تحكم Rails وفقًا للطريقة التي قدمها الذكاء الاصطناعي، والمنطق الأساسي يعمل بشكل جيد، ويطبع بشكل صحيح جميع المستخدمين الذين يستوفون الشروط.

هذا هو نص الاختبار الذي استخدمته في وحدة تحكم 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 "Could not find group: #{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 "====== Group: #{group.name} Trust Level: #{tl} New Title: '#{title}' ======"
    users.each do |user|
      puts "User id:#{user.id}, username:#{user.username}, current title:'#{user.title}'"
    end
  end
end

لذلك يبدو أن المنطق نفسه صحيح، لكن Discourse لا يسجل المهمة المجدولة. على أي حال، كلما حاولت تغييره، زاد الأمر تعقيدًا… لست متأكدًا مما إذا كان هذا هو النهج الصحيح، وبما أنني لا أعرف كيفية البرمجة، يبدو الأمر صعبًا جدًا لتنفيذ هذا. هل لديك طريقة أفضل؟

ربما ترغب في استخدام إعدادات الكائنات:

مع حقول مثل مستوى الثقة، والمجموعة، والعنوان.

إعجاب واحد (1)

أردت فقط تقديم تحديث وشكر كل من ساعد.\n\nمع التغييرات الأخيرة، تعمل الإضافة الآن تمامًا كما كنت أقصد! إنها تعين الألقاب بشكل صحيح بناءً على المجموعة الأساسية للمستخدم ومستوى الثقة.\n\nأنا أنشر الكود النهائي العامل أدناه. يبدو أنه صحيح، ولكن نظرًا لأنني لست مطورًا، كنت أتساءل عما إذا كانت هناك أي مجالات للتحسين أو التحسين قد أكون قد أغفلتها.\n\napp/jobs/scheduled/update-all-titles.rb\n\n\n# frozen_string_literal: true\n\nmodule ::Jobs\n class AssignGroupBasedTitles < ::Jobs::Scheduled\n every SiteSetting.update_title_frequency.hours\n\n def execute(args)\n return unless SiteSetting.add_title_by_group_trust_enabled\n\n # الحصول على قيمة الإعداد، وهي الآن سلسلة JSON\n rules_json_string = SiteSetting.group_based_title_rules\n return if rules_json_string.blank?\n\n begin\n # هذا هو الإصلاح الأكثر أهمية: تحليل سلسلة JSON يدويًا إلى مصفوفة Ruby\n rules = JSON.parse(rules_json_string)\n rescue JSON::ParserError\n # إذا كان تنسيق JSON خاطئًا، فقم بالخروج مباشرة لمنع فشل المهمة\n Rails.logger.error(\"Group-Based Titles Plugin: Failed to parse group_based_title_rules JSON.\")\n return\n end\n \n return unless rules.is_a?(Array) && rules.present?\n\n User.transaction do\n rules.each do |rule|\n group_id = rule[\"group_id\"]\n trust_level = rule[\"trust_level\"]\n title = rule[\"title\"]\n\n next if group_id.blank? || trust_level.blank? || title.blank?\n\n User.where(primary_group_id: group_id, trust_level: trust_level)\n .where.not(title: title)\n .update_all(title: title)\n end\n end\n end\n end\nend\n\n\nconfig/settings.yml\n\nplugins:\n add_title_by_group_trust_enabled:\n default: true\n client: true\n\n # يجب أن يكون هذا من النوع: objects. كان هذا مصدر الخطأ.\n group_based_title_rules:\n type: objects\n default: []\n schema:\n properties:\n group_id:\n type: integer\n name: \"User Group\"\n component: \"group-chooser\"\n trust_level:\n type: integer\n name: \"Trust Level\"\n min: 1\n max: 4\n title:\n type: string\n name: \"Title\"\n \n update_title_frequency:\n default: 24\n type: integer\n\n\nplugin.rb\n\n# frozen_string_literal: true\n\n# name: add-title-by-group-trust-level\n# about: Assign titles based on primary group and trust level.\n# version: 2.1.0\n# authors: Your Name\n\nenabled_site_setting :add_title_by_group_trust_enabled\n\nafter_initialize do\n require_relative \"./app/jobs/scheduled/update-all-titles.rb\"\nend\n

إعجاب واحد (1)