decidim-conferences 0.15.1 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/config/admin/decidim_conferences_manifest.js +1 -0
  3. data/app/assets/images/decidim/conferences/conference.svg +2 -5
  4. data/app/cells/decidim/conferences/linked_participatory_spaces_cell.rb +3 -0
  5. data/app/cells/decidim/conferences/{join_conference_button/show.erb → registration_type/join_conference.erb} +6 -7
  6. data/app/cells/decidim/conferences/{join_conference_button → registration_type}/registration_confirm.erb +2 -2
  7. data/app/cells/decidim/conferences/registration_type/show.erb +16 -0
  8. data/app/cells/decidim/conferences/registration_type_cell.rb +51 -0
  9. data/app/commands/decidim/conferences/admin/confirm_conference_registration.rb +75 -0
  10. data/app/commands/decidim/conferences/admin/create_conference.rb +1 -1
  11. data/app/commands/decidim/conferences/admin/create_registration_type.rb +77 -0
  12. data/app/commands/decidim/conferences/admin/destroy_registration_type.rb +56 -0
  13. data/app/commands/decidim/conferences/admin/invite_user_to_join_conference.rb +3 -2
  14. data/app/commands/decidim/conferences/admin/publish_registration_type.rb +36 -0
  15. data/app/commands/decidim/conferences/admin/send_conference_diplomas.rb +48 -0
  16. data/app/commands/decidim/conferences/admin/unpublish_registration_type.rb +36 -0
  17. data/app/commands/decidim/conferences/admin/update_conference.rb +2 -2
  18. data/app/commands/decidim/conferences/admin/update_diploma.rb +47 -0
  19. data/app/commands/decidim/conferences/admin/update_partner.rb +1 -1
  20. data/app/commands/decidim/conferences/admin/update_registration_type.rb +74 -0
  21. data/app/commands/decidim/conferences/join_conference.rb +21 -9
  22. data/app/commands/decidim/conferences/leave_conference.rb +5 -3
  23. data/app/controllers/decidim/conferences/admin/conference_registrations_controller.rb +21 -0
  24. data/app/controllers/decidim/conferences/admin/conferences_controller.rb +0 -9
  25. data/app/controllers/decidim/conferences/admin/diplomas_controller.rb +62 -0
  26. data/app/controllers/decidim/conferences/admin/registration_type_publications_controller.rb +53 -0
  27. data/app/controllers/decidim/conferences/admin/registration_types_controller.rb +84 -0
  28. data/app/controllers/decidim/conferences/application_controller.rb +2 -0
  29. data/app/controllers/decidim/conferences/conference_registrations_controller.rb +6 -2
  30. data/app/controllers/decidim/conferences/conferences_controller.rb +4 -0
  31. data/app/controllers/decidim/conferences/registration_types_controller.rb +39 -0
  32. data/app/events/decidim/conferences/conference_registration_notification_event.rb +21 -0
  33. data/app/forms/decidim/conferences/admin/conference_form.rb +5 -2
  34. data/app/forms/decidim/conferences/admin/conference_registration_invite_form.rb +15 -0
  35. data/app/forms/decidim/conferences/admin/diploma_form.rb +24 -0
  36. data/app/forms/decidim/conferences/admin/registration_type_form.rb +44 -0
  37. data/app/helpers/decidim/conferences/conference_helper.rb +15 -0
  38. data/app/jobs/decidim/conferences/admin/send_conference_diploma_job.rb +20 -0
  39. data/app/jobs/decidim/conferences/upcoming_conference_notification_job.rb +1 -1
  40. data/app/mailers/decidim/conferences/admin/invite_join_conference_mailer.rb +2 -1
  41. data/app/mailers/decidim/conferences/admin/send_conference_diploma_mailer.rb +48 -0
  42. data/app/mailers/decidim/conferences/conference_registration_mailer.rb +16 -1
  43. data/app/models/decidim/conference.rb +12 -0
  44. data/app/models/decidim/conference_meeting.rb +2 -0
  45. data/app/models/decidim/conferences/conference_invite.rb +1 -0
  46. data/app/models/decidim/conferences/conference_meeting_registration_type.rb +10 -0
  47. data/app/models/decidim/conferences/conference_registration.rb +11 -0
  48. data/app/models/decidim/conferences/registration_type.rb +25 -0
  49. data/app/permissions/decidim/conferences/permissions.rb +19 -12
  50. data/app/presenters/decidim/conference_speaker_presenter.rb +4 -0
  51. data/app/presenters/decidim/conferences/admin_log/conference_registration_presenter.rb +43 -0
  52. data/app/presenters/decidim/conferences/admin_log/conferences_presenter.rb +4 -2
  53. data/app/presenters/decidim/conferences/admin_log/partner_presenter.rb +1 -1
  54. data/app/presenters/decidim/conferences/admin_log/registration_type_presenter.rb +45 -0
  55. data/app/serializers/decidim/conferences/conference_registration_serializer.rb +4 -0
  56. data/app/serializers/decidim/conferences/data_portability_conference_invite_serializer.rb +4 -0
  57. data/app/serializers/decidim/conferences/data_portability_conference_registration_serializer.rb +4 -0
  58. data/app/uploaders/decidim/conferences/diploma_uploader.rb +12 -0
  59. data/app/views/decidim/conferences/admin/conference_invites/_form.html.erb +8 -0
  60. data/app/views/decidim/conferences/admin/conference_invites/index.html.erb +4 -0
  61. data/app/views/decidim/conferences/admin/conference_registrations/index.html.erb +16 -0
  62. data/app/views/decidim/conferences/admin/conferences/edit.html.erb +0 -4
  63. data/app/views/decidim/conferences/admin/diplomas/_form.html.erb +31 -0
  64. data/app/views/decidim/conferences/admin/diplomas/edit.html.erb +7 -0
  65. data/app/views/decidim/conferences/admin/invite_join_conference_mailer/invite.html.erb +2 -2
  66. data/app/views/decidim/conferences/admin/registration_types/_form.html.erb +30 -0
  67. data/app/views/decidim/conferences/admin/registration_types/edit.html.erb +7 -0
  68. data/app/views/decidim/conferences/admin/registration_types/index.html.erb +65 -0
  69. data/app/views/decidim/conferences/admin/registration_types/new.html.erb +7 -0
  70. data/app/views/decidim/conferences/admin/send_conference_diploma_mailer/diploma.html.erb +1 -0
  71. data/app/views/decidim/conferences/admin/send_conference_diploma_mailer/diploma_user.html.erb +24 -0
  72. data/app/views/decidim/conferences/conference_program/_program_meeting.html.erb +1 -2
  73. data/app/views/decidim/conferences/conference_registration_mailer/confirmation.html.erb +9 -1
  74. data/app/views/decidim/conferences/conference_registration_mailer/pending_validation.html.erb +11 -0
  75. data/app/views/decidim/conferences/conferences/index.html.erb +2 -2
  76. data/app/views/decidim/conferences/conferences/show.html.erb +10 -24
  77. data/app/views/decidim/conferences/registration_types/index.html.erb +30 -0
  78. data/app/views/decidim/conferences/shared/_conference_user_login.html.erb +14 -0
  79. data/app/views/layouts/decidim/_conference_hero.html.erb +5 -3
  80. data/app/views/layouts/decidim/_conferences_nav.html.erb +45 -89
  81. data/app/views/layouts/decidim/admin/conference.html.erb +26 -8
  82. data/app/views/layouts/decidim/diploma.html.erb +11 -0
  83. data/config/initializers/wicked_pdf.rb +23 -0
  84. data/config/locales/ca.yml +125 -19
  85. data/config/locales/de.yml +127 -21
  86. data/config/locales/en.yml +126 -23
  87. data/config/locales/es-PY.yml +125 -19
  88. data/config/locales/es.yml +125 -19
  89. data/config/locales/eu.yml +127 -21
  90. data/config/locales/fi-pl.yml +570 -0
  91. data/config/locales/fi.yml +145 -39
  92. data/config/locales/fr.yml +127 -21
  93. data/config/locales/gl.yml +126 -20
  94. data/config/locales/hu.yml +127 -21
  95. data/config/locales/id-ID.yml +563 -0
  96. data/config/locales/it.yml +127 -21
  97. data/config/locales/nl.yml +126 -20
  98. data/config/locales/pl.yml +127 -24
  99. data/config/locales/pt-BR.yml +125 -19
  100. data/config/locales/pt.yml +126 -20
  101. data/config/locales/sv.yml +164 -58
  102. data/config/locales/tr-TR.yml +567 -0
  103. data/db/migrate/20181023142325_add_conference_registration_types.rb +21 -0
  104. data/db/migrate/20181030090202_add_reference_registration_type_to_conference_registration.rb +9 -0
  105. data/db/migrate/20181030153614_add_registration_type_to_conference_invite.rb +8 -0
  106. data/db/migrate/20181106092826_add_diploma_fields_to_conference.rb +11 -0
  107. data/db/migrate/20181123124424_make_price_optional_conference_registration_type.rb +7 -0
  108. data/lib/decidim/conferences/admin_engine.rb +16 -2
  109. data/lib/decidim/conferences/engine.rb +8 -4
  110. data/lib/decidim/conferences/participatory_space.rb +11 -0
  111. data/lib/decidim/conferences/test/factories.rb +36 -0
  112. data/lib/decidim/conferences/version.rb +1 -1
  113. metadata +94 -22
  114. data/app/cells/decidim/conferences/join_conference_button_cell.rb +0 -42
  115. data/app/views/decidim/conferences/conferences/_conferences_sidebar.html.erb +0 -11
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Conferences
5
+ module Admin
6
+ # Controller that allows managing conference speakers.
7
+ #
8
+ class RegistrationTypesController < Decidim::Conferences::Admin::ApplicationController
9
+ include Concerns::ConferenceAdmin
10
+ include Decidim::ApplicationHelper
11
+
12
+ def index
13
+ enforce_permission_to :index, :registration_type
14
+
15
+ @registration_types = collection.page(params[:page]).per(15)
16
+ end
17
+
18
+ def new
19
+ enforce_permission_to :create, :registration_type
20
+ @form = form(Decidim::Conferences::Admin::RegistrationTypeForm).instance
21
+ end
22
+
23
+ def create
24
+ enforce_permission_to :create, :registration_type
25
+ @form = form(Decidim::Conferences::Admin::RegistrationTypeForm).from_params(params)
26
+
27
+ CreateRegistrationType.call(@form, current_user, current_conference) do
28
+ on(:ok) do
29
+ flash[:notice] = I18n.t("registration_types.create.success", scope: "decidim.admin")
30
+ redirect_to conference_registration_types_path(current_conference)
31
+ end
32
+
33
+ on(:invalid) do
34
+ flash.now[:alert] = I18n.t("registration_types.create.error", scope: "decidim.admin")
35
+ render :new
36
+ end
37
+ end
38
+ end
39
+
40
+ def edit
41
+ @registration_type = collection.find(params[:id])
42
+ enforce_permission_to :update, :registration_type, registration_type: @registration_type
43
+ @form = form(Decidim::Conferences::Admin::RegistrationTypeForm).from_model(@registration_type)
44
+ end
45
+
46
+ def update
47
+ @registration_type = collection.find(params[:id])
48
+ enforce_permission_to :update, :registration_type, registration_type: @registration_type
49
+ @form = form(Decidim::Conferences::Admin::RegistrationTypeForm).from_params(params)
50
+
51
+ UpdateRegistrationType.call(@form, @registration_type) do
52
+ on(:ok) do
53
+ flash[:notice] = I18n.t("registration_types.update.success", scope: "decidim.admin")
54
+ redirect_to conference_registration_types_path(current_conference)
55
+ end
56
+
57
+ on(:invalid) do
58
+ flash.now[:alert] = I18n.t("registration_types.update.error", scope: "decidim.admin")
59
+ render :edit
60
+ end
61
+ end
62
+ end
63
+
64
+ def destroy
65
+ @registration_type = collection.find(params[:id])
66
+ enforce_permission_to :destroy, :registration_type, registration_type: @registration_type
67
+
68
+ DestroyRegistrationType.call(@registration_type, current_user) do
69
+ on(:ok) do
70
+ flash[:notice] = I18n.t("registration_types.destroy.success", scope: "decidim.admin")
71
+ redirect_to conference_registration_types_path(current_conference)
72
+ end
73
+ end
74
+ end
75
+
76
+ private
77
+
78
+ def collection
79
+ @collection ||= Decidim::Conferences::RegistrationType.where(conference: current_conference)
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -6,6 +6,8 @@ module Decidim
6
6
  class ApplicationController < Decidim::ApplicationController
