citygate 0.0.4 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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