mr_common 1.3.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +30 -9
  3. data/app/controllers/mr_common/dashboard_controller.rb +1 -0
  4. data/app/controllers/mr_common/pre_registrations/import_controller.rb +26 -0
  5. data/app/controllers/mr_common/pre_registrations/pre_registrations_controller.rb +48 -0
  6. data/app/controllers/mr_common/registrations/confirmations_controller.rb +54 -0
  7. data/app/controllers/mr_common/registrations/export_controller.rb +35 -4
  8. data/app/controllers/mr_common/registrations/public_controller.rb +24 -1
  9. data/app/controllers/mr_common/registrations/registrations_controller.rb +2 -0
  10. data/app/controllers/mr_common/registrations/resend_notifications_controller.rb +27 -0
  11. data/app/controllers/mr_common/registrations/success_controller.rb +1 -0
  12. data/app/mailers/mr_common/registration_mailer.rb +13 -3
  13. data/app/models/concerns/mr_common/csv_exportable.rb +6 -2
  14. data/app/models/mr_common/country.rb +9 -0
  15. data/app/models/mr_common/csv_renderer.rb +38 -0
  16. data/app/models/mr_common/pattern.rb +10 -0
  17. data/app/models/mr_common/pre_registration.rb +52 -0
  18. data/app/models/mr_common/pre_registration_importer.rb +91 -0
  19. data/app/models/mr_common/registration.rb +11 -2
  20. data/app/models/mr_common/registration_decorator.rb +20 -0
  21. data/app/models/mr_common/reminder.rb +6 -0
  22. data/app/models/mr_common/timezone.rb +5 -0
  23. data/app/views/layouts/mr_common/_navigation.html.erb +7 -0
  24. data/app/views/mr_common/pre_registrations/import/new.html.erb +27 -0
  25. data/app/views/mr_common/pre_registrations/pre_registrations/_form.html.erb +29 -0
  26. data/app/views/mr_common/pre_registrations/pre_registrations/index.html.erb +32 -0
  27. data/{lib/generators/mr_common/views/templates/mr_common/registrations/public → app/views/mr_common/pre_registrations/pre_registrations}/new.html.erb +2 -1
  28. data/{lib/generators/mr_common/views/templates/mr_common/registration_mailer/confirmation.html.erb → app/views/mr_common/registration_mailer/confirmed_registration.html.erb} +3 -0
  29. data/app/views/mr_common/registration_mailer/{confirmation.text.erb → confirmed_registration.text.erb} +2 -0
  30. data/app/views/mr_common/registration_mailer/revoked_registration.html.erb +5 -0
  31. data/app/views/mr_common/registration_mailer/revoked_registration.text.erb +6 -0
  32. data/app/views/mr_common/registration_mailer/unconfirmed_registration.html.erb +3 -0
  33. data/app/views/mr_common/registration_mailer/unconfirmed_registration.text.erb +4 -0
  34. data/app/views/mr_common/registrations/registrations/_form.html.erb +6 -0
  35. data/app/views/mr_common/registrations/registrations/index.html.erb +4 -0
  36. data/app/views/mr_common/registrations/registrations/show.html.erb +34 -3
  37. data/config/routes.rb +13 -1
  38. data/db/migrate/20190522151523_create_pre_registrations.rb +12 -0
  39. data/db/migrate/20190530220614_add_confirmed_to_registrations.rb +5 -0
  40. data/lib/generators/mr_common/controllers/USAGE +9 -0
  41. data/lib/generators/mr_common/controllers/controllers_generator.rb +24 -0
  42. data/lib/generators/mr_common/mailers/USAGE +16 -0
  43. data/lib/generators/mr_common/mailers/mailers_generator.rb +31 -0
  44. data/lib/generators/mr_common/models/USAGE +8 -0
  45. data/lib/generators/mr_common/models/models_generator.rb +23 -0
  46. data/lib/generators/mr_common/views/USAGE +1 -4
  47. data/lib/generators/mr_common/views/views_generator.rb +7 -8
  48. data/lib/mr_common.rb +14 -2
  49. data/lib/mr_common/version.rb +1 -1
  50. data/spec/dummy/config/initializers/mr_common.rb +10 -0
  51. data/spec/dummy/db/schema.rb +14 -4
  52. data/spec/dummy/log/development.log +1969 -50958
  53. data/spec/dummy/log/test.log +647 -14437
  54. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-G/-gyHBJNssgJVEwk7sD1F9nK_dT1D1R5NjlAvcESJxME.cache +1 -0
  55. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/3d/3DI5adLgOKj6Q76fFxrLy_hKYkrlht0MEWksNkYgoXk.cache +1 -0
  56. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/3n/3NK03OBfUwDPKVYV6_11AOo3IGNUQPed4dqB-Ddv6-Q.cache +0 -0
  57. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7d/7DbSMErmkAd0cL6q_WyLMfx7gLYQB0h9smKZ0xGjOjY.cache +2 -0
  58. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/9m/9MK1AG2zx0HVFVRULpQQnQQY0HiNroKnYEz2FUBzw6k.cache +1 -0
  59. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/CO/cojbSP1f9tYoCyycggqXgW3OYb3atOkOpf-h-Axn36o.cache +1 -0
  60. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/H6/h6GO-mL-rzWHmoiFw-uuwdny5zj_zSb1Xzun5jkza5k.cache +1 -0
  61. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/LG/LG2fyButWQgZoNvH4qD2dBMQhl35dSysUbxsvw_2PA0.cache +0 -0
  62. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/LZ/lZ_yNthdvXeWexZW9TZuMWs6lZBLMEF5rp7aA5Bl9uU.cache +2 -0
  63. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Lh/LhBzrZLgp6fzHcgWFt_B-TqHzHaPyKv9Uk67brUycZE.cache +1 -0
  64. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/N-/N-7bXt4Ck0q2VWzHHuRPKL0a0CH_1W_eyAU59tZraxE.cache +1 -0
  65. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Pi/PI3-Xhs-TBYEqgGeCf3hWGn6vj1qCdqBqgYRY2jNr4Q.cache +1 -0
  66. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/QQ/qqtvJX4CrLCTv4jjIg0LwoNxJUyDpLus0RIbg6D6muk.cache +1 -0
  67. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Se/setx2SgK-JX4zwjgbekiVnvWJnbp0-2XnO0TQJfCOHU.cache +1 -0
  68. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ue/UecY7KKAHkP6oiqpx1zkXAL9WWGqWdhgqhixQyJ82is.cache +1 -0
  69. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/VF/VfH7y0fTeHy8aLBK_bu5OKprS0c1-GCHUzrMzp-O0_I.cache +1 -0
  70. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/WC/WCV-7lpbJsFHZueodYuN5542p56UPNtby1LVPUjvuJU.cache +1 -0
  71. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/WV/wvfl97Gci1mpw00EFHWc0Q9x0DLBar03PTd9BrZ7MF0.cache +1 -0
  72. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/eP/ePjuIgA1bwfnJWATz7q6EjGfNnpvYEaKW_2aozCJFBQ.cache +1 -0
  73. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ge/GegLYwRNBYKvfYR1-WWnx3ssHerCO6M94VPxwUTYHtM.cache +1 -0
  74. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/h9/H95rpLdUakuAt6lpkUhlZvxsYlSb-VrfpiznZYmWnGo.cache +1 -0
  75. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/p_/P_kWJKPROj6qDVkyzNQgx8wZmba8YaTqtWMQyGHFtuY.cache +1 -0
  76. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/w3/w34qFl6hbbodwCEAr9Px_jzso7svjewL5BaOf6QMIN4.cache +1 -0
  77. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wi/wi_OyVKzMxj9CcM3e2Bhab5PQSg4wh0nD-7QJQ3SVPw.cache +1 -0
  78. data/spec/dummy/tmp/pids/server.pid +1 -1
  79. data/spec/factories/registrations.rb +5 -5
  80. data/spec/models/registration_spec.rb +40 -0
  81. metadata +80 -11
  82. data/app/helpers/mr_common/form_helper.rb +0 -11
  83. data/app/models/mr_common/csv_exporter.rb +0 -35
  84. data/app/models/mr_common/default_csv_export_adapter.rb +0 -23
  85. data/app/views/mr_common/registration_mailer/confirmation.html.erb +0 -4
  86. data/lib/generators/mr_common/views/templates/mr_common/registration_mailer/confirmation.text.erb +0 -6
  87. data/lib/generators/mr_common/views/templates/mr_common/registrations/success/index.html.erb +0 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5e0885e32d5643b86e1da2fe11974a06eb9c5a327fd82bd7bebcf8d85484e8ef