7
7
  helper Decidim::ApplicationHelper
8
8
  helper Decidim::ResourceHelper
9
+ helper Decidim::Conferences::ConferenceHelper
10
+
9
11
  include NeedsPermission
10
12
 
11
13
  private
@@ -7,7 +7,7 @@ module Decidim
7
7
  def create
8
8
  enforce_permission_to :join, :conference, conference: conference
9
9
 
10
- JoinConference.call(conference, current_user) do
10
+ JoinConference.call(conference, registration_type, current_user) do
11
11
  on(:ok) do
12
12
  flash[:notice] = I18n.t("conference_registrations.create.success", scope: "decidim.conferences")
13
13
  redirect_after_path
@@ -23,7 +23,7 @@ module Decidim
23
23
  def destroy
24
24
  enforce_permission_to :leave, :conference, conference: conference
25
25
 
26
- LeaveConference.call(conference, current_user) do
26
+ LeaveConference.call(conference, registration_type, current_user) do
27
27
  on(:ok) do
28
28
  flash[:notice] = I18n.t("conference_registrations.destroy.success", scope: "decidim.conferences")
29
29
  redirect_after_path
@@ -58,6 +58,10 @@ module Decidim
58
58
  @conference ||= Conference.find_by(slug: params[:conference_slug])
