diff --git a/app/controllers/admins_group_managers/admins_group_manager_controller.rb b/app/controllers/admins_group_managers/admins_group_manager_controller.rb deleted file mode 100644 index fad6629e3..000000000 --- a/app/controllers/admins_group_managers/admins_group_manager_controller.rb +++ /dev/null @@ -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 diff --git a/app/controllers/admins_group_managers/admins_groups_controller.rb b/app/controllers/admins_group_managers/admins_groups_controller.rb deleted file mode 100644 index 3e599883a..000000000 --- a/app/controllers/admins_group_managers/admins_groups_controller.rb +++ /dev/null @@ -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 diff --git a/app/controllers/manager/admins_group_managers_controller.rb b/app/controllers/manager/admins_group_managers_controller.rb deleted file mode 100644 index f580748e1..000000000 --- a/app/controllers/manager/admins_group_managers_controller.rb +++ /dev/null @@ -1,4 +0,0 @@ -module Manager - class AdminsGroupManagersController < Manager::ApplicationController - end -end diff --git a/app/controllers/manager/admins_groups_controller.rb b/app/controllers/manager/admins_groups_controller.rb deleted file mode 100644 index ebb92784c..000000000 --- a/app/controllers/manager/admins_groups_controller.rb +++ /dev/null @@ -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 diff --git a/app/controllers/manager/groupe_gestionnaires_controller.rb b/app/controllers/manager/groupe_gestionnaires_controller.rb index 612f5e66a..68a03603c 100644 --- a/app/controllers/manager/groupe_gestionnaires_controller.rb +++ b/app/controllers/manager/groupe_gestionnaires_controller.rb @@ -20,7 +20,25 @@ module Manager .deliver_later 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 private @@ -28,5 +46,9 @@ module Manager def groupe_gestionnaire @groupe_gestionnaire ||= GroupeGestionnaire.find(params[:id]) end + + def gestionnaire_id + params[:gestionnaire][:id] + end end end diff --git a/app/dashboards/admins_group_dashboard.rb b/app/dashboards/admins_group_dashboard.rb deleted file mode 100644 index 223d15a43..000000000 --- a/app/dashboards/admins_group_dashboard.rb +++ /dev/null @@ -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 diff --git a/app/dashboards/admins_group_manager_dashboard.rb b/app/dashboards/admins_group_manager_dashboard.rb deleted file mode 100644 index 09a8c8c20..000000000 --- a/app/dashboards/admins_group_manager_dashboard.rb +++ /dev/null @@ -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 diff --git a/app/mailers/admins_group_mailer.rb b/app/mailers/admins_group_mailer.rb deleted file mode 100644 index 03e552a1b..000000000 --- a/app/mailers/admins_group_mailer.rb +++ /dev/null @@ -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 diff --git a/app/mailers/groupe_gestionnaire_mailer.rb b/app/mailers/groupe_gestionnaire_mailer.rb index 1ec583139..b5c4debac 100644 --- a/app/mailers/groupe_gestionnaire_mailer.rb +++ b/app/mailers/groupe_gestionnaire_mailer.rb @@ -1,6 +1,14 @@ class GroupeGestionnaireMailer < ApplicationMailer 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) added_gestionnaire_emails = added_gestionnaires.map(&:email) @groupe_gestionnaire = groupe_gestionnaire diff --git a/app/models/admins_group.rb b/app/models/admins_group.rb deleted file mode 100644 index e828e419b..000000000 --- a/app/models/admins_group.rb +++ /dev/null @@ -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 diff --git a/app/models/admins_group_manager.rb b/app/models/admins_group_manager.rb deleted file mode 100644 index cb11b1bd3..000000000 --- a/app/models/admins_group_manager.rb +++ /dev/null @@ -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 diff --git a/app/models/groupe_gestionnaire.rb b/app/models/groupe_gestionnaire.rb index 526418d37..aca1491d7 100644 --- a/app/models/groupe_gestionnaire.rb +++ b/app/models/groupe_gestionnaire.rb @@ -4,10 +4,24 @@ class GroupeGestionnaire < ApplicationRecord has_many :administrateurs has_and_belongs_to_many :gestionnaires + def root_groupe_gestionnaire? + groupe_gestionnaire.nil? + end + def add(gestionnaire) + return if gestionnaire.nil? + return if in?(gestionnaire.groupe_gestionnaires) + gestionnaires << gestionnaire 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: []) 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) diff --git a/app/views/admins_group_mailer/notify_added_admins_group_managers.html.haml b/app/views/admins_group_mailer/notify_added_admins_group_managers.html.haml deleted file mode 100644 index 40c1190a3..000000000 --- a/app/views/admins_group_mailer/notify_added_admins_group_managers.html.haml +++ /dev/null @@ -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" diff --git a/app/views/admins_group_managers/admins_groups/index.html.haml b/app/views/admins_group_managers/admins_groups/index.html.haml deleted file mode 100644 index fc9fb0924..000000000 --- a/app/views/admins_group_managers/admins_groups/index.html.haml +++ /dev/null @@ -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 diff --git a/app/views/admins_group_managers/_breadcrumbs.html.haml b/app/views/gestionnaires/_breadcrumbs.html.haml similarity index 100% rename from app/views/admins_group_managers/_breadcrumbs.html.haml rename to app/views/gestionnaires/_breadcrumbs.html.haml diff --git a/app/views/gestionnaires/groupe_gestionnaires/index.html.haml b/app/views/gestionnaires/groupe_gestionnaires/index.html.haml new file mode 100644 index 000000000..aa56538b9 --- /dev/null +++ b/app/views/gestionnaires/groupe_gestionnaires/index.html.haml @@ -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 diff --git a/app/views/groupe_gestionnaire_mailer/notify_removed_gestionnaire.html.haml b/app/views/groupe_gestionnaire_mailer/notify_removed_gestionnaire.html.haml new file mode 100644 index 000000000..94f82e361 --- /dev/null +++ b/app/views/groupe_gestionnaire_mailer/notify_removed_gestionnaire.html.haml @@ -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" diff --git a/app/views/manager/gestionnaires/_collection_item_actions.html.erb b/app/views/manager/gestionnaires/_collection_item_actions.html.erb new file mode 100644 index 000000000..eca420c77 --- /dev/null +++ b/app/views/manager/gestionnaires/_collection_item_actions.html.erb @@ -0,0 +1,17 @@ +<% if existing_action?(collection_presenter.resource_name, :edit) %> + <%= link_to( + t("administrate.actions.edit"), + [:edit, namespace, resource], + class: "action-edit", + ) if accessible_action?(resource, :edit) %> +<% end %> + +<% if existing_action?(collection_presenter.resource_name, :destroy) %> + <%= 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) %> +<% end %> \ No newline at end of file diff --git a/app/views/manager/gestionnaires/_index_header.erb b/app/views/manager/gestionnaires/_index_header.erb new file mode 100644 index 000000000..a14a3ba93 --- /dev/null +++ b/app/views/manager/gestionnaires/_index_header.erb @@ -0,0 +1,27 @@ +<% content_for(:title) do %> + <%= display_resource_name(page.resource_name) %> +<% end %> + +
+

