headstart 0.7.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -13,7 +13,7 @@ begin
13
13
  gem.authors = ["Bran Burridge"]
14
14
  gem.files = FileList["[A-Z]*", "{app,config,generators,lib,shoulda_macros,rails}/**/*"]
15
15
 
16
- gem.add_dependency "mini_fb", '=0.2.2'
16
+ gem.add_dependency "mini_fb", '=1.1.3'
17
17
  gem.add_dependency "delayed_job", '=1.8.4'
18
18
  gem.add_dependency "mad_mimi_mailer", '=0.0.7'
19
19
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.7.0
1
+ 0.8.0
@@ -6,6 +6,7 @@ class Headstart::SessionsController < ApplicationController
6
6
  filter_parameter_logging :password
7
7
 
8
8
  def new
9
+ @oauth_url = MiniFB.oauth_url(Headstart.configuration.facebook_app_id, get_full_app_path + "/sessions/create", :scope=>MiniFB.scopes.join(","))
9
10
  render :template => 'sessions/new'
10
11
  end
11
12
 
@@ -13,8 +14,7 @@ class Headstart::SessionsController < ApplicationController
13
14
  @user = if params[:session]
14
15
  ::User.authenticate(params[:session][:email], params[:session][:password])
15
16
  else
16
- ::User.find_facebook_user(cookies[Headstart.configuration.facebook_api_key + "_session_key"],
17
- cookies[Headstart.configuration.facebook_api_key + "_user"])
17
+ ::User.find_facebook_user(params['code'], get_full_app_path)
18
18
  end
19
19
 
20
20
  if @user.nil?
@@ -23,8 +23,9 @@ class Headstart::SessionsController < ApplicationController
23
23
  else
24
24
  if @user.email_confirmed?
25
25
  flash_success_after_create
26
- else
26
+ elsif @user.email_confirmation_sent_at.blank?
27
27
  ::HeadstartMailer.deliver_welcome(@user)
28
+ @user.update_attribute(:email_confirmation_sent_at, Time.now)
28
29
  flash_notice_after_create
29
30
  end
30
31
  sign_in(@user)
@@ -1,5 +1,5 @@
1
1
  class GenericMailer < ActionMailer::Base
2
-
2
+
3
3
  def change_password(user)
4
4
  from Headstart.configuration.mailer_sender
5
5
  recipients user.email
@@ -9,6 +9,7 @@ class GenericMailer < ActionMailer::Base
9
9
  body :url => edit_user_password_url(user,
10
10
  :token => user.password_reset_token,
11
11
  :escape => false)
12
+ content_type "text/html"
12
13
  end
13
14
 
14
15
  def welcome(user)
@@ -18,14 +19,7 @@ class GenericMailer < ActionMailer::Base
18
19
  :scope => [:headstart, :models, :headstart_mailer],
19
20
  :default => "Welcome")
20
21
  body :user => user
22
+ content_type "text/html"
21
23
  end
22
24
 
23
- def confirmation(user)
24
- from Headstart.configuration.mailer_sender
25
- recipients user.email
26
- subject I18n.t(:confirmation,
27
- :scope => [:headstart, :models, :headstart_mailer],
28
- :default => "Account confirmation")
29
- body :user => user
30
- end
31
25
  end
@@ -27,18 +27,14 @@
27
27
  <%= link_to "Forgot password?", new_password_path %>
28
28
 
29
29
  <%= form.submit "Sign in", :disable_with => "Please wait..." %>
30
- <%- if Headstart.configuration.use_facebook_connect -%>
31
- or <fb:login-button onlogin="facebook_onlogin();" length="long" v="2" size="large"></fb:login-button>
32
- <%- end -%>
30
+
33
31
  </div>
34
32
  <% end %>
35
33
 
36
34
 
37
-
38
35
  <%- if Headstart.configuration.use_facebook_connect -%>
39
- <script type="text/javascript">
40
- FB.init("<%= Headstart.configuration.facebook_api_key %>", "xd_receiver.html", {
41
- permsToRequestOnConnect : "email",
42
- });
43
- </script>
36
+ <div style="margin-top:20px">
37
+ <%= link_to image_tag("facebook_login.png"), @oauth_url %>
38
+ </div>
44
39
  <%- end -%>
40
+
@@ -11,6 +11,7 @@
11
11
  <%= form.label :last_name %>
