From aa1fc0130754d54696f9fa44b953be9b5f1c763d Mon Sep 17 00:00:00 2001 From: jbrw Date: Wed, 19 Aug 2020 10:41:40 -0400 Subject: [PATCH] FEATURE - Moderators can create and manage groups (#10432) Enabling the moderators_manage_categories_and_groups site setting will allow moderator users to create/manage groups. * show New Group form to moderators * Allow moderators to update groups and read logs, where appropriate * Rename site setting from create -> manage * improved tests * Migration should rename old log entries * Log group changes, even if those changes mean you can no longer see the group * Slight reshuffle * RouteTo /g if they no longer have permissions to view group --- .../components/group-manage-save-button.js | 7 +- .../groups-form-interaction-fields.js | 9 ++ .../discourse/app/controllers/group.js | 2 +- .../javascripts/discourse/app/models/user.js | 2 +- .../discourse/app/routes/group-manage.js | 2 +- .../discourse/app/routes/groups-new.js | 2 +- .../groups-form-interaction-fields.hbs | 4 +- .../groups-form-membership-fields.hbs | 2 +- .../components/groups-form-profile-fields.hbs | 4 +- .../discourse/app/templates/groups/index.hbs | 2 +- app/controllers/admin/groups_controller.rb | 2 + app/controllers/groups_controller.rb | 16 +++- app/serializers/basic_group_serializer.rb | 9 ++ app/serializers/current_user_serializer.rb | 9 ++ app/services/group_action_logger.rb | 5 +- config/locales/server.en.yml | 2 +- config/routes.rb | 5 +- config/site_settings.yml | 2 +- ...me_moderators_create_categories_setting.rb | 13 +++ lib/guardian/category_guardian.rb | 4 +- lib/guardian/group_guardian.rb | 21 ++++- lib/site_settings/deprecated_settings.rb | 3 +- spec/requests/groups_controller_spec.rb | 93 +++++++++++++++++++ .../group-manage-interaction-test.js | 17 +++- .../group-manage-membership-test.js | 4 +- .../acceptance/group-manage-profile-test.js | 6 +- test/javascripts/fixtures/group-fixtures.js | 24 ++++- test/javascripts/fixtures/session-fixtures.js | 1 + test/javascripts/models/user-test.js | 1 + 29 files changed, 241 insertions(+), 32 deletions(-) create mode 100644 db/migrate/20200810220841_rename_moderators_create_categories_setting.rb diff --git a/app/assets/javascripts/discourse/app/components/group-manage-save-button.js b/app/assets/javascripts/discourse/app/components/group-manage-save-button.js index 91a6adbed76..9e385d6c28d 100644 --- a/app/assets/javascripts/discourse/app/components/group-manage-save-button.js +++ b/app/assets/javascripts/discourse/app/components/group-manage-save-button.js @@ -3,6 +3,7 @@ import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; import { popupAjaxError } from "discourse/lib/ajax-error"; import { popupAutomaticMembershipAlert } from "discourse/controllers/groups-new"; +import DiscourseURL from "discourse/lib/url"; export default Component.extend({ saving: null, @@ -24,7 +25,11 @@ export default Component.extend({ return group .save() - .then(() => { + .then(data => { + if (data.route_to) { + DiscourseURL.routeTo(data.route_to); + } + this.set("saved", true); }) .catch(popupAjaxError) diff --git a/app/assets/javascripts/discourse/app/components/groups-form-interaction-fields.js b/app/assets/javascripts/discourse/app/components/groups-form-interaction-fields.js index d241176c384..bd5689a93e5 100644 --- a/app/assets/javascripts/discourse/app/components/groups-form-interaction-fields.js +++ b/app/assets/javascripts/discourse/app/components/groups-form-interaction-fields.js @@ -70,5 +70,14 @@ export default Component.extend({ ) showEmailSettings(emailIn, automatic, isAdmin) { return emailIn && isAdmin && !automatic; + }, + + @discourseComputed( + "model.isCreated", + "model.can_admin_group", + "currentUser.can_create_group" + ) + canAdminGroup(isCreated, canAdmin, canCreate) { + return (!isCreated && canCreate) || (isCreated && canAdmin); } }); diff --git a/app/assets/javascripts/discourse/app/controllers/group.js b/app/assets/javascripts/discourse/app/controllers/group.js index e4b62a0b953..7073fcf1c7a 100644 --- a/app/assets/javascripts/discourse/app/controllers/group.js +++ b/app/assets/javascripts/discourse/app/controllers/group.js @@ -128,7 +128,7 @@ export default Controller.extend({ return ( this.currentUser && (this.currentUser.canManageGroup(model) || - (this.currentUser.admin && automatic)) + (model.can_admin_group && automatic)) ); }, diff --git a/app/assets/javascripts/discourse/app/models/user.js b/app/assets/javascripts/discourse/app/models/user.js index a30d248e3c5..2267727bd58 100644 --- a/app/assets/javascripts/discourse/app/models/user.js +++ b/app/assets/javascripts/discourse/app/models/user.js @@ -833,7 +833,7 @@ const User = RestModel.extend({ canManageGroup(group) { return group.get("automatic") ? false - : this.admin || group.get("is_group_owner"); + : group.get("can_admin_group") || group.get("is_group_owner"); }, @discourseComputed("groups.@each.title", "badges.[]") diff --git a/app/assets/javascripts/discourse/app/routes/group-manage.js b/app/assets/javascripts/discourse/app/routes/group-manage.js index ec052e047e8..2748ebeea75 100644 --- a/app/assets/javascripts/discourse/app/routes/group-manage.js +++ b/app/assets/javascripts/discourse/app/routes/group-manage.js @@ -15,7 +15,7 @@ export default DiscourseRoute.extend({ afterModel(group) { if ( !this.currentUser || - (!(this.currentUser.admin && group.get("automatic")) && + (!(this.modelFor("group").can_admin_group && group.get("automatic")) && !this.currentUser.canManageGroup(group)) ) { this.transitionTo("group.members", group); diff --git a/app/assets/javascripts/discourse/app/routes/groups-new.js b/app/assets/javascripts/discourse/app/routes/groups-new.js index 9da8dca7da7..95fb70744e4 100644 --- a/app/assets/javascripts/discourse/app/routes/groups-new.js +++ b/app/assets/javascripts/discourse/app/routes/groups-new.js @@ -18,7 +18,7 @@ export default DiscourseRoute.extend({ }, afterModel() { - if (!(this.currentUser && this.currentUser.admin)) { + if (!this.get("currentUser.can_create_group")) { this.transitionTo("groups"); } } diff --git a/app/assets/javascripts/discourse/app/templates/components/groups-form-interaction-fields.hbs b/app/assets/javascripts/discourse/app/templates/components/groups-form-interaction-fields.hbs index cad46c66847..80d0b147547 100644 --- a/app/assets/javascripts/discourse/app/templates/components/groups-form-interaction-fields.hbs +++ b/app/assets/javascripts/discourse/app/templates/components/groups-form-interaction-fields.hbs @@ -1,4 +1,4 @@ -{{#if currentUser.admin}} +{{#if canAdminGroup}}
@@ -62,7 +62,7 @@ }}
-{{#if currentUser.admin}} +{{#if canAdminGroup}}