59
59
  end
60
60
 
61
+ def registration_type
62
+ conference.registration_types.find_by(id: params[:registration_type_id])
63
+ end
64
+
61
65
  def redirect_after_path
62
66
  referer = request.headers["Referer"]
63
67
  return redirect_to(conference_path(conference)) if referer =~ /invitation_token/
@@ -27,6 +27,10 @@ module Decidim
27
27
  check_current_user_can_visit_space
28
28
  end
29
29
 
30
+ def user_diploma
31
+ render layout: "decidim/diploma"
32
+ end
33
+
30
34
  private
31
35
 
32
36
  def current_participatory_space
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Conferences
5
+ class RegistrationTypesController < Decidim::Conferences::ApplicationController
6
+ include ParticipatorySpaceContext
7
+
8
+ participatory_space_layout only: :index
9
+
10
+ helper_method :collection, :conference
11
+
12
+ def index
13
+ raise ActionController::RoutingError, "No registration types for this conference " if registration_types.empty? && current_participatory_space.registrations_enabled.empty?
14
+ enforce_permission_to :list, :registration_types
15
+ redirect_to decidim_conferences.conference_path(current_participatory_space) unless current_user_can_visit_space?
16
+ end
17
+
18
+ private
19
+
20
+ def registration_types
21
+ @registration_types ||= current_participatory_space.registration_types.published
22
+ end
23
+
24
+ alias collection registration_types
25
+
26
+ def current_participatory_space
27
+ return unless params[:conference_slug]
28
+
29
+ @current_participatory_space ||= OrganizationConferences.new(current_organization).query.where(slug: params[:conference_slug]).or(
30
+ OrganizationConferences.new(current_organization).query.where(id: params[:conference_slug])
31
+ ).first!
32
+ end
33
+
34
+ def conference
35
+ current_participatory_space
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,21 @@
1
+ # frozen-string_literal: true
2
+
3
+ module Decidim
4
+ module Conferences
5
+ class ConferenceRegistrationNotificationEvent < Decidim::Events::BaseEvent
6
+ include Decidim::Events::NotificationEvent
7
+
8
+ def notification_title
9
+ I18n.t("notification_title", i18n_options).html_safe
10
+ end
11
+
12
+ def i18n_options
13
+ {
14
+ resource_title: resource_title,
15
+ resource_url: resource_url,
16
+ scope: event_name
17
+ }
18
+ end
19
+ end
20
+ end
21
+ end
@@ -49,8 +49,8 @@ module Decidim
49
49
  validates :banner_image, file_size: { less_than_or_equal_to: ->(_record) { Decidim.maximum_attachment_size } }, file_content_type: { allow: ["image/jpeg", "image/png"] }
