aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoachim Filip Ignacy Bartosik <jbartosik@gmail.com>2011-05-17 17:14:01 +0200
committerJoachim Filip Ignacy Bartosik <jbartosik@gmail.com>2011-05-24 18:55:39 +0200
commit8fcbeab8bf791e9b2b793bb85ee5faea80338ac7 (patch)
tree3fdc4e394423118d4337d6307d3d546ae37f11ad
parentAgenda items (diff)
downloadcouncil-webapp-8fcbeab8bf791e9b2b793bb85ee5faea80338ac7.tar.gz
council-webapp-8fcbeab8bf791e9b2b793bb85ee5faea80338ac7.tar.bz2
council-webapp-8fcbeab8bf791e9b2b793bb85ee5faea80338ac7.zip
Basic meeting participation tracing
When archiving agenda mark all council members as participants. Remember their names and irc_nicks.
-rw-r--r--site/app/models/agenda.rb10
-rw-r--r--site/app/models/agenda_item.rb4
-rw-r--r--site/app/models/participation.rb34
-rw-r--r--site/app/viewhints/agenda_hints.rb2
-rw-r--r--site/db/schema.rb14
-rw-r--r--site/features/participations.feature10
-rw-r--r--site/features/step_definitions/participations_steps.rb24
-rw-r--r--site/spec/factories.rb2
-rw-r--r--site/spec/models/agenda_item_spec.rb2
-rw-r--r--site/spec/models/agenda_spec.rb11
-rw-r--r--site/spec/models/participation_spec.rb20
11 files changed, 127 insertions, 6 deletions
diff --git a/site/app/models/agenda.rb b/site/app/models/agenda.rb
index 5998ae8..f8f90df 100644
--- a/site/app/models/agenda.rb
+++ b/site/app/models/agenda.rb
@@ -8,6 +8,7 @@ class Agenda < ActiveRecord::Base
end
has_many :agenda_items
+ has_many :participations
lifecycle do
state :open, :default => true
@@ -16,7 +17,14 @@ class Agenda < ActiveRecord::Base
transition :close, {:open => :submissions_closed}, :available_to => '::Agenda.transitions_available(acting_user)'
transition :reopen, {:submissions_closed=> :open}, :available_to => '::Agenda.transitions_available(acting_user)'
transition :archive, {:submissions_closed => :old}, :available_to => '::Agenda.transitions_available(acting_user)' do
- Agenda.new.save!
+ ActiveRecord::Base.transaction do
+ Agenda.new.save!
+ ::User.council_member_is(true).each do |participant|
+ Participation.create! :irc_nick => participant.irc_nick,
+ :participant => participant,
+ :agenda => self
+ end
+ end
end
end
diff --git a/site/app/models/agenda_item.rb b/site/app/models/agenda_item.rb
index 1bb3a36..f5108bd 100644
--- a/site/app/models/agenda_item.rb
+++ b/site/app/models/agenda_item.rb
@@ -21,7 +21,7 @@ class AgendaItem < ActiveRecord::Base
end
def update_permitted?
- return false if agenda._?.state == 'archived'
+ return false if agenda._?.state == 'old'
return false if user_changed?
return true if acting_user.council_member?
return true if acting_user.administrator?
@@ -42,7 +42,7 @@ class AgendaItem < ActiveRecord::Base
def edit_permitted?(field)
return false if field == :rejected && !agenda.nil?
return false if field == :agenda && rejected?
- return false if agenda._?.state == 'archived'
+ return false if agenda._?.state == 'old'
return false if field == :user
return true if acting_user.administrator?
return true if acting_user.council_member?
diff --git a/site/app/models/participation.rb b/site/app/models/participation.rb
new file mode 100644
index 0000000..95c4142
--- /dev/null
+++ b/site/app/models/participation.rb
@@ -0,0 +1,34 @@
+class Participation < ActiveRecord::Base
+
+ hobo_model # Don't put anything above this
+
+ fields do
+ irc_nick :string
+ timestamps
+ end
+
+ belongs_to :participant, :class_name => 'User'
+ belongs_to :agenda
+
+ # --- Permissions --- #
+
+ def create_permitted?
+ false
+ end
+
+ def update_permitted?
+ false
+ end
+
+ def destroy_permitted?
+ false
+ end
+
+ def view_permitted?(field)
+ true
+ end
+
+ def name
+ participant.name
+ end
+end
diff --git a/site/app/viewhints/agenda_hints.rb b/site/app/viewhints/agenda_hints.rb
index 05c7b96..46daf34 100644
--- a/site/app/viewhints/agenda_hints.rb
+++ b/site/app/viewhints/agenda_hints.rb
@@ -1,5 +1,5 @@
class AgendaHints < Hobo::ViewHints
- children :agenda_items
+ children :agenda_items, :participations
end
diff --git a/site/db/schema.rb b/site/db/schema.rb
index edd7ee0..cf1a791 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 => 20110523180314) do
+ActiveRecord::Schema.define(:version => 20110523180453) do
create_table "agenda_items", :force => true do |t|
t.string "title"
@@ -36,6 +36,18 @@ ActiveRecord::Schema.define(:version => 20110523180314) do
add_index "agendas", ["state"], :name => "index_agendas_on_state"
+ create_table "participations", :force => true do |t|
+ t.string "name"
+ t.string "irc_nick"
+ t.datetime "created_at"
+ t.datetime "updated_at"
+ t.integer "participant_id"
+ t.integer "agenda_id"
+ end
+
+ add_index "participations", ["agenda_id"], :name => "index_participations_on_agenda_id"
+ add_index "participations", ["participant_id"], :name => "index_participations_on_participant_id"
+
create_table "users", :force => true do |t|
t.string "salt", :limit => 40
t.string "remember_token"
diff --git a/site/features/participations.feature b/site/features/participations.feature
new file mode 100644
index 0000000..69cb5dd
--- /dev/null
+++ b/site/features/participations.feature
@@ -0,0 +1,10 @@
+Feature: In order to track presence on the council meetings
+ I want the application to store participations
+
+ Scenario: When archiving agenda mark all council members as participants
+ Given some council members
+ And I am logged in as council member
+ And an closed agenda
+ When I am on the current agenda page
+ And I archive current agenda
+ Then I should see all council members as participants
diff --git a/site/features/step_definitions/participations_steps.rb b/site/features/step_definitions/participations_steps.rb
new file mode 100644
index 0000000..fe3966c
--- /dev/null
+++ b/site/features/step_definitions/participations_steps.rb
@@ -0,0 +1,24 @@
+Given /^some council members$/ do
+ (1..8).each do |n|
+ u = User.new
+ u.name = "Member no #{n}"
+ u.email = "member-#{n}@example.com"
+ u.irc_nick = "member-#{n}"
+ u.password = "Example"
+ u.council_member = true
+ u.save!
+ end
+end
+
+Given /^I am logged in as council member$/ do
+ When 'I am on the login page'
+ When 'I fill in "login" with "member-1@example.com"'
+ When 'I fill in "password" with "Example"'
+ When 'I press "Login"'
+end
+
+Then /^I should see all council members as participants$/ do
+ User.council_member_is(true).each do |m|
+ Then "I should see \"#{m.name}\" within \".collection.participations.participations-collection\""
+ end
+end
diff --git a/site/spec/factories.rb b/site/spec/factories.rb
index 3211032..7405ee9 100644
--- a/site/spec/factories.rb
+++ b/site/spec/factories.rb
@@ -11,3 +11,5 @@ end
Factory.define :agenda do |a|; end
Factory.define :agenda_item do |a|; end
+
+Factory.define :participation do |p|; end
diff --git a/site/spec/models/agenda_item_spec.rb b/site/spec/models/agenda_item_spec.rb
index 95d7659..3df2a59 100644
--- a/site/spec/models/agenda_item_spec.rb
+++ b/site/spec/models/agenda_item_spec.rb
@@ -49,7 +49,7 @@ describe AgendaItem do
it 'should allow no one edit and update items assigned to archived agenda' do
owner = Factory(:user)
- agenda = Factory(:agenda, :state => 'archived')
+ agenda = Factory(:agenda, :state => 'old')
a = Factory(:agenda_item, :user => owner, :agenda => agenda)
for u in users_factory(AllRoles) + [owner]
a.should_not be_editable_by(u)
diff --git a/site/spec/models/agenda_spec.rb b/site/spec/models/agenda_spec.rb
index 0a69551..14a1178 100644
--- a/site/spec/models/agenda_spec.rb
+++ b/site/spec/models/agenda_spec.rb
@@ -93,4 +93,15 @@ describe Agenda do
a1.meeting_time.strftime('%Y-%m-%d').should == today
a2.meeting_time.strftime('%Y-%m-%d').should_not == today
end
+
+ it 'should add all council members and only them as participants when archived' do
+ users_factory(:user, :admin)
+ users_factory(:council, :council)
+ council_names = User.council_member_is(true).collect{ |c| c.name }
+ agenda = Factory(:agenda, :state => 'submissions_closed')
+ agenda.lifecycle.archive!(User.council_member_is(true).first)
+
+ (council_names - agenda.participations.*.participant.*.name).should be_empty
+ (agenda.participations.*.participant.*.name - council_names).should be_empty
+ end
end
diff --git a/site/spec/models/participation_spec.rb b/site/spec/models/participation_spec.rb
new file mode 100644
index 0000000..eb2ecba
--- /dev/null
+++ b/site/spec/models/participation_spec.rb
@@ -0,0 +1,20 @@
+require 'spec_helper'
+
+describe Participation do
+ it 'should not allow anyone to create, edit, update or destroy' do
+ p = Factory(:participation)
+ for u in users_factory(AllRoles)
+ p.should_not be_creatable_by(u)
+ p.should_not be_editable_by(u)
+ p.should_not be_updatable_by(u)
+ p.should_not be_destroyable_by(u)
+ end
+ end
+
+ it 'should allow everybody to view' do
+ p = Factory(:participation)
+ for u in users_factory(AllRoles)
+ p.should be_viewable_by(u)
+ end
+ end
+end