12
12
  <%= form.text_field :last_name %>
13
13
  </p>
14
+ <%- if current_user.blank? || current_user.facebook_uid.blank? -%>
14
15
  <p class="password_field">
15
16
  <%= form.label :password %>
16
17
  <%= form.password_field :password %>
@@ -19,3 +20,8 @@
19
20
  <%= form.label :password_confirmation, "Confirm password" %>
20
21
  <%= form.password_field :password_confirmation %>
21
22
  </p>
23
+ <% end %>
24
+ <p class="text_field">
25
+ <%= form.label :avatar %>
26
+ <input id="photo" name="user[avatar]" type="file"/>
27
+ </p>
@@ -1,7 +1,7 @@
1
1
  <% content_for :title do %>Edit My Profile<% end %>
2
2
  <h2>Edit My Profile</h2>
3
3
 
4
- <% form_for @user do |form| %>
4
+ <% form_for @user, :html => { :enctype => "multipart/form-data"} do |form| %>
5
5
  <%= render :partial => '/users/form', :object => form %>
6
6
  <%= form.submit 'Save', :disable_with => 'Please wait...' %>
7
7
  <% end %>
@@ -1,7 +1,7 @@
1
1
  <% content_for :title do %>Sign up<% end %>
2
2
  <h2>Sign up</h2>
3
3
 
4
- <% form_for @user do |form| %>
4
+ <% form_for @user, :html => { :enctype => "multipart/form-data"} do |form| %>
5
5
  <%= render :partial => '/users/form', :object => form %>
6
6
  <%= form.submit 'Sign up', :disable_with => 'Please wait...' %>
7
7
  <% end %>
@@ -1,8 +1,10 @@
1
1
  <h2>My Profile</h2>
2
2
 
3
+ <%= image_tag avatar_url(@user) %>
4
+
3
5
  <div id="user_profile">
4
6
  <b>First Name:</b> <%=h @user.first_name %><br/>
5
7
  <b>Last Name:</b> <%=h @user.last_name %><br/>
6
8
  <b>Email:</b> <%=h @user.email %><br/>
7
- <%= link_to 'Edit', edit_user_path(@user) %>
9
+ <% if signed_in? && current_user.id == @user.id %><%= link_to 'Edit', edit_user_path(current_user) %><% end %>
8
10
  </div>
@@ -40,6 +40,8 @@ class HeadstartGenerator < Rails::Generator::Base
40
40
  return content
41
41
  end'
42
42
 
43
+ m.file "app/helpers/users_helper.rb", "app/helpers/users_helper.rb"
44
+
43
45
  m.directory File.join("public", "stylesheets")
44
46
  m.file "style.css", "public/stylesheets/style.css"
45
47
  m.file "report.css", "public/stylesheets/report.css"
@@ -1,7 +1,7 @@
1
1
  <!-- Woopra Code Start -->
2
2
  <script type="text/javascript" src="//static.woopra.com/js/woopra.v2.js"></script>
3
3
  <script type="text/javascript">
4
- <% if logged_in? %>
4
+ <% if signed_in? %>
5
5
  woopraTracker.addVisitorProperty("name", '<%= current_user.name %>');
6
6
  woopraTracker.addVisitorProperty("email", '<%= current_user.email %>');
7
7
  <% end %>
@@ -0,0 +1,10 @@
1
+ module UsersHelper
2
+
3
+ def avatar_url(user)
4
+ if user.facebook_uid.present?
5
+ return "http://graph.facebook.com/#{user.facebook_uid}/picture?type=square"
6
+ else
7
+ return user.avatar.url(:thumb)
8
+ end
9
+ end
10
+ end
@@ -76,8 +76,8 @@
76
76
 
77
77
  <% if ENV["RAILS_ENV"] == "production" %>
78
78
  <% if Settings.woopra.present? %><%= render :partial => 'layouts/woopra' %><% end %>
79
- <% if Settings.google_analytics.present? %><%= render :partial => 'layouts/google_analytics' %>
79
+ <% if Settings.google_analytics.present? %><%= render :partial => 'layouts/google_analytics' %><% end %>
80
80
  <% end %>
81
-
81
+ <!-- $zendesk -->
82
82
  </body>
83
83
  </html>
@@ -11,6 +11,7 @@ begin
11
11
  config.use_delayed_job = configuration[:use_delayed_job]
