citygate 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. data/README.rdoc +66 -1
  2. data/Rakefile +0 -1
  3. data/app/assets/javascripts/citygate/admin_users.coffee +1 -13
  4. data/app/assets/javascripts/citygate/application.js +3 -2
  5. data/app/assets/javascripts/citygate/jquery.pjax.js +688 -0
  6. data/app/controllers/citygate/admin/application_controller.rb +9 -1
  7. data/app/controllers/citygate/admin/users_controller.rb +1 -1
  8. data/app/controllers/citygate/application_controller.rb +2 -0
  9. data/app/controllers/citygate/users/omniauth_callbacks_controller.rb +10 -8
  10. data/app/controllers/citygate/users_controller.rb +2 -2
  11. data/app/models/citygate/user.rb +8 -1
  12. data/app/views/citygate/admin/users/index.html.erb +12 -1
  13. data/app/views/citygate/admin/users/show.html.erb +4 -2
  14. data/app/views/citygate/shared/_navigation.html.erb +2 -1
  15. data/app/views/citygate/users/show.html.erb +13 -2
  16. data/app/views/{citygate/devise → devise}/_links.erb +0 -0
  17. data/app/views/devise/registrations/edit.html.erb +32 -0
  18. data/app/views/devise/registrations/new.html.erb +18 -0
  19. data/app/views/layouts/admin/application.html.erb +1 -0
  20. data/config/accounts.yml +5 -0
  21. data/config/initializers/01_load_config.rb +1 -0
  22. data/config/initializers/devise.rb +22 -12
  23. data/config/routes.rb +9 -4
  24. data/lib/citygate/engine.rb +15 -1
  25. data/lib/citygate/version.rb +1 -1
  26. data/lib/gravatar.rb +8 -0
  27. metadata +67 -57
  28. data/app/assets/javascripts/citygate/global.coffee +0 -14
  29. data/app/views/citygate/admin/users/_user_show.html.erb +0 -2
  30. data/app/views/citygate/admin/users/_users.html.erb +0 -12
  31. data/app/views/citygate/admin/users/index.js.erb +0 -1
  32. data/app/views/citygate/admin/users/show.js.erb +0 -1
  33. data/app/views/citygate/devise/registrations/edit.html.haml +0 -31
@@ -21,4 +21,6 @@ class Citygate::ApplicationController < ::ApplicationController
21
21
  def stored_location_for(resource_or_scope)
22
22
  root_url
23
23
  end
24
+
25
+ Devise.omniauth_path_prefix = "#{Citygate::Engine.mount_path}/users/auth".squeeze "/"
24
26
  end
@@ -1,13 +1,18 @@
1
+ # @author Zamith
2
+ # Encapsulates all the omniauth authorization logic
1
3
  class Citygate::Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
2
4
 
5
+ # Authorize user with his facebook account
3
6
  def facebook
4
7
  oauthorize "Facebook"
5
8
  end
6
9
 
10
+ # Authorize user with his google (openid) account
7
11
  def google
8
12
  oauthorize "Google"
9
13
  end
10
14
 
15
+ # In case of error renders 404
11
16
  def passthru
12
17
  render :file => "#{Rails.root}/public/404.html", :status => 404, :layout => false
13
18
  end
@@ -15,7 +20,8 @@ class Citygate::Users::OmniauthCallbacksController < Devise::OmniauthCallbacksCo
15
20
  private
16
21
 
17
22
  def oauthorize(kind)
18
- @user = find_for_ouath(kind, request.env["omniauth.auth"], current_user)
23
+ current_user ||= (params[:user]) ? Citygate::User.find(params[:user]) : nil
24
+ @user = find_for_oauth(kind, request.env["omniauth.auth"], current_user)
19
25
  if @user.persisted?
20
26
  flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => kind
21
27
  session["devise.#{kind.downcase}_data"] = request.env["omniauth.auth"]
@@ -26,7 +32,7 @@ class Citygate::Users::OmniauthCallbacksController < Devise::OmniauthCallbacksCo
26
32
  end
27
33
  end
28
34
 
29
- def find_for_ouath(provider, access_token, resource=nil)
35
+ def find_for_oauth(provider, access_token, resource=nil)
30
36
  user, email, name, uid, auth_attr = nil, nil, nil, {}
31
37
  case provider
32
38
  when "Facebook"
@@ -50,7 +56,7 @@ class Citygate::Users::OmniauthCallbacksController < Devise::OmniauthCallbacksCo
50
56
  :name => access_token['info']['name'],
