effective_mailchimp 0.1.2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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/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
|
@@ -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
|