decidim-proposals 0.14.4 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -0
  3. data/app/assets/images/decidim/gamification/badges/accepted_proposals.svg +194 -104
  4. data/app/assets/images/decidim/gamification/badges/proposals.svg +192 -108
  5. data/app/assets/javascripts/decidim/proposals/admin/proposals.es6 +25 -20
  6. data/app/cells/decidim/proposals/proposal_activity_cell.rb +19 -0
  7. data/app/commands/decidim/proposals/admin/answer_proposal.rb +6 -2
  8. data/app/commands/decidim/proposals/admin/create_proposal.rb +4 -4
  9. data/app/commands/decidim/proposals/admin/import_participatory_text.rb +49 -0
  10. data/app/commands/decidim/proposals/admin/import_proposals.rb +7 -21
  11. data/app/commands/decidim/proposals/admin/merge_proposals.rb +68 -0
  12. data/app/commands/decidim/proposals/admin/publish_participatory_text.rb +65 -0
  13. data/app/commands/decidim/proposals/admin/split_proposals.rb +67 -0
  14. data/app/commands/decidim/proposals/admin/update_proposal.rb +67 -0
  15. data/app/commands/decidim/proposals/create_collaborative_draft.rb +19 -14
  16. data/app/commands/decidim/proposals/create_proposal.rb +4 -2
  17. data/app/commands/decidim/proposals/endorse_proposal.rb +5 -1
  18. data/app/commands/decidim/proposals/publish_proposal.rb +15 -3
  19. data/app/commands/decidim/proposals/unvote_proposal.rb +34 -3
  20. data/app/commands/decidim/proposals/vote_proposal.rb +32 -2
  21. data/app/controllers/decidim/proposals/admin/participatory_texts_controller.rb +62 -0
  22. data/app/controllers/decidim/proposals/admin/proposals_controller.rb +28 -1
  23. data/app/controllers/decidim/proposals/admin/proposals_merges_controller.rb +27 -0
  24. data/app/controllers/decidim/proposals/admin/proposals_splits_controller.rb +27 -0
  25. data/app/controllers/decidim/proposals/collaborative_drafts_controller.rb +0 -1
  26. data/app/controllers/decidim/proposals/proposal_endorsements_controller.rb +6 -2
  27. data/app/controllers/decidim/proposals/proposal_votes_controller.rb +15 -0
  28. data/app/controllers/decidim/proposals/proposals_controller.rb +1 -1
  29. data/app/forms/decidim/proposals/admin/import_participatory_text_form.rb +28 -0
  30. data/app/forms/decidim/proposals/admin/preview_participatory_text_form.rb +21 -0
  31. data/app/forms/decidim/proposals/admin/proposal_form.rb +4 -1
  32. data/app/forms/decidim/proposals/admin/proposals_fork_form.rb +57 -0
  33. data/app/forms/decidim/proposals/admin/proposals_merge_form.rb +13 -0
  34. data/app/forms/decidim/proposals/admin/proposals_split_form.rb +12 -0
  35. data/app/helpers/decidim/proposals/application_helper.rb +23 -0
  36. data/app/helpers/decidim/proposals/map_helper.rb +1 -1
  37. data/app/helpers/decidim/proposals/participatory_texts_helper.rb +18 -0
  38. data/app/helpers/decidim/proposals/proposal_endorsements_helper.rb +1 -1
  39. data/app/helpers/decidim/proposals/proposal_wizard_helper.rb +2 -1
  40. data/app/jobs/decidim/proposals/notify_proposals_mentioned_job.rb +3 -4
  41. data/app/models/decidim/proposals/participatory_text.rb +13 -0
  42. data/app/models/decidim/proposals/proposal.rb +31 -9
  43. data/app/models/decidim/proposals/proposal_vote.rb +21 -1
  44. data/app/permissions/decidim/proposals/admin/permissions.rb +30 -0
  45. data/app/presenters/decidim/proposals/admin_log/proposal_presenter.rb +5 -1
  46. data/app/presenters/decidim/proposals/log/resource_presenter.rb +18 -0
  47. data/app/presenters/decidim/proposals/official_author_presenter.rb +4 -0
  48. data/app/queries/decidim/proposals/metrics/accepted_proposals_metric_manage.rb +29 -0
  49. data/app/queries/decidim/proposals/metrics/proposals_metric_manage.rb +53 -0
  50. data/app/queries/decidim/proposals/metrics/votes_metric_manage.rb +57 -0
  51. data/app/services/decidim/proposals/proposal_builder.rb +72 -0
  52. data/app/services/decidim/proposals/proposal_search.rb +2 -2
  53. data/app/views/decidim/proposals/admin/participatory_texts/_article-preview.html.erb +13 -0
  54. data/app/views/decidim/proposals/admin/participatory_texts/_bulk-actions.html.erb +1 -0
  55. data/app/views/decidim/proposals/admin/participatory_texts/index.html.erb +43 -0
  56. data/app/views/decidim/proposals/admin/participatory_texts/new_import.html.erb +39 -0
  57. data/app/views/decidim/proposals/admin/proposals/_bulk-actions.html.erb +7 -2
  58. data/app/views/decidim/proposals/admin/proposals/_proposal-tr.html.erb +4 -0
  59. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_dropdown.html.erb +36 -0
  60. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_merge.html.erb +15 -0
  61. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_recategorize.html.erb +15 -0
  62. data/app/views/decidim/proposals/admin/proposals/bulk_actions/_split.html.erb +15 -0
  63. data/app/views/decidim/proposals/admin/proposals/edit.html.erb +7 -0
  64. data/app/views/decidim/proposals/admin/proposals/index.html.erb +2 -2
  65. data/app/views/decidim/proposals/collaborative_drafts/compare.html.erb +2 -2
  66. data/app/views/decidim/proposals/collaborative_drafts/complete.html.erb +1 -1
  67. data/app/views/decidim/proposals/collaborative_drafts/show.html.erb +1 -1
  68. data/app/views/decidim/proposals/proposal_endorsements/_identity.html.erb +5 -1
  69. data/app/views/decidim/proposals/proposal_endorsements/update_buttons_and_counters.js.erb +1 -1
  70. data/app/views/decidim/proposals/proposal_votes/update_buttons_and_counters.js.erb +13 -4
  71. data/app/views/decidim/proposals/proposals/_edit_form_fields.html.erb +2 -2
  72. data/app/views/decidim/proposals/proposals/_endorsement_identities_cabin.html.erb +1 -1
  73. data/app/views/decidim/proposals/proposals/_proposal_similar.html.erb +1 -1
  74. data/app/views/decidim/proposals/proposals/_voting_rules.html.erb +15 -4
  75. data/app/views/decidim/proposals/proposals/new.html.erb +1 -1
  76. data/config/locales/ca.yml +72 -4
  77. data/config/locales/de.yml +71 -3
  78. data/config/locales/en.yml +71 -3
  79. data/config/locales/es-PY.yml +71 -3
  80. data/config/locales/es.yml +73 -5
  81. data/config/locales/eu.yml +71 -3
  82. data/config/locales/fi.yml +81 -13
  83. data/config/locales/fr.yml +71 -3
  84. data/config/locales/gl.yml +71 -3
  85. data/config/locales/hu.yml +71 -3
  86. data/config/locales/it.yml +71 -3
  87. data/config/locales/nl.yml +71 -3
  88. data/config/locales/pl.yml +71 -3
  89. data/config/locales/pt-BR.yml +72 -4
  90. data/config/locales/pt.yml +71 -3
  91. data/config/locales/sv.yml +71 -3
  92. data/db/migrate/20180927111721_create_participatory_texts.rb +13 -0
  93. data/db/migrate/20180930125321_add_participatory_text_level_to_proposals.rb +7 -0
  94. data/db/migrate/20180930125321_add_position_to_proposals.rb +7 -0
  95. data/db/migrate/20181003074440_fix_user_groups_ids_in_proposals_endorsements.rb +16 -0
  96. data/db/migrate/20181010114622_add_temporary_votes.rb +9 -0
  97. data/db/migrate/20181016132225_add_organization_as_author.rb +13 -0
  98. data/db/migrate/20181017084221_make_author_polymorhpic_for_proposal_endorsements.rb +31 -0
  99. data/lib/decidim/content_parsers/proposal_parser.rb +9 -3
  100. data/lib/decidim/proposals.rb +3 -1
  101. data/lib/decidim/proposals/admin_engine.rb +12 -1
  102. data/lib/decidim/proposals/component.rb +60 -23
  103. data/lib/decidim/proposals/engine.rb +55 -12
  104. data/lib/decidim/proposals/markdown_to_proposals.rb +90 -0
  105. data/lib/decidim/proposals/participatory_text_section.rb +21 -0
  106. data/lib/decidim/proposals/test/factories.rb +35 -7
  107. data/lib/decidim/proposals/version.rb +1 -1
  108. metadata +86 -19
