decidim-participatory_processes 0.19.1 → 0.20.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.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/app/commands/decidim/participatory_processes/admin/create_participatory_process.rb +0 -11
  3. data/app/commands/decidim/participatory_processes/admin/import_participatory_process.rb +72 -0
  4. data/app/controllers/decidim/participatory_processes/admin/participatory_process_exports_controller.rb +20 -0
  5. data/app/controllers/decidim/participatory_processes/admin/participatory_process_imports_controller.rb +31 -0
  6. data/app/forms/decidim/participatory_processes/admin/participatory_process_import_form.rb +80 -0
  7. data/app/models/decidim/participatory_process.rb +13 -0
  8. data/app/permissions/decidim/participatory_processes/permissions.rb +6 -2
  9. data/app/presenters/decidim/participatory_processes/participatory_process_group_presenter.rb +22 -0
  10. data/app/presenters/decidim/participatory_processes/participatory_process_presenter.rb +25 -0
  11. data/app/serializers/decidim/participatory_processes/participatory_process_importer.rb +178 -0
  12. data/app/serializers/decidim/participatory_processes/participatory_process_serializer.rb +153 -0
  13. data/app/views/decidim/participatory_processes/admin/participatory_process_groups/index.html.erb +8 -0
  14. data/app/views/decidim/participatory_processes/admin/participatory_process_imports/_form.html.erb +49 -0
  15. data/app/views/decidim/participatory_processes/admin/participatory_process_imports/new.html.erb +7 -0
  16. data/app/views/decidim/participatory_processes/admin/participatory_processes/index.html.erb +12 -0
  17. data/app/views/decidim/participatory_processes/admin/shared/_secondary_nav.html.erb +17 -0
  18. data/app/views/layouts/decidim/admin/participatory_process_groups.html.erb +0 -11
  19. data/config/locales/ca.yml +19 -0
  20. data/config/locales/cs.yml +19 -0
  21. data/config/locales/en.yml +19 -0
  22. data/config/locales/fi-plain.yml +19 -0
  23. data/config/locales/fi.yml +19 -0
  24. data/config/locales/fr.yml +19 -0
  25. data/config/locales/hu.yml +19 -0
  26. data/config/locales/it.yml +19 -0
  27. data/config/locales/nl.yml +19 -0
  28. data/config/locales/no.yml +4 -0
  29. data/config/locales/sv.yml +10 -0
  30. data/lib/decidim/participatory_processes/admin_engine.rb +9 -9
  31. data/lib/decidim/participatory_processes/participatory_space.rb +10 -0
  32. data/lib/decidim/participatory_processes/version.rb +1 -1
  33. metadata +19 -8
