decidim-core 0.12.2 → 0.13.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (116) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/stylesheets/decidim/modules/_order-by.scss +4 -1
  3. data/app/cells/decidim/author/comments.erb +2 -2
  4. data/app/cells/decidim/author/date.erb +1 -1
  5. data/app/cells/decidim/author_cell.rb +22 -38
  6. data/app/cells/decidim/card_m/authors.erb +9 -0
  7. data/app/cells/decidim/card_m/status.erb +1 -1
  8. data/app/cells/decidim/card_m_cell.rb +8 -0
  9. data/app/cells/decidim/collapsible_authors/show.erb +16 -0
  10. data/app/cells/decidim/collapsible_authors_cell.rb +32 -0
  11. data/app/cells/decidim/invitations_toggle/content.erb +1 -0
  12. data/app/cells/decidim/invitations_toggle/label.erb +1 -0
  13. data/app/cells/decidim/invitations_toggle_cell.rb +27 -0
  14. data/app/cells/decidim/toggle/show.erb +8 -0
  15. data/app/cells/decidim/toggle_cell.rb +42 -0
  16. data/app/cells/decidim/tos_page/refuse_btn_modal.erb +25 -14
  17. data/app/commands/decidim/create_omniauth_registration.rb +1 -1
  18. data/app/commands/decidim/create_registration.rb +1 -1
  19. data/app/commands/decidim/create_report.rb +10 -10
  20. data/app/commands/decidim/invite_friends.rb +48 -0
  21. data/app/commands/decidim/invite_user.rb +4 -2
  22. data/app/commands/decidim/unsubscribe_settings.rb +3 -3
  23. data/app/commands/decidim/update_notifications_settings.rb +1 -1
  24. data/app/controllers/concerns/decidim/needs_tos_accepted.rb +6 -1
  25. data/app/controllers/decidim/data_portability_controller.rb +55 -0
  26. data/app/controllers/decidim/devise/invitations_controller.rb +1 -0
  27. data/app/controllers/decidim/invitations_controller.rb +32 -0
  28. data/app/controllers/decidim/newsletters_opt_in_controller.rb +31 -0
  29. data/app/forms/decidim/account_form.rb +1 -1
  30. data/app/forms/decidim/invitations_form.rb +37 -0
  31. data/app/forms/decidim/notifications_settings_form.rb +5 -0
  32. data/app/forms/decidim/omniauth_registration_form.rb +1 -1
  33. data/app/forms/decidim/registration_form.rb +7 -1
  34. data/app/helpers/decidim/cells_helper.rb +44 -0
  35. data/app/jobs/decidim/data_portability_export_job.rb +21 -0
  36. data/app/jobs/decidim/newsletters_opt_in_job.rb +11 -0
  37. data/app/mailers/decidim/export_mailer.rb +13 -0
  38. data/app/mailers/decidim/newsletters_opt_in_mailer.rb +15 -0
  39. data/app/models/decidim/coauthorship.rb +23 -0
  40. data/app/models/decidim/follow.rb +10 -0
  41. data/app/models/decidim/identity.rb +10 -0
  42. data/app/models/decidim/messaging/conversation.rb +10 -0
  43. data/app/models/decidim/notification.rb +10 -0
  44. data/app/models/decidim/participatory_space_private_user.rb +10 -0
  45. data/app/models/decidim/report.rb +10 -0
  46. data/app/models/decidim/user.rb +16 -1
  47. data/app/models/decidim/user_group.rb +9 -0
  48. data/app/services/decidim/action_authorizer.rb +1 -1
  49. data/app/uploaders/decidim/avatar_uploader.rb +6 -2
  50. data/app/uploaders/decidim/data_portability_uploader.rb +19 -0
  51. data/app/views/decidim/data_portability/export.html.erb +1 -0
  52. data/app/views/decidim/data_portability/show.html.erb +5 -0
  53. data/app/views/decidim/devise/invitations/edit.html.erb +1 -1
  54. data/app/views/decidim/devise/shared/_newsletter_modal.html.erb +13 -13
  55. data/app/views/decidim/export_mailer/data_portability_export.html.erb +2 -0
  56. data/app/views/decidim/invitations/index.html.erb +48 -0
  57. data/app/views/decidim/newsletters_opt_in_mailer/notify.html.erb +23 -0
  58. data/app/views/decidim/profiles/_user.html.erb +1 -1
  59. data/app/views/devise/mailer/invite_friend.html.erb +27 -0
  60. data/app/views/devise/mailer/invite_friend.text.erb +19 -0
  61. data/app/views/layouts/decidim/_user_menu.html.erb +1 -0
  62. data/config/locales/ca.yml +68 -2
  63. data/config/locales/en.yml +73 -3
  64. data/config/locales/es-PY.yml +67 -1
  65. data/config/locales/es.yml +67 -1
  66. data/config/locales/eu.yml +68 -2
  67. data/config/locales/fi.yml +69 -3
  68. data/config/locales/fr.yml +136 -70
  69. data/config/locales/gl.yml +69 -3
  70. data/config/locales/it.yml +69 -3
  71. data/config/locales/nl.yml +69 -3
  72. data/config/locales/pl.yml +69 -3
  73. data/config/locales/pt-BR.yml +69 -3
  74. data/config/locales/pt.yml +69 -3
  75. data/config/locales/ru.yml +45 -2
  76. data/config/locales/sv.yml +69 -3
  77. data/config/locales/uk.yml +61 -2
  78. data/config/routes.rb +10 -0
  79. data/db/migrate/20171212103803_create_unique_nicknames.rb +1 -1
  80. data/db/migrate/20180221101934_fix_nickname_index.rb +3 -1
  81. data/db/migrate/20180427141253_create_coauthorships.rb +13 -0
  82. data/db/migrate/20180611121852_change_newsletter_notification_type_value.rb +21 -0
  83. data/lib/decidim/api/authorable_interface.rb +10 -1
  84. data/lib/decidim/authorable.rb +4 -1
  85. data/lib/decidim/coauthorable.rb +69 -0
  86. data/lib/decidim/component_manifest.rb +4 -0
  87. data/lib/decidim/core.rb +10 -0
  88. data/lib/decidim/core/engine.rb +5 -0
  89. data/lib/decidim/core/test.rb +1 -0
  90. data/lib/decidim/core/test/factories.rb +9 -1
  91. data/lib/decidim/core/test/shared_examples/coauthorable.rb +111 -0
  92. data/lib/decidim/core/test/shared_examples/coauthorable_interface_examples.rb +31 -0
  93. data/lib/decidim/core/test/shared_examples/simple_event.rb +7 -1
  94. data/lib/decidim/core/version.rb +1 -1
  95. data/lib/decidim/data_portability.rb +29 -0
  96. data/lib/decidim/data_portability_file_reader.rb +56 -0
  97. data/lib/decidim/data_portability_file_zipper.rb +55 -0
  98. data/lib/decidim/data_portability_serializers.rb +23 -0
  99. data/lib/decidim/data_portability_serializers/data_portability_conversation_serializer.rb +42 -0
  100. data/lib/decidim/data_portability_serializers/data_portability_follow_serializer.rb +23 -0
  101. data/lib/decidim/data_portability_serializers/data_portability_identity_serializer.rb +25 -0
  102. data/lib/decidim/data_portability_serializers/data_portability_notification_serializer.rb +26 -0
  103. data/lib/decidim/data_portability_serializers/data_portability_participatory_space_private_user_serializer.rb +25 -0
  104. data/lib/decidim/data_portability_serializers/data_portability_report_serializer.rb +36 -0
  105. data/lib/decidim/data_portability_serializers/data_portability_user_group_serializer.rb +21 -0
  106. data/lib/decidim/data_portability_serializers/data_portability_user_serializer.rb +55 -0
  107. data/lib/decidim/events.rb +1 -0
  108. data/lib/decidim/events/coauthor_event.rb +42 -0
  109. data/lib/decidim/exporters/csv.rb +0 -1
  110. data/lib/decidim/form_builder.rb +1 -2
  111. data/lib/decidim/nicknamizable.rb +15 -4
  112. data/lib/decidim/participable.rb +7 -0
  113. data/lib/decidim/participatory_space_manifest.rb +4 -0
  114. data/lib/devise/models/decidim_newsletterable.rb +60 -0
  115. data/lib/tasks/decidim_tasks.rake +29 -0
  116. metadata +73 -28
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9d812c3a3c270bbe25a861c81f1b91a8ba281814b01dbde0aa55c0cdbb90479f
4
- data.tar.gz: dfd34278e453cae0257cd75722d657294d6a2a4e1d62e47a1d6484e90d771012
3
+ metadata.gz: 1459b371ded91fe31bcc0898717a90af0450272f12b2d2052fc4f50f9b502121
4
+ data.tar.gz: b383cad286e68f01ba38e4beb6c414f9bde45a08756e1ca5f25234539950ae85
5
5
  SHA512:
6
- metadata.gz: 95fd0f2c9f8ce774a6ebabf22c38fc8c8399f351a2ff3c9f8560a690e56990bf9137094dc80e237b9d45969e1710dc7057e69edf615de2c639b127551eac577b
7
- data.tar.gz: 79592062462a573dae33a81b2687e6fe8cedabdf9038fadc7904f72d8072252469b51f9d3ed29e940fc87dc2d5a52dbc1db2fae476f6a7049a45d64289919a85
6
+ metadata.gz: a4eea0c67a1d3f108e672b3ed31898b43246b76c6e563cb7cfc4d24e8db106d3d08e1fc1c13db12abfa64295c639b13251e43b1e4994f6c3b8068822c1911fec
7
+ data.tar.gz: 12e10dfb1e21635689394a621a55a058d70dda91b307f7c5f41bf9cee4626e1c62a6994e2c826722931bf66f3fe274b7d06551f09c9012aada8ba46e0959cadb
@@ -37,6 +37,10 @@ $order-border: $border;
37
37
 
38
38
  .order-by__tabs{
39
39
  display: inline-block;
40
+
41
+ span{
42
+ opacity: .5;
43
+ }
40
44
  }
41
45
 
42
46
  .order-by__tab{
@@ -63,4 +67,3 @@ $order-border: $border;
63
67
  border-left: none;
64
68
  }
65
69
  }
66
-
@@ -1,6 +1,6 @@
1
1
  <% if commentable? %>
2
- <%= link_to "#{resource_locator(from_context).path}#comments", title: t("decidim.author.comments", count: :many) do %>
3
- <%= icon "comment-square", class: "icon--small", aria_label: t("decidim.author.comments", count: :many), role: "img" %>
2
+ <%= link_to "#{resource_locator(from_context).path}#comments", title: t("decidim.author.comments", count: from_context.comments.count) do %>
3
+ <%= icon "comment-square", class: "icon--small", aria_label: t("decidim.author.comments", count: from_context.comments.count), role: "img" %>
4
4
  <%= from_context.comments.count %> <%= t("decidim.author.comments", count: from_context.comments.count) %>
5
5
  <% end %>
6
6
  <% end %>
@@ -1,5 +1,5 @@
1
1
  <% if creation_date? %>
2
2
  <span>
3
- <%= l from_context.created_at, format: :decidim_short %> &nbsp;
3
+ <%= creation_date %> &nbsp;
4
4
  </span>
5
5
  <% end %>
@@ -6,6 +6,7 @@ module Decidim
6
6
  # for resources that have a single author.
7
7
  class AuthorCell < Decidim::ViewModel
8
8
  include LayoutHelper
9
+ include CellsHelper
9
10
  include ::Devise::Controllers::Helpers
10
11
  include ::Devise::Controllers::UrlHelpers
11
12
  include Messaging::ConversationHelper
@@ -26,12 +27,20 @@ module Decidim
26
27
  render
27
28
  end
28
29
 
29
- private
30
+ def date
31
+ render
32
+ end
33
+
34
+ def flag
35
+ render
36
+ end
30
37
 
31
- def from_context
32
- options[:from].presence || context[:from].presence
38
+ def withdraw
39
+ render
33
40
  end
34
41
 
42
+ private
43
+
35
44
  def from_context_path
36
45
  resource_locator(from_context).path
37
46
  end
@@ -40,21 +49,6 @@ module Decidim
40
49
  from_context_path + "/withdraw"
41
50
  end
42
51
 
43
- def withdrawable?
44
- return unless from_context
45
- return unless proposals_controller?
46
- return if index_action?
47
- from_context.withdrawable_by?(current_user)
48
- end
49
-
50
- def flagable?
51
- return unless from_context
52
- return unless proposals_controller?
53
- return if index_action?
54
- return if from_context.official?
55
- true
56
- end
57
-
58
52
  def creation_date?
59
53
  return true if posts_controller?
60
54
  return unless from_context
@@ -63,6 +57,16 @@ module Decidim
63
57
  true
64
58
  end
65
59
 
60
+ def creation_date
61
+ date_at = if proposals_controller?
62
+ from_context.published_at
63
+ else
64
+ from_context.created_at
65
+ end
66
+
67
+ l date_at, format: :decidim_short
68
+ end
69
+
66
70
  def commentable?
67
71
  return unless posts_controller?
68
72
  true
@@ -82,26 +86,6 @@ module Decidim
82
86
  true if "Decidim::UserPresenter".include? model.class.to_s
83
87
  end
84
88
 
85
- def proposals_controller?
86
- context[:controller].class.to_s == "Decidim::Proposals::ProposalsController"
87
- end
88
-
89
- def posts_controller?
90
- context[:controller].class.to_s == "Decidim::Blogs::PostsController"
91
- end
92
-
93
- def index_action?
94
- context[:controller].action_name == "index"
95
- end
96
-
97
- def show_action?
98
- context[:controller].action_name == "show"
99
- end
100
-
101
- def current_component
102
- from_context.component
103
- end
104
-
105
89
  def profile_path?
106
90
  profile_path.present?
107
91
  end
@@ -0,0 +1,9 @@
1
+ <%= cell(
2
+ "decidim/collapsible_list",
3
+ authors_for(model),
4
+ cell_name: "decidim/author",
5
+ cell_options: { extra_classes: ["author-data--small"] },
6
+ hidden_elements_count_i18n_key: hidden_elements_count_i18n_key,
7
+ size: :small,
8
+ has_actions: has_actions?
9
+ ) %>
@@ -1,7 +1,7 @@
1
1
  <div class="card__status">
2
2
  <ul class="card-data">
3
3
  <% statuses.each do |status_name| %>
4
- <li class="card-data__item">
4
+ <li class="card-data__item <%= status_name %>_status">
5
5
  <%= send("#{status_name}_status") %>
6
6
  </li>
7
7
  <% end %>
@@ -66,6 +66,14 @@ module Decidim
66
66
  present(model).author
67
67
  end
68
68
 
69
+ def has_authors?
70
+ model.is_a?(Decidim::Coauthorable)
71
+ end
72
+
73
+ def hidden_elements_count_i18n_key
74
+ "decidim.proposals.#{model.class.name.demodulize}.show.hidden_authors_count"
75
+ end
76
+
69
77
  def has_actions?
70
78
  true
71
79
  end
