Refactor gemfile and upgrade rails, devise and other gems, fix conflicts, remove deprecations. Implement user classic registration and registration through omniauth OpenId. Allow user enter correct nickname and change other info during registration through OpenId. Make login through nickname or email. Apply profile edit form. Dont ask current password for profile update. Fix layout and devise links. Refs #1954

This commit is contained in:
Pavel Chipiga 2011-10-11 23:56:51 +03:00
parent f3d32273d8
commit 77e03df70b
24 changed files with 546 additions and 218 deletions

100
Gemfile
View File

@ -1,56 +1,66 @@
source 'http://rubygems.org'
gem 'rails', '3.0.5'
gem 'rails', '3.0.10' #, :git => 'git://github.com/rails/rails.git'
# Bundle edge Rails instead:
# gem 'rails', :git => 'git://github.com/rails/rails.git'
gem 'pg', '~> 0.11.0'
gem 'silent-postgres', '~> 0.1.1'
gem 'pg'
gem 'devise', '~> 1.4.8'
gem 'omniauth', '~> 0.3.0'
gem 'oa-openid', '~> 0.3.0', :require => 'omniauth/openid'
gem 'cancan', '~> 1.6.7'
# Use unicorn as the web server
# gem 'unicorn'
gem "haml-rails", '~> 0.3.4'
gem "compass", '~> 0.11.5'
gem 'jammit'
gem "yui-compressor", "0.9.5" # Higher versions depends on Platform gem which conflicts with Platform model
# Deploy with Capistrano
# gem 'capistrano'
gem 'paperclip', "~> 2.3"
gem "will_paginate", "~> 3.0.2"
gem "russian"
# To use debugger (ruby-debug for Ruby 1.8.7+, ruby-debug19 for Ruby 1.9.2+)
# gem 'ruby-debug'
# gem 'ruby-debug19', :require => 'ruby-debug'
gem "grit"
gem 'delayed_job'
gem 'unicorn'
# Bundle the extra gems:
# gem 'bj'
# gem 'nokogiri'
# gem 'sqlite3-ruby', :require => 'sqlite3'
# gem 'aws-s3', :require => 'aws/s3'
# Bundle gems for the local environment. Make sure to
# put test-only gems in this group so their generators
# and rake tasks are available in development mode:
# group :development, :test do
# gem 'webrat'
# end
group :development, :test do
gem "rspec-rails", ">= 2.0.1"
gem 'factory_girl_rails'
gem 'web-app-theme', '>= 0.6.2'
gem 'hpricot'
gem 'ruby_parser'
group :production do
gem "airbrake"
# gem 'newrelic_rpm', '~> 3.1.1'
end
gem "devise"
gem "haml", ">= 3.0.0"
gem "haml-rails"
gem "compass", ">= 0.10.6"
gem "capistrano"
gem "capistrano-ext"
gem "will_paginate", "~> 3.0.pre2"
gem 'factory_girl_rails'
gem "airbrake"
gem "russian"
gem "grit"
gem 'unicorn'
gem 'delayed_job'
gem 'paperclip', "~> 2.3"
group :development do
# gem 'letter_opener'
gem 'rails3-generators'
gem 'web-app-theme'
gem 'hpricot'
gem 'ruby_parser'
gem 'jammit'
# debug
gem 'ruby-debug'
# gem 'looksee'
# gem 'awesome_print'
# gem 'wirble'
# gem 'hirb'
# gem 'rails-footnotes', '>= 3.7.5.rc4' # this shit is very buggy don't forget to switch it off back
# deploy
gem 'capistrano', :require => false
gem 'capistrano-ext', :require => false
# gem 'capistrano-exts', :require => false #, :git => 'git://github.com/chipiga/capistrano-exts.git'
# gem 'capistrano-recipes', :require => false
gem 'capistrano_colors', :require => false
end
group :test do
gem 'rspec-rails', '~> 2.6.1'
gem 'factory_girl_rails', '~> 1.2.0'
# gem 'spork', '>= 0.9.0.rc9'
# gem 'guard-spork', '~> 0.3.1'
# gem 'guard-rspec', '~> 0.5.0'
# gem 'guard-bundler', '~> 0.1.3'
#
# gem 'rb-fsevent', '>= 0.4.3', :require => false
# gem 'growl', '~> 1.0.3', :require => false
# gem 'rb-inotify', '>= 0.8.6', :require => false
# gem 'libnotify', '~> 0.5.7', :require => false
end

View File