4
- data.tar.gz: 0e20a6e34659744854a5ed28eac632c92c4b5f7d969ad201d8fa31e31a21944a
3
+ metadata.gz: 54451845d3b9872d8263616b7cd840d794e9ec6c5ad523065e3a9706bb426e3e
4
+ data.tar.gz: '0564509763ef97f22dbec7798998ad2c7f590387413e8a3842a094cec50d551f'
5
5
  SHA512:
6
- metadata.gz: a1070f2831e2216c89b387e6a1fa4c0c0e88519f2d01a0fd93af120cefeeabeed64fc40fe572fbf809c67610f93f86dcbf8936f288b9ced626dc6be1a22cd48e
7
- data.tar.gz: 3af9a459afe31200e94a344ac87299f9b09bc3c6a2d2e30156e7ae61a21bcb3dc0ded109747ac462db7a34c87c3120841bdac00219f340e946c10ac7dc4deac7
6
+ metadata.gz: ca8b97d5a0d98de6fc4d0fb955367df3d4460bccb8e01be610b9763af7c954415c7d393c9e6e2d9846f8245a00c1d803ed22b1cee7e78196b00bdb64aa488ce6
7
+ data.tar.gz: 22e0354f7d4661a67529ecdc5fa26db58518c9f3c792183de385364596983c724377a99943f78fa8c181a1a819f76fc6287b20788e73c9eba7e8a9b2ee7af13c
data/README.md CHANGED
@@ -4,6 +4,7 @@ Common utilities extracted from starter-reg-site for use elsewhere
4
4
  ## Features
