From f6158ab6bb2fb67f3849ac2149e53a50084f0532 Mon Sep 17 00:00:00 2001 From: Vyacheslav Loginov Date: Sun, 23 Dec 2012 18:53:10 +0200 Subject: [PATCH] add user --- Gemfile | 1 + Gemfile.lock | 9 + app/controllers/samples_controller.rb | 2 +- app/models/user.rb | 10 + app/views/samples/index.html.haml | 2 + config/initializers/devise.rb | 209 ++++++++++++++++++ config/locales/devise.en.yml | 58 +++++ config/routes.rb | 2 + .../20121223164912_devise_create_users.rb | 25 +++ db/schema.rb | 20 +- .../screenshots/000/000/006/large/sign_up.png | Bin 0 -> 7462 bytes .../000/000/006/medium/sign_up.png | Bin 0 -> 7462 bytes .../000/000/006/original/sign_up.png | Bin 0 -> 7294 bytes .../screenshots/000/000/006/thumb/sign_up.png | Bin 0 -> 5059 bytes test/fixtures/users.yml | 11 + test/unit/user_test.rb | 7 + 16 files changed, 354 insertions(+), 2 deletions(-) create mode 100644 app/models/user.rb create mode 100644 config/initializers/devise.rb create mode 100644 config/locales/devise.en.yml create mode 100644 db/migrate/20121223164912_devise_create_users.rb create mode 100644 public/system/samples/screenshots/000/000/006/large/sign_up.png create mode 100644 public/system/samples/screenshots/000/000/006/medium/sign_up.png create mode 100644 public/system/samples/screenshots/000/000/006/original/sign_up.png create mode 100644 public/system/samples/screenshots/000/000/006/thumb/sign_up.png create mode 100644 test/fixtures/users.yml create mode 100644 test/unit/user_test.rb diff --git a/Gemfile b/Gemfile index 46668ce..c0aa923 100644 --- a/Gemfile +++ b/Gemfile @@ -36,6 +36,7 @@ gem "jquery-fileupload-rails" gem "paperclip", "~> 3.0" gem "simple_form" +gem "devise" # To use ActiveModel has_secure_password # gem 'bcrypt-ruby', '~> 3.0.0' diff --git a/Gemfile.lock b/Gemfile.lock index 1bcc226..ba70a81 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -29,6 +29,7 @@ GEM i18n (~> 0.6) multi_json (~> 1.0) arel (3.0.2) + bcrypt-ruby (3.0.1) better_errors (0.3.2) coderay (>= 1.0.0) erubis (>= 2.7.0) @@ -43,6 +44,10 @@ GEM coffee-script-source execjs coffee-script-source (1.4.0) + devise (1.5.3) + bcrypt-ruby (~> 3.0) + orm_adapter (~> 0.0.3) + warden (~> 1.1) erubis (2.7.0) execjs (1.4.0) multi_json (~> 1.0) @@ -69,6 +74,7 @@ GEM mime-types (1.19) multi_json (1.5.0) mysql2 (0.3.11) + orm_adapter (0.0.7) paperclip (3.3.1) activemodel (>= 3.0.0) activerecord (>= 3.0.0) @@ -124,6 +130,8 @@ GEM uglifier (1.3.0) execjs (>= 0.3.0) multi_json (~> 1.0, >= 1.0.2) + warden (1.2.1) + rack (>= 1.0) wiselinks (0.2.0) PLATFORMS @@ -133,6 +141,7 @@ DEPENDENCIES better_errors binding_of_caller coffee-rails (~> 3.2.1) + devise haml-rails jquery-fileupload-rails jquery-rails diff --git a/app/controllers/samples_controller.rb b/app/controllers/samples_controller.rb index 145ffdb..4e5e7f1 100644 --- a/app/controllers/samples_controller.rb +++ b/app/controllers/samples_controller.rb @@ -8,7 +8,7 @@ def index respond_to do |format| format.html # index.html.erb - format.json { render json: @samples } + format.json { render json: Sample.all.map(&:name) } end end diff --git a/app/models/user.rb b/app/models/user.rb new file mode 100644 index 0000000..7aa3d9d --- /dev/null +++ b/app/models/user.rb @@ -0,0 +1,10 @@ +class User < ActiveRecord::Base + # Include default devise modules. Others available are: + # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable + devise :database_authenticatable, :registerable, + :recoverable, :rememberable, :trackable, :validatable + + # Setup accessible (or protected) attributes for your model + attr_accessible :email, :password, :password_confirmation, :remember_me + # attr_accessible :title, :body +end diff --git a/app/views/samples/index.html.haml b/app/views/samples/index.html.haml index 5aeac60..e4fb9cb 100644 --- a/app/views/samples/index.html.haml +++ b/app/views/samples/index.html.haml @@ -7,6 +7,8 @@ = link_to screenshot, sample /= link_to 'Edit', edit_sample_path(sample) /= link_to 'Destroy', sample, :confirm => 'Are you sure?', :method => :delete + %br + %br %br.both %br.both diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb new file mode 100644 index 0000000..681fa50 --- /dev/null +++ b/config/initializers/devise.rb @@ -0,0 +1,209 @@ +# Use this hook to configure devise mailer, warden hooks and so forth. +# Many of these configuration options can be set straight in your model. +Devise.setup do |config| + # ==> Mailer Configuration + # Configure the e-mail address which will be shown in Devise::Mailer, + # note that it will be overwritten if you use your own mailer class with default "from" parameter. + config.mailer_sender = "please-change-me-at-config-initializers-devise@example.com" + + # Configure the class responsible to send e-mails. + # config.mailer = "Devise::Mailer" + + # ==> ORM configuration + # Load and configure the ORM. Supports :active_record (default) and + # :mongoid (bson_ext recommended) by default. Other ORMs may be + # available as additional gems. + require 'devise/orm/active_record' + + # ==> Configuration for any authentication mechanism + # Configure which keys are used when authenticating a user. The default is + # just :email. You can configure it to use [:username, :subdomain], so for + # authenticating a user, both parameters are required. Remember that those + # parameters are used only when authenticating and not when retrieving from + # session. If you need permissions, you should implement that in a before filter. + # You can also supply a hash where the value is a boolean determining whether + # or not authentication should be aborted when the value is not present. + # config.authentication_keys = [ :email ] + + # Configure parameters from the request object used for authentication. Each entry + # given should be a request method and it will automatically be passed to the + # find_for_authentication method and considered in your model lookup. For instance, + # if you set :request_keys to [:subdomain], :subdomain will be used on authentication. + # The same considerations mentioned for authentication_keys also apply to request_keys. + # config.request_keys = [] + + # Configure which authentication keys should be case-insensitive. + # These keys will be downcased upon creating or modifying a user and when used + # to authenticate or find a user. Default is :email. + config.case_insensitive_keys = [ :email ] + + # Configure which authentication keys should have whitespace stripped. + # These keys will have whitespace before and after removed upon creating or + # modifying a user and when used to authenticate or find a user. Default is :email. + config.strip_whitespace_keys = [ :email ] + + # Tell if authentication through request.params is enabled. True by default. + # config.params_authenticatable = true + + # Tell if authentication through HTTP Basic Auth is enabled. False by default. + # config.http_authenticatable = false + + # If http headers should be returned for AJAX requests. True by default. + # config.http_authenticatable_on_xhr = true + + # The realm used in Http Basic Authentication. "Application" by default. + # config.http_authentication_realm = "Application" + + # It will change confirmation, password recovery and other workflows + # to behave the same regardless if the e-mail provided was right or wrong. + # Does not affect registerable. + # config.paranoid = true + + # ==> Configuration for :database_authenticatable + # For bcrypt, this is the cost for hashing the password and defaults to 10. If + # using other encryptors, it sets how many times you want the password re-encrypted. + # + # Limiting the stretches to just one in testing will increase the performance of + # your test suite dramatically. However, it is STRONGLY RECOMMENDED to not use + # a value less than 10 in other environments. + config.stretches = Rails.env.test? ? 1 : 10 + + # Setup a pepper to generate the encrypted password. + # config.pepper = "528a37a312239c6e4fa138f99cc9e8f7f39f4293c447dc9aea4a170fb4cec22778b029ab4fac5ff52374bb9e2366309d60264b772c89bb61068a852481fe4a34" + + # ==> Configuration for :confirmable + # A period that the user is allowed to access the website even without + # confirming his account. For instance, if set to 2.days, the user will be + # able to access the website for two days without confirming his account, + # access will be blocked just in the third day. Default is 0.days, meaning + # the user cannot access the website without confirming his account. + # config.confirm_within = 2.days + + # Defines which key will be used when confirming an account + # config.confirmation_keys = [ :email ] + + # ==> Configuration for :rememberable + # The time the user will be remembered without asking for credentials again. + # config.remember_for = 2.weeks + + # If true, a valid remember token can be re-used between multiple browsers. + # config.remember_across_browsers = true + + # If true, extends the user's remember period when remembered via cookie. + # config.extend_remember_period = false + + # If true, uses the password salt as remember token. This should be turned + # to false if you are not using database authenticatable. + config.use_salt_as_remember_token = true + + # Options to be passed to the created cookie. For instance, you can set + # :secure => true in order to force SSL only cookies. + # config.cookie_options = {} + + # ==> Configuration for :validatable + # Range for password length. Default is 6..128. + # config.password_length = 6..128 + + # Email regex used to validate email formats. It simply asserts that + # an one (and only one) @ exists in the given string. This is mainly + # to give user feedback and not to assert the e-mail validity. + # config.email_regexp = /\A[^@]+@[^@]+\z/ + + # ==> Configuration for :timeoutable + # The time you want to timeout the user session without activity. After this + # time the user will be asked for credentials again. Default is 30 minutes. + # config.timeout_in = 30.minutes + + # ==> Configuration for :lockable + # Defines which strategy will be used to lock an account. + # :failed_attempts = Locks an account after a number of failed attempts to sign in. + # :none = No lock strategy. You should handle locking by yourself. + # config.lock_strategy = :failed_attempts + + # Defines which key will be used when locking and unlocking an account + # config.unlock_keys = [ :email ] + + # Defines which strategy will be used to unlock an account. + # :email = Sends an unlock link to the user email + # :time = Re-enables login after a certain amount of time (see :unlock_in below) + # :both = Enables both strategies + # :none = No unlock strategy. You should handle unlocking by yourself. + # config.unlock_strategy = :both + + # Number of authentication tries before locking an account if lock_strategy + # is failed attempts. + # config.maximum_attempts = 20 + + # Time interval to unlock the account if :time is enabled as unlock_strategy. + # config.unlock_in = 1.hour + + # ==> Configuration for :recoverable + # + # Defines which key will be used when recovering the password for an account + # config.reset_password_keys = [ :email ] + + # Time interval you can reset your password with a reset password key. + # Don't put a too small interval or your users won't have the time to + # change their passwords. + config.reset_password_within = 2.hours + + # ==> Configuration for :encryptable + # Allow you to use another encryption algorithm besides bcrypt (default). You can use + # :sha1, :sha512 or encryptors from others authentication tools as :clearance_sha1, + # :authlogic_sha512 (then you should set stretches above to 20 for default behavior) + # and :restful_authentication_sha1 (then you should set stretches to 10, and copy + # REST_AUTH_SITE_KEY to pepper) + # config.encryptor = :sha512 + + # ==> Configuration for :token_authenticatable + # Defines name of the authentication token params key + # config.token_authentication_key = :auth_token + + # If true, authentication through token does not store user in session and needs + # to be supplied on each request. Useful if you are using the token as API token. + # config.stateless_token = false + + # ==> Scopes configuration + # Turn scoped views on. Before rendering "sessions/new", it will first check for + # "users/sessions/new". It's turned off by default because it's slower if you + # are using only default views. + # config.scoped_views = false + + # Configure the default scope given to Warden. By default it's the first + # devise role declared in your routes (usually :user). + # config.default_scope = :user + + # Configure sign_out behavior. + # Sign_out action can be scoped (i.e. /users/sign_out affects only :user scope). + # The default is true, which means any logout action will sign out all active scopes. + # config.sign_out_all_scopes = true + + # ==> Navigation configuration + # Lists the formats that should be treated as navigational. Formats like + # :html, should redirect to the sign in page when the user does not have + # access, but formats like :xml or :json, should return 401. + # + # If you have any extra navigational formats, like :iphone or :mobile, you + # should add them to the navigational formats lists. + # + # The :"*/*" and "*/*" formats below is required to match Internet + # Explorer requests. + # config.navigational_formats = [:"*/*", "*/*", :html] + + # The default HTTP method used to sign out a resource. Default is :delete. + config.sign_out_via = :delete + + # ==> OmniAuth + # Add a new OmniAuth provider. Check the wiki for more information on setting + # up on your models and hooks. + # config.omniauth :github, 'APP_ID', 'APP_SECRET', :scope => 'user,public_repo' + + # ==> Warden configuration + # If you want to use other strategies, that are not supported by Devise, or + # change the failure app, you can configure them inside the config.warden block. + # + # config.warden do |manager| + # manager.intercept_401 = false + # manager.default_strategies(:scope => :user).unshift :some_external_strategy + # end +end diff --git a/config/locales/devise.en.yml b/config/locales/devise.en.yml new file mode 100644 index 0000000..79b3d5e --- /dev/null +++ b/config/locales/devise.en.yml @@ -0,0 +1,58 @@ +# Additional translations at https://github.com/plataformatec/devise/wiki/I18n + +en: + errors: + messages: + expired: "has expired, please request a new one" + not_found: "not found" + already_confirmed: "was already confirmed, please try signing in" + not_locked: "was not locked" + not_saved: + one: "1 error prohibited this %{resource} from being saved:" + other: "%{count} errors prohibited this %{resource} from being saved:" + + devise: + failure: + already_authenticated: 'You are already signed in.' + unauthenticated: 'You need to sign in or sign up before continuing.' + unconfirmed: 'You have to confirm your account before continuing.' + locked: 'Your account is locked.' + invalid: 'Invalid email or password.' + invalid_token: 'Invalid authentication token.' + timeout: 'Your session expired, please sign in again to continue.' + inactive: 'Your account was not activated yet.' + sessions: + signed_in: 'Signed in successfully.' + signed_out: 'Signed out successfully.' + passwords: + send_instructions: 'You will receive an email with instructions about how to reset your password in a few minutes.' + updated: 'Your password was changed successfully. You are now signed in.' + updated_not_active: 'Your password was changed successfully.' + send_paranoid_instructions: "If your e-mail exists on our database, you will receive a password recovery link on your e-mail" + confirmations: + send_instructions: 'You will receive an email with instructions about how to confirm your account in a few minutes.' + send_paranoid_instructions: 'If your e-mail exists on our database, you will receive an email with instructions about how to confirm your account in a few minutes.' + confirmed: 'Your account was successfully confirmed. You are now signed in.' + registrations: + signed_up: 'Welcome! You have signed up successfully.' + inactive_signed_up: 'You have signed up successfully. However, we could not sign you in because your account is %{reason}.' + updated: 'You updated your account successfully.' + destroyed: 'Bye! Your account was successfully cancelled. We hope to see you again soon.' + reasons: + inactive: 'inactive' + unconfirmed: 'unconfirmed' + locked: 'locked' + unlocks: + send_instructions: 'You will receive an email with instructions about how to unlock your account in a few minutes.' + unlocked: 'Your account was successfully unlocked. You are now signed in.' + send_paranoid_instructions: 'If your account exists, you will receive an email with instructions about how to unlock it in a few minutes.' + omniauth_callbacks: + success: 'Successfully authorized from %{kind} account.' + failure: 'Could not authorize you from %{kind} because "%{reason}".' + mailer: + confirmation_instructions: + subject: 'Confirmation instructions' + reset_password_instructions: + subject: 'Reset password instructions' + unlock_instructions: + subject: 'Unlock Instructions' diff --git a/config/routes.rb b/config/routes.rb index 5e4b8cc..0affcf2 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,6 @@ Solution::Application.routes.draw do + devise_for :users + resources :categories diff --git a/db/migrate/20121223164912_devise_create_users.rb b/db/migrate/20121223164912_devise_create_users.rb new file mode 100644 index 0000000..612e760 --- /dev/null +++ b/db/migrate/20121223164912_devise_create_users.rb @@ -0,0 +1,25 @@ +class DeviseCreateUsers < ActiveRecord::Migration + def change + create_table(:users) do |t| + t.database_authenticatable :null => false + t.recoverable + t.rememberable + t.trackable + + # t.encryptable + # t.confirmable + # t.lockable :lock_strategy => :failed_attempts, :unlock_strategy => :both + # t.token_authenticatable + + + t.timestamps + end + + add_index :users, :email, :unique => true + add_index :users, :reset_password_token, :unique => true + # add_index :users, :confirmation_token, :unique => true + # add_index :users, :unlock_token, :unique => true + # add_index :users, :authentication_token, :unique => true + end + +end diff --git a/db/schema.rb b/db/schema.rb index 3699f18..366bf71 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20121222140829) do +ActiveRecord::Schema.define(:version => 20121223164912) do create_table "categories", :force => true do |t| t.string "name" @@ -33,4 +33,22 @@ t.integer "category_id" end + create_table "users", :force => true do |t| + t.string "email", :default => "", :null => false + t.string "encrypted_password", :limit => 128, :default => "", :null => false + t.string "reset_password_token" + t.datetime "reset_password_sent_at" + t.datetime "remember_created_at" + t.integer "sign_in_count", :default => 0 + t.datetime "current_sign_in_at" + t.datetime "last_sign_in_at" + t.string "current_sign_in_ip" + t.string "last_sign_in_ip" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + add_index "users", ["email"], :name => "index_users_on_email", :unique => true + add_index "users", ["reset_password_token"], :name => "index_users_on_reset_password_token", :unique => true + end diff --git a/public/system/samples/screenshots/000/000/006/large/sign_up.png b/public/system/samples/screenshots/000/000/006/large/sign_up.png new file mode 100644 index 0000000000000000000000000000000000000000..60c63ad0505159db8e53d263bd8f6c98d790ee2a GIT binary patch literal 7462 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 P0)Ud7x@?7v#k>CiN-L@a literal 0 HcmV?d00001 diff --git a/public/system/samples/screenshots/000/000/006/medium/sign_up.png b/public/system/samples/screenshots/000/000/006/medium/sign_up.png new file mode 100644 index 0000000000000000000000000000000000000000..60c63ad0505159db8e53d263bd8f6c98d790ee2a GIT binary patch literal 7462 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 P0)Ud7x@?7v#k>CiN-L@a literal 0 HcmV?d00001 diff --git a/public/system/samples/screenshots/000/000/006/original/sign_up.png b/public/system/samples/screenshots/000/000/006/original/sign_up.png new file mode 100644 index 0000000000000000000000000000000000000000..baf4a0a7ae08c433156d11a0c2cc036a6db2fb33 GIT binary patch literal 7294 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 literal 0 HcmV?d00001 diff --git a/public/system/samples/screenshots/000/000/006/thumb/sign_up.png b/public/system/samples/screenshots/000/000/006/thumb/sign_up.png new file mode 100644 index 0000000000000000000000000000000000000000..7c5fc4e41d176e352dd9003c9012df05642c2653 GIT binary patch literal 5059 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