@ -1,145 +1,242 @@
GEM
remote: http://rubygems.org/
specs:
XMLCanonicalizer (1.0.1)
log4r (>= 1.0.4)
abstract (1.0.0)
actionmailer (3.0.5)
actionpack (= 3.0.5)
mail (~> 2.2.15)
actionpack (3.0.5)
activemodel (= 3.0.5)
activesupport (= 3.0.5)
actionmailer (3.0.10)
actionpack (= 3.0.10)
mail (~> 2.2.19)
actionpack (3.0.10)
activemodel (= 3.0.10)
activesupport (= 3.0.10)
builder (~> 2.1.2)
erubis (~> 2.6.6)
i18n (~> 0.4)
i18n (~> 0.5.0)
rack (~> 1.2.1)
rack-mount (~> 0.6.13)
rack-mount (~> 0.6.14)
rack-test (~> 0.5.7)
tzinfo (~> 0.3.23)
activemodel (3.0.5)
activesupport (= 3.0.5)
activemodel (3.0.10)
activesupport (= 3.0.10)
builder (~> 2.1.2)
i18n (~> 0.4)
activerecord (3.0.5)
activemodel (= 3.0.5)
activesupport (= 3.0.5)
arel (~> 2.0.2)
i18n (~> 0.5.0)
activerecord (3.0.10)
activemodel (= 3.0.10)
activesupport (= 3.0.10)
arel (~> 2.0.10)
tzinfo (~> 0.3.23)
activeresource (3.0.5)
activemodel (= 3.0.5)
activesupport (= 3.0.5)
activesupport (3.0.5)
activeresource (3.0.10)
activemodel (= 3.0.10)
activesupport (= 3.0.10)
activesupport (3.0.10)
addressable (2.2.6)
airbrake (3.0.4)
activesupport
builder
arel (2.0.9)
bcrypt-ruby (2.1.4)
arel (2.0.10)
bcrypt-ruby (3.0.1)
builder (2.1.2)
capistrano (2.5.19)
cancan (1.6.7)
capistrano (2.9.0)
highline
net-scp (>= 1.0.0)
net-sftp (>= 2.0.0)
net-ssh (>= 2.0.14)
net-ssh-gateway (>= 1.0.0)
net-ssh-gateway (>= 1.1.0)
capistrano-ext (1.2.1)
capistrano (>= 1.0.0)
closure-compiler (1.1.1)
compass (0.10.6)
haml (>= 3.0.4)
daemons (1.1.0)
capistrano_colors (0.5.5)
chunky_png (1.2.5)
cocaine (0.2.0)
columnize (0.3.4)
compass (0.11.5)
chunky_png (~> 1.2)
fssm (>= 0.2.7)
sass (~> 3.1)
daemons (1.1.4)
delayed_job (2.1.4)
activesupport (~> 3.0)
daemons
devise (1.1.7)
bcrypt-ruby (~> 2.1.2)
warden (~> 1.0.2)
diff-lcs (1.1.2)
devise (1.4.8)
bcrypt-ruby (~> 3.0)
orm_adapter (~> 0.0.3)
warden (~> 1.0.3)
diff-lcs (1.1.3)
erubis (2.6.6)
abstract (>= 1.0.0)
factory_girl (1.3.3)
factory_girl_rails (1.0.1)
factory_girl (~> 1.3)
factory_girl (2.1.2)
activesupport
factory_girl_rails (1.2.0)
factory_girl (~> 2.1.0)
railties (>= 3.0.0)
faraday (0.7.5)
addressable (~> 2.2.6)
multipart-post (~> 1.1.3)
rack (>= 1.1.0, < 2)
fssm (0.2.7)
grit (2.4.1)
diff-lcs (~> 1.1)
mime-types (~> 1.15)
haml (3.0.25)
haml (3.1.3)
haml-rails (0.3.4)
actionpack (~> 3.0)
activesupport (~> 3.0)
haml (~> 3.0)
railties (~> 3.0)
highline (1.6.1)
highline (1.6.2)
hpricot (0.8.4)
i18n (0.5.0)
jammit (0.6.0)
closure-compiler (>= 0.1.0)
yui-compressor (>= 0.9.1)
kgio (2.3.3)
mail (2.2.15)
jammit (0.6.3)
yui-compressor (>= 0.9.3)
json (1.6.1)
kgio (2.6.0)
linecache (0.46)
rbx-require-relative (> 0.0.4)
log4r (1.1.9)
macaddr (1.4.0)
systemu (~> 2.2.0)
mail (2.2.19)
activesupport (>= 2.3.6)
i18n (>= 0.4.0)
mime-types (~> 1.16)
treetop (~> 1.4.8)
mime-types (1.16)
multi_json (1.0.3)
multi_xml (0.4.1)
multipart-post (1.1.3)
net-ldap (0.2.2)
net-scp (1.0.4)
net-ssh (>= 1.99.1)
net-sftp (2.0.5)
net-ssh (>= 2.0.9)
net-ssh (2.1.3)
net-ssh-gateway (1.0.1)
net-ssh (2.2.1)
net-ssh-gateway (1.1.0)
net-ssh (>= 1.99.1)
paperclip (2.3.8)
activerecord
activesupport
pg (0.10.1)
polyglot (0.3.1)
rack (1.2.1)
rack-mount (0.6.13)
nokogiri (1.5.0)
oa-basic (0.3.0)
oa-core (= 0.3.0)
rest-client (~> 1.6.0)
oa-core (0.3.0)
oa-enterprise (0.3.0)
XMLCanonicalizer (~> 1.0.1)
addressable (~> 2.2.6)
net-ldap (~> 0.2.2)
nokogiri (~> 1.5.0)
oa-core (= 0.3.0)
pyu-ruby-sasl (~> 0.0.3.1)
rubyntlm (~> 0.1.1)
uuid
oa-more (0.3.0)
multi_json (~> 1.0.0)
oa-core (= 0.3.0)
rest-client (~> 1.6.0)
oa-oauth (0.3.0)
faraday (~> 0.7.3)
multi_json (~> 1.0.0)
multi_xml (~> 0.4.0)
oa-core (= 0.3.0)
oauth (~> 0.4.0)
oauth2 (~> 0.5.0)
oa-openid (0.3.0)
oa-core (= 0.3.0)
rack-openid (~> 1.3.1)
ruby-openid-apps-discovery (~> 1.2.0)
oauth (0.4.5)
oauth2 (0.5.1)
faraday (~> 0.7.4)
multi_json (~> 1.0.3)
omniauth (0.3.0)
oa-basic (= 0.3.0)
oa-core (= 0.3.0)
oa-enterprise (= 0.3.0)
oa-more (= 0.3.0)
oa-oauth (= 0.3.0)
oa-openid (= 0.3.0)
orm_adapter (0.0.5)
paperclip (2.4.3)
activerecord (>= 2.3.0)
activesupport (>= 2.3.2)
cocaine (>= 0.0.2)
mime-types
pg (0.11.0)
polyglot (0.3.2)
pyu-ruby-sasl (0.0.3.3)
rack (1.2.4)
rack-mount (0.6.14)
rack (>= 1.0.0)
rack-openid (1.3.1)
rack (>= 1.1.0)
ruby-openid (>= 2.1.8)
rack-test (0.5.7)
rack (>= 1.0)
rails (3.0.5)
actionmailer (= 3.0.5)
actionpack (= 3.0.5)
activerecord (= 3.0.5)
activeresource (= 3.0.5)
activesupport (= 3.0.5)
rails (3.0.10)
actionmailer (= 3.0.10)
actionpack (= 3.0.10)
activerecord (= 3.0.10)
activeresource (= 3.0.10)
activesupport (= 3.0.10)
bundler (~> 1.0)
railties (= 3.0.5)
railties (3.0.5)
actionpack (= 3.0.5)
activesupport (= 3.0.5)
railties (= 3.0.10)
rails3-generators (0.17.4)
railties (>= 3.0.0)
railties (3.0.10)
actionpack (= 3.0.10)
activesupport (= 3.0.10)
rake (>= 0.8.7)
rdoc (~> 3.4)
thor (~> 0.14.4)
rake (0.8.7)
rspec (2.5.0)
rspec-core (~> 2.5.0)
rspec-expectations (~> 2.5.0)
rspec-mocks (~> 2.5.0)
rspec-core (2.5.1)
rspec-expectations (2.5.0)
raindrops (0.7.0)
rake (0.9.2)
rbx-require-relative (0.0.5)
rdoc (3.10)
json (~> 1.4)
rest-client (1.6.7)
mime-types (>= 1.16)
rspec (2.6.0)
rspec-core (~> 2.6.0)
rspec-expectations (~> 2.6.0)
rspec-mocks (~> 2.6.0)
rspec-core (2.6.4)
rspec-expectations (2.6.0)
diff-lcs (~> 1.1.2)
rspec-mocks (2.5.0)
rspec-rails (2.5.0)
rspec-mocks (2.6.0)
rspec-rails (2.6.1)
actionpack (~> 3.0)
activesupport (~> 3.0)
railties (~> 3.0)
rspec (~> 2.5.0)
ruby_parser (2.0.6)
rspec (~> 2.6.0)
ruby-debug (0.10.4)
columnize (>= 0.1)
ruby-debug-base (~> 0.10.4.0)
ruby-debug-base (0.10.4)
linecache (>= 0.3)
ruby-openid (2.1.8)
ruby-openid-apps-discovery (1.2.0)
ruby-openid (>= 2.1.7)
ruby_parser (2.3.1)
sexp_processor (~> 3.0)
rubyntlm (0.1.1)
russian (0.2.7)
sexp_processor (3.0.5)
sass (3.1.10)
sexp_processor (3.0.7)
silent-postgres (0.1.1)
systemu (2.2.0)
thor (0.14.6)
treetop (1.4.9)
treetop (1.4.10)
polyglot
polyglot (>= 0.3.1)
tzinfo (0.3.24)
unicorn (3.5.0)
kgio (~> 2.3)
tzinfo (0.3.30)
unicorn (4.1.1)
kgio (~> 2.4)
rack
warden (1.0.3)
rack (>= 1.0.0)
web-app-theme (0.6.3)
will_paginate (3.0.pre2)
raindrops (~> 0.6)
uuid (2.3.4)
macaddr (~> 1.0)
warden (1.0.6)
rack (>= 1.0)
web-app-theme (0.7.0)
will_paginate (3.0.2)
yui-compressor (0.9.5)
PLATFORMS
@ -147,23 +244,30 @@ PLATFORMS
DEPENDENCIES
airbrake
cancan (~> 1.6.7)
capistrano
capistrano-ext
compass (>= 0.10.6)
capistrano_colors
compass (~> 0.11.5)
delayed_job
devise
factory_girl_rails
devise (~> 1.4.8)
factory_girl_rails (~> 1.2.0)
grit
haml (>= 3.0.0)
haml-rails
haml-rails (~> 0.3.4)
hpricot
jammit
oa-openid (~> 0.3.0)
omniauth (~> 0.3.0)
paperclip (~> 2.3)
pg
rails (= 3.0.5)
rspec-rails (>= 2.0.1)
pg (~> 0.11.0)
rails (= 3.0.10)
rails3-generators
rspec-rails (~> 2.6.1)
ruby-debug
ruby_parser
russian
silent-postgres (~> 0.1.1)
unicorn
web-app-theme (>= 0.6.2)
will_paginate (~> 3.0.pre2)
web-app-theme
will_paginate (~> 3.0.2)
yui-compressor (= 0.9.5)