12
12
  config.facebook_api_key = configuration[:facebook_api_key]
13
13
  config.facebook_secret_key = configuration[:facebook_secret_key]
14
+ config.facebook_app_id = configuration[:facebook_app_id]
14
15
  end
15
16
 
16
17
  if configuration[:madmimi_username].present? && configuration[:madmimi_api_key].present?
@@ -15,31 +15,45 @@
15
15
  #
16
16
 
17
17
  development:
18
- mailer_sender: donotreply@example.com
18
+ mailer_sender: $mailer_sender
19
19
  madmimi_username:
20
20
  madmimi_api_key:
21
21
  impersonation_hash:
22
- use_facebook_connect: false
22
+ use_facebook_connect: $use_facebook_connect
23
23
  use_delayed_job: $delayed_job
24
- facebook_api_key:
25
- facebook_secret_key:
24
+ facebook_api_key: $facebook_api_key
25
+ facebook_secret_key: $facebook_secret_key
26
+ facebook_app_id: $facebook_app_id
26
27
 
28
+ staging:
29
+ mailer_sender: $mailer_sender
30
+ madmimi_username:
31
+ madmimi_api_key:
32
+ impersonation_hash:
33
+ use_facebook_connect: $use_facebook_connect
34
+ use_delayed_job: $delayed_job
35
+ facebook_api_key: $facebook_api_key
36
+ facebook_secret_key: $facebook_secret_key
37
+ facebook_app_id: $facebook_app_id
38
+
27
39
  test:
28
- mailer_sender: donotreply@example.com
40
+ mailer_sender: $mailer_sender
29
41
  madmimi_username:
30
42
  madmimi_api_key:
31
43
  impersonation_hash:
32
- use_facebook_connect: false
44
+ use_facebook_connect: $use_facebook_connect
33
45
  use_delayed_job: $delayed_job
34
- facebook_api_key:
35
- facebook_secret_key:
46
+ facebook_api_key: $facebook_api_key
47
+ facebook_secret_key: $facebook_secret_key
48
+ facebook_app_id: $facebook_app_id
36
49
 
37
50
  production:
38
- mailer_sender: donotreply@example.com
51
+ mailer_sender: $mailer_sender
39
52
  madmimi_username:
40
53
  madmimi_api_key:
41
54
  impersonation_hash:
42
- use_facebook_connect: false
55
+ use_facebook_connect: $use_facebook_connect
43
56
  use_delayed_job: $delayed_job
44
- facebook_api_key:
45
- facebook_secret_key:
57
+ facebook_api_key: $facebook_api_key
58
+ facebook_secret_key: $facebook_secret_key
59
+ facebook_app_id: $facebook_app_id
@@ -12,6 +12,13 @@ class HeadstartCreateUsers < ActiveRecord::Migration
12
12
  t.string :password_reset_token, :limit => 128
13
13
  t.string :confirmation_token, :limit => 128
14
14
  t.boolean :email_confirmed, :default => false, :null => false
15
+ t.boolean :email_confirmation_sent_at, :datetime
16
+
17
+ t.string :avatar_file_name
18
+ t.string :avatar_content_type
19
+ t.integer :avatar_file_size
20
+ t.datetime :avatar_updated_at
21
+
15
22
  t.timestamps
16
23
  end
17
24
 
@@ -1,3 +1,7 @@
1
1
  class User < ActiveRecord::Base
2
2
  include Headstart::User
3
+
4
+ # If we don't want the originals, add , :original => "1x1"
5
+ has_attached_file :avatar, :styles => { :thumb => "50x50#", :mid => "200x300" }, :storage => :s3, :s3_credentials => "#{RAILS_ROOT}/config/s3.yml",
6
+ :path => ":class/:id/:style.:extension", :default_url => "/images/missing.jpg"
3
7
  end
@@ -9,16 +9,23 @@ module Headstart
9
9
  module ClassMethods
10
10
  def self.extended(controller)
11
11
  controller.helper_method :current_user, :signed_in?,
12
- :signed_out?, :impersonating?
12
+ :signed_out?, :impersonating?,
13
+ :get_full_app_path
13
14
  controller.hide_action :current_user, :current_user=,
14
15
  :signed_in?, :signed_out?,
15
16
  :sign_in, :sign_out,
16
17
  :authenticate, :deny_access,
17
- :impersonating?
18
+ :impersonating?, :get_full_app_path
18
19
  end