51
57
  }
52
58
  else
53
- raise 'Provider #{provider} not handled'
59
+ raise "Provider #{provider} not handled"
54
60
  end
55
61
  if resource.nil?
56
62
  if email
@@ -64,12 +70,8 @@ class Citygate::Users::OmniauthCallbacksController < Devise::OmniauthCallbacksCo
64
70
  else
65
71
  user = resource
66
72
  end
67
-
68
73
  auth = user.authorizations.find_by_provider(provider)
69
- if auth.nil?
70
- auth = user.authorizations.build(:provider => provider)
71
- user.authorizations << auth
72
- end
74
+ auth ||= user.authorizations.build(:provider => provider)
73
75
  auth.update_attributes auth_attr
74
76
 
75
77
  return user
@@ -1,7 +1,7 @@
1
- class Citygate::UsersController < ApplicationController
1
+ class Citygate::UsersController < Citygate::ApplicationController
2
2
  load_and_authorize_resource :class => "Citygate::User"
3
3
 
4
4
  def show
5
- @user = User.find(params[:id])
5
+ @providers = Citygate::User.omniauth_providers
6
6
  end
7
7
  end
@@ -20,7 +20,7 @@ module Citygate
20
20
  has_many :authorizations, :dependent => :destroy
21
21
  belongs_to :role
22
22
 
23
- # Get the json object for an user
23
+ # Get the json object for an user. Used by to_json.
24
24
  # @example
25
25
  # {
26
26
  # "email": "user@example.com",
@@ -28,6 +28,7 @@ module Citygate
28
28
  # "link": null,
29
29
  # "image": "https://secure.gravatar.com/avatar/b58996c504c5638798eb6b511e6f49af.png/rating=g"
30
30
  # }
31
+ # @return [Hash] the json object in the form of an hash
31
32
  def as_json(options = {})
32
33
  authorization = self.authorizations.first
33
34
  {
@@ -37,5 +38,11 @@ module Citygate
37
38
  image: (authorization.image_url if authorization) || self.gravatar_url
38
39
  }
39
40
  end
41
+
42
+ # Get the name if it is present or else get the email
43
+ # @return [String] the name or email of the user
44
+ def name_or_email
45
+ self.name || self.email
46
+ end
40
47
  end
41
48
  end
@@ -1,3 +1,14 @@
1
1
  <div id="users">
2
- <%= render "users" %>
2
+ <% @users.each do |user| %>
3
+ <div class="user">
4
+ <span class="email"><%= user.email %></span>
5
+ <%= content_tag(:span, user.name) if user.name %>
6
+ <div class="user-links">
7
+ <%= link_to "Show", admin_user_path(user), :class => "show-link" %>
8
+ <%= link_to "Edit", edit_admin_user_path(user), :class => "edit-link" if can? :update, user %>
9
+ </div>
10
+ </div>
11
+ <% end %>
12
+
13
+ <%= will_paginate @users %>
3
14
  </div>
@@ -1,2 +1,4 @@
1
- <p>User: <%= @user.name %></p>
2
- <p>Email: <%= @user.email if @user.email %></p>
1
+ <div id="user">
2
+ <p>User: <%= @user.name %></p>
3
+ <p>Email: <%= @user.email if @user.email %></p>
4
+ </div>
@@ -1,5 +1,6 @@
1
1
  <ul id="citygate-navigation">
2
2
  <% if user_signed_in? %>
3
+ <li><%= link_to('Profile', profile_path) %></li>
3
4
  <li><%= link_to('Edit account', edit_user_registration_path) %></li>
4
5
 
5
6
  <li><%= link_to('Log out', destroy_user_session_path, :method=>'delete') %></li>
@@ -9,7 +10,7 @@
9
10
  <li><%= link_to('Sign up', new_user_registration_path) %></li>
10
11
 
11
12
  <% Citygate::User.omniauth_providers.each do |provider| %>
12
- <li><%= link_to "Sign in with #{provider.to_s.titleize}", omniauth_authorize_path(Citygate::User.new, provider) %></li>
13
+ <li><%= link_to "Sign in with #{provider.to_s.titleize}", omniauth_authorize_path(Citygate::User.new, provider), :id => "#{provider.to_s}" %></li>
13
14
  <% end -%>
14
15
  <% end %>
15
16
 