+ <%= content_for(:title) %> +

+ + <% if show_search_bar %> + <%= render( + "search", + search_term: search_term, + resource_name: display_resource_name(page.resource_name) + ) %> + <% end %> + +
+ <%= link_to( + t( + "manager.gestionnaires.manage_root_groupe_gestionnaire" + ), + manager_groupe_gestionnaires_path, + class: "button", + ) %> +
+
\ No newline at end of file diff --git a/app/views/manager/groupe_gestionnaires/_collection_gestionnaires.html.erb b/app/views/manager/groupe_gestionnaires/_collection_gestionnaires.html.erb new file mode 100644 index 000000000..60a646331 --- /dev/null +++ b/app/views/manager/groupe_gestionnaires/_collection_gestionnaires.html.erb @@ -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) %> + + + + + <% attribute.associated_collection(order).attribute_types.select{ |attr_name, attr_type| [:id, :user].include?(attr_name) }.each do |attr_name, attr_type| %> + + <% end %> + <% [false && existing_action?(attribute.associated_collection(order).resource_name, :edit), + existing_action?(attribute.associated_collection(order).resource_name, :destroy)].count(true).times do %> + + <% end %> + + + + + <% attribute.resources(page_number, order).each do |resource| %> + + <% attribute.associated_collection(order).attributes_for(resource).select{ |field| ["id", "user"].include?(field.name) }.each do |field| %> + + <% end %> + <% if false %> + + <% end %> + + <% if existing_action?(attribute.associated_collection(order).resource_name, :destroy) %> + + <% end %> + + <% end %> + +
" + 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) %> + + + + <% end %> + <% end %> +
+ <%= render_field field %> + <%= link_to( + t("administrate.actions.edit"), + [:edit, namespace, resource], + class: "action-edit", + ) if accessible_action?(resource, :edit) %><%= 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' } + %>
+ +<% 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;') %> + +<% end %> diff --git a/app/views/manager/admins_groups/show.html.erb b/app/views/manager/groupe_gestionnaires/show.html.erb similarity index 65% rename from app/views/manager/admins_groups/show.html.erb rename to app/views/manager/groupe_gestionnaires/show.html.erb index e7e777c31..659206d7d 100644 --- a/app/views/manager/admins_groups/show.html.erb +++ b/app/views/manager/groupe_gestionnaires/show.html.erb @@ -15,8 +15,8 @@ as well as a link to its edit page. [1]: http://www.rubydoc.info/gems/administrate/Administrate/Page/Show %> + <% content_for(:title) { t("administrate.actions.show_resource", name: page.page_title) } %> -<% admins_group = page.resource %>
@@ -39,18 +46,21 @@ as well as a link to its edit page.
<%= t( "helpers.label.#{resource_name}.#{attribute.name}", - default: attribute.name.titleize, + default: page.resource.class.human_attribute_name(attribute.name), ) %>
- <%= render_field attribute, page: page %> - <% if attribute.name == 'admins_group_managers' %> - <%= form_tag(add_admins_group_manager_manager_admins_group_path(admins_group), style: 'margin-top: 1rem;') do %> - <%= email_field_tag(:emails, '', placeholder: 'Emails', autocapitalize: 'off', autocorrect: 'off', spellcheck: 'false', style: 'margin-bottom: 1rem;width:24rem;') %> - + <% if attribute.name == 'gestionnaires' %> + + <%= render( + "collection_gestionnaires", + page: page, + attribute: attribute + ) %> + <% else %> + <%= render_field attribute, page: page %> <% end %> - <% end %>
<% end %> diff --git a/app/views/user_mailer/invite_admins_group_manager.html.haml b/app/views/user_mailer/invite_admins_group_manager.html.haml deleted file mode 100644 index 879f9898f..000000000 --- a/app/views/user_mailer/invite_admins_group_manager.html.haml +++ /dev/null @@ -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" diff --git a/config/env.example b/config/env.example index 05277a328..a3624b572 100644 --- a/config/env.example +++ b/config/env.example @@ -155,6 +155,3 @@ CLAMAV_ENABLED="disabled" # Siret number used for API Entreprise, by default we use SIRET from dinum API_ENTREPRISE_DEFAULT_SIRET="put_your_own_siret" - -# Admins group usage (gestionnaire de groupes d'administrateurs) -ADMINS_GROUP_ENABLED="disabled" \ No newline at end of file diff --git a/config/locales/models/admins_group_manager/fr.yml b/config/locales/models/admins_group_manager/fr.yml deleted file mode 100644 index c6d9b2293..000000000 --- a/config/locales/models/admins_group_manager/fr.yml +++ /dev/null @@ -1,9 +0,0 @@ -fr: - activerecord: - attributes: - admins_group_manager: - admins_groups: Groupes - models: - admins_group_manager: - one: Gestionnaire - other: Gestionnaires diff --git a/config/locales/models/admins_group/fr.yml b/config/locales/models/groupe_gestionnaire/fr.yml similarity index 58% rename from config/locales/models/admins_group/fr.yml rename to config/locales/models/groupe_gestionnaire/fr.yml index 4aeb8b4ba..ef29657cb 100644 --- a/config/locales/models/admins_group/fr.yml +++ b/config/locales/models/groupe_gestionnaire/fr.yml @@ -1,9 +1,9 @@ fr: activerecord: attributes: - admins_group: - admins_group_managers: Gestionnaires + groupe_gestionnaire: + gestionnaires: Gestionnaires models: - admins_group: + groupe_gestionnaire: one: Groupe d'administrateurs other: Groupes d'administrateurs diff --git a/config/locales/views/admins_group_mailer/notify_added_admins_group_managers/en.yml b/config/locales/views/admins_group_mailer/notify_added_admins_group_managers/en.yml deleted file mode 100644 index 95528051d..000000000 --- a/config/locales/views/admins_group_mailer/notify_added_admins_group_managers/en.yml +++ /dev/null @@ -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} »" diff --git a/config/locales/views/admins_group_mailer/notify_added_admins_group_managers/fr.yml b/config/locales/views/admins_group_mailer/notify_added_admins_group_managers/fr.yml deleted file mode 100644 index f63b8007c..000000000 --- a/config/locales/views/admins_group_mailer/notify_added_admins_group_managers/fr.yml +++ /dev/null @@ -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} »." diff --git a/config/locales/views/groupe_gestionnaire_mailer/notify_removed_gestionnaire/en.yml b/config/locales/views/groupe_gestionnaire_mailer/notify_removed_gestionnaire/en.yml new file mode 100644 index 000000000..836737fa6 --- /dev/null +++ b/config/locales/views/groupe_gestionnaire_mailer/notify_removed_gestionnaire/en.yml @@ -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} »" diff --git a/config/locales/views/groupe_gestionnaire_mailer/notify_removed_gestionnaire/fr.yml b/config/locales/views/groupe_gestionnaire_mailer/notify_removed_gestionnaire/fr.yml new file mode 100644 index 000000000..927149552 --- /dev/null +++ b/config/locales/views/groupe_gestionnaire_mailer/notify_removed_gestionnaire/fr.yml @@ -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} »." diff --git a/config/locales/views/manager/en.yml b/config/locales/views/manager/en.yml new file mode 100644 index 000000000..4ff35c232 --- /dev/null +++ b/config/locales/views/manager/en.yml @@ -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 diff --git a/config/locales/views/manager/fr.yml b/config/locales/views/manager/fr.yml index 108d954bd..aea601ee2 100644 --- a/config/locales/views/manager/fr.yml +++ b/config/locales/views/manager/fr.yml @@ -5,3 +5,5 @@ fr: wrong_address: one: "%{emails} n’est pas une adresse email valide" other: "%{emails} ne sont pas des adresses emails valides" + gestionnaires: + manage_root_groupe_gestionnaire: Gestion du groupe racine diff --git a/config/routes.rb b/config/routes.rb index 8404179c1..31ec57ac7 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -57,10 +57,11 @@ Rails.application.routes.draw do 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 - 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 post 'add_gestionnaire', on: :member + delete 'remove_gestionnaire', on: :member end end diff --git a/db/migrate/20230813091837_create_admins_group_managers.rb b/db/migrate/20230813091837_create_admins_group_managers.rb deleted file mode 100644 index b8cb3780c..000000000 --- a/db/migrate/20230813091837_create_admins_group_managers.rb +++ /dev/null @@ -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 diff --git a/db/migrate/20230813091838_create_admins_groups.rb b/db/migrate/20230813091838_create_admins_groups.rb deleted file mode 100644 index 75a38013e..000000000 --- a/db/migrate/20230813091838_create_admins_groups.rb +++ /dev/null @@ -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 diff --git a/db/migrate/20230813091846_add_admins_group_to_administrateurs.rb b/db/migrate/20230813091846_add_admins_group_to_administrateurs.rb deleted file mode 100644 index 52c07d340..000000000 --- a/db/migrate/20230813091846_add_admins_group_to_administrateurs.rb +++ /dev/null @@ -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 diff --git a/db/migrate/20230813091847_add_foreign_key_admins_group_to_administrateurs.rb b/db/migrate/20230813091847_add_foreign_key_admins_group_to_administrateurs.rb deleted file mode 100644 index e155c3a13..000000000 --- a/db/migrate/20230813091847_add_foreign_key_admins_group_to_administrateurs.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddForeignKeyAdminsGroupToAdministrateurs < ActiveRecord::Migration[7.0] - def change - add_foreign_key :administrateurs, :admins_groups, validate: false - end -end diff --git a/db/migrate/20230813091848_validate_foreign_key_admins_group_to_administrateurs.rb b/db/migrate/20230813091848_validate_foreign_key_admins_group_to_administrateurs.rb deleted file mode 100644 index 6af848b01..000000000 --- a/db/migrate/20230813091848_validate_foreign_key_admins_group_to_administrateurs.rb +++ /dev/null @@ -1,5 +0,0 @@ -class ValidateForeignKeyAdminsGroupToAdministrateurs < ActiveRecord::Migration[7.0] - def change - validate_foreign_key :administrateurs, :admins_groups - end -end diff --git a/db/schema.rb b/db/schema.rb index f5e445eeb..e9ba894e6 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -61,7 +61,6 @@ ActiveRecord::Schema[7.0].define(version: 2023_10_10_083144) do end create_table "administrateurs", id: :serial, force: :cascade do |t| - t.bigint "admins_group_id" t.datetime "created_at", precision: 6 t.bigint "groupe_gestionnaire_id" 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" 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| t.bigint "administrateur_id", null: false t.bigint "allowed_procedure_ids", array: true diff --git a/spec/controllers/admins_group_managers/admins_group_manager_controller_spec.rb b/spec/controllers/admins_group_managers/admins_group_manager_controller_spec.rb deleted file mode 100644 index 721188fc1..000000000 --- a/spec/controllers/admins_group_managers/admins_group_manager_controller_spec.rb +++ /dev/null @@ -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 diff --git a/spec/controllers/admins_group_managers/admins_groups_controller_spec.rb b/spec/controllers/admins_group_managers/admins_groups_controller_spec.rb deleted file mode 100644 index 0feaecf17..000000000 --- a/spec/controllers/admins_group_managers/admins_groups_controller_spec.rb +++ /dev/null @@ -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 diff --git a/spec/controllers/gestionnaires/gestionnaire_controller_spec.rb b/spec/controllers/gestionnaires/gestionnaire_controller_spec.rb new file mode 100644 index 000000000..d00115cc8 --- /dev/null +++ b/spec/controllers/gestionnaires/gestionnaire_controller_spec.rb @@ -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 diff --git a/spec/controllers/gestionnaires/groupe_gestionnaires_controller_spec.rb b/spec/controllers/gestionnaires/groupe_gestionnaires_controller_spec.rb new file mode 100644 index 000000000..d47f467b0 --- /dev/null +++ b/spec/controllers/gestionnaires/groupe_gestionnaires_controller_spec.rb @@ -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 diff --git a/spec/controllers/manager/admins_group_managers_controller_spec.rb b/spec/controllers/manager/admins_group_managers_controller_spec.rb deleted file mode 100644 index a732bdee7..000000000 --- a/spec/controllers/manager/admins_group_managers_controller_spec.rb +++ /dev/null @@ -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 diff --git a/spec/controllers/manager/admins_groups_controller_spec.rb b/spec/controllers/manager/admins_groups_controller_spec.rb deleted file mode 100644 index d556ec317..000000000 --- a/spec/controllers/manager/admins_groups_controller_spec.rb +++ /dev/null @@ -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 diff --git a/spec/controllers/manager/gestionnaires_controller_spec.rb b/spec/controllers/manager/gestionnaires_controller_spec.rb new file mode 100644 index 000000000..5357b6def --- /dev/null +++ b/spec/controllers/manager/gestionnaires_controller_spec.rb @@ -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 diff --git a/spec/controllers/manager/groupe_gestionnaires_controller_spec.rb b/spec/controllers/manager/groupe_gestionnaires_controller_spec.rb new file mode 100644 index 000000000..ae52bd02c --- /dev/null +++ b/spec/controllers/manager/groupe_gestionnaires_controller_spec.rb @@ -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 diff --git a/spec/factories/admins_group.rb b/spec/factories/admins_group.rb deleted file mode 100644 index b85b14cd4..000000000 --- a/spec/factories/admins_group.rb +++ /dev/null @@ -1,5 +0,0 @@ -FactoryBot.define do - factory :admins_group do - sequence(:name) { |n| "Group #{n}" } - end -end diff --git a/spec/factories/admins_group_manager.rb b/spec/factories/admins_group_manager.rb deleted file mode 100644 index b8bf34a83..000000000 --- a/spec/factories/admins_group_manager.rb +++ /dev/null @@ -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 diff --git a/spec/mailers/admins_group_mailer_spec.rb b/spec/mailers/admins_group_mailer_spec.rb deleted file mode 100644 index dfb507417..000000000 --- a/spec/mailers/admins_group_mailer_spec.rb +++ /dev/null @@ -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 diff --git a/spec/mailers/groupe_gestionnaire_mailer_spec.rb b/spec/mailers/groupe_gestionnaire_mailer_spec.rb index 0efbf4c4f..1ce585f54 100644 --- a/spec/mailers/groupe_gestionnaire_mailer_spec.rb +++ b/spec/mailers/groupe_gestionnaire_mailer_spec.rb @@ -1,4 +1,17 @@ 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 let(:groupe_gestionnaire) { create(:groupe_gestionnaire) } diff --git a/spec/mailers/previews/admins_group_mailer_preview.rb b/spec/mailers/previews/admins_group_mailer_preview.rb deleted file mode 100644 index 0c92760ef..000000000 --- a/spec/mailers/previews/admins_group_mailer_preview.rb +++ /dev/null @@ -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 diff --git a/spec/mailers/previews/groupe_gestionnaire_mailer_preview.rb b/spec/mailers/previews/groupe_gestionnaire_mailer_preview.rb index e522ee69d..53ce5f929 100644 --- a/spec/mailers/previews/groupe_gestionnaire_mailer_preview.rb +++ b/spec/mailers/previews/groupe_gestionnaire_mailer_preview.rb @@ -1,4 +1,11 @@ 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 groupe_gestionnaire = GroupeGestionnaire.new(name: 'un groupe d\'admin') current_super_admin_email = 'admin@dgfip.com' diff --git a/spec/models/admins_group_manager_spec.rb b/spec/models/admins_group_manager_spec.rb deleted file mode 100644 index 61ca156d0..000000000 --- a/spec/models/admins_group_manager_spec.rb +++ /dev/null @@ -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 diff --git a/spec/models/admins_group_spec.rb b/spec/models/admins_group_spec.rb deleted file mode 100644 index 30d227a4a..000000000 --- a/spec/models/admins_group_spec.rb +++ /dev/null @@ -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 diff --git a/spring-0/6ee76a9c97d4224cf119ff2469a53122.pid b/spring-0/6ee76a9c97d4224cf119ff2469a53122.pid new file mode 100644 index 000000000..45a4fb75d --- /dev/null +++ b/spring-0/6ee76a9c97d4224cf119ff2469a53122.pid @@ -0,0 +1 @@ +8