Skip to content

Commit

Permalink
allow for adding/controaling of members. closes #47
Browse files Browse the repository at this point in the history
  • Loading branch information
zr2d2 committed Mar 27, 2012
1 parent bf8e933 commit d87d9c7
Show file tree
Hide file tree
Showing 6 changed files with 110 additions and 36 deletions.
60 changes: 32 additions & 28 deletions app/controllers/memberships_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,13 @@ class MembershipsController < ApplicationController
# POST /groups/:group_id/memberships.xml
def create
@group = Group.find(params[:group_id])
@membership = Membership.new({
:user_id => params[:membership][:user_id],
:group_id => params[:group_id],
:level => Membership::LEVELS[:pending]})
@membership = Membership.find_or_create_by_user_id_and_group_id(params[:membership][:user_id], params[:group_id])

if params[:autoconfirm]
@membership.update_attributes(:level => Membership::LEVELS[:regular])
else
@membership.update_attributes(:level => Membership::LEVELS[:pending])
end

respond_to do |format|
if @membership.save
Expand All @@ -18,30 +21,6 @@ def create
end
end
end

# PUT /groups/:group_id/memberships/1/promote
# PUT /groups/:group_id/memberships/1/promote.xml
def promote
@membership = Membership.find(params[:id])
@membership.level = Membership::LEVELS[:leader]
if @membership.save
redirect_to(@membership.group, :notice => t(:member_promoted))
else
redirect_to @membership.group
end
end

# PUT /groups/:group_id/memberships/1/demote
# PUT /groups/:group_id/memberships/1/demote.xml
def demote
@membership = Membership.find(params[:id])
@membership.level = Membership::LEVELS[:regular]
if @membership.save
redirect_to(@membership.group, :notice => t(:member_demoted))
else
redirect_to @membership.group
end
end

# PUT /groups/:group_id/memberships/1
# PUT /groups/:group_id/memberships/1.xml
Expand Down Expand Up @@ -72,4 +51,29 @@ def destroy
format.xml { head :ok }
end
end

# PUT /groups/:group_id/memberships/1/approve
def approve
membership = Membership.find(params[:id])
respond_to do |format|
if membership.approve()
format.html { redirect_to(group_path(params[:group_id]), :notice => t(:membership_approved)) }
else
format.html { redirect_to(group_path(params[:group_id]), :notice => t(:membership_failed_approve)) }
end
end
end

# PUT /groups/:group_id/memberships/1/deny
def deny
membership = Membership.find(params[:id])
respond_to do |format|
if membership.deny()
format.html { redirect_to(group_path(params[:group_id]), :notice => t(:membersip_denied)) }
else
logger.debug membership.errors
format.html { redirect_to(group_path(params[:group_id]), :notice => t(:membership_failed_deny)) }
end
end
end
end
43 changes: 41 additions & 2 deletions app/models/membership.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,56 @@ class Membership < ActiveRecord::Base
belongs_to :user
belongs_to :group

#Validations
# Validations
validates :user, :presence => true, :associated => true
validates :group, :presence => true, :associated => true
validates_uniqueness_of :user_id, :scope => :group_id

#Scoping shortcuts for leaders/regular
# Scoping shortcuts for leaders/regular
scope :leader, where(:level => Membership::LEVELS[:leader])
scope :regular, where(:level => Membership::LEVELS[:regular])

#Scoping shortcuts for approved/pending
scope :approved, where(":level > Membership::LEVELS[:pending]")
scope :pending, where(:level => Membership::LEVELS[:pending])

# Test if the membership has been approved.
def is_approved?
level > Membership::LEVELS[:pending]
end

# Test if the membership has been denied.
def is_denied?
level == Membership::LEVELS[:denied]
end

# Test if the membership is pending.
def is_pending?
level == Membership::LEVELS[:pending]
end

# A shortcut to test if a membership represents a leader
def is_leader?
level == Membership::LEVELS[:leader]
end