@@ -0,0 +1,16 @@
1
+ <%= cell(
2
+ "decidim/collapsible_list",
3
+ list,
4
+ cell_name: cell_name,
5
+ cell_options: options.merge(has_actions: false),
6
+ hidden_elements_count_i18n_key: "decidim.proposals.proposal.show.hidden_authors_count",
7
+ size: size
8
+ ) %>
9
+ <% if actionable? %>
10
+ <div class="author-data__extra">
11
+ <% author_cell= cell("decidim/author", model, from: from_context) %>
12
+ <%= author_cell.(:date) %>
13
+ <%= author_cell.(:flag) %>
14
+ <%= author_cell.(:withdraw) %>
15
+ </div>
16
+ <% end %>
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # This cell renders a collapsible list of authors. Each element from the
5
+ # array of Users will be rendered with the `:cell` cell.
6
+ #
7
+ # Available sizes:
8
+ # - `:small` => collapses after 3 elements.
9
+ # - `:default` => collapses after 7 elements. If not specified, this one is
10
+ # used.
11
+ #
12
+ # Example:
13
+ #
14
+ # cell(
15
+ # "decidim/collapsible_authors",
16
+ # list_of_authors,
17
+ # cell_name: "my/cell",
18
+ # cell_options: { my: :options },
19
+ # hidden_elements_count_i18n_key: "my.custom.key",
20
+ # size: :small
21
+ # )
22
+ class CollapsibleAuthorsCell < CollapsibleListCell
23
+ include CellsHelper
24
+
25
+ private
26
+
27
+ def actionable?
28
+ return false if options[:has_actions] == false
29
+ true if withdrawable? || flagable?
30
+ end
31
+ end
32
+ end
@@ -0,0 +1 @@
1
+ <%= form.text_area :custom_text, label: false %>
@@ -0,0 +1 @@
1
+ <u><%= t "decidim.invitations.index.customize_message" %></u>
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # This cell only holds two partials needed to use the ToggleCell in the
5
+ # invitations page.
6
+ class InvitationsToggleCell < Decidim::ViewModel
7
+ include LayoutHelper
8
+
9
+ def show
10
+ nil
11
+ end
12
+
13
+ def label
14
+ render
15
+ end
16
+
17
+ def content
18
+ render
19
+ end
20
+
21
+ private
22
+
23
+ def form
24
+ options[:form]
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,8 @@
1
+ <div data-toggle="toggle-<%= random_seed %> toggle-<%= random_seed %>-icon-bottom toggle-<%= random_seed %>-icon-right">
2
+ <span id="toggle-<%= random_seed %>-icon-bottom" class="<%= "hide" if !open? %>" data-toggler="hide"><%= icon "caret-bottom", class: "icon--small" %></span>
3
+ <span id="toggle-<%= random_seed %>-icon-right" class="<%= "hide" if open? %>" data-toggler="hide"><%= icon "caret-right", class: "icon--small" %></span>
4
+ <%= toggled_label %>
5
+ </div>
6
+ <div id="toggle-<%= random_seed %>" class="<%= "hide" if !open? %>" data-toggler=".hide">
7
+ <%= toggled_content %>
8
+ </div>
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # Use this cell to add content that can be collapsed. Use `nil` as the `model`
5
+ # value.
6
+ #
7
+ # Options:
8
+ # open - If the collapsed content should be shown or not on page load.
9
+ # Defaults to `false`.
10
+ # label - The contents of the link that toggles the collapse. Use a cell
11
+ # partial for this.
12
+ # content - The HTML that should be collapsed. Use a cell partial for this.
13
+ #
14
+ # Usage:
15
+ # cell(
16
+ # "decidim/toggle",
17
+ # nil,
18
+ # label: cell("my/cell").my_view,
19
+ # content: cell("my/cell").another_view
20
+ # )
21
+ class ToggleCell < Decidim::ViewModel
22
+ include LayoutHelper
23
+
24
+ private
25
+
26
+ def open?
27
+ @open ||= options[:open].to_s == "true"
28
+ end
29
+
30
+ def random_seed
31
+ @random_seed ||= Random.rand(9999)
32
+ end
33
+
34
+ def toggled_content
35
+ options[:content]
36
+ end
37
+
38
+ def toggled_label
39
+ options[:label]
40
+ end
41
+ end
42
+ end
@@ -2,22 +2,33 @@
2
2
  <%= t("refuse.modal_button", scope: "decidim.pages.terms_and_conditions") %>
3
3
  </button>
4
4
 
5
- <div id="tos-refuse-modal" class="reveal" data-reveal aria-labelledby="#{modal_title}" aria-hidden="true" role="dialog">
6
- <h2>
7
- <%= t("refuse.modal_title", scope: "decidim.pages.terms_and_conditions") %>
8
- </h2>
5
+ <div id="tos-refuse-modal" class="reveal" data-reveal aria-labelledby="<%= t("refuse.modal_title", scope: "decidim.pages.terms_and_conditions") %>" aria-hidden="true" role="dialog">
6
+ <div class="reveal__header">
7
+ <h3 class="reveal__title">
8
+ <%= t("refuse.modal_title", scope: "decidim.pages.terms_and_conditions") %>
9
+ </h3>
9
10
 
10
- <p>
11
- <%= t("refuse.modal_body", scope: "decidim.pages.terms_and_conditions", data_portability_path: "#", delete_path: decidim.delete_account_path) %>
12
- </p>
11
+ <button class="close-button" data-close aria-label="<%= t("refuse.modal_close", scope: "decidim.pages.terms_and_conditions") %>"
12
+ type="button">
13
+ <span aria-hidden="true">&times;</span>
14
+ </button>
15
+ </div>
16
+
17
+ <div class="row">
18
+ <p>
19
+ <%= t("refuse.modal_body", scope: "decidim.pages.terms_and_conditions", data_portability_path: decidim.data_portability_path, delete_path: decidim.delete_account_path) %>
20
+ </p>
21
+ </div>
13
22
 
14
- <div class="row column flex-center">
15
- <%= button_to decidim.destroy_user_session_path, method: :delete, class: "clear button secondary button--nomargin small" do %>
16
- <%= t("refuse.modal_btn_exit", scope: "decidim.pages.terms_and_conditions") %>
17
- <% end %>
23
+ <div class="row">
24
+ <div class="column flex-center">
25
+ <%= button_to decidim.destroy_user_session_path, method: :delete, class: "clear button secondary expanded" do %>
26
+ <%= t("refuse.modal_btn_exit", scope: "decidim.pages.terms_and_conditions") %>
27
+ <% end %>
18
28
 