View File

@ -0,0 +1,45 @@
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def open_id
generic
end
def passthru
render :file => "#{Rails.root}/public/404.html", :status => 404, :layout => false
end
protected
def generic
authentication = Authentication.find_or_initialize_by_provider_and_uid(env['omniauth.auth']['provider'], env['omniauth.auth']['uid'])
if authentication.new_record?
if user_signed_in? # New authentication method for current_user
authentication.user = current_user
authentication.save
else # Register new user
session["devise.omniauth_data"] = env["omniauth.auth"]
redirect_to new_user_registration_url
end
else
flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => action_name.classify
sign_in_and_redirect authentication.user, :event => :authentication
end
# @authentication = Authentication.find_or_initialize_by_provider_and_uid(env['omniauth.auth']['provider'], env['omniauth.auth']['uid'])
# if @authentication.new_record?
# if user_signed_in? # New authentication method for current_user
# user = current_user
# else # Register new user
# user = User.new(:password => Devise.friendly_token[0,20]) # Stub password
# user.init_from env['omniauth.auth'], action_name
# user.
# end
# extra = env['omniauth.auth']['extra']['user_hash'] rescue {}
# @authentication.user_info = env['omniauth.auth']['user_info'].merge extra
# # Assign authentication to user
# @authentication.user = user
# @authentication.save
# end
# flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => action_name.classify
# sign_in_and_redirect @authentication.user, :event => :authentication
end
end