5
5
  * Dashboard at the mount point that relies on the host app for authentication
6
6
  * [MrCommon::Registration](/doc/mr_common/registration.md) - default registration model and controller with csv export exposed via the dashboard
7
+ * MrCommon::PreRegistration - whitelist firstname + lastname combos, or emails for automatic registration confirmation, requires `MrCommon.registration_confirmation_strategy == :pre_register`
7
8
  * [MrCommon::Reminder](/doc/mr_common/reminder.md) - model for generating downloadable ical reminders
8
9
  * MrCommon::Country - convenient wrapper around the Carmen gem
9
10
  * MrCommon::Pattern - a utility class for sharing common regex patterns
@@ -16,7 +17,7 @@ Add to Gemfile
16
17
 
17
18
  ```ruby
18
19
  # Gemfile
19
- gem 'mr_common', '~> 1'
20
+ gem 'mr_common', '~> 2'
20
21
  ```
21
22
 
22
23
  Add to routes.rb
@@ -29,10 +30,13 @@ mount MrCommon::Engine, at: '/common'
29
30
  root to: "mr_common/registrations/public#new"
30
31
  ```
31
32
 
32
- Generate view overrides in the host project
33
+ Copy model/controller/views into the host app for overriding/customizing.
33
34
 
34
35
  ```
36
+ $ bin/rails g mr_common:models
35
37
  $ bin/rails g mr_common:views
38
+ $ bin/rails g mr_common:mailers
39
+ $ bin/rails g mr_common:controllers
36
40
  ```
37
41
 
38
42
  Configure an initializer if you need different values than the defaults listed here
@@ -46,19 +50,36 @@ MrCommon.current_user_authorization_method_name = :mr_common_admin?
46
50
  MrCommon.logout_path_helper = :destroy_user_session_path
47
51
  MrCommon.logout_path_method = :delete
48
52
  MrCommon.sign_in_path_helper = :new_user_session_path
49
- MrCommon.registration_success_notice = "Registration completed successfully."
50
- MrCommon.registration_failure_alert = "Registration could not be completed."
51
53
  MrCommon.host_app_layout = "application"
52
- MrCommon.registration_confirmation_subject = "Your registration confirmation."
53
- MrCommon.registration_reminder_slug = "reminder"
54
+
55
+ # Alert/Notice strings
56
+ MrCommon.registration_failure_alert = "Registration could not be completed."
57
+ MrCommon.registration_success_notice = "Registration created successfully."
58
+
59
+ # RegistrationMailer subjects
60
+ MrCommon.registration_confirmed_subject = "Your registration is confirmed."
61
+ MrCommon.registration_unconfirmed_subject = "Thanks for your interest."
62
+ MrCommon.registration_revoked_subject = "Your registration is not confirmed."
63
+
64
+ # Dashboard Title
65
+ MrCommon.title = "Mreach Common Utils"
66
+
67
+ # All Registrations will be automatically confirmed (default)
68
+ # MrCommon.registration_confirmation_strategy = :auto
69
+
70
+ # Registrations will be confirmed automatically if a PreRegistration is found
71
+ # MrCommon.registration_confirmation_strategy = :pre_register
72
+
73
+ # An admin will need to log in and click the confirm button for each registration
74
+ # MrCommon.registration_confirmation_strategy = :manual
54
75
  ```
55
76
 
56
77
  ## Development
57
78
 
58
79
  1. `gem install foreman mailcatcher`
59
- 1. Clone
60
- 1. Bundle Install
61
- 1. Don't yarn. Engines have to use old school sprockets manifests
80
+ 1. clone
81
+ 1. bundle Install
82
+ 1. don't use yarn/npm, engines have to use old school sprockets manifests
62
83
  1. run `bin/rails run` to start the app + mailcatcher.
63
84
 
64
85
  ## License
@@ -2,6 +2,7 @@
2
2
 
3
3
  module MrCommon
4
4
  class DashboardController < BaseController
5
+ # The root of the admin dashboard
5
6
  def index
6
7
  end
7
8
  end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "csv"
4
+
5
+ module MrCommon
6
+ module PreRegistrations
7
+ # Implements PreRegistration import for the admin panel. Expects the user to
8
+ # upload a CSV file with a header line and columns ordered like:
9
+ # first_name, last_name, email
10
+ class ImportController < BaseController
11
+ def new
12
+ end
13
+
14
+ def create
15
+ csv = import_params[:csv_file]
16
+ importer = MrCommon::PreRegistrationImporter.new(csv.read)
17
+ result = importer.import
18
+ redirect_to new_pre_registrations_import_path, notice: "Imported #{result.created} and skipped #{result.skipped} duplicate or invalid entries."
19
+ end
20
+
21
+ def import_params
22
+ params.require(:import).permit(:csv_file)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MrCommon
4
+ module PreRegistrations
5
+ class PreRegistrationsController < BaseController
6
+ def index
7
+ @pre_registration = PreRegistration.order(email: :asc)
8
+ end
9
+
10
+ def new
11
+ @pre_registration = PreRegistration.new
12
+ end
13
+
14
+ def create
15
+ @pre_registration = PreRegistration.new(pre_registration_params)
16
+
17
+ if @pre_registration.save
18
+ redirect_to pre_registrations_path, notice: "Pre-registration saved."
19
+ else
20
+ flash.now[:alert] = "There was a problem saving the pre-registration."
21
+ render :new, status: :unprocessable_entity
22
+ end
23
+ end
24
+
25
+ def destroy
26
+ @pre_registration = PreRegistration.find(params[:id])
27
+
28
+ if @pre_registration.destroy
29
+ redirect_to pre_registrations_path, notice: "Pre-registration deleted."
30
+ else
31
+ redirect_to pre_registrations_path, notice: "There was a problem deleting the pre-registration."
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def pre_registration_params
38
+ params.require(
39
+ :confirmed_registration
40
+ ).permit(
41
+ :email,
42
+ :first_name,
43
+ :last_name
44
+ )
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MrCommon
4
+ module Registrations
5
+ class ConfirmationsController < BaseController
6
+ # Confirm a registration.
7
+ def create
8
+ find_registration
9
+
10
+ if confirm_registration
11
+ send_notification
12
+ redirect_to @registration, notice: "Registration confirmed. Registrant will receive an email."
13
+ else
14
+ Rails.logger.debug(@registration.errors.full_messages)
15
+ redirect_to @registration, alert: "Unable to confirm registration"
16
+ end
17
+ end
18
+
19
+ # Revoke a registration's confirmation.
20
+ def destroy
21
+ find_registration
22
+
23
+ if unconfirm_registration
24
+ send_notification
25
+ redirect_to @registration, notice: "Confirmation revoked. Registrant will receive an email."
26
+ else
27
+ Rails.logger.debug(@registration.errors.full_messages)
28
+ redirect_to @registration, alert: "Unable to revoke confirmation"
29
+ end
30
+ end
31
+
32
+ private
33
+ def find_registration
34
+ @registration = MrCommon::Registration.find(params[:registration_id])
35
+ end
36
+
37
+ def confirm_registration
38
+ @registration.update(confirmed: true)
39
+ end
40
+
41
+ def unconfirm_registration
42
+ @registration.update(confirmed: false)
43
+ end
44
+
45
+ def send_notification
46
+ if @registration.confirmed?
47
+ RegistrationMailer.confirmed_registration(@registration.id).deliver_now
48
+ else
49
+ RegistrationMailer.revoked_registration(@registration.id).deliver_now
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -3,12 +3,43 @@
3
3
  module MrCommon
4
4
  module Registrations
5
5
  class ExportController < BaseController
6
+ # Generates CSV data and sends as file download.
6
7
  def index
7
- send_data(
8
- Registration.as_csv(format_rules: Registration.try(:csv_format_rules)),
9
- filename: "Registrations-#{Date.today}.csv"
10
- )
8
+ send_data(registrations_csv, filename: filename)
11
9
  end
10
+
11
+ private
12
+
13
+ def registrations_csv
14
+ fields = csv_fields
15
+ fields.delete(:pre_registered?) unless MrCommon.registration_confirmation_strategy == :pre_register
16
+
17
+ CSVRenderer.new(
18
+ collection: MrCommon::Registration.all,
19
+ decorator: MrCommon::RegistrationDecorator,
20
+ fields: fields
21
+ ).render
22
+ end
23
+
24
+ def csv_fields
25
+ [
26
+ :first_name,
27
+ :last_name,
28
+ :email,
29
+ :company_name,
30
+ :telephone,
31
+ :zip_code,
32
+ :country,
33
+ :pre_registered?,
34
+ :confirmed?,
35
+ :created_at,
36
+ :updated_at
37
+ ]
38
+ end
39
+
40
+ def filename
41
+ "Registrations-#{Date.today}.csv"
42
+ end
12
43
  end
13
44
  end
14
45
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  module MrCommon
4
4
  module Registrations
5
+ # Implements public Registration actions available from the landing page.
5
6
  class PublicController < PublicBaseController
6
7
  def new
7
8
  @registration = Registration.new
@@ -9,9 +10,10 @@ module MrCommon
9
10
 
10
11
  def create
11
12
  @registration = Registration.new(registration_params)
13
+ @registration.confirmed = true if should_confirm_registration?
12
14
 
13
15
  if @registration.save
14
- RegistrationMailer.confirmation(@registration.id).deliver_now
16
+ send_notification
15
17
  redirect_to registrations_success_index_path, notice: MrCommon.registration_success_notice
16
18
  else
17
19
  flash.now[:alert] = MrCommon.registration_failure_alert if MrCommon.registration_failure_alert.present?
@@ -21,6 +23,27 @@ module MrCommon
21
23
 
22
24
  private
23
25
 
26
+ def should_confirm_registration?
27
+ case MrCommon.registration_confirmation_strategy
28
+ when :auto
29
+ true
30
+ when :pre_register
31
+ PreRegistration.exists_for?(@registration)
32
+ when :manual
33
+ false
34
+ else
35
+ false
36
+ end
37
+ end
38
+
39
+ def send_notification
40
+ if @registration.confirmed?
41
+ RegistrationMailer.confirmed_registration(@registration.id).deliver_now
42
+ else
43
+ RegistrationMailer.unconfirmed_registration(@registration.id).deliver_now
44
+ end
45
+ end
46
+
24
47
  def registration_params
25
48
  params.require(
26
49
  :registration
@@ -2,6 +2,7 @@
2
2
 
3
3
  module MrCommon
4
4
  module Registrations
5
+ # Admin CRUD for Registrations.
5
6
  class RegistrationsController < BaseController
6
7
  def index
7
8
  @registrations = Registration.order(first_name: :asc, last_name: :asc)
@@ -63,6 +64,7 @@ module MrCommon
63
64
  :company_name,
64
65
  :telephone,
65
66
  :job_title,
67
+ :confirmed,
66
68
  :contact_via_email,
67
69
  :contact_via_phone,
68
70
  )
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MrCommon
4
+ module Registrations
5
+ class ResendNotificationsController < BaseController
6
+ def create
7
+ find_registration
8
+ send_notification
9
+ redirect_to @registration, notice: "Notification sent."
10
+ end
11
+
12
+ private
13
+
14
+ def find_registration
15
+ @registration = MrCommon::Registration.find(params[:registration_id])
16
+ end
17
+
18
+ def send_notification
19
+ if @registration.confirmed?
20
+ MrCommon::RegistrationMailer.confirmed_registration(@registration.id).deliver_now
21
+ else
22
+ MrCommon::RegistrationMailer.unconfirmed_registration(@registration.id).deliver_now
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -3,6 +3,7 @@
3
3
  module MrCommon
4
4
  module Registrations
5
5
  class SuccessController < PublicBaseController
6
+ # Page rendered when a Registration is created successfully.
6
7
  def index
7
8
  end
8
9
  end
@@ -2,10 +2,20 @@
2
2
 
3
3
  module MrCommon
4
4
  class RegistrationMailer < ApplicationMailer
5
- def confirmation(registration_id)
5
+ def unconfirmed_registration(registration_id)
6
6
  @registration = Registration.find(registration_id)
7
- @reminders = Reminder.where(include_in_confirmation_mailer: true)
8
- mail(to: @registration.email, subject: MrCommon.registration_confirmation_subject)
7
+ mail(to: @registration.email, subject: MrCommon.registration_unconfirmed_subject)
8
+ end
9
+
10
+ def confirmed_registration(registration_id)
11
+ @registration = Registration.find(registration_id)
12
+ @reminders = Reminder.for_confirmed_notice
13
+ mail(to: @registration.email, subject: MrCommon.registration_confirmed_subject)
14
+ end
15
+
16
+ def revoked_registration(registration_id)
17
+ @registration = Registration.find(registration_id)
18
+ mail(to: @registration.email, subject: MrCommon.registration_revoked_subject)
9
19
  end
10
20
  end
11
21
  end
@@ -5,8 +5,12 @@ module MrCommon
5
5
  extend ActiveSupport::Concern
6
6
 
7
7
  class_methods do
8
- def as_csv(adapter: nil, format_rules: nil)
9
- CSVExporter.new(self, adapter: adapter, format_rules: format_rules).generate_csv
8
+ def as_csv(scope: :all, fields: nil, decorator: nil)
9
+ CSVRenderer.new(
10
+ collection: self.send(scope),
11
+ fields: fields || self.column_names,
12
+ decorator: decorator
13
+ ).render
10
14
  end
11
15
  end
12
16
  end
@@ -1,8 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MrCommon
4
+ # Wrapper doing common tasks with the Carmen gem
4
5
  class Country
5
6
  class << self
7
+ # @param top [Array<String>] a list of country codes that should be
8
+ # promoted to the top of the list.
9
+ # @return [Array<Array<String, String>>] an array of label-value pairs for
10
+ # building country select options.
6
11
  def all(top = [])
7
12
  all_countries = label_value_pairs.dup
8
13
 
@@ -13,14 +18,18 @@ module MrCommon
13
18
  all_countries
14
19
  end
15
20
 
21
+ # @return [Array<String>] two letter country codes in alphabetical order
16
22
  def codes
17
23
  Carmen::Country.all.map(&:code).sort
18
24
  end
19
25
 
26
+ # @return [Array<String>] country names in alphabetical order
20
27
  def names
21
28
  Carmen::Country.all.map(&:name).sort
22
29
  end
23
30
 
31
+ # @param code [String] a two letter country code
32
+ # @return [String] the name of the country for that code
24
33
  def name_for(code)
25
34
  Carmen::Country.alpha_2_coded(code).name
26
35
  end