# Approve a user in group
def approve()
if update_attributes({:level => Membership::LEVELS[:regular]})
true
else
reload
false
end
end

# Deny a user in group
def deny()
if update_attributes({:level => Membership::LEVELS[:denied]})
true
else
reload
false
end
end
end
2 changes: 1 addition & 1 deletion app/views/groups/index.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
<% @groups.each do |group| %>
<tr>
<td><%= group.name %></td>
<td><%= link_to 'Show', group %> <%= link_to 'Edit', edit_group_path(group) %> <%= link_to 'Destroy', group, :confirm => 'Are you sure?', :method => :delete %><%= link_to_if(user_signed_in?, "Join", { :controller => "memberships", :action => "create", :group_id => group.id, :membership => {:user_id => current_user.id}}, :method => :post) %></td>
<td><%= link_to 'Show', group %> <%= link_to 'Edit', edit_group_path(group) %> <%= link_to 'Destroy', group, :confirm => 'Are you sure?', :method => :delete %><%= link_to("Join", group_memberships_path(:group_id => group.id, :membership => {:user_id => current_user.id}), :method => :post) if user_signed_in? %></td>
</tr>
<% end %>
</table>
Expand Down
27 changes: 24 additions & 3 deletions app/views/groups/show.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,38 @@
<% @group.memberships.leader.each do |membership| %>
<li>
<%= membership.user.name %> -
<%= link_to "Demote", demote_group_membership_path(@group, membership), :method => :put %>
<! add logic to limmit to group leaders -->
<%= form_for([@group, membership]) do |f| %>
<%= f.select :level, Membership::LEVELS %>
<%= f.submit %>
<% end %>
</li>
<% end %>
</ul>
</p>
<p>
<b>Members:</b>
<ul>
<% @group.memberships.each do |membership| %>
<% @group.memberships.regular.each do |membership| %>
<li>
<%= membership.user.name %> - <%= link_to "Destroy", [@group, membership], :confirm => 'Are you sure?', :method => :delete %>
<% if !membership.is_leader? %> - <%= link_to "Promote", promote_group_membership_path(@group, membership), :method => :put %><% end %>
<! add logic to limit to group leaders -->
<%= form_for([@group, membership]) do |f| %>
<%= f.select :level, Membership::LEVELS %>
<%= f.submit %>
<% end %>
</li>
<% end %>
</ul>
</p>
<p>
<b>Pending Members:</b>
<ul>
<% @group.memberships.pending.each do |membership| %>
<li>
<! add logic to limit to group leaders -->
<%= membership.user.name %> - <%= link_to "Aprove", approve_group_membership_path(@group, membership), :confirm => 'Are you sure?', :method => :put %>
<%= link_to "Deny", deny_group_membership_path(@group, membership), :confirm => 'Are you sure?', :method => :put %>
</li>
<% end %>
</ul>
Expand All @@ -28,6 +48,7 @@
<b>Add Member:</b>
<%= form_for([@group, @group.memberships.new]) do |f| %>
<%= f.collection_select :user_id, User.all - @group.users, :id, :name %>
<%= hidden_field_tag 'autoconfirm', true %>
<%= f.submit %>
<% end %>
</p>
Expand Down
4 changes: 2 additions & 2 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@
resources :groups do
resources :memberships, :only => [:create, :update, :destroy] do
member do
put :promote
put :demote
put :approve
put :deny
end
end
end
Expand Down
10 changes: 10 additions & 0 deletions test/functional/memberships_controller_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,14 @@ def setup
assert_redirected_to group_path(group)
end

test "should autoaprove members added by admins" do
assert_difference('Membership.count', 1) do
post :create, {:membership => {:user_id => users(:kristen).id}, :group_id => groups(:wtg).id, :autoconfirm => true}
end
actual = assigns(:membership)
group = assigns(:group)
assert_equal(Membership::LEVELS[:regular], actual.level)
assert_redirected_to group_path(group)
end

end

0 comments on commit d87d9c7

Please sign in to comment.