sign up form and facebook connect

This commit is contained in:
Harry Bomrah 2014-05-26 16:43:51 +08:00
parent ab8b52e66f
commit 791148ce1b
14 changed files with 479 additions and 4 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -0,0 +1,117 @@
require "net/http"
require "uri"
require 'json'
class FacebookController < ApplicationController
@@facebook_server = "http://fb.tp.rulingcom.com"
def register_fb
user = User.find(params[:user])
if !user.facebook
user.build_facebook(fb_identifier: params[:identifier],connected: true)
user.save!
end
render :json=>{"success"=>true,"user"=>user.facebook.fb_identifier}.to_json
# respond_to do |format|
# format.js
# end
end
def get_friends
fb = current_user.facebook rescue nil
if fb
@url = "#{@@facebook_server}/get_friends?identifier=" + current_user.facebook.fb_identifier
uri = URI.parse(@url)
http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Get.new(uri.request_uri)
response = http.request(request)
friends = response.body
friends = JSON.parse(friends)
output = Array.new
friends.each do |friend|
output << {"name"=>friend['name'],"identifier"=>friend['identifier']}
end
render :json=>{"success"=>true,"count"=>friends.count,"friends"=>output}.to_json
else
render :json=>{"success"=>false,"message"=>"User is not connected to facebook."}.to_json
end
end
def get_feed
fb = current_user.facebook rescue nil
if fb
@url = "#{@@facebook_server}/get_feed?identifier=" + current_user.facebook.fb_identifier
uri = URI.parse(@url)
http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Get.new(uri.request_uri)
response = http.request(request)
feed = response.body
feed = JSON.parse(feed)
output = Array.new
feed.each do |f|
output << {"story"=>f['raw_attributes']['story']}
end
render :json=>{"success"=>true,"count"=>feed.count,"feed"=>output}.to_json
else
render :json=>{"success"=>false,"message"=>"User is not connected to facebook."}.to_json
end
end
def disconnect
user_fb = current_user.facebook
if user_fb
user_fb.destroy
end
render :json=>{"success"=>true}.to_json
end
def profile_import
temp_user = User.find(params[:user_id])
fb = temp_user.facebook rescue nil
if fb
@url = "#{@@facebook_server}/profile_import?identifier=" + fb.fb_identifier
uri = URI.parse(@url)
http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Get.new(uri.request_uri)
response = http.request(request)
friends = response.body
data = JSON.parse(friends)
if data["success"]
user = JSON.parse(data["user"])
u = User.find(temp_user.id)
firstname = {}
lastname = {}
@site_valid_locales.each do |locale|
firstname[locale] = user["first_name"]
lastname[locale] = user["last_name"]
end
u.first_name_translations = firstname
u.last_name_translations = lastname
u.office_tel = user["phone"]
u.sex = user["gender"] || "unknown"
u.remote_avatar_url = user["picture"] if user["picture"]
if u.save
render :json=>{"success"=>true,"user"=>user}.to_json
else
render :json=>{"success"=>false,"message"=>"There was an error imporing data."}.to_json
end
else
render :json=>{"success"=>false,"message"=>data["message"]}.to_json
end
else
render :json=>{"success"=>false,"message"=>"User is not connected to facebook."}.to_json
end
end
def server_redirect
@url = "#{@@facebook_server}/login?callback=#{request.protocol}#{request.host_with_port}/facebook/register_fb?user="+params[:user_id] rescue nil
if !@url.nil?
redirect_to @url
else
render :layout=> "devise"
end
end
end

View File

@ -20,7 +20,7 @@ class UsersController < ApplicationController
def confirm_user
user = User.confirm_email(params[:token])
redirect_to post_confirmation_users_path
redirect_to users_path(:user_id => user.id.to_s)
if user[:success].eql?("true")
flash[:notice] = "You have confirmed successfully"
else
@ -28,7 +28,55 @@ class UsersController < ApplicationController
end
end
def post_confirmation
def index
if params[:user_id].nil?
redirect_to "/users/sign_up"
end
@user = User.find(params[:user_id])
end
def form_page
@user = User.find(params[:user_id])
@member_profile = @user.member_profile
end
def basic_info_update
@user = User.find(params[:id])
member_profile = @user.member_profile
if member_profile.update_attributes(basic_info_params)
redirect_to users_role_page_path(:user_id => @user.id.to_s)
else
render :action=> "form_page"
end
end
def role_page
@roles = []
# @roles = Role.where(:disabled => false)
@user_id = params[:user_id]
end
def role_update
user = User.find(params[:id])
member_profile = user.member_profile
if member_profile.update_attributes(params[:user])
redirect_to "/users/sign_in"
else
@roles = []
# @roles = Role.where(:disabled => false)
render :action => "role_page"
end
end
def check_availability
response = {}
case params[:type]
when "user_id"
response["success"] = User.where(:user_id => params[:value]).count > 0 ? false : true
when "user_email"
response["success"] = User.where(:email => params[:value]).count > 0? false : true
end
render :json => response.to_json
end
private
@ -37,4 +85,8 @@ class UsersController < ApplicationController
def user_params
params.require(:user).permit(:password, :password_confirmation, :user_name, :member_profile_id, :email, :first_name, :last_name)
end
def basic_info_params
params.require(:member_profile).permit!
end
end

