decidim-core 0.12.2 → 0.13.0.pre1

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 (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