كود التعامل مع وسم الرسائل الشخصية غير متناسق.
في بعض أجزاء قاعدة الكود، يكفي أن تكون في 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)
);
}
@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;
}
@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?
هذا الأخير مزعج بشكل خاص لأن الدالة ليست على علم بما إذا كانت تعمل على رسالة شخصية.