View File

@ -63,7 +63,6 @@ module OrbitHelper
widget_categories = widget.categories
finalpage = nil
pages.each do |p|
Rails.logger.info "*********************************" + p.name
if p.categories == widget_categories
finalpage = p
end

9
app/models/Facebook.rb Normal file
View File

@ -0,0 +1,9 @@
class Facebook
include Mongoid::Document
include Mongoid::Timestamps
field :fb_identifier
field :connected, type: Boolean
belongs_to :user
end

View File

@ -4,7 +4,7 @@ class MemberProfile
field :first_name, type: String, localize: true
field :last_name, type: String, localize: true
field :gender
field :sex
field :sid
field :office_tel
field :birthday, type: DateTime

View File

@ -8,6 +8,7 @@ class User
field :password_digest, type: String
field :confirmation_token, type: String
field :reset_token, type: String
field :approved, type: Boolean, :default => false
has_many :assets
has_many :user_actions, :dependent => :destroy
@ -18,6 +19,8 @@ class User
belongs_to :workgroup
has_many :authorizations
belongs_to :member_profile
has_one :facebook, :autosave => true, :dependent => :destroy
validates :user_name, presence: true, uniqueness: true
validates :password, presence: true, :on => :create, length: {:in => 8..20}

View File

@ -0,0 +1,12 @@
<%= stylesheet_link_tag "sign_up" %>
<section id="main-wrap">
<div class="sign-up have-other-sign-in">
<div class="form">
<h3 class="login-logo">Error</h3>
<div class="option-block">
<div class="option-block msg">There was a problem in getting your user info, please try again later.</div>
<a href="javascript:void(0);" onclick="window.close();">Close Window</a>
</div>
</div>
</section>

View File