@@ -75,8 +75,10 @@ pt:
75
75
  collaborative_drafts_enabled: Rascunhos colaborativos ativados
76
76
  comments_enabled: Comentários ativados
77
77
  geocoding_enabled: Geocoding habilitado
78
+ minimum_votes_per_user: Mínimo de votos por usuário
78
79
  new_proposal_help_text: Novo texto de ajuda da proposta
79
80
  official_proposals_enabled: Proposta oficial habilitada
81
+ participatory_texts_enabled: Textos participativos habilitados
80
82
  proposal_answering_enabled: Resposta de proposta ativada
81
83
  proposal_edit_before_minutes: As propostas podem ser editadas pelos autores antes que muitos minutos passem.
82
84
  proposal_length: Comprimento máximo do corpo da proposta
@@ -187,29 +189,48 @@ pt:
187
189
  gamification:
188
190
  badges:
189
191
  accepted_proposals:
192
+ conditions:
193
+ - Escolha o espaço de participação de seu interesse com o envio de propostas ativadas
194
+ - Tente fazer propostas que possam ser realizadas. Desta forma, eles são mais propensos a serem aceitos.
195
+ description: Esse selo é concedido quando você participa ativamente de novas propostas e elas são aceitas.
190
196
  description_another: Este utilizador obteve %{score} propostas aceites.