View File

@ -0,0 +1,6 @@
class Authentication < ActiveRecord::Base
belongs_to :user
validates :provider, :uid, :presence => true
validates :uid, :uniqueness => {:scope => :provider, :case_sensitive => false}
end

View File

@ -1,22 +1,50 @@
require 'digest/md5'
class User < ActiveRecord::Base
devise :database_authenticatable,
:recoverable, :rememberable, :validatable
has_many :authentications, :dependent => :destroy
attr_accessible :email, :password, :password_confirmation, :remember_me, :name
devise :database_authenticatable, :registerable, :omniauthable, # :token_authenticatable, :encryptable, :timeoutable
:recoverable, :rememberable, :validatable #, :trackable, :confirmable, :lockable
before_validation :generate_password, :on => :create
after_create :send_notification_email
validates :nickname, :presence => true, :uniqueness => {:case_sensitive => false},
:format => {:with => /[\w]+/i} #, :exclusion => {:in => %w(superuser moderator')}
protected
attr_accessible :email, :password, :password_confirmation, :remember_me, :login, :nickname, :name, :ssh_key
def generate_password
if self.password.blank?
self.password = self.password_confirmation = Digest::MD5.hexdigest(Date.today.to_s)[0..6]
attr_accessor :login
before_validation(:on => :update) { raise "Can't change nickname" if nickname_changed? } # disable edit username
# after_create() { UserMailer.new_user_notification(self).deliver }
class << self
def find_for_database_authentication(warden_conditions)
conditions = warden_conditions.dup
login = conditions.delete(:login)
where(conditions).where(["lower(nickname) = :value OR lower(email) = :value", { :value => login.downcase }]).first
end
def new_with_session(params, session)
super.tap do |user|
if data = session["devise.omniauth_data"]
if info = data['user_info'] and info.present?
user.email ||= info['email'].presence
user.nickname ||= info['nickname'].presence || info['username'].presence
user.name ||= info['name'].presence || [info['first_name'], info['last_name']].join(' ').strip
end
user.password = Devise.friendly_token[0,20] # stub password
user.authentications.build :uid => data['uid'], :provider => data['provider']
end
end
end
end
def send_notification_email
UserMailer.new_user_notification(self).deliver
def update_with_password(params={})
params.delete(:current_password)
# self.update_without_password(params) # Don't allow password update
if params[:password].blank?
params.delete(:password)
params.delete(:password_confirmation) if params[:password_confirmation].blank?
end
result = update_attributes(params)
clean_up_passwords
result
end
end

