UX: show which groups are missing permissions for parent category (#7252)

UX: show which groups are missing permissions for parent category (#7252)

diff --git a/app/models/category.rb b/app/models/category.rb
index a1e5771..767b350 100644
--- a/app/models/category.rb
+++ b/app/models/category.rb
@@ -664,9 +664,12 @@ class Category < ActiveRecord::Base
     return if parent_groups.include?(Group[:everyone].id)
 
     child_groups = child_permissions.map(&:first)
-    only_in_subcategory = child_groups - parent_groups
+    only_subcategory_groups = child_groups - parent_groups
 
-    errors.add(:base, I18n.t("category.errors.permission_conflict")) if only_in_subcategory.present?
+    if only_subcategory_groups.present?
+      group_names = Group.where(id: only_subcategory_groups).pluck(:name).join(", ")
+      errors.add(:base, I18n.t("category.errors.permission_conflict", group_names: group_names))
+    end
   end
 
   def subcategories_permissions
diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml
index 7357e96..bfcbeb0 100644
--- a/config/locales/server.en.yml
+++ b/config/locales/server.en.yml
@@ -590,7 +590,7 @@ en:
       email_already_used_in_group: "'%{email}' is already used by the group '%{group_name}'."
       email_already_used_in_category: "'%{email}' is already used by the category '%{category_name}'."
       description_incomplete: "The category description post must have at least one paragraph."
-      permission_conflict: "Any group that is allowed to access a subcategory must also be allowed to access the parent category."
+      permission_conflict: "Any group that is allowed to access a subcategory must also be allowed to access the parent category. The following groups have access to one of subcategories, but not to the parent category: %{group_names}."
       disallowed_topic_tags: "This topic has tags not allowed by this category: '%{tags}'"
     cannot_delete:
       uncategorized: "This category is special. It is intended as a holding area for topics that have no category; it cannot be deleted."
diff --git a/spec/models/category_spec.rb b/spec/models/category_spec.rb
index 18fbc06..b5412e3 100644
--- a/spec/models/category_spec.rb
+++ b/spec/models/category_spec.rb
@@ -787,7 +787,7 @@ describe Category do
         subcategory.set_permissions(group => :full, group2 => :readonly)
 
         expect(subcategory.valid?).to eq(false)
-        expect(subcategory.errors.full_messages).to eq([I18n.t("category.errors.permission_conflict")])
+        expect(subcategory.errors.full_messages).to contain_exactly(I18n.t("category.errors.permission_conflict", group_names: group2.name))
       end
 
       it "is valid if permissions are same or more restrictive" do
@@ -819,7 +819,7 @@ describe Category do
         parent_category.set_permissions(group => :readonly)
 
         expect(parent_category.valid?).to eq(false)
-        expect(parent_category.errors.full_messages).to eq([I18n.t("category.errors.permission_conflict")])
+        expect(parent_category.errors.full_messages).to contain_exactly(I18n.t("category.errors.permission_conflict", group_names: group2.name))
       end
 
       it "is valid if subcategory permissions are same or more restrictive" do

GitHub sha: 88128f1c

1 Like

minor copyedit

This commit has been mentioned on Discourse Meta. There might be relevant details there:

This commit has been mentioned on Discourse Meta. There might be relevant details there: