refactor wo pluck

kayrozen 44ad4860 07bc2952

Changed files
+85 -110
config
+1 -1
config/locales/server.en.yml
··· 2 en: 3 site_settings: 4 shadowban_enabled: "Enable shadowban" 5 - shadowban_approved_group_name: "Group name for approved users (users NOT in this group will be shadowbanned)" 6 shadowban_show_to_staff: "Show shadowbanned posts to staff"
··· 2 en: 3 site_settings: 4 shadowban_enabled: "Enable shadowban" 5 + shadowban_allowed_group: "Group name for approved users (users NOT in this group will be shadowbanned)" 6 shadowban_show_to_staff: "Show shadowbanned posts to staff"
+1 -1
config/locales/server.fr.yml
··· 2 fr: 3 site_settings: 4 shadowban_enabled: "Activer le shadowban" 5 - shadowban_approved_group_name: "Nom du groupe d'utilisateurs approuvés (les utilisateurs PAS dans ce groupe seront en shadowban)" 6 shadowban_show_to_staff: "Afficher les publications shadowban au staff"
··· 2 fr: 3 site_settings: 4 shadowban_enabled: "Activer le shadowban" 5 + shadowban_allowed_group: "Nom du groupe d'utilisateurs approuvés (les utilisateurs PAS dans ce groupe seront en shadowban)" 6 shadowban_show_to_staff: "Afficher les publications shadowban au staff"
+5 -6
config/settings.yml
··· 1 # config/settings.yml 2 - shadowban: 3 shadowban_enabled: 4 default: false 5 - client: true 6 - shadowban_approved_group_name: 7 - default: "approved_users" 8 - client: false 9 type: string 10 shadowban_show_to_staff: 11 default: true 12 - client: true
··· 1 # config/settings.yml 2 + shadowban-all-plugin: 3 shadowban_enabled: 4 default: false 5 + type: bool 6 + shadowban_allowed_group: 7 + default: "" 8 type: string 9 shadowban_show_to_staff: 10 default: true 11 + type: bool
+78 -102
plugin.rb
··· 1 - # name: shadowban 2 - # about: Hide posts from users NOT in a specific group (whitelist approach) 3 - # version: 0.2.0 4 - # authors: Michael Howell (notriddle), Modified for whitelist groups 5 # url: https://github.com/notriddle/discourse-shadowban 6 enabled_site_setting :shadowban_enabled 7 8 after_initialize do 9 10 - # Méthode helper pour récupérer les IDs des utilisateurs autorisés (non-shadowban) 11 - def approved_user_ids 12 - return [] unless SiteSetting.shadowban_approved_group_name.present? 13 14 - Rails.cache.fetch("approved_user_ids_#{SiteSetting.shadowban_approved_group_name}", expires_in: 5.minutes) do 15 - group = Group.find_by(name: SiteSetting.shadowban_approved_group_name) 16 - return [] unless group 17 - 18 - # Récupère les IDs des utilisateurs du groupe approuvé 19 - group.users.pluck(:id) 20 - end 21 - end 22 - 23 - # Méthode pour vérifier si un utilisateur est shadowban (NOT in approved group) 24 - def user_is_shadowbanned?(user_id) 25 - return false unless SiteSetting.shadowban_enabled 26 - return false unless SiteSetting.shadowban_approved_group_name.present? 27 - return false if user_id.nil? 28 29 - # Si l'utilisateur n'est PAS dans le groupe approuvé, il est shadowban 30 - !approved_user_ids.include?(user_id) 31 - end 32 - 33 - # Invalide le cache quand les membres du groupe changent 34 - DiscourseEvent.on(:user_added_to_group) do |user, group| 35 - if group.name == SiteSetting.shadowban_approved_group_name 36 - Rails.cache.delete("approved_user_ids_#{SiteSetting.shadowban_approved_group_name}") 37 - end 38 - end 39 - 40 - DiscourseEvent.on(:user_removed_from_group) do |user, group| 41 - if group.name == SiteSetting.shadowban_approved_group_name 42 - Rails.cache.delete("approved_user_ids_#{SiteSetting.shadowban_approved_group_name}") 43 - end 44 end 45 46 - # Invalide le cache quand le nom du groupe change 47 - DiscourseEvent.on(:site_setting_changed) do |name, old_value, new_value| 48 - if name == :shadowban_approved_group_name 49 - Rails.cache.delete("approved_user_ids_#{old_value}") if old_value.present? 50 - end 51 end 52 53 module ::DiscourseShadowbanTopicView 54 def filter_post_types(posts) 55 result = super(posts) 56 57 - # Le staff peut toujours voir tous les posts 58 if SiteSetting.shadowban_show_to_staff && @user&.staff? 59 return result 60 end 61 - 62 - # Filtre les posts des utilisateurs shadowban 63 - if SiteSetting.shadowban_enabled && SiteSetting.shadowban_approved_group_name.present? 64 - approved_ids = approved_user_ids 65 - if approved_ids.any? 66 - # Montre seulement les posts des utilisateurs approuvés + les posts de l'utilisateur actuel 67 - result = result.where( 68 - 'posts.user_id IN (?) OR posts.user_id = ?', 69 - approved_ids, 70 - @user&.id || 0 71 - ) 72 - else 73 - # Si aucun utilisateur approuvé, montre seulement les posts de l'utilisateur actuel 74 - result = result.where('posts.user_id = ?', @user&.id || 0) 75 - end 76 - end 77 78 - result 79 end 80 end 81 ··· 87 def default_results(options = {}) 88 result = super(options) 89 90 - # Le staff peut toujours voir tous les topics 91 if SiteSetting.shadowban_show_to_staff && @user&.staff? 92 return result 93 end 94 - 95 - # Filtre les topics des utilisateurs shadowban 96 - if SiteSetting.shadowban_enabled && SiteSetting.shadowban_approved_group_name.present? 97 - approved_ids = approved_user_ids 98 - if approved_ids.any? 99 - # Montre seulement les topics des utilisateurs approuvés + les topics de l'utilisateur actuel 100 - result = result.where( 101 - 'topics.user_id IN (?) OR topics.user_id = ?', 102 - approved_ids, 103 - @user&.id || 0 104 - ) 105 - else 106 - # Si aucun utilisateur approuvé, montre seulement les topics de l'utilisateur actuel 107 - result = result.where('topics.user_id = ?', @user&.id || 0) 108 - end 109 - end 110 111 - result 112 end 113 end 114 ··· 118 119 module ::DiscourseShadowbanPostAlerter 120 def create_notification(user, type, post, opts = {}) 121 - # Le staff reçoit toujours les notifications 122 - if SiteSetting.shadowban_show_to_staff && user&.staff? 123 - return super(user, type, post, opts) 124 - end 125 - 126 - # Ne pas envoyer de notification si le post vient d'un utilisateur shadowban 127 - unless user_is_shadowbanned?(post.user_id) 128 super(user, type, post, opts) 129 end 130 end ··· 136 137 module ::DiscourseShadowbanPostCreator 138 def update_topic_stats 139 - # Ne pas mettre à jour les stats si l'utilisateur est shadowban 140 - unless user_is_shadowbanned?(@post.user_id) 141 super 142 end 143 end 144 145 def update_user_counts 146 # Ne pas mettre à jour les compteurs si l'utilisateur est shadowban 147 - unless user_is_shadowbanned?(@post.user_id) 148 super 149 end 150 end ··· 154 prepend ::DiscourseShadowbanPostCreator 155 end 156 157 - # Ajoute une méthode helper disponible globalement 158 - def self.approved_user_ids 159 - return [] unless SiteSetting.shadowban_approved_group_name.present? 160 - 161 - Rails.cache.fetch("approved_user_ids_#{SiteSetting.shadowban_approved_group_name}", expires_in: 5.minutes) do 162 - group = Group.find_by(name: SiteSetting.shadowban_approved_group_name) 163 - return [] unless group 164 - group.users.pluck(:id) 165 end 166 - end 167 168 - def self.user_is_shadowbanned?(user_id) 169 - return false unless SiteSetting.shadowban_enabled 170 - return false unless SiteSetting.shadowban_approved_group_name.present? 171 - return false if user_id.nil? 172 - 173 - !approved_user_ids.include?(user_id) 174 end 175 end
··· 1 + # name: shadowban-group 2 + # about: Hide posts from all users except those in a specific group 3 + # version: 0.0.2 4 + # authors: Modified from Michael Howell (notriddle) 5 # url: https://github.com/notriddle/discourse-shadowban 6 enabled_site_setting :shadowban_enabled 7 8 after_initialize do 9 10 + # Méthode helper pour vérifier si un utilisateur est dans le groupe autorisé 11 + def self.user_in_allowed_group?(user) 12 + return false unless user 13 + return true if user.staff? && SiteSetting.shadowban_show_to_staff 14 15 + group_name = SiteSetting.shadowban_allowed_group 16 + return true if group_name.blank? # Si aucun groupe n'est défini, tous les utilisateurs sont autorisés 17 18 + user.groups.where(name: group_name).exists? 19 end 20 21 + # Méthode helper pour vérifier si un utilisateur est shadowban 22 + def self.user_shadowbanned?(user) 23 + return false unless user 24 + return false if user.staff? && SiteSetting.shadowban_show_to_staff 25 + 26 + group_name = SiteSetting.shadowban_allowed_group 27 + return false if group_name.blank? # Si aucun groupe n'est défini, personne n'est shadowban 28 + 29 + !user.groups.where(name: group_name).exists? 30 end 31 32 module ::DiscourseShadowbanTopicView 33 def filter_post_types(posts) 34 result = super(posts) 35 36 + # Si l'utilisateur actuel peut voir les posts shadowban, on ne filtre pas 37 if SiteSetting.shadowban_show_to_staff && @user&.staff? 38 return result 39 end 40 + 41 + group_name = SiteSetting.shadowban_allowed_group 42 + return result if group_name.blank? 43 44 + # Exclure les posts des utilisateurs qui ne sont PAS dans le groupe autorisé 45 + # sauf si c'est l'utilisateur lui-même qui regarde ses propres posts 46 + result.where( 47 + 'posts.user_id IN ( 48 + SELECT u.id FROM users u 49 + INNER JOIN group_users gu ON u.id = gu.user_id 50 + INNER JOIN groups g ON gu.group_id = g.id 51 + WHERE g.name = ? 52 + ) OR posts.user_id = ?', 53 + group_name, 54 + @user&.id || 0 55 + ) 56 end 57 end 58 ··· 64 def default_results(options = {}) 65 result = super(options) 66 67 + # Si l'utilisateur actuel peut voir les topics shadowban, on ne filtre pas 68 if SiteSetting.shadowban_show_to_staff && @user&.staff? 69 return result 70 end 71 + 72 + group_name = SiteSetting.shadowban_allowed_group 73 + return result if group_name.blank? 74 75 + # Exclure les topics créés par des utilisateurs qui ne sont PAS dans le groupe autorisé 76 + # sauf si c'est l'utilisateur lui-même qui regarde ses propres topics 77 + result.where( 78 + 'topics.user_id IN ( 79 + SELECT u.id FROM users u 80 + INNER JOIN group_users gu ON u.id = gu.user_id 81 + INNER JOIN groups g ON gu.group_id = g.id 82 + WHERE g.name = ? 83 + ) OR topics.user_id = ?', 84 + group_name, 85 + @user&.id || 0 86 + ) 87 end 88 end 89 ··· 93 94 module ::DiscourseShadowbanPostAlerter 95 def create_notification(user, type, post, opts = {}) 96 + # Ne pas créer de notification si l'auteur du post est shadowban 97 + # sauf si le destinataire est staff et peut voir les posts shadowban 98 + if (SiteSetting.shadowban_show_to_staff && user&.staff?) || 99 + !DiscourseShadowbanGroup.user_shadowbanned?(post.user) 100 super(user, type, post, opts) 101 end 102 end ··· 108 109 module ::DiscourseShadowbanPostCreator 110 def update_topic_stats 111 + # Ne pas mettre à jour les statistiques si l'utilisateur est shadowban 112 + unless DiscourseShadowbanGroup.user_shadowbanned?(@post.user) 113 super 114 end 115 end 116 117 def update_user_counts 118 # Ne pas mettre à jour les compteurs si l'utilisateur est shadowban 119 + unless DiscourseShadowbanGroup.user_shadowbanned?(@post.user) 120 super 121 end 122 end ··· 126 prepend ::DiscourseShadowbanPostCreator 127 end 128 129 + # Créer un module pour les méthodes helper 130 + module ::DiscourseShadowbanGroup 131 + def self.user_in_allowed_group?(user) 132 + return false unless user 133 + return true if user.staff? && SiteSetting.shadowban_show_to_staff 134 + 135 + group_name = SiteSetting.shadowban_allowed_group 136 + return true if group_name.blank? 137 + 138 + user.groups.where(name: group_name).exists? 139 end 140 141 + def self.user_shadowbanned?(user) 142 + return false unless user 143 + return false if user.staff? && SiteSetting.shadowban_show_to_staff 144 + 145 + group_name = SiteSetting.shadowban_allowed_group 146 + return false if group_name.blank? 147 + 148 + !user.groups.where(name: group_name).exists? 149 + end 150 end 151 end