Invitations contains the inviters

This commit is contained in:
ilya 2010-10-13 13:29:45 -07:00
parent bf42b5766c
commit 3b8998ab71
4 changed files with 58 additions and 5 deletions

View file

@ -3,6 +3,17 @@
# the COPYRIGHT file.
class InvitationsController < Devise::InvitationsController
def create
self.resource = current_user.invite_user(params[resource_name])
if resource.errors.empty?
set_flash_message :notice, :send_instructions#, :email => self.resource.email
redirect_to after_sign_in_path_for(resource_name)
else
render_with_scope :new
end
end
def update
begin
user = User.find_by_invitation_token(params["user"]["invitation_token"])

View file

@ -29,6 +29,7 @@ class User
key :invitation_token, String
key :invitation_sent_at, DateTime
key :inviter_ids, Array
key :friend_ids, Array
key :pending_request_ids, Array
key :visible_post_ids, Array
@ -36,6 +37,7 @@ class User
one :person, :class_name => 'Person', :foreign_key => :owner_id
many :inviters, :in => :inviter_ids, :class_name => 'User'
many :friends, :in => :friend_ids, :class_name => 'Person'
many :visible_people, :in => :visible_person_ids, :class_name => 'Person' # One of these needs to go
many :pending_requests, :in => :pending_request_ids, :class_name => 'Request'
@ -263,6 +265,29 @@ class User
end
###Invitations############
def invite_user( opts = {} )
invited_user = User.invite!(:email => opts[:email], :inviter => self)
#invited_user.inviters << self
#invited_user.save!
invited_user
end
def self.invite!(attributes={})
inviter = attributes.delete(:inviter)
invitable = find_or_initialize_with_error_by(:email, attributes.delete(:email))
invitable.attributes = attributes
invitable.inviters << inviter
if invitable.new_record?
invitable.errors.clear if invitable.email.try(:match, Devise.email_regexp)
else
invitable.errors.add(:email, :taken) unless invitable.invited?
end
invitable.invite! if invitable.errors.empty?
invitable
end
def accept_invitation!( opts = {} )
if self.invited?
self.username = opts[:username]

View file

@ -1,7 +1,7 @@
%p
Hello #{@resource.email}!
%p
Someone has invited you to #{root_url}, you can accept it through the link below.
#{(@resource.inviters.count == 1)? ( @resource.inviters.first.real_name " has") : (@resource.inviters.map{|inv| inv.real_name}.join(",") + " have")} invited you to #{root_url}, you can accept it through the link below.
%p= link_to 'Accept invitation', accept_invitation_url(@resource, :invitation_token => @resource.invitation_token)
%p
If you don't want to accept the invitation, please ignore this email.

View file

@ -5,18 +5,34 @@
require 'spec_helper'
describe User do
let!(:invited_user) { create_user_with_invitation("abc")}
let(:inviter) {Factory.create :user}
let!(:invited_user) { create_user_with_invitation("abc", :email => "email@example.com", :inviter => inviter)}
context "creating invites" do
it 'should invite the user' do
pending "weird wrong number of arguments error (0 for 2), which changes if you put in two args"
#User.should_receive(:invite!).and_return(invited_user)
inviter.invite_user(:email => "email@example.com")
end
it 'should add the inviter to the invited_user' do
User.should_receive(:invite!).and_return(invited_user)
invited_user = inviter.invite_user(:email => "email@example.com")
invited_user.reload
invited_user.inviters.include?(inviter).should be true
end
end
context "the acceptance of an invitation" do
it "should create the person with the passed in params" do
Person.count.should be 0
person_count = Person.count
u = invited_user.accept_invitation!(:invitation_token => "abc",
:username => "user",
:password => "secret",
:password_confirmation => "secret",
:person => {:profile => {:first_name => "Bob",
:last_name => "Smith"}} )
Person.count.should be 1
Person.count.should be person_count + 1
u.person.profile.first_name.should == "Bob"
end
end
@ -25,11 +41,12 @@ describe User do
end
def create_user_with_invitation(invitation_token, attributes={})
inviter = attributes.delete(:inviter)
user = User.new({:password => nil, :password_confirmation => nil}.update(attributes))
#puts user.inspect
#user.skip_confirmation!
user.invitation_token = invitation_token
user.invitation_sent_at = Time.now.utc
user.inviters << inviter
user.save(:validate => false)
user
end