From 2987ca763db4c755ceaebf761c4c3e43f79ef929 Mon Sep 17 00:00:00 2001 From: Rohan Mitchell Date: Fri, 23 May 2014 15:09:08 +1000 Subject: [PATCH 1/3] Add additional data sanitisation for foreign key migration --- db/migrate/20140402033428_add_foreign_keys.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/db/migrate/20140402033428_add_foreign_keys.rb b/db/migrate/20140402033428_add_foreign_keys.rb index f072127158..fce1ffd009 100644 --- a/db/migrate/20140402033428_add_foreign_keys.rb +++ b/db/migrate/20140402033428_add_foreign_keys.rb @@ -32,6 +32,11 @@ class AddForeignKeys < ActiveRecord::Migration say "Destroying #{orphaned_exchange_variants.count} orphaned ExchangeVariants (of total #{ExchangeVariant.count})" orphaned_exchange_variants.destroy_all + # Remove orphaned ExchangeFee records + orphaned_exchange_fees = ExchangeFee.joins('LEFT OUTER JOIN enterprise_fees ON enterprise_fees.id=exchange_fees.enterprise_fee_id').where('enterprise_fees.id IS NULL') + say "Destroying #{orphaned_exchange_fees.count} orphaned ExchangeFees (of total #{ExchangeFee.count})" + orphaned_exchange_fees.destroy_all + # Remove orphaned Spree::InventoryUnits orphaned_inventory_units = Spree::InventoryUnit.joins('LEFT OUTER JOIN spree_variants ON spree_variants.id=spree_inventory_units.variant_id').where('spree_variants.id IS NULL') say "Destroying #{orphaned_inventory_units.count} orphaned InventoryUnits (of total #{Spree::InventoryUnit.count})" From 9aadc9d1ce76995f5aaedd193e873211cef436b4 Mon Sep 17 00:00:00 2001 From: Rohan Mitchell Date: Fri, 23 May 2014 15:10:21 +1000 Subject: [PATCH 2/3] Add initial user import/export via CSV --- lib/tasks/users.rake | 70 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 lib/tasks/users.rake diff --git a/lib/tasks/users.rake b/lib/tasks/users.rake new file mode 100644 index 0000000000..0f8b8a411b --- /dev/null +++ b/lib/tasks/users.rake @@ -0,0 +1,70 @@ +require 'csv' + +namespace :openfoodnetwork do + + namespace :dev do + desc 'export users to CSV' + task export_users: :environment do + CSV.open('db/users.csv', 'wb') do |csv| + csv << header + # Skip some spambot users + users = Spree::User.all.reject { |u| u.email =~ /example.net/ } + users.each do |user| + csv << row(user) + end + end + end + + + desc 'import users from CSV' + task import_users: :environment do + ActionMailer::Base.delivery_method = :test + + CSV.foreach('db/users.csv') do |row| + next if row[0] == 'encrypted_password' + + create_user_from row + end + end + + + private + + def header + ["encrypted_password", "password_salt", "email", "remember_token", "persistence_token", "reset_password_token", "perishable_token", "sign_in_count", "failed_attempts", "last_request_at", "current_sign_in_at", "last_sign_in_at", "current_sign_in_ip", "last_sign_in_ip", "login", "created_at", "updated_at", "authentication_token", "unlock_token", "locked_at", "remember_created_at", "reset_password_sent_at", + + "role_name", + + "ship_address_firstname", "ship_address_lastname", "ship_address_address1", "ship_address_address2", "ship_address_city", "ship_address_zipcode", "ship_address_phone", "ship_address_state", "ship_address_country", "ship_address_created_at", "ship_address_updated_at", "ship_address_company", "ship_address_latitude", "ship_address_longitude", + + "bill_address_firstname", "bill_address_lastname", "bill_address_address1", "bill_address_address2", "bill_address_city", "bill_address_zipcode", "bill_address_phone", "bill_address_state", "bill_address_country", "bill_address_created_at", "bill_address_updated_at", "bill_address_company", "bill_address_latitude", "bill_address_longitude"] + end + + + def row(user) + # sa = user.ship_address + # ba = user.bill_address + + [user.encrypted_password, user.password_salt, user.email, user.remember_token, user.persistence_token, user.reset_password_token, user.perishable_token, user.sign_in_count, user.failed_attempts, user.last_request_at, user.current_sign_in_at, user.last_sign_in_at, user.current_sign_in_ip, user.last_sign_in_ip, user.login, user.created_at, user.updated_at, user.authentication_token, user.unlock_token, user.locked_at, user.remember_created_at, user.reset_password_sent_at, + + user.spree_roles.first.andand.name] + + # sa.andand.firstname, sa.andand.lastname, sa.andand.address1, sa.andand.address2, sa.andand.city, sa.andand.zipcode, sa.andand.phone, sa.andand.state, sa.andand.country, sa.andand.created_at, sa.andand.updated_at, sa.andand.company, sa.andand.latitude, sa.andand.longitude, + + # ba.andand.firstname, ba.andand.lastname, ba.andand.address1, ba.andand.address2, ba.andand.city, ba.andand.zipcode, ba.andand.phone, ba.andand.state, ba.andand.country, ba.andand.created_at, ba.andand.updated_at, ba.andand.company, ba.andand.latitude, ba.andand.longitude] + end + + + def create_user_from(row) + user = Spree::User.create!({password: 'changeme123', password_confirmation: 'changeme123', email: row[2], remember_token: row[3], persistence_token: row[4], reset_password_token: row[5], perishable_token: row[6], sign_in_count: row[7], failed_attempts: row[8], last_request_at: row[9], current_sign_in_at: row[10], last_sign_in_at: row[11], current_sign_in_ip: row[12], last_sign_in_ip: row[13], login: row[14], created_at: row[15], updated_at: row[16], authentication_token: row[17], unlock_token: row[18], locked_at: row[19], remember_created_at: row[20], reset_password_sent_at: row[21]}, without_protection: true) + + user.update_column :encrypted_password, row[0] + user.update_column :password_salt, row[1] + + role = Spree::Role.find_by_name row[24] + user.spree_roles << role if role + rescue ActiveRecord::RecordInvalid => e + puts "#{row[2]} - #{e.message}" + end + end +end From d1028cb912555c1909ae103660623d49c51dc724 Mon Sep 17 00:00:00 2001 From: Rohan Mitchell Date: Fri, 23 May 2014 17:51:02 +1000 Subject: [PATCH 3/3] User import/export includes addresses --- lib/tasks/users.rake | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/lib/tasks/users.rake b/lib/tasks/users.rake index 0f8b8a411b..323c679fb0 100644 --- a/lib/tasks/users.rake +++ b/lib/tasks/users.rake @@ -7,8 +7,6 @@ namespace :openfoodnetwork do task export_users: :environment do CSV.open('db/users.csv', 'wb') do |csv| csv << header - # Skip some spambot users - users = Spree::User.all.reject { |u| u.email =~ /example.net/ } users.each do |user| csv << row(user) end @@ -30,28 +28,34 @@ namespace :openfoodnetwork do private + def users + # Skip some spambot users + Spree::User.all.reject { |u| u.email =~ /example.net/ } + end + + def header ["encrypted_password", "password_salt", "email", "remember_token", "persistence_token", "reset_password_token", "perishable_token", "sign_in_count", "failed_attempts", "last_request_at", "current_sign_in_at", "last_sign_in_at", "current_sign_in_ip", "last_sign_in_ip", "login", "created_at", "updated_at", "authentication_token", "unlock_token", "locked_at", "remember_created_at", "reset_password_sent_at", "role_name", - "ship_address_firstname", "ship_address_lastname", "ship_address_address1", "ship_address_address2", "ship_address_city", "ship_address_zipcode", "ship_address_phone", "ship_address_state", "ship_address_country", "ship_address_created_at", "ship_address_updated_at", "ship_address_company", "ship_address_latitude", "ship_address_longitude", + "ship_address_firstname", "ship_address_lastname", "ship_address_address1", "ship_address_address2", "ship_address_city", "ship_address_zipcode", "ship_address_phone", "ship_address_state", "ship_address_country", "ship_address_created_at", "ship_address_updated_at", "ship_address_company", - "bill_address_firstname", "bill_address_lastname", "bill_address_address1", "bill_address_address2", "bill_address_city", "bill_address_zipcode", "bill_address_phone", "bill_address_state", "bill_address_country", "bill_address_created_at", "bill_address_updated_at", "bill_address_company", "bill_address_latitude", "bill_address_longitude"] + "bill_address_firstname", "bill_address_lastname", "bill_address_address1", "bill_address_address2", "bill_address_city", "bill_address_zipcode", "bill_address_phone", "bill_address_state", "bill_address_country", "bill_address_created_at", "bill_address_updated_at", "bill_address_company",] end def row(user) - # sa = user.ship_address - # ba = user.bill_address + sa = user.orders.last.andand.ship_address + ba = user.orders.last.andand.bill_address [user.encrypted_password, user.password_salt, user.email, user.remember_token, user.persistence_token, user.reset_password_token, user.perishable_token, user.sign_in_count, user.failed_attempts, user.last_request_at, user.current_sign_in_at, user.last_sign_in_at, user.current_sign_in_ip, user.last_sign_in_ip, user.login, user.created_at, user.updated_at, user.authentication_token, user.unlock_token, user.locked_at, user.remember_created_at, user.reset_password_sent_at, - user.spree_roles.first.andand.name] + user.spree_roles.first.andand.name, - # sa.andand.firstname, sa.andand.lastname, sa.andand.address1, sa.andand.address2, sa.andand.city, sa.andand.zipcode, sa.andand.phone, sa.andand.state, sa.andand.country, sa.andand.created_at, sa.andand.updated_at, sa.andand.company, sa.andand.latitude, sa.andand.longitude, + sa.andand.firstname, sa.andand.lastname, sa.andand.address1, sa.andand.address2, sa.andand.city, sa.andand.zipcode, sa.andand.phone, sa.andand.state, sa.andand.country, sa.andand.created_at, sa.andand.updated_at, sa.andand.company, - # ba.andand.firstname, ba.andand.lastname, ba.andand.address1, ba.andand.address2, ba.andand.city, ba.andand.zipcode, ba.andand.phone, ba.andand.state, ba.andand.country, ba.andand.created_at, ba.andand.updated_at, ba.andand.company, ba.andand.latitude, ba.andand.longitude] + ba.andand.firstname, ba.andand.lastname, ba.andand.address1, ba.andand.address2, ba.andand.city, ba.andand.zipcode, ba.andand.phone, ba.andand.state, ba.andand.country, ba.andand.created_at, ba.andand.updated_at, ba.andand.company,] end @@ -61,8 +65,20 @@ namespace :openfoodnetwork do user.update_column :encrypted_password, row[0] user.update_column :password_salt, row[1] - role = Spree::Role.find_by_name row[24] - user.spree_roles << role if role + # Safer if we don't make new users into admins + #role = Spree::Role.find_by_name row[24] + #user.spree_roles << role if role + + sa_state = Spree::State.find_by_name row[30] + sa_country = Spree::Country.find_by_name row[31] + sa = Spree::Address.create!({firstname: row[23], lastname: row[24], address1: row[25], address2: row[26], city: row[27], zipcode: row[28], phone: row[29], state: sa_state, country: sa_country, created_at: row[32], updated_at: row[33], company: row[34]}, without_protection: true) + user.update_column :ship_address_id, sa.id + + ba_state = Spree::State.find_by_name row[42] + ba_country = Spree::Country.find_by_name row[43] + ba = Spree::Address.create!({firstname: row[35], lastname: row[36], address1: row[37], address2: row[38], city: row[39], zipcode: row[40], phone: row[41], state: ba_state, country: ba_country, created_at: row[44], updated_at: row[45], company: row[46]}, without_protection: true) + user.update_column :bill_address_id, ba.id + rescue ActiveRecord::RecordInvalid => e puts "#{row[2]} - #{e.message}" end