50
50
  validate :available_slots_greater_than_or_equal_to_registrations_count, if: ->(form) { form.registrations_enabled? && form.available_slots.positive? }
51
51
 
52
- validates :start_date, presence: true, date: { before: :end_date }
53
- validates :end_date, presence: true, date: { after: :start_date }
52
+ validates :start_date, presence: true, date: { before_or_equal_to: :end_date }
53
+ validates :end_date, presence: true, date: { after_or_equal_to: :start_date }
54
54
 
55
55
  def map_model(model)
56
56
  self.scope_id = model.decidim_scope_id
@@ -61,6 +61,7 @@ module Decidim
61
61
  end
62
62
 
63
63
  def processes_for_select
64
+ return unless Decidim.participatory_space_manifests.map(&:name).include?(:participatory_processes)
64
65
  @processes_for_select ||= Decidim.find_participatory_space_manifest(:participatory_processes)
65
66
  .participatory_spaces.call(current_organization)&.order(title: :asc)&.map do |process|
66
67
  [
@@ -71,6 +72,7 @@ module Decidim
71
72
  end
72
73
 
73
74
  def assemblies_for_select
75
+ return unless Decidim.participatory_space_manifests.map(&:name).include?(:assemblies)
74
76
  @assemblies_for_select ||= Decidim.find_participatory_space_manifest(:assemblies)
75
77
  .participatory_spaces.call(current_organization)&.order(title: :asc)&.map do |assembly|
76
78
  [
@@ -81,6 +83,7 @@ module Decidim
81
83
  end
82
84
 
83
85
  def consultations_for_select
86
+ return unless Decidim.participatory_space_manifests.map(&:name).include?(:consultations)
84
87
  @consultations_for_select ||= Decidim.find_participatory_space_manifest(:consultations)
85
88
  .participatory_spaces.call(current_organization)&.order(title: :asc)&.map do |consultation|
86
89
  [
@@ -6,9 +6,11 @@ module Decidim
6
6
  # A form object used to invite users to join a conference.
7
7
  #
8
8
  class ConferenceRegistrationInviteForm < Form
9
+ include TranslatableAttributes
9
10
  attribute :name, String
10
11
  attribute :email, String
11
12
  attribute :user_id, Integer
13
+ attribute :registration_type_id, Integer
12
14
  attribute :existing_user, Boolean, default: false
13
15
 
14
16
  validates :name, presence: true, unless: proc { |object| object.existing_user }
@@ -18,6 +20,19 @@ module Decidim
18
20
  def user
19
21
  @user ||= current_organization.users.find_by(id: user_id)
20
22
  end
23
+
24
+ def registration_type
25
+ @registration_type ||= current_participatory_space.registration_types.find_by(id: registration_type_id)
26
+ end
27
+
28
+ def registration_types_for_select
29
+ @registration_types_for_select ||= current_participatory_space.registration_types&.map do |registration_type|
30
+ [
31
+ translated_attribute(registration_type.title),
32
+ registration_type.id
33
+ ]
34
+ end
35
+ end
21
36
  end
22
37
  end
23
38
  end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Conferences
5
+ module Admin
6
+ # A form object used to update conference diploma configuration
7
+ # from the admin dashboard
8
+ #
9
+ class DiplomaForm < Form
10
+ mimic :conference
11
+
12
+ attribute :main_logo
13
+ attribute :signature
14
+ attribute :signature_name, String
15
+ attribute :sign_date, Decidim::Attributes::LocalizedDate
16
+
17
+ validates :signature_name, :sign_date, :main_logo, :signature, presence: true
18
+
19
+ validates :main_logo, file_size: { less_than_or_equal_to: ->(_record) { Decidim.maximum_attachment_size } }, file_content_type: { allow: ["image/jpeg", "image/png"] }
20
+ validates :signature, file_size: { less_than_or_equal_to: ->(_record) { Decidim.maximum_attachment_size } }, file_content_type: { allow: ["image/jpeg", "image/png"] }
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Conferences
5
+ module Admin
6
+ # A form object used to create conference registration types from the admin dashboard.
7
+ class RegistrationTypeForm < Form
8
+ include TranslatableAttributes
9
+ include Decidim::ApplicationHelper
10
+
11
+ mimic :conference_registration_type
12
+
13
+ translatable_attribute :title, String
14
+ translatable_attribute :description, String
15
+
16
+ attribute :weight, Integer
17
+ attribute :price, Decimal
18
+ attribute :conference_meeting_ids, Array[Integer]
19
+
20
+ validates :title, :description, :weight, presence: true
21
+ validates :weight, numericality: { greater_than_or_equal_to: 0 }
22
+ validates :price, numericality: { greater_than_or_equal_to: 0 }, if: ->(form) { form.price.present? }
23
+
24
+ def meetings
25
+ meeting_components = current_participatory_space.components.where(manifest_name: "meetings")
26
+ @meetings ||= Decidim::ConferenceMeeting.where(component: meeting_components)
27
+ &.order(title: :asc)
28
+ &.map do |meeting|
29
+ OpenStruct.new(
30
+ title: present(meeting).title,
31
+ value: meeting.id
32
+ )
33
+ end
34
+ end
35
+
36
+ def conference_meetings
37
+ meeting_components = current_participatory_space.components.where(manifest_name: "meetings")
38
+ return unless meeting_components || conference_meeting_ids.delete("").present?
39
+ @conference_meetings ||= Decidim::ConferenceMeeting.where(component: meeting_components).where(id: conference_meeting_ids)
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ # A Helper to render conferences.
5
+ module Conferences
6
+ module ConferenceHelper
7
+ # Renders the dates of a conference
8
+ #
9
+ def render_date(conference)
10
+ return l(conference.start_date, format: :decidim_with_month_name_short) if conference.start_date == conference.end_date
11
+ "#{l(conference.start_date, format: :decidim_with_month_name_short)} - #{l(conference.end_date, format: :decidim_with_month_name_short)}"
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Conferences
5
+ module Admin
6
+ class SendConferenceDiplomaJob < ApplicationJob
7
+ queue_as :conference_diplomas
8
+
9
+ def perform(conference)
10
+ confirmed_registrations = conference.conference_registrations.confirmed
11
+ return unless confirmed_registrations.any?
12
+
13
+ confirmed_registrations.each do |registration_confirmed|
14
+ SendConferenceDiplomaMailer.diploma(conference, registration_confirmed.user).deliver_now
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -21,7 +21,7 @@ module Decidim
21
21
  event: "decidim.events.conferences.upcoming_conference",
22
22
  event_class: Decidim::Conferences::UpcomingConferenceEvent,
23
23
  resource: conference,
24
- recipient_ids: conference.followers.pluck(:id)
24
+ followers: conference.followers
25
25
  )
26
26
  end
27
27
 
@@ -19,13 +19,14 @@ module Decidim
19
19
  # user - The user being invited
20
20
  # conference - The conference being joined.
21
21
  # invited_by - The user performing the invitation.
22
- def invite(user, conference, invited_by)
22
+ def invite(user, conference, registration_type, invited_by)
23
23
  with_user(user) do
24
24
  @user = user
25
25
  @conference = conference
26
26
  @invited_by = invited_by
27
27
  @organization = @conference.organization
28
28
  @locator = Decidim::ResourceLocatorPresenter.new(@conference)
29
+ @registration_type = registration_type
29
30
 
30
31
  subject = I18n.t("invite.subject", scope: "decidim.conferences.mailer.invite_join_conference_mailer")
31
32
  mail(to: user.email, subject: subject)
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Conferences
5
+ module Admin
6
+ # A custom mailer for sending the diploma of the conference to
7
+ # a registered user who attends to the conference.
8
+ class SendConferenceDiplomaMailer < Decidim::ApplicationMailer
9
+ include Decidim::TranslationsHelper
10
+ include Decidim::SanitizeHelper
11
+
12
+ helper Decidim::ResourceHelper
13
+ helper Decidim::TranslationsHelper
14
+
15
+ # Send an email to an user with the diploma of conference attendance attached.
16
+ #
17
+ # user - The user being invited
18
+ # conference - The conference being joined.
19
+ def diploma(conference, user)
20
+ with_user(user) do
21
+ @user = user
22
+ @conference = conference
23
+ @organization = @conference.organization
24
+ @locator = Decidim::ResourceLocatorPresenter.new(@conference)
25
+
26
+ add_diploma_attachment
27
+
28
+ subject = I18n.t("diploma.subject", scope: "decidim.conferences.mailer.send_conference_diploma_mailer")
29
+ mail(to: user.email, subject: subject)
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ def add_diploma_attachment
36
+ diploma = WickedPdf.new.pdf_from_string(
37
+ render_to_string(pdf: "conference-diploma",
38
+ template: "decidim/conferences/admin/send_conference_diploma_mailer/diploma_user.html.erb",
39
+ layout: "decidim/diploma.html.erb"),
40
+ orientation: "Landscape"
41
+ )
42
+
43
+ attachments["conference-#{@user.nickname.parameterize}-diploma.pdf"] = diploma
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end