decidim-participatory_processes 0.19.1 → 0.23.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (155) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/decidim/participatory_processes/admin/participatory_processes.js.es6 +6 -0
  3. data/app/cells/decidim/participatory_processes/content_blocks/highlighted_processes/_all_processes.erb +4 -1
  4. data/app/cells/decidim/participatory_processes/content_blocks/highlighted_processes/show.erb +5 -9
  5. data/app/cells/decidim/participatory_processes/content_blocks/highlighted_processes/single_process.erb +10 -5
  6. data/app/cells/decidim/participatory_processes/content_blocks/highlighted_processes_cell.rb +1 -1
  7. data/app/cells/decidim/participatory_processes/process_filters/show.erb +2 -2
  8. data/app/cells/decidim/participatory_processes/process_group_m/footer.erb +4 -5
  9. data/app/cells/decidim/participatory_processes/process_m/data.erb +1 -1
  10. data/app/cells/decidim/participatory_processes/process_m/footer.erb +5 -6
  11. data/app/cells/decidim/participatory_processes/process_m/tags.erb +2 -2
  12. data/app/cells/decidim/participatory_processes/process_m_cell.rb +21 -0
  13. data/app/cells/decidim/participatory_processes/statistic/show.erb +9 -0
  14. data/app/cells/decidim/participatory_processes/statistic_cell.rb +20 -0
  15. data/app/cells/decidim/participatory_processes/statistics/show.erb +17 -0
  16. data/app/cells/decidim/participatory_processes/statistics_cell.rb +18 -0
  17. data/app/commands/decidim/participatory_processes/admin/create_participatory_process.rb +10 -11
  18. data/app/commands/decidim/participatory_processes/admin/create_participatory_process_admin.rb +2 -1
  19. data/app/commands/decidim/participatory_processes/admin/create_participatory_process_group.rb +3 -3
  20. data/app/commands/decidim/participatory_processes/admin/import_participatory_process.rb +72 -0
  21. data/app/commands/decidim/participatory_processes/admin/notify_role_assigned_to_participatory_process.rb +22 -0
  22. data/app/commands/decidim/participatory_processes/admin/update_participatory_process.rb +26 -10
  23. data/app/commands/decidim/participatory_processes/admin/update_participatory_process_admin.rb +3 -1
  24. data/app/controllers/concerns/decidim/participatory_processes/admin/filterable.rb +27 -0
  25. data/app/controllers/decidim/participatory_processes/admin/participatory_process_exports_controller.rb +24 -0
  26. data/app/controllers/decidim/participatory_processes/admin/participatory_process_imports_controller.rb +31 -0
  27. data/app/controllers/decidim/participatory_processes/admin/participatory_process_user_roles_controller.rb +2 -1
  28. data/app/controllers/decidim/participatory_processes/admin/participatory_processes_controller.rb +6 -16
  29. data/app/controllers/decidim/participatory_processes/participatory_processes_controller.rb +27 -4
  30. data/app/controllers/decidim/participatory_processes/{participatory_process_widgets_controller.rb → widgets_controller.rb} +2 -2
  31. data/app/events/decidim/participatory_process_role_assigned_event.rb +28 -0
  32. data/app/forms/decidim/participatory_processes/admin/participatory_process_form.rb +18 -6
  33. data/app/forms/decidim/participatory_processes/admin/participatory_process_group_form.rb +4 -1
  34. data/app/forms/decidim/participatory_processes/admin/participatory_process_import_form.rb +83 -0
  35. data/app/forms/decidim/participatory_processes/admin/participatory_process_user_role_form.rb +8 -2
  36. data/app/functions/decidim/participatory_processes/participatory_process_finder.rb +10 -0
  37. data/app/functions/decidim/participatory_processes/participatory_process_list.rb +11 -0
  38. data/app/helpers/decidim/participatory_processes/admin/participatory_process_helper.rb +23 -0
  39. data/app/helpers/decidim/participatory_processes/participatory_process_helper.rb +11 -0
  40. data/app/models/decidim/participatory_process.rb +38 -2
  41. data/app/models/decidim/participatory_process_group.rb +5 -0
  42. data/app/models/decidim/participatory_process_step.rb +3 -0
  43. data/app/models/decidim/participatory_process_user_role.rb +32 -0
  44. data/app/permissions/decidim/participatory_processes/permissions.rb +15 -2
  45. data/app/presenters/decidim/participatory_processes/participatory_process_group_presenter.rb +22 -0
  46. data/app/presenters/decidim/participatory_processes/participatory_process_metric_charts_presenter.rb +2 -2
  47. data/app/presenters/decidim/participatory_processes/participatory_process_presenter.rb +25 -0
  48. data/app/presenters/decidim/participatory_processes/participatory_process_stats_presenter.rb +32 -22
  49. data/app/queries/decidim/participatory_processes/stats_followers_count.rb +46 -0
  50. data/app/queries/decidim/participatory_processes/stats_participants_count.rb +100 -0
  51. data/app/serializers/decidim/participatory_processes/participatory_process_importer.rb +182 -0
  52. data/app/serializers/decidim/participatory_processes/participatory_process_serializer.rb +154 -0
  53. data/app/types/decidim/participatory_processes/participatory_process_group_type.rb +20 -0
  54. data/app/types/decidim/participatory_processes/participatory_process_input_filter.rb +13 -0
  55. data/app/types/decidim/participatory_processes/participatory_process_input_sort.rb +15 -0
  56. data/app/types/decidim/participatory_processes/participatory_process_step_type.rb +7 -4
  57. data/app/types/decidim/participatory_processes/participatory_process_type.rb +8 -4
  58. data/app/views/decidim/participatory_process_steps/_participatory_process_step.html.erb +1 -1
  59. data/app/views/decidim/participatory_processes/admin/participatory_process_groups/index.html.erb +8 -0
  60. data/app/views/decidim/participatory_processes/admin/participatory_process_imports/_form.html.erb +49 -0
  61. data/app/views/decidim/participatory_processes/admin/participatory_process_imports/new.html.erb +7 -0
  62. data/app/views/decidim/participatory_processes/admin/participatory_processes/_form.html.erb +31 -0
  63. data/app/views/decidim/participatory_processes/admin/participatory_processes/index.html.erb +27 -12
  64. data/app/views/decidim/participatory_processes/admin/shared/_secondary_nav.html.erb +17 -0
  65. data/app/views/decidim/participatory_processes/participatory_process_groups/show.html.erb +3 -2
  66. data/app/views/decidim/participatory_processes/participatory_process_steps/index.html.erb +8 -3
  67. data/app/views/decidim/participatory_processes/participatory_processes/_metrics.html.erb +2 -2
  68. data/app/views/decidim/participatory_processes/participatory_processes/_promoted_process.html.erb +13 -6
  69. data/app/views/decidim/participatory_processes/participatory_processes/_statistics.html.erb +0 -10
  70. data/app/views/decidim/participatory_processes/participatory_processes/{statistics.html.erb → all_metrics.html.erb} +0 -0
  71. data/app/views/decidim/participatory_processes/participatory_processes/show.html.erb +39 -13
  72. data/app/views/layouts/decidim/_process_header.html.erb +1 -1
  73. data/app/views/layouts/decidim/_process_header_steps.html.erb +1 -1
  74. data/app/views/layouts/decidim/_process_navigation.html.erb +1 -1
  75. data/app/views/layouts/decidim/admin/participatory_process.html.erb +2 -2
  76. data/app/views/layouts/decidim/admin/participatory_process_groups.html.erb +0 -11
  77. data/app/views/layouts/decidim/participatory_process.html.erb +1 -0
  78. data/config/locales/am-ET.yml +1 -0
  79. data/config/locales/ar.yml +18 -5
  80. data/config/locales/bg-BG.yml +19 -0
  81. data/config/locales/bg.yml +19 -0
  82. data/config/locales/ca.yml +57 -7
  83. data/config/locales/cs.yml +63 -13
  84. data/config/locales/da-DK.yml +1 -0
  85. data/config/locales/da.yml +1 -0
  86. data/config/locales/de.yml +55 -4
  87. data/config/locales/el-GR.yml +1 -0
  88. data/config/locales/el.yml +453 -0
  89. data/config/locales/en.yml +56 -6
  90. data/config/locales/eo.yml +1 -0
  91. data/config/locales/es-MX.yml +54 -4
  92. data/config/locales/es-PY.yml +54 -4
  93. data/config/locales/es.yml +55 -5
  94. data/config/locales/et-EE.yml +1 -0
  95. data/config/locales/et.yml +1 -0
  96. data/config/locales/eu.yml +6 -4
  97. data/config/locales/fi-plain.yml +51 -4
  98. data/config/locales/fi.yml +121 -74
  99. data/config/locales/fr-CA.yml +456 -0
  100. data/config/locales/fr.yml +54 -4
  101. data/config/locales/ga-IE.yml +1 -0
  102. data/config/locales/gl.yml +6 -4
  103. data/config/locales/hr-HR.yml +1 -0
  104. data/config/locales/hr.yml +1 -0
  105. data/config/locales/hu.yml +37 -8
  106. data/config/locales/id-ID.yml +6 -4
  107. data/config/locales/is-IS.yml +215 -0
  108. data/config/locales/is.yml +215 -0
  109. data/config/locales/it.yml +55 -8
  110. data/config/locales/ja-JP.yml +445 -0
  111. data/config/locales/ja.yml +445 -0
  112. data/config/locales/ko-KR.yml +1 -0
  113. data/config/locales/ko.yml +1 -0
  114. data/config/locales/lt-LT.yml +1 -0
  115. data/config/locales/lt.yml +1 -0
  116. data/config/locales/lv.yml +445 -0
  117. data/config/locales/mt-MT.yml +1 -0
  118. data/config/locales/mt.yml +1 -0
  119. data/config/locales/nl.yml +63 -16
  120. data/config/locales/no.yml +351 -25
  121. data/config/locales/om-ET.yml +1 -0
  122. data/config/locales/pl.yml +203 -152
  123. data/config/locales/pt-BR.yml +7 -5
  124. data/config/locales/pt.yml +175 -124
  125. data/config/locales/ro-RO.yml +461 -0
  126. data/config/locales/ru.yml +5 -3
  127. data/config/locales/sk-SK.yml +451 -0
  128. data/config/locales/sk.yml +451 -0
  129. data/config/locales/sl.yml +9 -0
  130. data/config/locales/so-SO.yml +1 -0
  131. data/config/locales/sr-CS.yml +33 -0
  132. data/config/locales/sv.yml +163 -109
  133. data/config/locales/ti-ER.yml +1 -0
  134. data/config/locales/tr-TR.yml +6 -4
  135. data/config/locales/uk.yml +5 -3
  136. data/config/locales/vi-VN.yml +1 -0
  137. data/config/locales/vi.yml +1 -0
  138. data/config/locales/zh-CN.yml +445 -0
  139. data/config/locales/zh-TW.yml +1 -0
  140. data/db/migrate/20200114142253_add_scope_type_to_participatory_processes.rb +7 -0
  141. data/db/migrate/20200204154917_add_show_metrics_to_participatory_processes.rb +7 -0
  142. data/db/migrate/20200320105908_index_foreign_keys_in_decidim_attachments.rb +7 -0
  143. data/db/migrate/20200320105924_index_foreign_keys_in_decidim_participatory_process_user_roles.rb +7 -0
  144. data/db/migrate/20200320105925_index_foreign_keys_in_decidim_participatory_processes.rb +8 -0
  145. data/db/migrate/20201006072346_fix_attachments_titles.rb +38 -0
  146. data/db/seeds/city.jpeg +0 -0
  147. data/db/seeds/city2.jpeg +0 -0
  148. data/lib/decidim/participatory_processes/admin_engine.rb +10 -9
  149. data/lib/decidim/participatory_processes/engine.rb +22 -5
  150. data/lib/decidim/participatory_processes/participatory_space.rb +32 -12
  151. data/lib/decidim/participatory_processes/query_extensions.rb +40 -0
  152. data/lib/decidim/participatory_processes/test/factories.rb +23 -3
  153. data/lib/decidim/participatory_processes/version.rb +1 -1
  154. metadata +82 -12
  155. data/app/views/decidim/participatory_processes/participatory_process_widgets/show.html.erb +0 -17
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 26796587924ddffda370cd31f84fe2356197e4a772670d73621b4d49eb3b48ec
4
- data.tar.gz: a580378c67f87b97d994f45afbe1633fc7dc75df0e2deb0489d74f8470be41aa
3
+ metadata.gz: faabe7f59e3cc5a0625d6a45979797b88f4cc246636eb815c0a88128679a750d
4
+ data.tar.gz: ef172c49e6002b52e0c56e457c76c68243fffbbef389b65493dc2b6c59b8f84e
5
5
  SHA512:
6
- metadata.gz: 69e91a8fd76b7fe47d34fab56a3607713654efebbabedd88a21624ec23763c5f6524a418a3313372adac0417834174e9541ff798cadf26704dfa3766164462a7
7
- data.tar.gz: e864877ec2478044dafda6763b939e197dc426541ed0d7a6889c5b0c2e52e7c1ea5f0a91978d0aa38d0190eb01ff4a346c3fded112e2df73685cea6fb1293237
6
+ metadata.gz: 3897d23fe32bec47ff1e0fc9e7901b22b7c2ff9fda14261ede73b8b599f6f48e193fa5293108b7bee55137c9c7720a57808379586c5d1e37b6c06f5aaa7c56b9
7
+ data.tar.gz: 27e519bfd6047e7bd91c71a5b7e2c0ec077becaa0e38a8c607844126077c01d5c50334e996c973db0c66074368e03400581d4d29eee36c23d629b5dd612ba6b7
@@ -2,11 +2,17 @@ $(() => {
2
2
  ((exports) => {
3
3
  const $participatoryProcessScopeEnabled = $("#participatory_process_scopes_enabled");
4
4
  const $participatoryProcessScopeId = $("#participatory_process_scope_id");
5
+ const $participatoryProcessScopeTypeId = $("#participatory_process_scope_type_max_depth_id");
5
6
 
6
7
  if ($(".edit_participatory_process, .new_participatory_process").length > 0) {
7
8
  $participatoryProcessScopeEnabled.on("change", (event) => {
8
9
  const checked = event.target.checked;
9
10
  exports.theDataPicker.enabled($participatoryProcessScopeId, checked);
11
+ if (checked === true) {
12
+ $participatoryProcessScopeTypeId.removeAttr("disabled");
13
+ } else {
14
+ $participatoryProcessScopeTypeId.attr("disabled", true)
15
+ }
10
16
  })
11
17
  exports.theDataPicker.enabled($participatoryProcessScopeId, $participatoryProcessScopeEnabled.prop("checked"));
12
18
  }
@@ -1,6 +1,9 @@
1
1
  <div class="row" id="see-all-processes">
2
2
  <div class="columns small-centered small-12
3
3
  smallmedium-8 medium-6 large-4">
4
- <%= link_to t("see_all_processes", scope: i18n_scope), decidim_participatory_processes.participatory_processes_path, class: "button expanded hollow button--sc home-section__cta" %>
4
+ <%= link_to t("see_all_processes", scope: i18n_scope),
5
+ decidim_participatory_processes.participatory_processes_path,
6
+ class: "button expanded hollow button--sc home-section__cta",
7
+ title: t("processes_button_title", scope: i18n_scope) %>
5
8
  </div>
6
9
  </div>
@@ -6,15 +6,11 @@
6
6
  large-up-4 card-grid">
7
7
  <% highlighted_processes.each do |process| %>
8
8
  <div class="column">
9
- <article class="card card--process card--mini">
10
- <%= link_to decidim_participatory_processes.participatory_process_path(process), class: "card__link" do %>
11
- <div class="card__image-top"
12
- style="background-image:url(<%= process.hero_image.url %>)"></div>
13
- <% end %>
9
+ <%= link_to decidim_participatory_processes.participatory_process_path(process), class: "card card--process card--mini" do %>
10
+ <div aria-hidden="true" class="card__image-top"
11
+ style="background-image:url(<%= process.hero_image.url %>)"></div>
14
12
  <div class="card__content">
15
- <%= link_to decidim_participatory_processes.participatory_process_path(process), class: "card__link" do %>
16
- <h4 class="card__title"><%= translated_attribute process.title %></h4>
17
- <% end %>
13
+ <span class="card__title card__link"><%= translated_attribute process.title %></span>
18
14
  <% if process.active_step %>
19
15
  <span class="card--process__small">
20
16
  <%= t("active_step", scope: i18n_scope) %>
@@ -22,7 +18,7 @@
22
18
  </span>
23
19
  <% end %>
24
20
  </div>
25
- </article>
21
+ <% end %>
26
22
  </div>
27
23
  <% end %>
28
24
  </div>
@@ -1,17 +1,21 @@
1
1
  <% process = highlighted_processes.first %>
2
+ <% title_id = "process_title" %>
2
3
  <section class="wrapper-home home-section">
3
4
  <div class="row" id="highlighted-processes">
4
5
  <h3 class="section-heading"><%= t("active_processes", scope: i18n_scope) %></h3>
5
6
  <div class="row collapse">
6
- <article class="card card--full card--process">
7
+ <div class="card card--full card--process">
7
8
  <div class="row collapse card--process__row">
8
9
  <div class="column large-6 card--process__column">
9
10
  <div class="card__content">
10
11
  <%= link_to decidim_participatory_processes.participatory_process_path(process), class: "card__link" do %>
11
- <h2 class="card__title"><%= translated_attribute process.title %></h2>
12
+ <h2 class="card__title" id="<%= title_id %>"><%= decidim_html_escape(translated_attribute(process.title)) %></h2>
12
13
  <% end %>
13
14
  <%= decidim_sanitize translated_attribute(process.short_description) %>
14
- <%= link_to t("more_information", scope: i18n_scope), decidim_participatory_processes.participatory_process_path(process), class: "button secondary small hollow" %>
15
+ <%= link_to decidim_participatory_processes.participatory_process_path(process), class: "button small hollow" do %>
16
+ <span class="show-for-sr"><%= decidim_html_escape(translated_attribute(process.title)) %></span>
17
+ <%= t("more_information", scope: i18n_scope) %>
18
+ <% end %>
15
19
  </div>
16
20
  </div>
17
21
  <div class="column large-6 card--process__column">
@@ -19,7 +23,8 @@
19
23
  <div class="card__content row collapse">
20
24
  <div class="large-6 large-offset-6 columns">
21
25
  <%= link_to decidim_participatory_processes.participatory_process_path(process), class: "button expanded button--sc" do %>
22
- <%= t("participate", scope: i18n_scope) %>
26
+ <span class="show-for-sr"><%= t("participate_in", resource_name: translated_attribute(process.title), scope: i18n_scope) %></span>
27
+ <span aria-hidden="true"><%= t("participate", scope: i18n_scope) %></span>
23
28
  <% if process.active_step %>
24
29
  <span class="button__info">
25
30
  <%= t("active_step", scope: i18n_scope) %>
@@ -32,7 +37,7 @@
32
37
  </div>
33
38
  </div>
34
39
  </div>
35
- </article>
40
+ </div>
36
41
  </div>
37
42
  </div>
38
43
  <%= render "_all_processes" %>
@@ -29,7 +29,7 @@ module Decidim
29
29
  OrganizationPublishedParticipatoryProcesses.new(current_organization, current_user) |
30
30
  HighlightedParticipatoryProcesses.new |
31
31
  FilteredParticipatoryProcesses.new("active")
32
- ).query.limit(max_results)
32
+ ).query.includes([:organization]).limit(max_results)
33
33
  end
34
34
 
35
35
  def i18n_scope
@@ -1,8 +1,8 @@
1
1
  <div class="row collapse order-by">
2
- <h2 class="order-by__text section-heading">
2
+ <h3 class="order-by__text section-heading">
3
3
  <%= title %>
4
4
  <%= render :filter_tabs %>
5
- </h2>
5
+ </h3>
6
6
  </div>
7
7
  <% if process_count_by_filter["active"] == 0 && process_count_by_filter["upcoming"] == 0 %>
8
8
  <div class="row column">
@@ -1,9 +1,8 @@
1
1
  <div class="card__footer card__footer--spaces">
2
2
  <div class="card__support">
3
- <%= link_to(
4
- t("layouts.decidim.participatory_process_groups.participatory_process_group.browse"),
5
- resource_path,
6
- class: "card__button button button--sc secondary light small"
7
- ) %>
3
+ <%= link_to(resource_path, class: "card__button button button--sc small") do %>
4
+ <span class="show-for-sr"><%= t("browse_resource", resource_name: title, scope: "layouts.decidim.participatory_process_groups.participatory_process_group") %></span>
5
+ <%= t("layouts.decidim.participatory_process_groups.participatory_process_group.browse") %>
6
+ <% end %>
8
7
  </div>
9
8
  </div>
@@ -1,7 +1,7 @@
1
1
  <div class="card__icondata">
2
2
  <ul class="card-data">
3
3
  <li class="card-data__item">
4
- <%= icon "datetime", class: "icon--big" %>
4
+ <%= icon "datetime", class: "icon--big", role: "img", aria_label: t("decidim.participatory_processes.show.dates") %>
5
5
  </li>
6
6
  <li class="card-data__item">
7
7
  <div class="card-data__item--centerblock">
@@ -2,14 +2,13 @@
2
2
  <div class="card__support">
3
3
  <% if has_step? %>
4
4
  <div class="card__support__data--left">
5
- <div class="text-uppercase"><%= t("layouts.decidim.participatory_processes.participatory_process.active_step") %></div>
5
+ <div><%= t("layouts.decidim.participatory_processes.participatory_process.active_step") %></div>
6
6
  <div class="text-ellipsis"><strong><%= step_title %></strong></div>
7
7
  </div>
8
8
  <% end %>
9
- <%= link_to(
10
- t(model.cta_button_text_key, scope: "layouts.decidim.participatory_processes.participatory_process"),
11
- resource_path,
12
- class: "card__button button button--sc secondary light small"
13
- ) %>
9
+ <%= link_to(step_cta_path, class: "card__button button button--sc small") do %>
10
+ <span class="show-for-sr"><%= step_cta_text %></span>
11
+ <%= step_cta_text %>
12
+ <% end %>
14
13
  </div>
15
14
  </div>
@@ -1,7 +1,7 @@
1
1
  <% if model.hashtag.present? %>
2
2
  <%= link_to(
3
- "##{model.hashtag}",
4
- "https://twitter.com/hashtag/#{model.hashtag}",
3
+ "##{decidim_html_escape(model.hashtag)}",
4
+ "https://twitter.com/hashtag/#{decidim_html_escape(model.hashtag)}",
5
5
  class: "card__text--category",
6
6
  target: "_blank"
7
7
  ) %>
@@ -5,6 +5,9 @@ module Decidim
5
5
  # This cell renders the Medium (:m) process card
6
6
  # for an given instance of a Process
7
7
  class ProcessMCell < Decidim::CardMCell
8
+ include Decidim::SanitizeHelper
9
+ include Decidim::TranslationsHelper
10
+
8
11
  private
9
12
 
10
13
  def has_image?
@@ -37,6 +40,24 @@ module Decidim
37
40
  model.hero_image.url
38
41
  end
39
42
 
43
+ def step_cta_text
44
+ if translated_in_current_locale?(model.active_step&.cta_text)
45
+ translated_attribute(model.active_step.cta_text)
46
+ else
47
+ t(model.cta_button_text_key_accessible, resource_name: title, scope: "layouts.decidim.participatory_processes.participatory_process")
48
+ end
49
+ end
50
+
51
+ def step_cta_path
52
+ if model.active_step&.cta_path.present?
53
+ path, params = resource_path.split("?")
54
+
55
+ "#{path}/#{model.active_step.cta_path}" + (params.present? ? "?#{params}" : "")
56
+ else
57
+ resource_path
58
+ end
59
+ end
60
+
40
61
  def step_title
41
62
  translated_attribute model.active_step.title
42
63
  end
@@ -0,0 +1,9 @@
1
+ <div class="process-stats__data">
2
+ <span class="process-stats__number">
3
+ <%= stat_number %>
4
+ </span>
5
+
6
+ <h4 class="process-stats__title">
7
+ <%= stat_title %>
8
+ </h4>
9
+ </div>
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module ParticipatoryProcesses
5
+ # This cell renders a Statistic of a ParticipatoryProcesses
6
+ class StatisticCell < Decidim::ViewModel
7
+ include ActionView::Helpers::NumberHelper
8
+
9
+ private
10
+
11
+ def stat_number
12
+ number_with_delimiter(model[:stat_number])
13
+ end
14
+
15
+ def stat_title
16
+ t(model[:stat_title], scope: "decidim.participatory_processes.statistics")
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,17 @@
1
+ <section class="row statistics" id="participatory_process-statistics">
2
+ <div class="columns large-8">
3
+ <div class="row column">
4
+ <h3 class="section-heading">
5
+ <%= stats_heading %>
6
+ </h3>
7
+
8
+ <div class="process-stats">
9
+ <% if model.present? %>
10
+ <%= cell("decidim/participatory_processes/statistic", collection: model) %>
11
+ <% else %>
12
+ <span class="muted"><%= no_stats %></span>
13
+ <% end %>
14
+ </div>
15
+ </div>
16
+ </div>
17
+ </section>
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module ParticipatoryProcesses
5
+ # This cell renders the Statistics of a ParticipatoryProcesses
6
+ class StatisticsCell < Decidim::ViewModel
7
+ private
8
+
9
+ def stats_heading
10
+ t("statistics.headline", scope: "decidim.participatory_processes")
11
+ end
12
+
13
+ def no_stats
14
+ t("statistics.no_stats", scope: "decidim.participatory_processes")
15
+ end
16
+ end
17
+ end
18
+ end
@@ -22,10 +22,11 @@ module Decidim
22
22
  def call
23
23
  return broadcast(:invalid) if form.invalid?
24
24
 
25
- process = create_participatory_process
25
+ create_participatory_process
26
26
 
27
27
  if process.persisted?
28
28
  add_admins_as_followers(process)
29
+ link_related_processes
29
30
  broadcast(:ok, process)
30
31
  else
31
32
  form.errors.add(:hero_image, process.errors[:hero_image]) if process.errors.include? :hero_image
@@ -36,10 +37,10 @@ module Decidim
36
37
 
37
38
  private
38
39
 
39
- attr_reader :form
40
+ attr_reader :form, :process
40
41
 
41
42
  def create_participatory_process
42
- process = ParticipatoryProcess.new(
43
+ @process = ParticipatoryProcess.new(
43
44
  organization: form.current_organization,
44
45
  title: form.title,
45
46
  subtitle: form.subtitle,
@@ -52,6 +53,7 @@ module Decidim
52
53
  promoted: form.promoted,
53
54
  scopes_enabled: form.scopes_enabled,
54
55
  scope: form.scope,
56
+ scope_type_max_depth: form.scope_type_max_depth,
55
57
  private_space: form.private_space,
56
58
  developer_group: form.developer_group,
57
59
  local_area: form.local_area,
@@ -106,15 +108,12 @@ module Decidim
106
108
  end
107
109
  end
108
110
 
109
- def create_participatory_process_users(process)
110
- return unless form.private_process
111
+ def related_processes
112
+ @related_processes ||= Decidim::ParticipatoryProcess.where(id: form.related_process_ids)
113
+ end
111
114
 
112
- form.users.each do |user|
113
- ParticipatoryProcessUser.create!(
114
- participatory_process: process,
115
- user: user
116
- )
117
- end
115
+ def link_related_processes
116
+ process.link_participatory_space_resources(related_processes, "related_processes")
118
117
  end
119
118
  end
120
119
  end
@@ -5,7 +5,7 @@ module Decidim
5
5
  module Admin
6
6
  # A command with all the business logic when creating a new participatory
7
7
  # process admin in the system.
8
- class CreateParticipatoryProcessAdmin < Rectify::Command
8
+ class CreateParticipatoryProcessAdmin < NotifyRoleAssignedToParticipatoryProcess
9
9
  # Public: Initializes the command.
10
10
  #
11
11
  # form - A form object with the params.
@@ -61,6 +61,7 @@ module Decidim
61
61
  role_params,
62
62
  extra_info
63
63
  )
64
+ send_notification user
64
65
  end
65
66
 
66
67
  def existing_role
@@ -45,11 +45,11 @@ module Decidim
45
45
  form.current_user
46
46
  ) do
47
47
  ParticipatoryProcessGroup.create(
48
+ organization: form.current_organization,
48
49
  name: form.name,
49
50
  description: form.description,
50
- hero_image: form.hero_image,
51
- participatory_processes: participatory_processes,
52
- organization: form.current_organization
51
+ hero_image: form.hero_image, # Keep after organization
52
+ participatory_processes: participatory_processes
53
53
  )
54
54
  end
55
55
  end
@@ -0,0 +1,72 @@
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 ImportParticipatoryProcess < 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)
14
+ @form = form
15
+ end
16
+
17
+ # Executes the command. Broadcasts these events:
18
+ #
19
+ # - :ok when everything is valid.
20
+ # - :invalid if the form wasn't valid and we couldn't proceed.
21
+ #
22
+ # Returns nothing.
23
+ def call
24
+ return broadcast(:invalid) if form.invalid?
25
+
26
+ transaction do
27
+ import_participatory_process
28
+ add_admins_as_followers(@imported_process)
29
+ end
30
+
31
+ broadcast(:ok, @imported_process)
32
+ end
33
+
34
+ private
35
+
36
+ attr_reader :form
37
+
38
+ def import_participatory_process
39
+ importer = Decidim::ParticipatoryProcesses::ParticipatoryProcessImporter.new(form.current_organization, form.current_user)
40
+ participatory_processes.each do |original_process|
41
+ @imported_process = importer.import(original_process, form.current_user, title: form.title, slug: form.slug)
42
+ importer.import_participatory_process_steps(original_process["participatory_process_steps"]) if form.import_steps?
43
+ importer.import_categories(original_process["participatory_process_categories"]) if form.import_categories?
44
+ importer.import_folders_and_attachments(original_process["attachments"]) if form.import_attachments?
45
+ importer.import_components(original_process["components"]) if form.import_components?
46
+ end
47
+ end
48
+
49
+ def participatory_processes
50
+ document_parsed(form.document_text)
51
+ end
52
+
53
+ def document_parsed(document_text)
54
+ JSON.parse(document_text)
55
+ end
56
+
57
+ def add_admins_as_followers(process)
58
+ process.organization.admins.each do |admin|
59
+ form = Decidim::FollowForm
60
+ .from_params(followable_gid: process.to_signed_global_id.to_s)
61
+ .with_context(
62
+ current_organization: process.organization,
63
+ current_user: admin
64
+ )
65
+
66
+ Decidim::CreateFollow.new(form, admin).call
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end