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.
- #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
83 84 85 86 |
# File 'app/models/concerns/effective_mailchimp_user.rb', line 83 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
38 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 |
# File 'app/models/concerns/effective_mailchimp_user.rb', line 38 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, 'POSTAL_CODE': 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
92 93 94 |
# File 'app/models/concerns/effective_mailchimp_user.rb', line 92 def mailchimp_last_synced_at mailchimp_list_members.map(&:last_synced_at).min end |
#mailchimp_list_member(mailchimp_list:) ⇒ Object
77 78 79 80 |
# File 'app/models/concerns/effective_mailchimp_user.rb', line 77 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
88 89 90 |
# File 'app/models/concerns/effective_mailchimp_user.rb', line 88 def mailchimp_list_members_changed? mailchimp_list_members.any? { |mlm| mlm.changes.present? || mlm.marked_for_destruction? } end |
#mailchimp_member_update_required?(member) ⇒ Boolean
145 146 147 148 149 150 151 152 153 154 155 |
# File 'app/models/concerns/effective_mailchimp_user.rb', line 145 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
73 74 75 |
# File 'app/models/concerns/effective_mailchimp_user.rb', line 73 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
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
# File 'app/models/concerns/effective_mailchimp_user.rb', line 103 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
96 97 98 99 |
# File 'app/models/concerns/effective_mailchimp_user.rb', line 96 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
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
# File 'app/models/concerns/effective_mailchimp_user.rb', line 126 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 |