decidim-participatory_processes 0.19.1 → 0.20.0

Sign up to get free protection for your applications and to get access to all the features.
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}'