@ -0,0 +1,130 @@
<%#= devise_error_messages! %>
<input type="hidden" value="<%= @user.id.to_s %>" name="id" />
<div class="attributes">
<div class="attributes-header clearfix">
<h4><%=t(:sys_basic_form)%></h4>
</div>
<div class="attributes-body">
<!-- Avatar -->
<div class="control-group">
<%= f.label t("users.avatar"),:class=>"control-label muted" %>
<div class="controls">
<!-- if this page editing please add class "fileupload-edit" -->
<div class="fileupload fileupload-new clearfix <%= 'fileupload-edit' if @member_profile.avatar.file rescue nil %>" data-provides="fileupload">
<div class="fileupload-new thumbnail pull-left">
<% if !@member_profile.nil? %>
<%= image_tag(@member_profile.avatar.thumb.url) if !@member_profile.avatar.nil? %>
<% else %>
<%= image_tag "person.png" %>
<% end %>
</div>
<div class="fileupload-preview fileupload-exists thumbnail pull-left"></div>
<span class="btn btn-file">
<span class="fileupload-new"><%= t(:select_image) %></span>
<span class="fileupload-exists"><%= t(:change) %></span>
<%= f.file_field :avatar %>
</span>
<a href="#" class="btn fileupload-exists" data-dismiss="fileupload"><%= t(:cancel) %></a>
</div>
</div>
</div>
<!-- First Name -->
<div class="control-group">
<%= f.label t("users.first_name"),{:class=>"control-label muted", :func=>"field_label"} %>
<div class="controls add-input">
<div class="add-target">
<div class="input-append">
<div class="tab-content">
<% @site_in_use_locales.each_with_index do |locale, i| %>
<div class="tab-pane fade <%= ( i == 0 ) ? "active in" : '' %>" id="first_name_<%= locale %>">
<%= f.fields_for :first_name_translations do |f| %>
<%= f.text_field locale, :value => (@member_profile.first_name_translations[locale] rescue nil), :placeholder=>"#{t("users.first_name")}" %>
<% end %>
</div>
<% end %>
</div>
<div class="btn-group" data-toggle="buttons-radio">
<% @site_in_use_locales.each_with_index do |locale, i| %>
<a class="btn <%= ( i == 0 ) ? "active" : '' %>" href="#first_name_<%= locale %>" data-toggle="tab"><%= t(locale.to_s) %></a>
<% end %>
</div>
</div>
</div>
</div>
</div>
<!-- Last Name -->
<div class="control-group">
<%= f.label t("users.last_name"),{:class=>"control-label muted", :func=>"field_label"} %>
<div class="controls add-input">
<div class="add-target">
<div class="input-append">
<div class="tab-content">
<% @site_in_use_locales.each_with_index do |locale, i| %>
<div class="tab-pane fade <%= ( i == 0 ) ? "active in" : '' %>" id="last_name_<%= locale %>">
<%= f.fields_for :last_name_translations do |f| %>
<%= f.text_field locale, :value => (@member_profile.member_profile.last_name_translations[locale] rescue nil), :placeholder=>"#{t("users.last_name")}" %>
<% end %>
</div>
<% end %>
</div>
<div class="btn-group" data-toggle="buttons-radio">
<% @site_in_use_locales.each_with_index do |locale, i| %>
<a class="btn <%= ( i == 0 ) ? "active" : '' %>" href="#last_name_<%= locale %>" data-toggle="tab"><%= t(locale.to_s) %></a>
<% end %>
</div>
</div>
</div>
</div>
</div>
<!-- Mail -->
<div class="control-group">
<%= f.label t("users.email"),:class=>"control-label muted" %>
<div class="controls add-input">
<%= f.email_field :email %>
</div>
</div>
<!-- ID Number -->
<div class="control-group">
<%= f.label t("users.sid"),:class=>"control-label muted" %>
<div class="controls add-input">
<%= f.text_field :sid %>
<span class="help-block"><%= t("users.sid_note")%></span>
</div>
</div>
<!-- Office Tel Number -->
<div class="control-group">
<%= f.label t("users.office_tel"),:class=>"control-label muted" %>
<div class="controls add-input">
<%= f.text_field :office_tel %>
<span class="help-block"><%= t("users.office_tel_note")%></span>
</div>
</div>
<!-- Gender -->
<div class="control-group">
<%= f.label t("users.sex"),:class=>"control-label muted" %>
<div class="controls">
<label class="radio inline">
<%= f.radio_button :sex, "male" %><%= t('users.male')%>
</label>
<label class="radio inline">
<%= f.radio_button :sex, "female" %><%= t('users.female')%>
</label>
<label class="radio inline">
<%= f.radio_button :sex, "unknown" %><%= t('users.unknown')%>
</label>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,14 @@
<section id="main-wrap">
<div class="sign-up have-other-sign-in facebook-form">
<div class="form">
<h3 class="login-logo">Thank you for registering.</h3>
<div class="form-block">
<div class="form-list clearfix option-block">
<div class="alert alert-success">We have sent you a confirmation email on your email id. Please confirm to proceed</div>
<a href="<%= root_path %>">Home</a>
</div>
</div>
</div>
</div>
</section>

View File

@ -0,0 +1,35 @@
<% content_for :page_specific_css do -%>
<%= stylesheet_link_tag "lib/wrap-nav.css" %>
<%= stylesheet_link_tag "lib/pageslide.css" %>
<%= stylesheet_link_tag "lib/main-forms.css" %>
<%= stylesheet_link_tag "lib/fileupload.css" %>
<%= stylesheet_link_tag "lib/togglebox.css" %>
<% end -%>
<% content_for :page_specific_javascript do -%>
<%= javascript_include_tag "lib/jquery-ui-1.10.3.custom.min.js" %>
<%= javascript_include_tag "lib/jquery.tmpl.min.js" %>
<%= javascript_include_tag "lib/bootstrap-fileupload.js" %>
<%= javascript_include_tag "lib/bootstrap-datetimepicker.js" %>
<%= javascript_include_tag "lib/datetimepicker/date.time.picker.js" %>
<%= javascript_include_tag "lib/member/textarea-lang-btn.js" %>
<%= javascript_include_tag "lib/member/role-forms.js" %>
<% end -%>
<%= form_for @member_profile, :url => users_basic_info_update_path, :html => { :multipart => true , :class=>"form-horizontal main-forms", :id=>"user-forms"} do |f| %>
<fieldset>
<div id="basic-area" class="input-area">
<%#= f.error_messages %>
<%= render :partial => 'form_page', :locals => {:f => f}%>
</div>
<div class="form-actions">
<input type="submit" value="Next" class="btn btn-primary" />
</div>
</fieldset>
<% end -%>