191
197
  description_own: Você tem %{score} propostas aceitas.
192
- explanation: Os usuários recebem esse selo ao aceitar suas propostas.
193
198
  name: Propostas aceitas
194
199
  next_level_in: Receba mais %{score} propostas aceitas para alcançar o próximo nível!
195
200
  unearned_another: Este usuário ainda não recebeu nenhuma proposta aceita.
196
201
  unearned_own: Você não recebeu nenhuma proposta aceita ainda.
197
202
  proposal_votes:
203
+ conditions:
204
+ - Navegue e passe algum tempo lendo as propostas de outras pessoas
205
+ - Dar apoio às propostas que você gosta ou encontrar interessante
206
+ description: Este selo é concedido quando você oferece suporte a propostas de outras pessoas.
198
207
  description_another: Este usuário deu suporte a %{score} propostas.
199
208
  description_own: Você deu suporte a %{score} propostas.
200
- explanation: Os usuários recebem esse selo dando suporte a propostas.
201
209
  name: Apoios proposta
202
210
  next_level_in: Dê suporte a mais %{score} propostas para alcançar o próximo nível!
203
211
  unearned_another: Este usuário ainda não deu suporte a nenhuma proposta.
204
212
  unearned_own: Você deu suporte a nenhuma proposta ainda.
205
213
  proposals:
214
+ conditions:
215
+ - Escolha o espaço de participação de seu interesse com o envio de propostas ativadas
216
+ - Crie uma nova proposta
217
+ description: Esse selo é concedido quando você participa ativamente de novas propostas.
206
218
  description_another: Este usuário criou %{score} propostas.
