feat: remove_gestionnaire
This commit is contained in:
parent
b100c8380e
commit
d5637ac7aa
55 changed files with 400 additions and 537 deletions
|
@ -1,9 +0,0 @@
|
||||||
module AdminsGroupManagers
|
|
||||||
class AdminsGroupManagerController < ApplicationController
|
|
||||||
before_action :authenticate_admins_group_manager!
|
|
||||||
|
|
||||||
def nav_bar_profile
|
|
||||||
:admins_group_manager
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,14 +0,0 @@
|
||||||
module AdminsGroupManagers
|
|
||||||
class AdminsGroupsController < AdminsGroupManagerController
|
|
||||||
def index
|
|
||||||
@admins_groups = admins_groups
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def admins_groups
|
|
||||||
admins_group_ids = current_admins_group_manager.admins_group_ids
|
|
||||||
AdminsGroup.where(id: admins_group_ids.compact.uniq)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,4 +0,0 @@
|
||||||
module Manager
|
|
||||||
class AdminsGroupManagersController < Manager::ApplicationController
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,32 +0,0 @@
|
||||||
module Manager
|
|
||||||
class AdminsGroupsController < Manager::ApplicationController
|
|
||||||
def add_admins_group_manager
|
|
||||||
emails = (params['emails'].presence || '').split(',').to_json
|
|
||||||
emails = JSON.parse(emails).map { EmailSanitizableConcern::EmailSanitizer.sanitize(_1) }
|
|
||||||
|
|
||||||
admins_group_managers, invalid_emails = admins_group.add_admins_group_managers(emails:)
|
|
||||||
|
|
||||||
if invalid_emails.present?
|
|
||||||
flash[:alert] = t('.wrong_address',
|
|
||||||
count: invalid_emails.size,
|
|
||||||
emails: invalid_emails)
|
|
||||||
end
|
|
||||||
|
|
||||||
if admins_group_managers.present?
|
|
||||||
flash[:notice] = "Les gestionnaires ont bien été affectés au groupe d'administrateurs"
|
|
||||||
|
|
||||||
AdminsGroupMailer
|
|
||||||
.notify_added_admins_group_managers(admins_group, admins_group_managers, current_super_admin.email)
|
|
||||||
.deliver_later
|
|
||||||
end
|
|
||||||
|
|
||||||
redirect_to manager_admins_groups_path(admins_group)
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def admins_group
|
|
||||||
@admins_group ||= AdminsGroup.find(params[:id])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -20,7 +20,25 @@ module Manager
|
||||||
.deliver_later
|
.deliver_later
|
||||||
end
|
end
|
||||||
|
|
||||||
redirect_to manager_groupe_gestionnaires_path(groupe_gestionnaire)
|
redirect_to manager_groupe_gestionnaire_path(groupe_gestionnaire)
|
||||||
|
end
|
||||||
|
|
||||||
|
def remove_gestionnaire
|
||||||
|
if !groupe_gestionnaire.root_groupe_gestionnaire? || groupe_gestionnaire.gestionnaires.one?
|
||||||
|
flash[:alert] = "Suppression impossible : il doit y avoir au moins un gestionnaire dans le groupe racine"
|
||||||
|
else
|
||||||
|
gestionnaire = Gestionnaire.find(gestionnaire_id)
|
||||||
|
if groupe_gestionnaire.remove(gestionnaire)
|
||||||
|
flash[:notice] = "Le gestionnaire « #{gestionnaire.email} » a été retiré du groupe."
|
||||||
|
GroupeGestionnaireMailer
|
||||||
|
.notify_removed_gestionnaire(groupe_gestionnaire, gestionnaire, current_super_admin.email)
|
||||||
|
.deliver_later
|
||||||
|
else
|
||||||
|
flash[:alert] = "Le gestionnaire « #{gestionnaire.email} » n’est pas dans le groupe."
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
redirect_to manager_groupe_gestionnaire_path(groupe_gestionnaire)
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
@ -28,5 +46,9 @@ module Manager
|
||||||
def groupe_gestionnaire
|
def groupe_gestionnaire
|
||||||
@groupe_gestionnaire ||= GroupeGestionnaire.find(params[:id])
|
@groupe_gestionnaire ||= GroupeGestionnaire.find(params[:id])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def gestionnaire_id
|
||||||
|
params[:gestionnaire][:id]
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,54 +0,0 @@
|
||||||
require "administrate/base_dashboard"
|
|
||||||
|
|
||||||
class AdminsGroupDashboard < Administrate::BaseDashboard
|
|
||||||
# ATTRIBUTE_TYPES
|
|
||||||
# a hash that describes the type of each of the model's fields.
|
|
||||||
#
|
|
||||||
# Each different type represents an Administrate::Field object,
|
|
||||||
# which determines how the attribute is displayed
|
|
||||||
# on pages throughout the dashboard.
|
|
||||||
ATTRIBUTE_TYPES = {
|
|
||||||
id: Field::Number,
|
|
||||||
name: Field::String,
|
|
||||||
created_at: Field::DateTime,
|
|
||||||
updated_at: Field::DateTime,
|
|
||||||
admins_group_managers: Field::HasMany,
|
|
||||||
administrateurs: Field::HasMany
|
|
||||||
}.freeze
|
|
||||||
|
|
||||||
# COLLECTION_ATTRIBUTES
|
|
||||||
# an array of attributes that will be displayed on the model's index page.
|
|
||||||
#
|
|
||||||
# By default, it's limited to four items to reduce clutter on index pages.
|
|
||||||
# Feel free to add, remove, or rearrange items.
|
|
||||||
COLLECTION_ATTRIBUTES = [
|
|
||||||
:id,
|
|
||||||
:created_at,
|
|
||||||
:name,
|
|
||||||
:admins_group_managers,
|
|
||||||
:administrateurs
|
|
||||||
].freeze
|
|
||||||
|
|
||||||
# SHOW_PAGE_ATTRIBUTES
|
|
||||||
# an array of attributes that will be displayed on the model's show page.
|
|
||||||
SHOW_PAGE_ATTRIBUTES = [
|
|
||||||
:admins_group_managers,
|
|
||||||
:administrateurs,
|
|
||||||
:id,
|
|
||||||
:created_at
|
|
||||||
].freeze
|
|
||||||
|
|
||||||
# FORM_ATTRIBUTES
|
|
||||||
# an array of attributes that will be displayed
|
|
||||||
# on the model's form (`new` and `edit`) pages.
|
|
||||||
FORM_ATTRIBUTES = [
|
|
||||||
:name
|
|
||||||
].freeze
|
|
||||||
|
|
||||||
# Overwrite this method to customize how users are displayed
|
|
||||||
# across all pages of the admin dashboard.
|
|
||||||
#
|
|
||||||
def display_resource(admins_group)
|
|
||||||
admins_group.name
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,57 +0,0 @@
|
||||||
require "administrate/base_dashboard"
|
|
||||||
|
|
||||||
class AdminsGroupManagerDashboard < Administrate::BaseDashboard
|
|
||||||
# ATTRIBUTE_TYPES
|
|
||||||
# a hash that describes the type of each of the model's fields.
|
|
||||||
#
|
|
||||||
# Each different type represents an Administrate::Field object,
|
|
||||||
# which determines how the attribute is displayed
|
|
||||||
# on pages throughout the dashboard.
|
|
||||||
ATTRIBUTE_TYPES = {
|
|
||||||
id: Field::Number,
|
|
||||||
user: Field::HasOne.with_options(searchable: true, searchable_field: 'email'),
|
|
||||||
created_at: Field::DateTime,
|
|
||||||
updated_at: Field::DateTime,
|
|
||||||
admins_groups: Field::HasMany.with_options(limit: 20),
|
|
||||||
registration_state: Field::String.with_options(searchable: false),
|
|
||||||
email: Field::Email.with_options(searchable: false)
|
|
||||||
}.freeze
|
|
||||||
|
|
||||||
# COLLECTION_ATTRIBUTES
|
|
||||||
# an array of attributes that will be displayed on the model's index page.
|
|
||||||
#
|
|
||||||
# By default, it's limited to four items to reduce clutter on index pages.
|
|
||||||
# Feel free to add, remove, or rearrange items.
|
|
||||||
COLLECTION_ATTRIBUTES = [
|
|
||||||
:id,
|
|
||||||
:user,
|
|
||||||
:created_at,
|
|
||||||
:admins_groups,
|
|
||||||
:registration_state
|
|
||||||
].freeze
|
|
||||||
|
|
||||||
# SHOW_PAGE_ATTRIBUTES
|
|
||||||
# an array of attributes that will be displayed on the model's show page.
|
|
||||||
SHOW_PAGE_ATTRIBUTES = [
|
|
||||||
:id,
|
|
||||||
:user,
|
|
||||||
:created_at,
|
|
||||||
:updated_at,
|
|
||||||
:registration_state,
|
|
||||||
:admins_groups
|
|
||||||
].freeze
|
|
||||||
|
|
||||||
# FORM_ATTRIBUTES
|
|
||||||
# an array of attributes that will be displayed
|
|
||||||
# on the model's form (`new` and `edit`) pages.
|
|
||||||
FORM_ATTRIBUTES = [
|
|
||||||
:email
|
|
||||||
].freeze
|
|
||||||
|
|
||||||
# Overwrite this method to customize how users are displayed
|
|
||||||
# across all pages of the admin dashboard.
|
|
||||||
#
|
|
||||||
def display_resource(admins_group_manager)
|
|
||||||
admins_group_manager.email
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,13 +0,0 @@
|
||||||
class AdminsGroupMailer < ApplicationMailer
|
|
||||||
layout 'mailers/layout'
|
|
||||||
|
|
||||||
def notify_added_admins_group_managers(admins_group, added_admins_group_managers, current_super_admin_email)
|
|
||||||
added_admins_group_manager_emails = added_admins_group_managers.map(&:email)
|
|
||||||
@admins_group = admins_group
|
|
||||||
@current_super_admin_email = current_super_admin_email
|
|
||||||
|
|
||||||
subject = "Vous avez été ajouté(e) en tant que gestionnaire du groupe d'administrateur \"#{admins_group.name}\""
|
|
||||||
|
|
||||||
mail(bcc: added_admins_group_manager_emails, subject: subject)
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,6 +1,14 @@
|
||||||
class GroupeGestionnaireMailer < ApplicationMailer
|
class GroupeGestionnaireMailer < ApplicationMailer
|
||||||
layout 'mailers/layout'
|
layout 'mailers/layout'
|
||||||
|
|
||||||
|
def notify_removed_gestionnaire(groupe_gestionnaire, removed_gestionnaire, current_super_admin_email)
|
||||||
|
@groupe_gestionnaire = groupe_gestionnaire
|
||||||
|
@current_super_admin_email = current_super_admin_email
|
||||||
|
subject = "Vous avez été retiré(e) du groupe d'administrateur \"#{groupe_gestionnaire.name}\""
|
||||||
|
|
||||||
|
mail(to: removed_gestionnaire.email, subject: subject)
|
||||||
|
end
|
||||||
|
|
||||||
def notify_added_gestionnaires(groupe_gestionnaire, added_gestionnaires, current_super_admin_email)
|
def notify_added_gestionnaires(groupe_gestionnaire, added_gestionnaires, current_super_admin_email)
|
||||||
added_gestionnaire_emails = added_gestionnaires.map(&:email)
|
added_gestionnaire_emails = added_gestionnaires.map(&:email)
|
||||||
@groupe_gestionnaire = groupe_gestionnaire
|
@groupe_gestionnaire = groupe_gestionnaire
|
||||||
|
|
|
@ -1,30 +0,0 @@
|
||||||
class AdminsGroup < ApplicationRecord
|
|
||||||
belongs_to :admins_group, optional: true # parent
|
|
||||||
has_many :children, class_name: "AdminsGroup", inverse_of: :admins_group
|
|
||||||
has_many :administrateurs
|
|
||||||
has_and_belongs_to_many :admins_group_managers
|
|
||||||
|
|
||||||
def add(admins_group_manager)
|
|
||||||
admins_group_managers << admins_group_manager
|
|
||||||
end
|
|
||||||
|
|
||||||
def add_admins_group_managers(ids: [], emails: [])
|
|
||||||
admins_group_managers_to_add, valid_emails, invalid_emails = AdminsGroupManager.find_all_by_identifier_with_emails(ids:, emails:)
|
|
||||||
not_found_emails = valid_emails - admins_group_managers_to_add.map(&:email)
|
|
||||||
|
|
||||||
# Send invitations to users without account
|
|
||||||
if not_found_emails.present?
|
|
||||||
admins_group_managers_to_add += not_found_emails.map do |email|
|
|
||||||
user = User.create_or_promote_to_admins_group_manager(email, SecureRandom.hex)
|
|
||||||
user.invite_admins_group_manager!(self)
|
|
||||||
user.admins_group_manager
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# We dont't want to assign a user to an admins_group if they are already assigned to it
|
|
||||||
admins_group_managers_to_add -= admins_group_managers
|
|
||||||
admins_group_managers_to_add.each { add(_1) }
|
|
||||||
|
|
||||||
[admins_group_managers_to_add, invalid_emails]
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,41 +0,0 @@
|
||||||
class AdminsGroupManager < ApplicationRecord
|
|
||||||
has_and_belongs_to_many :admins_groups
|
|
||||||
|
|
||||||
belongs_to :user
|
|
||||||
|
|
||||||
delegate :email, to: :user
|
|
||||||
|
|
||||||
default_scope { eager_load(:user) }
|
|
||||||
|
|
||||||
def self.by_email(email)
|
|
||||||
find_by(users: { email: email })
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.find_all_by_identifier(ids: [], emails: [])
|
|
||||||
find_all_by_identifier_with_emails(ids:, emails:).first
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.find_all_by_identifier_with_emails(ids: [], emails: [])
|
|
||||||
valid_emails, invalid_emails = emails.partition { URI::MailTo::EMAIL_REGEXP.match?(_1) }
|
|
||||||
|
|
||||||
[
|
|
||||||
where(id: ids).or(where(users: { email: valid_emails })).distinct(:id),
|
|
||||||
valid_emails,
|
|
||||||
invalid_emails
|
|
||||||
]
|
|
||||||
end
|
|
||||||
|
|
||||||
def can_be_deleted?
|
|
||||||
!(root_admins_group = admins_groups.where(admins_group: nil).first) || root_admins_group.admins_group_managers.size > 1
|
|
||||||
end
|
|
||||||
|
|
||||||
def registration_state
|
|
||||||
if user.active?
|
|
||||||
'Actif'
|
|
||||||
elsif user.reset_password_period_valid?
|
|
||||||
'En attente'
|
|
||||||
else
|
|
||||||
'Expiré'
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -4,10 +4,24 @@ class GroupeGestionnaire < ApplicationRecord
|
||||||
has_many :administrateurs
|
has_many :administrateurs
|
||||||
has_and_belongs_to_many :gestionnaires
|
has_and_belongs_to_many :gestionnaires
|
||||||
|
|
||||||
|
def root_groupe_gestionnaire?
|
||||||
|
groupe_gestionnaire.nil?
|
||||||
|
end
|
||||||
|
|
||||||
def add(gestionnaire)
|
def add(gestionnaire)
|
||||||
|
return if gestionnaire.nil?
|
||||||
|
return if in?(gestionnaire.groupe_gestionnaires)
|
||||||
|
|
||||||
gestionnaires << gestionnaire
|
gestionnaires << gestionnaire
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def remove(gestionnaire)
|
||||||
|
return if gestionnaire.nil?
|
||||||
|
return if !in?(gestionnaire.groupe_gestionnaires)
|
||||||
|
|
||||||
|
gestionnaire.groupe_gestionnaires.destroy(self)
|
||||||
|
end
|
||||||
|
|
||||||
def add_gestionnaires(ids: [], emails: [])
|
def add_gestionnaires(ids: [], emails: [])
|
||||||
gestionnaires_to_add, valid_emails, invalid_emails = Gestionnaire.find_all_by_identifier_with_emails(ids:, emails:)
|
gestionnaires_to_add, valid_emails, invalid_emails = Gestionnaire.find_all_by_identifier_with_emails(ids:, emails:)
|
||||||
not_found_emails = valid_emails - gestionnaires_to_add.map(&:email)
|
not_found_emails = valid_emails - gestionnaires_to_add.map(&:email)
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
%p= t(:hello, scope: [:views, :shared, :greetings])
|
|
||||||
|
|
||||||
%p
|
|
||||||
= t(".email_body", admins_group_name: @admins_group.name, email: @current_super_admin_email, application_name: APPLICATION_NAME)
|
|
||||||
|
|
||||||
= render partial: "layouts/mailers/signature"
|
|
|
@ -1,17 +0,0 @@
|
||||||
= render partial: 'admins_group_managers/breadcrumbs',
|
|
||||||
locals: { steps: [['Groupes d\'administrateurs', admins_group_manager_admins_groups_path]] }
|
|
||||||
|
|
||||||
#admins_groups-index.container
|
|
||||||
%h1.fr-h1 Liste des groupes d'administrateurs
|
|
||||||
|
|
||||||
%table.fr-table.width-100.mt-3
|
|
||||||
%thead
|
|
||||||
%tr
|
|
||||||
%th{ scope: "col" }
|
|
||||||
Nom
|
|
||||||
|
|
||||||
%tbody
|
|
||||||
- @admins_groups.each do |admins_group|
|
|
||||||
%tr
|
|
||||||
%td
|
|
||||||
= admins_group.name
|
|
17
app/views/gestionnaires/groupe_gestionnaires/index.html.haml
Normal file
17
app/views/gestionnaires/groupe_gestionnaires/index.html.haml
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
= render partial: 'gestionnaires/breadcrumbs',
|
||||||
|
locals: { steps: [['Groupes d\'administrateurs', gestionnaire_groupe_gestionnaires_path]] }
|
||||||
|
|
||||||
|
#groupe_gestionnaires-index.container
|
||||||
|
%h1.fr-h1 Liste des groupes d'administrateurs
|
||||||
|
|
||||||
|
%table.fr-table.width-100.mt-3
|
||||||
|
%thead
|
||||||
|
%tr
|
||||||
|
%th{ scope: "col" }
|
||||||
|
Nom
|
||||||
|
|
||||||
|
%tbody
|
||||||
|
- @groupe_gestionnaires.each do |groupe_gestionnaire|
|
||||||
|
%tr
|
||||||
|
%td
|
||||||
|
= groupe_gestionnaire.name
|
|
@ -0,0 +1,6 @@
|
||||||
|
%p= t(:hello, scope: [:views, :shared, :greetings])
|
||||||
|
|
||||||
|
%p
|
||||||
|
= t(".email_body", groupe_gestionnaire_name: @groupe_gestionnaire.name, email: @current_super_admin_email, application_name: APPLICATION_NAME)
|
||||||
|
|
||||||
|
= render partial: "layouts/mailers/signature"
|
|
@ -0,0 +1,17 @@
|
||||||
|
<% if existing_action?(collection_presenter.resource_name, :edit) %>
|
||||||
|
<td><%= link_to(
|
||||||
|
t("administrate.actions.edit"),
|
||||||
|
[:edit, namespace, resource],
|
||||||
|
class: "action-edit",
|
||||||
|
) if accessible_action?(resource, :edit) %></td>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<% if existing_action?(collection_presenter.resource_name, :destroy) %>
|
||||||
|
<td><%= link_to(
|
||||||
|
t("administrate.actions.destroy"),
|
||||||
|
[namespace, resource],
|
||||||
|
class: "text-color-red",
|
||||||
|
method: :delete,
|
||||||
|
data: { confirm: t("administrate.actions.confirm") }
|
||||||
|
) if accessible_action?(resource, :destroy) %></td>
|
||||||
|
<% end %>
|
27
app/views/manager/gestionnaires/_index_header.erb
Normal file
27
app/views/manager/gestionnaires/_index_header.erb
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
<% content_for(:title) do %>
|
||||||
|
<%= display_resource_name(page.resource_name) %>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<header class="main-content__header">
|
||||||
|
<h1 class="main-content__page-title" id="page-title">
|
||||||
|
<%= content_for(:title) %>
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<% if show_search_bar %>
|
||||||
|
<%= render(
|
||||||
|
"search",
|
||||||
|
search_term: search_term,
|
||||||
|
resource_name: display_resource_name(page.resource_name)
|
||||||
|
) %>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<%= link_to(
|
||||||
|
t(
|
||||||
|
"manager.gestionnaires.manage_root_groupe_gestionnaire"
|
||||||
|
),
|
||||||
|
manager_groupe_gestionnaires_path,
|
||||||
|
class: "button",
|
||||||
|
) %>
|
||||||
|
</div>
|
||||||
|
</header>
|
|
@ -0,0 +1,81 @@
|
||||||
|
|
||||||
|
<% if attribute.resources.any? %>
|
||||||
|
<% order = attribute.order_from_params(params.fetch(attribute.name, {})) %>
|
||||||
|
<% page_number = params.fetch(attribute.name, {}).fetch(:page, nil) %>
|
||||||
|
|
||||||
|
<table aria-labelledby="<%= attribute.name %>">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<% attribute.associated_collection(order).attribute_types.select{ |attr_name, attr_type| [:id, :user].include?(attr_name) }.each do |attr_name, attr_type| %>
|
||||||
|
<th class="cell-label
|
||||||
|
cell-label--<%= attr_type.html_class %>
|
||||||
|
cell-label--<%= attribute.associated_collection(order).ordered_html_class(attr_name) %>
|
||||||
|
cell-label--<%= "#{attribute.associated_collection(order).resource_name}_#{attr_name}" %>"
|
||||||
|
scope="col"
|
||||||
|
aria-sort="<%= sort_order(attribute.associated_collection(order).ordered_html_class(attr_name)) %>">
|
||||||
|
<%= link_to(sanitized_order_params(page, attribute.name).merge(
|
||||||
|
attribute.associated_collection(order).order_params_for(attr_name, key: attribute.name)
|
||||||
|
)) do %>
|
||||||
|
<%= t(
|
||||||
|
"helpers.label.#{attribute.associated_collection(order).resource_name}.#{attr_name}",
|
||||||
|
default: attribute.associated_class.human_attribute_name(attr_name).titleize,
|
||||||
|
) %>
|
||||||
|
<% if attribute.associated_collection(order).ordered_by?(attr_name) %>
|
||||||
|
<span class="cell-label__sort-indicator cell-label__sort-indicator--<%= attribute.associated_collection(order).ordered_html_class(attr_name) %>">
|
||||||
|
<svg aria-hidden="true">
|
||||||
|
<use xlink:href="#icon-up-caret" />
|
||||||
|
</svg>
|
||||||
|
</span>
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
||||||
|
</th>
|
||||||
|
<% end %>
|
||||||
|
<% [false && existing_action?(attribute.associated_collection(order).resource_name, :edit),
|
||||||
|
existing_action?(attribute.associated_collection(order).resource_name, :destroy)].count(true).times do %>
|
||||||
|
<th scope="col"></th>
|
||||||
|
<% end %>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
|
||||||
|
<tbody>
|
||||||
|
<% attribute.resources(page_number, order).each do |resource| %>
|
||||||
|
<tr class="js-table-row">
|
||||||
|
<% attribute.associated_collection(order).attributes_for(resource).select{ |field| ["id", "user"].include?(field.name) }.each do |field| %>
|
||||||
|
<td class="cell-data cell-data--<%= field.html_class %>">
|
||||||
|
<%= render_field field %>
|
||||||
|
</td>
|
||||||
|
<% end %>
|
||||||
|
<% if false %>
|
||||||
|
<td><%= link_to(
|
||||||
|
t("administrate.actions.edit"),
|
||||||
|
[:edit, namespace, resource],
|
||||||
|
class: "action-edit",
|
||||||
|
) if accessible_action?(resource, :edit) %></td>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<% if existing_action?(attribute.associated_collection(order).resource_name, :destroy) %>
|
||||||
|
<td class="actions"><%= button_to 'Retirer',
|
||||||
|
{ action: :remove_gestionnaire, id: page.resource.id },
|
||||||
|
{ method: :delete,
|
||||||
|
data: { confirm: t("administrate.actions.confirm") },
|
||||||
|
params: { gestionnaire: { id: resource.id }},
|
||||||
|
class: 'fr-btn fr-btn--secondary' }
|
||||||
|
%></td>
|
||||||
|
<% end %>
|
||||||
|
</tr>
|
||||||
|
<% end %>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<% if attribute.more_than_limit? %>
|
||||||
|
<%= render("pagination", resources: attribute.resources(page_number), param_name: "#{attribute.name}[page]") %>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<% else %>
|
||||||
|
<%= t("administrate.fields.has_many.none", default: "–") %>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<%= form_tag(add_gestionnaire_manager_groupe_gestionnaire_path(page.resource), style: 'margin-top: 1rem;') do %>
|
||||||
|
<%= email_field_tag(:emails, '', placeholder: 'Emails', autocapitalize: 'off', autocorrect: 'off', spellcheck: 'false', style: 'margin-bottom: 1rem;width:24rem;') %>
|
||||||
|
<button>Ajouter un gestionnaire</button>
|
||||||
|
<% end %>
|
|
@ -15,8 +15,8 @@ as well as a link to its edit page.
|
||||||
|
|
||||||
[1]: http://www.rubydoc.info/gems/administrate/Administrate/Page/Show
|
[1]: http://www.rubydoc.info/gems/administrate/Administrate/Page/Show
|
||||||
%>
|
%>
|
||||||
|
|
||||||
<% content_for(:title) { t("administrate.actions.show_resource", name: page.page_title) } %>
|
<% content_for(:title) { t("administrate.actions.show_resource", name: page.page_title) } %>
|
||||||
<% admins_group = page.resource %>
|
|
||||||
|
|
||||||
<header class="main-content__header" role="banner">
|
<header class="main-content__header" role="banner">
|
||||||
<h1 class="main-content__page-title">
|
<h1 class="main-content__page-title">
|
||||||
|
@ -28,9 +28,16 @@ as well as a link to its edit page.
|
||||||
t("administrate.actions.edit_resource", name: page.page_title),
|
t("administrate.actions.edit_resource", name: page.page_title),
|
||||||
[:edit, namespace, page.resource],
|
[:edit, namespace, page.resource],
|
||||||
class: "button",
|
class: "button",
|
||||||
) if valid_action? :edit %>
|
) if accessible_action?(page.resource, :edit) %>
|
||||||
</div>
|
|
||||||
|
|
||||||
|
<%= link_to(
|
||||||
|
t("administrate.actions.destroy"),
|
||||||
|
[namespace, page.resource],
|
||||||
|
class: "button button--danger",
|
||||||
|
method: :delete,
|
||||||
|
data: { confirm: t("administrate.actions.confirm") }
|
||||||
|
) if accessible_action?(page.resource, :destroy) %>
|
||||||
|
</div>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<section class="main-content__body">
|
<section class="main-content__body">
|
||||||
|
@ -39,18 +46,21 @@ as well as a link to its edit page.
|
||||||
<dt class="attribute-label" id="<%= attribute.name %>">
|
<dt class="attribute-label" id="<%= attribute.name %>">
|
||||||
<%= t(
|
<%= t(
|
||||||
"helpers.label.#{resource_name}.#{attribute.name}",
|
"helpers.label.#{resource_name}.#{attribute.name}",
|
||||||
default: attribute.name.titleize,
|
default: page.resource.class.human_attribute_name(attribute.name),
|
||||||
) %>
|
) %>
|
||||||
</dt>
|
</dt>
|
||||||
|
|
||||||
<dd class="attribute-data attribute-data--<%=attribute.html_class%>">
|
<dd class="attribute-data attribute-data--<%=attribute.html_class%>">
|
||||||
<%= render_field attribute, page: page %>
|
<% if attribute.name == 'gestionnaires' %>
|
||||||
<% if attribute.name == 'admins_group_managers' %>
|
|
||||||
<%= form_tag(add_admins_group_manager_manager_admins_group_path(admins_group), style: 'margin-top: 1rem;') do %>
|
<%= render(
|
||||||
<%= email_field_tag(:emails, '', placeholder: 'Emails', autocapitalize: 'off', autocorrect: 'off', spellcheck: 'false', style: 'margin-bottom: 1rem;width:24rem;') %>
|
"collection_gestionnaires",
|
||||||
<button>Ajouter un gestionnaire</button>
|
page: page,
|
||||||
|
attribute: attribute
|
||||||
|
) %>
|
||||||
|
<% else %>
|
||||||
|
<%= render_field attribute, page: page %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% end %>
|
|
||||||
</dd>
|
</dd>
|
||||||
<% end %>
|
<% end %>
|
||||||
</dl>
|
</dl>
|
|
@ -1,13 +0,0 @@
|
||||||
- content_for(:title, 'Activation de votre compte gestionnaire')
|
|
||||||
|
|
||||||
%p
|
|
||||||
Bonjour,
|
|
||||||
|
|
||||||
%p
|
|
||||||
Vous venez d’être nommé gestionnaire du groupe #{@admins_group.name} sur #{APPLICATION_NAME}.
|
|
||||||
|
|
||||||
%p
|
|
||||||
Votre compte a été créé pour l'adresse email #{@user.email}. Pour l’activer, nous vous invitons à cliquer sur le lien suivant :
|
|
||||||
= link_to(users_activate_url(token: @reset_password_token), users_activate_url(token: @reset_password_token))
|
|
||||||
|
|
||||||
= render partial: "layouts/mailers/signature"
|
|
|
@ -155,6 +155,3 @@ CLAMAV_ENABLED="disabled"
|
||||||
|
|
||||||
# Siret number used for API Entreprise, by default we use SIRET from dinum
|
# Siret number used for API Entreprise, by default we use SIRET from dinum
|
||||||
API_ENTREPRISE_DEFAULT_SIRET="put_your_own_siret"
|
API_ENTREPRISE_DEFAULT_SIRET="put_your_own_siret"
|
||||||
|
|
||||||
# Admins group usage (gestionnaire de groupes d'administrateurs)
|
|
||||||
ADMINS_GROUP_ENABLED="disabled"
|
|
|
@ -1,9 +0,0 @@
|
||||||
fr:
|
|
||||||
activerecord:
|
|
||||||
attributes:
|
|
||||||
admins_group_manager:
|
|
||||||
admins_groups: Groupes
|
|
||||||
models:
|
|
||||||
admins_group_manager:
|
|
||||||
one: Gestionnaire
|
|
||||||
other: Gestionnaires
|
|
|
@ -1,9 +1,9 @@
|
||||||
fr:
|
fr:
|
||||||
activerecord:
|
activerecord:
|
||||||
attributes:
|
attributes:
|
||||||
admins_group:
|
groupe_gestionnaire:
|
||||||
admins_group_managers: Gestionnaires
|
gestionnaires: Gestionnaires
|
||||||
models:
|
models:
|
||||||
admins_group:
|
groupe_gestionnaire:
|
||||||
one: Groupe d'administrateurs
|
one: Groupe d'administrateurs
|
||||||
other: Groupes d'administrateurs
|
other: Groupes d'administrateurs
|
|
@ -1,4 +0,0 @@
|
||||||
en:
|
|
||||||
admins_group_mailer:
|
|
||||||
notify_added_admins_group_managers:
|
|
||||||
email_body: "You were assigned as manager on the admins group %{admins_group_name} on %{application_name} by « %{email} »"
|
|
|
@ -1,4 +0,0 @@
|
||||||
fr:
|
|
||||||
admins_group_mailer:
|
|
||||||
notify_added_admins_group_managers:
|
|
||||||
email_body: "Vous venez d’être nommé gestionnaire du groupe %{admins_group_name} sur %{application_name} par « %{email} »."
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
en:
|
||||||
|
groupe_gestionnaire_mailer:
|
||||||
|
notify_removed_gestionnaire:
|
||||||
|
email_body: "You were removed from the admins group %{groupe_gestionnaire_name} on %{application_name} by « %{email} »"
|
|
@ -0,0 +1,4 @@
|
||||||
|
fr:
|
||||||
|
groupe_gestionnaire_mailer:
|
||||||
|
notify_removed_gestionnaire:
|
||||||
|
email_body: "Vous venez d’être supprimé(e) du groupe %{groupe_gestionnaire_name} sur %{application_name} par « %{email} »."
|
9
config/locales/views/manager/en.yml
Normal file
9
config/locales/views/manager/en.yml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
en:
|
||||||
|
manager:
|
||||||
|
groupe_gestionnaires:
|
||||||
|
add_gestionnaire:
|
||||||
|
wrong_address:
|
||||||
|
one: "%{emails} is not a valid email address"
|
||||||
|
other: "%{emails} are not valid email addresses"
|
||||||
|
gestionnaires:
|
||||||
|
manage_root_groupe_gestionnaire: Root group management
|
|
@ -5,3 +5,5 @@ fr:
|
||||||
wrong_address:
|
wrong_address:
|
||||||
one: "%{emails} n’est pas une adresse email valide"
|
one: "%{emails} n’est pas une adresse email valide"
|
||||||
other: "%{emails} ne sont pas des adresses emails valides"
|
other: "%{emails} ne sont pas des adresses emails valides"
|
||||||
|
gestionnaires:
|
||||||
|
manage_root_groupe_gestionnaire: Gestion du groupe racine
|
||||||
|
|
|
@ -57,10 +57,11 @@ Rails.application.routes.draw do
|
||||||
end
|
end
|
||||||
|
|
||||||
if ENV['ADMINS_GROUP_ENABLED'] == 'enabled' # can be removed if needed when EVERY PARTS of the feature will be merged / from env.example.optional
|
if ENV['ADMINS_GROUP_ENABLED'] == 'enabled' # can be removed if needed when EVERY PARTS of the feature will be merged / from env.example.optional
|
||||||
resources :gestionnaires, only: [:index, :show, :edit, :update]
|
resources :gestionnaires, only: [:index, :show, :edit, :update, :destroy]
|
||||||
|
|
||||||
resources :groupe_gestionnaires, path: 'groupe_administrateurs', only: [:index, :show, :new, :create, :edit, :update] do
|
resources :groupe_gestionnaires, path: 'groupe_administrateurs', only: [:index, :show, :new, :create, :edit, :update] do
|
||||||
post 'add_gestionnaire', on: :member
|
post 'add_gestionnaire', on: :member
|
||||||
|
delete 'remove_gestionnaire', on: :member
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
class CreateAdminsGroupManagers < ActiveRecord::Migration[7.0]
|
|
||||||
def change
|
|
||||||
create_table "admins_group_managers" do |t|
|
|
||||||
t.bigint :user_id, null: false
|
|
||||||
t.index [:user_id], name: :index_admins_group_managers_on_user_id
|
|
||||||
t.timestamps
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,15 +0,0 @@
|
||||||
class CreateAdminsGroups < ActiveRecord::Migration[7.0]
|
|
||||||
def change
|
|
||||||
create_table "admins_groups" do |t|
|
|
||||||
t.string :name, null: false
|
|
||||||
t.references :admins_group
|
|
||||||
t.index [:name], name: :index_admins_groups_on_name
|
|
||||||
t.timestamps
|
|
||||||
end
|
|
||||||
|
|
||||||
create_join_table :admins_groups, :admins_group_managers do |t|
|
|
||||||
t.index [:admins_group_id, :admins_group_manager_id], name: :index_on_admins_group_and_admins_group_manager
|
|
||||||
t.index [:admins_group_manager_id, :admins_group_id], name: :index_on_admins_group_manager_and_admins_group
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,7 +0,0 @@
|
||||||
class AddAdminsGroupToAdministrateurs < ActiveRecord::Migration[7.0]
|
|
||||||
disable_ddl_transaction!
|
|
||||||
|
|
||||||
def change
|
|
||||||
add_reference :administrateurs, :admins_group, index: { algorithm: :concurrently }, null: true
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,5 +0,0 @@
|
||||||
class AddForeignKeyAdminsGroupToAdministrateurs < ActiveRecord::Migration[7.0]
|
|
||||||
def change
|
|
||||||
add_foreign_key :administrateurs, :admins_groups, validate: false
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,5 +0,0 @@
|
||||||
class ValidateForeignKeyAdminsGroupToAdministrateurs < ActiveRecord::Migration[7.0]
|
|
||||||
def change
|
|
||||||
validate_foreign_key :administrateurs, :admins_groups
|
|
||||||
end
|
|
||||||
end
|
|
24
db/schema.rb
24
db/schema.rb
|
@ -61,7 +61,6 @@ ActiveRecord::Schema[7.0].define(version: 2023_10_10_083144) do
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "administrateurs", id: :serial, force: :cascade do |t|
|
create_table "administrateurs", id: :serial, force: :cascade do |t|
|
||||||
t.bigint "admins_group_id"
|
|
||||||
t.datetime "created_at", precision: 6
|
t.datetime "created_at", precision: 6
|
||||||
t.bigint "groupe_gestionnaire_id"
|
t.bigint "groupe_gestionnaire_id"
|
||||||
t.datetime "updated_at", precision: 6
|
t.datetime "updated_at", precision: 6
|
||||||
|
@ -91,29 +90,6 @@ ActiveRecord::Schema[7.0].define(version: 2023_10_10_083144) do
|
||||||
t.index ["procedure_id"], name: "index_administrateurs_procedures_on_procedure_id"
|
t.index ["procedure_id"], name: "index_administrateurs_procedures_on_procedure_id"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "admins_group_managers", force: :cascade do |t|
|
|
||||||
t.datetime "created_at", null: false
|
|
||||||
t.datetime "updated_at", null: false
|
|
||||||
t.bigint "user_id", null: false
|
|
||||||
t.index ["user_id"], name: "index_admins_group_managers_on_user_id"
|
|
||||||
end
|
|
||||||
|
|
||||||
create_table "admins_group_managers_groups", id: false, force: :cascade do |t|
|
|
||||||
t.bigint "admins_group_id", null: false
|
|
||||||
t.bigint "admins_group_manager_id", null: false
|
|
||||||
t.index ["admins_group_id", "admins_group_manager_id"], name: "index_on_admins_group_and_admins_group_manager"
|
|
||||||
t.index ["admins_group_manager_id", "admins_group_id"], name: "index_on_admins_group_manager_and_admins_group"
|
|
||||||
end
|
|
||||||
|
|
||||||
create_table "admins_groups", force: :cascade do |t|
|
|
||||||
t.bigint "admins_group_id"
|
|
||||||
t.datetime "created_at", null: false
|
|
||||||
t.string "name", null: false
|
|
||||||
t.datetime "updated_at", null: false
|
|
||||||
t.index ["admins_group_id"], name: "index_admins_groups_on_admins_group_id"
|
|
||||||
t.index ["name"], name: "index_admins_groups_on_name"
|
|
||||||
end
|
|
||||||
|
|
||||||
create_table "api_tokens", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
|
create_table "api_tokens", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
|
||||||
t.bigint "administrateur_id", null: false
|
t.bigint "administrateur_id", null: false
|
||||||
t.bigint "allowed_procedure_ids", array: true
|
t.bigint "allowed_procedure_ids", array: true
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
describe AdminsGroupManagers::AdminsGroupManagerController, type: :controller do
|
|
||||||
describe 'before actions: authenticate_admins_group_manager!' do
|
|
||||||
it 'is present' do
|
|
||||||
before_actions = AdminsGroupManagers::AdminsGroupManagerController
|
|
||||||
._process_action_callbacks
|
|
||||||
.filter { |process_action_callbacks| process_action_callbacks.kind == :before }
|
|
||||||
.map(&:filter)
|
|
||||||
|
|
||||||
expect(before_actions).to include(:authenticate_admins_group_manager!)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,23 +0,0 @@
|
||||||
describe AdminsGroupManagers::AdminsGroupsController, type: :controller do
|
|
||||||
let(:admins_group_manager) { create(:admins_group_manager) }
|
|
||||||
|
|
||||||
describe "#index" do
|
|
||||||
subject { get :index }
|
|
||||||
|
|
||||||
context "when not logged" do
|
|
||||||
before { subject }
|
|
||||||
it { expect(response).to redirect_to(new_user_session_path) }
|
|
||||||
end
|
|
||||||
|
|
||||||
context "when logged in" do
|
|
||||||
let!(:admins_group) { create(:admins_group, admins_group_managers: [admins_group_manager]) }
|
|
||||||
before do
|
|
||||||
sign_in(admins_group_manager.user)
|
|
||||||
subject
|
|
||||||
end
|
|
||||||
|
|
||||||
it { expect(response).to have_http_status(:ok) }
|
|
||||||
it { expect(assigns(:admins_groups)).to include(admins_group) }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
describe Gestionnaires::GestionnaireController, type: :controller do
|
||||||
|
describe 'before actions: authenticate_gestionnaire!' do
|
||||||
|
it 'is present' do
|
||||||
|
before_actions = Gestionnaires::GestionnaireController
|
||||||
|
._process_action_callbacks
|
||||||
|
.filter { |process_action_callbacks| process_action_callbacks.kind == :before }
|
||||||
|
.map(&:filter)
|
||||||
|
|
||||||
|
expect(before_actions).to include(:authenticate_gestionnaire!)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,23 @@
|
||||||
|
describe Gestionnaires::GroupeGestionnairesController, type: :controller do
|
||||||
|
let(:gestionnaire) { create(:gestionnaire) }
|
||||||
|
|
||||||
|
describe "#index" do
|
||||||
|
subject { get :index }
|
||||||
|
|
||||||
|
context "when not logged" do
|
||||||
|
before { subject }
|
||||||
|
it { expect(response).to redirect_to(new_user_session_path) }
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when logged in" do
|
||||||
|
let!(:groupe_gestionnaire) { create(:groupe_gestionnaire, gestionnaires: [gestionnaire]) }
|
||||||
|
before do
|
||||||
|
sign_in(gestionnaire.user)
|
||||||
|
subject
|
||||||
|
end
|
||||||
|
|
||||||
|
it { expect(response).to have_http_status(:ok) }
|
||||||
|
it { expect(assigns(:groupe_gestionnaires)).to include(groupe_gestionnaire) }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,25 +0,0 @@
|
||||||
describe Manager::AdminsGroupManagersController, type: :controller do
|
|
||||||
let(:super_admin) { create(:super_admin) }
|
|
||||||
let(:admins_group_manager) { create(:admins_group_manager) }
|
|
||||||
|
|
||||||
before { sign_in super_admin }
|
|
||||||
|
|
||||||
describe '#index' do
|
|
||||||
render_views
|
|
||||||
|
|
||||||
it 'searches admin by email' do
|
|
||||||
get :index, params: { search: admins_group_manager.email }
|
|
||||||
expect(response).to have_http_status(:success)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe '#show' do
|
|
||||||
render_views
|
|
||||||
|
|
||||||
before do
|
|
||||||
get :show, params: { id: admins_group_manager.id }
|
|
||||||
end
|
|
||||||
|
|
||||||
it { expect(response.body).to include(admins_group_manager.email) }
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,27 +0,0 @@
|
||||||
describe Manager::AdminsGroupsController, type: :controller do
|
|
||||||
let(:super_admin) { create(:super_admin) }
|
|
||||||
let(:admins_group) { create(:admins_group) }
|
|
||||||
|
|
||||||
before { sign_in super_admin }
|
|
||||||
|
|
||||||
describe '#index' do
|
|
||||||
render_views
|
|
||||||
|
|
||||||
before do
|
|
||||||
admins_group
|
|
||||||
get :index
|
|
||||||
end
|
|
||||||
|
|
||||||
it { expect(response.body).to include(admins_group.name) }
|
|
||||||
end
|
|
||||||
|
|
||||||
describe '#show' do
|
|
||||||
render_views
|
|
||||||
|
|
||||||
before do
|
|
||||||
get :show, params: { id: admins_group.id }
|
|
||||||
end
|
|
||||||
|
|
||||||
it { expect(response.body).to include(admins_group.name) }
|
|
||||||
end
|
|
||||||
end
|
|
25
spec/controllers/manager/gestionnaires_controller_spec.rb
Normal file
25
spec/controllers/manager/gestionnaires_controller_spec.rb
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
describe Manager::GestionnairesController, type: :controller do
|
||||||
|
let(:super_admin) { create(:super_admin) }
|
||||||
|
let(:gestionnaire) { create(:gestionnaire) }
|
||||||
|
|
||||||
|
before { sign_in super_admin }
|
||||||
|
|
||||||
|
describe '#index' do
|
||||||
|
render_views
|
||||||
|
|
||||||
|
it 'searches admin by email' do
|
||||||
|
get :index, params: { search: gestionnaire.email }
|
||||||
|
expect(response).to have_http_status(:success)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#show' do
|
||||||
|
render_views
|
||||||
|
|
||||||
|
before do
|
||||||
|
get :show, params: { id: gestionnaire.id }
|
||||||
|
end
|
||||||
|
|
||||||
|
it { expect(response.body).to include(gestionnaire.email) }
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,82 @@
|
||||||
|
describe Manager::GroupeGestionnairesController, type: :controller do
|
||||||
|
let(:super_admin) { create(:super_admin) }
|
||||||
|
let(:groupe_gestionnaire) { create(:groupe_gestionnaire) }
|
||||||
|
|
||||||
|
before { sign_in super_admin }
|
||||||
|
|
||||||
|
describe '#index' do
|
||||||
|
render_views
|
||||||
|
|
||||||
|
before do
|
||||||
|
groupe_gestionnaire
|
||||||
|
get :index
|
||||||
|
end
|
||||||
|
|
||||||
|
it { expect(response.body).to include(groupe_gestionnaire.name) }
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#show' do
|
||||||
|
render_views
|
||||||
|
|
||||||
|
before do
|
||||||
|
get :show, params: { id: groupe_gestionnaire.id }
|
||||||
|
end
|
||||||
|
|
||||||
|
it { expect(response.body).to include(groupe_gestionnaire.name) }
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#add_gestionnaire' do
|
||||||
|
before do
|
||||||
|
post :add_gestionnaire,
|
||||||
|
params: {
|
||||||
|
id: groupe_gestionnaire.id,
|
||||||
|
emails: new_gestionnaire_email
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'of a new gestionnaire' do
|
||||||
|
let(:new_gestionnaire_email) { 'new_gestionnaire@mail.com' }
|
||||||
|
|
||||||
|
it { expect(groupe_gestionnaire.gestionnaires.map(&:email)).to include(new_gestionnaire_email) }
|
||||||
|
it { expect(flash.notice).to be_present }
|
||||||
|
it { expect(response).to redirect_to(manager_groupe_gestionnaire_path(groupe_gestionnaire)) }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#remove_gestionnaire' do
|
||||||
|
let(:gestionnaire) { create(:gestionnaire) }
|
||||||
|
let(:new_gestionnaire) { create(:gestionnaire) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
groupe_gestionnaire.gestionnaires << gestionnaire << new_gestionnaire
|
||||||
|
end
|
||||||
|
|
||||||
|
def remove_gestionnaire(gestionnaire)
|
||||||
|
delete :remove_gestionnaire,
|
||||||
|
params: {
|
||||||
|
id: groupe_gestionnaire.id,
|
||||||
|
gestionnaire: { id: gestionnaire.id }
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when there are many gestionnaires' do
|
||||||
|
before { remove_gestionnaire(new_gestionnaire) }
|
||||||
|
|
||||||
|
it { expect(groupe_gestionnaire.gestionnaires).to include(gestionnaire) }
|
||||||
|
it { expect(groupe_gestionnaire.reload.gestionnaires.count).to eq(1) }
|
||||||
|
it { expect(response).to redirect_to(manager_groupe_gestionnaire_path(groupe_gestionnaire)) }
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when there is only one gestionnaire' do
|
||||||
|
before do
|
||||||
|
remove_gestionnaire(new_gestionnaire)
|
||||||
|
remove_gestionnaire(gestionnaire)
|
||||||
|
end
|
||||||
|
|
||||||
|
it { expect(groupe_gestionnaire.gestionnaires).to include(gestionnaire) }
|
||||||
|
it { expect(groupe_gestionnaire.gestionnaires.count).to eq(1) }
|
||||||
|
it { expect(flash.alert).to eq('Suppression impossible : il doit y avoir au moins un gestionnaire dans le groupe racine') }
|
||||||
|
it { expect(response).to redirect_to(manager_groupe_gestionnaire_path(groupe_gestionnaire)) }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,5 +0,0 @@
|
||||||
FactoryBot.define do
|
|
||||||
factory :admins_group do
|
|
||||||
sequence(:name) { |n| "Group #{n}" }
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,12 +0,0 @@
|
||||||
FactoryBot.define do
|
|
||||||
sequence(:admins_group_manager_email) { |n| "admins_group_manager#{n}@demarches-simplifiees.fr" }
|
|
||||||
|
|
||||||
factory :admins_group_manager do
|
|
||||||
user { association :user, email: email, password: password }
|
|
||||||
|
|
||||||
transient do
|
|
||||||
email { generate(:admins_group_manager_email) }
|
|
||||||
password { 'somethingverycomplated!' }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,16 +0,0 @@
|
||||||
RSpec.describe AdminsGroupMailer, type: :mailer do
|
|
||||||
describe '#notify_added_admins_group_managers' do
|
|
||||||
let(:admins_group) { create(:admins_group) }
|
|
||||||
|
|
||||||
let(:admins_group_managers_to_add) { [create(:admins_group_manager, email: 'int3@g'), create(:admins_group_manager, email: 'int4@g')] }
|
|
||||||
|
|
||||||
let(:current_super_admin_email) { 'toto@email.com' }
|
|
||||||
|
|
||||||
subject { described_class.notify_added_admins_group_managers(admins_group, admins_group_managers_to_add, current_super_admin_email) }
|
|
||||||
|
|
||||||
before { admins_group_managers_to_add.each { admins_group.add(_1) } }
|
|
||||||
|
|
||||||
it { expect(subject.body).to include('Vous venez d’être nommé gestionnaire du groupe') }
|
|
||||||
it { expect(subject.bcc).to match_array(['int3@g', 'int4@g']) }
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,4 +1,17 @@
|
||||||
RSpec.describe GroupeGestionnaireMailer, type: :mailer do
|
RSpec.describe GroupeGestionnaireMailer, type: :mailer do
|
||||||
|
describe '#notify_removed_gestionnaire' do
|
||||||
|
let(:groupe_gestionnaire) { create(:groupe_gestionnaire) }
|
||||||
|
|
||||||
|
let(:gestionnaire_to_remove) { create(:gestionnaire, email: 'int3@g') }
|
||||||
|
|
||||||
|
let(:current_super_admin_email) { 'toto@email.com' }
|
||||||
|
|
||||||
|
subject { described_class.notify_removed_gestionnaire(groupe_gestionnaire, gestionnaire_to_remove, current_super_admin_email) }
|
||||||
|
|
||||||
|
it { expect(subject.body).to include('Vous venez d’être supprimé(e) du groupe') }
|
||||||
|
it { expect(subject.to).to match_array(['int3@g']) }
|
||||||
|
end
|
||||||
|
|
||||||
describe '#notify_added_gestionnaires' do
|
describe '#notify_added_gestionnaires' do
|
||||||
let(:groupe_gestionnaire) { create(:groupe_gestionnaire) }
|
let(:groupe_gestionnaire) { create(:groupe_gestionnaire) }
|
||||||
|
|
||||||
|
|
|
@ -1,14 +0,0 @@
|
||||||
class AdminsGroupMailerPreview < ActionMailer::Preview
|
|
||||||
def notify_added_admins_group_managers
|
|
||||||
admins_group = AdminsGroup.new(name: 'un groupe d\'admin')
|
|
||||||
current_super_admin_email = 'admin@dgfip.com'
|
|
||||||
admins_group_managers = [AdminsGroupManager.new(user: user)]
|
|
||||||
AdminsGroupMailer.notify_added_admins_group_managers(admins_group, admins_group_managers, current_super_admin_email)
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def user
|
|
||||||
User.new(id: 10, email: 'test@exemple.fr')
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,4 +1,11 @@
|
||||||
class GroupeGestionnaireMailerPreview < ActionMailer::Preview
|
class GroupeGestionnaireMailerPreview < ActionMailer::Preview
|
||||||
|
def notify_removed_gestionnaire
|
||||||
|
groupe_gestionnaire = GroupeGestionnaire.new(name: 'un groupe d\'admin')
|
||||||
|
current_super_admin_email = 'admin@dgfip.com'
|
||||||
|
gestionnaire = Gestionnaire.new(user: user)
|
||||||
|
GroupeGestionnaireMailer.notify_removed_gestionnaire(groupe_gestionnaire, gestionnaire, current_super_admin_email)
|
||||||
|
end
|
||||||
|
|
||||||
def notify_added_gestionnaires
|
def notify_added_gestionnaires
|
||||||
groupe_gestionnaire = GroupeGestionnaire.new(name: 'un groupe d\'admin')
|
groupe_gestionnaire = GroupeGestionnaire.new(name: 'un groupe d\'admin')
|
||||||
current_super_admin_email = 'admin@dgfip.com'
|
current_super_admin_email = 'admin@dgfip.com'
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
describe AdminsGroupManager, type: :model do
|
|
||||||
describe 'associations' do
|
|
||||||
it { is_expected.to have_and_belong_to_many(:admins_groups) }
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,8 +0,0 @@
|
||||||
describe AdminsGroup, type: :model do
|
|
||||||
describe 'associations' do
|
|
||||||
it { is_expected.to belong_to(:admins_group).optional }
|
|
||||||
it { is_expected.to have_many(:children) }
|
|
||||||
it { is_expected.to have_many(:administrateurs) }
|
|
||||||
it { is_expected.to have_and_belong_to_many(:admins_group_managers) }
|
|
||||||
end
|
|
||||||
end
|
|
1
spring-0/6ee76a9c97d4224cf119ff2469a53122.pid
Normal file
1
spring-0/6ee76a9c97d4224cf119ff2469a53122.pid
Normal file
|
@ -0,0 +1 @@
|
||||||
|
8
|
Loading…
Add table
Reference in a new issue