diff --git a/app/assets/javascripts/admin/templates/group.hbs b/app/assets/javascripts/admin/templates/group.hbs index 736fab05de6..1bd414e3309 100644 --- a/app/assets/javascripts/admin/templates/group.hbs +++ b/app/assets/javascripts/admin/templates/group.hbs @@ -111,8 +111,13 @@ {{/unless}}
- - {{combo-box name="alias" valueAttribute="value" value=model.alias_level content=aliasLevelOptions}} + + {{combo-box name="alias" valueAttribute="value" value=model.mentionable_level content=aliasLevelOptions}} +
+ +
+ + {{combo-box name="alias" valueAttribute="value" value=model.messageable_level content=aliasLevelOptions}}
diff --git a/app/assets/javascripts/discourse/models/group.js.es6 b/app/assets/javascripts/discourse/models/group.js.es6 index 21206d3932e..c06d5966300 100644 --- a/app/assets/javascripts/discourse/models/group.js.es6 +++ b/app/assets/javascripts/discourse/models/group.js.es6 @@ -108,9 +108,9 @@ const Group = RestModel.extend({ return this.get('flair_color') ? this.get('flair_color').replace(new RegExp("[^0-9a-fA-F]", "g"), "") : null; }, - @computed('alias_level') - canEveryoneMention(aliasLevel) { - return aliasLevel === '99'; + @computed('mentionable_level') + canEveryoneMention(mentionableLevel) { + return mentionableLevel === '99'; }, @observes("visibility_level", "canEveryoneMention") @@ -131,7 +131,8 @@ const Group = RestModel.extend({ asJSON() { const attrs = { name: this.get('name'), - alias_level: this.get('alias_level'), + mentionable_level: this.get('mentionable_level'), + messageable_level: this.get('messageable_level'), visibility_level: this.get('visibility_level'), automatic_membership_email_domains: this.get('emailDomains'), automatic_membership_retroactive: !!this.get('automatic_membership_retroactive'), diff --git a/app/assets/javascripts/discourse/routes/new-message.js.es6 b/app/assets/javascripts/discourse/routes/new-message.js.es6 index 85731a8e827..5010077a751 100644 --- a/app/assets/javascripts/discourse/routes/new-message.js.es6 +++ b/app/assets/javascripts/discourse/routes/new-message.js.es6 @@ -21,8 +21,8 @@ export default Discourse.Route.extend({ }); } else if (params.groupname) { // send a message to a group - Group.mentionable(params.groupname).then(result => { - if (result.mentionable) { + Group.messageable(params.groupname).then(result => { + if (result.messageable) { Ember.run.next(() => e.send("createNewMessageViaParams", params.groupname, params.title, params.body)); } else { bootbox.alert(I18n.t("composer.cant_send_pm", { username: params.groupname })); diff --git a/app/controllers/admin/groups_controller.rb b/app/controllers/admin/groups_controller.rb index 99e2dc8dc2a..5f481d3a2fa 100644 --- a/app/controllers/admin/groups_controller.rb +++ b/app/controllers/admin/groups_controller.rb @@ -60,7 +60,8 @@ class Admin::GroupsController < Admin::AdminController def save_group(group) group.name = group_params[:name] if group_params[:name].present? && !group.automatic - group.alias_level = group_params[:alias_level].to_i if group_params[:alias_level].present? + group.mentionable_level = group_params[:mentionable_level].to_i if group_params[:mentionable_level].present? + group.messageable_level = group_params[:messageable_level].to_i if group_params[:messageable_level].present? if group_params[:visibility_level] group.visibility_level = group_params[:visibility_level] @@ -192,7 +193,8 @@ class Admin::GroupsController < Admin::AdminController def group_params params.require(:group).permit( :name, - :alias_level, + :mentionable_level, + :messageable_level, :visibility_level, :automatic_membership_email_domains, :automatic_membership_retroactive, diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index ba212bfe591..136c037d9d9 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -3,6 +3,7 @@ class GroupsController < ApplicationController before_filter :ensure_logged_in, only: [ :set_notifications, :mentionable, + :messageable, :update, :messages, :histories, @@ -203,6 +204,16 @@ class GroupsController < ApplicationController end end + def messageable + group = find_group(:name) + + if group + render json: { messageable: Group.messageable(current_user).where(id: group.id).present? } + else + raise Discourse::InvalidAccess.new + end + end + def remove_member group = Group.find(params[:id]) group.public_exit ? ensure_logged_in : guardian.ensure_can_edit!(group) diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb index 42c0202d767..0549a1cc233 100644 --- a/app/controllers/posts_controller.rb +++ b/app/controllers/posts_controller.rb @@ -615,7 +615,7 @@ class PostsController < ApplicationController if usernames = result[:target_usernames] usernames = usernames.split(",") - groups = Group.mentionable(current_user).where('name in (?)', usernames).pluck('name') + groups = Group.messageable(current_user).where('name in (?)', usernames).pluck('name') usernames -= groups emails = usernames.select { |user| user.match(/@/) } usernames -= emails diff --git a/app/models/group.rb b/app/models/group.rb index c302ca50928..91b361f5b27 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -78,7 +78,8 @@ class Group < ActiveRecord::Base ) end - validates :alias_level, inclusion: { in: ALIAS_LEVELS.values } + validates :mentionable_level, inclusion: { in: ALIAS_LEVELS.values } + validates :messageable_level, inclusion: { in: ALIAS_LEVELS.values } scope :visible_groups, ->(user) { groups = Group.order(name: :asc).where("groups.id > 0") @@ -126,6 +127,23 @@ class Group < ActiveRecord::Base scope :mentionable, lambda { |user| + where("mentionable_level in (:levels) OR + ( + mentionable_level = #{ALIAS_LEVELS[:members_mods_and_admins]} AND id in ( + SELECT group_id FROM group_users WHERE user_id = :user_id) + )", levels: alias_levels(user), user_id: user && user.id) + } + + scope :messageable, lambda { |user| + + where("messageable_level in (:levels) OR + ( + messageable_level = #{ALIAS_LEVELS[:members_mods_and_admins]} AND id in ( + SELECT group_id FROM group_users WHERE user_id = :user_id) + )", levels: alias_levels(user), user_id: user && user.id) + } + + def self.alias_levels(user) levels = [ALIAS_LEVELS[:everyone]] if user && user.admin? @@ -139,12 +157,8 @@ class Group < ActiveRecord::Base ALIAS_LEVELS[:members_mods_and_admins]] end - where("alias_level in (:levels) OR - ( - alias_level = #{ALIAS_LEVELS[:members_mods_and_admins]} AND id in ( - SELECT group_id FROM group_users WHERE user_id = :user_id) - )", levels: levels, user_id: user && user.id) - } + levels + end def downcase_incoming_email self.incoming_email = (incoming_email || "").strip.downcase.presence @@ -615,7 +629,8 @@ end # updated_at :datetime not null # automatic :boolean default(FALSE), not null # user_count :integer default(0), not null -# alias_level :integer default(0) +# mentionable_level :integer default(0) +# messageable_level :integer default(0) # automatic_membership_email_domains :text # automatic_membership_retroactive :boolean default(FALSE) # primary_group :boolean default(FALSE), not null diff --git a/app/serializers/basic_group_serializer.rb b/app/serializers/basic_group_serializer.rb index ca74ab7c596..4bdafc6b0eb 100644 --- a/app/serializers/basic_group_serializer.rb +++ b/app/serializers/basic_group_serializer.rb @@ -4,7 +4,8 @@ class BasicGroupSerializer < ApplicationSerializer :name, :display_name, :user_count, - :alias_level, + :mentionable_level, + :messageable_level, :visibility_level, :automatic_membership_email_domains, :automatic_membership_retroactive, diff --git a/app/serializers/group_show_serializer.rb b/app/serializers/group_show_serializer.rb index 3bd6bf31d15..933111b71c1 100644 --- a/app/serializers/group_show_serializer.rb +++ b/app/serializers/group_show_serializer.rb @@ -25,6 +25,10 @@ class GroupShowSerializer < BasicGroupSerializer Group.mentionable(scope.user).exists?(id: object.id) end + def messageable + Group.messageable(scope.user).exists?(id: object.id) + end + private def authenticated? diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index d0fad92748e..06359131913 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -459,7 +459,8 @@ en: staff: "Group owners and staff" owners: "Group owners and admins" alias_levels: - title: "Who can message and @mention this group?" + mentionable: "Who can @mention this group?" + messageable: "Who can message this group?" nobody: "Nobody" only_admins: "Only admins" mods_and_admins: "Only moderators and Admins" diff --git a/config/routes.rb b/config/routes.rb index 64fe59a0cbd..847f8ee083e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -443,6 +443,7 @@ Discourse::Application.routes.draw do get 'messages' get 'counts' get 'mentionable' + get 'messageable' get 'logs' => 'groups#histories' collection do diff --git a/db/migrate/20170818191909_split_alias_levels.rb b/db/migrate/20170818191909_split_alias_levels.rb new file mode 100644 index 00000000000..b7bb54ba90d --- /dev/null +++ b/db/migrate/20170818191909_split_alias_levels.rb @@ -0,0 +1,8 @@ +class SplitAliasLevels < ActiveRecord::Migration + def change + rename_column :groups, :alias_level, :mentionable_level + add_column :groups, :messageable_level, :integer, default: 0 + + Group.update_all('messageable_level=mentionable_level') + end +end diff --git a/lib/import_export/category_exporter.rb b/lib/import_export/category_exporter.rb index 4e2a57e8208..d40bd327c49 100644 --- a/lib/import_export/category_exporter.rb +++ b/lib/import_export/category_exporter.rb @@ -48,7 +48,7 @@ module ImportExport self end - GROUP_ATTRS = [ :id, :name, :created_at, :alias_level, :visible, + GROUP_ATTRS = [ :id, :name, :created_at, :mentionable_level, :messageable_level, :visible, :automatic_membership_email_domains, :automatic_membership_retroactive, :primary_group, :title, :grant_trust_level, :incoming_email] diff --git a/spec/components/guardian_spec.rb b/spec/components/guardian_spec.rb index 049fcf4eac4..dcc5f22937d 100644 --- a/spec/components/guardian_spec.rb +++ b/spec/components/guardian_spec.rb @@ -207,7 +207,7 @@ describe Guardian do it "returns true if target is a staff group" do Group::STAFF_GROUPS.each do |name| g = Group[name] - g.alias_level = Group::ALIAS_LEVELS[:everyone] + g.messageable_level = Group::ALIAS_LEVELS[:everyone] expect(Guardian.new(user).can_send_private_message?(g)).to be_truthy end end diff --git a/spec/controllers/posts_controller_spec.rb b/spec/controllers/posts_controller_spec.rb index c27a7c9e0e8..e2c4300146a 100644 --- a/spec/controllers/posts_controller_spec.rb +++ b/spec/controllers/posts_controller_spec.rb @@ -755,7 +755,7 @@ describe PostsController do it "can send a message to a group" do - group = Group.create(name: 'test_group', alias_level: Group::ALIAS_LEVELS[:nobody]) + group = Group.create(name: 'test_group', messageable_level: Group::ALIAS_LEVELS[:nobody]) user1 = Fabricate(:user) group.add(user1) @@ -767,7 +767,7 @@ describe PostsController do expect(response).not_to be_success # allow pm to this group - group.update_columns(alias_level: Group::ALIAS_LEVELS[:everyone]) + group.update_columns(messageable_level: Group::ALIAS_LEVELS[:everyone]) xhr :post, :create, raw: 'I can haz a test', title: 'I loves my test', diff --git a/spec/controllers/topics_controller_spec.rb b/spec/controllers/topics_controller_spec.rb index 0dc914785b1..300ea2024c2 100644 --- a/spec/controllers/topics_controller_spec.rb +++ b/spec/controllers/topics_controller_spec.rb @@ -1026,7 +1026,7 @@ describe TopicsController do end before do - admins.alias_level = Group::ALIAS_LEVELS[:everyone] + admins.messageable_level = Group::ALIAS_LEVELS[:everyone] admins.save! end diff --git a/spec/models/topic_spec.rb b/spec/models/topic_spec.rb index 0b6bc4949d5..c152875acc0 100644 --- a/spec/models/topic_spec.rb +++ b/spec/models/topic_spec.rb @@ -455,7 +455,7 @@ describe Topic do it 'can add admin to allowed groups' do admins = Group[:admins] - admins.update!(alias_level: Group::ALIAS_LEVELS[:everyone]) + admins.update!(messageable_level: Group::ALIAS_LEVELS[:everyone]) expect(topic.invite_group(topic.user, admins)).to eq(true) expect(topic.allowed_groups.include?(admins)).to eq(true) diff --git a/spec/requests/groups_controller_spec.rb b/spec/requests/groups_controller_spec.rb index 35e31d27516..6975052beac 100644 --- a/spec/requests/groups_controller_spec.rb +++ b/spec/requests/groups_controller_spec.rb @@ -69,7 +69,7 @@ describe GroupsController do response_body = JSON.parse(response.body) expect(response_body["mentionable"]).to eq(false) - group.update_attributes!(alias_level: Group::ALIAS_LEVELS[:everyone]) + group.update_attributes!(mentionable_level: Group::ALIAS_LEVELS[:everyone]) get "/groups/test/mentionable.json", name: group.name expect(response).to be_success diff --git a/spec/serializers/group_show_serializer_spec.rb b/spec/serializers/group_show_serializer_spec.rb index b90db108e5c..925cf8efb1b 100644 --- a/spec/serializers/group_show_serializer_spec.rb +++ b/spec/serializers/group_show_serializer_spec.rb @@ -30,7 +30,7 @@ describe GroupShowSerializer do end describe '#mentionable' do - let(:group) { Fabricate(:group, alias_level: Group::ALIAS_LEVELS[:everyone]) } + let(:group) { Fabricate(:group, mentionable_level: Group::ALIAS_LEVELS[:everyone]) } it 'should return the right value' do json = GroupShowSerializer.new(group, scope: Guardian.new).as_json diff --git a/spec/services/post_alerter_spec.rb b/spec/services/post_alerter_spec.rb index 9bbd4b23a6a..ea47e4cf700 100644 --- a/spec/services/post_alerter_spec.rb +++ b/spec/services/post_alerter_spec.rb @@ -270,7 +270,7 @@ describe PostAlerter do context '@group mentions' do - let(:group) { Fabricate(:group, name: 'group', alias_level: Group::ALIAS_LEVELS[:everyone]) } + let(:group) { Fabricate(:group, name: 'group', mentionable_level: Group::ALIAS_LEVELS[:everyone]) } let(:post) { create_post_with_alerts(raw: "Hello @group how are you?") } before { group.add(evil_trout) } @@ -281,7 +281,7 @@ describe PostAlerter do expect(GroupMention.count).to eq(1) - Fabricate(:group, name: 'group-alt', alias_level: Group::ALIAS_LEVELS[:everyone]) + Fabricate(:group, name: 'group-alt', mentionable_level: Group::ALIAS_LEVELS[:everyone]) expect { create_post_with_alerts(raw: "Hello, @group-alt should not trigger a notification?") @@ -289,7 +289,7 @@ describe PostAlerter do expect(GroupMention.count).to eq(2) - group.update_columns(alias_level: Group::ALIAS_LEVELS[:members_mods_and_admins]) + group.update_columns(mentionable_level: Group::ALIAS_LEVELS[:members_mods_and_admins]) expect { create_post_with_alerts(raw: "Hello @group you are not mentionable") }.to change(evil_trout.notifications, :count).by(0)