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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9324e2d3e44354896c4ebf66fa72a67b03b0014b8bcefe33c38f77447d950212
4
- data.tar.gz: 84960533a7ace0489d64ec6901dce4d49bdb7845a34893ddfff866d81f73f7ea
3
+ metadata.gz: 8e962bf13bfffb52a6cad9ca3a79a04d5538c9c458a4e1c2435d2802d7d80baa
4
+ data.tar.gz: 19705bc7db8feb56aaa6929e278ea9ebddf04f303a7d42a50e577004a5661223
5
5
  SHA512:
6
- metadata.gz: 9559bc12e2eddec9078b8d3fbba00578e4d44786ac6dfb41b7addb32b6c191a8aabecf889593cacd39cb6d0ab03bf0e12eb963a703788fa937d7439883fa28c6
7
- data.tar.gz: 1bb06b5c12bcdf3b2ab58994f1e818844eaf4ae7404dab11ba75597915f018c89972d6c9a4738efd3e171e61d66cb1b5e5b8c1d92b1364277eb7922207c4409d
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
- col :url, label: 'Campaign' do |ml|
22
- link_to('View Campaign', ml.url, target: '_blank')
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 :members_url, label: 'Members' do |ml|
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:, server:)
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 = 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 :mailchimp_id
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
- = time_ago_in_words(user.mailchimp_last_synced_at)
22
- ago.
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
- %p= fmlm.check_box :subscribed, label: fmlm.object.to_s
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
@@ -8,5 +8,4 @@ EffectiveMailchimp.setup do |config|
8
8
 
9
9
  # Mailchimp Settings
10
10
  config.api_key = '' # From mailchimp's /account/api/ screen
11
- config.server = '' # Determine from your mailchimp account URL. Something like us1
12
11
  end
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
@@ -7,6 +7,7 @@ class CreateEffectiveMailchimp < ActiveRecord::Migration[6.0]
7
7
  t.string :name
8
8
 
9
9
  t.boolean :can_subscribe
10
+ t.boolean :force_subscribe
10
11
 
11
12
  t.timestamps
12
13
  end
@@ -1,3 +1,3 @@
1
1
  module EffectiveMailchimp
2
- VERSION = '0.1.1'.freeze
2
+ VERSION = '0.2.0'.freeze
3
3
  end
@@ -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, :server
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, server: server)
19
+ Effective::MailchimpApi.new(api_key: api_key)
20
20
  end
21
21
 
22
22
  def self.api_present?
23
- api_key.present? && server.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.1.1
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-01 00:00:00.000000000 Z
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