decidim-cleaner 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE-AGPLv3.txt +661 -0
  3. data/README.md +59 -0
  4. data/Rakefile +40 -0
  5. data/app/commands/decidim/cleaner/admin/update_organization_cleaner.rb +56 -0
  6. data/app/controllers/decidim/cleaner/admin/application_controller.rb +26 -0
  7. data/app/controllers/decidim/cleaner/admin/organization_cleaner_controller.rb +36 -0
  8. data/app/controllers/decidim/cleaner/application_controller.rb +13 -0
  9. data/app/forms/decidim/cleaner/admin/organization_cleaner_form.rb +21 -0
  10. data/app/helpers/decidim/cleaner/application_helper.rb +10 -0
  11. data/app/jobs/decidim/cleaner/clean_admin_logs_job.rb +17 -0
  12. data/app/jobs/decidim/cleaner/clean_inactive_users_job.rb +38 -0
  13. data/app/mailers/decidim/cleaner/inactive_users_mailer.rb +33 -0
  14. data/app/models/decidim/cleaner/application_record.rb +10 -0
  15. data/app/packs/entrypoints/decidim_cleaner.js +2 -0
  16. data/app/packs/images/decidim/cleaner/icon.svg +1 -0
  17. data/app/packs/stylesheets/decidim/cleaner/cleaner.scss +1 -0
  18. data/app/permissions/decidim/cleaner/admin/permissions.rb +23 -0
  19. data/app/views/decidim/cleaner/admin/organization_cleaner/_form.html.erb +39 -0
  20. data/app/views/decidim/cleaner/admin/organization_cleaner/edit.html.erb +6 -0
  21. data/app/views/decidim/cleaner/inactive_users_mailer/warning_deletion.html.erb +7 -0
  22. data/app/views/decidim/cleaner/inactive_users_mailer/warning_inactive.html.erb +7 -0
  23. data/config/assets.rb +9 -0
  24. data/config/i18n-tasks.yml +10 -0
  25. data/config/locales/en.yml +38 -0
  26. data/config/locales/fr.yml +38 -0
  27. data/config/routes.rb +9 -0
  28. data/db/migrate/20230106105014_add_delete_admin_logs_to_organization.rb +8 -0
  29. data/db/migrate/20230110150032_add_delete_inactive_users_to_organization.rb +9 -0
  30. data/lib/decidim/cleaner/admin.rb +10 -0
  31. data/lib/decidim/cleaner/admin_engine.rb +28 -0
  32. data/lib/decidim/cleaner/component.rb +40 -0
  33. data/lib/decidim/cleaner/engine.rb +17 -0
  34. data/lib/decidim/cleaner/test/factories.rb +11 -0
  35. data/lib/decidim/cleaner/version.rb +14 -0
  36. data/lib/decidim/cleaner.rb +12 -0
  37. data/lib/tasks/decidim_cleaner_tasks.rake +13 -0
  38. metadata +98 -0
