Merge pull request #5007 from tgxworld/split_public_settings
FEATURE: Add group settngs to allow users to leave a group freely.
This commit is contained in:
commit
e84e310325
|
@ -31,10 +31,10 @@ export default Ember.Controller.extend({
|
||||||
];
|
];
|
||||||
}.property(),
|
}.property(),
|
||||||
|
|
||||||
@computed('model.visibility_level', 'model.public')
|
@computed('model.visibility_level', 'model.public_admission')
|
||||||
disableMembershipRequestSetting(visibility_level, publicGroup) {
|
disableMembershipRequestSetting(visibility_level, publicAdmission) {
|
||||||
visibility_level = parseInt(visibility_level);
|
visibility_level = parseInt(visibility_level);
|
||||||
return (visibility_level !== 0) || publicGroup;
|
return (visibility_level !== 0) || publicAdmission;
|
||||||
},
|
},
|
||||||
|
|
||||||
@computed('model.visibility_level', 'model.allow_membership_requests')
|
@computed('model.visibility_level', 'model.allow_membership_requests')
|
||||||
|
|
|
@ -61,10 +61,19 @@
|
||||||
<div>
|
<div>
|
||||||
<label>
|
<label>
|
||||||
{{input type="checkbox"
|
{{input type="checkbox"
|
||||||
checked=model.public
|
checked=model.public_admission
|
||||||
disabled=disablePublicSetting}}
|
disabled=disablePublicSetting}}
|
||||||
|
|
||||||
{{i18n 'groups.public'}}
|
{{i18n 'groups.public_admission'}}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label>
|
||||||
|
{{input type='checkbox'
|
||||||
|
checked=model.public_exit}}
|
||||||
|
|
||||||
|
{{i18n 'groups.public_exit'}}
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -5,9 +5,14 @@ import DiscourseURL from 'discourse/lib/url';
|
||||||
export default Ember.Component.extend({
|
export default Ember.Component.extend({
|
||||||
loading: false,
|
loading: false,
|
||||||
|
|
||||||
@computed("model.public")
|
@computed("model.public_admission", "userIsGroupUser")
|
||||||
canJoinGroup(publicGroup) {
|
canJoinGroup(publicAdmission, userIsGroupUser) {
|
||||||
return publicGroup;
|
return publicAdmission && !userIsGroupUser;
|
||||||
|
},
|
||||||
|
|
||||||
|
@computed("model.public_exit", "userIsGroupUser")
|
||||||
|
canLeaveGroup(publicExit, userIsGroupUser) {
|
||||||
|
return publicExit && userIsGroupUser;
|
||||||
},
|
},
|
||||||
|
|
||||||
@computed("model.is_group_user", "model.id", "groupUserIds")
|
@computed("model.is_group_user", "model.id", "groupUserIds")
|
||||||
|
|
|
@ -144,7 +144,8 @@ const Group = RestModel.extend({
|
||||||
flair_bg_color: this.get('flairBackgroundHexColor'),
|
flair_bg_color: this.get('flairBackgroundHexColor'),
|
||||||
flair_color: this.get('flairHexColor'),
|
flair_color: this.get('flairHexColor'),
|
||||||
bio_raw: this.get('bio_raw'),
|
bio_raw: this.get('bio_raw'),
|
||||||
public: this.get('public'),
|
public_admission: this.get('public_admission'),
|
||||||
|
public_exit: this.get('public_exit'),
|
||||||
allow_membership_requests: this.get('allow_membership_requests'),
|
allow_membership_requests: this.get('allow_membership_requests'),
|
||||||
full_name: this.get('full_name'),
|
full_name: this.get('full_name'),
|
||||||
default_notification_level: this.get('default_notification_level')
|
default_notification_level: this.get('default_notification_level')
|
||||||
|
|
|
@ -1,17 +1,15 @@
|
||||||
{{#if canJoinGroup}}
|
{{#if canJoinGroup}}
|
||||||
{{#if userIsGroupUser}}
|
{{d-button action="joinGroup"
|
||||||
{{d-button action="leaveGroup"
|
class="group-index-join"
|
||||||
class="btn-danger group-index-leave"
|
icon="user-plus"
|
||||||
icon="user-times"
|
label="groups.join"
|
||||||
label="groups.leave"
|
disabled=updatingMembership}}
|
||||||
disabled=updatingMembership}}
|
{{else if canLeaveGroup}}
|
||||||
{{else}}
|
{{d-button action="leaveGroup"
|
||||||
{{d-button action="joinGroup"
|
class="btn-danger group-index-leave"
|
||||||
class="group-index-join"
|
icon="user-times"
|
||||||
icon="user-plus"
|
label="groups.leave"
|
||||||
label="groups.join"
|
disabled=updatingMembership}}
|
||||||
disabled=updatingMembership}}
|
|
||||||
{{/if}}
|
|
||||||
{{else if model.allow_membership_requests}}
|
{{else if model.allow_membership_requests}}
|
||||||
{{#if userIsGroupUser}}
|
{{#if userIsGroupUser}}
|
||||||
{{#if showMembershipStatus}}
|
{{#if showMembershipStatus}}
|
||||||
|
|
|
@ -21,11 +21,22 @@
|
||||||
<div class="control-group">
|
<div class="control-group">
|
||||||
<label>
|
<label>
|
||||||
{{input type='checkbox'
|
{{input type='checkbox'
|
||||||
checked=model.public
|
checked=model.public_admission
|
||||||
class="group-edit-public"
|
class="group-edit-public-admission"
|
||||||
disabled=model.allow_membership_requests}}
|
disabled=model.allow_membership_requests}}
|
||||||
|
|
||||||
{{i18n 'groups.public'}}
|
{{i18n 'groups.public_admission'}}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="control-group">
|
||||||
|
<label>
|
||||||
|
{{input type='checkbox'
|
||||||
|
checked=model.public_exit
|
||||||
|
class="group-edit-public-exit"
|
||||||
|
disabled=model.allow_membership_requests}}
|
||||||
|
|
||||||
|
{{i18n 'groups.public_exit'}}
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -34,7 +45,7 @@
|
||||||
{{input type='checkbox'
|
{{input type='checkbox'
|
||||||
checked=model.allow_membership_requests
|
checked=model.allow_membership_requests
|
||||||
class="group-edit-allow-membership-requests"
|
class="group-edit-allow-membership-requests"
|
||||||
disabled=model.public}}
|
disabled=model.public_admission}}
|
||||||
|
|
||||||
{{i18n 'groups.allow_membership_requests'}}
|
{{i18n 'groups.allow_membership_requests'}}
|
||||||
</label>
|
</label>
|
||||||
|
|
|
@ -67,7 +67,13 @@ class Admin::GroupsController < Admin::AdminController
|
||||||
group.flair_url = group_params[:flair_url].presence
|
group.flair_url = group_params[:flair_url].presence
|
||||||
group.flair_bg_color = group_params[:flair_bg_color].presence
|
group.flair_bg_color = group_params[:flair_bg_color].presence
|
||||||
group.flair_color = group_params[:flair_color].presence
|
group.flair_color = group_params[:flair_color].presence
|
||||||
group.public = group_params[:public] if group_params[:public]
|
|
||||||
|
%i{public_admission public_exit}.each do |key|
|
||||||
|
if group_params[key]
|
||||||
|
group.public_send("#{key}=", group_params[key])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
group.bio_raw = group_params[:bio_raw] if group_params[:bio_raw]
|
group.bio_raw = group_params[:bio_raw] if group_params[:bio_raw]
|
||||||
group.full_name = group_params[:full_name] if group_params[:full_name]
|
group.full_name = group_params[:full_name] if group_params[:full_name]
|
||||||
|
|
||||||
|
@ -169,11 +175,26 @@ class Admin::GroupsController < Admin::AdminController
|
||||||
|
|
||||||
def group_params
|
def group_params
|
||||||
params.require(:group).permit(
|
params.require(:group).permit(
|
||||||
:name, :alias_level, :visibility_level, :automatic_membership_email_domains,
|
:name,
|
||||||
:automatic_membership_retroactive, :title, :primary_group,
|
:alias_level,
|
||||||
:grant_trust_level, :incoming_email, :flair_url, :flair_bg_color,
|
:visibility_level,
|
||||||
:flair_color, :bio_raw, :public, :allow_membership_requests, :full_name,
|
:automatic_membership_email_domains,
|
||||||
:default_notification_level, :usernames, :owner_usernames
|
:automatic_membership_retroactive,
|
||||||
|
:title,
|
||||||
|
:primary_group,
|
||||||
|
:grant_trust_level,
|
||||||
|
:incoming_email,
|
||||||
|
:flair_url,
|
||||||
|
:flair_bg_color,
|
||||||
|
:flair_color,
|
||||||
|
:bio_raw,
|
||||||
|
:public_admission,
|
||||||
|
:public_exit,
|
||||||
|
:allow_membership_requests,
|
||||||
|
:full_name,
|
||||||
|
:default_notification_level,
|
||||||
|
:usernames,
|
||||||
|
:owner_usernames
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -146,7 +146,7 @@ class GroupsController < ApplicationController
|
||||||
|
|
||||||
def add_members
|
def add_members
|
||||||
group = Group.find(params[:id])
|
group = Group.find(params[:id])
|
||||||
group.public ? ensure_logged_in : guardian.ensure_can_edit!(group)
|
group.public_admission ? ensure_logged_in : guardian.ensure_can_edit!(group)
|
||||||
|
|
||||||
users =
|
users =
|
||||||
if params[:usernames].present?
|
if params[:usernames].present?
|
||||||
|
@ -163,7 +163,7 @@ class GroupsController < ApplicationController
|
||||||
|
|
||||||
raise Discourse::NotFound if users.blank?
|
raise Discourse::NotFound if users.blank?
|
||||||
|
|
||||||
if group.public
|
if group.public_admission
|
||||||
if !guardian.can_log_group_changes?(group) && current_user != users.first
|
if !guardian.can_log_group_changes?(group) && current_user != users.first
|
||||||
raise Discourse::InvalidAccess
|
raise Discourse::InvalidAccess
|
||||||
end
|
end
|
||||||
|
@ -201,7 +201,7 @@ class GroupsController < ApplicationController
|
||||||
|
|
||||||
def remove_member
|
def remove_member
|
||||||
group = Group.find(params[:id])
|
group = Group.find(params[:id])
|
||||||
group.public ? ensure_logged_in : guardian.ensure_can_edit!(group)
|
group.public_exit ? ensure_logged_in : guardian.ensure_can_edit!(group)
|
||||||
|
|
||||||
user =
|
user =
|
||||||
if params[:user_id].present?
|
if params[:user_id].present?
|
||||||
|
@ -216,7 +216,7 @@ class GroupsController < ApplicationController
|
||||||
|
|
||||||
raise Discourse::NotFound unless user
|
raise Discourse::NotFound unless user
|
||||||
|
|
||||||
if group.public
|
if group.public_exit
|
||||||
if !guardian.can_log_group_changes?(group) && current_user != user
|
if !guardian.can_log_group_changes?(group) && current_user != user
|
||||||
raise Discourse::InvalidAccess
|
raise Discourse::InvalidAccess
|
||||||
end
|
end
|
||||||
|
@ -322,7 +322,8 @@ class GroupsController < ApplicationController
|
||||||
:flair_color,
|
:flair_color,
|
||||||
:bio_raw,
|
:bio_raw,
|
||||||
:full_name,
|
:full_name,
|
||||||
:public,
|
:public_admission,
|
||||||
|
:public_exit,
|
||||||
:allow_membership_requests
|
:allow_membership_requests
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
|
@ -619,11 +619,12 @@ end
|
||||||
# flair_color :string
|
# flair_color :string
|
||||||
# bio_raw :text
|
# bio_raw :text
|
||||||
# bio_cooked :text
|
# bio_cooked :text
|
||||||
# public :boolean default(FALSE), not null
|
# public_admission :boolean default(FALSE), not null
|
||||||
# allow_membership_requests :boolean default(FALSE), not null
|
# allow_membership_requests :boolean default(FALSE), not null
|
||||||
# full_name :string
|
# full_name :string
|
||||||
# default_notification_level :integer default(3), not null
|
# default_notification_level :integer default(3), not null
|
||||||
# visibility_level :integer default(0), not null
|
# visibility_level :integer default(0), not null
|
||||||
|
# public_exit :boolean default(FALSE), not null
|
||||||
#
|
#
|
||||||
# Indexes
|
# Indexes
|
||||||
#
|
#
|
||||||
|
|
|
@ -51,3 +51,18 @@ class WatchedWord < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# == Schema Information
|
||||||
|
#
|
||||||
|
# Table name: watched_words
|
||||||
|
#
|
||||||
|
# id :integer not null, primary key
|
||||||
|
# word :string not null
|
||||||
|
# action :integer not null
|
||||||
|
# created_at :datetime
|
||||||
|
# updated_at :datetime
|
||||||
|
#
|
||||||
|
# Indexes
|
||||||
|
#
|
||||||
|
# index_watched_words_on_action_and_word (action,word) UNIQUE
|
||||||
|
#
|
||||||
|
|
|
@ -18,7 +18,8 @@ class BasicGroupSerializer < ApplicationSerializer
|
||||||
:flair_color,
|
:flair_color,
|
||||||
:bio_raw,
|
:bio_raw,
|
||||||
:bio_cooked,
|
:bio_cooked,
|
||||||
:public,
|
:public_admission,
|
||||||
|
:public_exit,
|
||||||
:allow_membership_requests,
|
:allow_membership_requests,
|
||||||
:full_name,
|
:full_name,
|
||||||
:default_notification_level
|
:default_notification_level
|
||||||
|
|
|
@ -24,7 +24,7 @@ class GroupActionLogger
|
||||||
end
|
end
|
||||||
|
|
||||||
def log_add_user_to_group(target_user)
|
def log_add_user_to_group(target_user)
|
||||||
@group.public || can_edit?
|
(target_user == @acting_user && @group.public_admission) || can_edit?
|
||||||
|
|
||||||
GroupHistory.create!(default_params.merge(
|
GroupHistory.create!(default_params.merge(
|
||||||
action: GroupHistory.actions[:add_user_to_group],
|
action: GroupHistory.actions[:add_user_to_group],
|
||||||
|
@ -33,7 +33,7 @@ class GroupActionLogger
|
||||||
end
|
end
|
||||||
|
|
||||||
def log_remove_user_from_group(target_user)
|
def log_remove_user_from_group(target_user)
|
||||||
@group.public || can_edit?
|
(target_user == @acting_user && @group.public_exit) || can_edit?
|
||||||
|
|
||||||
GroupHistory.create!(default_params.merge(
|
GroupHistory.create!(default_params.merge(
|
||||||
action: GroupHistory.actions[:remove_user_from_group],
|
action: GroupHistory.actions[:remove_user_from_group],
|
||||||
|
|
|
@ -409,7 +409,8 @@ en:
|
||||||
add_members: "Add Members"
|
add_members: "Add Members"
|
||||||
delete_member_confirm: "Remove '%{username}' from the '%{group}' group?"
|
delete_member_confirm: "Remove '%{username}' from the '%{group}' group?"
|
||||||
name_placeholder: "Group name, no spaces, same as username rule"
|
name_placeholder: "Group name, no spaces, same as username rule"
|
||||||
public: "Allow users to join/leave the group freely (Requires publicly visible group)"
|
public_admission: "Allow users to join the group freely (Requires publicly visible group)"
|
||||||
|
public_exit: "Allow users to leave the group freely"
|
||||||
empty:
|
empty:
|
||||||
posts: "There are no posts by members of this group."
|
posts: "There are no posts by members of this group."
|
||||||
members: "There are no members in this group."
|
members: "There are no members in this group."
|
||||||
|
|
|
@ -7,8 +7,8 @@ Group.where(name: 'everyone').update_all(visibility_level: Group.visibility_leve
|
||||||
|
|
||||||
ColumnDropper.drop(
|
ColumnDropper.drop(
|
||||||
table: 'groups',
|
table: 'groups',
|
||||||
after_migration: 'AddVisibleBackToGroups',
|
after_migration: 'RemovePublicFromGroups',
|
||||||
columns: %w[visible],
|
columns: %w[visible public],
|
||||||
on_drop: ->() {
|
on_drop: ->() {
|
||||||
STDERR.puts 'Removing superflous visible group column!'
|
STDERR.puts 'Removing superflous visible group column!'
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
class SplitPublicInGroups < ActiveRecord::Migration
|
||||||
|
def up
|
||||||
|
add_column :groups, :public_exit, :boolean, default: false, null: false
|
||||||
|
add_column :groups, :public_admission, :boolean, default: false, null: false
|
||||||
|
|
||||||
|
ActiveRecord::Base.exec_sql <<~SQL
|
||||||
|
UPDATE groups
|
||||||
|
SET public_exit = true, public_admission = true
|
||||||
|
WHERE public = true
|
||||||
|
SQL
|
||||||
|
end
|
||||||
|
|
||||||
|
def down
|
||||||
|
remove_column :groups, :public_exit
|
||||||
|
remove_column :groups, :public_admission
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,9 @@
|
||||||
|
class RemovePublicFromGroups < ActiveRecord::Migration
|
||||||
|
def up
|
||||||
|
# Defer dropping of the columns until the new application code has been deployed.
|
||||||
|
end
|
||||||
|
|
||||||
|
def down
|
||||||
|
raise ActiveRecord::IrreversibleMigration
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,3 +1,8 @@
|
||||||
Fabricator(:group) do
|
Fabricator(:group) do
|
||||||
name { sequence(:name) { |n| "my_group_#{n}" } }
|
name { sequence(:name) { |n| "my_group_#{n}" } }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Fabricator(:public_group, from: :group) do
|
||||||
|
public_admission true
|
||||||
|
public_exit true
|
||||||
|
end
|
||||||
|
|
|
@ -80,7 +80,14 @@ describe "Groups" do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "group can be updated" do
|
describe "group can be updated" do
|
||||||
let(:group) { Fabricate(:group, name: 'test', users: [user], public: false) }
|
let(:group) do
|
||||||
|
Fabricate(:group,
|
||||||
|
name: 'test',
|
||||||
|
users: [user],
|
||||||
|
public_admission: false,
|
||||||
|
public_exit: false
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
before do
|
before do
|
||||||
sign_in(user)
|
sign_in(user)
|
||||||
|
@ -102,10 +109,11 @@ describe "Groups" do
|
||||||
flair_url: 'fa-adjust',
|
flair_url: 'fa-adjust',
|
||||||
bio_raw: 'testing',
|
bio_raw: 'testing',
|
||||||
full_name: 'awesome team',
|
full_name: 'awesome team',
|
||||||
public: true,
|
public_admission: true,
|
||||||
|
public_exit: true,
|
||||||
allow_membership_requests: true
|
allow_membership_requests: true
|
||||||
}
|
}
|
||||||
end.to change { GroupHistory.count }.by(7)
|
end.to change { GroupHistory.count }.by(8)
|
||||||
|
|
||||||
expect(response).to be_success
|
expect(response).to be_success
|
||||||
|
|
||||||
|
@ -116,7 +124,8 @@ describe "Groups" do
|
||||||
expect(group.flair_url).to eq('fa-adjust')
|
expect(group.flair_url).to eq('fa-adjust')
|
||||||
expect(group.bio_raw).to eq('testing')
|
expect(group.bio_raw).to eq('testing')
|
||||||
expect(group.full_name).to eq('awesome team')
|
expect(group.full_name).to eq('awesome team')
|
||||||
expect(group.public).to eq(true)
|
expect(group.public_admission).to eq(true)
|
||||||
|
expect(group.public_exit).to eq(true)
|
||||||
expect(group.allow_membership_requests).to eq(true)
|
expect(group.allow_membership_requests).to eq(true)
|
||||||
expect(GroupHistory.last.subject).to eq('allow_membership_requests')
|
expect(GroupHistory.last.subject).to eq('allow_membership_requests')
|
||||||
end
|
end
|
||||||
|
@ -225,7 +234,10 @@ describe "Groups" do
|
||||||
|
|
||||||
context 'public group' do
|
context 'public group' do
|
||||||
it 'should be fobidden' do
|
it 'should be fobidden' do
|
||||||
group.update_attributes!(public: true)
|
group.update_attributes!(
|
||||||
|
public_admission: true,
|
||||||
|
public_exit: true
|
||||||
|
)
|
||||||
|
|
||||||
expect { xhr :put, "/groups/#{group.id}/members", usernames: "bob" }
|
expect { xhr :put, "/groups/#{group.id}/members", usernames: "bob" }
|
||||||
.to raise_error(Discourse::NotLoggedIn)
|
.to raise_error(Discourse::NotLoggedIn)
|
||||||
|
@ -341,7 +353,10 @@ describe "Groups" do
|
||||||
let(:other_user) { Fabricate(:user) }
|
let(:other_user) { Fabricate(:user) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
group.update!(public: true)
|
group.update!(
|
||||||
|
public_admission: true,
|
||||||
|
public_exit: true
|
||||||
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'admin' do
|
context 'admin' do
|
||||||
|
@ -424,11 +439,7 @@ describe "Groups" do
|
||||||
|
|
||||||
context 'public group' do
|
context 'public group' do
|
||||||
let(:other_user) { Fabricate(:user) }
|
let(:other_user) { Fabricate(:user) }
|
||||||
let(:group) { Fabricate(:group, users: [other_user]) }
|
let(:group) { Fabricate(:public_group, users: [other_user]) }
|
||||||
|
|
||||||
before do
|
|
||||||
group.update!(public: true)
|
|
||||||
end
|
|
||||||
|
|
||||||
context "admin" do
|
context "admin" do
|
||||||
it "removes by username" do
|
it "removes by username" do
|
||||||
|
@ -484,7 +495,12 @@ describe "Groups" do
|
||||||
context 'public group' do
|
context 'public group' do
|
||||||
before do
|
before do
|
||||||
group.add_owner(user)
|
group.add_owner(user)
|
||||||
group.update_attributes!(public: true)
|
|
||||||
|
group.update_attributes!(
|
||||||
|
public_admission: true,
|
||||||
|
public_exit: true
|
||||||
|
)
|
||||||
|
|
||||||
GroupActionLogger.new(user, group).log_change_group_settings
|
GroupActionLogger.new(user, group).log_change_group_settings
|
||||||
sign_in(user)
|
sign_in(user)
|
||||||
end
|
end
|
||||||
|
@ -497,7 +513,7 @@ describe "Groups" do
|
||||||
result = JSON.parse(response.body)["logs"].first
|
result = JSON.parse(response.body)["logs"].first
|
||||||
|
|
||||||
expect(result["action"]).to eq(GroupHistory.actions[1].to_s)
|
expect(result["action"]).to eq(GroupHistory.actions[1].to_s)
|
||||||
expect(result["subject"]).to eq('public')
|
expect(result["subject"]).to eq('public_exit')
|
||||||
expect(result["prev_value"]).to eq('f')
|
expect(result["prev_value"]).to eq('f')
|
||||||
expect(result["new_value"]).to eq('t')
|
expect(result["new_value"]).to eq('t')
|
||||||
end
|
end
|
||||||
|
|
|
@ -531,7 +531,7 @@ describe Group do
|
||||||
let(:category) { Fabricate(:category) }
|
let(:category) { Fabricate(:category) }
|
||||||
|
|
||||||
it "should publish the group's categories to the client" do
|
it "should publish the group's categories to the client" do
|
||||||
group.update!(public: true, categories: [category])
|
group.update!(public_admission: true, categories: [category])
|
||||||
|
|
||||||
message = MessageBus.track_publish { group.add(user) }.first
|
message = MessageBus.track_publish { group.add(user) }.first
|
||||||
|
|
||||||
|
|
|
@ -36,32 +36,90 @@ RSpec.describe GroupActionLogger do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#log_add_user_to_group' do
|
describe '#log_add_user_to_group' do
|
||||||
it 'should create the right record' do
|
describe 'as a group owner' do
|
||||||
subject.log_add_user_to_group(user)
|
it 'should create the right record' do
|
||||||
|
subject.log_add_user_to_group(user)
|
||||||
|
|
||||||
group_history = GroupHistory.last
|
group_history = GroupHistory.last
|
||||||
|
|
||||||
expect(group_history.action).to eq(GroupHistory.actions[:add_user_to_group])
|
expect(group_history.action).to eq(GroupHistory.actions[:add_user_to_group])
|
||||||
expect(group_history.acting_user).to eq(group_owner)
|
expect(group_history.acting_user).to eq(group_owner)
|
||||||
expect(group_history.target_user).to eq(user)
|
expect(group_history.target_user).to eq(user)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'as a normal user' do
|
||||||
|
subject { described_class.new(user, group) }
|
||||||
|
|
||||||
|
describe 'user cannot freely exit group' do
|
||||||
|
it 'should not be allowed to log the action' do
|
||||||
|
expect { subject.log_add_user_to_group(user) }
|
||||||
|
.to raise_error(Discourse::InvalidParameters)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'user can freely exit group' do
|
||||||
|
before do
|
||||||
|
group.update!(public_admission: true)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'should create the right record' do
|
||||||
|
subject.log_add_user_to_group(user)
|
||||||
|
|
||||||
|
group_history = GroupHistory.last
|
||||||
|
|
||||||
|
expect(group_history.action).to eq(GroupHistory.actions[:add_user_to_group])
|
||||||
|
expect(group_history.acting_user).to eq(user)
|
||||||
|
expect(group_history.target_user).to eq(user)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#log_remove_user_from_group' do
|
describe '#log_remove_user_from_group' do
|
||||||
it 'should create the right record' do
|
describe 'as group owner' do
|
||||||
subject.log_remove_user_from_group(user)
|
it 'should create the right record' do
|
||||||
|
subject.log_remove_user_from_group(user)
|
||||||
|
|
||||||
group_history = GroupHistory.last
|
group_history = GroupHistory.last
|
||||||
|
|
||||||
expect(group_history.action).to eq(GroupHistory.actions[:remove_user_from_group])
|
expect(group_history.action).to eq(GroupHistory.actions[:remove_user_from_group])
|
||||||
expect(group_history.acting_user).to eq(group_owner)
|
expect(group_history.acting_user).to eq(group_owner)
|
||||||
expect(group_history.target_user).to eq(user)
|
expect(group_history.target_user).to eq(user)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'as a normal user' do
|
||||||
|
subject { described_class.new(user, group) }
|
||||||
|
|
||||||
|
describe 'user cannot freely exit group' do
|
||||||
|
it 'should not be allowed to log the action' do
|
||||||
|
expect { subject.log_remove_user_from_group(user) }
|
||||||
|
.to raise_error(Discourse::InvalidParameters)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'user can freely exit group' do
|
||||||
|
before do
|
||||||
|
group.update!(public_exit: true)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'should create the right record' do
|
||||||
|
subject.log_remove_user_from_group(user)
|
||||||
|
|
||||||
|
group_history = GroupHistory.last
|
||||||
|
|
||||||
|
expect(group_history.action).to eq(GroupHistory.actions[:remove_user_from_group])
|
||||||
|
expect(group_history.acting_user).to eq(user)
|
||||||
|
expect(group_history.target_user).to eq(user)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#log_change_group_settings' do
|
describe '#log_change_group_settings' do
|
||||||
it 'should create the right record' do
|
it 'should create the right record' do
|
||||||
group.update_attributes!(public: true, created_at: Time.zone.now)
|
group.update_attributes!(public_admission: true, created_at: Time.zone.now)
|
||||||
|
|
||||||
expect { subject.log_change_group_settings }.to change { GroupHistory.count }.by(1)
|
expect { subject.log_change_group_settings }.to change { GroupHistory.count }.by(1)
|
||||||
|
|
||||||
|
@ -69,7 +127,7 @@ RSpec.describe GroupActionLogger do
|
||||||
|
|
||||||
expect(group_history.action).to eq(GroupHistory.actions[:change_group_setting])
|
expect(group_history.action).to eq(GroupHistory.actions[:change_group_setting])
|
||||||
expect(group_history.acting_user).to eq(group_owner)
|
expect(group_history.acting_user).to eq(group_owner)
|
||||||
expect(group_history.subject).to eq('public')
|
expect(group_history.subject).to eq('public_admission')
|
||||||
expect(group_history.prev_value).to eq('f')
|
expect(group_history.prev_value).to eq('f')
|
||||||
expect(group_history.new_value).to eq('t')
|
expect(group_history.new_value).to eq('t')
|
||||||
end
|
end
|
||||||
|
|
|
@ -12,7 +12,17 @@ QUnit.test("Editing group", assert => {
|
||||||
assert.ok(find('.group-flair-inputs').length === 1, 'it should display avatar flair inputs');
|
assert.ok(find('.group-flair-inputs').length === 1, 'it should display avatar flair inputs');
|
||||||
assert.ok(find('.group-edit-bio').length === 1, 'it should display group bio input');
|
assert.ok(find('.group-edit-bio').length === 1, 'it should display group bio input');
|
||||||
assert.ok(find('.group-edit-full-name').length === 1, 'it should display group full name input');
|
assert.ok(find('.group-edit-full-name').length === 1, 'it should display group full name input');
|
||||||
assert.ok(find('.group-edit-public').length === 1, 'it should display group public input');
|
|
||||||
|
assert.ok(
|
||||||
|
find('.group-edit-public-admission').length === 1,
|
||||||
|
'it should display group public admission input'
|
||||||
|
);
|
||||||
|
|
||||||
|
assert.ok(
|
||||||
|
find('.group-edit-public-exit').length === 1,
|
||||||
|
'it should display group public exit input'
|
||||||
|
);
|
||||||
|
|
||||||
assert.ok(find('.group-edit-allow-membership-requests').length === 1, 'it should display group allow_membership_requets input');
|
assert.ok(find('.group-edit-allow-membership-requests').length === 1, 'it should display group allow_membership_requets input');
|
||||||
assert.ok(find('.group-members-input .item').length === 7, 'it should display group members');
|
assert.ok(find('.group-members-input .item').length === 7, 'it should display group members');
|
||||||
assert.ok(find('.group-members-input-selector').length === 1, 'it should display input to add group members');
|
assert.ok(find('.group-members-input-selector').length === 1, 'it should display input to add group members');
|
||||||
|
@ -20,14 +30,20 @@ QUnit.test("Editing group", assert => {
|
||||||
});
|
});
|
||||||
|
|
||||||
andThen(() => {
|
andThen(() => {
|
||||||
assert.ok(find('.group-edit-allow-membership-requests[disabled]').length === 1, 'it should disable group allow_membership_request input');
|
assert.ok(
|
||||||
|
find('.group-edit-allow-membership-requests[disabled]').length === 1,
|
||||||
|
'it should disable group allow_membership_request input'
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
click('.group-edit-public');
|
click('.group-edit-public-admission');
|
||||||
click('.group-edit-allow-membership-requests');
|
click('.group-edit-allow-membership-requests');
|
||||||
|
|
||||||
andThen(() => {
|
andThen(() => {
|
||||||
assert.ok(find('.group-edit-public[disabled]').length === 1, 'it should disable group public input');
|
assert.ok(
|
||||||
|
find('.group-edit-public-admission[disabled]').length === 1,
|
||||||
|
'it should disable group public admission input'
|
||||||
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -37,4 +53,4 @@ QUnit.test("Editing group as an anonymous user", assert => {
|
||||||
andThen(() => {
|
andThen(() => {
|
||||||
assert.ok(count('.group-members tr') > 0, "it should redirect to members page for an anonymous user");
|
assert.ok(count('.group-members tr') > 0, "it should redirect to members page for an anonymous user");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -2,18 +2,52 @@ moduleFor('component:group-membership-button');
|
||||||
|
|
||||||
QUnit.test('canJoinGroup', function(assert) {
|
QUnit.test('canJoinGroup', function(assert) {
|
||||||
this.subject().setProperties({
|
this.subject().setProperties({
|
||||||
model: { public: false }
|
model: { public_admission: false, is_group_user: true }
|
||||||
});
|
});
|
||||||
|
|
||||||
assert.equal(this.subject().get("canJoinGroup"), false, "non public group cannot be joined");
|
assert.equal(
|
||||||
|
this.subject().get("canJoinGroup"), false,
|
||||||
|
"can't join group if public_admission is false"
|
||||||
|
);
|
||||||
|
|
||||||
this.subject().set("model.public", true);
|
this.subject().set("model.public_admission", true);
|
||||||
|
|
||||||
assert.equal(this.subject().get("canJoinGroup"), true, "public group can be joined");
|
assert.equal(
|
||||||
|
this.subject().get("canJoinGroup"), false,
|
||||||
|
"can't join group if user is already in the group"
|
||||||
|
);
|
||||||
|
|
||||||
this.subject().setProperties({ currentUser: null, model: { public: true } });
|
this.subject().set("model.is_group_user", false);
|
||||||
|
|
||||||
assert.equal(this.subject().get("canJoinGroup"), true, "can't join group when not logged in");
|
assert.equal(
|
||||||
|
this.subject().get("canJoinGroup"), true,
|
||||||
|
"allowed to join group"
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('canLeaveGroup', function(assert) {
|
||||||
|
this.subject().setProperties({
|
||||||
|
model: { public_exit: false, is_group_user: false }
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.equal(
|
||||||
|
this.subject().get("canLeaveGroup"), false,
|
||||||
|
"can't leave group if public_exit is false"
|
||||||
|
);
|
||||||
|
|
||||||
|
this.subject().set("model.public_exit", true);
|
||||||
|
|
||||||
|
assert.equal(
|
||||||
|
this.subject().get("canLeaveGroup"), false,
|
||||||
|
"can't leave group if user is not in the group"
|
||||||
|
);
|
||||||
|
|
||||||
|
this.subject().set("model.is_group_user", true);
|
||||||
|
|
||||||
|
assert.equal(
|
||||||
|
this.subject().get("canLeaveGroup"), true,
|
||||||
|
"allowed to leave group"
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
QUnit.test('userIsGroupUser', function(assert) {
|
QUnit.test('userIsGroupUser', function(assert) {
|
||||||
|
|
|
@ -20,16 +20,22 @@ QUnit.test("disablePublicSetting", function(assert) {
|
||||||
|
|
||||||
QUnit.test("disableMembershipRequestSetting", function(assert) {
|
QUnit.test("disableMembershipRequestSetting", function(assert) {
|
||||||
this.subject().setProperties({
|
this.subject().setProperties({
|
||||||
model: { visibility_level: 1, public: false, canEveryoneMention: true }
|
model: { visibility_level: 1, public_admission: false, canEveryoneMention: true }
|
||||||
});
|
});
|
||||||
|
|
||||||
assert.equal(this.subject().get("disableMembershipRequestSetting"), true, "it should disable setting");
|
assert.equal(this.subject().get("disableMembershipRequestSetting"), true, "it should disable setting");
|
||||||
|
|
||||||
this.subject().set("model.visibility_level", 0);
|
this.subject().set("model.visibility_level", 0);
|
||||||
|
|
||||||
assert.equal(this.subject().get("disableMembershipRequestSetting"), false, "it should enable setting");
|
assert.equal(
|
||||||
|
this.subject().get("disableMembershipRequestSetting"), false,
|
||||||
|
"it should enable setting"
|
||||||
|
);
|
||||||
|
|
||||||
this.subject().set("model.public", true);
|
this.subject().set("model.public_admission", true);
|
||||||
|
|
||||||
assert.equal(this.subject().get("disableMembershipRequestSetting"), true, "it should disalbe setting");
|
assert.equal(
|
||||||
|
this.subject().get("disableMembershipRequestSetting"), true,
|
||||||
|
"it should disable setting"
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
|
@ -8,7 +8,8 @@ export default {
|
||||||
"user_count":8,
|
"user_count":8,
|
||||||
"alias_level":99,
|
"alias_level":99,
|
||||||
"visible":true,
|
"visible":true,
|
||||||
"public":true,
|
"public_admission":true,
|
||||||
|
"public_exit":true,
|
||||||
"flair_url": 'fa-adjust',
|
"flair_url": 'fa-adjust',
|
||||||
"is_group_owner":true,
|
"is_group_owner":true,
|
||||||
"mentionable":true
|
"mentionable":true
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
export default {
|
export default {
|
||||||
"/groups.json": {"groups":[{"id":41,"automatic":false,"name":"discourse","user_count":0,"alias_level":0,"visible":true,"automatic_membership_email_domains":"","automatic_membership_retroactive":false,"primary_group":false,"title":null,"grant_trust_level":null,"has_messages":false,"flair_url":null,"flair_bg_color":null,"flair_color":null,"bio_raw":"","bio_cooked":null,"public":true,"allow_membership_requests":false,"full_name":"Awesome Team"},{"id":42,"automatic":false,"name":"Macdonald","user_count":0,"alias_level":99,"visible":true,"automatic_membership_email_domains":"","automatic_membership_retroactive":false,"primary_group":false,"title":null,"grant_trust_level":null,"has_messages":false,"flair_url":null,"flair_bg_color":null,"flair_color":null,"bio_raw":null,"bio_cooked":null,"public":false,"allow_membership_requests":true,"full_name":null}],"extras":{"group_user_ids":[]},"total_rows_groups":2,"load_more_groups":"/groups?page=1"}
|
"/groups.json": {"groups":[{"id":41,"automatic":false,"name":"discourse","user_count":0,"alias_level":0,"visible":true,"automatic_membership_email_domains":"","automatic_membership_retroactive":false,"primary_group":false,"title":null,"grant_trust_level":null,"has_messages":false,"flair_url":null,"flair_bg_color":null,"flair_color":null,"bio_raw":"","bio_cooked":null,"public_admission":true,"allow_membership_requests":false,"full_name":"Awesome Team"},{"id":42,"automatic":false,"name":"Macdonald","user_count":0,"alias_level":99,"visible":true,"automatic_membership_email_domains":"","automatic_membership_retroactive":false,"primary_group":false,"title":null,"grant_trust_level":null,"has_messages":false,"flair_url":null,"flair_bg_color":null,"flair_color":null,"bio_raw":null,"bio_cooked":null,"public_admission":false,"allow_membership_requests":true,"full_name":null}],"extras":{"group_user_ids":[]},"total_rows_groups":2,"load_more_groups":"/groups?page=1"}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue