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.
- checksums.yaml +4 -4
- data/app/controllers/admin/mailchimp_categories_controller.rb +15 -0
- data/app/controllers/admin/mailchimp_controller.rb +23 -0
- data/app/controllers/admin/mailchimp_interests_controller.rb +15 -0
- data/app/controllers/admin/mailchimp_list_members_controller.rb +15 -0
- data/app/controllers/admin/mailchimp_lists_controller.rb +0 -10
- data/app/datatables/admin/effective_mailchimp_categories_datatable.rb +32 -0
- data/app/datatables/admin/effective_mailchimp_interests_datatable.rb +47 -0
- data/app/datatables/admin/effective_mailchimp_list_members_datatable.rb +39 -0
- data/app/datatables/admin/effective_mailchimp_lists_datatable.rb +9 -3
- data/app/helpers/effective_mailchimp_helper.rb +10 -0
- data/app/jobs/effective_mailchimp_subscribe_all_members_job.rb +8 -0
- data/app/jobs/effective_mailchimp_subscribe_all_users_job.rb +8 -0
- data/app/models/concerns/effective_mailchimp_user.rb +15 -10
- data/app/models/effective/mailchimp_api.rb +70 -18
- data/app/models/effective/mailchimp_category.rb +74 -0
- data/app/models/effective/mailchimp_interest.rb +93 -0
- data/app/models/effective/mailchimp_list.rb +62 -32
- data/app/models/effective/mailchimp_list_member.rb +42 -1
- data/app/views/admin/mailchimp/_sync.html.haml +15 -0
- data/app/views/admin/mailchimp/index.html.haml +79 -0
- data/app/views/admin/mailchimp_interests/_form.html.haml +10 -0
- data/app/views/admin/mailchimp_lists/_form.html.haml +1 -0
- data/app/views/admin/mailchimp_user/_form.html.haml +10 -4
- data/app/views/effective/mailchimp_user/_fields.html.haml +36 -9
- data/config/effective_mailchimp.rb +6 -0
- data/config/locales/effective_mailchimp.en.yml +12 -0
- data/config/routes.rb +9 -7
- data/db/migrate/101_create_effective_mailchimp.rb +39 -0
- data/lib/effective_mailchimp/version.rb +1 -1
- data/lib/effective_mailchimp.rb +28 -3
- data/lib/tasks/effective_mailchimp_tasks.rake +0 -16
- metadata +16 -3
- data/app/views/admin/mailchimp_lists/index.html.haml +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 56caa6a3804ed54f997cb2a732022cb077c37ec186f2a42476b2433b59f80bab
|
4
|
+
data.tar.gz: 51a5b095d91881d957c227c6f13155d78d3a9178aa3703982cf2fd4b8d92cd37
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 246b57c7659cbb154db572309d4a886132cef6cdf9d1bd09e4cafd37fd15dfc2d109375a2c179173bf710c478fb71306b1dc69a0c57587a6d66c4286edf6b446
|
7
|
+
data.tar.gz: 578e421f5e538bc705fcc0a4ab8290cd0adc4fae51388ddf941f934bbd4ea2c069eb13530d96c789ed4c8110d2e4ca5960a8274a1ae154e58cc30971a8722f3f
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Admin
|
2
|
+
class MailchimpCategoriesController < ApplicationController
|
3
|
+
before_action(:authenticate_user!) if defined?(Devise)
|
4
|
+
before_action { EffectiveResources.authorize!(self, :admin, :effective_mailchimp) }
|
5
|
+
|
6
|
+
include Effective::CrudController
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def permitted_params
|
11
|
+
params.require(:effective_mailchimp_category).permit!
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
@@ -3,6 +3,29 @@ module Admin
|
|
3
3
|
before_action(:authenticate_user!) if defined?(Devise)
|
4
4
|
before_action { EffectiveResources.authorize!(self, :admin, :effective_mailchimp) }
|
5
5
|
|
6
|
+
include Effective::CrudController
|
7
|
+
|
8
|
+
page_title 'Mailchimp'
|
9
|
+
|
10
|
+
# /admin/mailchimp
|
11
|
+
def index
|
12
|
+
end
|
13
|
+
|
14
|
+
# Sync All
|
15
|
+
def mailchimp_sync
|
16
|
+
EffectiveResources.authorize!(self, :admin, :mailchimp_sync)
|
17
|
+
|
18
|
+
api = EffectiveMailchimp.api
|
19
|
+
Effective::MailchimpList.sync!(api: api)
|
20
|
+
Effective::MailchimpCategory.sync!(api: api)
|
21
|
+
Effective::MailchimpInterest.sync!(api: api)
|
22
|
+
|
23
|
+
flash[:success] = "Successfully synced mailchimp data"
|
24
|
+
|
25
|
+
redirect_back(fallback_location: effective_mailchimp.admin_mailchimp_path)
|
26
|
+
end
|
27
|
+
|
28
|
+
# Sync one user
|
6
29
|
def mailchimp_sync_user
|
7
30
|
resource = current_user.class.find(params[:id])
|
8
31
|
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Admin
|
2
|
+
class MailchimpInterestsController < ApplicationController
|
3
|
+
before_action(:authenticate_user!) if defined?(Devise)
|
4
|
+
before_action { EffectiveResources.authorize!(self, :admin, :effective_mailchimp) }
|
5
|
+
|
6
|
+
include Effective::CrudController
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def permitted_params
|
11
|
+
params.require(:effective_mailchimp_interest).permit!
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Admin
|
2
|
+
class MailchimpListMembersController < ApplicationController
|
3
|
+
before_action(:authenticate_user!) if defined?(Devise)
|
4
|
+
before_action { EffectiveResources.authorize!(self, :admin, :effective_mailchimp) }
|
5
|
+
|
6
|
+
include Effective::CrudController
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def permitted_params
|
11
|
+
params.require(:effective_mailchimp_list_member).permit!
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
@@ -5,16 +5,6 @@ module Admin
|
|
5
5
|
|
6
6
|
include Effective::CrudController
|
7
7
|
|
8
|
-
def mailchimp_sync
|
9
|
-
EffectiveResources.authorize!(self, :mailchimp_sync, Effective::MailchimpList)
|
10
|
-
|
11
|
-
Effective::MailchimpList.sync!
|
12
|
-
|
13
|
-
flash[:success] = "Successfully synced mailchimp lists"
|
14
|
-
|
15
|
-
redirect_back(fallback_location: effective_mailchimp.admin_mailchimp_lists_path)
|
16
|
-
end
|
17
|
-
|
18
8
|
private
|
19
9
|
|
20
10
|
def permitted_params
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Admin
|
2
|
+
class EffectiveMailchimpCategoriesDatatable < Effective::Datatable
|
3
|
+
|
4
|
+
datatable do
|
5
|
+
length :all
|
6
|
+
|
7
|
+
order :name
|
8
|
+
|
9
|
+
col :updated_at, visible: false
|
10
|
+
col :created_at, visible: false
|
11
|
+
col :id, visible: false
|
12
|
+
|
13
|
+
col :mailchimp_list
|
14
|
+
|
15
|
+
col :list_id, visible: false
|
16
|
+
col :mailchimp_id, visible: false
|
17
|
+
|
18
|
+
col :name
|
19
|
+
col :list_name, visible: false
|
20
|
+
|
21
|
+
col :display_type
|
22
|
+
|
23
|
+
col :mailchimp_interests
|
24
|
+
|
25
|
+
actions_col
|
26
|
+
end
|
27
|
+
|
28
|
+
collection do
|
29
|
+
Effective::MailchimpCategory.deep.all
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Admin
|
2
|
+
class EffectiveMailchimpInterestsDatatable < Effective::Datatable
|
3
|
+
filters do
|
4
|
+
scope :all
|
5
|
+
scope :subscribable
|
6
|
+
end
|
7
|
+
|
8
|
+
datatable do
|
9
|
+
length :all
|
10
|
+
order :display_order
|
11
|
+
|
12
|
+
col :updated_at, visible: false
|
13
|
+
col :created_at, visible: false
|
14
|
+
col :id, visible: false
|
15
|
+
|
16
|
+
col :mailchimp_list
|
17
|
+
col :mailchimp_category
|
18
|
+
|
19
|
+
col :list_id, visible: false
|
20
|
+
col :category_id, visible: false
|
21
|
+
col :mailchimp_id, visible: false
|
22
|
+
|
23
|
+
col :name
|
24
|
+
col :can_subscribe
|
25
|
+
col :force_subscribe
|
26
|
+
|
27
|
+
col :list_name, visible: false
|
28
|
+
col :category_name, visible: false
|
29
|
+
col :display_order, visible: false
|
30
|
+
|
31
|
+
col :subscriber_count
|
32
|
+
|
33
|
+
actions_col
|
34
|
+
end
|
35
|
+
|
36
|
+
collection do
|
37
|
+
scope = Effective::MailchimpInterest.deep
|
38
|
+
|
39
|
+
if attributes[:mailchimp_category_id].present?
|
40
|
+
scope = scope.sorted
|
41
|
+
end
|
42
|
+
|
43
|
+
scope
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Admin
|
2
|
+
class EffectiveMailchimpListMembersDatatable < Effective::Datatable
|
3
|
+
filters do
|
4
|
+
scope :all
|
5
|
+
scope :subscribed
|
6
|
+
end
|
7
|
+
|
8
|
+
datatable do
|
9
|
+
order :updated_at
|
10
|
+
|
11
|
+
col :updated_at, visible: false
|
12
|
+
col :created_at, visible: false
|
13
|
+
col :id, visible: false
|
14
|
+
|
15
|
+
col :mailchimp_list
|
16
|
+
col :user
|
17
|
+
|
18
|
+
col :mailchimp_id, visible: false
|
19
|
+
col :web_id, visible: false
|
20
|
+
|
21
|
+
col :email_address
|
22
|
+
col :full_name
|
23
|
+
col :subscribed
|
24
|
+
|
25
|
+
col :interests, visible: false
|
26
|
+
col :mailchimp_interests, search: { collection: Effective::MailchimpInterest.order(:name), fuzzy: true }
|
27
|
+
|
28
|
+
col :last_synced_at
|
29
|
+
|
30
|
+
actions_col do |member|
|
31
|
+
dropdown_link_to('Edit', "/admin/users/#{member.user.to_param}/edit#tab-mailchimp", 'data-turbolinks': false)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
collection do
|
36
|
+
Effective::MailchimpListMember.deep.all
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -6,7 +6,8 @@ module Admin
|
|
6
6
|
end
|
7
7
|
|
8
8
|
datatable do
|
9
|
-
|
9
|
+
length :all
|
10
|
+
order :name
|
10
11
|
|
11
12
|
col :updated_at, visible: false
|
12
13
|
col :created_at, visible: false
|
@@ -21,13 +22,18 @@ module Admin
|
|
21
22
|
|
22
23
|
col :url, label: 'Mailchimp' do |ml|
|
23
24
|
[
|
24
|
-
link_to('View Campaign', ml.url, target: '_blank'),
|
25
25
|
link_to('View Members', ml.members_url, target: '_blank'),
|
26
26
|
link_to('View Merge Fields', ml.merge_fields_url, target: '_blank')
|
27
27
|
].join('<br>').html_safe
|
28
28
|
end
|
29
29
|
|
30
|
-
col :merge_fields
|
30
|
+
col :merge_fields, visible: false do |ml|
|
31
|
+
ml.merge_fields.join(', ')
|
32
|
+
end
|
33
|
+
|
34
|
+
col :member_count do |list|
|
35
|
+
list.member_count.to_i
|
36
|
+
end
|
31
37
|
|
32
38
|
actions_col
|
33
39
|
end
|
@@ -1,2 +1,12 @@
|
|
1
1
|
module EffectiveMailchimpHelper
|
2
|
+
|
3
|
+
def mailchimp_list_member_interests_collection(mailchimp_interests)
|
4
|
+
interests = mailchimp_interests.select { |interest| interest.can_subscribe? || interest.force_subscribe? }
|
5
|
+
|
6
|
+
interests.map do |interest|
|
7
|
+
label = (interest.force_subscribe? ? (interest.to_s + ' ' + content_tag(:small, 'required', class: 'text-hint')) : interest.to_s).html_safe
|
8
|
+
[label, interest.mailchimp_id, disabled: (interest.force_subscribe || !interest.can_subscribe?)]
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
2
12
|
end
|
@@ -35,7 +35,7 @@ module EffectiveMailchimpUser
|
|
35
35
|
|
36
36
|
# The user updated the form
|
37
37
|
after_commit(if: -> { mailchimp_member_update_required? }) do
|
38
|
-
EffectiveMailchimpUpdateJob.perform_later(self)
|
38
|
+
EffectiveMailchimpUpdateJob.perform_later(self) # This calls user.mailchimp_update! on the background
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
@@ -59,12 +59,13 @@ module EffectiveMailchimpUser
|
|
59
59
|
member.assign_attributes(subscribed: subscribed)
|
60
60
|
end
|
61
61
|
|
62
|
-
# This sets up the after_commit to run the mailchimp_update! job
|
63
|
-
assign_attributes(mailchimp_user_form_action: true)
|
64
|
-
|
65
62
|
# For use in a rake task. Run the update right now
|
66
|
-
|
63
|
+
if now
|
64
|
+
return mailchimp_update!(only: mailchimp_lists)
|
65
|
+
end
|
67
66
|
|
67
|
+
# This sets up the after_commit to run the mailchimp_update! job
|
68
|
+
assign_attributes(mailchimp_user_form_action: true)
|
68
69
|
save!
|
69
70
|
end
|
70
71
|
|
@@ -140,6 +141,10 @@ module EffectiveMailchimpUser
|
|
140
141
|
mailchimp_list_members.select(&:subscribed?).map(&:mailchimp_list)
|
141
142
|
end
|
142
143
|
|
144
|
+
def mailchimp_subscribed_interests
|
145
|
+
mailchimp_list_members.select(&:subscribed?).flat_map(&:interests)
|
146
|
+
end
|
147
|
+
|
143
148
|
def mailchimp_list_member(mailchimp_list:)
|
144
149
|
raise('expected a MailchimpList') unless mailchimp_list.kind_of?(Effective::MailchimpList)
|
145
150
|
mailchimp_list_members.find { |mlm| mlm.mailchimp_list_id == mailchimp_list.id }
|
@@ -169,8 +174,7 @@ module EffectiveMailchimpUser
|
|
169
174
|
# Pulls the current status from Mailchimp API into the Mailchimp List Member objects
|
170
175
|
# Run before the mailchimp fields are displayed
|
171
176
|
# Only run in the background when a user or admin clicks sync now
|
172
|
-
def mailchimp_sync!
|
173
|
-
api = EffectiveMailchimp.api
|
177
|
+
def mailchimp_sync!(api: EffectiveMailchimp.api)
|
174
178
|
lists = Effective::MailchimpList.subscribable.sorted.to_a
|
175
179
|
|
176
180
|
assign_attributes(mailchimp_user_form_action: nil)
|
@@ -194,12 +198,13 @@ module EffectiveMailchimpUser
|
|
194
198
|
|
195
199
|
# Pushes the current Mailchimp List Member objects to Mailchimp when needed
|
196
200
|
# Called in the background after a form submission that changes the user email/last_name/first_name or mailchimp subscriptions
|
197
|
-
def mailchimp_update!
|
198
|
-
api = EffectiveMailchimp.api
|
199
|
-
|
201
|
+
def mailchimp_update!(api: EffectiveMailchimp.api, only: [], except: [])
|
200
202
|
assign_attributes(mailchimp_user_form_action: nil)
|
201
203
|
|
202
204
|
mailchimp_list_members.each do |member|
|
205
|
+
next if only.present? && Array(only).exclude?(member.mailchimp_list)
|
206
|
+
next if except.present? && Array(except).include?(member.mailchimp_list)
|
207
|
+
|
203
208
|
begin
|
204
209
|
list_member = if member.mailchimp_id.blank? && member.subscribed?
|
205
210
|
api.list_member_add(member)
|
@@ -25,10 +25,30 @@ module Effective
|
|
25
25
|
Rails.env.development?
|
26
26
|
end
|
27
27
|
|
28
|
+
def sandbox_mode?
|
29
|
+
EffectiveMailchimp.sandbox_mode?
|
30
|
+
end
|
31
|
+
|
28
32
|
def admin_url
|
29
33
|
"https://#{server}.admin.mailchimp.com"
|
30
34
|
end
|
31
35
|
|
36
|
+
def audience_url
|
37
|
+
"https://#{server}.admin.mailchimp.com/audience/"
|
38
|
+
end
|
39
|
+
|
40
|
+
def groups_url
|
41
|
+
"https://#{server}.admin.mailchimp.com/lists/dashboard/groups/"
|
42
|
+
end
|
43
|
+
|
44
|
+
def contacts_url
|
45
|
+
"https://#{server}.admin.mailchimp.com/audience/contacts"
|
46
|
+
end
|
47
|
+
|
48
|
+
def campaigns_url
|
49
|
+
"https://#{server}.admin.mailchimp.com/campaigns/"
|
50
|
+
end
|
51
|
+
|
32
52
|
def public_url
|
33
53
|
"https://mailchimp.com"
|
34
54
|
end
|
@@ -40,21 +60,37 @@ module Effective
|
|
40
60
|
# Returns an Array of Lists, which are each Hash
|
41
61
|
# Like this [{ ...}, { ... }]
|
42
62
|
def lists
|
43
|
-
Rails.logger.info "[effective_mailchimp] Index Lists
|
63
|
+
Rails.logger.info "[effective_mailchimp] Index Lists" if debug?
|
44
64
|
|
45
65
|
response = client.lists.get_all_lists(count: 250)
|
46
66
|
Array(response['lists']) - [nil, '', {}]
|
47
67
|
end
|
48
68
|
|
49
69
|
def list(id)
|
50
|
-
Rails.logger.info "[effective_mailchimp]
|
70
|
+
Rails.logger.info "[effective_mailchimp] Get List" if debug?
|
51
71
|
|
52
72
|
client.lists.get_list(id.try(:mailchimp_id) || id)
|
53
73
|
end
|
54
74
|
|
75
|
+
def categories(list_id)
|
76
|
+
Rails.logger.info "[effective_mailchimp] Index Interest Categories" if debug?
|
77
|
+
|
78
|
+
response = client.lists.get_list_interest_categories(list_id.try(:mailchimp_id) || list_id)
|
79
|
+
Array(response['categories']) - [nil, '', {}]
|
80
|
+
end
|
81
|
+
|
82
|
+
def interests(list_id, category_id)
|
83
|
+
Rails.logger.info "[effective_mailchimp] Index Interest Category Interests" if debug?
|
84
|
+
|
85
|
+
response = client.lists.list_interest_category_interests(list_id, category_id)
|
86
|
+
Array(response['interests']) - [nil, '', {}]
|
87
|
+
end
|
88
|
+
|
55
89
|
def list_member(id, email)
|
56
90
|
raise('expected an email') unless email.to_s.include?('@')
|
57
91
|
|
92
|
+
Rails.logger.info "[effective_mailchimp] Get List Member" if debug?
|
93
|
+
|
58
94
|
begin
|
59
95
|
client.lists.get_list_member(id.try(:mailchimp_id) || id, email)
|
60
96
|
rescue MailchimpMarketing::ApiError => e
|
@@ -63,18 +99,24 @@ module Effective
|
|
63
99
|
end
|
64
100
|
|
65
101
|
def list_merge_fields(id)
|
66
|
-
|
67
|
-
|
102
|
+
Rails.logger.info "[effective_mailchimp] Get List Merge Fields" if debug?
|
103
|
+
|
104
|
+
response = client.lists.get_list_merge_fields(id.try(:mailchimp_id) || id, count: 100)
|
105
|
+
Array(response['merge_fields']) - [nil, '', ' ', {}]
|
68
106
|
end
|
69
107
|
|
70
108
|
def add_merge_field(id, name:, type: :text)
|
71
109
|
raise("invalid mailchimp merge key: #{name}. Must be 10 or fewer characters") if name.to_s.length > 10
|
72
110
|
|
111
|
+
return if sandbox_mode?
|
112
|
+
Rails.logger.info "[effective_mailchimp] Add List Merge Field #{name}" if debug?
|
113
|
+
|
73
114
|
payload = { name: name.to_s.titleize, tag: name.to_s, type: type }
|
74
115
|
|
75
116
|
begin
|
76
|
-
client.lists.add_list_merge_field(id, payload)
|
117
|
+
client.lists.add_list_merge_field(id.try(:mailchimp_id) || id, payload)
|
77
118
|
rescue MailchimpMarketing::ApiError => e
|
119
|
+
EffectiveLogger.error(e.message, details: name.to_s) if defined?(EffectiveLogger)
|
78
120
|
false
|
79
121
|
end
|
80
122
|
end
|
@@ -82,34 +124,44 @@ module Effective
|
|
82
124
|
def list_member_add(member)
|
83
125
|
raise('expected an Effective::MailchimpListMember') unless member.kind_of?(Effective::MailchimpListMember)
|
84
126
|
|
85
|
-
|
86
|
-
|
127
|
+
return if sandbox_mode?
|
128
|
+
Rails.logger.info "[effective_mailchimp] Add List Member" if debug?
|
87
129
|
|
88
|
-
|
89
|
-
|
130
|
+
# See if they exist somehow
|
131
|
+
existing = list_member(member.mailchimp_list, member.user.email)
|
90
132
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
}
|
133
|
+
if existing.present?
|
134
|
+
member.assign_attributes(mailchimp_id: existing['id'])
|
135
|
+
return list_member_update(member)
|
136
|
+
end
|
96
137
|
|
138
|
+
# Actually add
|
139
|
+
payload = list_member_payload(member)
|
97
140
|
client.lists.add_list_member(member.mailchimp_list.mailchimp_id, payload)
|
98
141
|
end
|
99
142
|
|
100
143
|
def list_member_update(member)
|
101
144
|
raise('expected an Effective::MailchimpListMember') unless member.kind_of?(Effective::MailchimpListMember)
|
102
145
|
|
146
|
+
return if sandbox_mode?
|
147
|
+
Rails.logger.info "[effective_mailchimp] Update List Member" if debug?
|
148
|
+
|
149
|
+
payload = list_member_payload(member)
|
150
|
+
client.lists.update_list_member(member.mailchimp_list.mailchimp_id, member.email, payload)
|
151
|
+
end
|
152
|
+
|
153
|
+
def list_member_payload(member)
|
154
|
+
raise('expected an Effective::MailchimpListMember') unless member.kind_of?(Effective::MailchimpListMember)
|
155
|
+
|
103
156
|
merge_fields = member.user.mailchimp_merge_fields
|
104
157
|
raise('expected user mailchimp_merge_fields to be a Hash') unless merge_fields.kind_of?(Hash)
|
105
158
|
|
106
159
|
payload = {
|
107
160
|
email_address: member.user.email,
|
108
161
|
status: (member.subscribed ? 'subscribed' : 'unsubscribed'),
|
109
|
-
merge_fields: merge_fields.delete_if { |k, v| v.blank? }
|
110
|
-
|
111
|
-
|
112
|
-
client.lists.update_list_member(member.mailchimp_list.mailchimp_id, member.email, payload)
|
162
|
+
merge_fields: merge_fields.delete_if { |k, v| v.blank? },
|
163
|
+
interests: member.interests_hash.presence
|
164
|
+
}.compact
|
113
165
|
end
|
114
166
|
|
115
167
|
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module Effective
|
2
|
+
class MailchimpCategory < ActiveRecord::Base
|
3
|
+
self.table_name = (EffectiveMailchimp.mailchimp_categories_table_name || :mailchimp_categories).to_s
|
4
|
+
|
5
|
+
belongs_to :mailchimp_list
|
6
|
+
has_many :mailchimp_interests
|
7
|
+
|
8
|
+
effective_resource do
|
9
|
+
mailchimp_id :string # ID of this Mailchimp InterestCategory
|
10
|
+
list_id :string # Mailchimp list ID
|
11
|
+
|
12
|
+
name :string # Title
|
13
|
+
list_name :string
|
14
|
+
|
15
|
+
display_type :string # Type
|
16
|
+
|
17
|
+
timestamps
|
18
|
+
end
|
19
|
+
|
20
|
+
validates :mailchimp_id, presence: true
|
21
|
+
validates :list_id, presence: true
|
22
|
+
validates :name, presence: true
|
23
|
+
|
24
|
+
scope :deep, -> { all }
|
25
|
+
scope :sorted, -> { order(:name) }
|
26
|
+
scope :subscribable, -> { all }
|
27
|
+
|
28
|
+
# Reads all the InterestCategories from Mailchimp and creates local MailchimpCategory records
|
29
|
+
# This is part of the Sync changes from Mailchimp button
|
30
|
+
def self.sync!(api: EffectiveMailchimp.api)
|
31
|
+
# For every mailchimp_list, get all the categories
|
32
|
+
mailchimp_lists = Effective::MailchimpList.all
|
33
|
+
|
34
|
+
mailchimp_lists.each do |mailchimp_list|
|
35
|
+
# All the Groups from Mailchimp
|
36
|
+
categories = api.categories(mailchimp_list.mailchimp_id)
|
37
|
+
|
38
|
+
# Get all our existing Effective::MailchimpCategory records
|
39
|
+
mailchimp_categories = where(mailchimp_list: mailchimp_list)
|
40
|
+
|
41
|
+
# Find or create Effective::MailchimpGroups based on existing groups
|
42
|
+
categories.each do |category|
|
43
|
+
mailchimp_id = category['id']
|
44
|
+
mailchimp_category = mailchimp_categories.find { |mc| mc.mailchimp_id == mailchimp_id } || new()
|
45
|
+
|
46
|
+
mailchimp_category.assign_attributes(
|
47
|
+
mailchimp_list: mailchimp_list,
|
48
|
+
|
49
|
+
mailchimp_id: mailchimp_id,
|
50
|
+
list_id: category['list_id'],
|
51
|
+
list_name: mailchimp_list.name,
|
52
|
+
name: (category['title'] || category['name']),
|
53
|
+
display_type: category['type']
|
54
|
+
)
|
55
|
+
|
56
|
+
mailchimp_category.save!
|
57
|
+
end
|
58
|
+
|
59
|
+
# Destroy any Effective::MailchimpGroups resources if they no longer returned by groups
|
60
|
+
mailchimp_categories.each do |mailchimp_category|
|
61
|
+
category = categories.find { |category| category['id'] == mailchimp_category.mailchimp_id }
|
62
|
+
mailchimp_category.destroy! unless category.present?
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
true
|
67
|
+
end
|
68
|
+
|
69
|
+
def to_s
|
70
|
+
name.presence || model_name.human
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
module Effective
|
2
|
+
class MailchimpInterest < ActiveRecord::Base
|
3
|
+
self.table_name = (EffectiveMailchimp.mailchimp_interests_table_name || :mailchimp_interests).to_s
|
4
|
+
|
5
|
+
belongs_to :mailchimp_list
|
6
|
+
belongs_to :mailchimp_category
|
7
|
+
|
8
|
+
effective_resource do
|
9
|
+
mailchimp_id :string # ID of this interest on Mailchimp
|
10
|
+
|
11
|
+
list_id :string # Mailchimp list ID
|
12
|
+
category_id :string # Interest Category
|
13
|
+
|
14
|
+
name :string
|
15
|
+
list_name :string
|
16
|
+
category_name :string
|
17
|
+
|
18
|
+
subscriber_count :integer
|
19
|
+
display_order :integer
|
20
|
+
|
21
|
+
can_subscribe :boolean
|
22
|
+
force_subscribe :boolean
|
23
|
+
|
24
|
+
timestamps
|
25
|
+
end
|
26
|
+
|
27
|
+
validates :mailchimp_id, presence: true
|
28
|
+
validates :list_id, presence: true
|
29
|
+
validates :category_id, presence: true
|
30
|
+
validates :name, presence: true
|
31
|
+
|
32
|
+
scope :deep, -> { all }
|
33
|
+
scope :sorted, -> { order(:display_order) }
|
34
|
+
scope :subscribable, -> { where(can_subscribe: true) }
|
35
|
+
|
36
|
+
# Reads all the InterestCategoriesInterests from Mailchimp and creates local MailchimpInterest records
|
37
|
+
# This is part of the Sync changes from Mailchimp button
|
38
|
+
def self.sync!(api: EffectiveMailchimp.api)
|
39
|
+
# For every mailchimp_list, get all the interests
|
40
|
+
mailchimp_lists = Effective::MailchimpList.deep.all
|
41
|
+
|
42
|
+
mailchimp_lists.each do |mailchimp_list|
|
43
|
+
mailchimp_list.mailchimp_categories.each do |mailchimp_category|
|
44
|
+
|
45
|
+
# All the Interests from Mailchimp
|
46
|
+
interests = api.interests(mailchimp_list.mailchimp_id, mailchimp_category.mailchimp_id)
|
47
|
+
|
48
|
+
# Get all our existing Effective::MailchimpGroup records
|
49
|
+
mailchimp_interests = where(mailchimp_list: mailchimp_list, mailchimp_category: mailchimp_category)
|
50
|
+
|
51
|
+
# Find or create Effective::MailchimpInterests based on existing lists and categories
|
52
|
+
interests.each do |interest|
|
53
|
+
mailchimp_id = interest['id']
|
54
|
+
mailchimp_interest = mailchimp_interests.find { |mi| mi.mailchimp_id == mailchimp_id } || new()
|
55
|
+
|
56
|
+
mailchimp_interest.assign_attributes(
|
57
|
+
mailchimp_list: mailchimp_list,
|
58
|
+
mailchimp_category: mailchimp_category,
|
59
|
+
|
60
|
+
mailchimp_id: mailchimp_id,
|
61
|
+
|
62
|
+
list_id: interest['list_id'],
|
63
|
+
list_name: mailchimp_list.name,
|
64
|
+
|
65
|
+
category_id: interest['category_id'],
|
66
|
+
category_name: mailchimp_category.name,
|
67
|
+
|
68
|
+
name: interest['name'],
|
69
|
+
display_order: interest['display_order'],
|
70
|
+
subscriber_count: interest['subscriber_count']
|
71
|
+
)
|
72
|
+
|
73
|
+
mailchimp_interest.assign_attributes(can_subscribe: true) if mailchimp_interest.new_record?
|
74
|
+
mailchimp_interest.save!
|
75
|
+
end
|
76
|
+
|
77
|
+
# Destroy any Effective::MailchimpGroups resources if they no longer returned by interests
|
78
|
+
mailchimp_interests.each do |mailchimp_interest|
|
79
|
+
interest = interests.find { |interest| interest['id'] == mailchimp_interest.mailchimp_id }
|
80
|
+
mailchimp_interest.destroy! unless interest.present?
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
true
|
86
|
+
end
|
87
|
+
|
88
|
+
def to_s
|
89
|
+
name.presence || model_name.human
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
end
|