effective_mailchimp 0.6.0 → 0.8.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 (34) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/admin/mailchimp_categories_controller.rb +15 -0
  3. data/app/controllers/admin/mailchimp_controller.rb +23 -0
  4. data/app/controllers/admin/mailchimp_interests_controller.rb +15 -0
  5. data/app/controllers/admin/mailchimp_list_members_controller.rb +15 -0
  6. data/app/controllers/admin/mailchimp_lists_controller.rb +0 -10
  7. data/app/datatables/admin/effective_mailchimp_categories_datatable.rb +32 -0
  8. data/app/datatables/admin/effective_mailchimp_interests_datatable.rb +47 -0
  9. data/app/datatables/admin/effective_mailchimp_list_members_datatable.rb +39 -0
  10. data/app/datatables/admin/effective_mailchimp_lists_datatable.rb +9 -3
  11. data/app/helpers/effective_mailchimp_helper.rb +10 -0
  12. data/app/jobs/effective_mailchimp_subscribe_all_members_job.rb +8 -0
  13. data/app/jobs/effective_mailchimp_subscribe_all_users_job.rb +8 -0
  14. data/app/models/concerns/effective_mailchimp_user.rb +15 -10
  15. data/app/models/effective/mailchimp_api.rb +70 -18
  16. data/app/models/effective/mailchimp_category.rb +74 -0
  17. data/app/models/effective/mailchimp_interest.rb +93 -0
  18. data/app/models/effective/mailchimp_list.rb +62 -32
  19. data/app/models/effective/mailchimp_list_member.rb +42 -1
  20. data/app/views/admin/mailchimp/_sync.html.haml +15 -0
  21. data/app/views/admin/mailchimp/index.html.haml +79 -0
  22. data/app/views/admin/mailchimp_interests/_form.html.haml +10 -0
  23. data/app/views/admin/mailchimp_lists/_form.html.haml +1 -0
  24. data/app/views/admin/mailchimp_user/_form.html.haml +10 -4
  25. data/app/views/effective/mailchimp_user/_fields.html.haml +36 -9
  26. data/config/effective_mailchimp.rb +6 -0
  27. data/config/locales/effective_mailchimp.en.yml +12 -0
  28. data/config/routes.rb +9 -7
  29. data/db/migrate/101_create_effective_mailchimp.rb +39 -0
  30. data/lib/effective_mailchimp/version.rb +1 -1
  31. data/lib/effective_mailchimp.rb +28 -3
  32. data/lib/tasks/effective_mailchimp_tasks.rake +0 -16
  33. metadata +16 -3
  34. data/app/views/admin/mailchimp_lists/index.html.haml +0 -20
@@ -3,6 +3,8 @@ module Effective
3
3
  self.table_name = (EffectiveMailchimp.mailchimp_lists_table_name || :mailchimp_lists).to_s
4
4
 
5
5
  has_many :mailchimp_list_members, dependent: :delete_all
6
+ has_many :mailchimp_categories, dependent: :delete_all
7
+ has_many :mailchimp_interests, dependent: :delete_all
6
8
 
7
9
  effective_resource do
8
10
  mailchimp_id :string
@@ -16,18 +18,16 @@ module Effective
16
18
  timestamps
17
19
  end
18
20
 
19
- def to_s
20
- name.presence || model_name.human
21
- end
22
-
23
- scope :deep, -> { all }
21
+ scope :deep, -> { includes(:mailchimp_categories, :mailchimp_interests) }
24
22
  scope :sorted, -> { order(:name) }
25
23
  scope :subscribable, -> { where(can_subscribe: true) }
26
24
 
27
- # Creates or builds all the Lists
28
- def self.sync!
25
+ # Reads all the Lists from Mailchimp and creates local MailchimpList records
26
+ # Also writes our merge fields to Mailchimp if they don't exist
27
+ # This is part of the Sync changes from Mailchimp button
28
+ def self.sync!(api: EffectiveMailchimp.api)
29
29
  # All the Lists from Mailchimp
30
- lists = EffectiveMailchimp.api.lists
30
+ lists = api.lists()
31
31
 