207
219
  description_own: Você criou %{score} propostas.
208
- explanation: Os usuários recebem esse selo criando propostas.
209
220
  name: Propostas
210
221
  next_level_in: Crie mais %{score} propostas para alcançar o próximo nível!
211
222
  unearned_another: Este usuário ainda não criou nenhuma proposta.
212
223
  unearned_own: Você não criou nenhuma proposta ainda.
224
+ metrics:
225
+ accepted_proposals:
226
+ object: propostas
227
+ title: Propostas aceitas
228
+ proposals:
229
+ object: propostas
230
+ title: Propostas
231
+ votes:
232
+ object: votos
233
+ title: Votos
213
234
  participatory_processes:
214
235
  participatory_process_groups:
215
236
  highlighted_proposals:
@@ -221,8 +242,10 @@ pt:
221
242
  proposals:
222
243
  actions:
223
244
  answer: Responda
245
+ edit_proposal: Editar proposta
224
246
  import: Importar de outro componente
225
247
  new: Nova proposta
248
+ participatory_texts: Textos participativos
226
249
  private_notes: Notas privadas
227
250
  title: Ações
228
251
  admin:
@@ -234,6 +257,28 @@ pt:
234
257
  models:
235
258
  proposal:
236
259
  name: Proposta
260
+ participatory_texts:
261
+ bulk-actions:
262
+ import_doc: Documento de importação
263
+ import:
264
+ invalid: O formulário é inválido!
265
+ success: Parabéns, as seções a seguir foram analisadas do documento importado, elas foram convertidas em propostas. Agora você pode revisar e ajustar o que precisar antes de publicar.
266
+ index:
267
+ info_1: As seções a seguir foram analisadas a partir do documento importado, elas foram convertidas em propostas. Agora você pode revisar e ajustar o que precisar antes de publicar.
268
+ publish_document: Publicar documento
269
+ title: PREVIEW TEXTO PARTICIPATIVO
270
+ new_import:
271
+ bottom_hint: "(Você será capaz de visualizar e classificar as seções do documento)"
272
+ document_legend: 'Adicione um documento menor que 2MB, cada seção até que 3 níveis de profundidade sejam analisados ​​em Propostas. Formatos suportados são: Markdown'
273
+ title: ADICIONAR DOCUMENTO
274
+ upload_document: Carregar documento
275
+ publish:
276
+ invalid: Não foi possível publicar propostas
277
+ success: Todas as propostas foram publicadas
278
+ sections:
279
+ article: "<em>Artigo</em>"
280
+ section: "<em>Seção:</em> <strong>%{title}</strong>"
281
+ sub-section: "<em>Subsecção:</em> %{title}"
237
282
  proposal_answers:
238
283
  edit:
239
284
  accepted: Aceitaram
@@ -257,6 +302,9 @@ pt:
257
302
  create:
258
303
  invalid: Tem havido um problema ao criar esta proposta
259
304
  success: Proposta criada com sucesso
305
+ edit:
306
+ title: Atualizar proposta
307
+ update: Atualizar
260
308
  form:
261
309
  attachment_legend: "(Opcional) Adicionar um anexo"
262
310
  select_a_category: Selecione uma categoria
@@ -264,7 +312,12 @@ pt:
264
312
  actions: Ações
265
313
  cancel: Cancelar
266
314
  change_category: Alterar categoria
315
+ merge: Junte-se a um novo
316
+ merge_button: Mesclar
317
+ select_component: Selecione um componente
267
318
  selected: selecionado
319
+ split: Dividir propostas
320
+ split_button: Dividido
268
321
  title: Propostas
269
322
  update: Atualizar
270
323
  new:
@@ -284,6 +337,14 @@ pt:
284
337
  no_components: Não há outros componentes da proposta neste espaço participativo para importar as propostas.
285
338
  select_component: Selecione um componente
286
339
  select_states: Verifique os estados das propostas para importar