5
app/stylesheets/ie.scss Normal file
View File

@ -0,0 +1,5 @@
/* Welcome to Compass. Use this file to write IE specific override styles.
* Import this file using the following HTML or equivalent:
* <!--[if IE]>
* <link href="/stylesheets/ie.css" media="screen, projection" rel="stylesheet" type="text/css" />
* <![endif]--> */

View File

@ -0,0 +1,3 @@
/* Welcome to Compass. Use this file to define print styles.
* Import this file using the following HTML or equivalent:
* <link href="/stylesheets/print.css" media="print" rel="stylesheet" type="text/css" /> */

View File

@ -0,0 +1,6 @@
/* Welcome to Compass.
* In this file you should write your main styles. (or centralize your imports)
* Import this file using the following HTML or equivalent:
* <link href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css" /> */
@import "compass/reset";

View File

@ -23,4 +23,5 @@
.group.navform.wat-cf
%button.button{ :tyle => "submit" }
#{image_tag("web-app-theme/icons/application_edit.png", :alt => t("devise.passwords.edit_button"))} #{t("devise.passwords.edit_button")}
%span.text_button_padding
= render :partial => "devise/shared/links"

View File

@ -16,4 +16,6 @@
.group.navform.wat-cf
%button.button{ :tyle => "submit" }
#{image_tag("web-app-theme/icons/tick.png", :alt => t("devise.passwords.button"))} #{t("devise.passwords.button")}
#{image_tag("web-app-theme/icons/tick.png", :alt => t("devise.passwords.button"))} #{t("devise.passwords.button")}
%span.text_button_padding
= render :partial => "devise/shared/links"

View File

