effective_mailchimp 0.1.1 → 0.2.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/datatables/admin/effective_mailchimp_lists_datatable.rb +9 -6
- data/app/models/concerns/effective_mailchimp_user.rb +41 -0
- data/app/models/effective/mailchimp_api.rb +30 -15
- data/app/models/effective/mailchimp_list.rb +32 -0
- data/app/views/admin/mailchimp_lists/_form.html.haml +5 -3
- data/app/views/admin/mailchimp_lists/index.html.haml +16 -0
- data/app/views/admin/mailchimp_user/_form.html.haml +6 -2
- data/app/views/effective/mailchimp_user/_fields.html.haml +11 -1
- data/config/effective_mailchimp.rb +0 -1
- data/config/routes.rb +3 -0
- data/db/migrate/01_create_effective_mailchimp.rb.erb +1 -0
- data/lib/effective_mailchimp/version.rb +1 -1
- data/lib/effective_mailchimp.rb +3 -3
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8e962bf13bfffb52a6cad9ca3a79a04d5538c9c458a4e1c2435d2802d7d80baa
|
4
|
+
data.tar.gz: 19705bc7db8feb56aaa6929e278ea9ebddf04f303a7d42a50e577004a5661223
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7b4a23713e0f03b906e168b68cc4310d3774cd1f6e4cf72c67f89d35ff1b311f695b653a1539e547a732d61e04473870c77b56a225621f49da192877d77e89aa
|
7
|
+
data.tar.gz: 3d4e1e00f8c84dcbab4cab7ce0a1035f2d30648b47c3da21834110a7757814b1cc27a9c62d53157bf3d99a7ec6f4b06ad28a8da9eb810b2fdb656ba95d5e0d03
|
@@ -17,14 +17,17 @@ module Admin
|
|
17
17
|
|
18
18
|
col :name
|
19
19
|
col :can_subscribe
|
20
|
-
|
21
|
-
|
22
|
-
|
20
|
+
col :force_subscribe
|
21
|
+
|
22
|
+
col :url, label: 'Mailchimp' do |ml|
|
23
|
+
[
|
24
|
+
link_to('View Campaign', ml.url, target: '_blank'),
|
25
|
+
link_to('View Members', ml.members_url, target: '_blank'),
|
26
|
+
link_to('View Merge Fields', ml.merge_fields_url, target: '_blank')
|
27
|
+
].join('<br>').html_safe
|
23
28
|
end
|
24
29
|
|
25
|
-
col :
|
26
|
-
link_to('View Members', ml.members_url, target: '_blank')
|
27
|
-
end
|
30
|
+
col :merge_fields
|
28
31
|
|
29
32
|
actions_col
|
30
33
|
end
|
@@ -29,6 +29,47 @@ module EffectiveMailchimpUser
|
|
29
29
|
after_commit(if: -> { mailchimp_user_form_action }) { mailchimp_update!(force: false) }
|
30
30
|
end
|
31
31
|
|
32
|
+
# Intended for app to extend
|
33
|
+
def mailchimp_merge_fields
|
34
|
+
default_mailchimp_merge_fields()
|
35
|
+
end
|
36
|
+
|
37
|
+
# These are the fields we push to Mailchimp on list_add and list_update
|
38
|
+
def default_mailchimp_merge_fields
|
39
|
+
atts = {}
|
40
|
+
|
41
|
+
if respond_to?(:first_name) && respond_to?(:last_name)
|
42
|
+
atts.merge!(
|
43
|
+
'FNAME': first_name,
|
44
|
+
'LNAME': last_name
|
45
|
+
)
|
46
|
+
end
|
47
|
+
|
48
|
+
if respond_to?(:addresses)
|
49
|
+
address = try(:billing_address) || addresses.last
|
50
|
+
|
51
|
+
atts.merge!(
|
52
|
+
'ADDRESS1': address&.address1,
|
53
|
+
'ADDRESS2': address&.address2,
|
54
|
+
'CITY': address&.city,
|
55
|
+
'PROVINCE': address&.province,
|
56
|
+
'COUNTRY': address&.country,
|
57
|
+
'POSTAL_CODE': address&.postal_code
|
58
|
+
)
|
59
|
+
end
|
60
|
+
|
61
|
+
if respond_to?(:membership)
|
62
|
+
atts.merge!(
|
63
|
+
'CATEGORY': membership&.categories&.to_sentence,
|
64
|
+
'STATUS': membership&.statuses&.to_sentence,
|
65
|
+
'NUMBER': membership&.number,
|
66
|
+
'JOINED': membership&.joined_on&.strftime('%F')
|
67
|
+
)
|
68
|
+
end
|
69
|
+
|
70
|
+
atts
|
71
|
+
end
|
72
|
+
|
32
73
|
def mailchimp_subscribed_lists
|
33
74
|
mailchimp_list_members.select(&:subscribed?).map(&:mailchimp_list)
|
34
75
|
end
|
@@ -10,15 +10,15 @@ module Effective
|
|
10
10
|
attr_accessor :server
|
11
11
|
attr_accessor :client
|
12
12
|
|
13
|
-
def initialize(api_key
|
14
|
-
raise('expected an api key') unless api_key.present?
|
15
|
-
raise('expected a server') unless server.present?
|
16
|
-
|
13
|
+
def initialize(api_key:)
|
17
14
|
@api_key = api_key
|
18
|
-
@server =
|
15
|
+
@server = api_key.to_s.split('-').last
|
16
|
+
|
17
|
+
raise('expected an api key') unless @api_key.present?
|
18
|
+
raise('expected an api key') unless @server.present?
|
19
19
|
|
20
20
|
@client = ::MailchimpMarketing::Client.new()
|
21
|
-
@client.set_config(api_key: api_key, server: server)
|
21
|
+
@client.set_config(api_key: @api_key, server: @server)
|
22
22
|
end
|
23
23
|
|
24
24
|
def admin_url
|
@@ -32,7 +32,7 @@ module Effective
|
|
32
32
|
# Returns an Array of Lists, which are each Hash
|
33
33
|
# Like this [{ ...}, { ... }]
|
34
34
|
def lists
|
35
|
-
response = client.lists.get_all_lists()
|
35
|
+
response = client.lists.get_all_lists(count: 250)
|
36
36
|
Array(response['lists']) - [nil, '', {}]
|
37
37
|
end
|
38
38
|
|
@@ -50,16 +50,31 @@ module Effective
|
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
|
+
def list_merge_fields(id)
|
54
|
+
response = client.lists.get_list_merge_fields(id, count: 100)
|
55
|
+
Array(response['merge_fields']) - [nil, '', {}]
|
56
|
+
end
|
57
|
+
|
58
|
+
def add_merge_field(id, name:, type: :text)
|
59
|
+
payload = { name: name.to_s.titleize, tag: name.to_s, type: type }
|
60
|
+
|
61
|
+
begin
|
62
|
+
client.lists.add_list_merge_field(id, payload)
|
63
|
+
rescue MailchimpMarketing::ApiError => e
|
64
|
+
false
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
53
68
|
def list_member_add(member)
|
54
69
|
raise('expected an Effective::MailchimpListMember') unless member.kind_of?(Effective::MailchimpListMember)
|
55
70
|
|
71
|
+
merge_fields = member.user.mailchimp_merge_fields
|
72
|
+
raise('expected user mailchimp_merge_fields to be a Hash') unless merge_fields.kind_of?(Hash)
|
73
|
+
|
56
74
|
payload = {
|
57
75
|
email_address: member.user.email,
|
58
76
|
status: (member.subscribed ? 'subscribed' : 'unsubscribed'),
|
59
|
-
merge_fields:
|
60
|
-
'FNAME': member.user.try(:first_name),
|
61
|
-
'LNAME': member.user.try(:last_name)
|
62
|
-
}
|
77
|
+
merge_fields: merge_fields
|
63
78
|
}
|
64
79
|
|
65
80
|
client.lists.add_list_member(member.mailchimp_list.mailchimp_id, payload)
|
@@ -68,13 +83,13 @@ module Effective
|
|
68
83
|
def list_member_update(member)
|
69
84
|
raise('expected an Effective::MailchimpListMember') unless member.kind_of?(Effective::MailchimpListMember)
|
70
85
|
|
86
|
+
merge_fields = member.user.mailchimp_merge_fields
|
87
|
+
raise('expected user mailchimp_merge_fields to be a Hash') unless merge_fields.kind_of?(Hash)
|
88
|
+
|
71
89
|
payload = {
|
72
90
|
email_address: member.user.email,
|
73
91
|
status: (member.subscribed ? 'subscribed' : 'unsubscribed'),
|
74
|
-
merge_fields:
|
75
|
-
'FNAME': member.user.try(:first_name),
|
76
|
-
'LNAME': member.user.try(:last_name)
|
77
|
-
}
|
92
|
+
merge_fields: merge_fields.compact
|
78
93
|
}
|
79
94
|
|
80
95
|
client.lists.update_list_member(member.mailchimp_list.mailchimp_id, member.email, payload)
|
@@ -3,12 +3,16 @@ module Effective
|
|
3
3
|
|
4
4
|
self.table_name = (EffectiveMailchimp.mailchimp_lists_table_name || :mailchimp_lists).to_s
|
5
5
|
|
6
|
+
has_many :mailchimp_list_members, dependent: :delete_all
|
7
|
+
|
6
8
|
effective_resource do
|
7
9
|
mailchimp_id :string
|
8
10
|
web_id :string
|
9
11
|
|
10
12
|
name :string
|
13
|
+
|
11
14
|
can_subscribe :boolean
|
15
|
+
force_subscribe :boolean
|
12
16
|
|
13
17
|
timestamps
|
14
18
|
end
|
@@ -49,6 +53,22 @@ module Effective
|
|
49
53
|
true
|
50
54
|
end
|
51
55
|
|
56
|
+
# This creates our local merge fields ON Mailchimp
|
57
|
+
def create_mailchimp_merge_fields!(merge_fields)
|
58
|
+
raise('expected a Hash of merge fields') unless merge_fields.kind_of?(Hash)
|
59
|
+
|
60
|
+
merge_fields.keys.each do |name|
|
61
|
+
EffectiveMailchimp.api.add_merge_field(mailchimp_id, name: name)
|
62
|
+
end
|
63
|
+
|
64
|
+
true
|
65
|
+
end
|
66
|
+
|
67
|
+
def merge_fields
|
68
|
+
return [] unless mailchimp_id
|
69
|
+
EffectiveMailchimp.api.list_merge_fields(mailchimp_id).map { |hash| hash['tag'] }.sort
|
70
|
+
end
|
71
|
+
|
52
72
|
def url
|
53
73
|
EffectiveMailchimp.api.admin_url + "/campaigns/#f_list:#{web_id}"
|
54
74
|
end
|
@@ -57,6 +77,10 @@ module Effective
|
|
57
77
|
EffectiveMailchimp.api.admin_url + "/lists/members?id=#{web_id}"
|
58
78
|
end
|
59
79
|
|
80
|
+
def merge_fields_url
|
81
|
+
EffectiveMailchimp.api.admin_url + "/lists/settings/merge-tags?id=#{web_id}"
|
82
|
+
end
|
83
|
+
|
60
84
|
def can_subscribe!
|
61
85
|
update!(can_subscribe: true)
|
62
86
|
end
|
@@ -65,5 +89,13 @@ module Effective
|
|
65
89
|
update!(can_subscribe: false)
|
66
90
|
end
|
67
91
|
|
92
|
+
def force_subscribe!
|
93
|
+
update!(force_subscribe: true)
|
94
|
+
end
|
95
|
+
|
96
|
+
def unforce_subscribe!
|
97
|
+
update!(force_subscribe: false)
|
98
|
+
end
|
99
|
+
|
68
100
|
end
|
69
101
|
end
|
@@ -1,8 +1,10 @@
|
|
1
1
|
= effective_form_with(model: [:admin, mailchimp_list], engine: true) do |f|
|
2
|
-
= f.static_field :
|
3
|
-
= f.static_field :web_id
|
4
|
-
= f.static_field :name
|
2
|
+
= f.static_field :name, label: EffectiveResources.et(mailchimp_list)
|
5
3
|
|
6
4
|
= f.check_box :can_subscribe, label: "Yes, display users and allow them to subscribe"
|
7
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
|
+
|
8
10
|
= effective_submit(f)
|
@@ -0,0 +1,16 @@
|
|
1
|
+
%h1.effective-admin-heading= @page_title
|
2
|
+
|
3
|
+
.card
|
4
|
+
.card-body
|
5
|
+
= collapse('Show merge field settings') do
|
6
|
+
%p The following Merge fields are sent to Mailchimp when a user subscribes:
|
7
|
+
|
8
|
+
%ul
|
9
|
+
- current_user.mailchimp_merge_fields.keys.each do |key|
|
10
|
+
%li= key
|
11
|
+
|
12
|
+
%p To have these fields displayed in Mailchimp, please configure each campaign with any of these merge fields.
|
13
|
+
|
14
|
+
.mb-4
|
15
|
+
|
16
|
+
= render_datatable @datatable
|
@@ -18,8 +18,12 @@
|
|
18
18
|
%small
|
19
19
|
last synced with
|
20
20
|
= link_to 'Mailchimp', EffectiveMailchimp.api.admin_url
|
21
|
-
|
22
|
-
|
21
|
+
- if user.mailchimp_last_synced_at.present?
|
22
|
+
= time_ago_in_words(user.mailchimp_last_synced_at)
|
23
|
+
ago.
|
24
|
+
- else
|
25
|
+
never.
|
26
|
+
|
23
27
|
= link_to 'sync now', effective_mailchimp.mailchimp_sync_user_admin_mailchimp_path(f.object), 'data-method': :post
|
24
28
|
|
25
29
|
= f.submit
|
@@ -1,4 +1,14 @@
|
|
1
1
|
= f.hidden_field :mailchimp_user_form_action, value: true
|
2
2
|
|
3
3
|
= f.fields_for :mailchimp_list_members do |fmlm|
|
4
|
-
|
4
|
+
- mailchimp_list = fmlm.object.mailchimp_list
|
5
|
+
- next if mailchimp_list.blank?
|
6
|
+
|
7
|
+
- if mailchimp_list.force_subscribe?
|
8
|
+
%p
|
9
|
+
= fmlm.check_box :subscribed, label: fmlm.object.to_s, disabled: true, hint: 'required'
|
10
|
+
= fmlm.hidden_field :subscribed, value: true
|
11
|
+
|
12
|
+
- elsif mailchimp_list.can_subscribe?
|
13
|
+
%p
|
14
|
+
= fmlm.check_box :subscribed, label: fmlm.object.to_s
|
data/config/routes.rb
CHANGED
@@ -13,6 +13,9 @@ EffectiveMailchimp::Engine.routes.draw do
|
|
13
13
|
resources :mailchimp_lists, only: [:index, :edit, :update] do
|
14
14
|
post :can_subscribe, on: :member
|
15
15
|
post :cannot_subscribe, on: :member
|
16
|
+
|
17
|
+
post :force_subscribe, on: :member
|
18
|
+
post :unforce_subscribe, on: :member
|
16
19
|
end
|
17
20
|
|
18
21
|
resources :mailchimp, only: [] do
|
data/lib/effective_mailchimp.rb
CHANGED
@@ -9,18 +9,18 @@ module EffectiveMailchimp
|
|
9
9
|
[
|
10
10
|
:mailchimp_lists_table_name, :mailchimp_list_members_table_name,
|
11
11
|
:layout,
|
12
|
-
:api_key
|
12
|
+
:api_key
|
13
13
|
]
|
14
14
|
end
|
15
15
|
|
16
16
|
include EffectiveGem
|
17
17
|
|
18
18
|
def self.api
|
19
|
-
Effective::MailchimpApi.new(api_key: api_key
|
19
|
+
Effective::MailchimpApi.new(api_key: api_key)
|
20
20
|
end
|
21
21
|
|
22
22
|
def self.api_present?
|
23
|
-
api_key.present?
|
23
|
+
api_key.present?
|
24
24
|
end
|
25
25
|
|
26
26
|
def self.permitted_params
|
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.
|
4
|
+
version: 0.2.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: 2023-03-
|
11
|
+
date: 2023-03-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -202,6 +202,7 @@ files:
|
|
202
202
|
- app/models/effective/mailchimp_list.rb
|
203
203
|
- app/models/effective/mailchimp_list_member.rb
|
204
204
|
- app/views/admin/mailchimp_lists/_form.html.haml
|
205
|
+
- app/views/admin/mailchimp_lists/index.html.haml
|
205
206
|
- app/views/admin/mailchimp_user/_form.html.haml
|
206
207
|
- app/views/effective/mailchimp_user/_fields.html.haml
|
207
208
|
- config/effective_mailchimp.rb
|