decidim-stratified_sortitions 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.
- checksums.yaml +7 -0
- data/LICENSE-AGPLv3.txt +661 -0
- data/README.md +91 -0
- data/Rakefile +42 -0
- data/app/cells/decidim/stratified_sortitions/stratified_sortition_cell.rb +21 -0
- data/app/cells/decidim/stratified_sortitions/stratified_sortition_l_cell.rb +22 -0
- data/app/cells/decidim/stratified_sortitions/stratified_sortition_metadata_cell.rb +63 -0
- data/app/commands/decidim/stratified_sortitions/admin/create_stratified_sortition.rb +84 -0
- data/app/commands/decidim/stratified_sortitions/admin/destroy_stratified_sortition.rb +49 -0
- data/app/commands/decidim/stratified_sortitions/admin/duplicate_stratified_sortition.rb +74 -0
- data/app/commands/decidim/stratified_sortitions/admin/import_sample.rb +40 -0
- data/app/commands/decidim/stratified_sortitions/admin/remove_uploaded_samples.rb +53 -0
- data/app/commands/decidim/stratified_sortitions/admin/update_stratified_sortition.rb +174 -0
- data/app/controllers/concerns/decidim/stratified_sortitions/orderable_stratified_sortitions.rb +37 -0
- data/app/controllers/concerns/decidim/stratified_sortitions/strata_charts_data.rb +91 -0
- data/app/controllers/decidim/stratified_sortitions/admin/application_controller.rb +19 -0
- data/app/controllers/decidim/stratified_sortitions/admin/samples_controller.rb +143 -0
- data/app/controllers/decidim/stratified_sortitions/admin/stratified_sortitions_controller.rb +235 -0
- data/app/controllers/decidim/stratified_sortitions/application_controller.rb +13 -0
- data/app/controllers/decidim/stratified_sortitions/charts_pdf_controller_helper.rb +17 -0
- data/app/controllers/decidim/stratified_sortitions/stratified_sortitions_controller.rb +61 -0
- data/app/forms/decidim/stratified_sortitions/admin/sample_upload_form.rb +15 -0
- data/app/forms/decidim/stratified_sortitions/admin/stratified_sortitions_form.rb +155 -0
- data/app/forms/decidim/stratified_sortitions/admin/stratum_form.rb +69 -0
- data/app/forms/decidim/stratified_sortitions/admin/substratum_form.rb +26 -0
- data/app/helpers/decidim/stratified_sortitions/admin/stratified_sortitions_helper.rb +18 -0
- data/app/helpers/decidim/stratified_sortitions/application_helper.rb +85 -0
- data/app/helpers/decidim/stratified_sortitions/charts_pdf_helper.rb +73 -0
- data/app/helpers/decidim/stratified_sortitions/stratified_sortition_cells_helper.rb +56 -0
- data/app/javascript/channels/sample_import_progress.js +12 -0
- data/app/jobs/decidim/stratified_sortitions/admin/execute_sortition_job.rb +21 -0
- data/app/jobs/decidim/stratified_sortitions/admin/import_sample_job.rb +170 -0
- data/app/jobs/decidim/stratified_sortitions/admin/remove_samples_job.rb +19 -0
- data/app/jobs/decidim/stratified_sortitions/admin/sortition_results_export_job.rb +28 -0
- data/app/mailers/decidim/stratified_sortitions/admin/import_mailer.rb +26 -0
- data/app/models/decidim/stratified_sortitions/application_record.rb +9 -0
- data/app/models/decidim/stratified_sortitions/panel_portfolio.rb +165 -0
- data/app/models/decidim/stratified_sortitions/sample_import.rb +14 -0
- data/app/models/decidim/stratified_sortitions/sample_participant.rb +12 -0
- data/app/models/decidim/stratified_sortitions/sample_participant_stratum.rb +11 -0
- data/app/models/decidim/stratified_sortitions/stratified_sortition.rb +74 -0
- data/app/models/decidim/stratified_sortitions/stratum.rb +22 -0
- data/app/models/decidim/stratified_sortitions/substratum.rb +19 -0
- data/app/packs/entrypoints/decidim_stratified_sortitions.js +10 -0
- data/app/packs/entrypoints/decidim_stratified_sortitions_admin.js +9 -0
- data/app/packs/entrypoints/decidim_stratified_sortitions_admin.scss +1 -0
- data/app/packs/images/decidim/stratified_sortitions/icon.svg +1 -0
- data/app/packs/src/decidim/stratified_sortitions/application.js +3 -0
- data/app/packs/src/decidim/stratified_sortitions/results_tabs.js +59 -0
- data/app/packs/src/decidim/stratified_sortitions/stratum_fields.js +302 -0
- data/app/packs/src/decidim/stratified_sortitions/substratum_fields.js +165 -0
- data/app/packs/src/decidim/stratified_sortitions/upload_sample.js +16 -0
- data/app/packs/stylesheets/decidim/stratified_sortitions/admin/stratified_sortitions.scss +210 -0
- data/app/packs/stylesheets/decidim/stratified_sortitions/charts_pdf.scss +148 -0
- data/app/packs/stylesheets/stratified_sortitions.scss +56 -0
- data/app/permissions/decidim/stratified_sortitions/admin/permissions.rb +74 -0
- data/app/permissions/decidim/stratified_sortitions/permissions.rb +23 -0
- data/app/presenters/decidim/stratified_sortitions/admin_log/stratified_sortition_presenter.rb +35 -0
- data/app/queries/decidim/stratified_sortitions/filtered_stratified_sortitions.rb +39 -0
- data/app/serializers/decidim/stratified_sortitions/sortition_result_serializer.rb +116 -0
- data/app/services/decidim/stratified_sortitions/charts_pdf_generator.rb +96 -0
- data/app/services/decidim/stratified_sortitions/fair_sortition_service.rb +247 -0
- data/app/services/decidim/stratified_sortitions/leximin/constraint_builder.rb +180 -0
- data/app/services/decidim/stratified_sortitions/leximin/distribution_solver.rb +217 -0
- data/app/services/decidim/stratified_sortitions/leximin/feasibility_checker.rb +222 -0
- data/app/services/decidim/stratified_sortitions/leximin/panel_generator.rb +149 -0
- data/app/services/decidim/stratified_sortitions/leximin/panel_sampler.rb +125 -0
- data/app/services/decidim/stratified_sortitions/leximin_selector.rb +136 -0
- data/app/services/decidim/stratified_sortitions/sortition_results_exporter.rb +161 -0
- data/app/views/decidim/admin/components/index.html.erb +54 -0
- data/app/views/decidim/stratified_sortitions/admin/import_mailer/import.html.erb +22 -0
- data/app/views/decidim/stratified_sortitions/admin/stratified_sortitions/_confirm_execute_modal.html.erb +19 -0
- data/app/views/decidim/stratified_sortitions/admin/stratified_sortitions/_confirm_participants_modal.html.erb +20 -0
- data/app/views/decidim/stratified_sortitions/admin/stratified_sortitions/_form.html.erb +55 -0
- data/app/views/decidim/stratified_sortitions/admin/stratified_sortitions/_navigation_menu.html.erb +10 -0
- data/app/views/decidim/stratified_sortitions/admin/stratified_sortitions/_strata.html.erb +22 -0
- data/app/views/decidim/stratified_sortitions/admin/stratified_sortitions/_stratum.html.erb +75 -0
- data/app/views/decidim/stratified_sortitions/admin/stratified_sortitions/_substrata.html.erb +34 -0
- data/app/views/decidim/stratified_sortitions/admin/stratified_sortitions/_substratum.html.erb +54 -0
- data/app/views/decidim/stratified_sortitions/admin/stratified_sortitions/edit.html.erb +21 -0
- data/app/views/decidim/stratified_sortitions/admin/stratified_sortitions/execute.html.erb +155 -0
- data/app/views/decidim/stratified_sortitions/admin/stratified_sortitions/export_charts_pdf.html.erb +38 -0
- data/app/views/decidim/stratified_sortitions/admin/stratified_sortitions/index.html.erb +75 -0
- data/app/views/decidim/stratified_sortitions/admin/stratified_sortitions/new.html.erb +21 -0
- data/app/views/decidim/stratified_sortitions/admin/stratified_sortitions/upload_sample.html.erb +117 -0
- data/app/views/decidim/stratified_sortitions/shared/_strata_charts.html.erb +21 -0
- data/app/views/decidim/stratified_sortitions/stratified_sortitions/_results_count.html.erb +15 -0
- data/app/views/decidim/stratified_sortitions/stratified_sortitions/_stratified_sortition.html.erb +1 -0
- data/app/views/decidim/stratified_sortitions/stratified_sortitions/_stratified_sortitions.html.erb +13 -0
- data/app/views/decidim/stratified_sortitions/stratified_sortitions/_tags.html.erb +9 -0
- data/app/views/decidim/stratified_sortitions/stratified_sortitions/index.html.erb +22 -0
- data/app/views/decidim/stratified_sortitions/stratified_sortitions/index.js.erb +5 -0
- data/app/views/decidim/stratified_sortitions/stratified_sortitions/show.html.erb +142 -0
- data/app/views/layouts/decidim/admin/_sidebar_menu.html.erb +45 -0
- data/app/views/layouts/decidim/stratified_sortitions/charts_pdf.html.erb +14 -0
- data/config/assets.rb +24 -0
- data/config/locales/ca.yml +361 -0
- data/config/locales/en.yml +360 -0
- data/config/locales/es.yml +360 -0
- data/config/locales/oc.yml +2 -0
- data/config/routes.rb +1 -0
- data/db/migrate/20251023103900_create_decidim_stratified_sortitions_stratified_sortitions.rb +18 -0
- data/db/migrate/20251104120000_create_stratified_sortitions_strata_and_substrata.decidim_stratified_sortitions.rb +27 -0
- data/db/migrate/20251219120000_create_sample_imports.rb +17 -0
- data/db/migrate/20251219120100_create_sample_participants.rb +19 -0
- data/db/migrate/20251219120200_create_sample_participant_strata.rb +16 -0
- data/db/migrate/20251230130000_change_value_to_text_in_substrata.rb +11 -0
- data/db/migrate/20260102114744_add_status_to_stratified_sortitions.rb +11 -0
- data/db/migrate/20260109105643_allow_null_value_in_substrata.rb +10 -0
- data/db/migrate/20260113121726_add_position_to_strata_and_substrata.rb +8 -0
- data/db/migrate/20260127100000_rename_weighing_to_max_quota_percentage.rb +12 -0
- data/db/migrate/20260127120000_create_panel_portfolios.rb +46 -0
- data/db/migrate/20260518000000_add_foreign_key_to_stratified_sortitions_component.rb +10 -0
- data/db/migrate/20260521000000_add_cascade_to_stratified_sortitions_foreign_keys.rb +64 -0
- data/db/migrate/20260616000000_add_execution_error_to_stratified_sortitions.rb +11 -0
- data/lib/decidim/stratified_sortitions/admin.rb +10 -0
- data/lib/decidim/stratified_sortitions/admin_engine.rb +49 -0
- data/lib/decidim/stratified_sortitions/component.rb +41 -0
- data/lib/decidim/stratified_sortitions/engine.rb +34 -0
- data/lib/decidim/stratified_sortitions/seeds.rb +24 -0
- data/lib/decidim/stratified_sortitions/test/factories.rb +80 -0
- data/lib/decidim/stratified_sortitions/version.rb +13 -0
- data/lib/decidim/stratified_sortitions.rb +29 -0
- metadata +222 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class AddExecutionErrorToStratifiedSortitions < ActiveRecord::Migration[7.0]
|
|
4
|
+
def up
|
|
5
|
+
add_column :decidim_stratified_sortitions_stratified_sortitions, :execution_error, :text
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def down
|
|
9
|
+
remove_column :decidim_stratified_sortitions_stratified_sortitions, :execution_error
|
|
10
|
+
end
|
|
11
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "chartkick"
|
|
4
|
+
|
|
5
|
+
module Decidim
|
|
6
|
+
module StratifiedSortitions
|
|
7
|
+
# This is the engine that runs on the administration interface of `decidim_stratified_sortitions`.
|
|
8
|
+
# It mostly handles rendering the created projects associated to a participatory
|
|
9
|
+
# process.
|
|
10
|
+
class AdminEngine < ::Rails::Engine
|
|
11
|
+
isolate_namespace Decidim::StratifiedSortitions::Admin
|
|
12
|
+
|
|
13
|
+
paths["db/migrate"] = nil
|
|
14
|
+
paths["lib/tasks"] = nil
|
|
15
|
+
|
|
16
|
+
routes do
|
|
17
|
+
resources :stratified_sortitions do
|
|
18
|
+
post :duplicate, on: :member
|
|
19
|
+
get :upload_sample, on: :member
|
|
20
|
+
post :process_sample, on: :member
|
|
21
|
+
get :execute, on: :member
|
|
22
|
+
post :execute_stratified_sortition, on: :member
|
|
23
|
+
post :export_results, on: :member
|
|
24
|
+
post :export_charts_pdf, on: :member
|
|
25
|
+
post :log_view_participants, on: :member
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
resources :samples, only: [:show, :create] do
|
|
29
|
+
collection do
|
|
30
|
+
get :download_template
|
|
31
|
+
delete :remove_multiple
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
root to: "stratified_sortitions#index"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
initializer "decidim_sstratified_sortitions_admin.mount_routes" do |_app|
|
|
39
|
+
Decidim::Core::Engine.routes do
|
|
40
|
+
mount Decidim::StratifiedSortitions::AdminEngine, at: "/admin", as: "decidim_admin_stratified_sortitions"
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def load_seed
|
|
45
|
+
nil
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_dependency "decidim/components/namer"
|
|
4
|
+
require "decidim/stratified_sortitions/admin"
|
|
5
|
+
require "decidim/stratified_sortitions/engine"
|
|
6
|
+
require "decidim/stratified_sortitions/admin_engine"
|
|
7
|
+
|
|
8
|
+
Decidim.register_component(:stratified_sortitions) do |component|
|
|
9
|
+
component.engine = Decidim::StratifiedSortitions::Engine
|
|
10
|
+
component.stylesheet = "decidim/stratified_sortitions/stratified_sortitions"
|
|
11
|
+
component.admin_engine = Decidim::StratifiedSortitions::AdminEngine
|
|
12
|
+
component.icon = "media/images/decidim_stratified_sortitions.svg"
|
|
13
|
+
|
|
14
|
+
component.on(:before_destroy) do |instance|
|
|
15
|
+
Decidim::StratifiedSortitions::StratifiedSortition.where(decidim_component_id: instance.id).find_each(&:destroy!)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
component.permissions_class_name = "Decidim::StratifiedSortitions::Permissions"
|
|
19
|
+
|
|
20
|
+
# These actions permissions can be configured in the admin panel
|
|
21
|
+
# component.actions = %w()
|
|
22
|
+
|
|
23
|
+
component.settings(:global) do |settings|
|
|
24
|
+
settings.attribute :publish_sortitions, type: :boolean, default: true
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
component.settings(:step) do |settings|
|
|
28
|
+
settings.attribute :announcement, type: :text, translated: true, editor: true
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
component.register_resource(:stratified_sortition) do |resource|
|
|
32
|
+
# Register a optional resource that can be references from other resources.
|
|
33
|
+
resource.model_class_name = "Decidim::StratifiedSortitions::StratifiedSortition"
|
|
34
|
+
resource.card = "decidim/stratified_sortitions/stratified_sortition"
|
|
35
|
+
resource.searchable = true
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
component.register_stat :sortitions_count, primary: true, priority: Decidim::StatsRegistry::HIGH_PRIORITY do |components, start_at, end_at|
|
|
39
|
+
Decidim::StratifiedSortitions::FilteredStratifiedSortitions.for(components, start_at, end_at).count
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rails"
|
|
4
|
+
require "active_support/all"
|
|
5
|
+
require "chartkick"
|
|
6
|
+
|
|
7
|
+
require "decidim/core"
|
|
8
|
+
|
|
9
|
+
module Decidim
|
|
10
|
+
module StratifiedSortitions
|
|
11
|
+
# Decidim's StratifiedSortitions Rails Engine.
|
|
12
|
+
class Engine < ::Rails::Engine
|
|
13
|
+
isolate_namespace Decidim::StratifiedSortitions
|
|
14
|
+
|
|
15
|
+
routes do
|
|
16
|
+
resources :stratified_sortitions, only: [:index, :show]
|
|
17
|
+
scope "/stratified_sortitions" do
|
|
18
|
+
root to: "stratified_sortitions#index"
|
|
19
|
+
end
|
|
20
|
+
get "/", to: redirect("stratified_sortitions", status: 301)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
initializer "decidim_stratified_sortitions.register_icons" do
|
|
24
|
+
Decidim.icons.register(name: "seedling-line", icon: "seedling-line", category: "system", description: "", engine: :stratified_sortitions)
|
|
25
|
+
Decidim.icons.register(name: "bar-chart-box-line", icon: "bar-chart-box-line", category: "system", description: "", engine: :stratified_sortitions)
|
|
26
|
+
Decidim.icons.register(name: "group-line", icon: "group-line", category: "system", description: "", engine: :stratified_sortitions)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
initializer "StratifiedSortitions.webpacker.assets_path" do
|
|
30
|
+
Decidim.register_assets_path File.expand_path("app/packs", root)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "decidim/components/namer"
|
|
4
|
+
|
|
5
|
+
module Decidim
|
|
6
|
+
module StratifiedSortitions
|
|
7
|
+
class Seeds
|
|
8
|
+
attr_reader :participatory_space
|
|
9
|
+
|
|
10
|
+
def initialize(participatory_space:)
|
|
11
|
+
@participatory_space = participatory_space
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def call
|
|
15
|
+
Decidim::Component.create!(
|
|
16
|
+
name: Decidim::Components::Namer.new(participatory_space.organization.available_locales, :stratified_sortitions).i18n_name,
|
|
17
|
+
manifest_name: :stratified_sortitions,
|
|
18
|
+
published_at: Time.current,
|
|
19
|
+
participatory_space:
|
|
20
|
+
)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "decidim/components/namer"
|
|
4
|
+
require "decidim/faker/localized"
|
|
5
|
+
require "decidim/core/test/factories"
|
|
6
|
+
|
|
7
|
+
FactoryBot.define do
|
|
8
|
+
# Singular alias factory expected by specs (some tests call :stratified_sortition_component)
|
|
9
|
+
factory :stratified_sortition_component, parent: :component do
|
|
10
|
+
name { Decidim::Components::Namer.new(participatory_space.organization.available_locales, :stratified_sortitions).i18n_name }
|
|
11
|
+
manifest_name { :stratified_sortitions }
|
|
12
|
+
participatory_space { association(:participatory_process, :with_steps) }
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
factory :stratified_sortition, class: "Decidim::StratifiedSortitions::StratifiedSortition" do
|
|
16
|
+
title { generate_localized_title }
|
|
17
|
+
description { Decidim::Faker::Localized.wrapped("<p>", "</p>") { generate_localized_title } }
|
|
18
|
+
selection_criteria { Decidim::Faker::Localized.wrapped("<p>", "</p>") { Decidim::Faker::Localized.sentence(word_count: 4) } }
|
|
19
|
+
selected_profiles_description { Decidim::Faker::Localized.wrapped("<p>", "</p>") { Decidim::Faker::Localized.sentence(word_count: 4) } }
|
|
20
|
+
num_candidates { rand(1..10) }
|
|
21
|
+
component { association(:stratified_sortition_component) }
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
factory :stratum, class: "Decidim::StratifiedSortitions::Stratum" do
|
|
25
|
+
sequence(:name) { |n| { en: "Stratum #{n}" } }
|
|
26
|
+
kind { "value" }
|
|
27
|
+
stratified_sortition { association(:stratified_sortition) }
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
factory :substratum, class: "Decidim::StratifiedSortitions::Substratum" do
|
|
31
|
+
sequence(:name) { |n| { en: "Substratum #{n}" } }
|
|
32
|
+
value { "A" }
|
|
33
|
+
range { "0-10" }
|
|
34
|
+
max_quota_percentage { "10" }
|
|
35
|
+
stratum { association(:stratum) }
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
factory :sample_import, class: "Decidim::StratifiedSortitions::SampleImport" do
|
|
39
|
+
stratified_sortition { association(:stratified_sortition) }
|
|
40
|
+
filename { "sample.csv" }
|
|
41
|
+
status { :processing }
|
|
42
|
+
total_rows { 0 }
|
|
43
|
+
imported_rows { 0 }
|
|
44
|
+
failed_rows { 0 }
|
|
45
|
+
import_errors { {} }
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
factory :sample_participant, class: "Decidim::StratifiedSortitions::SampleParticipant" do
|
|
49
|
+
sequence(:personal_data_1) { |n| "ID#{n}" }
|
|
50
|
+
personal_data_2 { "Data 2" }
|
|
51
|
+
personal_data_3 { "Data 3" }
|
|
52
|
+
personal_data_4 { "Data 4" }
|
|
53
|
+
decidim_stratified_sortition { association(:stratified_sortition) }
|
|
54
|
+
decidim_stratified_sortitions_sample_import { association(:sample_import) }
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
factory :sample_participant_stratum, class: "Decidim::StratifiedSortitions::SampleParticipantStratum" do
|
|
58
|
+
decidim_stratified_sortitions_sample_participant { association(:sample_participant) }
|
|
59
|
+
decidim_stratified_sortitions_stratum { association(:stratum) }
|
|
60
|
+
decidim_stratified_sortitions_substratum { association(:substratum) }
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
factory :panel_portfolio, class: "Decidim::StratifiedSortitions::PanelPortfolio" do
|
|
64
|
+
stratified_sortition { association(:stratified_sortition) }
|
|
65
|
+
panels { [[1, 2, 3], [4, 5, 6]] }
|
|
66
|
+
probabilities { [0.6, 0.4] }
|
|
67
|
+
selection_probabilities { { 1 => 0.6, 2 => 0.6, 3 => 0.6, 4 => 0.4, 5 => 0.4, 6 => 0.4 } }
|
|
68
|
+
generated_at { Time.current }
|
|
69
|
+
generation_time_seconds { 1.5 }
|
|
70
|
+
num_iterations { 10 }
|
|
71
|
+
convergence_achieved { true }
|
|
72
|
+
|
|
73
|
+
trait :sampled do
|
|
74
|
+
selected_panel_index { 0 }
|
|
75
|
+
selected_at { Time.current }
|
|
76
|
+
verification_seed { "test_seed" }
|
|
77
|
+
random_value_used { 0.3 }
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "decidim/stratified_sortitions/admin"
|
|
4
|
+
require "decidim/stratified_sortitions/engine"
|
|
5
|
+
require "decidim/stratified_sortitions/admin_engine"
|
|
6
|
+
require "decidim/stratified_sortitions/component"
|
|
7
|
+
|
|
8
|
+
module Decidim
|
|
9
|
+
# Base module for this engine.
|
|
10
|
+
module StratifiedSortitions
|
|
11
|
+
include ActiveSupport::Configurable
|
|
12
|
+
|
|
13
|
+
# Public setting that defines how many elements will be shown
|
|
14
|
+
# per page inside the administration view.
|
|
15
|
+
config_accessor :items_per_page do
|
|
16
|
+
15
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
config_accessor :leximin_algorithm do
|
|
20
|
+
"https://www.nature.com/articles/s41586-021-03788-6"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def self.derive_random_seed(seed)
|
|
24
|
+
return nil unless seed
|
|
25
|
+
|
|
26
|
+
Digest::SHA256.hexdigest(seed).to_i(16) % (2**31)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: decidim-stratified_sortitions
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.0.1
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Oliver Valls
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2026-09-08 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: chartkick
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: 5.1.2
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: 5.1.2
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: decidim-admin
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - "~>"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '0.29'
|
|
34
|
+
type: :runtime
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '0.29'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: decidim-core
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - "~>"
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '0.29'
|
|
48
|
+
type: :runtime
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - "~>"
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '0.29'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: ruby-cbc
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - "~>"
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: 0.3.19
|
|
62
|
+
type: :runtime
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - "~>"
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: 0.3.19
|
|
69
|
+
description: To-Do
|
|
70
|
+
email:
|
|
71
|
+
- 199462+tramuntanal@users.noreply.github.com
|
|
72
|
+
executables: []
|
|
73
|
+
extensions: []
|
|
74
|
+
extra_rdoc_files: []
|
|
75
|
+
files:
|
|
76
|
+
- LICENSE-AGPLv3.txt
|
|
77
|
+
- README.md
|
|
78
|
+
- Rakefile
|
|
79
|
+
- app/cells/decidim/stratified_sortitions/stratified_sortition_cell.rb
|
|
80
|
+
- app/cells/decidim/stratified_sortitions/stratified_sortition_l_cell.rb
|
|
81
|
+
- app/cells/decidim/stratified_sortitions/stratified_sortition_metadata_cell.rb
|
|
82
|
+
- app/commands/decidim/stratified_sortitions/admin/create_stratified_sortition.rb
|
|
83
|
+
- app/commands/decidim/stratified_sortitions/admin/destroy_stratified_sortition.rb
|
|
84
|
+
- app/commands/decidim/stratified_sortitions/admin/duplicate_stratified_sortition.rb
|
|
85
|
+
- app/commands/decidim/stratified_sortitions/admin/import_sample.rb
|
|
86
|
+
- app/commands/decidim/stratified_sortitions/admin/remove_uploaded_samples.rb
|
|
87
|
+
- app/commands/decidim/stratified_sortitions/admin/update_stratified_sortition.rb
|
|
88
|
+
- app/controllers/concerns/decidim/stratified_sortitions/orderable_stratified_sortitions.rb
|
|
89
|
+
- app/controllers/concerns/decidim/stratified_sortitions/strata_charts_data.rb
|
|
90
|
+
- app/controllers/decidim/stratified_sortitions/admin/application_controller.rb
|
|
91
|
+
- app/controllers/decidim/stratified_sortitions/admin/samples_controller.rb
|
|
92
|
+
- app/controllers/decidim/stratified_sortitions/admin/stratified_sortitions_controller.rb
|
|
93
|
+
- app/controllers/decidim/stratified_sortitions/application_controller.rb
|
|
94
|
+
- app/controllers/decidim/stratified_sortitions/charts_pdf_controller_helper.rb
|
|
95
|
+
- app/controllers/decidim/stratified_sortitions/stratified_sortitions_controller.rb
|
|
96
|
+
- app/forms/decidim/stratified_sortitions/admin/sample_upload_form.rb
|
|
97
|
+
- app/forms/decidim/stratified_sortitions/admin/stratified_sortitions_form.rb
|
|
98
|
+
- app/forms/decidim/stratified_sortitions/admin/stratum_form.rb
|
|
99
|
+
- app/forms/decidim/stratified_sortitions/admin/substratum_form.rb
|
|
100
|
+
- app/helpers/decidim/stratified_sortitions/admin/stratified_sortitions_helper.rb
|
|
101
|
+
- app/helpers/decidim/stratified_sortitions/application_helper.rb
|
|
102
|
+
- app/helpers/decidim/stratified_sortitions/charts_pdf_helper.rb
|
|
103
|
+
- app/helpers/decidim/stratified_sortitions/stratified_sortition_cells_helper.rb
|
|
104
|
+
- app/javascript/channels/sample_import_progress.js
|
|
105
|
+
- app/jobs/decidim/stratified_sortitions/admin/execute_sortition_job.rb
|
|
106
|
+
- app/jobs/decidim/stratified_sortitions/admin/import_sample_job.rb
|
|
107
|
+
- app/jobs/decidim/stratified_sortitions/admin/remove_samples_job.rb
|
|
108
|
+
- app/jobs/decidim/stratified_sortitions/admin/sortition_results_export_job.rb
|
|
109
|
+
- app/mailers/decidim/stratified_sortitions/admin/import_mailer.rb
|
|
110
|
+
- app/models/decidim/stratified_sortitions/application_record.rb
|
|
111
|
+
- app/models/decidim/stratified_sortitions/panel_portfolio.rb
|
|
112
|
+
- app/models/decidim/stratified_sortitions/sample_import.rb
|
|
113
|
+
- app/models/decidim/stratified_sortitions/sample_participant.rb
|
|
114
|
+
- app/models/decidim/stratified_sortitions/sample_participant_stratum.rb
|
|
115
|
+
- app/models/decidim/stratified_sortitions/stratified_sortition.rb
|
|
116
|
+
- app/models/decidim/stratified_sortitions/stratum.rb
|
|
117
|
+
- app/models/decidim/stratified_sortitions/substratum.rb
|
|
118
|
+
- app/packs/entrypoints/decidim_stratified_sortitions.js
|
|
119
|
+
- app/packs/entrypoints/decidim_stratified_sortitions_admin.js
|
|
120
|
+
- app/packs/entrypoints/decidim_stratified_sortitions_admin.scss
|
|
121
|
+
- app/packs/images/decidim/stratified_sortitions/icon.svg
|
|
122
|
+
- app/packs/src/decidim/stratified_sortitions/application.js
|
|
123
|
+
- app/packs/src/decidim/stratified_sortitions/results_tabs.js
|
|
124
|
+
- app/packs/src/decidim/stratified_sortitions/stratum_fields.js
|
|
125
|
+
- app/packs/src/decidim/stratified_sortitions/substratum_fields.js
|
|
126
|
+
- app/packs/src/decidim/stratified_sortitions/upload_sample.js
|
|
127
|
+
- app/packs/stylesheets/decidim/stratified_sortitions/admin/stratified_sortitions.scss
|
|
128
|
+
- app/packs/stylesheets/decidim/stratified_sortitions/charts_pdf.scss
|
|
129
|
+
- app/packs/stylesheets/stratified_sortitions.scss
|
|
130
|
+
- app/permissions/decidim/stratified_sortitions/admin/permissions.rb
|
|
131
|
+
- app/permissions/decidim/stratified_sortitions/permissions.rb
|
|
132
|
+
- app/presenters/decidim/stratified_sortitions/admin_log/stratified_sortition_presenter.rb
|
|
133
|
+
- app/queries/decidim/stratified_sortitions/filtered_stratified_sortitions.rb
|
|
134
|
+
- app/serializers/decidim/stratified_sortitions/sortition_result_serializer.rb
|
|
135
|
+
- app/services/decidim/stratified_sortitions/charts_pdf_generator.rb
|
|
136
|
+
- app/services/decidim/stratified_sortitions/fair_sortition_service.rb
|
|
137
|
+
- app/services/decidim/stratified_sortitions/leximin/constraint_builder.rb
|
|
138
|
+
- app/services/decidim/stratified_sortitions/leximin/distribution_solver.rb
|
|
139
|
+
- app/services/decidim/stratified_sortitions/leximin/feasibility_checker.rb
|
|
140
|
+
- app/services/decidim/stratified_sortitions/leximin/panel_generator.rb
|
|
141
|
+
- app/services/decidim/stratified_sortitions/leximin/panel_sampler.rb
|
|
142
|
+
- app/services/decidim/stratified_sortitions/leximin_selector.rb
|
|
143
|
+
- app/services/decidim/stratified_sortitions/sortition_results_exporter.rb
|
|
144
|
+
- app/views/decidim/admin/components/index.html.erb
|
|
145
|
+
- app/views/decidim/stratified_sortitions/admin/import_mailer/import.html.erb
|
|
146
|
+
- app/views/decidim/stratified_sortitions/admin/stratified_sortitions/_confirm_execute_modal.html.erb
|
|
147
|
+
- app/views/decidim/stratified_sortitions/admin/stratified_sortitions/_confirm_participants_modal.html.erb
|
|
148
|
+
- app/views/decidim/stratified_sortitions/admin/stratified_sortitions/_form.html.erb
|
|
149
|
+
- app/views/decidim/stratified_sortitions/admin/stratified_sortitions/_navigation_menu.html.erb
|
|
150
|
+
- app/views/decidim/stratified_sortitions/admin/stratified_sortitions/_strata.html.erb
|
|
151
|
+
- app/views/decidim/stratified_sortitions/admin/stratified_sortitions/_stratum.html.erb
|
|
152
|
+
- app/views/decidim/stratified_sortitions/admin/stratified_sortitions/_substrata.html.erb
|
|
153
|
+
- app/views/decidim/stratified_sortitions/admin/stratified_sortitions/_substratum.html.erb
|
|
154
|
+
- app/views/decidim/stratified_sortitions/admin/stratified_sortitions/edit.html.erb
|
|
155
|
+
- app/views/decidim/stratified_sortitions/admin/stratified_sortitions/execute.html.erb
|
|
156
|
+
- app/views/decidim/stratified_sortitions/admin/stratified_sortitions/export_charts_pdf.html.erb
|
|
157
|
+
- app/views/decidim/stratified_sortitions/admin/stratified_sortitions/index.html.erb
|
|
158
|
+
- app/views/decidim/stratified_sortitions/admin/stratified_sortitions/new.html.erb
|
|
159
|
+
- app/views/decidim/stratified_sortitions/admin/stratified_sortitions/upload_sample.html.erb
|
|
160
|
+
- app/views/decidim/stratified_sortitions/shared/_strata_charts.html.erb
|
|
161
|
+
- app/views/decidim/stratified_sortitions/stratified_sortitions/_results_count.html.erb
|
|
162
|
+
- app/views/decidim/stratified_sortitions/stratified_sortitions/_stratified_sortition.html.erb
|
|
163
|
+
- app/views/decidim/stratified_sortitions/stratified_sortitions/_stratified_sortitions.html.erb
|
|
164
|
+
- app/views/decidim/stratified_sortitions/stratified_sortitions/_tags.html.erb
|
|
165
|
+
- app/views/decidim/stratified_sortitions/stratified_sortitions/index.html.erb
|
|
166
|
+
- app/views/decidim/stratified_sortitions/stratified_sortitions/index.js.erb
|
|
167
|
+
- app/views/decidim/stratified_sortitions/stratified_sortitions/show.html.erb
|
|
168
|
+
- app/views/layouts/decidim/admin/_sidebar_menu.html.erb
|
|
169
|
+
- app/views/layouts/decidim/stratified_sortitions/charts_pdf.html.erb
|
|
170
|
+
- config/assets.rb
|
|
171
|
+
- config/locales/ca.yml
|
|
172
|
+
- config/locales/en.yml
|
|
173
|
+
- config/locales/es.yml
|
|
174
|
+
- config/locales/oc.yml
|
|
175
|
+
- config/routes.rb
|
|
176
|
+
- db/migrate/20251023103900_create_decidim_stratified_sortitions_stratified_sortitions.rb
|
|
177
|
+
- db/migrate/20251104120000_create_stratified_sortitions_strata_and_substrata.decidim_stratified_sortitions.rb
|
|
178
|
+
- db/migrate/20251219120000_create_sample_imports.rb
|
|
179
|
+
- db/migrate/20251219120100_create_sample_participants.rb
|
|
180
|
+
- db/migrate/20251219120200_create_sample_participant_strata.rb
|
|
181
|
+
- db/migrate/20251230130000_change_value_to_text_in_substrata.rb
|
|
182
|
+
- db/migrate/20260102114744_add_status_to_stratified_sortitions.rb
|
|
183
|
+
- db/migrate/20260109105643_allow_null_value_in_substrata.rb
|
|
184
|
+
- db/migrate/20260113121726_add_position_to_strata_and_substrata.rb
|
|
185
|
+
- db/migrate/20260127100000_rename_weighing_to_max_quota_percentage.rb
|
|
186
|
+
- db/migrate/20260127120000_create_panel_portfolios.rb
|
|
187
|
+
- db/migrate/20260518000000_add_foreign_key_to_stratified_sortitions_component.rb
|
|
188
|
+
- db/migrate/20260521000000_add_cascade_to_stratified_sortitions_foreign_keys.rb
|
|
189
|
+
- db/migrate/20260616000000_add_execution_error_to_stratified_sortitions.rb
|
|
190
|
+
- lib/decidim/stratified_sortitions.rb
|
|
191
|
+
- lib/decidim/stratified_sortitions/admin.rb
|
|
192
|
+
- lib/decidim/stratified_sortitions/admin_engine.rb
|
|
193
|
+
- lib/decidim/stratified_sortitions/component.rb
|
|
194
|
+
- lib/decidim/stratified_sortitions/engine.rb
|
|
195
|
+
- lib/decidim/stratified_sortitions/seeds.rb
|
|
196
|
+
- lib/decidim/stratified_sortitions/test/factories.rb
|
|
197
|
+
- lib/decidim/stratified_sortitions/version.rb
|
|
198
|
+
homepage: https://github.com/gencat/decidim-module-stratified_sortitions
|
|
199
|
+
licenses:
|
|
200
|
+
- AGPL-3.0
|
|
201
|
+
metadata:
|
|
202
|
+
rubygems_mfa_required: 'true'
|
|
203
|
+
post_install_message:
|
|
204
|
+
rdoc_options: []
|
|
205
|
+
require_paths:
|
|
206
|
+
- lib
|
|
207
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
208
|
+
requirements:
|
|
209
|
+
- - ">="
|
|
210
|
+
- !ruby/object:Gem::Version
|
|
211
|
+
version: 3.1.1
|
|
212
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
213
|
+
requirements:
|
|
214
|
+
- - ">="
|
|
215
|
+
- !ruby/object:Gem::Version
|
|
216
|
+
version: '0'
|
|
217
|
+
requirements: []
|
|
218
|
+
rubygems_version: 3.4.19
|
|
219
|
+
signing_key:
|
|
220
|
+
specification_version: 4
|
|
221
|
+
summary: A decidim stratified sortitions module
|
|
222
|
+
test_files: []
|