@@ -0,0 +1,153 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module ParticipatoryProcesses
5
+ # This class serializes a ParticipatoryProcesses so can be exported to CSV, JSON or other
6
+ # formats.
7
+ class ParticipatoryProcessSerializer < Decidim::Exporters::Serializer
8
+ include Decidim::ApplicationHelper
9
+ include Decidim::ResourceHelper
10
+ include Decidim::TranslationsHelper
11
+
12
+ # Public: Initializes the serializer with a participatory_process.
13
+ def initialize(participatory_process)
14
+ @participatory_process = participatory_process
15
+ end
16
+
17
+ # Public: Exports a hash with the serialized data for this participatory_process.
18
+ def serialize
19
+ {
20
+ id: participatory_process.id,
21
+ title: participatory_process.title,
22
+ subtitle: participatory_process.subtitle,
23
+ slug: participatory_process.slug,
24
+ hashtag: participatory_process.hashtag,
25
+ short_description: participatory_process.short_description,
26
+ description: participatory_process.description,
27
+ announcement: participatory_process.announcement,
28
+ start_date: participatory_process.start_date,
29
+ end_date: participatory_process.end_date,
30
+ remote_hero_image_url: Decidim::ParticipatoryProcesses::ParticipatoryProcessPresenter.new(participatory_process).hero_image_url,
31
+ remote_banner_image_url: Decidim::ParticipatoryProcesses::ParticipatoryProcessPresenter.new(participatory_process).banner_image_url,
32
+ developer_group: participatory_process.developer_group,
33
+ local_area: participatory_process.local_area,
34
+ meta_scope: participatory_process.meta_scope,
35
+ participatory_scope: participatory_process.participatory_scope,
36
+ participatory_structure: participatory_process.participatory_structure,
37
+ target: participatory_process.target,
38
+ area: {
39
+ id: participatory_process.area.try(:id),
40
+ name: participatory_process.area.try(:name) || empty_translatable
41
+ },
42
+ participatory_process_group: {
43
+ id: participatory_process.participatory_process_group.try(:id),
44
+ name: participatory_process.participatory_process_group.try(:name) || empty_translatable,
45
+ description: participatory_process.participatory_process_group.try(:description) || empty_translatable,
46
+ remote_hero_image_url: Decidim::ParticipatoryProcesses::ParticipatoryProcessGroupPresenter.new(participatory_process.participatory_process_group).hero_image_url
47
+ },
48
+ scope: {
49
+ id: participatory_process.scope.try(:id),
50
+ name: participatory_process.scope.try(:name) || empty_translatable
51
+ },
52
+ private_space: participatory_process.private_space,
53
+ promoted: participatory_process.promoted,
54
+ scopes_enabled: participatory_process.scopes_enabled,
55
+ show_statistics: participatory_process.show_statistics,
56
+ participatory_process_steps: serialize_participatory_process_steps,
57
+ participatory_process_categories: serialize_categories,
58
+ attachments: {
59
+ attachment_collections: serialize_attachment_collections,
60
+ files: serialize_attachments
61
+ },
62
+ components: serialize_components
63
+ }
64
+ end
65
+
66
+ private
67
+
68
+ attr_reader :participatory_process
69
+
70
+ def serialize_participatory_process_steps
71
+ return unless participatory_process.steps.any?
72
+
73
+ participatory_process.steps.map do |step|
74
+ {
75
+ id: step.try(:id),
76
+ title: step.try(:title),
77
+ description: step.try(:description),
78
+ start_date: step.try(:start_date),
79
+ end_date: step.try(:end_date),
80
+ cta_path: step.try(:cta_path),
81
+ cta_text: step.try(:cta_text),
82
+ active: step.active,
83
+ position: step.position
84
+ }
85
+ end
86
+ end
87
+
88
+ def serialize_categories
89
+ return unless participatory_process.categories.first_class.any?
90
+
91
+ participatory_process.categories.first_class.map do |category|
92
+ {
93
+ id: category.try(:id),
94
+ name: category.try(:name),
95
+ description: category.try(:description),
96
+ parent_id: category.try(:parent_id),
97
+ subcategories: serialize_subcategories(category.subcategories)
98
+ }
99
+ end
100
+ end
101
+
102
+ def serialize_subcategories(subcategories)
103
+ return unless subcategories.any?
104
+
105
+ subcategories.map do |subcategory|
106
+ {
107
+ id: subcategory.try(:id),
108
+ name: subcategory.try(:name),
109
+ description: subcategory.try(:description),
110
+ parent_id: subcategory.try(:parent_id)
111
+ }
112
+ end
113
+ end
114
+
115
+ def serialize_attachment_collections
116
+ return unless participatory_process.attachment_collections.any?
117
+
118
+ participatory_process.attachment_collections.map do |collection|
119
+ {
120
+ id: collection.try(:id),
121
+ name: collection.try(:name),
122
+ weight: collection.try(:weight),
123
+ description: collection.try(:description)
124
+ }
125
+ end
126
+ end
127
+
128
+ def serialize_attachments
129
+ return unless participatory_process.attachments.any?
130
+
131
+ participatory_process.attachments.map do |attachment|
132
+ {
133
+ id: attachment.try(:id),
134
+ title: attachment.try(:title),
135
+ weight: attachment.try(:weight),
136
+ description: attachment.try(:description),
137
+ attachment_collection: {
138
+ name: attachment.attachment_collection.try(:name),
139
+ weight: attachment.attachment_collection.try(:weight),
140
+ description: attachment.attachment_collection.try(:description)
141
+ },
142
+ remote_file_url: Decidim::AttachmentPresenter.new(attachment).attachment_file_url
143
+ }
144
+ end
145
+ end
146
+
147
+ def serialize_components
148
+ serializer = Decidim::Exporters::ParticipatorySpaceComponentsSerializer.new(@participatory_process)
149
+ serializer.serialize
150
+ end
151
+ end
152
+ end
153
+ end
@@ -1,3 +1,11 @@
1
+ <%= render partial: "decidim/participatory_processes/admin/shared/secondary_nav" %>
2
+
3
+ <div class="process-title">
4
+ <div class="process-title-content">
5
+ <%= link_to t("decidim.admin.titles.participatory_process_groups"), decidim_participatory_processes.participatory_processes_path, target: "_blank" %>
6
+ </div>
7
+ </div>
8
+
1
9
  <div class="card">
