From 42482bfabc1919a1ab8f7d8ee506d93cf66930c9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pierre-Andr=C3=A9=20Boissinot?=
 <pierreandre.boissinot@noesya.coop>
Date: Mon, 27 Jan 2025 11:45:43 +0100
Subject: [PATCH] add abilities (#2605)

---
 app/models/ability/admin.rb           |  1 +
 app/models/ability/program_manager.rb | 31 +++++++++++++++++++++++++++
 app/models/ability/website_manager.rb | 23 +++++++++++++++-----
 3 files changed, 50 insertions(+), 5 deletions(-)

diff --git a/app/models/ability/admin.rb b/app/models/ability/admin.rb
index 4fed71195..1109f4e0b 100644
--- a/app/models/ability/admin.rb
+++ b/app/models/ability/admin.rb
@@ -73,6 +73,7 @@ class Ability::Admin < Ability
     can :manage, Communication::Website::Menu, university_id: @user.university_id
     can :manage, Communication::Website::Menu::Item, university_id: @user.university_id
     can :manage, Communication::Website::Page, university_id: @user.university_id
+    can :manage, Communication::Website::Page::Category, university_id: @user.university_id
     can :manage, Communication::Website::Post, university_id: @user.university_id
   end
 
diff --git a/app/models/ability/program_manager.rb b/app/models/ability/program_manager.rb
index b3da7db0f..62fdb7264 100644
--- a/app/models/ability/program_manager.rb
+++ b/app/models/ability/program_manager.rb
@@ -3,13 +3,18 @@ class Ability::ProgramManager < Ability
   def initialize(user)
     super
     can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Agenda::Event::Localization', about_id: managed_event_localization_ids
+    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Agenda::Category::Localization', about_id: managed_agenda_category_localization_ids
     can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Post::Localization', about_id: managed_post_localization_ids
+    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Post::Category::Localization', about_id: managed_post_category_localization_ids
     can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Education::Program::Localization', about_id: managed_program_localization_ids
+    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Education::Program::Category::Localization', about_id: managed_program_category_localization_ids
     can :manage, Communication::Block, university_id: @user.university_id, about_type: 'University::Person::Localization', about_id: managed_person_localization_ids
     can :create, Communication::Block
     can :read, Communication::Website, university_id: @user.university_id
     can :manage, Communication::Website::Agenda::Event, university_id: @user.university_id
+    can :manage, Communication::Website::Agenda::Category, id: managed_agenda_category_ids
     can :manage, Communication::Website::Post, university_id: @user.university_id
+    can :manage, Communication::Website::Post::Category, id: managed_post_category_ids
     can :manage, Education::Program, id: managed_programs_ids
     can [:read, :children], Education::Program, university_id: @user.university_id
     cannot :create, Education::Program
@@ -37,6 +42,22 @@ class Ability::ProgramManager < Ability
     end
   end
 
+  def managed_agenda_category_ids
+    @managed_agenda_category_ids ||= Communication::Website::Agenda::Category.where(university_id: @user.university_id, program_id: managed_programs_ids).pluck(:id)
+  end
+
+  def managed_agenda_category_localization_ids
+    @managed_agenda_category_localization_ids ||= Communication::Website::Agenda::Category::Localization.where(about_id: managed_agenda_category_ids).pluck(:id)
+  end
+
+  def managed_post_category_ids
+    @managed_post_category_ids ||= Communication::Website::Post::Category.where(university_id: @user.university_id, program_id: managed_programs_ids).pluck(:id)
+  end
+
+  def managed_post_category_localization_ids
+    @managed_post_category_localization_ids ||= Communication::Website::Post::Category::Localization.where(about_id: managed_post_category_ids).pluck(:id)
+  end
+
   def managed_programs_ids
     @managed_programs_ids ||= @user.programs_to_manage.pluck(:id)
   end
@@ -45,6 +66,16 @@ class Ability::ProgramManager < Ability
     @managed_program_localization_ids ||= Education::Program::Localization.where(about_id: managed_program_ids).pluck(:id)
   end
 
+  def managed_program_category_ids
+    @managed_program_category_ids ||= Education::Program::Category.where(university_id: @user.university_id).pluck(:id)
+  end
+
+  def managed_program_category_localization_ids
+    @managed_program_category_localization_ids ||= Education::Program::Category::Localization.where(about_id: managed_program_category_ids).pluck(:id)
+  end
+
+
+
   def managed_person_localization_ids
     @managed_person_localization_ids ||= begin
       University::Person::Localization
diff --git a/app/models/ability/website_manager.rb b/app/models/ability/website_manager.rb
index b7db6d5b9..afc26883e 100644
--- a/app/models/ability/website_manager.rb
+++ b/app/models/ability/website_manager.rb
@@ -7,15 +7,17 @@ class Ability::WebsiteManager < Ability
     can :manage, Communication::Website::Localization, university_id: @user.university_id, communication_website_id: managed_websites_ids
     can :manage, Communication::Website::Agenda::Event, university_id: @user.university_id, communication_website_id: managed_websites_ids
     can :manage, Communication::Website::Agenda::Category, university_id: @user.university_id, communication_website_id: managed_websites_ids
-    can :manage, Communication::Website::Post::Category, university_id: @user.university_id, communication_website_id: managed_websites_ids
     can [:read, :update, :reorder], Communication::Website::Menu, university_id: @user.university_id, communication_website_id: managed_websites_ids
     can :manage, Communication::Website::Menu::Item, university_id: @user.university_id, website_id: managed_websites_ids
     can :create, Communication::Website::Menu::Item, university_id: @user.university_id
     can :manage, Communication::Website::Page, university_id: @user.university_id, communication_website_id: managed_websites_ids
-    can :manage, Communication::Website::Portfolio::Category, university_id: @user.university_id, communication_website_id: managed_websites_ids
+    can :manage, Communication::Website::Page::Category, university_id: @user.university_id, communication_website_id: managed_websites_ids
     can :manage, Communication::Website::Portfolio::Project, university_id: @user.university_id, communication_website_id: managed_websites_ids
+    can :manage, Communication::Website::Portfolio::Category, university_id: @user.university_id, communication_website_id: managed_websites_ids
     can :manage, Communication::Website::Post, university_id: @user.university_id, communication_website_id: managed_websites_ids
+    can :manage, Communication::Website::Post::Category, university_id: @user.university_id, communication_website_id: managed_websites_ids
     can :manage, University::Organization, university_id: @user.university_id
+    can :manage, University::Organization::Category, university_id: @user.university_id
     can :manage, University::Person, university_id: @user.university_id
     can :manage, University::Person::Category, university_id: @user.university_id
     can :manage, University::Person::Experience, university_id: @user.university_id
@@ -49,6 +51,14 @@ class Ability::WebsiteManager < Ability
     end
   end
 
+  def managed_page_category_localization_ids
+    @managed_page_category_localization_ids ||= begin
+      Communication::Website::Page::Category::Localization
+        .where(communication_website_id: managed_websites_ids)
+        .pluck(:id)
+    end
+  end
+
   def managed_portfolio_category_localization_ids
     @managed_portfolio_category_localization_ids ||= begin
       Communication::Website::Portfolio::Category::Localization
@@ -82,15 +92,18 @@ class Ability::WebsiteManager < Ability
   end
 
   def manage_blocks
-    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Agenda::Category::Localization', about_id: managed_agenda_category_localization_ids
     can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Agenda::Event::Localization', about_id: managed_agenda_event_localization_ids
+    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Agenda::Category::Localization', about_id: managed_agenda_category_localization_ids
     can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Page::Localization', about_id: managed_page_localization_ids
-    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Portfolio::Category::Localization', about_id: managed_portfolio_category_localization_ids
+    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Page::Category::Localization', about_id: managed_page_category_localization_ids
     can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Portfolio::Project::Localization', about_id: managed_portfolio_project_localizations_ids
-    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Post::Category::Localization', about_id: managed_post_category_localization_ids
+    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Portfolio::Category::Localization', about_id: managed_portfolio_category_localization_ids
     can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Post::Localization', about_id: managed_post_localization_ids
+    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Post::Category::Localization', about_id: managed_post_category_localization_ids
     can :manage, Communication::Block, university_id: @user.university_id, about_type: 'University::Organization::Localization', about_id: University::Organization::Localization.where(university_id: @user.university_id).pluck(:id)
+    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'University::Organization::Category::Localization', about_id: University::Organization::Category::Localization.where(university_id: @user.university_id).pluck(:id)
     can :manage, Communication::Block, university_id: @user.university_id, about_type: 'University::Person::Localization', about_id: University::Person::Localization.where(university_id: @user.university_id).pluck(:id)
+    can :manage, Communication::Block, university_id: @user.university_id, about_type: 'University::Person::Category::Localization', about_id: University::Person::Category::Localization.where(university_id: @user.university_id).pluck(:id)
     can :create, Communication::Block
   end
 
-- 
GitLab