From d701bffb40b1633d7302e0e36b9345fb8aeeb101 Mon Sep 17 00:00:00 2001 From: Michael Harrison Date: Fri, 13 Oct 2023 12:52:50 -0500 Subject: [PATCH 1/6] add adopter status to user as string --- app/representers/api/v1/user_representer.rb | 6 ++++++ app/routines/update_user_contact_info.rb | 2 ++ ...231004175741_add_adopter_status_to_user.rb | 5 +++++ db/schema.rb | 3 ++- lib/tasks/accounts/update_adopter_status.rake | 19 +++++++++++++++++++ 5 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20231004175741_add_adopter_status_to_user.rb create mode 100644 lib/tasks/accounts/update_adopter_status.rake diff --git a/app/representers/api/v1/user_representer.rb b/app/representers/api/v1/user_representer.rb index 9729e887dc..5055ac63c6 100644 --- a/app/representers/api/v1/user_representer.rb +++ b/app/representers/api/v1/user_representer.rb @@ -83,6 +83,12 @@ class UserRepresenter < Roar::Decorator readable: true, writeable: false + property :adopter_status, + if: ->(user_options:, **) { user_options.try(:fetch, :include_private_data, false) }, + type: String, + readable: true, + writeable: false + property :salesforce_contact_id, type: String, readable: true, diff --git a/app/routines/update_user_contact_info.rb b/app/routines/update_user_contact_info.rb index c78a56d1cd..02accd2d69 100644 --- a/app/routines/update_user_contact_info.rb +++ b/app/routines/update_user_contact_info.rb @@ -98,10 +98,12 @@ def call :unknown_school_location end + # TODO: This can be removed once OSWeb is migated to using the new adopter_status field for renewal forms unless sf_contact.adoption_status.blank? user.using_openstax = ADOPTION_STATUSES[sf_contact.adoption_status] end + user.adopter_status = sf_contact.adoption_status user.is_kip = sf_school&.is_kip || sf_school&.is_child_of_kip user.grant_tutor_access = sf_contact.grant_tutor_access user.is_b_r_i_user = sf_contact.b_r_i_marketing diff --git a/db/migrate/20231004175741_add_adopter_status_to_user.rb b/db/migrate/20231004175741_add_adopter_status_to_user.rb new file mode 100644 index 0000000000..8426252468 --- /dev/null +++ b/db/migrate/20231004175741_add_adopter_status_to_user.rb @@ -0,0 +1,5 @@ +class AddAdopterStatusToUser < ActiveRecord::Migration[5.2] + def change + add_column :users, :adopter_status, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index ce96944d85..b3f068c00a 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2023_08_10_185800) do +ActiveRecord::Schema.define(version: 2023_10_04_175741) do # These are extensions that must be enabled in order to support this database enable_extension "citext" @@ -483,6 +483,7 @@ t.boolean "needs_sync" t.boolean "sheer_id_webhook_received" t.jsonb "books_used_details" + t.string "adopter_status" t.index "lower((first_name)::text)", name: "index_users_on_first_name" t.index "lower((last_name)::text)", name: "index_users_on_last_name" t.index "lower((username)::text)", name: "index_users_on_username_case_insensitive" diff --git a/lib/tasks/accounts/update_adopter_status.rake b/lib/tasks/accounts/update_adopter_status.rake new file mode 100644 index 0000000000..d660400fb3 --- /dev/null +++ b/lib/tasks/accounts/update_adopter_status.rake @@ -0,0 +1,19 @@ +namespace :accounts do + desc 'Update newly created field for adopter status from Salesforce' + # rake accounts:update_adopter_status + task update_adopter_status: [:environment] do + contacts ||= OpenStax::Salesforce::Remote::Contact.select( + :id, + :adoption_status, + :accounts_uuid + ) + .where("Accounts_UUID__c != null") + .to_a + + contacts.each { | contact | + u = User.where(salesforce_contact_id: contact.id) + u.adopter_status = contact.adoption_status + u.save! + } + end +end From ae185585e47139fb92af72b1b5d2007a26f2b9a9 Mon Sep 17 00:00:00 2001 From: Michael Harrison Date: Thu, 19 Oct 2023 11:04:39 -0500 Subject: [PATCH 2/6] update task to do incremental updates --- lib/tasks/accounts/update_adopter_status.rake | 41 +++++++++++++------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/lib/tasks/accounts/update_adopter_status.rake b/lib/tasks/accounts/update_adopter_status.rake index d660400fb3..e6bc1ef70f 100644 --- a/lib/tasks/accounts/update_adopter_status.rake +++ b/lib/tasks/accounts/update_adopter_status.rake @@ -2,18 +2,35 @@ namespace :accounts do desc 'Update newly created field for adopter status from Salesforce' # rake accounts:update_adopter_status task update_adopter_status: [:environment] do - contacts ||= OpenStax::Salesforce::Remote::Contact.select( - :id, - :adoption_status, - :accounts_uuid - ) - .where("Accounts_UUID__c != null") - .to_a + last_id = nil + loop do + contacts = OpenStax::Salesforce::Remote::Contact.select( + :id, + :adoption_status, + :accounts_uuid + ) + .where("Accounts_UUID__c != null") + .order(:Id) + .limit(250) + contacts = contacts.where("Id > '#{last_id}'") unless last_id.nil? + contacts = contacts.to_a + last_id = contacts.last&.id - contacts.each { | contact | - u = User.where(salesforce_contact_id: contact.id) - u.adopter_status = contact.adoption_status - u.save! - } + begin + user_by_salesforce_id = User.where( + salesforce_contact_id: contacts.map(&:id) + ).index_by(&:salesforce_contact_id) + + updated_contacts = contacts.map do |contact| + user = user_by_salesforce_id[contact.id] + user.adopter_status = contact.adoption_status + user.save! + end + rescue StandardError => se + Sentry.capture_exception se + end + + break if contacts.length < 250 + end end end From 4db46deea208a9469033158a2ac2382de297b37b Mon Sep 17 00:00:00 2001 From: Michael Harrison Date: Fri, 20 Oct 2023 12:29:36 -0500 Subject: [PATCH 3/6] batch by users instead of contacts --- lib/tasks/accounts/update_adopter_status.rake | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/lib/tasks/accounts/update_adopter_status.rake b/lib/tasks/accounts/update_adopter_status.rake index e6bc1ef70f..07215bf076 100644 --- a/lib/tasks/accounts/update_adopter_status.rake +++ b/lib/tasks/accounts/update_adopter_status.rake @@ -4,33 +4,33 @@ namespace :accounts do task update_adopter_status: [:environment] do last_id = nil loop do - contacts = OpenStax::Salesforce::Remote::Contact.select( - :id, - :adoption_status, - :accounts_uuid - ) - .where("Accounts_UUID__c != null") - .order(:Id) - .limit(250) - contacts = contacts.where("Id > '#{last_id}'") unless last_id.nil? - contacts = contacts.to_a - last_id = contacts.last&.id + users = User.where(adopter_status: nil).order(:id).limit(250) + users = users.where("id > #{last_id}") unless last_id.nil? + last_id = users.last&.id begin - user_by_salesforce_id = User.where( - salesforce_contact_id: contacts.map(&:id) - ).index_by(&:salesforce_contact_id) + contacts = OpenStax::Salesforce::Remote::Contact.select( + :id, + :adoption_status, + :accounts_uuid + ) + .where(id: users.map(&:salesforce_contact_id)) + .index_by(&:id) + .to_a - updated_contacts = contacts.map do |contact| - user = user_by_salesforce_id[contact.id] + updated_users = users.map do |user| + contact = contacts[user.salesforce_contact_id] user.adopter_status = contact.adoption_status - user.save! + end + + updated_users.transaction do + updated_users.save! end rescue StandardError => se Sentry.capture_exception se end - break if contacts.length < 250 + break if users.length < 250 end end end From 1641e3f09f7bb2feb67906821b0604b74fcc9721 Mon Sep 17 00:00:00 2001 From: Michael Harrison Date: Wed, 25 Oct 2023 10:30:45 -0500 Subject: [PATCH 4/6] remove last_id tracking, fix save transaction --- lib/tasks/accounts/update_adopter_status.rake | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/lib/tasks/accounts/update_adopter_status.rake b/lib/tasks/accounts/update_adopter_status.rake index 07215bf076..8118918341 100644 --- a/lib/tasks/accounts/update_adopter_status.rake +++ b/lib/tasks/accounts/update_adopter_status.rake @@ -2,11 +2,8 @@ namespace :accounts do desc 'Update newly created field for adopter status from Salesforce' # rake accounts:update_adopter_status task update_adopter_status: [:environment] do - last_id = nil loop do - users = User.where(adopter_status: nil).order(:id).limit(250) - users = users.where("id > #{last_id}") unless last_id.nil? - last_id = users.last&.id + users = User.where(adopter_status: nil).where.not(salesforce_contact_id: nil ).limit(250) begin contacts = OpenStax::Salesforce::Remote::Contact.select( @@ -16,21 +13,18 @@ namespace :accounts do ) .where(id: users.map(&:salesforce_contact_id)) .index_by(&:id) - .to_a updated_users = users.map do |user| contact = contacts[user.salesforce_contact_id] user.adopter_status = contact.adoption_status end - + updated_users.transaction do - updated_users.save! + updated_users.each(&:save!) end rescue StandardError => se Sentry.capture_exception se end - - break if users.length < 250 end end end From 8d9ec39007708845939c0ce9db2221a28abf7678 Mon Sep 17 00:00:00 2001 From: Michael Harrison Date: Wed, 25 Oct 2023 12:13:32 -0500 Subject: [PATCH 5/6] remove rescue and readd loop break --- lib/tasks/accounts/update_adopter_status.rake | 32 +++++++++---------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/lib/tasks/accounts/update_adopter_status.rake b/lib/tasks/accounts/update_adopter_status.rake index 8118918341..e1f1e5ac3a 100644 --- a/lib/tasks/accounts/update_adopter_status.rake +++ b/lib/tasks/accounts/update_adopter_status.rake @@ -5,26 +5,24 @@ namespace :accounts do loop do users = User.where(adopter_status: nil).where.not(salesforce_contact_id: nil ).limit(250) - begin - contacts = OpenStax::Salesforce::Remote::Contact.select( - :id, - :adoption_status, - :accounts_uuid - ) - .where(id: users.map(&:salesforce_contact_id)) - .index_by(&:id) + contacts = OpenStax::Salesforce::Remote::Contact.select( + :id, + :adoption_status, + :accounts_uuid + ) + .where(id: users.map(&:salesforce_contact_id)) + .index_by(&:id) - updated_users = users.map do |user| - contact = contacts[user.salesforce_contact_id] - user.adopter_status = contact.adoption_status - end + updated_users = users.map do |user| + contact = contacts[user.salesforce_contact_id] + user.adopter_status = contact.adoption_status + end - updated_users.transaction do - updated_users.each(&:save!) - end - rescue StandardError => se - Sentry.capture_exception se + updated_users.transaction do + updated_users.each(&:save!) end + + break if users.length < 250 end end end From 5ad58d990c0fba6fea84c2d4adf663b92381b8df Mon Sep 17 00:00:00 2001 From: Michael Harrison Date: Wed, 25 Oct 2023 15:47:53 -0500 Subject: [PATCH 6/6] add .to_a to SF query --- lib/tasks/accounts/update_adopter_status.rake | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/tasks/accounts/update_adopter_status.rake b/lib/tasks/accounts/update_adopter_status.rake index e1f1e5ac3a..b1e0611518 100644 --- a/lib/tasks/accounts/update_adopter_status.rake +++ b/lib/tasks/accounts/update_adopter_status.rake @@ -3,7 +3,7 @@ namespace :accounts do # rake accounts:update_adopter_status task update_adopter_status: [:environment] do loop do - users = User.where(adopter_status: nil).where.not(salesforce_contact_id: nil ).limit(250) + users = User.where(adopter_status: nil).where.not(salesforce_contact_id: nil).limit(250) contacts = OpenStax::Salesforce::Remote::Contact.select( :id, @@ -11,6 +11,7 @@ namespace :accounts do :accounts_uuid ) .where(id: users.map(&:salesforce_contact_id)) + .to_a .index_by(&:id) updated_users = users.map do |user|