Connection # == Schema Information # Schema version: 26 # # Table name: connections # # id :integer(11) not null, primary key # person_id :integer(11) # contact_id :integer(11) # status :integer(11) # accepted_at :datetime # created_at :datetime # updated_at :datetime #
class Connection < ActiveRecord::Base extend ActivityLogger extend PreferencesHelper belongs_to :person belongs_to :contact, :class_name => "Person", :foreign_key => "contact_id" has_many :activities, :foreign_key => "item_id", :dependent => :destroy validates_presence_of :person_id, :contact_id # Status codes. ACCEPTED = 0 REQUESTED = 1 PENDING = 2 # Accept a connection request (instance method). # Each connection is really two rows, so delegate this method # to Connection.accept to wrap the whole thing in a transaction. def accept Connection.accept(person_id, contact_id) end def breakup Connection.breakup(person_id, contact_id) end class << self # Return true if the persons are (possibly pending) connections. def exists?(person, contact) not conn(person, contact).nil? end alias exist? exists? # Make a pending connection request. def request(person, contact, send_mail = nil) if send_mail.nil? send_mail = global_prefs.email_notifications? && contact.connection_notifications? end if person == contact or Connection.exists?(person, contact) nil else transaction do create(:person => person, :contact => contact, :status => PENDING) create(:person => contact, :contact => person, :status => REQUESTED) end if send_mail # The order here is important: the mail is sent *to* the contact, # so the connection should be from the contact's point of view. connection = conn(contact, person) PersonMailer.deliver_connection_request(connection) end true end end # Accept a connection request. def accept(person, contact) transaction do accepted_at = Time.now accept_one_side(person, contact, accepted_at) accept_one_side(contact, person, accepted_at) end log_activity(conn(person, contact)) end def connect(person, contact, send_mail = nil) transaction do request(person, contact, send_mail) accept(person, contact) end conn(person, contact) end # Delete a connection or cancel a pending request. def breakup(person, contact) transaction do destroy(conn(person, contact)) destroy(conn(contact, person)) end end # Return a connection based on the person and contact. def conn(person, contact) find_by_person_id_and_contact_id(person, contact) end def accepted?(person, contact) conn(person, contact).status == ACCEPTED end def connected?(person, contact) exist?(person, contact) and accepted?(person, contact) end end private class << self # Update the db with one side of an accepted connection request. def accept_one_side(person, contact, accepted_at) conn = conn(person, contact) conn.update_attributes!(:status => ACCEPTED, :accepted_at => accepted_at) end def log_activity(conn) activity = Activity.create!(:item => conn, :person => conn.person) add_activities(:activity => activity, :person => conn.person) add_activities(:activity => activity, :person => conn.contact) end end end Controller class ConnectionsController < ApplicationController before_filter :login_required, :setup before_filter :authorize_view, :only => :index before_filter :authorize_person, :only => [:edit, :update, :destroy] before_filter :redirect_for_inactive, :only => [:edit, :update] # Show all the contacts for a person. def index @contacts = @person.contacts.paginate(:page => params[:page], :per_page => RASTER_PER_PAGE) end def edit @contact = @connection.contact end def create @contact = Person.find(params[:person_id]) respond_to do |format| if can_request? and Connection.request(current_person, @contact) flash[:notice] = 'Connection request sent!' format.html { redirect_to(home_url) } else # This should only happen when people exceed daily request limit # or something funky like friending themselves. flash[:notice] = "Invalid connection or exceeds daily \ request limit (#{Preference.find(:first).daily_request_limit})." format.html { redirect_to(home_url) } end end end # validate against admin daily connection request limit def can_request? @requests_limited = Preference.find(:first).limit_requests @limit = Preference.find(:first).daily_request_limit if @requests_limited @list = Connection.find_all_by_person_id_and_status(current_person, Connection::PENDING, :order => 'created_at desc') if @limit == 0 false elsif not @[EMAIL PROTECTED] - 1].nil? @[EMAIL PROTECTED] - 1].created_at < 1.day.ago else true end end end def update respond_to do |format| contact = @connection.contact name = contact.name case params[:commit] when "Accept" @connection.accept flash[:notice] = %(Accepted connection with <a href="#{person_url(contact)}">#{name}</a>) when "Decline" @connection.breakup flash[:notice] = "Declined connection with #{name}" end format.html { redirect_to(home_url) } end end def destroy @connection.breakup respond_to do |format| flash[:success] = "Ended connection with [EMAIL PROTECTED]" format.html { redirect_to( person_connections_url(current_person)) } end end private def setup # Connections have same body class as profiles. @body = "profile" end def authorize_view @person = Person.find(params[:person_id]) unless (current_person?(@person) or Connection.connected?(@person, current_person)) redirect_to home_url end end # Make sure the current person is correct for this connection. def authorize_person @connection = Connection.find(params[:id], :include => [:person, :contact]) unless current_person?(@connection.person) flash[:error] = "Invalid connection." redirect_to home_url end rescue ActiveRecord::RecordNotFound flash[:error] = "Invalid or expired connection request" redirect_to home_url end # Redirect if the target person is inactive. # Suppose Alice sends Bob a connection request, but then the admin # deactivates Alice. We don't want Bob to be able to make the connection. def redirect_for_inactive if @connection.contact.deactivated? flash[:error] = "Invalid connection request: person deactivated" redirect_to home_url end end end Error 1) Spec::Mocks::MockExpectationError in 'ConnectionsController should create a new connection request' Mock 'Class' expected :request with (I'm Quentin, I'm Aaron) once, but received it 0 times ./spec/controllers/connections_controller_spec.rb:18: Finished in 10.707133 seconds David Chelimsky wrote: > On Sun, Aug 10, 2008 at 11:03 AM, Jesse Crockett <[EMAIL PROTECTED]> > wrote: >> require File.dirname(__FILE__) + '/../spec_helper' >> end >> >> @contact = people(:aaron) >> and_return(true) >> post :create, :person_id => @contact >> response.should redirect_to(home_url) >> end >> >> # abridged >> >> The two vars needed can be accessed in the connection_spec with >> @global_prefs.limit_requests and @global_prefs.daily_request_limit >> >> Please help me clear this problem. > > Please post the code for Connection and Controller as well. -- Posted via http://www.ruby-forum.com/. _______________________________________________ rspec-users mailing list rspec-users@rubyforge.org http://rubyforge.org/mailman/listinfo/rspec-users