decidim-participatory_processes 0.6.0
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/README.md +36 -0
- data/Rakefile +3 -0
- data/app/assets/config/admin/decidim_participatory_processes_manifest.js +1 -0
- data/app/assets/config/decidim_participatory_processes_manifest.js +2 -0
- data/app/assets/images/decidim/participatory_processes/process.svg +10 -0
- data/app/assets/javascripts/decidim/participatory_processes/admin/participatory_processes.js.es6 +12 -0
- data/app/assets/javascripts/decidim/participatory_processes/filters.js.es6 +25 -0
- data/app/commands/decidim/participatory_processes/admin/activate_participatory_process_step.rb +46 -0
- data/app/commands/decidim/participatory_processes/admin/copy_participatory_process.rb +116 -0
- data/app/commands/decidim/participatory_processes/admin/create_participatory_process.rb +82 -0
- data/app/commands/decidim/participatory_processes/admin/create_participatory_process_admin.rb +95 -0
- data/app/commands/decidim/participatory_processes/admin/create_participatory_process_group.rb +57 -0
- data/app/commands/decidim/participatory_processes/admin/create_participatory_process_step.rb +49 -0
- data/app/commands/decidim/participatory_processes/admin/deactivate_participatory_process_step.rb +38 -0
- data/app/commands/decidim/participatory_processes/admin/destroy_participatory_process_step.rb +46 -0
- data/app/commands/decidim/participatory_processes/admin/publish_participatory_process.rb +34 -0
- data/app/commands/decidim/participatory_processes/admin/reorder_participatory_process_steps.rb +54 -0
- data/app/commands/decidim/participatory_processes/admin/unpublish_participatory_process.rb +34 -0
- data/app/commands/decidim/participatory_processes/admin/update_participatory_process.rb +77 -0
- data/app/commands/decidim/participatory_processes/admin/update_participatory_process_admin.rb +43 -0
- data/app/commands/decidim/participatory_processes/admin/update_participatory_process_group.rb +60 -0
- data/app/commands/decidim/participatory_processes/admin/update_participatory_process_step.rb +51 -0
- data/app/constraints/decidim/participatory_processes/current_feature.rb +28 -0
- data/app/constraints/decidim/participatory_processes/current_participatory_process.rb +37 -0
- data/app/controllers/concerns/decidim/participatory_processes/admin/participatory_process_context.rb +21 -0
- data/app/controllers/concerns/decidim/participatory_processes/needs_participatory_process.rb +50 -0
- data/app/controllers/concerns/decidim/participatory_processes/participatory_process_context.rb +27 -0
- data/app/controllers/decidim/participatory_processes/admin/application_controller.rb +11 -0
- data/app/controllers/decidim/participatory_processes/admin/categories_controller.rb +13 -0
- data/app/controllers/decidim/participatory_processes/admin/concerns/participatory_process_admin.rb +26 -0
- data/app/controllers/decidim/participatory_processes/admin/exports_controller.rb +14 -0
- data/app/controllers/decidim/participatory_processes/admin/feature_permissions_controller.rb +14 -0
- data/app/controllers/decidim/participatory_processes/admin/features_controller.rb +14 -0
- data/app/controllers/decidim/participatory_processes/admin/moderations_controller.rb +12 -0
- data/app/controllers/decidim/participatory_processes/admin/participatory_process_attachments_controller.rb +27 -0
- data/app/controllers/decidim/participatory_processes/admin/participatory_process_copies_controller.rb +35 -0
- data/app/controllers/decidim/participatory_processes/admin/participatory_process_groups_controller.rb +90 -0
- data/app/controllers/decidim/participatory_processes/admin/participatory_process_publications_controller.rb +45 -0
- data/app/controllers/decidim/participatory_processes/admin/participatory_process_step_activations_controller.rb +39 -0
- data/app/controllers/decidim/participatory_processes/admin/participatory_process_step_ordering_controller.rb +29 -0
- data/app/controllers/decidim/participatory_processes/admin/participatory_process_steps_controller.rb +91 -0
- data/app/controllers/decidim/participatory_processes/admin/participatory_process_user_roles_controller.rb +99 -0
- data/app/controllers/decidim/participatory_processes/admin/participatory_processes_controller.rb +102 -0
- data/app/controllers/decidim/participatory_processes/participatory_process_groups_controller.rb +28 -0
- data/app/controllers/decidim/participatory_processes/participatory_process_steps_controller.rb +20 -0
- data/app/controllers/decidim/participatory_processes/participatory_process_widgets_controller.rb +21 -0
- data/app/controllers/decidim/participatory_processes/participatory_processes_controller.rb +64 -0
- data/app/forms/decidim/participatory_processes/admin/participatory_process_copy_form.rb +35 -0
- data/app/forms/decidim/participatory_processes/admin/participatory_process_form.rb +72 -0
- data/app/forms/decidim/participatory_processes/admin/participatory_process_group_form.rb +26 -0
- data/app/forms/decidim/participatory_processes/admin/participatory_process_step_form.rb +37 -0
- data/app/forms/decidim/participatory_processes/admin/participatory_process_user_role_form.rb +31 -0
- data/app/helpers/decidim/participatory_processes/admin/process_groups_for_select_helper.rb +23 -0
- data/app/helpers/decidim/participatory_processes/admin/processes_for_select_helper.rb +25 -0
- data/app/helpers/decidim/participatory_processes/participatory_process_helper.rb +19 -0
- data/app/helpers/decidim/participatory_processes/participatory_process_steps_helper.rb +20 -0
- data/app/models/decidim/participatory_process.rb +62 -0
- data/app/models/decidim/participatory_process_group.rb +15 -0
- data/app/models/decidim/participatory_process_step.rb +39 -0
- data/app/models/decidim/participatory_processes/abilities/admin/admin_ability.rb +21 -0
- data/app/models/decidim/participatory_processes/abilities/admin_ability.rb +16 -0
- data/app/models/decidim/participatory_processes/abilities/everyone_ability.rb +19 -0
- data/app/presenters/decidim/participatory_processes/participatory_process_stats_presenter.rb +52 -0
- data/app/queries/decidim/participatory_processes/admin/admin_users.rb +46 -0
- data/app/queries/decidim/participatory_processes/filtered_participatory_process_groups.rb +29 -0
- data/app/queries/decidim/participatory_processes/filtered_participatory_processes.rb +26 -0
- data/app/queries/decidim/participatory_processes/highlighted_participatory_processes.rb +12 -0
- data/app/queries/decidim/participatory_processes/organization_participatory_process_groups.rb +16 -0
- data/app/queries/decidim/participatory_processes/organization_participatory_processes.rb +16 -0
- data/app/queries/decidim/participatory_processes/organization_prioritized_participatory_process_groups.rb +20 -0
- data/app/queries/decidim/participatory_processes/organization_prioritized_participatory_processes.rb +22 -0
- data/app/queries/decidim/participatory_processes/organization_published_participatory_processes.rb +19 -0
- data/app/queries/decidim/participatory_processes/prioritized_participatory_processes.rb +13 -0
- data/app/queries/decidim/participatory_processes/promoted_participatory_processes.rb +12 -0
- data/app/queries/decidim/participatory_processes/published_participatory_processes.rb +12 -0
- data/app/views/decidim/participatory_process_groups/_participatory_process_group.html.erb +22 -0
- data/app/views/decidim/participatory_process_steps/_participatory_process_step.html.erb +16 -0
- data/app/views/decidim/participatory_processes/_order_by_processes.html.erb +12 -0
- data/app/views/decidim/participatory_processes/_participatory_process.html.erb +28 -0
- data/app/views/decidim/participatory_processes/admin/participatory_process_copies/_form.html.erb +38 -0
- data/app/views/decidim/participatory_processes/admin/participatory_process_copies/new.html.erb +7 -0
- data/app/views/decidim/participatory_processes/admin/participatory_process_groups/_form.html.erb +17 -0
- data/app/views/decidim/participatory_processes/admin/participatory_process_groups/edit.html.erb +19 -0
- data/app/views/decidim/participatory_processes/admin/participatory_process_groups/index.html.erb +44 -0
- data/app/views/decidim/participatory_processes/admin/participatory_process_groups/new.html.erb +13 -0
- data/app/views/decidim/participatory_processes/admin/participatory_process_groups/show.html.erb +23 -0
- data/app/views/decidim/participatory_processes/admin/participatory_process_steps/_form.html.erb +25 -0
- data/app/views/decidim/participatory_processes/admin/participatory_process_steps/edit.html.erb +8 -0
- data/app/views/decidim/participatory_processes/admin/participatory_process_steps/index.html.erb +63 -0
- data/app/views/decidim/participatory_processes/admin/participatory_process_steps/new.html.erb +7 -0
- data/app/views/decidim/participatory_processes/admin/participatory_process_steps/show.html.erb +18 -0
- data/app/views/decidim/participatory_processes/admin/participatory_process_user_roles/_form.html.erb +22 -0
- data/app/views/decidim/participatory_processes/admin/participatory_process_user_roles/edit.html.erb +7 -0
- data/app/views/decidim/participatory_processes/admin/participatory_process_user_roles/index.html.erb +65 -0
- data/app/views/decidim/participatory_processes/admin/participatory_process_user_roles/new.html.erb +7 -0
- data/app/views/decidim/participatory_processes/admin/participatory_processes/_form.html.erb +107 -0
- data/app/views/decidim/participatory_processes/admin/participatory_processes/edit.html.erb +19 -0
- data/app/views/decidim/participatory_processes/admin/participatory_processes/index.html.erb +66 -0
- data/app/views/decidim/participatory_processes/admin/participatory_processes/new.html.erb +11 -0
- data/app/views/decidim/participatory_processes/participatory_process_groups/show.html.erb +11 -0
- data/app/views/decidim/participatory_processes/participatory_process_steps/_timeline.html.erb +7 -0
- data/app/views/decidim/participatory_processes/participatory_process_steps/index.html.erb +14 -0
- data/app/views/decidim/participatory_processes/participatory_process_widgets/show.html.erb +17 -0
- data/app/views/decidim/participatory_processes/participatory_processes/_no_processes_yet.html.erb +3 -0
- data/app/views/decidim/participatory_processes/participatory_processes/_promoted_process.html.erb +32 -0
- data/app/views/decidim/participatory_processes/participatory_processes/_statistics.html.erb +10 -0
- data/app/views/decidim/participatory_processes/participatory_processes/index.html.erb +22 -0
- data/app/views/decidim/participatory_processes/participatory_processes/index.js.erb +6 -0
- data/app/views/decidim/participatory_processes/participatory_processes/show.html.erb +92 -0
- data/app/views/layouts/decidim/_process_header.html.erb +65 -0
- data/app/views/layouts/decidim/_process_header_steps.html.erb +27 -0
- data/app/views/layouts/decidim/admin/participatory_process.html.erb +64 -0
- data/app/views/layouts/decidim/admin/participatory_process_groups.html.erb +14 -0
- data/app/views/layouts/decidim/admin/participatory_processes.html.erb +14 -0
- data/app/views/layouts/decidim/participatory_process.html.erb +30 -0
- data/config/locales/ca.yml +281 -0
- data/config/locales/en.yml +281 -0
- data/config/locales/es.yml +281 -0
- data/config/locales/eu.yml +280 -0
- data/config/locales/fi.yml +280 -0
- data/config/locales/fr.yml +280 -0
- data/config/locales/it.yml +280 -0
- data/config/locales/nl.yml +280 -0
- data/config/locales/pl.yml +281 -0
- data/config/locales/uk.yml +282 -0
- data/db/migrate/20161005130108_add_participatory_processes.rb +19 -0
- data/db/migrate/20161010102356_translate_processes.rb +17 -0
- data/db/migrate/20161011125616_add_hero_image_to_processes.rb +7 -0
- data/db/migrate/20161011141033_add_banner_image_to_processes.rb +7 -0
- data/db/migrate/20161013134732_add_promoted_flag_to_processes.rb +7 -0
- data/db/migrate/20161017085822_add_participatory_process_steps.rb +18 -0
- data/db/migrate/20161019072016_add_active_flag_to_step.rb +13 -0
- data/db/migrate/20161020080756_add_position_to_steps.rb +9 -0
- data/db/migrate/20161025125300_add_published_at_to_processes.rb +7 -0
- data/db/migrate/20161107152228_remove_not_null_on_step_position.rb +7 -0
- data/db/migrate/20161110092735_add_index_for_process_slug_organization.rb +10 -0
- data/db/migrate/20161116115156_create_attachments.rb +18 -0
- data/db/migrate/20170116135237_loosen_step_requirements.rb +8 -0
- data/db/migrate/20170123134023_make_attachments_polymorphic.rb +20 -0
- data/db/migrate/20170125135937_rename_attachable_to_attached_to.rb +13 -0
- data/db/migrate/20170126151123_add_extra_info_to_processes.rb +10 -0
- data/db/migrate/20170206083118_rename_extra_info_on_processes.rb +14 -0
- data/db/migrate/20170220110740_remove_steps_short_description.rb +23 -0
- data/db/migrate/20170221094835_add_scopes_to_processes.rb +8 -0
- data/db/migrate/20170228142440_add_participatory_process_groups.rb +17 -0
- data/db/migrate/20170404132616_change_steps_end_and_start_date_to_date.rb +8 -0
- data/db/migrate/20170720120135_make_features_polymorphic.rb +27 -0
- data/db/migrate/20170725085104_add_show_statistics_to_participatory_processes.rb +7 -0
- data/db/migrate/20170804125402_attachment_description_nullable.rb +7 -0
- data/db/migrate/20170808080905_add_announcement_to_participatory_processes.rb +7 -0
- data/db/migrate/20170809084005_add_scopes_enabled_to_participatory_processes.rb +7 -0
- data/db/migrate/20170830081725_add_start_date_to_processes.rb +8 -0
- data/db/seeds/Exampledocument.pdf +0 -0
- data/db/seeds/city.jpeg +0 -0
- data/db/seeds/city2.jpeg +0 -0
- data/db/seeds/homepage_image.jpg +0 -0
- data/lib/decidim/participatory_processes.rb +12 -0
- data/lib/decidim/participatory_processes/admin.rb +10 -0
- data/lib/decidim/participatory_processes/admin_engine.rb +98 -0
- data/lib/decidim/participatory_processes/engine.rb +55 -0
- data/lib/decidim/participatory_processes/participatory_space.rb +118 -0
- data/lib/decidim/participatory_processes/test/factories.rb +97 -0
- metadata +266 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 9ed5778305ec15d3856385d206b64cb0ddf00d48
|
|
4
|
+
data.tar.gz: 84b18b608fff22066df3d690ee87e0635e85d46d
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 043f3e5ad638d4340701af8047f7fd2fd89e1183b3ccda119c3e41a37a921fd047beadf089640c9546e9118d94c336d4fe44ac1e16f202f9dc393c1dabdb3737
|
|
7
|
+
data.tar.gz: c0ab2b56c3515fefa73af22f4ba57ca82624307a7b4b972198061c6541f84ad836dff98bb231903220b8735f15aec2c5a18f8e44b5ed180a326baa6deeaccf84
|
data/README.md
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Decidim::ParticipatoryProcesses
|
|
2
|
+
|
|
3
|
+
Participatory processes are the standard Decidim's participatory space.
|
|
4
|
+
|
|
5
|
+
A participatory process can define its own steps, and attach different features
|
|
6
|
+
(such as meetings or proposals) with different configurations to each of them.
|
|
7
|
+
|
|
8
|
+
A participatory process can have attachments, be associated to custom
|
|
9
|
+
categories, and are fully manageable via an administration UI.
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
This plugin provides:
|
|
14
|
+
|
|
15
|
+
* A CRUD engine to manage participatory processes.
|
|
16
|
+
|
|
17
|
+
* Public views for participatory process via a high level section in the main
|
|
18
|
+
menu.
|
|
19
|
+
|
|
20
|
+
## Installation
|
|
21
|
+
Add this line to your application's Gemfile:
|
|
22
|
+
|
|
23
|
+
```ruby
|
|
24
|
+
gem 'decidim-participatory_processes'
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
And then execute:
|
|
28
|
+
```bash
|
|
29
|
+
$ bundle
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Contributing
|
|
33
|
+
See [Decidim](https://github.com/decidim/decidim).
|
|
34
|
+
|
|
35
|
+
## License
|
|
36
|
+
See [Decidim](https://github.com/decidim/decidim).
|
data/Rakefile
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//= link decidim/participatory_processes/admin/participatory_processes.js
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36.02 36.02">
|
|
2
|
+
<path d="M883.8,543.84a18,18,0,1,1,18-18A18,18,0,0,1,883.8,543.84Zm0-34a16,16,0,1,0,16,16A16,16,0,0,0,883.8,509.83Z" transform="translate(-865.8 -507.83)"/>
|
|
3
|
+
<g transform="rotate(60 18.1 18.1)">
|
|
4
|
+
<path d="M883.8,528.75a2.91,2.91,0,1,1,2.91-2.91A2.92,2.92,0,0,1,883.8,528.75Zm0-3.83a0.91,0.91,0,1,0,.91.92A0.92,0.92,0,0,0,883.8,524.92Z" transform="translate(-865.8 -507.83)"/>
|
|
5
|
+
<path d="M883.8,521.18a2.91,2.91,0,1,1,2.91-2.91A2.92,2.92,0,0,1,883.8,521.18Zm0-3.83a0.91,0.91,0,1,0,.91.92A0.92,0.92,0,0,0,883.8,517.35Z" transform="translate(-865.8 -507.83)"/>
|
|
6
|
+
<path d="M883.8,536.32a2.92,2.92,0,1,1,2.91-2.91A2.92,2.92,0,0,1,883.8,536.32Zm0-3.83a0.92,0.92,0,1,0,.91.92A0.92,0.92,0,0,0,883.8,532.49Z" transform="translate(-865.8 -507.83)"/>
|
|
7
|
+
<path d="M881.52,526.85a4.79,4.79,0,1,1,0-9.59,1,1,0,0,1,0,2,2.79,2.79,0,1,0,0,5.59A1,1,0,0,1,881.52,526.85Z" transform="translate(-865.8 -507.83)"/>
|
|
8
|
+
<path d="M886.09,534.47a1,1,0,0,1,0-2,2.79,2.79,0,0,0,0-5.59,1,1,0,0,1,0-2A4.79,4.79,0,0,1,886.09,534.47Z" transform="translate(-865.8 -507.83)"/>
|
|
9
|
+
</g>
|
|
10
|
+
</svg>
|
data/app/assets/javascripts/decidim/participatory_processes/admin/participatory_processes.js.es6
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
$(() => {
|
|
2
|
+
const $participatoryProcessScopeEnabled = $('#participatory_process_scopes_enabled');
|
|
3
|
+
const $participatoryProcessScopeId = $("#participatory_process_scope_id");
|
|
4
|
+
|
|
5
|
+
if ($('.edit_participatory_process, .new_participatory_process').length > 0) {
|
|
6
|
+
$participatoryProcessScopeEnabled.on('change', (event) => {
|
|
7
|
+
const checked = event.target.checked;
|
|
8
|
+
$participatoryProcessScopeId.attr("disabled", !checked);
|
|
9
|
+
})
|
|
10
|
+
$participatoryProcessScopeId.attr("disabled", !$participatoryProcessScopeEnabled.prop('checked'));
|
|
11
|
+
}
|
|
12
|
+
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
$(() => {
|
|
2
|
+
((exports) => {
|
|
3
|
+
const $processesGrid = $('#processes-grid');
|
|
4
|
+
const $loading = $processesGrid.find('.loading');
|
|
5
|
+
const filterLinksSelector = '.order-by__tabs a'
|
|
6
|
+
|
|
7
|
+
$loading.hide();
|
|
8
|
+
|
|
9
|
+
$processesGrid.on('click', filterLinksSelector, (event) => {
|
|
10
|
+
const $target = $(event.target);
|
|
11
|
+
const $processesGridCards = $processesGrid.find('.card-grid .column');
|
|
12
|
+
|
|
13
|
+
$(filterLinksSelector).removeClass('is-active');
|
|
14
|
+
$target.addClass('is-active');
|
|
15
|
+
|
|
16
|
+
$processesGridCards.hide();
|
|
17
|
+
$loading.show();
|
|
18
|
+
|
|
19
|
+
if (exports.history) {
|
|
20
|
+
exports.history.pushState(null, null, $target.attr('href'));
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
})(window);
|
|
24
|
+
|
|
25
|
+
});
|
data/app/commands/decidim/participatory_processes/admin/activate_participatory_process_step.rb
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Decidim
|
|
4
|
+
module ParticipatoryProcesses
|
|
5
|
+
module Admin
|
|
6
|
+
# A command that sets a step in a participatory process as active (and
|
|
7
|
+
# unsets a previous active step)
|
|
8
|
+
class ActivateParticipatoryProcessStep < Rectify::Command
|
|
9
|
+
# Public: Initializes the command.
|
|
10
|
+
#
|
|
11
|
+
# step - A ParticipatoryProcessStep that will be activated
|
|
12
|
+
def initialize(step)
|
|
13
|
+
@step = step
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Executes the command. Broadcasts these events:
|
|
17
|
+
#
|
|
18
|
+
# - :ok when everything is valid.
|
|
19
|
+
# - :invalid if the data wasn't valid and we couldn't proceed.
|
|
20
|
+
#
|
|
21
|
+
# Returns nothing.
|
|
22
|
+
def call
|
|
23
|
+
return broadcast(:invalid) if step.nil? || step.active?
|
|
24
|
+
|
|
25
|
+
Decidim::ParticipatoryProcessStep.transaction do
|
|
26
|
+
deactivate_active_steps
|
|
27
|
+
activate_step
|
|
28
|
+
end
|
|
29
|
+
broadcast(:ok)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
private
|
|
33
|
+
|
|
34
|
+
attr_reader :step
|
|
35
|
+
|
|
36
|
+
def deactivate_active_steps
|
|
37
|
+
step.participatory_process.steps.where(active: true).update_all(active: false)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def activate_step
|
|
41
|
+
step.update_attribute(:active, true)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Decidim
|
|
4
|
+
module ParticipatoryProcesses
|
|
5
|
+
module Admin
|
|
6
|
+
# A command with all the business logic when copying a new participatory
|
|
7
|
+
# process in the system.
|
|
8
|
+
class CopyParticipatoryProcess < Rectify::Command
|
|
9
|
+
# Public: Initializes the command.
|
|
10
|
+
#
|
|
11
|
+
# form - A form object with the params.
|
|
12
|
+
# participatory_process - A participatory_process we want to duplicate
|
|
13
|
+
def initialize(form, participatory_process)
|
|
14
|
+
@form = form
|
|
15
|
+
@participatory_process = participatory_process
|
|
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
|
+
ParticipatoryProcess.transaction do
|
|
28
|
+
copy_participatory_process
|
|
29
|
+
copy_participatory_process_steps if @form.copy_steps?
|
|
30
|
+
copy_participatory_process_categories if @form.copy_categories?
|
|
31
|
+
copy_participatory_process_features if @form.copy_features?
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
broadcast(:ok, @copied_process)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
private
|
|
38
|
+
|
|
39
|
+
attr_reader :form
|
|
40
|
+
|
|
41
|
+
def copy_participatory_process
|
|
42
|
+
@copied_process = ParticipatoryProcess.create!(
|
|
43
|
+
organization: @participatory_process.organization,
|
|
44
|
+
title: form.title,
|
|
45
|
+
subtitle: @participatory_process.subtitle,
|
|
46
|
+
slug: form.slug,
|
|
47
|
+
hashtag: @participatory_process.hashtag,
|
|
48
|
+
description: @participatory_process.description,
|
|
49
|
+
short_description: @participatory_process.short_description,
|
|
50
|
+
hero_image: @participatory_process.hero_image,
|
|
51
|
+
banner_image: @participatory_process.banner_image,
|
|
52
|
+
promoted: @participatory_process.promoted,
|
|
53
|
+
scope: @participatory_process.scope,
|
|
54
|
+
developer_group: @participatory_process.developer_group,
|
|
55
|
+
local_area: @participatory_process.local_area,
|
|
56
|
+
target: @participatory_process.target,
|
|
57
|
+
participatory_scope: @participatory_process.participatory_scope,
|
|
58
|
+
participatory_structure: @participatory_process.participatory_structure,
|
|
59
|
+
meta_scope: @participatory_process.meta_scope,
|
|
60
|
+
start_date: @participatory_process.start_date,
|
|
61
|
+
end_date: @participatory_process.end_date,
|
|
62
|
+
participatory_process_group: @participatory_process.participatory_process_group
|
|
63
|
+
)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def copy_participatory_process_steps
|
|
67
|
+
@steps_relationship = {}
|
|
68
|
+
|
|
69
|
+
@participatory_process.steps.each do |step|
|
|
70
|
+
new_step = ParticipatoryProcessStep.create!(
|
|
71
|
+
title: step.title,
|
|
72
|
+
description: step.description,
|
|
73
|
+
start_date: step.start_date,
|
|
74
|
+
end_date: step.end_date,
|
|
75
|
+
participatory_process: @copied_process,
|
|
76
|
+
position: step.position,
|
|
77
|
+
active: step.active
|
|
78
|
+
)
|
|
79
|
+
@steps_relationship[step.id.to_s] = new_step.id.to_s
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def copy_participatory_process_categories
|
|
84
|
+
@participatory_process.categories.each do |category|
|
|
85
|
+
Category.create!(
|
|
86
|
+
name: category.name,
|
|
87
|
+
description: category.description,
|
|
88
|
+
parent_id: category.parent_id,
|
|
89
|
+
participatory_space: @copied_process
|
|
90
|
+
)
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def copy_participatory_process_features
|
|
95
|
+
@participatory_process.features.each do |feature|
|
|
96
|
+
copied_step_settings = @form.copy_steps? ? map_step_settings(feature.step_settings) : {}
|
|
97
|
+
new_feature = Feature.create!(
|
|
98
|
+
manifest_name: feature.manifest_name,
|
|
99
|
+
name: feature.name,
|
|
100
|
+
participatory_space: @copied_process,
|
|
101
|
+
settings: feature.settings,
|
|
102
|
+
step_settings: copied_step_settings
|
|
103
|
+
)
|
|
104
|
+
feature.manifest.run_hooks(:copy, new_feature: new_feature, old_feature: feature)
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def map_step_settings(step_settings)
|
|
109
|
+
step_settings.each_with_object({}) do |(step_id, settings), acc|
|
|
110
|
+
acc.update(@steps_relationship[step_id.to_s] => settings)
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Decidim
|
|
4
|
+
module ParticipatoryProcesses
|
|
5
|
+
module Admin
|
|
6
|
+
# A command with all the business logic when creating a new participatory
|
|
7
|
+
# process in the system.
|
|
8
|
+
class CreateParticipatoryProcess < Rectify::Command
|
|
9
|
+
# Public: Initializes the command.
|
|
10
|
+
#
|
|
11
|
+
# form - A form object with the params.
|
|
12
|
+
def initialize(form)
|
|
13
|
+
@form = form
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Executes the command. Broadcasts these events:
|
|
17
|
+
#
|
|
18
|
+
# - :ok when everything is valid.
|
|
19
|
+
# - :invalid if the form wasn't valid and we couldn't proceed.
|
|
20
|
+
#
|
|
21
|
+
# Returns nothing.
|
|
22
|
+
def call
|
|
23
|
+
return broadcast(:invalid) if form.invalid?
|
|
24
|
+
process = create_participatory_process
|
|
25
|
+
|
|
26
|
+
if process.persisted?
|
|
27
|
+
broadcast(:ok, process)
|
|
28
|
+
else
|
|
29
|
+
form.errors.add(:hero_image, process.errors[:hero_image]) if process.errors.include? :hero_image
|
|
30
|
+
form.errors.add(:banner_image, process.errors[:banner_image]) if process.errors.include? :banner_image
|
|
31
|
+
broadcast(:invalid)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
private
|
|
36
|
+
|
|
37
|
+
attr_reader :form
|
|
38
|
+
|
|
39
|
+
def create_participatory_process
|
|
40
|
+
process = ParticipatoryProcess.new(
|
|
41
|
+
organization: form.current_organization,
|
|
42
|
+
title: form.title,
|
|
43
|
+
subtitle: form.subtitle,
|
|
44
|
+
slug: form.slug,
|
|
45
|
+
hashtag: form.hashtag,
|
|
46
|
+
description: form.description,
|
|
47
|
+
short_description: form.short_description,
|
|
48
|
+
hero_image: form.hero_image,
|
|
49
|
+
banner_image: form.banner_image,
|
|
50
|
+
promoted: form.promoted,
|
|
51
|
+
scopes_enabled: form.scopes_enabled,
|
|
52
|
+
scope: form.scope,
|
|
53
|
+
developer_group: form.developer_group,
|
|
54
|
+
local_area: form.local_area,
|
|
55
|
+
target: form.target,
|
|
56
|
+
participatory_scope: form.participatory_scope,
|
|
57
|
+
participatory_structure: form.participatory_structure,
|
|
58
|
+
meta_scope: form.meta_scope,
|
|
59
|
+
start_date: form.start_date,
|
|
60
|
+
end_date: form.end_date,
|
|
61
|
+
participatory_process_group: form.participatory_process_group
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
return process unless process.valid?
|
|
65
|
+
transaction do
|
|
66
|
+
process.save!
|
|
67
|
+
|
|
68
|
+
process.steps.create!(
|
|
69
|
+
title: TranslationsHelper.multi_translation(
|
|
70
|
+
"decidim.admin.participatory_process_steps.default_title",
|
|
71
|
+
form.current_organization.available_locales
|
|
72
|
+
),
|
|
73
|
+
active: true
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
process
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Decidim
|
|
4
|
+
module ParticipatoryProcesses
|
|
5
|
+
module Admin
|
|
6
|
+
# A command with all the business logic when creating a new participatory
|
|
7
|
+
# process admin in the system.
|
|
8
|
+
class CreateParticipatoryProcessAdmin < Rectify::Command
|
|
9
|
+
# Public: Initializes the command.
|
|
10
|
+
#
|
|
11
|
+
# form - A form object with the params.
|
|
12
|
+
# participatory_process - The ParticipatoryProcess that will hold the
|
|
13
|
+
# user role
|
|
14
|
+
def initialize(form, current_user, participatory_process)
|
|
15
|
+
@form = form
|
|
16
|
+
@current_user = current_user
|
|
17
|
+
@participatory_process = participatory_process
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Executes the command. Broadcasts these events:
|
|
21
|
+
#
|
|
22
|
+
# - :ok when everything is valid.
|
|
23
|
+
# - :invalid if the form wasn't valid and we couldn't proceed.
|
|
24
|
+
#
|
|
25
|
+
# Returns nothing.
|
|
26
|
+
def call
|
|
27
|
+
return broadcast(:invalid) if form.invalid?
|
|
28
|
+
|
|
29
|
+
ActiveRecord::Base.transaction do
|
|
30
|
+
create_or_invite_user
|
|
31
|
+
create_role
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
broadcast(:ok)
|
|
35
|
+
rescue ActiveRecord::RecordInvalid
|
|
36
|
+
form.errors.add(:email, :taken)
|
|
37
|
+
broadcast(:invalid)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
private
|
|
41
|
+
|
|
42
|
+
attr_reader :form, :participatory_process, :current_user, :user
|
|
43
|
+
|
|
44
|
+
def create_role
|
|
45
|
+
Decidim::ParticipatoryProcessUserRole.find_or_create_by!(
|
|
46
|
+
role: form.role.to_sym,
|
|
47
|
+
user: user,
|
|
48
|
+
participatory_process: @participatory_process
|
|
49
|
+
)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def create_or_invite_user
|
|
53
|
+
@user ||= existing_user || new_user
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def existing_user
|
|
57
|
+
return @existing_user if defined?(@existing_user)
|
|
58
|
+
|
|
59
|
+
@existing_user = User.where(
|
|
60
|
+
email: form.email,
|
|
61
|
+
organization: participatory_process.organization
|
|
62
|
+
).first
|
|
63
|
+
|
|
64
|
+
if @existing_user && !@existing_user.invitation_accepted?
|
|
65
|
+
InviteUserAgain.call(@existing_user, invitation_instructions)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
@existing_user
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def new_user
|
|
72
|
+
@new_user ||= InviteUser.call(user_form) do
|
|
73
|
+
on(:ok) do |user|
|
|
74
|
+
return user
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def user_form
|
|
80
|
+
OpenStruct.new(name: form.name,
|
|
81
|
+
email: form.email.downcase,
|
|
82
|
+
organization: participatory_process.organization,
|
|
83
|
+
admin: false,
|
|
84
|
+
invited_by: current_user,
|
|
85
|
+
invitation_instructions: invitation_instructions)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def invitation_instructions
|
|
89
|
+
return "invite_admin" if form.role == "admin"
|
|
90
|
+
"invite_collaborator"
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|