@ -1,45 +1,63 @@
#block-signup.block
%h2 #{t("devise.registrations.edit")} #{resource_name.to_s.humanize}
.content
= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put, :class => "form" }) do |f|
- if resource.errors.present?
.flash
.message.error
- messages = resource.errors.full_messages.map { |msg| content_tag(:p, msg) }.join.html_safe
= messages
.content
= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put, :class => "form" }) do |f|
- if resource.errors.present?
.flash
.message.error
- messages = resource.errors.full_messages.map { |msg| content_tag(:p, msg) }.join.html_safe
= messages
.group.wat-cf
.left
= f.label :email, :class => "label"
.right
= f.text_field :email, :class => "text_field"
/ .group.wat-cf
/ .left
/ = f.label :nickname, :class => "label"
/ .right
/ = f.text_field :nickname, :class => "text_field"
.group.wat-cf
.left
= f.label :current_password, :class => "label"
.right
= f.password_field :current_password, :class => "text_field"
%span.description= t("devise.registrations.current_password_description")
.group.wat-cf
.left
= f.label :email, :class => "label"
.right
= f.text_field :email, :class => "text_field"
.group.wat-cf
.left
= f.label :password, :class => "label"
.right
= f.password_field :password, :class => "text_field"
%span.description= t("devise.registrations.edit_password_description")
.group.wat-cf
.left
= f.label :name, :class => "label"
.right
= f.text_field :name, :class => "text_field"
.group.wat-cf
.left
= f.label :password_confirmation, :class => "label"
.right
= f.password_field :password_confirmation, :class => "text_field"
.group.wat-cf
.left
= f.label :ssh_key, :class => "label"
.right
= f.text_area :ssh_key, :class => "text_area"
.group.navform.wat-cf
%button.button{ :type => "submit" }
#{image_tag("web-app-theme/icons/tick.png", :alt => t("devise.registrations.signed_up"))} #{t("devise.registrations.signed_up")}
/ .group.wat-cf
/ .left
/ = f.label :current_password, :class => "label"
/ .right
/ = f.password_field :current_password, :class => "text_field"
/ %span.description= t("devise.registrations.current_password_description")
= link_to image_tag("web-app-theme/icons/cross.png", :alt => t("devise.registrations.cancel")) + " " + t("devise.registrations.cancel"), registration_path(resource_name), :method => "delete", :class => "button", :confirm => t("devise.registrations.cancel_confirmation")
.group.wat-cf
.left
= f.label :password, :class => "label"
.right
= f.password_field :password, :class => "text_field"
%span.description= t("devise.registrations.edit_password_description")
%span.text_button_padding
= link_to t('layout.back'), :back, :class => "text_button_padding link_button"
.group.wat-cf
.left
= f.label :password_confirmation, :class => "label"
.right
= f.password_field :password_confirmation, :class => "text_field"
.group.navform.wat-cf
%button.button{ :type => "submit" }
#{image_tag("web-app-theme/icons/tick.png", :alt => t("devise.registrations.signed_up"))} #{t("layout.save")}
= link_to image_tag("web-app-theme/icons/cross.png", :alt => t("devise.registrations.cancel")) + " " + t("devise.registrations.cancel"), registration_path(resource_name), :method => :delete, :class => "button", :confirm => t("devise.registrations.cancel_confirmation")
%span.text_button_padding
= link_to t('layout.back'), :back, :class => "text_button_padding link_button"

View File

@ -1,19 +1,32 @@
#block-signup.block
%h2= t("devise.registrations.sign_up_header")
.content
= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :class => "form" }) do |f|
- if resource.errors.present?
.flash
.message.error
- messages = resource.errors.full_messages.map { |msg| content_tag(:p, msg) }.join.html_safe
= messages
.content
= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :class => "form" }) do |f|
- if resource.errors.present?
.flash
.message.error
- messages = resource.errors.full_messages.map { |msg| content_tag(:p, msg) }.join.html_safe
= messages
.group.wat-cf
.left
= f.label :email, :class => "label"
.right
= f.text_field :email, :class => "text_field"
.group.wat-cf
.left
= f.label :nickname, :class => "label"
.right
= f.text_field :nickname, :class => "text_field"
.group.wat-cf
.left
= f.label :email, :class => "label"
.right
= f.text_field :email, :class => "text_field"
.group.wat-cf
.left
= f.label :name, :class => "label"
.right
= f.text_field :name, :class => "text_field"
- if resource.authentications.blank?
.group.wat-cf
.left
= f.label :password, :class => "label"
@ -26,8 +39,8 @@
.right
= f.password_field :password_confirmation, :class => "text_field"
.group.navform.wat-cf
%button.button{ :type => "submit" }
#{image_tag("web-app-theme/icons/tick.png", :alt => t("devise.registrations.signed_up"))} #{t("devise.registrations.signed_up")}
%span.text_button_padding
= render :partial => "devise/shared/links"
.group.navform.wat-cf
%button.button{ :type => "submit" }
#{image_tag("web-app-theme/icons/tick.png", :alt => t("devise.registrations.sign_up_header"))} #{t("devise.registrations.sign_up_header")}
%span.text_button_padding
= render :partial => "devise/shared/links"

View File

@ -9,9 +9,9 @@
- form_for(resource, :as => resource_name, :url => session_path(resource_name), :html => { :class => "form login" }) do |f|
.group.wat-cf
.left
= f.label :email, :class => "label right"
= f.label :login, :class => "label right"
.right
= f.text_field :email, :class => "text_field"
= f.text_field :login, :class => "text_field"
.group.wat-cf
.left
= f.label :password, :class => "label right"
@ -22,4 +22,4 @@
%button.button{ :type => "submit" }
%img{ :src => "/images/web-app-theme/icons/key.png", :alt => "Save" }= t("layout.login")
%span.text_button_padding
= link_to t('devise.passwords.link'), new_password_path(resource_name), :class => "text_button_padding link_button"
= render :partial => "devise/shared/links"

View File