19
- <%= button_to decidim.accept_tos_path, method: :put, class: "button button--nomargin small" do %>
20
- <%= t("refuse.modal_btn_continue", scope: "decidim.pages.terms_and_conditions") %>
21
- <% end %>
29
+ <%= button_to decidim.accept_tos_path, method: :put, class: "button expanded" do %>
30
+ <%= t("refuse.modal_btn_continue", scope: "decidim.pages.terms_and_conditions") %>
31
+ <% end %>
32
+ </div>
22
33
  </div>
23
34
  </div>
@@ -51,7 +51,7 @@ module Decidim
51
51
  @user.email = (verified_email || form.email)
52
52
  @user.name = form.name
53
53
  @user.nickname = form.normalized_nickname
54
- @user.newsletter_notifications = false
54
+ @user.newsletter_notifications_at = nil
55
55
  @user.email_on_notification = true
56
56
  @user.password = generated_password
57
57
  @user.password_confirmation = generated_password
@@ -40,7 +40,7 @@ module Decidim
40
40
  password_confirmation: form.password_confirmation,
41
41
  organization: form.current_organization,
42
42
  tos_agreement: form.tos_agreement,
43
- newsletter_notifications: form.newsletter,
43
+ newsletter_notifications_at: form.newsletter_at,
44
44
  email_on_notification: true,
45
45
  accepted_tos_version: form.current_organization.tos_version)
46
46
  end
@@ -29,11 +29,11 @@ module Decidim
29
29
  update_report_count!
30
30
  end
31
31
 
32
- send_report_notification_to_admins
32
+ send_report_notification_to_moderators
33
33
 
34
34
  if hideable?
35
35
  hide!
36
- send_hide_notification_to_admins
36
+ send_hide_notification_to_moderators
37
37
  end
38
38
 
39
39
  broadcast(:ok, report)
@@ -60,13 +60,13 @@ module Decidim
60
60
  @moderation.update!(report_count: @moderation.report_count + 1)
61
61
  end
62
62
 
63
- def participatory_space_admins
64
- @participatory_space_admins ||= participatory_space.admins
63
+ def participatory_space_moderators
64
+ @participatory_space_moderators ||= participatory_space.moderators
65
65
  end
66
66
 
67
- def send_report_notification_to_admins
68
- participatory_space_admins.each do |admin|
69
- ReportedMailer.report(admin, @report).deliver_later
67
+ def send_report_notification_to_moderators
68
+ participatory_space_moderators.each do |moderator|
69
+ ReportedMailer.report(moderator, @report).deliver_later
70
70
  end
71
71
  end
72
72
 
@@ -78,9 +78,9 @@ module Decidim
78
78
  Decidim::Admin::HideResource.new(@reportable, @current_user).call
79
79
  end
80
80
 
81
- def send_hide_notification_to_admins
82
- participatory_space_admins.each do |admin|
83
- ReportedMailer.hide(admin, @report).deliver_later
81
+ def send_hide_notification_to_moderators
82
+ participatory_space_moderators.each do |moderator|
83
+ ReportedMailer.hide(moderator, @report).deliver_later
84
84
  end
85
85
  end
86
86
 
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # This command invites some user friends.
5
+ class InviteFriends < Rectify::Command
6
+ # Invites the user friends
7
+ #
8
+ # form - The form with the data.
9
+ def initialize(form)
10
+ @form = form
11
+ end
12
+
13
+ def call
14
+ return broadcast(:invalid) unless form.valid?
15
+ invite_friends
16
+ broadcast(:ok)
17
+ end
18
+
19
+ private
20
+
21
+ attr_reader :form
22
+
23
+ def invite_friends
24
+ form.clean_emails.each do |email|
25
+ InviteUser.call(build_invite_form(email)) do
26
+ on(:ok) do |user|
27
+ user
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+ def build_invite_form(email)
34
+ OpenStruct.new(
35
+ name: email.downcase.split("@").first,
36
+ email: email.downcase,
37
+ organization: form.current_organization,
38
+ admin: false,
39
+ role: nil,
40
+ invited_by: form.current_user,
41
+ extra_email_options: {
42
+ custom_text: form.custom_text
43
+ },
44
+ invitation_instructions: "invite_friend"
45
+ )
46
+ end
47
+ end
48
+ end