@@ -1,3 +1,14 @@
1
- <p>User: <%= @user.name %></p>
1
+ <h2 class="name"><%= current_user.name_or_email %></h2>
2
2
 
3
- <p>Email: <%= @user.email if @user.email %></p>
3
+ <div id="social-accounts">
4
+ <% connected_providers = current_user.authorizations.map(&:provider) %>
5
+
6
+ <%= connected_providers %>
7
+ <% @providers.each do |provider| %>
8
+ <% class_str = "#{provider}-connect " %>
9
+ <% class_str += (connected_providers.include? provider.to_s.capitalize) ? "connected" : "can-connect" %>
10
+ <div class="<%= class_str %>" >
11
+ <%= link_to "#{provider.to_s.capitalize}", user_omniauth_authorize_path(provider,{user: current_user}) %>
12
+ </div>
13
+ <% end %>
14
+ </div>
File without changes
@@ -0,0 +1,32 @@
1
+ <h2>Edit Profile</h2>
2
+ <%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f| %>
3
+ <%= devise_error_messages! %>
4
+ <p>
5
+ <%= f.label :name %>
6
+ <%= f.text_field :name %>
7
+ </p>
8
+ <p>
9
+ <%= f.label :email %>
10
+ <%= f.email_field :email %>
11
+ </p>
12
+ <p>
13
+ <%= f.label :password %>
14
+ <%= f.password_field :password %>
15
+ <p class="hint">(leave blank if you don't want to change it)</p>
16
+ </p>
17
+ <p>
18
+ <%= f.label :password_confirmation %>
19
+ <%= f.password_field :password_confirmation %>
20
+ </p>
21
+ <p>
22
+ <%= f.label :current_password %>
23
+ <%= f.password_field :current_password %>
24
+ <p class="hint">(we need your current password to confirm your changes)</p>
25
+ </p>
26
+ <p><%= f.submit "Update" %></p>
27
+ <% end %>
28
+ <h3>Cancel my account</h3>
29
+ <p>
30
+ Unhappy? <%= link_to "Cancel my account", registration_path(resource_name), :data => { :confirm => "Are you sure?" }, :method => :delete %>.
31
+ </p>
32
+ <%= link_to "Back", :back %>
@@ -0,0 +1,18 @@
1
+ <h2>Sign up</h2>
2
+
3
+ <%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
4
+ <%= devise_error_messages! %>
5
+
6
+ <div><%= f.label :email %><br />
7
+ <%= f.email_field :email %></div>
8
+
9
+ <div><%= f.label :password %><br />
10
+ <%= f.password_field :password %></div>
11
+
12
+ <div><%= f.label :password_confirmation %><br />
13
+ <%= f.password_field :password_confirmation %></div>
14
+
15
+ <div><%= f.submit "Sign up" %></div>
16
+ <% end %>
17
+
18
+ <%= render :partial => "devise/shared/links" %>
@@ -12,6 +12,7 @@
12
12
  <% flash.each do |name, msg| %>
13
13
  <%= content_tag :div, msg, :id => "flash_#{name}" if msg.is_a?(String) %>
14
14
  <% end %>
15
+
15
16
  <div id="container" class="container">
16
17
  <%= yield %>
17
18
  </div>
@@ -0,0 +1,5 @@
1
+ facebook:
2
+ app_id: "387891007905465"
3
+ app_secret: "0cb143f301a74968289daf606b29dbec"
4
+ google:
5
+ identifier: "https://www.google.com/accounts/o8/id"
@@ -0,0 +1 @@
1
+ ACCOUNTS = YAML.load_file("#{Citygate.root}/config/accounts.yml") unless Rails.env.test?
@@ -205,15 +205,27 @@ Devise.setup do |config|
205
205
  # Add a new OmniAuth provider. Check the wiki for more information on setting
206
206
  # up on your models and hooks.
207
207
  # config.omniauth :github, 'APP_ID', 'APP_SECRET', :scope => 'user,public_repo'
208
- config.omniauth :facebook, "387891007905465", "0cb143f301a74968289daf606b29dbec",
209
- { :scope => 'email, offline_access' }
210
-
211
- require 'openid/store/filesystem'
212
- config.omniauth :open_id,
213
- :store => OpenID::Store::Filesystem.new('/tmp'),
214
- :name => 'google',
215
- :identifier => 'https://www.google.com/accounts/o8/id',
216
- :require => 'omniauth-openid'
208
+ unless Rails.env.test?
209
+ config.omniauth :facebook, ACCOUNTS['facebook']['app_id'], ACCOUNTS['facebook']['app_secret'],
210
+ { :scope => 'email, offline_access' }
211
+
212
+ require 'openid/store/filesystem'
213
+ config.omniauth :open_id,
214
+ :store => OpenID::Store::Filesystem.new('/tmp'),
215
+ :name => 'google',
216
+ :identifier => ACCOUNTS['google']['identifier'],
217
+ :require => 'omniauth-openid'
218
+ else
219
+ config.omniauth :facebook, "foo", "bar",
220
+ { :scope => 'email, offline_access' }
221
+
222
+ require 'openid/store/filesystem'
223
+ config.omniauth :open_id,
224
+ :store => OpenID::Store::Filesystem.new('/tmp'),
225
+ :name => 'google',
226
+ :identifier => "foobar",
227
+ :require => 'omniauth-openid'
228
+ end
217
229
 
218
230
 
219
231
  # ==> Warden configuration
@@ -225,7 +237,5 @@ Devise.setup do |config|
225
237
  # manager.default_strategies(:scope => :user).unshift :some_external_strategy
226
238
  # end
227
239
 
228
- Devise.setup do |config|
229
- config.router_name = :citygate
230
- end
240
+ config.router_name = :citygate
231
241
  end
data/config/routes.rb CHANGED
@@ -1,13 +1,18 @@
1
1
  Citygate::Engine.routes.draw do
2
2
  root :to => "home#index"
3
3
 
4
+ match "/user/profile" => "users#show", :as => "profile"
5
+
6
+ match '/confirm/:confirmation_token', :to => "devise/confirmations#show", :as => "user_confirm", :only_path => false
7
+
4
8
  devise_for :users,
5
- :controllers => { :omniauth_callbacks => "citygate/users/omniauth_callbacks" },
9
+ :controllers => {
10
+ :omniauth_callbacks => "citygate/users/omniauth_callbacks"
11
+ },
6
12
  :class_name => "Citygate::User",
7
13
  :module => :devise
8
- resources :users, :only => [:show]
9
-
10
- namespace "admin", constraints: { format: /(json|html|js| )/ } do
14
+
15
+ namespace "admin", constraints: { format: /(json|html| )/ } do
11
16
  resources :users
12
17
  end
13
18
 
@@ -2,7 +2,6 @@ require "rails"
2
2
 
3
3
  require "rubygems"
4
4
  require "devise"
5
- require "devise"
6
5
  require "devise_invitable"
7
6
  require "devise-encryptable"
8
7
  require 'omniauth'
@@ -12,6 +11,9 @@ require 'uuidtools'
12
11
  require 'will_paginate'
13
12
  require 'cancan'
14
13
 
14
+ # Make Devise "see" the changes made in the citygate appilication controller
15
+ Devise.parent_controller = "Citygate::ApplicationController"
16
+
15
17
  module Citygate
16
18
  def self.root
17
19
  File.expand_path '../../..', __FILE__
@@ -19,5 +21,17 @@ module Citygate
19
21
 
20
22
  class Engine < ::Rails::Engine
21
23
  isolate_namespace Citygate
24
+
25
+ mattr_accessor :will_paginate_options
26
+ @@will_paginate_options = {per_page: 1}
27
+
28
+ mattr_accessor :mount_path
29
+ @@mount_path = ""
30
+
31
+ def configure
32
+ yield self
33
+ end
22
34
  end
23
35
  end
36
+
37
+
@@ -1,3 +1,3 @@
1
1
  module Citygate
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
data/lib/gravatar.rb CHANGED
@@ -1,11 +1,19 @@
1
1
  require 'digest/md5'
2
2
 
3
+ # @author Zamith
4
+ # This module provides helper methods to be include in a class which has an email
5
+ # such as User
3
6
  module Gravatar
4
7
 
8
+ # Generates the gravatar id from the object's email
9
+ # @return [String] gravatar id
5
10
  def gravatar_id
6
11
  Digest::MD5.hexdigest(self.email.to_s.downcase)
7
12
  end
8
13
 
14
+ # Generates the full gravatar url for the user (always uses https)
15
+ # @param [Hash] options The only available option is the avatar rating you which to fetch
16
+ # @return [String] gravatar url
9
17
  def gravatar_url(options = { rating: 'g'})
10
18
  "https://secure.gravatar.com/avatar/#{self.gravatar_id}.png/rating=#{options[:rating]}"
11
19
  end