2
10
  <div class="card-divider">
3
11
  <h2 class="card-title">
@@ -0,0 +1,49 @@
1
+ <%= javascript_include_tag "decidim/slug_form" %>
2
+
3
+ <div class="card" id="processes">
4
+ <div class="card-divider">
5
+ <h2 class="card-title"><%= title %></h2>
6
+ </div>
7
+ <div class="card-section">
8
+ <div class="row column">
9
+ <div class="row">
10
+ <div class="column xlarge-8">
11
+ <%= form.translated :text_field, :title, autofocus: true %>
12
+ </div>
13
+ <div class="column xlarge-4 slug">
14
+ <%= form.text_field :slug %>
15
+ <p class="help-text"><%== t(".slug_help", url: decidim_form_slug_url(:processes, form.object.slug)) %></p>
16
+ </div>
17
+ <div class="column xlarge-8">
18
+ <fieldset>
19
+ <legend><%= t(".document_legend") %> </legend>
20
+ <div class="row column">
21
+ <%= form.upload :document, optional: false %>
22
+ </div>
23
+ </fieldset>
24
+ </div>
25
+ </div>
26
+ <div class="card">
27
+ <div class="card-divider">
28
+ <legend><%= select %></legend>
29
+ </div>
30
+ <div class="card-section">
31
+ <div class="row">
32
+ <div class="columns xlarge-3">
33
+ <%= form.check_box :import_steps %>
34
+ </div>
35
+ <div class="columns xlarge-3">
36
+ <%= form.check_box :import_categories %>
37
+ </div>
38
+ <div class="columns xlarge-3">
39
+ <%= form.check_box :import_attachments %>
40
+ </div>
41
+ <div class="columns xlarge-6">
42
+ <%= form.check_box :import_components %>
43
+ </div>
44
+ </div>
45
+ </div>
46
+ </div>
47
+ </div>
48
+ </div>
49
+ </div>
@@ -0,0 +1,7 @@
1
+ <%= decidim_form_for(@form, url: imports_path, method: :post, html: { class: "form import_participatory_process" }) do |f| %>
2
+ <%= render partial: "form", object: f, locals: { title: t("participatory_process_imports.new.title", scope: "decidim.admin"), select: t("participatory_process_imports.new.select", scope: "decidim.admin") } %>
3
+
4
+ <div class="button--double form-general-submit">
5
+ <%= f.submit t("participatory_process_imports.new.import", scope: "decidim.admin") %>
6
+ </div>
7
+ <% end %>
@@ -1,3 +1,5 @@
1
+ <%= render partial: "decidim/participatory_processes/admin/shared/secondary_nav" %>
2
+
1
3
  <div class="card" id="processes">
2
4
  <div class="card-divider">
3
5
  <h2 class="card-title">
@@ -9,6 +11,12 @@
9
11
  edit_participatory_process_group_path(@process_group) %>
10
12
  <% end %>
11
13
 
14
+ <% if allowed_to? :import, :process %>
15
+ <%= link_to t("actions.import_process", scope: "decidim.admin"),
16
+ new_import_path,
17
+ class: "button tiny button--title" %>
18
+ <% end %>
19
+
12
20
  <% if allowed_to? :create, :process %>
13
21
  <%= link_to t("actions.new_process", scope: "decidim.admin"),
14
22
  ["new", "participatory_process"],
@@ -88,6 +96,10 @@
88
96
  <% end %>
89
97
  </td>
