aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWei Xie <xieconnect@gmail.com>2010-06-14 09:36:53 +0800
committerHans de Graaff <hans@degraaff.org>2010-07-11 10:47:19 +0200
commit565bf969e8e6440352728cc23c71f2f3d3e4da25 (patch)
treed214785c22ce7adc77df533cc5584192bd201edc
parentRun both specs and features by default. (diff)
downloadcouncil-webapp-565bf969e8e6440352728cc23c71f2f3d3e4da25.tar.gz
council-webapp-565bf969e8e6440352728cc23c71f2f3d3e4da25.tar.bz2
council-webapp-565bf969e8e6440352728cc23c71f2f3d3e4da25.zip
User role added and tested
-rw-r--r--app/models/role.rb1
-rw-r--r--app/models/user.rb19
-rw-r--r--app/views/taglibs/auto/rapid/forms.dryml4
-rw-r--r--app/views/taglibs/auto/rapid/pages.dryml10
-rw-r--r--db/migrate/20100606021229_add_role_to_users.rb11
-rw-r--r--db/schema.rb4
-rw-r--r--spec/fixtures/users.yml18
-rw-r--r--spec/models/user_spec.rb39
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