Merge pull request #1072 from consul/oauth-signup-fix

Oauth signup fix
This commit is contained in:
Juanjo Bazán
2016-04-19 16:01:00 +02:00
10 changed files with 58 additions and 11 deletions

View File

@@ -41,9 +41,7 @@ class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
end end
def save_user(user) def save_user(user)
@user.save || @user.save || @user.save_requiring_finish_signup
@user.save_requiring_finish_signup ||
@user.save_requiring_finish_signup_without_email
end end
end end

View File

@@ -26,7 +26,7 @@ class User < ActiveRecord::Base
belongs_to :geozone belongs_to :geozone
validates :username, presence: true, if: :username_required? validates :username, presence: true, if: :username_required?
validates :username, uniqueness: true, if: :username_required? validates :username, uniqueness: { scope: :registering_with_oauth }, if: :username_required?
validates :document_number, uniqueness: { scope: :document_type }, allow_nil: true validates :document_number, uniqueness: { scope: :document_type }, allow_nil: true
validate :validate_username_length validate :validate_username_length
@@ -154,6 +154,7 @@ class User < ActiveRecord::Base
confirmed_phone: nil, confirmed_phone: nil,
unconfirmed_phone: nil unconfirmed_phone: nil
) )
self.identities.destroy_all
end end
def erased? def erased?
@@ -182,11 +183,11 @@ class User < ActiveRecord::Base
end end
def username_required? def username_required?
!organization? && !erased? && !registering_with_oauth !organization? && !erased?
end end
def email_required? def email_required?
!erased? && !registering_with_oauth !erased?
end end
def has_official_email? def has_official_email?
@@ -215,11 +216,15 @@ class User < ActiveRecord::Base
end end
def save_requiring_finish_signup def save_requiring_finish_signup
self.update(registering_with_oauth: true) begin
self.registering_with_oauth = true
self.save(validate: false)
# Devise puts unique constraints for the email the db, so we must detect & handle that
rescue ActiveRecord::RecordNotUnique
self.email = nil
self.save(validate: false)
end end
true
def save_requiring_finish_signup_without_email
self.update(registering_with_oauth: true, email: nil)
end end
def ability def ability

View File

@@ -3,6 +3,10 @@
<%= form_for current_user, as: :user, url: do_finish_signup_path, html: { role: 'form'} do |f| %> <%= form_for current_user, as: :user, url: do_finish_signup_path, html: { role: 'form'} do |f| %>
<%= render 'shared/errors', resource: current_user %> <%= render 'shared/errors', resource: current_user %>
<div class='callout primary'>
<%= t("omniauth.finish_signup.username_warning") %>
</div>
<% if current_user.errors.include? :username %> <% if current_user.errors.include? :username %>
<%= f.text_field :username, placeholder: t("devise_views.users.registrations.new.username_label") %> <%= f.text_field :username, placeholder: t("devise_views.users.registrations.new.username_label") %>
<% else %> <% else %>

View File

@@ -542,6 +542,7 @@ en:
omniauth: omniauth:
finish_signup: finish_signup:
title: "Additional details" title: "Additional details"
username_warning: "Due to a change in the way we interact with social networks, it is possible that your username now appears as 'already in use'. If that is your case, please choose a different username."
twitter: twitter:
sign_in: "Sign in with Twitter" sign_in: "Sign in with Twitter"
sign_up: "Sign up with Twitter" sign_up: "Sign up with Twitter"

View File

@@ -542,6 +542,7 @@ es:
omniauth: omniauth:
finish_signup: finish_signup:
title: "Detalles adicionales de tu cuenta" title: "Detalles adicionales de tu cuenta"
username_warning: "Debido a que hemos cambiado la forma en la que nos conectamos con redes sociales y es posible que tu nombre de usuario aparezca como 'ya en uso', incluso si antes podías acceder con él. Si es tu caso, por favor elige un nombre de usuario distinto."
twitter: twitter:
sign_in: "Entra con Twitter" sign_in: "Entra con Twitter"
sign_up: "Regístrate con Twitter" sign_up: "Regístrate con Twitter"

View File

@@ -0,0 +1,5 @@
class AddIndexToUsername < ActiveRecord::Migration
def change
add_index :users, :username
end
end

View File

@@ -432,6 +432,7 @@ ActiveRecord::Schema.define(version: 20160418172919) do
add_index "users", ["geozone_id"], name: "index_users_on_geozone_id", using: :btree add_index "users", ["geozone_id"], name: "index_users_on_geozone_id", using: :btree
add_index "users", ["hidden_at"], name: "index_users_on_hidden_at", using: :btree add_index "users", ["hidden_at"], name: "index_users_on_hidden_at", using: :btree
add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree
add_index "users", ["username"], name: "index_users_on_username", using: :btree
create_table "valuation_assignments", force: :cascade do |t| create_table "valuation_assignments", force: :cascade do |t|
t.integer "valuator_id" t.integer "valuator_id"

View File

@@ -59,4 +59,21 @@ namespace :users do
end end
end end
desc "Makes duplicate username users change their username"
task social_network_reset: :environment do
duplicated_usernames = User.all.select(:username).group(:username).having('count(username) > 1').pluck(:username)
duplicated_usernames.each do |username|
print "."
user_ids = User.where(username: username).order(created_at: :asc).pluck(:id)
user_ids_to_review = Identity.where(user_id: user_ids).pluck(:user_id)
user_ids_to_review.shift if user_ids.size == user_ids_to_review.size
user_ids_to_review.each { |id| User.find(id).update(registering_with_oauth: true) }
end
end
desc "Removes identities associated to erased users"
task remove_erased_identities: :environment do
Identity.joins(:user).where('users.erased_at IS NOT NULL').destroy_all
end
end end

View File

@@ -169,6 +169,12 @@ feature 'Users' do
expect(current_path).to eq(finish_signup_path) expect(current_path).to eq(finish_signup_path)
expect(page).to have_field('user_username', with: 'manuela')
click_button 'Register'
expect(current_path).to eq(do_finish_signup_path)
fill_in 'user_username', with: 'manuela2' fill_in 'user_username', with: 'manuela2'
click_button 'Register' click_button 'Register'

View File

@@ -333,6 +333,7 @@ describe User do
email_verification_token: "token3", email_verification_token: "token3",
confirmed_phone:"5678", confirmed_phone:"5678",
unconfirmed_phone:"5678") unconfirmed_phone:"5678")
user.erase('a test') user.erase('a test')
user.reload user.reload
@@ -353,6 +354,14 @@ describe User do
expect(user.confirmation_token).to be_nil expect(user.confirmation_token).to be_nil
expect(user.reset_password_token).to be_nil expect(user.reset_password_token).to be_nil
expect(user.email_verification_token).to be_nil expect(user.email_verification_token).to be_nil
end
it "destroys associated identities" do
user = create(:user)
identity = create(:identity, user: user)
user.erase('an identity test')
expect(Identity.exists?(identity.id)).to_not be
end end
end end