effective_mailchimp 0.1.2 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b07992dd0456401263f6d8ee6d82ad6189cda9fe191e7952ed8e90f5bad9ec79
4
- data.tar.gz: 6fc4ba4b3abba5ee85670a721e4681aaee3e4ece6140a0b8873891f1eb367a4f
3
+ metadata.gz: b36ddeb033917790b43fbe0d21fee076f284c4d1d397a4bc18b2ff6135d014aa
4
+ data.tar.gz: 7d2ac0accd18fc0b1b5756b6a548329465f3d6661540a668d929f762efdbd6e3
5
5
  SHA512:
6
- metadata.gz: 8f58bb4d3431787e4211ae6a132d71ed205feffebe46e2b7a1702b0179ebd43ac773f303744c5af196000ce3a1d1445ac9216adda8f2925496284cb1dccd4a2d
7
- data.tar.gz: 7d27cd2a229e062657eb868bca61f122bd7c17fde66d0dd6e56f547436bb1ea8b993df34cb485531a7cbd47d049135fb497655a4a613a6fe2194b51554ff3837
6
+ metadata.gz: b0e524dbc00a33d316d1465bbc3f94ba0d79864d1693ac81dc57ecc1f60bb9af627540e33021d6a061a12f99014dbb3993ccb80fa1e6786157cb29080dcdea5a
7
+ data.tar.gz: 2ae3e23a1662c440fef0d75a758a840242c8b4d758ec28f122ae7fbee38a2f03527ca14a46b8470662a033b36df9cfca88141dc71d1546ecc63e4ae427d52b1c
@@ -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
@@ -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.2'.freeze
2
+ VERSION = '0.2.1'.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.2
4
+ version: 0.2.1
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-07 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