32
32
  # Get all our existing Effective::MailchimpList records
33
33
  mailchimp_lists = all()
@@ -35,11 +35,18 @@ module Effective
35
35
  # Find or create Effective::Mailchimp based on existing lists
36
36
  lists.each do |list|
37
37
  mailchimp_id = list['id']
38
- web_id = list['web_id']
39
- name = list['name']
40
38
 
41
39
  mailchimp_list = mailchimp_lists.find { |ml| ml.mailchimp_id == mailchimp_id } || new()
42
- mailchimp_list.assign_attributes(mailchimp_id: mailchimp_id, web_id: web_id, name: name)
40
+ mailchimp_list.assign_attributes(
41
+ mailchimp_id: mailchimp_id,
42
+
43
+ web_id: list['web_id'],
44
+ name: list['name'],
45
+ member_count: (list.dig('stats', 'member_count') || 0),
46
+ updated_at: Time.zone.now
47
+ )
48
+
49
+ mailchimp_list.assign_attributes(can_subscribe: true) if mailchimp_list.new_record?
43
50
  mailchimp_list.save!
44
51
  end
45
52
 
@@ -49,18 +56,37 @@ module Effective
49
56
  mailchimp_list.destroy! unless list.present?
50
57
  end
51
58
 
59
+ # Sync merge fields
60
+ if (merge_fields = EffectiveMailchimp.merge_fields).present?
61
+ merge_field_keys = merge_fields.keys.map(&:to_s)
62
+
63
+ mailchimp_lists.reject(&:destroyed?).each do |mailchimp_list|
64
+ existing = api.list_merge_fields(mailchimp_list).map { |hash| hash['tag'] }
65
+ (merge_field_keys - existing).each { |name| api.add_merge_field(mailchimp_list, name: name) }
66
+ end
67
+ end
68
+
52
69
  true
53
70
  end
54
71
 
55
- # This creates our local merge fields ON Mailchimp
56
- def create_mailchimp_merge_fields!(merge_fields)
57
- raise('expected a Hash of merge fields') unless merge_fields.kind_of?(Hash)
72
+ def subscribe_all_users!(now: false)
73
+ if now
74
+ subscribe_all!(EffectiveMailchimp.User.all)
75
+ else
76
+ EffectiveMailchimpSubscribeAllUsersJob.perform_later(self)
77
+ end
78
+ end
58
79
 
59
- merge_fields.keys.each do |name|
60
- EffectiveMailchimp.api.add_merge_field(mailchimp_id, name: name)
80
+ def subscribe_all_members!(now: false)
81
+ if now
82
+ subscribe_all!(EffectiveMailchimp.User.all.members)
83
+ else
84
+ EffectiveMailchimpSubscribeAllMembersJob.perform_later(self)
61
85
  end
86
+ end
62
87
 
63
- true
88
+ def to_s
89
+ name.presence || model_name.human
64
90
  end
65
91
 
66
92
  def merge_fields
@@ -68,8 +94,12 @@ module Effective
68
94
  EffectiveMailchimp.api.list_merge_fields(mailchimp_id).map { |hash| hash['tag'] }.sort
69
95
  end
70
96
 
71
- def url
72
- EffectiveMailchimp.api.admin_url + "/campaigns/#f_list:#{web_id}"
97
+ def grouped?
98
+ mailchimp_categories.present? && mailchimp_categories.any? { |category| category.mailchimp_interests.present? }
99
+ end
100
+
101
+ def ungrouped?
102
+ !grouped?
73
103
  end
74
104
 
75
105
  def members_url
@@ -80,20 +110,20 @@ module Effective
80
110
  EffectiveMailchimp.api.admin_url + "/lists/settings/merge-tags?id=#{web_id}"
81
111
  end
82
112
 