340
+ proposals_merges:
341
+ create:
342
+ invalid: Ocorreu um erro ao mesclar as propostas selecionadas.
343
+ success: Fundiu com sucesso as propostas em uma nova.
344
+ proposals_splits:
345
+ create:
346
+ invalid: Ocorreu um erro ao dividir as propostas selecionadas.
347
+ success: Com sucesso dividiu as propostas em novas.
287
348
  shared:
288
349
  info_proposal:
289
350
  body: Corpo
@@ -294,6 +355,7 @@ pt:
294
355
  proposal:
295
356
  answer: "%{user_name} respondeu a proposta %{resource_name} no espaço %{space_name}"
296
357
  create: "%{user_name} criou a proposta %{resource_name} no espaço %{space_name} como uma proposta oficial"
358
+ update: "%{user_name} atualizou a proposta oficial %{resource_name} no espaço %{space_name}"
297
359
  proposal_note:
298
360
  create: "%{user_name} deixou uma nota privada na proposta %{resource_name} no espaço %{space_name}"
299
361
  answers:
@@ -422,6 +484,8 @@ pt:
422
484
  destroy_draft:
423
485
  error: Houve erros ao excluir o rascunho da proposta.
424
486
  success: O rascunho da proposta foi excluído com sucesso.
487
+ last_activity:
488
+ new_proposal_at_html: "<span>Nova proposta em %{link}</span>"
425
489
  models:
426
490
  collaborative_draft:
427
491
  fields:
@@ -570,6 +634,10 @@ pt:
570
634
  voting_rules:
571
635
  can_accumulate_supports_beyond_threshold:
572
636
  description: Cada proposta pode acumular mais de %{limit} suporta
637
+ minimum_votes_per_user:
638
+ description: Você deve distribuir um mínimo de 3 votos entre diferentes propostas.
639
+ given_enough_votes: Você deu suporte suficiente.
640
+ supports_remaining: Você tem que votar %{remaining_votes} mais propostas para seus votos a serem levados em conta.
573
641
  proposal_limit:
574
642
  description: Você pode criar até %{limit} propostas.
575
643
  threshold_per_proposal:
@@ -75,8 +75,10 @@ sv:
75
75
  collaborative_drafts_enabled: Samarbetsutkast aktiverat
76
76
  comments_enabled: Kommentarer aktiverade
77
77
  geocoding_enabled: Geocoding aktiverad
78
+ minimum_votes_per_user: Minsta antal röster per användare
78
79
  new_proposal_help_text: Nytt förslag till hjälptext
79
80
  official_proposals_enabled: Officiella förslag möjliga
81
+ participatory_texts_enabled: Deltagande texter aktiverade
80
82
  proposal_answering_enabled: Svar tlll förslag aktiverat
81
83
  proposal_edit_before_minutes: Förslag kan redigeras av författare innan så här många minuter passerar
82
84
  proposal_length: Maximal längd på förslagets innehåll
@@ -187,29 +189,48 @@ sv:
187
189
  gamification:
188
190
  badges:
189
191
  accepted_proposals:
192
+ conditions:
193
+ - Välj deltagarutrymme av intresse med inlämning av förslag aktiverade
194
+ - Försök att lägga fram förslag som kan utföras. På detta sätt är de mer benägna att accepteras.
195
+ description: Detta märke beviljas när du aktivt deltar med nya förslag och dessa accepteras.
190
196
  description_another: Den här användaren har fått %{score} förslag accepterade.
191
197
  description_own: Du har accepterat %{score} förslag.
192
- explanation: Användare får detta märke genom att få sina förslag godkända.
193
198
  name: Godkända förslag
194
199
  next_level_in: Få %{score} fler förslag accepterade för att nå nästa nivå!
195
200
  unearned_another: Den här användaren har inte fått några förslag accepterade än.
196
201
  unearned_own: Du har inga förslag accepterade än.
197
202
  proposal_votes:
203
+ conditions:
204
+ - Bläddra och spendera lite tid på att läsa andras förslag
205
+ - Ge stöd till de förslag du tycker om eller hitta intressanta
206
+ description: Detta märke beviljas när du stöder andra människors förslag.
198
207
  description_another: Denna användare har gett stöd till %{score} förslag.
199
208
  description_own: Du har gett stöd till %{score} förslag.
200
- explanation: Användare får detta märke genom att ge stöd till förslag.
201
209
  name: Förslagstjänster
202
210
  next_level_in: Ge stöd till %{score} fler förslag för att nå nästa nivå!
203
211
  unearned_another: Den här användaren har inte stöttat några förslag än.
204
212
  unearned_own: Du har inte stöttat några förslag än.
205
213
  proposals:
214
+ conditions:
215
+ - Välj deltagarutrymme av intresse med inlämning av förslag aktiverade
216
+ - Skapa ett nytt förslag
217
+ description: Detta märke beviljas när du aktivt deltar med nya förslag.
206
218
  description_another: Den här användaren har skapat %{score} förslag.
207
219
  description_own: Du har skapat %{score} förslag.
208
- explanation: Användare får detta märke genom att skapa förslag.
209
220
  name: Förslag
210
221
  next_level_in: Skapa %{score} fler förslag för att nå nästa nivå!
211
222
  unearned_another: Den här användaren har inte skapat några förslag ännu.
212
223
  unearned_own: Du har inte skapat några förslag än.
224
+ metrics:
225
+ accepted_proposals:
226
+ object: förslag
227
+ title: Godkända Förslag
228
+ proposals:
229
+ object: förslag
230
+ title: Förslag
231
+ votes:
232
+ object: röster
233
+ title: Röster
213
234
  participatory_processes:
214
235
  participatory_process_groups:
215
236
  highlighted_proposals:
@@ -221,8 +242,10 @@ sv:
221
242
  proposals:
222
243
  actions:
223
244
  answer: Svara
245
+ edit_proposal: Redigera förslag
224
246
  import: Importera från en annan komponent
225
247
  new: Nytt förslag
248
+ participatory_texts: Deltagande texter
226
249
  private_notes: Privata anteckningar
227
250
  title: Åtgärder
228
251
  admin:
@@ -234,6 +257,28 @@ sv:
234
257
  models:
235
258
  proposal:
236
259
  name: Förslag
260
+ participatory_texts:
261
+ bulk-actions:
262
+ import_doc: Importera dokument
263
+ import:
264
+ invalid: Blanketten är ogiltig!
265
+ success: Grattis, följande avsnitt har analyserats från det importerade dokumentet, de har konverterats till förslag. Nu kan du granska och justera vad du behöver innan du publicerar.
266
+ index:
267
+ info_1: Följande avsnitt har analyserats från det importerade dokumentet, de har konverterats till förslag. Nu kan du granska och justera vad du behöver innan du publicerar.
268
+ publish_document: Publicera dokument
269
+ title: PREVIEW PARTICIPERY TEXT
270
+ new_import:
271
+ bottom_hint: "(Du kommer att kunna förhandsgranska och sortera dokumentavsnitt)"
272
+ document_legend: 'Lägg till ett dokument mindre än 2 MB, varje sektion tills 3 nivåer djup kommer att analyseras i förslag. Suported format är: Markdown'
273
+ title: ADD DOKUMENT
274
+ upload_document: Ladda upp dokument
275
+ publish:
276
+ invalid: Kunde inte publicera förslag
277
+ success: Alla förslag har publicerats
278
+ sections:
279
+ article: "<em>Artikel</em>"
280
+ section: "<em>Avsnitt:</em> <strong>%{title}</strong>"
281
+ sub-section: "<em>Underavsnitt:</em> %{title}"
237
282
  proposal_answers:
238
283
  edit:
239
284
  accepted: Accepterad
@@ -257,6 +302,9 @@ sv:
257
302
  create:
258
303
  invalid: Det har uppstått ett problem med att skapa detta förslag
259
304
  success: Förslaget skapades
305
+ edit:
306
+ title: Uppdatera förslag
307
+ update: Uppdatera
260
308
  form:
261
309
  attachment_legend: "(Valfritt) Lägg till en bilaga"
262
310
  select_a_category: Välj en kategori
@@ -264,7 +312,12 @@ sv:
264
312
  actions: Åtgärder
265
313
  cancel: Avbryt
266
314
  change_category: Ändra kategori
315
+ merge: Sammanfoga till en ny
316
+ merge_button: Sammanfoga
317
+ select_component: Välj en komponent
267
318
  selected: vald
319
+ split: Delade förslag
320
+ split_button: Dela
268
321
  title: Förslag
269
322
  update: Uppdatera
270
323
  new:
@@ -284,6 +337,14 @@ sv:
284
337
  no_components: Det finns inga andra förslagskomponenter i detta deltagandeutrymme att importera förslagen från.
285
338
  select_component: Välj en komponent
286
339
  select_states: Kontrollera tillstånden för de förslag som ska importeras
340
+ proposals_merges:
341
+ create:
342
+ invalid: Det fanns ett fel att slå samman de valda förslagen.
343
+ success: Framgångsrikt fusionerade förslagen till en ny.
344
+ proposals_splits:
345
+ create:
346
+ invalid: Det gick inte att splittra de valda förslagen.
347
+ success: Framgångsrikt splittrade förslagen till nya.
287
348
  shared:
288
349
  info_proposal:
289
350
  body: Innehåll
@@ -294,6 +355,7 @@ sv:
294
355
  proposal:
295
356
  answer: "%{user_name} svarade på förslaget %{resource_name} på utrymmet %{space_name}"
296
357
  create: "%{user_name} skapade förslaget %{resource_name} på utrymmet %{space_name} som ett officiellt förslag"
358
+ update: "%{user_name} uppdaterade officiella förslaget %{resource_name} på platsen %{space_name}"
297
359
  proposal_note:
298
360
  create: "%{user_name} lämnade en privat anteckning på förslaget %{resource_name} på platsen %{space_name}"
299
361
  answers:
@@ -422,6 +484,8 @@ sv:
422
484
  destroy_draft:
423
485
  error: Det har uppstått fel vid radering av förslagsutkastet.
424
486
  success: Förslagsutkastet har tagits bort.
487
+ last_activity:
488
+ new_proposal_at_html: "<span>Nytt förslag till %{link}</span>"
425
489
  models:
426
490
  collaborative_draft:
427
491
  fields:
@@ -570,6 +634,10 @@ sv:
570
634
  voting_rules:
571
635
  can_accumulate_supports_beyond_threshold:
572
636
  description: Varje förslag kan samla mer än %{limit} stöd
637
+ minimum_votes_per_user:
638
+ description: Du måste distribuera minst 3 röster bland olika förslag.
639
+ given_enough_votes: Du har gett tillräckligt med stöd.
640
+ supports_remaining: Du måste rösta %{remaining_votes} ytterligare förslag för att dina röster ska beaktas.
573
641
  proposal_limit:
574
642
  description: Du kan skapa upp till %{limit} förslag.