19
20
  end
20
21
 
21
22
  module InstanceMethods
23
+
24
+
25
+ def get_full_app_path
26
+ return "http://" + APP_CONFIG[:domain]
27
+ end
28
+
22
29
  # User in the current cookie
23
30
  #
24
31
  # @return [User, nil]
@@ -97,7 +104,7 @@ module Headstart
97
104
 
98
105
 
99
106
  protected
100
-
107
+
101
108
  def user_from_cookie
102
109
  if token = cookies[:remember_token]
103
110
  ::User.find_by_remember_token(token)
@@ -5,6 +5,7 @@ module Headstart
5
5
  attr_accessor :use_facebook_connect
6
6
  attr_accessor :facebook_api_key
7
7
  attr_accessor :facebook_secret_key
8
+ attr_accessor :facebook_app_id
8
9
  attr_accessor :use_delayed_job
9
10
 
10
11
  def initialize
@@ -250,24 +250,24 @@ module Headstart
250
250
  return user if user.authenticated?(password)
251
251
  end
252
252
 
253
- def find_facebook_user(facebook_session, facebook_uid)
254
- return nil unless Headstart.configuration.use_facebook_connect && facebook_session && facebook_uid
255
-
253
+ def find_facebook_user(facebook_code, full_app_path)
254
+ return nil unless Headstart.configuration.use_facebook_connect && facebook_code
255
+
256
256
  begin
257
- facebook_user = MiniFB::Session.new(Headstart.configuration.facebook_api_key,
258
- Headstart.configuration.facebook_secret_key,
259
- facebook_session, facebook_uid).user
257
+ access_token_hash = MiniFB.oauth_access_token(Headstart.configuration.facebook_app_id, full_app_path + "/sessions/create", Headstart.configuration.facebook_secret_key, facebook_code)
258
+ @response_hash = MiniFB.get(access_token_hash['access_token'], 'me', :type=> nil, :metadata=>true)
259
+ @response_hash["user"] == @response_hash.user
260
260
  rescue MiniFB::FaceBookError
261
- facebook_user = nil
261
+ @response_hash = nil
262
262
  end
263
- return nil unless facebook_user
264
-
265
- user = ::User.find_by_facebook_uid(facebook_uid) || ::User.find_by_email(facebook_user['email']) || ::User.new
263
+ return nil unless @response_hash
264
+
265
+ user = ::User.find_by_facebook_uid(@response_hash['id']) || ::User.find_by_email(@response_hash['email']) || ::User.new
266
266
  user.tap do |user|
267
- user.facebook_uid = facebook_uid
268
- user.email = facebook_user['email']
269
- user.first_name = facebook_user['first_name']
270
- user.last_name = facebook_user['last_name']
267
+ user.facebook_uid = @response_hash['id']
268
+ user.email = @response_hash['email']
269
+ user.first_name = @response_hash['first_name']
270
+ user.last_name = @response_hash['last_name']
271
271
  user.save
272
272
  end
273
273
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: headstart
3
3
  version: !ruby/object:Gem::Version
4
- hash: 3
4
+ hash: 63
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 7
8
+ - 8
9
9
  - 0
10
- version: 0.7.0
10
+ version: 0.8.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Bran Burridge
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-09-22 00:00:00 -04:00
18
+ date: 2010-10-11 00:00:00 -04:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -26,12 +26,12 @@ dependencies:
26
26
  requirements:
27
27
  - - "="
28
28
  - !ruby/object:Gem::Version
29
- hash: 19
29
+ hash: 21
30
30
  segments:
31
- - 0
32
- - 2
33
- - 2
34
- version: 0.2.2
31
+ - 1
32
+ - 1
33
+ - 3
34
+ version: 1.1.3
35
35
  type: :runtime
36
36
  version_requirements: *id001
37
37
  - !ruby/object:Gem::Dependency
@@ -125,6 +125,7 @@ files:
125
125
  - generators/headstart/templates/add.png
126
126
  - generators/headstart/templates/app/controllers/sessions_controller.rb
127
127
  - generators/headstart/templates/app/helpers/application_helper.rb
128
+ - generators/headstart/templates/app/helpers/users_helper.rb
128
129
  - generators/headstart/templates/app/views/sessions/index.html.erb
129
130
  - generators/headstart/templates/application.html.erb
130
131
  - generators/headstart/templates/application_edit.png