@ -1,2 +1,13 @@
- if controller_name != 'sessions'
= link_to "Войти", new_session_path(resource_name), :class => "text_button_padding link_button"
- if devise_mapping.registerable? && controller_name != 'registrations'
= link_to "Зарегистрироваться", new_registration_path(resource_name), :class => "text_button_padding link_button"
- if devise_mapping.recoverable? && controller_name != 'passwords'
= link_to t('devise.passwords.link'), new_password_path(resource_name), :class => "text_button_padding link_button"
= link_to "Забыли пароль?", new_password_path(resource_name), :class => "text_button_padding link_button"
- if devise_mapping.confirmable? && controller_name != 'confirmations'
= link_to "Не получили инструкции по подтверждению?", new_confirmation_path(resource_name), :class => "text_button_padding link_button"
- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks'
= link_to "Не получили инструкции по разблокировке?", new_unlock_path(resource_name), :class => "text_button_padding link_button"
- if devise_mapping.omniauthable?
- resource_class.omniauth_providers.each do |provider|
= link_to "Войти через #{provider.to_s.classify}", omniauth_authorize_path(resource_name, provider), :class => "text_button_padding link_button"

View File

@ -12,8 +12,8 @@
%a{:href => "/"}= t("layout.global_header")
#user-navigation
%ul.wat-cf
%li
= link_to t('layout.logout'), destroy_user_session_path, :class => "logout"
%li= link_to current_user.nickname, edit_user_registration_path
%li= link_to t('layout.logout'), destroy_user_session_path, :method => :delete, :class => "logout"
#main-navigation
%ul.wat-cf
%li{:class => controller.controller_path == 'users' ? 'active' : '' }

View File

@ -2,6 +2,7 @@
%html
%head
%title= t("layout.global_header")
= render :partial => "layouts/javascripts"
-#= include_stylesheets :sessions
= stylesheet_link_tag "web-app-theme/base.css", "web-app-theme/themes/default/style.css", "web-app-theme/override.css"

View File

@ -1,9 +1,15 @@
.group
= f.label :name, t("activerecord.attributes.user.name"), :class => :label
= f.text_field :name, :class => 'text_field'
/ .group
/ = f.label :nickname, t("activerecord.attributes.user.nickname"), :class => :label
/ = f.text_field :nickname, :class => 'text_field'
.group
= f.label :email, t("activerecord.attributes.user.email"), :class => :label
= f.text_field :email, :class => 'text_field'
.group
= f.label :ssh_key, t("activerecord.attributes.user.ssh_key"), :class => :label
= f.text_area :ssh_key, :class => 'text_area'
.group.navform.wat-cf
%button.button{:type => "submit"}

View File

@ -1,3 +0,0 @@
require 'compass'
require 'compass/app_integration/rails'
Compass::AppIntegration::Rails.initialize!

View File

@ -1,6 +1,19 @@
ru:
errors:
messages:
expired: "устарела. Пожалуйста, запросите новую"
not_found: "не найдена"
already_confirmed: "уже подтверждена. Пожалуйста, попробуйте войти в систему"
not_locked: "не заблокирована"
not_saved:
one: "%{resource}: сохранение не удалось из-за %{count} ошибки"
few: "%{resource}: сохранение не удалось из-за %{count} ошибок"
many: "%{resource}: сохранение не удалось из-за %{count} ошибок"
other: "%{resource}: сохранение не удалось из-за %{count} ошибки"
devise:
failure:
already_authenticated: "Вы уже вошли в систему."
unauthenticated: 'Вы должны войти или зарегистрироваться, прежде чем сможете продолжить.'
unconfirmed: 'Вы должны подтвердить вашу учетную запись, прежде чем сможете продолжить.'
locked: 'Ваша учетная запись заблокирована.'
@ -16,18 +29,21 @@ ru:
link: 'Забыли пароль?'
button: 'Восстановить'
send_instructions: 'Вы получите письмо с инструкциями о том, как сбросить ваш пароль, через несколько минут.'
send_paranoid_instructions: "Если ваш адрес e-mail есть в нашей базе данных, то в течение нескольких минут вы получите письмо с инструкциями по восстановлению вашего пароля."
updated: 'Ваш пароль изменен. Теперь вы можете войти.'
edit: 'Изменение пароля'
edit_button: 'Изменить пароль'
confirmations:
link: "Не получили инструкции для подтверждения учетной записи?"
send_instructions: 'Вы получите письмо с инструкциями о том, как подтвердить вашу учетную запись.'
send_paranoid_instructions: "Если ваш адрес e-mail есть в нашей базе данных, то в течение нескольких минут вы получите письмо с инструкциями по подтверждению вашей учётной записи."
confirmed: 'Ваша учетная запись успешно подтверждена. Добро пожаловать.'
resend_header: 'Повторная отправка инструкций для подтверждения учетной записи'
send: "Отправить"
registrations:
link: 'Регистрация'
signed_up: 'Вы успешно зарегистрировались.'
inactive_signed_up: "Добро пожаловать! Вы успешно зарегистрировались. Но пока вы не можете войти в систему, т.к. ваша учётная запись %{reason}."
updated: 'Ваша учетная запись изменена.'
destroyed: 'До свидания! Ваша учетная запись удалена. Надеемся вскоре снова вас увидеть.'
sign_up_header: 'Регистрация'
@ -39,9 +55,15 @@ ru:
unlocks:
link: "Не получили инструкции для разблокировки учетной записи?"
send_instructions: 'Вы получите письмо с инструкциями о том, как разблокировать вашу учетную запись, через несколько минут.'
send_paranoid_instructions: "Если ваша учётная запись существует, то в течение нескольких минут вы получите письмо с инструкциями по её разблокировке."
unlocked: 'Ваша учетная запись разблокирована. Вы вошли.'
omniauth_callbacks:
success: "Вход в систему выполнен с учётной записью из %{kind}."
failure: "Вы не можете войти в систему с учётной записью из %{kind}, т.к. \"%{reason}\"."
mailer:
confirmation_instructions: 'Инструкции для подтверждения'
reset_password_instructions: 'Инструкции для сброса пароля'
unlock_instructions: 'Инструкции для разблокировки'
confirmation_instructions:
subject: "Инструкции по подтверждению учётной записи"
reset_password_instructions:
subject: "Инструкции по восстановлению пароля"
unlock_instructions:
subject: "Инструкции по разблокировке учётной записи"

