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
84 85 86 87 |
# File 'app/models/concerns/effective_mailchimp_user.rb', line 84 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
39 40 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 |
# File 'app/models/concerns/effective_mailchimp_user.rb', line 39 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
93 94 95 |
# File 'app/models/concerns/effective_mailchimp_user.rb', line 93 def mailchimp_last_synced_at mailchimp_list_members.map(&:last_synced_at).min end |
#mailchimp_list_member(mailchimp_list:) ⇒ Object
78 79 80 81 |
# File 'app/models/concerns/effective_mailchimp_user.rb', line 78 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
89 90 91 |
# File 'app/models/concerns/effective_mailchimp_user.rb', line 89 def mailchimp_list_members_changed? mailchimp_list_members.any? { |mlm| mlm.changes.present? || mlm.marked_for_destruction? } end |
#mailchimp_member_update_required?(member) ⇒ Boolean
146 147 148 149 150 151 152 153 154 155 156 |
# File 'app/models/concerns/effective_mailchimp_user.rb', line 146 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
33 34 35 |
# File 'app/models/concerns/effective_mailchimp_user.rb', line 33 def mailchimp_merge_fields default_mailchimp_merge_fields() end |
#mailchimp_subscribed_lists ⇒ Object
74 75 76 |
# File 'app/models/concerns/effective_mailchimp_user.rb', line 74 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
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
# File 'app/models/concerns/effective_mailchimp_user.rb', line 104 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?) 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 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
97 98 99 100 |
# File 'app/models/concerns/effective_mailchimp_user.rb', line 97 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
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
# File 'app/models/concerns/effective_mailchimp_user.rb', line 127 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 |