aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoachim Filip Ignacy Bartosik <jbartosik@gmail.com>2011-05-30 20:08:21 +0200
committerJoachim Filip Ignacy Bartosik <jbartosik@gmail.com>2011-06-03 19:27:10 +0200
commit7d5a200601a723b8a6acef4f49ea02bd2bba9935 (patch)
tree9c12dd3e3cf0a7d108b7eb3755c26260a80a7e5c
parentApplication receives data from IRC bot (diff)
downloadcouncil-webapp-7d5a200601a723b8a6acef4f49ea02bd2bba9935.tar.gz
council-webapp-7d5a200601a723b8a6acef4f49ea02bd2bba9935.tar.bz2
council-webapp-7d5a200601a723b8a6acef4f49ea02bd2bba9935.zip
Proxy model
-rw-r--r--site/app/controllers/proxies_controller.rb7
-rw-r--r--site/app/models/proxy.rb57
-rw-r--r--site/config/hobo_routes.rb10
-rw-r--r--site/db/schema.rb16
-rw-r--r--site/spec/factories.rb6
-rw-r--r--site/spec/models/proxy_spec.rb114
6 files changed, 209 insertions, 1 deletions
diff --git a/site/app/controllers/proxies_controller.rb b/site/app/controllers/proxies_controller.rb
new file mode 100644
index 0000000..afd6822
--- /dev/null
+++ b/site/app/controllers/proxies_controller.rb
@@ -0,0 +1,7 @@
+class ProxiesController < ApplicationController
+
+ hobo_model_controller
+
+ auto_actions :all
+
+end
diff --git a/site/app/models/proxy.rb b/site/app/models/proxy.rb
new file mode 100644
index 0000000..7be0a0b
--- /dev/null
+++ b/site/app/models/proxy.rb
@@ -0,0 +1,57 @@
+class Proxy < ActiveRecord::Base
+
+ hobo_model # Don't put anything above this
+
+ fields do
+ # Remeber nicks from when meeting took place
+ # May be useful when reading logs (if user changes nick)
+ council_member_nick :string, :null => false
+ proxy_nick :string, :null => false
+ timestamps
+ end
+
+ belongs_to :council_member, :class_name => 'User', :null => false
+ belongs_to :proxy, :class_name => 'User', :null => false
+ belongs_to :agenda, :null => false
+
+ validates_presence_of :council_member, :proxy, :agenda
+ validates_uniqueness_of :council_member_id, :scope => :agenda_id
+ validates_uniqueness_of :proxy_id, :scope => :agenda_id
+ validate :council_member_must_be_council_member
+ validate :proxy_must_not_be_council_member
+
+ # --- Permissions --- #
+
+ def create_permitted?
+ return false unless acting_user.council_member?
+ council_member_is?(acting_user)
+ end
+
+ def update_permitted?
+ false
+ end
+
+ def destroy_permitted?
+ return false if agenda.state == 'old'
+ council_member_is?(acting_user)
+ end
+
+ def view_permitted?(field)
+ true
+ end
+
+ before_create do |p|
+ p.council_member_nick = p.council_member.irc_nick
+ p.proxy_nick = p.proxy.irc_nick
+ end
+
+ protected
+ def council_member_must_be_council_member
+ return if council_member.nil?
+ errors.add(:council_member, 'must be council member') unless council_member.council_member?
+ end
+ def proxy_must_not_be_council_member
+ return if proxy.nil?
+ errors.add(:proxy, 'must not be council member') if proxy.council_member?
+ end
+end
diff --git a/site/config/hobo_routes.rb b/site/config/hobo_routes.rb
index ad63a15..a426e53 100644
--- a/site/config/hobo_routes.rb
+++ b/site/config/hobo_routes.rb
@@ -5,6 +5,16 @@
Council::Application.routes.draw do
+ # Resource routes for controller "proxies"
+ get 'proxies(.:format)' => 'proxies#index', :as => 'proxies'
+ get 'proxies/new(.:format)', :as => 'new_proxy'
+ get 'proxies/:id/edit(.:format)' => 'proxies#edit', :as => 'edit_proxy'
+ get 'proxies/:id(.:format)' => 'proxies#show', :as => 'proxy', :constraints => { :id => %r([^/.?]+) }
+ post 'proxies(.:format)' => 'proxies#create', :as => 'create_proxy'
+ put 'proxies/:id(.:format)' => 'proxies#update', :as => 'update_proxy', :constraints => { :id => %r([^/.?]+) }
+ delete 'proxies/:id(.:format)' => 'proxies#destroy', :as => 'destroy_proxy', :constraints => { :id => %r([^/.?]+) }
+
+
# Lifecycle routes for controller "users"
post 'users/signup(.:format)' => 'users#do_signup', :as => 'do_user_signup'
get 'users/signup(.:format)' => 'users#signup', :as => 'user_signup'
diff --git a/site/db/schema.rb b/site/db/schema.rb
index ea99919..fec65de 100644
--- a/site/db/schema.rb
+++ b/site/db/schema.rb
@@ -10,7 +10,7 @@
#
# It's strongly recommended to check this file into your version control system.
-ActiveRecord::Schema.define(:version => 20110601094807) do
+ActiveRecord::Schema.define(:version => 20110603133359) do
create_table "agenda_items", :force => true do |t|
t.string "title"
@@ -47,6 +47,20 @@ ActiveRecord::Schema.define(:version => 20110601094807) do
add_index "participations", ["agenda_id"], :name => "index_participations_on_agenda_id"
add_index "participations", ["participant_id"], :name => "index_participations_on_participant_id"
+ create_table "proxies", :force => true do |t|
+ t.string "council_member_nick", :null => false
+ t.string "proxy_nick", :null => false
+ t.datetime "created_at"
+ t.datetime "updated_at"
+ t.integer "council_member_id", :null => false
+ t.integer "proxy_id", :null => false
+ t.integer "agenda_id", :null => false
+ end
+
+ add_index "proxies", ["agenda_id"], :name => "index_proxies_on_agenda_id"
+ add_index "proxies", ["council_member_id"], :name => "index_proxies_on_council_member_id"
+ add_index "proxies", ["proxy_id"], :name => "index_proxies_on_proxy_id"
+
create_table "users", :force => true do |t|
t.string "salt", :limit => 40
t.string "remember_token"
diff --git a/site/spec/factories.rb b/site/spec/factories.rb
index 1691b50..dbf841e 100644
--- a/site/spec/factories.rb
+++ b/site/spec/factories.rb
@@ -25,3 +25,9 @@ Factory.define :voting_option do |v|;
v.agenda_item { AgendaItem.create! }
v.description { "example" }
end
+
+Factory.define :proxy do |p|;
+ p.council_member {users_factory(:council)}
+ p.proxy {users_factory(:user)}
+ p.agenda {Factory(:agenda)}
+end
diff --git a/site/spec/models/proxy_spec.rb b/site/spec/models/proxy_spec.rb
new file mode 100644
index 0000000..a94aa06
--- /dev/null
+++ b/site/spec/models/proxy_spec.rb
@@ -0,0 +1,114 @@
+require 'spec_helper'
+
+describe Proxy do
+ it 'should require agenda to be set' do
+ p = Proxy.new
+ p.should_not be_valid
+ p.errors.keys.include?(:agenda).should be_true
+ p.errors[:agenda].include?("can't be blank").should be_true
+
+ p.agenda = Agenda.current || Factory(:agenda)
+ p.valid?
+ p.errors.keys.include?(:agenda).should be_false
+ end
+
+ it 'should require council member to be set and to be council member' do
+ p = Proxy.new
+ p.should_not be_valid
+ p.errors.keys.include?(:council_member).should be_true
+ p.errors[:council_member].include?("can't be blank").should be_true
+
+ p.council_member = Factory(:user)
+ p.should_not be_valid
+ p.errors.keys.include?(:council_member).should be_true
+ p.errors[:council_member].include?('must be council member').should be_true
+
+ p.council_member = users_factory(:council)
+ p.valid?
+ p.errors.keys.include?(:council_member).should be_false
+ end
+
+ it 'should require proxy to be set and not to be council member' do
+ p = Proxy.new
+ p.should_not be_valid
+ p.errors.keys.include?(:proxy).should be_true
+ p.errors[:proxy].include?("can't be blank").should be_true
+
+ p.proxy = users_factory(:council)
+ p.should_not be_valid
+ p.errors.keys.include?(:proxy).should be_true
+ p.errors[:proxy].include?('must not be council member').should be_true
+
+ p.proxy = Factory(:user)
+ p.valid?
+ p.errors.keys.include?(:proxy).should be_false
+ end
+
+ it 'should allow only council members to create for their selfs' do
+ for u in users_factory(:user, :admin)
+ p = Proxy.new :council_member => u
+ p.should_not be_creatable_by(u)
+ end
+
+ p = Proxy.new :council_member => users_factory(:council_admin)
+ for u in users_factory(:council, :council_admin)
+ p.should_not be_creatable_by(u)
+ end
+
+ for u in users_factory(:council, :council_admin)
+ p = Proxy.new :council_member => u
+ p.should be_creatable_by(u)
+ end
+ end
+
+ it 'should allow no one to update or edit' do
+ p = Factory(:proxy)
+ for u in users_factory(AllRoles) + [p.council_member, p.proxy]
+ p.should_not be_editable_by(u)
+ p.should_not be_updatable_by(u)
+ end
+ end
+
+
+ it 'should allow everyone to view' do
+ p = Factory(:proxy)
+ for u in users_factory(AllRoles) + [p.council_member, p.proxy]
+ p.should be_viewable_by(u)
+ end
+ end
+
+ it 'should allow council members to destroy their own proxies for current meeting' do
+ a = Factory(:agenda)
+ p = Factory(:proxy, :agenda => a)
+ p.should be_destroyable_by(p.council_member)
+ end
+
+ it 'should not allow council members to destroy their own proxies for old meetings' do
+ a = Factory(:agenda, :state => 'old')
+ p = Factory(:proxy, :agenda => a)
+ p.should_not be_destroyable_by(p.council_member)
+ end
+
+ it 'should not allow users to destoy someone else proxy' do
+ a = Factory(:agenda)
+ p = Factory(:proxy, :agenda => a)
+ for u in users_factory(AllRoles)
+ p.should_not be_destroyable_by(u)
+ end
+ end
+
+ it 'should remember nick of council member and proxy from time it was created' do
+ c = users_factory(:council)
+ u = users_factory(:user)
+ p = Factory(:proxy, :council_member => c, :proxy => u)
+ c_nick = c.irc_nick
+ u_nick = u.irc_nick
+ u.irc_nick = 'diffrent nick'
+ c.irc_nick = 'other nick'
+ u.save!
+ c.save!
+ p.reload
+ p.council_member_nick.should == c_nick
+ p.proxy_nick.should == u_nick
+ end
+end