View File

@ -0,0 +1,59 @@
<section id="main-wrap">
<div class="sign-up have-other-sign-in facebook-form">
<div class="form">
<h3 class="login-logo">Please select a method for Basic Info</h3>
<div class="option-block">
<a href="<%= users_form_path(:user_id=>@user.id.to_s) %>" class="btn btn-info btn-large">Form</a>
<div class="or">
<div class="line left"></div>
<span>OR</span>
<div class="line right"></div>
</div>
<a href="javascript:void(0);" class="facebook"><img src="assets/facebook-logo.png" /></a>
</div>
<div class="option-block msg alert hide"><h4></h4><br /><a href="<%= users_role_page_path(:user_id => @user.id.to_s) %>" class="btn btn-primary hide">Next</a></div>
</div>
</div>
</section>
<script type="text/javascript">
(function(){
var facebookWindow = null,
timeInterval = null;
$("a.facebook").click(function(){
facebookWindow = window.open('<%= facebook_server_path(:user_id=>@user.id.to_s) %>','login_window','height=668,width=1124,titlebar=0,statusbar=0,location=0');
clearInterval(timeInterval);
timeInterval = setInterval(function(){
if( facebookWindow.closed ){
clearInterval(timeInterval);
$(".msg").removeClass('hide alert-danger').find("h4").text("Importing,please wait...");
$.ajax({
url : "/facebook/profile_import",
data : {"user_id":"<%= @user.id.to_s %>"},
type : "get",
dataType : "json",
success : function(data){
if(!data.success){
$(".msg").removeClass('hide').addClass('alert-danger').find("h4").text(data.message);
}else{
var msg = "";
if (data.user.first_name){
msg+= "Welcome " + data.user.first_name + ", your data is successfully imported!"
}else{
msg = "Import Succesfull!"
}
$(".msg").removeClass('hide').addClass('alert-success').find("h4").text(msg);
$(".msg a").removeClass('hide');
}
},
error : function(){
$(".msg").removeClass('hide').addClass('alert-danger').find("h4").text("Error connecting the server!");
}
})
}
},1000);
})
})()
</script>

View File

@ -0,0 +1,26 @@
<section id="main-wrap">
<div class="sign-up have-other-sign-in">
<div class="form">
<h3 class="login-logo">Please select a role</h3>
<div class="form-block">
<div class="form-list clearfix option-block">
<form action="<%= users_role_update_path %>" method="post">
<label>Roles</label>
<div class="control-group clear">
<% @roles.each do |role| %>
<input type="checkbox" name="member_profile[role_ids][]" value="<%= role.id.to_s %>" />
<label class="role-label">
<%= role.title %>
</label>
<% end %>
<input type="hidden" name="id" value="<%= @user_id %>"
</div>
<h3 class="line"></h3>
<input type="submit" value="Finish" class="btn btn-primary pull-right" />
</form>
</div>
</div>
</div>
</div>
</section>

View File

@ -40,6 +40,13 @@ Orbit::Application.routes.draw do
scope "(:locale)", locale: Regexp.new(locales.join("|")) do
get 'users/form' => "users#form_page"
get 'users/role_page' => "users#role_page"
get 'users/check_availability' => "users#check_availability"
get 'users/confirmation' => "users#confirmation"
post 'users/role_update' => "users#role_update"
post 'users/basic_info_update' => "users#basic_info_update"
resources :users do
collection do
get 'confirm_user'
@ -47,6 +54,18 @@ Orbit::Application.routes.draw do
end
end
# Facebook routes
post "/facebook/register_fb" => "facebook#register_fb"
get "/facebook/get_friends" => "facebook#get_friends"
get "/facebook/get_feed" => "facebook#get_feed"
post "/facebook/disconnect" => "facebook#disconnect"
get "/facebook/server" => "facebook#server_redirect"
get "/facebook/profile_import" => "facebook#profile_import"
resources :passwords
namespace :admin do