83
- def can_subscribe!
84
- update!(can_subscribe: true)
85
- end
86
-
87
- def cannot_subscribe!
88
- update!(can_subscribe: false)
89
- end
90
-
91
- def force_subscribe!
92
- update!(force_subscribe: true)
93
- end
113
+ private
114
+
115
+ def subscribe_all!(users)
116
+ users.find_each do |user|
117
+ begin
118
+ user.mailchimp_subscribe!(self, subscribed: true, now: true)
119
+ rescue => e
120
+ EffectiveLogger.error(e.message, associated: user) if defined?(EffectiveLogger)
121
+ ExceptionNotifier.notify_exception(e, data: { user_id: user.id, mailchimp_list_id: id }) if defined?(ExceptionNotifier)
122
+ raise(e) if Rails.env.test? || Rails.env.development?
123
+ end
124
+ end
94
125
 
95
- def unforce_subscribe!
96
- update!(force_subscribe: false)
126
+ true
97
127
  end
98
128
 
99
129
  end
@@ -14,6 +14,8 @@ module Effective
14
14
  email_address :string
15
15
  full_name :string
16
16
 
17
+ interests :text # Array of mailchimp_interest mailchimp_ids
18
+
17
19
  # We set this on our side to update mailchimp and subscribe the user
18
20
  subscribed :boolean
19
21
 
@@ -26,10 +28,17 @@ module Effective
26
28
  timestamps
27
29
  end
28
30
 
31
+ if EffectiveResources.serialize_with_coder?
32
+ serialize :interests, type: Array, coder: YAML
33
+ else
34
+ serialize :interests, Array
35
+ end
36
+
29
37
  validates :mailchimp_list_id, uniqueness: { scope: [:user_type, :user_id] }
30
38
 
31
39
  scope :deep, -> { includes(:mailchimp_list, :user) }
32
40
  scope :sorted, -> { order(:id) }
41
+ scope :subscribed, -> { where(subscribed: true) }
33
42
 
34
43
  def to_s
35
44
  mailchimp_list&.to_s || model_name.human
@@ -39,6 +48,37 @@ module Effective
39
48
  email_address.presence || user.email
40
49
  end
41
50
 
51
+ # Array of MailchimpInterest mailchimp_ids
52
+ def interests
53
+ Array(self[:interests]) - [nil, '']
54
+ end
55
+
56
+ # Array of MailchimpInterests
57
+ def mailchimp_interests
58
+ all_mailchimp_interests.select { |interest| interests.include?(interest.mailchimp_id) }
59
+ end
60
+
61
+ # We use this to add the force_subscribed interests
62
+ def build_interests(mailchimp_interest)
63
+ mailchimp_ids = Array(mailchimp_interest).map { |interest| interest.try(:mailchimp_id) || interest }
64
+ raise('expected an array of MailchimpInterests or mailchimp_ids') unless mailchimp_ids.all? { |id| id.kind_of?(String) && id.length > 1 }
65
+
66
+ assign_attributes(interests: interests | mailchimp_ids)
67
+ end
68
+
69
+ # {"25a38426c9" => false, "9b826db370" => true }
70
+ def interests_hash
71
+ all_mailchimp_interests.each_with_object({}) do |interest, hash|
72
+ hash[interest.mailchimp_id] = interests.include?(interest.mailchimp_id)
73
+ end
74
+ end
75
+
76
+ # From the mailchimp list
77
+ def all_mailchimp_interests
78
+ return [] if mailchimp_list.blank?
79
+ mailchimp_list.mailchimp_categories.flat_map(&:mailchimp_interests)
80
+ end
81
+
42
82
  def assign_mailchimp_attributes(atts)
43
83
  assign_attributes(
44
84
  mailchimp_id: atts['id'],
@@ -46,7 +86,8 @@ module Effective
46
86
  email_address: atts['email_address'],
47
87
  full_name: atts['full_name'],
48
88
  subscribed: (atts['status'] == 'subscribed'),
49
- last_synced_at: Time.zone.now
89
+ last_synced_at: Time.zone.now,
90
+ interests: Hash(atts['interests']).select { |_, subscribed| subscribed == true }.keys
50
91
  )
51
92
  end
52
93
 
@@ -0,0 +1,15 @@
1
+ - if EffectiveResources.authorized?(self, :admin, :mailchimp_sync)
2
+ %p= link_to 'Sync changes from Mailchimp', effective_mailchimp.mailchimp_sync_admin_mailchimp_index_path, 'data-method': :post, class: 'btn btn-primary'
3
+
4
+ %p.text-muted
5
+ %small
6
+ - mailchimp_last_synced_at = Effective::MailchimpList.maximum(:updated_at)
7
+
8
+ last synced with
9
+ = link_to 'Mailchimp', EffectiveMailchimp.api.admin_url, target: '_blank'
10
+
11
+ - if mailchimp_last_synced_at.present?
12
+ = time_ago_in_words(mailchimp_last_synced_at)
13
+ ago.
14
+ - else
15
+ never.
@@ -0,0 +1,79 @@
1
+ %h1.effective-admin-heading= @page_title
2
+
3
+ = card('Mailchimp Settings') do
4
+ - if EffectiveMailchimp.api_blank?
5
+ .alert.alert-danger You are not connected to Mailchimp. Please set your API key.
6
+
7
+ - if EffectiveMailchimp.api_present?
8
+ %p
9
+ = succeed('.') do
10
+ Please configure your
11
+ = link_to 'audiences', EffectiveMailchimp.api.audience_url, target: '_blank'
12
+ and
13
+ = link_to 'groups', EffectiveMailchimp.api.groups_url, target: '_blank'
14
+ on the Mailchimp website then sync the changes so they can be updated below
15
+
16
+ %p
17
+ You can also visit the
18
+ = link_to('contacts', EffectiveMailchimp.api.contacts_url, target: '_blank')
19
+ and
20
+ = link_to('campaigns', EffectiveMailchimp.api.campaigns_url, target: '_blank')
21
+ at anytime.
22
+
23
+ %p To change the names or display order of items below, please visit the Mailchimp website then sync changes.
24
+
25
+ = render('admin/mailchimp/sync')
26
+
27
+ %p.text-muted
28
+ %small This operation also creates the audience merge fields and updates the member and subscriber counts below.
29
+
30
+ = collapse('More settings') do
31
+ %p
32
+ For more information see
33
+ = succeed(',') do
34
+ = link_to(etsd(Effective::MailchimpList), effective_mailchimp.admin_mailchimp_lists_path, target: '_blank')
35
+ = succeed(',') do
36
+ = link_to(etsd(Effective::MailchimpListMember), effective_mailchimp.admin_mailchimp_list_members_path, target: '_blank')
37
+ = succeed(',') do
38
+ = link_to(etsd(Effective::MailchimpCategory), effective_mailchimp.admin_mailchimp_categories_path, target: '_blank')
39
+ and
40
+ = succeed('.') do
41
+ = link_to(etsd(Effective::MailchimpInterest), effective_mailchimp.admin_mailchimp_interests_path, target: '_blank')
42
+
43
+ %p The following merge fields are sent to Mailchimp when a user subscribes:
44
+
45
+ %ul
46
+ - EffectiveMailchimp.merge_fields.keys.sort.each do |key|
47
+ %li= key
48
+
49
+ .mb-4
50
+
51
+ = card(Effective::MailchimpList) do
52
+ %p
53
+ Audiences contain a list of your contacts.
54
+ View all #{link_to ets(Effective::MailchimpList), EffectiveMailchimp.api.audience_url, target: '_blank'}.
55
+
56
+ %p
57
+ %small
58
+ To change the name, please visit the Mailchimp website then sync changes.
59
+ Press the Edit button to change the Can Subscribe and Force Subscribe settings.
60
+
61
+ - datatable = Admin::EffectiveMailchimpListsDatatable.new
62
+ = render_datatable(datatable, inline: true, short: true, search: false, sort: false)
63
+
64
+ = card(Effective::MailchimpCategory) do
65
+ %p
66
+ The following groups are displayed to the user where they can opt-in to each interest.
67
+ View all #{link_to ets(Effective::MailchimpCategory), EffectiveMailchimp.api.groups_url, target: '_blank'}.
68
+
69
+ %p
70
+ %small
71
+ To change the name, please visit the Mailchimp website then sync changes.
72
+ Press the Edit button to change the Can Subscribe and Force Subscribe settings.
73
+ Sync changes to update the subscriber counts.
74
+
75
+ - Effective::MailchimpCategory.all.each do |mailchimp_category|
76
+ = card(mailchimp_category.to_s) do
77
+ - datatable = Admin::EffectiveMailchimpInterestsDatatable.new(mailchimp_category: mailchimp_category)
78
+ = render_datatable(datatable, inline: true, short: true, search: false, sort: false)
79
+
@@ -0,0 +1,10 @@
1
+ = effective_form_with(model: [:admin, mailchimp_interest], engine: true) do |f|
2
+ = f.static_field :name, label: EffectiveResources.et(mailchimp_interest)
3
+
4
+ = f.check_box :can_subscribe, label: "Yes, display this interest and allow them to subscribe"
5
+
6
+ = f.check_box :force_subscribe,
7
+ label: "Yes, force users to subscribe. Subscribe them automatically and do not allow unsubscribe from the website",
8
+ hint: "They can still unsubscribe from the email link to unsubscribe"
9
+
10
+ = effective_submit(f)
@@ -1,5 +1,6 @@
1
1
  = effective_form_with(model: [:admin, mailchimp_list], engine: true) do |f|
2
2
  = f.static_field :name, label: EffectiveResources.et(mailchimp_list)
3
+ = f.static_field :merge_fields
3
4
 
4
5
  = f.check_box :can_subscribe, label: "Yes, display users and allow them to subscribe"
5
6
 
@@ -1,13 +1,19 @@
1
- = card(ets(Effective::MailchimpList)) do
2
- %p.text-muted #{user} is subscribed to #{pluralize(user.mailchimp_subscribed_lists.count, et(Effective::MailchimpList))}.
1
+ = card('Mailchimp') do
2
+ %p.text-muted
3
+ = succeed('.') do
4
+ = user
5
+ is subscribed to
6
+ = pluralize(user.mailchimp_subscribed_lists.count, etd(Effective::MailchimpList))
7
+ and
8
+ = pluralize(user.mailchimp_subscribed_interests.count, etd(Effective::MailchimpInterest))
3
9
 
4
10
  %p.text-muted
5
11
  Please visit
6
- = link_to 'All ' + ets(Effective::MailchimpList), effective_mailchimp.admin_mailchimp_lists_path, target: '_blank'
12
+ = link_to 'Mailchimp Settings', effective_mailchimp.admin_mailchimp_path, target: '_blank'
7
13
  to configure which are displayed.
8
14
 
9
15
  %p
10
- %strong Subscribed
16
+ %strong Subscribed to the following
11
17
 
12
18
  = effective_form_with model: [:admin, user] do |f|
13
19
  = f.hidden_field :id
@@ -7,14 +7,41 @@
7
7
  = fmlm.hidden_field :id
8
8
  = fmlm.hidden_field :mailchimp_list_id
9
9
 
10
- - if mailchimp_list.force_subscribe?
11
- %p
12
- - if fmlm.object.cannot_be_subscribed?
13
- = fmlm.check_box :subscribed, label: fmlm.object.to_s, disabled: true, hint: 'required but unsubscribed', checked: false
10
+ - # With groups, probably single audience implementation
11
+ - if mailchimp_list.grouped?
12
+ = fmlm.hidden_field :subscribed, value: true
13
+
14
+ - # For each group / mailchimp_category
15
+ - mailchimp_list.mailchimp_categories.each do |mailchimp_category|
16
+ - mailchimp_interests = mailchimp_category.mailchimp_interests
17
+
18
+ - # Force subscription of each interest
19
+ - forced = mailchimp_interests.select { |mi| mi.force_subscribe? }
20
+ - fmlm.object.build_interests(forced)
21
+
22
+ - forced.each do |mailchimp_interest|
23
+ = fmlm.hidden_field :interests, name: "#{fmlm.object_name}[interests][]", value: mailchimp_interest.mailchimp_id
24
+
25
+ - # Add control for mailchimp interests
26
+ - mailchimp_interests_collection = mailchimp_list_member_interests_collection(mailchimp_interests)
27
+
28
+ - if mailchimp_category.display_type == 'select'
29
+ = fmlm.select :interests, mailchimp_interests_collection, label: mailchimp_category.to_s, name: "#{fmlm.object_name}[interests][]"
30
+ - elsif mailchimp_category.display_type == 'radio'
31
+ = fmlm.radios :interests, mailchimp_interests_collection, label: mailchimp_category.to_s, name: "#{fmlm.object_name}[interests][]"
14
32
  - else
15
- = fmlm.check_box :subscribed, label: fmlm.object.to_s, disabled: true, hint: 'required', checked: true
16
- = fmlm.hidden_field :subscribed, value: true
33
+ = fmlm.checks :interests, mailchimp_interests_collection, label: mailchimp_category.to_s, name: "#{fmlm.object_name}[interests][]"
34
+
35
+ - # No groups, multiple audiences implementation
36
+ - if mailchimp_list.ungrouped?
37
+ - if mailchimp_list.force_subscribe?
38
+ %p
39
+ - if fmlm.object.cannot_be_subscribed?
40
+ = fmlm.check_box :subscribed, label: fmlm.object.to_s, disabled: true, hint: 'required but unsubscribed', checked: false
41
+ - else
42
+ = fmlm.check_box :subscribed, label: fmlm.object.to_s, disabled: true, hint: 'required', checked: true
43
+ = fmlm.hidden_field :subscribed, value: true
17
44
 
18
- - elsif mailchimp_list.can_subscribe?
19
- %p
20
- = fmlm.check_box :subscribed, label: fmlm.object.to_s
45
+ - elsif mailchimp_list.can_subscribe?
46
+ %p
47
+ = fmlm.check_box :subscribed, label: fmlm.object.to_s
@@ -5,4 +5,10 @@ EffectiveMailchimp.setup do |config|
5
5
 
6
6
  # Mailchimp Settings
7
7
  config.api_key = '' # From mailchimp's /account/api/ screen
8
+
9
+ # In Sandbox Mode you can only READ from Mailchimp not actually write to it
10
+ config.sandbox_mode = false
11
+
12
+ # Assign the User class name. For use in determining all merge_fields
13
+ # config.user_class_name = 'User'
8
14
  end
@@ -0,0 +1,12 @@
1
+ en:
2
+ effective_mailchimp:
3
+ name: 'Effective Mailchimp'
4
+ acronym: 'Mailchimp'
5
+
6
+ activerecord:
7
+ models:
8
+ # These ones should stay effective
9
+ effective/mailchimp_list: 'Mailchimp Audience'
10
+ effective/mailchimp_list_member: 'Mailchimp Audience Member'
11
+ effective/mailchimp_category: 'Mailchimp Group'
12
+ effective/mailchimp_interest: 'Mailchimp Group Interest'
data/config/routes.rb CHANGED
@@ -14,18 +14,20 @@ EffectiveMailchimp::Engine.routes.draw do
14
14
 
15
15
  namespace :admin do
16
16
  resources :mailchimp_lists, only: [:index, :edit, :update] do
17
- post :can_subscribe, on: :member
18
- post :cannot_subscribe, on: :member
19
-
20
- post :force_subscribe, on: :member
21
- post :unforce_subscribe, on: :member
22
-
23
- get :mailchimp_sync, on: :collection
17
+ post :subscribe_all_users, on: :member
18
+ post :subscribe_all_members, on: :member
24
19
  end
25
20
 
21
+ resources :mailchimp_interests, only: [:index, :edit, :update]
22
+ resources :mailchimp_categories, only: :index
23
+ resources :mailchimp_list_members, only: :index
24
+
26
25
  resources :mailchimp, only: [] do
26
+ post :mailchimp_sync, on: :collection
27
27
  post :mailchimp_sync_user, on: :member
28
28
  end
29
+
30
+ get '/mailchimp', to: 'mailchimp#index', as: :mailchimp
29
31
  end
30
32
 
31
33
  end
@@ -5,6 +5,43 @@ class CreateEffectiveMailchimp < ActiveRecord::Migration[6.0]
5
5
  t.string :web_id
6
6
  t.string :name
7
7
 
8
+ t.integer :member_count
9
+
10
+ t.boolean :can_subscribe
11
+ t.boolean :force_subscribe
12
+
13
+ t.timestamps
14
+ end
15
+
16
+ create_table :mailchimp_categories do |t|
17
+ t.integer :mailchimp_list_id
18
+
19
+ t.string :mailchimp_id
20
+ t.string :list_id
21
+
22
+ t.string :name
23
+ t.string :list_name
24
+
25
+ t.string :display_type
26
+
27
+ t.timestamps
28
+ end
29
+
30
+ create_table :mailchimp_interests do |t|
31
+ t.integer :mailchimp_list_id
32
+ t.integer :mailchimp_category_id
33
+
34
+ t.string :mailchimp_id
35
+ t.string :list_id
36
+ t.string :category_id
37
+
38
+ t.string :name
39
+ t.string :list_name
40
+ t.string :category_name
41
+
42
+ t.integer :display_order
43
+ t.integer :subscriber_count
44
+
8
45
  t.boolean :can_subscribe
9
46
  t.boolean :force_subscribe
10
47
 
@@ -26,6 +63,8 @@ class CreateEffectiveMailchimp < ActiveRecord::Migration[6.0]
26
63
  t.boolean :subscribed, default: false
27
64
  t.boolean :cannot_be_subscribed, default: false
28
65
 
66
+ t.text :interests
67
+
29
68
  t.datetime :last_synced_at
30
69
 
31
70
  t.timestamps
@@ -1,3 +1,3 @@
1
1
  module EffectiveMailchimp
2
- VERSION = '0.6.0'.freeze
2
+ VERSION = '0.8.0'.freeze
3
3
  end
@@ -7,9 +7,9 @@ module EffectiveMailchimp
7
7
 
8
8
  def self.config_keys
9
9
  [
10
- :mailchimp_lists_table_name, :mailchimp_list_members_table_name,
10
+ :mailchimp_lists_table_name, :mailchimp_list_members_table_name, :mailchimp_categories_table_name, :mailchimp_interests_table_name,
11
11
  :layout,
12
- :api_key
12
+ :api_key, :sandbox_mode, :user_class_name
13
13
  ]
14
14
  end
15
15
 
@@ -19,12 +19,37 @@ module EffectiveMailchimp
19
19
  Effective::MailchimpApi.new(api_key: api_key)
20
20
  end
21
21
 
22
+ def self.sandbox_mode?
23
+ !!sandbox_mode
24
+ end
25
+
22
26
  def self.api_present?
23
27
  api_key.present?
24
28
  end
25
29
 
30
+ def self.api_blank?
31
+ api_key.blank?
32
+ end
33
+
34
+ def self.User
35
+ klass = user_class_name.constantize if user_class_name.present?
36
+ klass ||= Tenant.User if defined?(Tenant)
37
+ klass ||= '::User'.safe_constantize
38
+
39
+ raise('unable to determine User klass. Please set config.user_class_name') unless klass.kind_of?(Class)
40
+ raise('expecting an effective_mailchimp_user User class') unless klass.respond_to?(:effective_mailchimp_user)
41
+
42
+ klass
43
+ end
44
+
45
+ def self.merge_fields
46
+ merge_fields = self.User().new.mailchimp_merge_fields
47
+ raise('expected a Hash of merge fields') unless merge_fields.kind_of?(Hash)
48
+ merge_fields
49
+ end
50
+
26
51
  def self.permitted_params
27
- [ :mailchimp_user_form_action, mailchimp_list_members_attributes: [:id, :mailchimp_list_id, :subscribed] ]
52
+ [ :mailchimp_user_form_action, mailchimp_list_members_attributes: [:id, :mailchimp_list_id, :subscribed, interests: []] ]
28
53
  end
29
54
 
30
55
  end
@@ -5,20 +5,4 @@ namespace :effective_mailchimp do
5
5
  load "#{__dir__}/../../db/seeds.rb"
6
6
  end
7
7
 
8
- # bundle exec rake effective_mailchimp:create_mailchimp_merge_fields
9
- task create_mailchimp_merge_fields: :environment do
10
- merge_fields = User.new.mailchimp_merge_fields()
11
-
12
- Effective::MailchimpList.sync!
13
-
14
- collection = Effective::MailchimpList.all
15
-
16
- collection.find_each do |list|
17
- puts "Creating #{list} merge fields"
18
- list.create_mailchimp_merge_fields!(merge_fields)
19
- end
20
-
21
- puts 'All done'
22
- end
23
-
24
8
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: effective_mailchimp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Code and Effect
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-07-05 00:00:00.000000000 Z
11
+ date: 2024-07-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -193,23 +193,36 @@ files:
193
193
  - app/assets/javascripts/effective_mailchimp/base.js
194
194
  - app/assets/stylesheets/effective_mailchimp.scss
195
195
  - app/assets/stylesheets/effective_mailchimp/base.scss
196
+ - app/controllers/admin/mailchimp_categories_controller.rb
196
197
  - app/controllers/admin/mailchimp_controller.rb
198
+ - app/controllers/admin/mailchimp_interests_controller.rb
199
+ - app/controllers/admin/mailchimp_list_members_controller.rb
197
200
  - app/controllers/admin/mailchimp_lists_controller.rb
198
201
  - app/controllers/effective/mailchimp_controller.rb
202
+ - app/datatables/admin/effective_mailchimp_categories_datatable.rb
203
+ - app/datatables/admin/effective_mailchimp_interests_datatable.rb
204
+ - app/datatables/admin/effective_mailchimp_list_members_datatable.rb
199
205
  - app/datatables/admin/effective_mailchimp_lists_datatable.rb
200
206
  - app/helpers/effective_mailchimp_helper.rb
207
+ - app/jobs/effective_mailchimp_subscribe_all_members_job.rb
208
+ - app/jobs/effective_mailchimp_subscribe_all_users_job.rb
201
209
  - app/jobs/effective_mailchimp_update_job.rb
202
210
  - app/models/concerns/effective_mailchimp_user.rb
203
211
  - app/models/effective/mailchimp_api.rb
212
+ - app/models/effective/mailchimp_category.rb
213
+ - app/models/effective/mailchimp_interest.rb
204
214
  - app/models/effective/mailchimp_list.rb
205
215
  - app/models/effective/mailchimp_list_member.rb
216
+ - app/views/admin/mailchimp/_sync.html.haml
217
+ - app/views/admin/mailchimp/index.html.haml
218
+ - app/views/admin/mailchimp_interests/_form.html.haml
206
219
  - app/views/admin/mailchimp_lists/_form.html.haml
207
- - app/views/admin/mailchimp_lists/index.html.haml
208
220
  - app/views/admin/mailchimp_user/_form.html.haml
209
221
  - app/views/admin/mailchimp_user/_sync.html.haml
210
222
  - app/views/effective/mailchimp_user/_fields.html.haml
211
223
  - app/views/effective/mailchimp_user/_sync.html.haml
212
224
  - config/effective_mailchimp.rb
225
+ - config/locales/effective_mailchimp.en.yml
213
226
  - config/routes.rb
214
227
  - db/migrate/101_create_effective_mailchimp.rb
215
228
  - db/seeds.rb
@@ -1,20 +0,0 @@
1
- %h1.effective-admin-heading= @page_title
2
-
3
- - resource = (@_effective_resource || Effective::Resource.new(controller_path))
4
-
5
- .resource-buttons
6
- = render_resource_buttons(resource.klass, (action ||= :index) => false)
7
-
8
- = card do
9
- = collapse('Show merge field settings') do
10
- %p The following Merge fields are sent to Mailchimp when a user subscribes:
11
-
12
- %ul
13
- - current_user.mailchimp_merge_fields.keys.each do |key|
14
- %li= key
15
-
16
- %p To have these fields displayed in Mailchimp, please configure each campaign with any of these merge fields.
17
-
18
- .mb-4
19
-
20
- = render_datatable @datatable