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. # the COPYRIGHT file.
class InvitationsController < Devise::InvitationsController 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 def update
begin begin
user = User.find_by_invitation_token(params["user"]["invitation_token"]) user = User.find_by_invitation_token(params["user"]["invitation_token"])

View file

@ -29,6 +29,7 @@ class User
key :invitation_token, String key :invitation_token, String
key :invitation_sent_at, DateTime key :invitation_sent_at, DateTime
key :inviter_ids, Array
key :friend_ids, Array key :friend_ids, Array
key :pending_request_ids, Array key :pending_request_ids, Array
key :visible_post_ids, Array key :visible_post_ids, Array
@ -36,6 +37,7 @@ class User
one :person, :class_name => 'Person', :foreign_key => :owner_id 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 :friends, :in => :friend_ids, :class_name => 'Person'
many :visible_people, :in => :visible_person_ids, :class_name => 'Person' # One of these needs to go 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' many :pending_requests, :in => :pending_request_ids, :class_name => 'Request'
@ -263,6 +265,29 @@ class User
end end
###Invitations############ ###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 = {} ) def accept_invitation!( opts = {} )
if self.invited? if self.invited?
self.username = opts[:username] self.username = opts[:username]

View file

@ -1,7 +1,7 @@
%p %p
Hello #{@resource.email}! Hello #{@resource.email}!
%p %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= link_to 'Accept invitation', accept_invitation_url(@resource, :invitation_token => @resource.invitation_token)
%p %p
If you don't want to accept the invitation, please ignore this email. If you don't want to accept the invitation, please ignore this email.

View file

@ -5,18 +5,34 @@
require 'spec_helper' require 'spec_helper'
describe User do 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 context "the acceptance of an invitation" do
it "should create the person with the passed in params" 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", u = invited_user.accept_invitation!(:invitation_token => "abc",
:username => "user", :username => "user",
:password => "secret", :password => "secret",
:password_confirmation => "secret", :password_confirmation => "secret",
:person => {:profile => {:first_name => "Bob", :person => {:profile => {:first_name => "Bob",
:last_name => "Smith"}} ) :last_name => "Smith"}} )
Person.count.should be 1 Person.count.should be person_count + 1
u.person.profile.first_name.should == "Bob" u.person.profile.first_name.should == "Bob"
end end
end end
@ -25,11 +41,12 @@ describe User do
end end
def create_user_with_invitation(invitation_token, attributes={}) def create_user_with_invitation(invitation_token, attributes={})
inviter = attributes.delete(:inviter)
user = User.new({:password => nil, :password_confirmation => nil}.update(attributes)) user = User.new({:password => nil, :password_confirmation => nil}.update(attributes))
#puts user.inspect
#user.skip_confirmation! #user.skip_confirmation!
user.invitation_token = invitation_token user.invitation_token = invitation_token
user.invitation_sent_at = Time.now.utc user.invitation_sent_at = Time.now.utc
user.inviters << inviter
user.save(:validate => false) user.save(:validate => false)
user user
end end