diff options
author | 2010-06-14 09:36:53 +0800 | |
---|---|---|
committer | 2010-07-11 10:47:19 +0200 | |
commit | 565bf969e8e6440352728cc23c71f2f3d3e4da25 (patch) | |
tree | d214785c22ce7adc77df533cc5584192bd201edc | |
parent | Run both specs and features by default. (diff) | |
download | council-webapp-565bf969e8e6440352728cc23c71f2f3d3e4da25.tar.gz council-webapp-565bf969e8e6440352728cc23c71f2f3d3e4da25.tar.bz2 council-webapp-565bf969e8e6440352728cc23c71f2f3d3e4da25.zip |
User role added and tested
-rw-r--r-- | app/models/role.rb | 1 | ||||
-rw-r--r-- | app/models/user.rb | 19 | ||||
-rw-r--r-- | app/views/taglibs/auto/rapid/forms.dryml | 4 | ||||
-rw-r--r-- | app/views/taglibs/auto/rapid/pages.dryml | 10 | ||||
-rw-r--r-- | db/migrate/20100606021229_add_role_to_users.rb | 11 | ||||
-rw-r--r-- | db/schema.rb | 4 | ||||
-rw-r--r-- | spec/fixtures/users.yml | 18 | ||||
-rw-r--r-- | spec/models/user_spec.rb | 39 |
8 files changed, 91 insertions, 15 deletions
diff --git a/app/models/role.rb b/app/models/role.rb new file mode 100644 index 0000000..c0f7911 --- /dev/null +++ b/app/models/role.rb @@ -0,0 +1 @@ +Role = HoboFields::EnumString.for(:council_member, :admin, :developer, :guest) diff --git a/app/models/user.rb b/app/models/user.rb index 7e8ade3..9350e30 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -5,13 +5,22 @@ class User < ActiveRecord::Base fields do name :string, :required, :unique email_address :email_address, :login => true - administrator :boolean, :default => false + role Role, :default => :guest, :limit => 20 timestamps end + has_many :votes, :foreign_key => 'owner_id', + :dependent => :destroy, :order => 'created_at DESC' + # This gives admin rights to the first sign-up. # Just remove it if you don't want that - before_create { |user| user.administrator = true if !Rails.env.test? && count == 0 } + before_create do |user| + if !Rails.env.test? && count == 0 + user.role = :admin + else + user.role = :guest + end + end # --- Signup lifecycle --- # @@ -21,7 +30,7 @@ class User < ActiveRecord::Base state :active, :default => true create :signup, :available_to => "Guest", - :params => [:name, :email_address, :password, :password_confirmation], + :params => [:name, :email_address, :password, :password_confirmation, :role], :become => :active transition :request_password_reset, { :active => :active }, :new_key => true do @@ -56,4 +65,8 @@ class User < ActiveRecord::Base true end + def administrator? + role.to_sym == :admin + end + end diff --git a/app/views/taglibs/auto/rapid/forms.dryml b/app/views/taglibs/auto/rapid/forms.dryml index 37eb449..a359af6 100644 --- a/app/views/taglibs/auto/rapid/forms.dryml +++ b/app/views/taglibs/auto/rapid/forms.dryml @@ -15,7 +15,7 @@ <def tag="form" for="User"> <form merge param="default"> <error-messages param/> - <field-list fields="name, email_address, administrator, state" param/> + <field-list fields="name, email_address, role, state" param/> <div param="actions"> <submit label="#{ht 'users.actions.save', :default=>['Save']}" param/><or-cancel param="cancel"/> </div> @@ -26,7 +26,7 @@ <def tag="signup-form" for="User"> <form lifecycle="signup" merge param="default"> <error-messages param/> - <field-list fields="name, email_address, password, password_confirmation" param/> + <field-list fields="name, email_address, password, password_confirmation, role" param/> <div param="actions"> <submit label="#{ht 'users.actions.signup', :default=>['Signup']}" param/><or-cancel param="cancel"/> </div> diff --git a/app/views/taglibs/auto/rapid/pages.dryml b/app/views/taglibs/auto/rapid/pages.dryml index 7fa4f48..ad1eee4 100644 --- a/app/views/taglibs/auto/rapid/pages.dryml +++ b/app/views/taglibs/auto/rapid/pages.dryml @@ -52,7 +52,7 @@ <def tag="new-page" for="Question"> - <page merge title="#{ht 'questions.new.title', :default=>['New Question'] }"> + <page merge title="#{ht 'questions.new.title', :default=>[' New Question'] }"> <body: class="new-page question" param/> <content: param> @@ -186,7 +186,7 @@ <def tag="new-page" for="User"> - <page merge title="#{ht 'users.new.title', :default=>['New User'] }"> + <page merge title="#{ht 'users.new.title', :default=>[' New User'] }"> <body: class="new-page user" param/> <content: param> @@ -221,7 +221,7 @@ </ht> </h2> - <record-flags fields="administrator" param/> + <record-flags fields="" param/> <a action="edit" if="&can_edit?" param="edit-link"> <ht key="users.actions.edit" name="&this.respond_to?(:name) ? this.name : ''"> @@ -231,7 +231,7 @@ </header> <section param="content-body"> - <field-list fields="email_address, state" param/> + <field-list fields="email_address, role, state" param/> </section> </content:> @@ -349,7 +349,7 @@ <def tag="new-page" for="Vote"> - <page merge title="#{ht 'votes.new.title', :default=>['New Vote'] }"> + <page merge title="#{ht 'votes.new.title', :default=>[' New Vote'] }"> <body: class="new-page vote" param/> <content: param> diff --git a/db/migrate/20100606021229_add_role_to_users.rb b/db/migrate/20100606021229_add_role_to_users.rb new file mode 100644 index 0000000..436acaf --- /dev/null +++ b/db/migrate/20100606021229_add_role_to_users.rb @@ -0,0 +1,11 @@ +class AddRoleToUsers < ActiveRecord::Migration + def self.up + add_column :users, :role, :string, :limit => 20, :default => :guest + remove_column :users, :administrator + end + + def self.down + remove_column :users, :role + add_column :users, :administrator, :boolean, :default => false + end +end diff --git a/db/schema.rb b/db/schema.rb index 708d019..c2996b6 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -9,7 +9,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20091227122303) do +ActiveRecord::Schema.define(:version => 20100606021229) do create_table "questions", :force => true do |t| t.string "name" @@ -28,11 +28,11 @@ ActiveRecord::Schema.define(:version => 20091227122303) do t.datetime "remember_token_expires_at" t.string "name" t.string "email_address" - t.boolean "administrator", :default => false t.datetime "created_at" t.datetime "updated_at" t.string "state", :default => "active" t.datetime "key_timestamp" + t.string "role", :limit => 20, :default => :guest end add_index "users", ["state"], :name => "index_users_on_state" diff --git a/spec/fixtures/users.yml b/spec/fixtures/users.yml index 5dedbd2..97815e3 100644 --- a/spec/fixtures/users.yml +++ b/spec/fixtures/users.yml @@ -1,4 +1,16 @@ council_member: - name: Council Member - email_address: foobar@gentoo.org - administrator: false + name: Council Member + email_address: foobar@gentoo.org + role: council_member +admin: + name: Admin + email_address: admin@admin.com + role: admin +guest: + name: Guest + email_address: guest@guest.com + role: guest +developer: + name: Developer + email_address: developer@gentoo.org + role: developer diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb new file mode 100644 index 0000000..5e6e41a --- /dev/null +++ b/spec/models/user_spec.rb @@ -0,0 +1,39 @@ +require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') + +describe User do + before(:each) do + @admin = users(:admin) + @other_user = users(:developer) + end + + it "should be administrator" do + @admin.should be_administrator + end + + it "should not be administrator" do + @other_user.should_not be_administrator + end + + it "should be able to become administrator" do + @other_user.role = :admin + @other_user.should be_valid + @other_user.should be_administrator + end + + it "should reject invalid role" do + @other_user.role = :fake_role + @other_user.should_not be_valid + end + + it "role should be updatable by administrator" do + @other_user.should be_updatable_by(@admin) + end + + [:council_member, :guest].each do |role| + it "should not be updatable by a user with role #{role}" do + @other_user.role = role + @other_user.should_not be_updatable_by(@other_user) + end + end + +end |