From 3b8998ab71baac653c38af6be09148a958a41b90 Mon Sep 17 00:00:00 2001 From: ilya <ilya@laptop.(none)> Date: Wed, 13 Oct 2010 13:29:45 -0700 Subject: [PATCH] Invitations contains the inviters --- app/controllers/invitations_controller.rb | 11 ++++++++ app/models/user.rb | 25 +++++++++++++++++++ .../mailer/invitation.html.haml | 2 +- spec/models/user/invite_spec.rb | 25 ++++++++++++++++--- 4 files changed, 58 insertions(+), 5 deletions(-) rename app/views/{users => devise}/mailer/invitation.html.haml (58%) diff --git a/app/controllers/invitations_controller.rb b/app/controllers/invitations_controller.rb index 8529044587..e7b2c02626 100644 --- a/app/controllers/invitations_controller.rb +++ b/app/controllers/invitations_controller.rb @@ -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"]) diff --git a/app/models/user.rb b/app/models/user.rb index 7e6d18f90e..152591f1f8 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -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] diff --git a/app/views/users/mailer/invitation.html.haml b/app/views/devise/mailer/invitation.html.haml similarity index 58% rename from app/views/users/mailer/invitation.html.haml rename to app/views/devise/mailer/invitation.html.haml index 884a8fc27f..a6c82a3b04 100644 --- a/app/views/users/mailer/invitation.html.haml +++ b/app/views/devise/mailer/invitation.html.haml @@ -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. diff --git a/spec/models/user/invite_spec.rb b/spec/models/user/invite_spec.rb index 1bb2bf0f62..25d08e8976 100644 --- a/spec/models/user/invite_spec.rb +++ b/spec/models/user/invite_spec.rb @@ -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 -- GitLab