رمز غير متناسق / متطلبات لعلامة PM

كود التعامل مع وسم الرسائل الشخصية غير متناسق.

في بعض أجزاء قاعدة الكود، يكفي أن تكون في pm_tags_allowed_for_groups لتتمكن من وسم رسالة شخصية.

في أجزاء أخرى من قاعدة الكود، يجب أن تكون في كل من pm_tags_allowed_for_groups و tag_topic_allowed_groups.

هذا مقيد بشكل خاص عندما تكون هناك حاجة للمستخدمين لتمكينهم من وسم رسائلهم الشخصية الخاصة بينما لا تريدهم أن يسموا المواضيع العامة (على سبيل المثال، هذا Private template permissions to override allowed PM tagging groups)، أي عندما لا يكون pm_tags_allowed_for_groups مجموعة فرعية مناسبة لـ tag_topic_allowed_groups.

تحليل

في TagGuardian هذه إعدادات منفصلة. تحتاج فقط إلى أن تكون في pm_tags_allowed_for_groups لتتمكن من وسم رسالة شخصية.

  def can_tag_topics?
    SiteSetting.tagging_enabled && @user.in_any_groups?(SiteSetting.tag_topic_allowed_groups_map)
  end

  def can_tag_pms?
    return false if !SiteSetting.tagging_enabled
    return false if @user.blank?
    return true if @user == Discourse.system_user

    group_ids = SiteSetting.pm_tags_allowed_for_groups_map
    group_ids.include?(Group::AUTO_GROUPS[:everyone]) ||
      @user.group_users.exists?(group_id: group_ids)
  end

وينطبق الشيء نفسه على Guardian.can_tag? الإعدادات منفصلة.

  def can_tag?(topic)
    return false if topic.blank?

    topic.private_message? ? can_tag_pms? : can_tag_topics?
  end

ListController سعيد بـ can_tag_pms? فقط أيضًا

    when :private_messages_tag
      raise Discourse::NotFound if target_user.id != current_user.id
      raise Discourse::NotFound if !guardian.can_tag_pms?

ولكن، TopicGuardian يتطلب أن يكون المستخدم في كل من tag_topic_allowed_groups و pm_tags_allowed_for_groups إذا كانوا يريدون أن يكونوا قادرين على وسم رسالة شخصية.

  def can_edit_tags?(topic)
    return false unless can_tag_topics?
    return false if topic.private_message? && !can_tag_pms?
    return true if can_edit_topic?(topic)

    if topic&.first_post&.wiki &&
         @user.in_any_groups?(SiteSetting.edit_wiki_post_allowed_groups_map)
      return can_create_post?(topic)
    end

    false
  end

على جانب العميل، نفس القيد موجود في Composer

  @discourseComputed("model.canEditTitle", "model.creatingPrivateMessage")
  canEditTags(canEditTitle, creatingPrivateMessage) {
    const isPrivateMessage =
      creatingPrivateMessage || this.get("model.topic.isPrivateMessage");
    return (
      canEditTitle &&
      this.site.can_tag_topics &&
      (!isPrivateMessage || this.site.can_tag_pms)
    );
  }

و TopicController

  @discourseComputed("model.isPrivateMessage")
  canEditTags(isPrivateMessage) {
    return (
      this.site.get("can_tag_topics") &&
      (!isPrivateMessage || this.site.get("can_tag_pms"))
    );
  }

ولكن نافذة Move to Topic لا تحتوي على هذا القيد:

  get canTagMessages() {
    return this.site.can_tag_pms;
  }

ولا ChatToTopicSelector

@alias("site.can_tag_pms") canTagMessages;

ولا UserPrivateMessagesController

@readOnly("site.can_tag_pms") pmTaggingEnabled;

    if (this.pmTaggingEnabled) {
      content.push({
        id: this.router.urlFor("userPrivateMessages.tags", usernameLower),
        name: i18n("user.messages.tags"),
        icon: "tags",
      });
    }

ملخص

الفئة ج/ع السلوك
TagGuardian خادم pm_tags_allowed_for_groups فقط
Guardian خادم pm_tags_allowed_for_groups فقط
ListController خادم pm_tags_allowed_for_groups فقط
TopicGuardian خادم كل من pm_tags_allowed_for_groups و tag_topic_allowed_groups
Composer عميل كل من pm_tags_allowed_for_groups و tag_topic_allowed_groups
TopicController عميل كل من pm_tags_allowed_for_groups و tag_topic_allowed_groups
نافذة Move to Topic عميل pm_tags_allowed_for_groups فقط
ChatToTopicSelector عميل pm_tags_allowed_for_groups فقط

مشاكل إضافية

وجدت عائقين إضافيين:

PostRevisor يستخدم tc.guardian.can_tag_topics? بدلاً من tc.guardian.can_tag?(tc.topic)

وفي DiscourseTagging

tag_topic_by_names يقوم بالشيء الصحيح

  def self.tag_topic_by_names(topic, guardian, tag_names_arg, append: false)
    if guardian.can_tag?(topic)

ولكن بعد ذلك tags_for_saving لا يفعل ذلك


   def self.tags_for_saving(tags_arg, guardian, opts = {})
    return [] unless guardian.can_tag_topics? && tags_arg.present?

هذا الأخير مزعج بشكل خاص لأن الدالة ليست على علم بما إذا كانت تعمل على رسالة شخصية.

6 إعجابات