View File

@ -297,7 +297,11 @@ ru:
user:
name: Имя
login: Никнейм или Email
email: Email
nickname: Никнейм
ssh_key: SSH ключ
current_password: Текущий пароль
created_at: Создан
updated_at: Обновлен

View File

@ -1,5 +1,8 @@
Rosa::Application.routes.draw do
devise_for :users
devise_for :users, :controllers => {:omniauth_callbacks => 'users/omniauth_callbacks'} do
get '/users/auth/:provider' => 'users/omniauth_callbacks#passthru'
end
resources :users
resources :platforms do
member do
@ -36,8 +39,6 @@ Rosa::Application.routes.draw do
end
end
end
resources :users
match 'build_lists/status_build', :to => "build_lists#status_build"
match 'build_lists/post_build', :to => "build_lists#post_build"

View File

@ -0,0 +1,13 @@
class AddExtraFieldsToUsers < ActiveRecord::Migration
def self.up
add_column :users, :nickname, :string
add_column :users, :ssh_key, :text
add_index :users, :nickname, :unique => true
User.all.each {|u| u.update_attribute :nickname, u.email.split('@').first}
end
def self.down
remove_column :users, :ssh_key
remove_column :users, :nickname
end
end

View File

@ -0,0 +1,18 @@
class CreateAuthentications < ActiveRecord::Migration
def self.up
create_table :authentications do |t|
t.references :user
t.string :provider
t.string :uid
t.timestamps
end
add_index :authentications, :user_id
add_index :authentications, [:provider, :uid], :unique => true
end
def self.down
drop_table :authentications
end
end

View File

@ -10,7 +10,7 @@
#
# It's strongly recommended to check this file into your version control system.
ActiveRecord::Schema.define(:version => 20110428140753) do
ActiveRecord::Schema.define(:version => 20111011200645) do
create_table "arches", :force => true do |t|
t.string "name", :null => false
@ -20,6 +20,17 @@ ActiveRecord::Schema.define(:version => 20110428140753) do
add_index "arches", ["name"], :name => "index_arches_on_name", :unique => true
create_table "authentications", :force => true do |t|
t.integer "user_id"
t.string "provider"
t.string "uid"
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "authentications", ["provider", "uid"], :name => "index_authentications_on_provider_and_uid", :unique => true
add_index "authentications", ["user_id"], :name => "index_authentications_on_user_id"
create_table "build_list_items", :force => true do |t|
t.string "name"
t.integer "level"
@ -140,9 +151,12 @@ ActiveRecord::Schema.define(:version => 20110428140753) do
t.datetime "remember_created_at"
t.datetime "created_at"
t.datetime "updated_at"
t.string "nickname"
t.text "ssh_key"
end
add_index "users", ["email"], :name => "index_users_on_email", :unique => true
add_index "users", ["nickname"], :name => "index_users_on_nickname", :unique => true
add_index "users", ["reset_password_token"], :name => "index_users_on_reset_password_token", :unique => true
end