575
643
  threshold_per_proposal:
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CreateParticipatoryTexts < ActiveRecord::Migration[5.2]
4
+ def change
5
+ create_table :decidim_proposals_participatory_texts do |t|
6
+ t.jsonb :title
7
+ t.jsonb :description
8
+ t.belongs_to :decidim_component, null: false, index: { name: "idx_participatory_texts_on_decidim_component_id" }
9
+
10
+ t.timestamps
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddParticipatoryTextLevelToProposals < ActiveRecord::Migration[5.2]
4
+ def change
5
+ add_column :decidim_proposals_proposals, :participatory_text_level, :string
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddPositionToProposals < ActiveRecord::Migration[5.2]
4
+ def change
5
+ add_column :decidim_proposals_proposals, :position, :integer
6
+ end
7
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ class FixUserGroupsIdsInProposalsEndorsements < ActiveRecord::Migration[5.2]
4
+ # rubocop:disable Rails/SkipsModelValidations
5
+ def change
6
+ Decidim::UserGroup.find_each do |group|
7
+ old_id = group.extended_data["old_user_group_id"]
8
+ next unless old_id
9
+
10
+ Decidim::Proposals::ProposalEndorsement
11
+ .where(decidim_user_group_id: old_id)
12
+ .update_all(decidim_user_group_id: group.id)
13
+ end
14
+ end
15
+ # rubocop:enable Rails/SkipsModelValidations
16
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddTemporaryVotes < ActiveRecord::Migration[5.2]
4
+ def change
5
+ change_table :decidim_proposals_proposal_votes do |t|
6
+ t.boolean :temporary, null: false, default: false
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddOrganizationAsAuthor < ActiveRecord::Migration[5.2]
4
+ def change
5
+ official_proposals = Decidim::Proposals::Proposal.find_each.select do |proposal|
6
+ proposal.coauthorships.count.zero?
7
+ end
8
+
9
+ official_proposals.each do |proposal|
10
+ proposal.add_coauthor(proposal.organization)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ class MakeAuthorPolymorhpicForProposalEndorsements < ActiveRecord::Migration[5.2]
4
+ class ProposalEndorsement < ApplicationRecord
5
+ self.table_name = :decidim_proposals_proposal_endorsements
6
+ end
7
+
8
+ def change
9
+ remove_index :decidim_proposals_proposal_endorsements, :decidim_author_id
10
+
11
+ add_column :decidim_proposals_proposal_endorsements, :decidim_author_type, :string
12
+
13
+ reversible do |direction|
14
+ direction.up do
15
+ execute <<~SQL.squish
16
+ UPDATE decidim_proposals_proposal_endorsements
17
+ SET decidim_author_type = 'Decidim::UserBaseEntity'
18
+ SQL
19
+ end
20
+ end
21
+
22
+ add_index :decidim_proposals_proposal_endorsements,
23
+ [:decidim_author_id, :decidim_author_type],
24
+ name: "index_decidim_proposals_proposal_endorsements_on_decidim_author"
25
+
26
+ change_column_null :decidim_proposals_proposal_endorsements, :decidim_author_id, false
27
+ change_column_null :decidim_proposals_proposal_endorsements, :decidim_author_type, false
28
+
29
+ ProposalEndorsement.reset_column_information
30
+ end
31
+ end
@@ -20,9 +20,10 @@ module Decidim
20
20
  Metadata = Struct.new(:linked_proposals)
21
21
 
22
22
  # Matches a URL
23
- URL_REGEX_PART1 = '(?i)\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|'
24
- URL_REGEX_PART2 = '\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?«»“”‘’]))'
25
- URL_REGEX = /#{URL_REGEX_PART1}#{URL_REGEX_PART2}/i
23
+ URL_REGEX_SCHEME = '(?:http(s)?:\/\/)'
24
+ URL_REGEX_CONTENT = '[\w.-]+[\w\-\._~:\/?#\[\]@!\$&\'\(\)\*\+,;=.]+'
25
+ URL_REGEX_END_CHAR = '[\w]'
26
+ URL_REGEX = /#{URL_REGEX_SCHEME}#{URL_REGEX_CONTENT}#{URL_REGEX_END_CHAR}/i
26
27
  # Matches a mentioned Proposal ID (~(d)+ expression)
27
28
  ID_REGEX = /~(\d+)/
28
29
 
@@ -72,8 +73,13 @@ module Decidim
72
73
 
73
74
  def proposal_from_url_match(match)
74
75
  uri = URI.parse(match)
76
+ return if uri.path.blank?
77
+
75
78
  proposal_id = uri.path.split("/").last
76
79
  find_proposal_by_id(proposal_id)
80
+ rescue URI::InvalidURIError
81
+ Rails.logger.error("#{e.message}=>#{e.backtrace}")
82
+ nil
77
83
  end
78
84
 
79
85
  def proposal_from_id_match(match)