data/README.md ADDED
@@ -0,0 +1,59 @@
1
+ # Decidim::Cleaner
2
+
3
+ Clean outdated data in Decidim's database.
4
+
5
+ ## Usage
6
+
7
+ This module provides tasks designed to cleanup the outdated data directly in database.
8
+
9
+ ## Installation
10
+
11
+ Add this line to your application's Gemfile:
12
+
13
+ ```ruby
14
+ gem "decidim-cleaner"
15
+ ```
16
+
17
+ And then execute:
18
+
19
+ ```bash
20
+ bundle
21
+ bundle exec rails decidim_cleaner:install:migrations
22
+ bundle exec rails db:migrate
23
+ ```
24
+
25
+ You can then add to your 'config/sidekiq.yml' file:
26
+
27
+ ```yaml
28
+ :schedule:
29
+ CleanAdminLogs:
30
+ cron: "0 9 0 * * *"
31
+ class: Decidim::Cleaner::CleanAdminLogsJob
32
+ queue: scheduled
33
+ CleanInactiveUsers:
34
+ cron: "0 9 0 * * *"
35
+ class: Decidim::Cleaner::CleanInactiveUsersJob
36
+ queue: scheduled
37
+ ```
38
+
39
+ ## Available tasks
40
+
41
+ - [ ] **Delete inactive users**
42
+ - Cron task that checks for user accounts where `last_sign_in_at` is superior to environment variable `CLEANER_USER_INACTIVITY_LIMIT`. If true, deletes inactive user from the database.
43
+
44
+ - [ ] **Delete old admin logs**
45
+ - Cron task that checks for admin logs where `created_at` is anterior to the time you configured in the back office. If true, deletes old admin logs from the database.
46
+
47
+ ## Contributing
48
+
49
+ Contributions are welcome !
50
+
51
+ We expect the contributions to follow the [Decidim's contribution guide](https://github.com/decidim/decidim/blob/develop/CONTRIBUTING.adoc).
52
+
53
+ ## Security
54
+
55
+ Security is very important to us. If you have any issue regarding security, please disclose the information responsibly by sending an email to __security [at] opensourcepolitics [dot] eu__ and not by creating a Github issue.
56
+
57
+ ## License
58
+
59
+ This engine is distributed under the GNU AFFERO GENERAL PUBLIC LICENSE.
data/Rakefile ADDED
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "decidim/dev/common_rake"
4
+
5
+ def install_module(path)
6
+ Dir.chdir(path) do
7
+ system("bundle exec rake decidim_cleaner:install:migrations")
8
+ system("bundle exec rake db:migrate")
9
+ end
10
+ end
11
+
12
+ def seed_db(path)
13
+ Dir.chdir(path) do
14
+ system("bundle exec rake db:seed")
15
+ end
16
+ end
17
+
18
+ desc "Generates a dummy app for testing"
19
+ task test_app: "decidim:generate_external_test_app" do
20
+ ENV["RAILS_ENV"] = "test"
21
+ install_module("spec/decidim_dummy_app")
22
+ end
23
+
24
+ desc "Generates a development app"
25
+ task :development_app do
26
+ Bundler.with_original_env do
27
+ generate_decidim_app(
28
+ "development_app",
29
+ "--app_name",
30
+ "#{base_app_name}_development_app",
31
+ "--path",
32
+ "..",
33
+ "--recreate_db",
34
+ "--demo"
35
+ )
36
+ end
37
+
38
+ install_module("development_app")
39
+ seed_db("development_app")
40
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Cleaner
5
+ module Admin
6
+ # A command with all the business logic for updating the current
7
+ # organization cleaner.
8
+ class UpdateOrganizationCleaner < Rectify::Command
9
+ # Public: Initializes the command.
10
+ #
11
+ # organization - The Organization that will be updated.
12
+ # form - A form object with the params.
13
+ def initialize(organization, form)
14
+ @organization = organization
15
+ @form = form
16
+ end
17
+
18
+ # Executes the command. Broadcasts these events:
19
+ #
20
+ # - :ok when everything is valid.
21
+ # - :invalid if the form wasn't valid and we couldn't proceed.
22
+ #
23
+ # Returns nothing.
24
+ def call
25
+ return broadcast(:invalid) if form.invalid?
26
+
27
+ return broadcast(:ok, @organization) if update_organization
28
+
29
+ broadcast(:invalid)
30
+ end
31
+
32
+ private
33
+
34
+ attr_reader :form, :organization
35
+
36
+ def update_organization
37
+ @organization = Decidim.traceability.update!(
38
+ organization,
39
+ form.current_user,
40
+ attributes
41
+ )
42
+ end
43
+
44
+ def attributes
45
+ {
46
+ delete_admin_logs: form.delete_admin_logs,
47
+ delete_admin_logs_after: form.delete_admin_logs_after,
48
+ delete_inactive_users: form.delete_inactive_users,
49
+ delete_inactive_users_after: form.delete_inactive_users_after,
50
+ delete_inactive_users_email_after: form.delete_inactive_users_email_after
51
+ }
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Cleaner
5
+ module Admin
6
+ # This controller is the abstract class from which all other controllers of
7
+ # this engine inherit.
8
+ #
9
+ # Note that it inherits from `Decidim::Admin::Components::BaseController`, which
10
+ # override its layout and provide all kinds of useful methods.
11
+ class ApplicationController < Decidim::Admin::Components::BaseController
12
+ def permission_class_chain
13
+ [::Decidim::Cleaner::Admin::Permissions] + super
14
+ end
15
+
16
+ def user_not_authorized_path
17
+ decidim.root_path
18
+ end
19
+
20
+ def user_has_no_permission_path
21
+ decidim.root_path
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Cleaner
5
+ module Admin
6
+ # Controller that allows managing the appearance of the organization.
7
+ class OrganizationCleanerController < Decidim::Admin::ApplicationController
8
+ include Decidim::Admin::Engine.routes.url_helpers
9
+ layout "decidim/admin/settings"
10
+
11
+ def edit
12
+ enforce_permission_to :update, :organization, organization: current_organization
13
+ @form = form(OrganizationCleanerForm).from_model(current_organization)
14
+ end
15
+
16
+ def update
17
+ enforce_permission_to :update, :organization, organization: current_organization
18
+ @form = form(OrganizationCleanerForm).from_params(params)
19
+
20
+ UpdateOrganizationCleaner.call(current_organization, @form) do
21
+ on(:ok) do
22
+ flash[:notice] = I18n.t("organization.update.success", scope: "decidim.admin")
23
+
24
+ redirect_to Decidim::Admin::Engine.routes.url_helpers.edit_organization_cleaner_path
25
+ end
26
+
27
+ on(:invalid) do
28
+ flash.now[:alert] = I18n.t("organization.update.error", scope: "decidim.admin")
29
+ render :edit
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Cleaner
5
+ # This controller is the abstract class from which all other controllers of
6
+ # this engine inherit.
7
+ #
8
+ # Note that it inherits from `Decidim::Components::BaseController`, which
9
+ # override its layout and provide all kinds of useful methods.
10
+ class ApplicationController < Decidim::Components::BaseController
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Cleaner
5
+ module Admin
6
+ # A form object used to update the current organization cleaner from the admin
7
+ # dashboard.
8
+ #
9
+ class OrganizationCleanerForm < Form
10
+ mimic :organization
11
+
12
+ attribute :delete_admin_logs, Boolean
13
+ attribute :delete_admin_logs_after, Integer
14
+
15
+ attribute :delete_inactive_users, Boolean
16
+ attribute :delete_inactive_users_after, Integer
17
+ attribute :delete_inactive_users_email_after, Integer
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Cleaner
5
+ # Custom helpers, scoped to the cleaner engine.
6
+ #
7
+ module ApplicationHelper
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Cleaner
5
+ class CleanAdminLogsJob < ApplicationJob
6
+ queue_as :scheduled
7
+
8
+ def perform
9
+ Decidim::Organization.find_each do |organization|
10
+ next unless organization.delete_admin_logs?
11
+
12
+ Decidim::ActionLog.where(organization: organization).where("created_at < ?", Time.zone.now - (organization.delete_admin_logs_after || 365).days).delete_all
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Cleaner
5
+ class CleanInactiveUsersJob < ApplicationJob
6
+ queue_as :scheduled
7
+
8
+ def perform
9
+ Decidim::Organization.find_each do |organization|
10
+ next unless organization.delete_inactive_users?
11
+
12
+ send_warning(Decidim::User.where(organization: organization)
13
+ .where("last_sign_in_at < ?", Time.zone.now - (organization.delete_inactive_users_email_after || 365).days)
14
+ .where("last_sign_in_at > ?", Time.zone.now - (organization.delete_inactive_users_email_after || 365).days - 1.day))
15
+ delete_user_and_send_email(Decidim::User
16
+ .where(organization: organization)
17
+ .where("last_sign_in_at < ?", Time.zone.now - (organization.delete_inactive_users_after || 390).days))
18
+ end
19
+ end
20
+
21
+ def send_warning(users)
22
+ users.each do |user|
23
+ InactiveUsersMailer.warning_inactive(user).deliver_now
24
+ Rails.logger.info "Inactive warning sent to #{user.email}"
25
+ end
26
+ end
27
+
28
+ def delete_user_and_send_email(users)
29
+ users.each do |user|
30
+ InactiveUsersMailer.warning_deletion(user).deliver_now
31
+ Rails.logger.info "Deletion warning sent to #{user.email}"
32
+ user.delete
33
+ Rails.logger.info "User #{user.email} deleted"
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Cleaner
5
+ # A custom mailer for Decidim so we can notify users
6
+ # when their account was blocked
7
+ class InactiveUsersMailer < Decidim::ApplicationMailer
8
+ def warning_inactive(user)
9
+ with_user(user) do
10
+ @user = user
11
+ @organization = user.organization
12
+ subject = I18n.t(
13
+ "decidim.cleaner.inactive_users_mailer.warning_inactive.subject",
14
+ organization_name: @organization.name
15
+ )
16
+ mail(to: user.email, subject: subject)
17
+ end
18
+ end
19
+
20
+ def warning_deletion(user)
21
+ with_user(user) do
22
+ @user = user
23
+ @organization = user.organization
24
+ subject = I18n.t(
25
+ "decidim.cleaner.inactive_users_mailer.warning_deletion.subject",
26
+ organization_name: @organization.name
27
+ )
28
+ mail(to: user.email, subject: subject)
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Cleaner
5
+ # Abstract class from which all models in this engine inherit.
6
+ class ApplicationRecord < ActiveRecord::Base
7
+ self.abstract_class = true
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,2 @@
1
+ // Images
2
+ require.context("../images", true)
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 35 35"><path d="M17.5 35A17.5 17.5 0 1 1 35 17.5 17.52 17.52 0 0 1 17.5 35zm0-33.06A15.56 15.56 0 1 0 33.06 17.5 15.57 15.57 0 0 0 17.5 1.94zm9.5 13.7H8a1 1 0 0 1 0-1.94h19a1 1 0 0 1 0 1.94zm0 3.68H8a1 1 0 0 1 0-1.94h19a1 1 0 0 1 0 1.94zM22.26 23H8a1 1 0 0 1 0-1.94h14.26a1 1 0 0 1 0 1.94z"/></svg>
@@ -0,0 +1 @@
1
+ /* css for decidim_cleaner */
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Cleaner
5
+ module Admin
6
+ class Permissions < Decidim::DefaultPermissions
7
+ def permissions
8
+ return permission_action if permission_action.scope != :admin
9
+ return permission_action unless user&.admin?
10
+
11
+ allow! if can_access?
12
+
13
+ permission_action
14
+ end
15
+
16
+ def can_access?
17
+ permission_action.subject == :cleaner &&
18
+ permission_action.action == :read
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,39 @@
1
+ <div class="card">
2
+ <div class="card-divider">
3
+ <h2 class="card-title"><%= t ".admin_log_cleaner_title" %></h2>
4
+ </div>
5
+ <div class="card-section">
6
+ <div class="row">
7
+ <div class="columns xlarge-6 slug">
8
+ <%= form.check_box :delete_admin_logs %>
9
+ </div>
10
+
11
+ <div class="columns xlarge-6">
12
+ <%= form.number_field :delete_admin_logs_after %>
13
+ </div>
14
+ </div>
15
+ </div>
16
+ </div>
17
+
18
+ <div class="card">
19
+ <div class="card-divider">
20
+ <h2 class="card-title"><%= t ".inactive_users_cleaner_title" %></h2>
21
+ </div>
22
+ <div class="card-section">
23
+ <div class="row">
24
+ <div class="columns xlarge-6 slug">
25
+ <%= form.check_box :delete_inactive_users %>
26
+ </div>
27
+
28
+ <div class="columns xlarge-6">
29
+ <%= form.number_field :delete_inactive_users_email_after %>
30
+ </div>
31
+
32
+ <div class="columns xlarge-6">
33
+ <%= form.number_field :delete_inactive_users_after %>
34
+ </div>
35
+ </div>
36
+ </div>
37
+ </div>
38
+
39
+
@@ -0,0 +1,6 @@
1
+ <%= decidim_form_for(@form, html: { class: "form edit_organization_cleaner" }, url:"/admin/organization/cleaner" , method: :put) do |f| %>
2
+ <%= render partial: "form", object: f %>
3
+ <div class="button--double form-general-submit">
4
+ <%= f.submit t(".update") %>
5
+ </div>
6
+ <% end %>
@@ -0,0 +1,7 @@
1
+ <p class="email-greeting"><%= t ".hello" %></p>
2
+
3
+ <p class="email-instructions"><%= t(".body_1", organization_name: h(@organization.name), organization_url: decidim.root_url(host: @organization.host), days: @organization.delete_inactive_users_after||390).html_safe %></p>
4
+
5
+ <p class="email-instructions"><%= t ".body_2" %></p>
6
+
7
+ <p class="email-closing"><%= t(".greetings", organization_name: h(@organization.name), organization_url: decidim.root_url(host: @organization.host)).html_safe %></p>
@@ -0,0 +1,7 @@
1
+ <p class="email-greeting"><%= t ".hello" %></p>
2
+
3
+ <p class="email-instructions"><%= t ".body_1", organization_name: h(@organization.name), days: @organization.delete_inactive_users_email_after %></p>
4
+
5
+ <p class="email-instructions"><%= t(".body_2", remaining_days: (@organization.delete_inactive_users_after||390) - (@organization.delete_inactive_users_email_after||365), organization_url: decidim.root_url(host: @organization.host)).html_safe %></p>
6
+
7
+ <p class="email-closing"><%= t(".greetings", organization_name: h(@organization.name), organization_url: decidim.root_url(host: @organization.host)).html_safe %></p>
data/config/assets.rb ADDED
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ base_path = File.expand_path("..", __dir__)
4
+
5
+ Decidim::Webpacker.register_path("#{base_path}/app/packs")
6
+ Decidim::Webpacker.register_entrypoints(
7
+ decidim_cleaner: "#{base_path}/app/packs/entrypoints/decidim_cleaner.js"
8
+ )
9
+ Decidim::Webpacker.register_stylesheet_import("stylesheets/decidim/cleaner/cleaner")
@@ -0,0 +1,10 @@
1
+ ---
2
+
3
+ base_locale: en
4
+ locales: [en]
5
+
6
+ ignore_unused:
7
+ - "decidim.components.cleaner.name"
8
+
9
+ ignore_missing:
10
+ - decidim.participatory_processes.scopes.global
@@ -0,0 +1,38 @@
1
+ ---
2
+ en:
3
+ activemodel:
4
+ attributes:
5
+ organization:
6
+ delete_admin_logs: Enable admin logs deletion
7
+ delete_admin_logs_after: Delete admin logs after (days, default 365)
8
+ delete_inactive_users: Enable inactive users deletion
9
+ delete_inactive_users_after: Delete inactive users after (days, default 390)
10
+ delete_inactive_users_email_after: Send email to inactive users before deletion (days, default 365)
11
+ decidim:
12
+ admin:
13
+ menu:
14
+ clean: Data cleaner
15
+ cleaner:
16
+ admin:
17
+ organization_cleaner:
18
+ edit:
19
+ update: Update
20
+ form:
21
+ admin_log_cleaner_title: Admin log
22
+ inactive_users_cleaner_title: Inactive users
23
+ inactive_users_mailer:
24
+ warning_deletion:
25
+ body_1: You are inactive since %{days} days on <a href="%{organization_url}"> %{organization_name} </a>.
26
+ body_2: As a result, your account has been deleted.
27
+ greetings: Greetings,<br/>%{organization_name}<br/><a href="%{organization_url}">%{organization_url}</a>
28
+ hello: Hello
29
+ subject: Your account has been deleted
30
+ warning_inactive:
31
+ body_1: You are inactive since %{days} days on %{organization_name}.
32
+ body_2: <a href="%{organization_url}">If no reaction within %{remaining_days} days </a>, your account will be deleted.
33
+ greetings: Greetings,<br/>%{organization_name}<br/><a href="%{organization_url}">%{organization_url}</a>
34
+ hello: Hello
35
+ subject: Your account is inactive
36
+ components:
37
+ cleaner:
38
+ name: Cleaner
@@ -0,0 +1,38 @@
1
+ ---
2
+ fr:
3
+ activemodel:
4
+ attributes:
5
+ organization:
6
+ delete_admin_logs: Activer la suppression de l'historique d'administration
7
+ delete_admin_logs_after: Supprimer l'historique d'administration après (jours, par défaut 365)
8
+ delete_inactive_users: Activer la suppression des utilisateurs inactifs
9
+ delete_inactive_users_after: Supprimer les utilisateurs inactifs après (jours, par défaut 390)
10
+ delete_inactive_users_email_after: Envoyer un courriel aux utilisateurs inactifs avant la suppression (jours, par défaut 365)
11
+ decidim:
12
+ admin:
13
+ menu:
14
+ clean: Nettoyeur de données
15
+ cleaner:
16
+ admin:
17
+ organization_cleaner:
18
+ edit:
19
+ update: Mettre à jour
20
+ form:
21
+ admin_log_cleaner_title: Historique d'administration
22
+ inactive_users_cleaner_title: Utilisateurs inactifs
23
+ inactive_users_mailer:
24
+ warning_deletion:
25
+ body_1: Vous êtes inactif depuis %{days} jours sur <a href="%{organization_url}"> %{organization_name} </a>.
26
+ body_2: Par conséquent, votre compte a été supprimé.
27
+ greetings: Cordialement,<br/>%{organization_name}<br/><a href="%{organization_url}">%{organization_url}</a>
28
+ hello: Bonjour
29
+ subject: Votre compte a été supprimé
30
+ warning_inactive:
31
+ body_1: Vous êtes inactif depuis %{days} jours sur %{organization_name}.
32
+ body_2: <a href="%{organization_url}">Si aucune réaction dans les %{remaining_days} jours</a>, votre compte sera supprimé.
33
+ greetings: Cordialement,<br/>%{organization_name}<br/><a href="%{organization_url}">%{organization_url}</a>
34
+ hello: Bonjour
35
+ subject: Votre compte est inactif
36
+ components:
37
+ cleaner:
38
+ name: Nettoyeur
data/config/routes.rb ADDED
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ # frozen_string_litteral: true
4
+
5
+ Decidim::Admin::Engine.routes.draw do
6
+ resource :organization, controller: "organization" do
7
+ resource :cleaner, only: [:edit, :update], controller: "/decidim/cleaner/admin/organization_cleaner"
8
+ end
9
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddDeleteAdminLogsToOrganization < ActiveRecord::Migration[6.0]
4
+ def change
5
+ add_column :decidim_organizations, :delete_admin_logs, :boolean, default: false, null: false
6
+ add_column :decidim_organizations, :delete_admin_logs_after, :integer
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddDeleteInactiveUsersToOrganization < ActiveRecord::Migration[6.0]
4
+ def change
5
+ add_column :decidim_organizations, :delete_inactive_users, :boolean, default: false, null: false
6
+ add_column :decidim_organizations, :delete_inactive_users_email_after, :integer
7
+ add_column :decidim_organizations, :delete_inactive_users_after, :integer
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Cleaner
5
+ # This module contains all the domain logic associated to Decidim's Cleaner
6
+ # component admin panel.
7
+ module Admin
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Cleaner
5
+ # This is the engine that runs on the public interface of `Cleaner`.
6
+ class AdminEngine < ::Rails::Engine
7
+ isolate_namespace Decidim::Cleaner::Admin
8
+
9
+ paths["db/migrate"] = nil
10
+ paths["lib/tasks"] = nil
11
+
12
+ initializer "decidim_admin.admin_settings_menu" do
13
+ Decidim.menu :admin_settings_menu do |menu|
14
+ menu.add_item :clean_organization,
15
+ I18n.t("menu.clean", scope: "decidim.admin"),
16
+ decidim_admin.edit_organization_cleaner_path,
17
+ position: 1.8,
18
+ if: allowed_to?(:update, :organization, organization: current_organization),
19
+ active: is_active_link?(decidim_admin.edit_organization_cleaner_path)
20
+ end
21
+ end
22
+
23
+ def load_seed
24
+ nil
25
+ end
26
+ end
27
+ end
28
+ end