90
98
  <td class="table-list__actions">
99
+ <% if allowed_to? :create, :process, process: process %>
100
+ <%= icon_link_to "data-transfer-download", participatory_process_export_path(process), t("actions.export", scope: "decidim.admin"), method: :post, class: "action-icon--export" %>
101
+ <% end %>
102
+
91
103
  <% if allowed_to? :create, :process, process: process %>
92
104
  <%= icon_link_to "clipboard", new_participatory_process_copy_path(process), t("actions.duplicate", scope: "decidim.admin"), class: "action-icon--copy" %>
93
105
  <% end %>
@@ -0,0 +1,17 @@
1
+ <% content_for :secondary_nav do %>
2
+ <div class="secondary-nav secondary-nav--subnav">
3
+ <ul>
4
+ <% if allowed_to?(:enter, :space_area, space_name: :processes) %>
5
+ <li <% if is_active_link?(decidim_admin_participatory_processes.participatory_processes_path) %> class="is-active" <% end %>>
6
+ <%= aria_selected_link_to I18n.t("menu.participatory_processes", scope: "decidim.admin"),
7
+ decidim_admin_participatory_processes.participatory_processes_path %>
8
+ </li>
9
+ <% end %>
10
+ <% if allowed_to?(:enter, :space_area, space_name: :process_groups) %>
11
+ <li <% if is_active_link?(decidim_admin_participatory_processes.participatory_process_groups_path) %> class="is-active" <% end %>>
12
+ <%= aria_selected_link_to I18n.t("menu.participatory_process_groups", scope: "decidim.admin"), decidim_admin_participatory_processes.participatory_process_groups_path %>
13
+ </li>
14
+ <% end %>
15
+ </ul>
16
+ </div>
17
+ <% end %>
@@ -1,14 +1,3 @@
1
- <% content_for :secondary_nav do %>
2
- <div class="secondary-nav">
3
- <div class="secondary-nav__title">
4
- <%= t "decidim.admin.titles.participatory_process_groups" %>
5
- </div>
6
- <div class="secondary-nav__actions">
7
- <%= link_to t("actions.new", scope: "decidim.admin", name: t("models.participatory_process_group.name", scope: "decidim.admin")), ["new", "participatory_process_group"], class: "button expanded small new" if allowed_to? :create, :process_group %>
8
- </div>
9
- </div>
10
- <% end %>
11
-
12
1
  <%= render "layouts/decidim/admin/application" do %>
13
2
  <%= yield %>
14
3
  <% end %>
@@ -48,6 +48,12 @@ ca:
48
48
  email: Correu electrònic
49
49
  name: Nom
50
50
  role: Rol
51
+ errors:
52
+ models:
53
+ participatory_process:
54
+ attributes:
55
+ document:
56
+ invalid_document_type: 'Tipus de document no vàlid. Els formats acceptats són: %{valid_mime_types}'
51
57
  models:
52
58
  decidim/participatory_process_step_activated_event: Fase activada
53
59
  decidim/participatory_process_step_changed_event: Fase modificada
@@ -74,6 +80,7 @@ ca:
74
80
  filter:
75
81
  all: Mostra tots els processos
76
82
  process_groups: Grups de processos
83
+ import_process: Importar
77
84
  new_process: Nou procés
78
85
  new_process_group: Nou grup de processos
79
86
  new_process_step: Nova fase
@@ -147,6 +154,14 @@ ca:
147
154
  update:
148
155
  error: S'ha produït un error en actualitzar aquest grup de processos participatius.
149
156
  success: Grup de processos participatius actualitzat correctament.
157
+ participatory_process_imports:
158
+ create:
159
+ error: S'ha produït un error en actualitzar aquest procés participatiu.
160
+ success: El procés participatiu s'ha importat correctament.
161
+ new:
162
+ import: Importar
163
+ select: Selecciona quines dades vols importar.
164
+ title: Importar el procés participatiu
150
165
  participatory_process_publications:
151
166
  create:
152
167
  error: S'ha produït un error en publicar aquest procés participatiu.
@@ -291,6 +306,10 @@ ca:
291
306
  participatory_process_copies:
292
307
  form:
293
308
  slug_help: 'Els noms curts d''URL s''utilitzen per generar els URL que apunten a aquest procés. Només accepta lletres, números i guions, i ha de començar amb una lletra. Exemple: %{url}'
309
+ participatory_process_imports:
310
+ form:
311
+ document_legend: Afegeix un document
312
+ slug_help: 'Els noms curts d''URL s''utilitzen per generar les URL que apunten a aquest procés. Només accepta lletres, números i guions, i ha de començar amb una lletra. Exemple: %{url}'
294
313
  participatory_process_steps:
295
314
  form:
296
315
  cta_path_help: 'Utilitza rutes parcials, no URL complerts aquí. Accepta lletres, números, guions i barres, i ha de començar amb una lletra. Si no s''estableix cap ruta, el botó no es mostrarà. Exemple: %{url}'
@@ -48,6 +48,12 @@ cs:
48
48
  email: E-mailem
49
49
  name: název
50
50
  role: Role
51
+ errors:
52
+ models:
53
+ participatory_process:
54
+ attributes:
55
+ document:
56
+ invalid_document_type: 'Neplatný typ dokumentu. Přijatelné formáty jsou: %{valid_mime_types}'
51
57
  models:
52
58
  decidim/participatory_process_step_activated_event: Krok aktivován
53
59
  decidim/participatory_process_step_changed_event: Krok se změnil
@@ -80,6 +86,7 @@ cs:
80
86
  filter:
81
87
  all: Zobrazit všechny procesy
82
88
  process_groups: Skupiny procesů
89
+ import_process: Importovat
83
90
  new_process: Nový proces
84
91
  new_process_group: Nová skupina procesů
85
92
  new_process_step: Nový krok
@@ -153,6 +160,14 @@ cs:
153
160
  update:
154
161
  error: Byla chyba při aktualizaci této participační skupiny procesů.
155
162
  success: Skupina účastnických procesů byla úspěšně aktualizována.
163
+ participatory_process_imports:
164
+ create:
165
+ error: Při importu tohoto participačního procesu došlo k chybě.
166
+ success: Participační proces byl úspěšně importován.
167
+ new:
168
+ import: Importovat
169
+ select: Vyberte, které údaje chcete importovat
170
+ title: Importovat proces participace
156
171
  participatory_process_publications:
157
172
  create:
158
173
  error: Při publikování tohoto procesu participace došlo k chybě.
@@ -299,6 +314,10 @@ cs:
299
314
  participatory_process_copies:
300
315
  form:
301
316
  slug_help: 'Sloupce adres URL se používají k vygenerování adres URL, které směřují k tomuto procesu. Přijme pouze písmena, čísla a pomlčky a musí začínat písmenem. Příklad: %{url}'
317
+ participatory_process_imports:
318
+ form:
319
+ document_legend: Přidat dokument
320
+ slug_help: 'URL slug se používají k vygenerování adres URL, které odkazují na toto shromáždění. Přijme pouze písmena, čísla a pomlčky a musí začínat písmenem. Příklad: %{url}'
302
321
  participatory_process_steps:
303
322
  form:
304
323
  cta_path_help: 'Použijte zde částečné cesty, ne úplné adresy URL. Přijme písmena, čísla, pomlčky a lomítka a musí začínat písmenem. Není-li nastaveno, tlačítko se nezobrazí. Příklad: %{url}'
@@ -49,6 +49,12 @@ en:
49
49
  email: Email
50
50
  name: Name
51
51
  role: Role
52
+ errors:
53
+ models:
54
+ participatory_process:
55
+ attributes:
56
+ document:
57
+ invalid_document_type: 'Invalid document type. Accepted formats are: %{valid_mime_types}'
52
58
  models:
53
59
  decidim/participatory_process_step_activated_event: Phase activated
54
60
  decidim/participatory_process_step_changed_event: Phase changed
@@ -75,6 +81,7 @@ en:
75
81
  filter:
76
82
  all: Show all processes
77
83
  process_groups: Process Groups
84
+ import_process: Import
78
85
  new_process: New process
79
86
  new_process_group: New process group
80
87
  new_process_step: New phase
@@ -148,6 +155,14 @@ en:
148
155
  update:
149
156
  error: There was a problem updating this participatory process group.
150
157
  success: Participatory process group successfully updated.
158
+ participatory_process_imports:
159
+ create:
160
+ error: There was a problem importing this participatory process.
161
+ success: Participatory process successfully imported.
162
+ new:
163
+ import: Import
164
+ select: Select which data you would like to import
165
+ title: Import participatory process
151
166
  participatory_process_publications:
152
167
  create:
153
168
  error: There was a problem publishing this participatory process.
@@ -292,6 +307,10 @@ en:
292
307
  participatory_process_copies:
293
308
  form:
294
309
  slug_help: 'URL slugs are used to generate the URLs that point to this process. Only accepts letters, numbers and dashes, and must start with a letter. Example: %{url}'
310
+ participatory_process_imports:
311
+ form:
312
+ document_legend: Add a document
313
+ slug_help: 'URL slugs are used to generate the URLs that point to this process. Only accepts letters, numbers and dashes, and must start with a letter. Example: %{url}'
295
314
  participatory_process_steps:
296
315
  form:
297
316
  cta_path_help: 'Use partial paths, not full URLs here. Accepts letters, numbers, dashes and slashes, and must start with a letter. If not set, the button will not be shown. Example: %{url}'
@@ -48,6 +48,12 @@ fi-pl:
48
48
  email: Sähköposti
49
49
  name: Nimi
50
50
  role: Rooli
51
+ errors:
52
+ models:
53
+ participatory_process:
54
+ attributes:
55
+ document:
56
+ invalid_document_type: 'Virheellinen asiakirjan tyyppi. Hyväksytyt tiedostomuodot ovat: %{valid_mime_types}'
51
57
  models:
52
58
  decidim/participatory_process_step_activated_event: Vaihe aktivoidaan
53
59
  decidim/participatory_process_step_changed_event: Vaihe muutettu
@@ -74,6 +80,7 @@ fi-pl:
74
80
  filter:
75
81
  all: Näytä kaikki prosessit
76
82
  process_groups: Prosessiryhmät
83
+ import_process: Tuo
77
84
  new_process: Uusi prosessi
78
85
  new_process_group: Uusi prosessiryhmä
79
86
  new_process_step: Uusi vaihe
@@ -147,6 +154,14 @@ fi-pl:
147
154
  update:
148
155
  error: Tämän osallisuusprosessien ryhmän päivityksessä tapahtui virhe.
149
156
  success: Osallisuusprosessien ryhmä päivitetty onnistuneesti.
157
+ participatory_process_imports:
158
+ create:
159
+ error: Virhe tuotaessa tätä osallisuusprosessia.
160
+ success: Osallisuusprosessi tuotu onnistuneesti.
161
+ new:
162
+ import: Tuo
163
+ select: Valitse, mitkä tiedot haluat tuoda
164
+ title: Tuo osallisuusprosessi
150
165
  participatory_process_publications:
151
166
  create:
152
167
  error: Tämän osallisuusprosessin julkaisussa tapahtui virhe.
@@ -291,6 +306,10 @@ fi-pl:
291
306
  participatory_process_copies:
292
307
  form:
293
308
  slug_help: 'URL-tunnisteita käytetään tuottamaan URL-tunnisteet, jotka viittaavat tähän prosessiin. Hyväksyy vain kirjaimia, numeroita ja viivoja. Arvon on alettava kirjaimella. Esimerkki: %{url}'
309
+ participatory_process_imports:
310
+ form:
311
+ document_legend: Lisää asiakirja
312
+ slug_help: 'URL-tunnisteita käytetään tuottamaan URL-osoitteet, jotka viittaavat tähän prosessiin. Hyväksyy vain kirjaimet, numerot ja viivat. Arvon on alettava kirjaimella. Esimerkki: %{url}'
294
313
  participatory_process_steps:
295
314
  form:
296
315
  cta_path_help: 'Käytä osittaisia ​​polkuja, ei kokonaisia URL-osoitteita. Hyväksyy kirjaimet, numerot, väliviivat ja kauttaviivat. Arvon täytyy alkaa kirjaimella. Jos asetusta ei ole asetettu, painiketta ei näytetä. Esimerkki: %{url}'