Skip to content
Snippets Groups Projects
Unverified Commit b5512db2 authored by Sébastien Gaya's avatar Sébastien Gaya Committed by GitHub
Browse files

Fix abilities (#2271)

* fix abilities

* fix "warning: redefining 'object_id' may cause serious problems"
parent ffc32803
No related branches found
No related tags found
No related merge requests found
......@@ -2,13 +2,13 @@ class Ability::Author < Ability
def initialize(user)
super
can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Post', about_id: managed_posts_ids
can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Agenda::Event', about_id: managed_events_ids
can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Portfolio::Project', about_id: managed_projects_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::Portfolio::Project::Localization', about_id: managed_portfolio_project_localization_ids
can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Post::Localization', about_id: managed_post_localization_ids
can :create, Communication::Block
can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Website::Post', about_id: managed_posts_ids
can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Website::Agenda::Event', about_id: managed_events_ids
can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Website::Portfolio::Project', about_id: managed_events_ids
can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Website::Agenda::Event::Localization', about_id: managed_agenda_event_localization_ids
can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Website::Portfolio::Project::Localization', about_id: managed_portfolio_project_localization_ids
can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Website::Post::Localization', about_id: managed_post_localization_ids
can :create, Communication::Block::Heading
can :read, Communication::Website, university_id: @user.university_id, id: managed_websites_ids
can :manage, Communication::Website::Post, university_id: @user.university_id, communication_website_id: managed_websites_ids, author_id: @user.person&.id
......@@ -19,16 +19,31 @@ class Ability::Author < Ability
protected
def managed_posts_ids
@managed_posts_ids ||= Communication::Website::Post.where(university_id: @user.university_id, author_id: @user.person&.id).pluck(:id)
def managed_agenda_event_localization_ids
@managed_agenda_event_localization_ids ||= begin
managed_agenda_event_ids = Communication::Website::Agenda::Event
.where(university_id: @user.university_id, created_by_id: @user.id)
.pluck(:id)
Communication::Website::Agenda::Event::Localization.where(about_id: managed_agenda_event_ids).pluck(:id)
end
end
def managed_events_ids
@managed_events_ids ||= Communication::Website::Agenda::Event.where(university_id: @user.university_id, created_by_id: @user.id).pluck(:id)
def managed_portfolio_project_localization_ids
@managed_portfolio_project_localization_ids ||= begin
managed_portfolio_project_ids = Communication::Website::Portfolio::Project
.where(university_id: @user.university_id, created_by_id: @user.id)
.pluck(:id)
Communication::Website::Portfolio::Project::Localization.where(about_id: managed_portfolio_project_ids).pluck(:id)
end
end
def managed_projects_ids
@managed_projects_ids ||= Communication::Website::Portfolio::Project.where(university_id: @user.university_id, created_by_id: @user.id).pluck(:id)
def managed_post_localization_ids
@managed_post_localization_ids ||= begin
managed_post_ids = Communication::Website::Post
.where(university_id: @user.university_id, author_id: @user.person&.id)
.pluck(:id)
Communication::Website::Post::Localization.where(about_id: managed_post_ids).pluck(:id)
end
end
end
\ No newline at end of file
......@@ -2,15 +2,15 @@ class Ability::ProgramManager < Ability
def initialize(user)
super
can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Agenda::Event', about_id: managed_events_ids
can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Post', about_id: managed_posts_ids
can :manage, Communication::Block, university_id: @user.university_id, about_type: 'University::Person', about_id: University::Person.where(university_id: @user.university_id).pluck(:id)
can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Education::Program', about_id: managed_programs_ids
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::Post::Localization', about_id: managed_post_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: 'University::Person::Localization', about_id: managed_person_localization_ids
can :create, Communication::Block
can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Website::Agenda::Event', about_id: managed_events_ids
can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Website::Post', about_id: managed_posts_ids
can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Education::Program', about_id: managed_programs_ids
can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'University::Person', about_id: University::Person.where(university_id: @user.university_id).pluck(:id)
can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Website::Agenda::Event::Localization', about_id: managed_event_localization_ids
can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Website::Post::Localization', about_id: managed_post_localization_ids
can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Education::Program::Localization', about_id: managed_program_localization_ids
can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'University::Person::Localization', about_id: managed_person_localization_ids
can :create, Communication::Block::Heading
can :read, Communication::Website, university_id: @user.university_id
can :manage, Communication::Website::Agenda::Event, university_id: @user.university_id
......@@ -25,16 +25,37 @@ class Ability::ProgramManager < Ability
protected
def managed_programs_ids
@managed_programs_ids ||= @user.programs_to_manage.pluck(:education_program_id)
def managed_event_localization_ids
@managed_event_localization_ids ||= begin
Communication::Website::Agenda::Event::Localization
.where(university_id: @user.university_id)
.pluck(:id)
end
end
def managed_posts_ids
@managed_posts_ids ||= Communication::Website::Post.where(university_id: @user.university_id).pluck(:id)
def managed_post_localization_ids
@managed_post_localization_ids ||= begin
Communication::Website::Post::Localization
.where(university_id: @user.university_id)
.pluck(:id)
end
end
def managed_events_ids
@managed_events_ids ||= Communication::Website::Agenda::Event.where(university_id: @user.university_id).pluck(:id)
def managed_program_localization_ids
@managed_program_localization_ids ||= begin
managed_program_ids = @user.programs_to_manage.pluck(:id)
Education::Program::Localization
.where(about_id: managed_program_ids)
.pluck(:id)
end
end
def managed_person_localization_ids
@managed_person_localization_ids ||= begin
University::Person::Localization
.where(university_id: @user.university_id)
.pluck(:id)
end
end
end
\ No newline at end of file
......@@ -2,11 +2,11 @@ class Ability::Teacher < Ability
def initialize(user)
super
can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Education::Program', about_id: Education::Program.where(university_id: @user.university_id).pluck(:id)
can :manage, Communication::Block, university_id: @user.university_id, about_type: 'University::Person', about_id: University::Person.where(university_id: @user.university_id, user_id: @user.id).pluck(:id)
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: 'University::Person::Localization', about_id: managed_person_localization_ids
can :create, Communication::Block
can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Education::Program', about_id: Education::Program.where(university_id: @user.university_id).pluck(:id)
can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'University::Person', about_id: University::Person.where(university_id: @user.university_id, user_id: @user.id).pluck(:id)
can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Education::Program::Localization', about_id: managed_program_localization_ids
can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'University::Person::Localization', about_id: managed_person_localization_ids
can :create, Communication::Block::Heading
can [:read, :children], Education::Program, university_id: @user.university_id
can :manage, University::Person, user_id: @user.id
......@@ -15,4 +15,22 @@ class Ability::Teacher < Ability
can :read, University::Person::Involvement, university_id: @user.university_id
can :read, University::Role, university_id: @user.university_id
end
protected
def managed_program_localization_ids
@managed_program_localization_ids ||= begin
Education::Program::Localization
.where(university_id: @user.university_id)
.pluck(:id)
end
end
def managed_person_localization_ids
@managed_person_localization_ids ||= begin
University::Person::Localization
.where(university_id: @user.university_id, about_id: @user.person&.id)
.pluck(:id)
end
end
end
\ No newline at end of file
......@@ -25,48 +25,82 @@ class Ability::WebsiteManager < Ability
protected
def managed_pages_ids
@managed_pages_ids ||= Communication::Website::Page.where(communication_website_id: managed_websites_ids).pluck(:id)
def managed_agenda_category_localization_ids
@managed_agenda_category_localization_ids ||= begin
Communication::Website::Agenda::Category::Localization
.where(communication_website_id: managed_websites_ids)
.pluck(:id)
end
end
def managed_posts_ids
@managed_posts_ids ||= Communication::Website::Post.where(communication_website_id: managed_websites_ids).pluck(:id)
def managed_agenda_event_localization_ids
@managed_agenda_event_localization_ids ||= begin
Communication::Website::Agenda::Event::Localization
.where(communication_website_id: managed_websites_ids)
.pluck(:id)
end
end
def managed_agenda_categorys_ids
@managed_agenda_categorys_ids ||= Communication::Website::Agenda::Category.where(communication_website_id: managed_websites_ids).pluck(:id)
def managed_page_localization_ids
@managed_page_localization_ids ||= begin
Communication::Website::Page::Localization
.where(communication_website_id: managed_websites_ids)
.pluck(:id)
end
end
def managed_agenda_events_ids
@managed_agenda_events_ids ||= Communication::Website::Agenda::Event.where(communication_website_id: managed_websites_ids).pluck(:id)
def managed_portfolio_category_localization_ids
@managed_portfolio_category_localization_ids ||= begin
Communication::Website::Portfolio::Category::Localization
.where(communication_website_id: managed_websites_ids)
.pluck(:id)
end
end
def managed_portfolio_categories_ids
@managed_portfolio_categories_ids ||= Communication::Website::Portfolio::Category.where(communication_website_id: managed_websites_ids).pluck(:id)
def managed_portfolio_project_localizations_ids
@managed_portfolio_project_localizations_ids ||= begin
Communication::Website::Portfolio::Project::Localization
.where(communication_website_id: managed_websites_ids)
.pluck(:id)
end
end
def managed_portfolio_projects_ids
@managed_portfolio_projects_ids ||= Communication::Website::Portfolio::Project.where(communication_website_id: managed_websites_ids).pluck(:id)
def managed_post_category_localization_ids
@managed_post_localization_ids ||= begin
Communication::Website::Post::Category::Localization
.where(communication_website_id: managed_websites_ids)
.pluck(:id)
end
end
def managed_post_localization_ids
@managed_post_localization_ids ||= begin
Communication::Website::Post::Localization
.where(communication_website_id: managed_websites_ids)
.pluck(:id)
end
end
def manage_blocks
can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Agenda::Category', about_id: managed_agenda_categorys_ids
can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Agenda::Event', about_id: managed_agenda_events_ids
can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Page', about_id: managed_pages_ids
can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Portfolio::Category', about_id: managed_portfolio_categories_ids
can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Portfolio::Project', about_id: managed_portfolio_projects_ids
can :manage, Communication::Block, university_id: @user.university_id, about_type: 'Communication::Website::Post', about_id: managed_posts_ids
can :manage, Communication::Block, university_id: @user.university_id, about_type: 'University::Organization', about_id: University::Organization.where(university_id: @user.university_id).pluck(:id)
can :manage, Communication::Block, university_id: @user.university_id, about_type: 'University::Person', about_id: University::Person.where(university_id: @user.university_id).pluck(:id)
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::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::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::Post::Localization', about_id: managed_post_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::Person::Localization', about_id: University::Person::Localization.where(university_id: @user.university_id).pluck(:id)
can :create, Communication::Block
can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Website::Agenda::Category', about_id: managed_agenda_categorys_ids
can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Website::Agenda::Event', about_id: managed_agenda_events_ids
can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Website::Page', about_id: managed_pages_ids
can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Portfolio::Category', about_id: managed_portfolio_categories_ids
can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Portfolio::Project', about_id: managed_portfolio_projects_ids
can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Website::Post', about_id: managed_posts_ids
can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'University::Organization', about_id: University::Organization.where(university_id: @user.university_id).pluck(:id)
can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'University::Person', about_id: University::Person.where(university_id: @user.university_id).pluck(:id)
can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Website::Agenda::Category::Localization', about_id: managed_agenda_category_localization_ids
can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Website::Agenda::Event::Localization', about_id: managed_agenda_event_localization_ids
can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Website::Page::Localization', about_id: managed_page_localization_ids
can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Portfolio::Category::Localization', about_id: managed_portfolio_category_localization_ids
can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Portfolio::Project::Localization', about_id: managed_portfolio_project_localizations_ids
can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Website::Post::Category::Localization', about_id: managed_post_category_localization_ids
can :manage, Communication::Block::Heading, university_id: @user.university_id, about_type: 'Communication::Website::Post::Localization', about_id: managed_post_localization_ids
can :manage, Communication::Block::Heading, 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::Heading, university_id: @user.university_id, about_type: 'University::Person::Localization', about_id: University::Person::Localization.where(university_id: @user.university_id).pluck(:id)
can :create, Communication::Block::Heading
end
......
......@@ -8,19 +8,19 @@ class PolymorphicObjectFinder
# Rails uses ActiveRecord::Inheritance#polymorphic_name to hydrate the about_type.
# Example: A Block for a Communication::Website::Page::Home will have about_type = "Communication::Website::Page"
def self.find(params, key:, university:, mandatory_module: nil, permitted_classes: [])
finder = new params,
key: key,
university: university,
mandatory_module: mandatory_module,
finder = new params,
key: key,
university: university,
mandatory_module: mandatory_module,
permitted_classes: permitted_classes
finder.object
finder.record
end
def object
def record
return unless complies_with_mandatory_module? && complies_with_permitted_classes?
model.where(university: university).find(object_id)
model.where(university: university).find(record_id)
end
private
attr_reader :params, :key, :university, :mandatory_module, :permitted_classes
......@@ -36,7 +36,7 @@ class PolymorphicObjectFinder
def key_id
"#{key}_id".to_sym
end
def key_type
"#{key}_type".to_sym
end
......@@ -45,7 +45,7 @@ class PolymorphicObjectFinder
params[key_type]
end
def object_id
def record_id
params[key_id]
end
......
......@@ -8,26 +8,6 @@ namespace :app do
desc 'Fix things'
task fix: :environment do
special_page_types = [
"Communication::Website::Page::AdministrationLocation",
"Communication::Website::Page::Administrator",
"Communication::Website::Page::CommunicationAgendaArchive",
"Communication::Website::Page::CommunicationAgenda",
"Communication::Website::Page::CommunicationPortfolio",
"Communication::Website::Page::EducationDiploma",
"Communication::Website::Page::EducationProgram",
"Communication::Website::Page::ResearchPaper",
"Communication::Website::Page::ResearchPublication",
"Communication::Website::Page::ResearchVolume",
"Communication::Website::Page::Researcher",
"Communication::Website::Page::Teacher"
]
# On supprime toutes les pages spéciales potentiellement non nécessaires créées après migration
Communication::Website::Page.where(type: special_page_types).where('created_at > ?', 2.days.ago).each do |special_page|
next if special_page.is_necessary_for_website?
special_page.destroy
end
end
namespace :websites do
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment