Module: EffectiveMailchimpUser
- Extended by:
- ActiveSupport::Concern
- Defined in:
- app/models/concerns/effective_mailchimp_user.rb
Overview
EffectiveMailchimpUser
Mark your user model with effective_mailchimp_user to get a few helpers And user specific point required scores
Defined Under Namespace
Modules: Base, ClassMethods
Instance Method Summary collapse
-
#build_mailchimp_list_member(mailchimp_list:) ⇒ Object
Find or build.
-
#default_mailchimp_merge_fields ⇒ Object
These are the fields we push to Mailchimp on list_add and list_update Keys can only be 10 characters long.
- #mailchimp_last_synced_at ⇒ Object
- #mailchimp_list_member(mailchimp_list:) ⇒ Object
- #mailchimp_list_members_changed? ⇒ Boolean
- #mailchimp_member_update_required?(member) ⇒ Boolean
-
#mailchimp_merge_fields ⇒ Object
Intended for app to extend.
- #mailchimp_subscribed_lists ⇒ Object
-
#mailchimp_sync!(force: true) ⇒ Object
Pulls the current status from Mailchimp API into the Mailchimp List Member objects Run before the mailchimp fields are displayed.
- #mailchimp_sync_required? ⇒ Boolean
-
#mailchimp_update!(force: true) ⇒ Object
Pushes the current Mailchimp List Member objects to Mailchimp when needed.
Instance Method Details
#build_mailchimp_list_member(mailchimp_list:) ⇒ Object
Find or build
86 87 88 89 |
# File 'app/models/concerns/effective_mailchimp_user.rb', line 86 def build_mailchimp_list_member(mailchimp_list:) raise('expected a MailchimpList') unless mailchimp_list.kind_of?(Effective::MailchimpList) mailchimp_list_member(mailchimp_list: mailchimp_list) || mailchimp_list_members.build(mailchimp_list: mailchimp_list) end |
#default_mailchimp_merge_fields ⇒ Object
These are the fields we push to Mailchimp on list_add and list_update Keys can only be 10 characters long
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'app/models/concerns/effective_mailchimp_user.rb', line 41 def default_mailchimp_merge_fields atts = {} if respond_to?(:first_name) && respond_to?(:last_name) atts.merge!( 'FNAME': first_name, 'LNAME': last_name ) end if respond_to?(:addresses) address = try(:billing_address) || addresses.last atts.merge!( 'ADDRESS1': address&.address1, 'ADDRESS2': address&.address2, 'CITY': address&.city, 'PROVINCE': address&.province, 'COUNTRY': address&.country, 'POSTALCODE': address&.postal_code ) end if respond_to?(:membership) atts.merge!( 'CATEGORY': membership&.categories&.to_sentence, 'STATUS': membership&.statuses&.to_sentence, 'NUMBER': membership&.number, 'JOINED': membership&.joined_on&.strftime('%F') ) end atts end |
#mailchimp_last_synced_at ⇒ Object
95 96 97 |
# File 'app/models/concerns/effective_mailchimp_user.rb', line 95 def mailchimp_last_synced_at mailchimp_list_members.map(&:last_synced_at).min end |
#mailchimp_list_member(mailchimp_list:) ⇒ Object
80 81 82 83 |
# File 'app/models/concerns/effective_mailchimp_user.rb', line 80 def mailchimp_list_member(mailchimp_list:) raise('expected a MailchimpList') unless mailchimp_list.kind_of?(Effective::MailchimpList) mailchimp_list_members.find { |mlm| mlm.mailchimp_list_id == mailchimp_list.id } end |
#mailchimp_list_members_changed? ⇒ Boolean
91 92 93 |
# File 'app/models/concerns/effective_mailchimp_user.rb', line 91 def mailchimp_list_members_changed? mailchimp_list_members.any? { |mlm| mlm.changes.present? || mlm.marked_for_destruction? } end |
#mailchimp_member_update_required?(member) ⇒ Boolean
150 151 152 153 154 155 156 157 158 159 160 |
# File 'app/models/concerns/effective_mailchimp_user.rb', line 150 def mailchimp_member_update_required?(member) require_update = ['email', 'last_name', 'first_name'] return true if (changes.keys & require_update).present? return true if (previous_changes.keys & require_update).present? return true if member.changes.present? return true if member.previous_changes.present? false end |
#mailchimp_merge_fields ⇒ Object
Intended for app to extend
35 36 37 |
# File 'app/models/concerns/effective_mailchimp_user.rb', line 35 def mailchimp_merge_fields default_mailchimp_merge_fields() end |
#mailchimp_subscribed_lists ⇒ Object
76 77 78 |
# File 'app/models/concerns/effective_mailchimp_user.rb', line 76 def mailchimp_subscribed_lists mailchimp_list_members.select(&:subscribed?).map(&:mailchimp_list) end |
#mailchimp_sync!(force: true) ⇒ Object
Pulls the current status from Mailchimp API into the Mailchimp List Member objects Run before the mailchimp fields are displayed
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
# File 'app/models/concerns/effective_mailchimp_user.rb', line 106 def mailchimp_sync!(force: true) api = EffectiveMailchimp.api lists = Effective::MailchimpList.subscribable.sorted.to_a return if lists.length == mailchimp_list_members.length && !(force || mailchimp_sync_required?) Timeout::timeout(lists.length * 2) do lists.each do |mailchimp_list| member = build_mailchimp_list_member(mailchimp_list: mailchimp_list) list_member = api.list_member(mailchimp_list, email) || {} member.assign_mailchimp_attributes(list_member) end end mailchimp_list_members.each do |member| list = lists.find { |list| list.id == member.mailchimp_list_id } member.mark_for_destruction unless list.present? end save! if mailchimp_list_members_changed? true end |
#mailchimp_sync_required? ⇒ Boolean
99 100 101 102 |
# File 'app/models/concerns/effective_mailchimp_user.rb', line 99 def mailchimp_sync_required? return true if mailchimp_last_synced_at.blank? mailchimp_last_synced_at < (Time.zone.now - 1.day) end |
#mailchimp_update!(force: true) ⇒ Object
Pushes the current Mailchimp List Member objects to Mailchimp when needed
131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 |
# File 'app/models/concerns/effective_mailchimp_user.rb', line 131 def mailchimp_update!(force: true) api = EffectiveMailchimp.api assign_attributes(mailchimp_user_form_action: nil) mailchimp_list_members.map do |member| if member.mailchimp_id.blank? && member.subscribed? list_member = api.list_member_add(member) member.assign_mailchimp_attributes(list_member) elsif member.mailchimp_id.present? && (force || mailchimp_member_update_required?(member)) list_member = api.list_member_update(member) member.assign_mailchimp_attributes(list_member) end end save! if mailchimp_list_members_changed? true end |