work in progress. need to update the views for the controller changes
This commit is contained in:
parent
6858e2e543
commit
17a801394e
14 changed files with 260 additions and 58 deletions
43
'
Normal file
43
'
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
# Copyright (c) 2010, Diaspora Inc. This file is
|
||||||
|
# licensed under the Affero General Public License version 3 or later. See
|
||||||
|
# the COPYRIGHT file.
|
||||||
|
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe AspectMembershipsController do
|
||||||
|
before do
|
||||||
|
@user = alice
|
||||||
|
@user2 = bob
|
||||||
|
|
||||||
|
@aspect0 = @user.aspects.first
|
||||||
|
@aspect1 = @user.aspects.create(:name => "another aspect")
|
||||||
|
@aspect2 = @user2.aspects.first
|
||||||
|
|
||||||
|
@contact = @user.contact_for(@user2.person)
|
||||||
|
@user.getting_started = false
|
||||||
|
@user.save
|
||||||
|
sign_in :user, @user
|
||||||
|
@controller.stub(:current_user).and_return(@user)
|
||||||
|
request.env["HTTP_REFERER"] = 'http://' + request.host
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#new" do
|
||||||
|
it 'succeeds' do
|
||||||
|
get :new
|
||||||
|
response.should be_success
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#destroy" do
|
||||||
|
it 'removes contacts from an aspect' do
|
||||||
|
@user.add_contact_to_aspect(@contact, @aspect1)
|
||||||
|
delete :destroy,
|
||||||
|
:format => 'js', :id => 123,
|
||||||
|
:person_id => @user2.person.id,
|
||||||
|
:aspect_id => @aspect0.id
|
||||||
|
response.should be_success
|
||||||
|
@aspect0.reload
|
||||||
|
@aspect0.contacts.include?(@contact).should be false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
50
app/controllers/aspect_memberships_controller.rb
Normal file
50
app/controllers/aspect_memberships_controller.rb
Normal file
|
|
@ -0,0 +1,50 @@
|
||||||
|
# Copyright (c) 2010, Diaspora Inc. This file is
|
||||||
|
# licensed under the Affero General Public License version 3 or later. See
|
||||||
|
# the COPYRIGHT file.
|
||||||
|
#
|
||||||
|
|
||||||
|
class AspectMembershipsController < ApplicationController
|
||||||
|
before_filter :authenticate_user!
|
||||||
|
|
||||||
|
def new
|
||||||
|
render :nothing => true
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
def destroy
|
||||||
|
#note :id is garbage
|
||||||
|
|
||||||
|
|
||||||
|
@person_id = params[:person_id]
|
||||||
|
@aspect_id = params[:aspect_id]
|
||||||
|
|
||||||
|
contact = current_user.contact_for(Person.where(:id => @person_id).first)
|
||||||
|
|
||||||
|
membership = contact ? contact.aspect_memberships.where(:aspect_id => @aspect_id).first : nil
|
||||||
|
|
||||||
|
if membership && membership.destroy
|
||||||
|
flash.now[:notice] = I18n.t 'aspect_memberships.destroy.success'
|
||||||
|
|
||||||
|
respond_to do |format|
|
||||||
|
format.js { render :json => {:button_html =>
|
||||||
|
render_to_string(:partial => 'aspects/remove_from_aspect',
|
||||||
|
:locals => {:aspect_id => @aspect_id,
|
||||||
|
:person_id => @person_id}),
|
||||||
|
:aspect_id => @aspect_id
|
||||||
|
}}
|
||||||
|
format.html{
|
||||||
|
redirect_to :back
|
||||||
|
}
|
||||||
|
end
|
||||||
|
else
|
||||||
|
flash.now[:error] = I18n.t 'aspect_memberships.destroy.failure'
|
||||||
|
errors = membership ? membership.errors.full_messages : t('aspect_memberships.destroy.no_membership')
|
||||||
|
respond_to do |format|
|
||||||
|
format.js { render :text => errors, :status => 403 }
|
||||||
|
format.html{
|
||||||
|
redirect_to :back
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -177,35 +177,6 @@ class AspectsController < ApplicationController
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def remove_from_aspect
|
|
||||||
begin current_user.delete_person_from_aspect(params[:person_id], params[:aspect_id])
|
|
||||||
@person_id = params[:person_id]
|
|
||||||
@aspect_id = params[:aspect_id]
|
|
||||||
flash.now[:notice] = I18n.t 'aspects.remove_from_aspect.success'
|
|
||||||
|
|
||||||
respond_to do |format|
|
|
||||||
format.js { render :json => {:button_html =>
|
|
||||||
render_to_string(:partial => 'aspects/remove_from_aspect',
|
|
||||||
:locals => {:aspect_id => @aspect_id,
|
|
||||||
:person_id => @person_id}),
|
|
||||||
:aspect_id => @aspect_id
|
|
||||||
}}
|
|
||||||
format.html{
|
|
||||||
redirect_to :back
|
|
||||||
}
|
|
||||||
end
|
|
||||||
rescue Exception => e
|
|
||||||
flash.now[:error] = I18n.t 'aspects.remove_from_aspect.failure'
|
|
||||||
|
|
||||||
respond_to do |format|
|
|
||||||
format.js { render :text => e, :status => 403 }
|
|
||||||
format.html{
|
|
||||||
redirect_to :back
|
|
||||||
}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
private
|
||||||
def invite_or_add_contact_to_aspect( aspect, person, contact)
|
def invite_or_add_contact_to_aspect( aspect, person, contact)
|
||||||
if contact
|
if contact
|
||||||
|
|
|
||||||
11
app/controllers/contacts_controller.rb
Normal file
11
app/controllers/contacts_controller.rb
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
# Copyright (c) 2010, Diaspora Inc. This file is
|
||||||
|
# licensed under the Affero General Public License version 3 or later. See
|
||||||
|
# the COPYRIGHT file.
|
||||||
|
|
||||||
|
class ContactsController < ApplicationController
|
||||||
|
before_filter :authenticate_user!
|
||||||
|
|
||||||
|
def new
|
||||||
|
render :nothing => true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -9,4 +9,15 @@ class AspectMembership < ActiveRecord::Base
|
||||||
has_one :user, :through => :contact
|
has_one :user, :through => :contact
|
||||||
has_one :person, :through => :contact
|
has_one :person, :through => :contact
|
||||||
|
|
||||||
|
before_destroy :ensure_membership
|
||||||
|
|
||||||
|
|
||||||
|
def ensure_membership
|
||||||
|
if self.contact.aspect_memberships.count == 1
|
||||||
|
errors[:base] << I18n.t('shared.contact_list.cannot_remove')
|
||||||
|
false
|
||||||
|
else
|
||||||
|
true
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -92,18 +92,6 @@ class User < ActiveRecord::Base
|
||||||
contact.aspect_memberships.create!(:aspect => aspect)
|
contact.aspect_memberships.create!(:aspect => aspect)
|
||||||
end
|
end
|
||||||
|
|
||||||
def delete_person_from_aspect(person_id, aspect_id, opts = {})
|
|
||||||
aspect = Aspect.find(aspect_id)
|
|
||||||
raise "Can not delete a person from an aspect you do not own" unless aspect.user == self
|
|
||||||
contact = contact_for Person.find(person_id)
|
|
||||||
|
|
||||||
if opts[:force] || contact.aspect_ids.count > 1
|
|
||||||
contact.aspects.delete(aspect)
|
|
||||||
else
|
|
||||||
raise "Can not delete a person from last aspect"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
######## Posting ########
|
######## Posting ########
|
||||||
def build_post(class_name, opts = {})
|
def build_post(class_name, opts = {})
|
||||||
opts[:person] = self.person
|
opts[:person] = self.person
|
||||||
|
|
|
||||||
|
|
@ -142,6 +142,12 @@ en:
|
||||||
contact_list:
|
contact_list:
|
||||||
all_contacts: "All contacts"
|
all_contacts: "All contacts"
|
||||||
cannot_remove: "Cannot remove person from last aspect. (If you want to disconnect from this person you must remove contact.)"
|
cannot_remove: "Cannot remove person from last aspect. (If you want to disconnect from this person you must remove contact.)"
|
||||||
|
aspect_memberships:
|
||||||
|
destroy:
|
||||||
|
success: "Successfully removed person from aspect"
|
||||||
|
failure: "Failed to remove person from aspect"
|
||||||
|
no_membership: "Could not find the selected person in that aspect"
|
||||||
|
|
||||||
aspects:
|
aspects:
|
||||||
contacts_visible: "Contacts in this aspect will be able to see each other."
|
contacts_visible: "Contacts in this aspect will be able to see each other."
|
||||||
contacts_not_visible: "Contacts in this aspect will not be able to see each other."
|
contacts_not_visible: "Contacts in this aspect will not be able to see each other."
|
||||||
|
|
@ -194,9 +200,6 @@ en:
|
||||||
remove: "remove"
|
remove: "remove"
|
||||||
aspect_not_empty: "Aspect not empty"
|
aspect_not_empty: "Aspect not empty"
|
||||||
are_you_sure: "Are you sure you want to delete this aspect?"
|
are_you_sure: "Are you sure you want to delete this aspect?"
|
||||||
remove_from_aspect:
|
|
||||||
success: "Successfully removed person from aspect"
|
|
||||||
failure: "Failed to remove person from aspect"
|
|
||||||
seed:
|
seed:
|
||||||
family: "Family"
|
family: "Family"
|
||||||
work: "Work"
|
work: "Work"
|
||||||
|
|
@ -404,7 +407,7 @@ en:
|
||||||
aspect_list:
|
aspect_list:
|
||||||
edit_membership: "edit aspect membership"
|
edit_membership: "edit aspect membership"
|
||||||
share_with_pane:
|
share_with_pane:
|
||||||
add_new_aspect: "add new aspect"
|
add_new_aspect: "add to new aspect"
|
||||||
requests:
|
requests:
|
||||||
manage_aspect_contacts:
|
manage_aspect_contacts:
|
||||||
manage_within: "Manage contacts within"
|
manage_within: "Manage contacts within"
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,9 @@ Diaspora::Application.routes.draw do
|
||||||
resources :notifications, :only => [:index, :update]
|
resources :notifications, :only => [:index, :update]
|
||||||
resources :posts, :only => [:show], :path => '/p/'
|
resources :posts, :only => [:show], :path => '/p/'
|
||||||
|
|
||||||
|
resources :contacts
|
||||||
|
resources :aspect_memberships
|
||||||
|
|
||||||
match '/people/share_with' => 'people#share_with', :as => 'share_with'
|
match '/people/share_with' => 'people#share_with', :as => 'share_with'
|
||||||
resources :people, :except => [:edit, :update] do
|
resources :people, :except => [:edit, :update] do
|
||||||
resources :status_messages
|
resources :status_messages
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,7 @@ module Diaspora
|
||||||
end
|
end
|
||||||
|
|
||||||
def contact_for(person)
|
def contact_for(person)
|
||||||
|
return nil unless person
|
||||||
contact_for_person_id(person.id)
|
contact_for_person_id(person.id)
|
||||||
end
|
end
|
||||||
def aspects_with_post(post_id)
|
def aspects_with_post(post_id)
|
||||||
|
|
|
||||||
72
spec/controllers/aspect_memberships_controller_spec.rb
Normal file
72
spec/controllers/aspect_memberships_controller_spec.rb
Normal file
|
|
@ -0,0 +1,72 @@
|
||||||
|
# Copyright (c) 2010, Diaspora Inc. This file is
|
||||||
|
# licensed under the Affero General Public License version 3 or later. See
|
||||||
|
# the COPYRIGHT file.
|
||||||
|
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe AspectMembershipsController do
|
||||||
|
before do
|
||||||
|
@user = alice
|
||||||
|
@user2 = bob
|
||||||
|
|
||||||
|
@aspect0 = @user.aspects.first
|
||||||
|
@aspect1 = @user.aspects.create(:name => "another aspect")
|
||||||
|
@aspect2 = @user2.aspects.first
|
||||||
|
|
||||||
|
@contact = @user.contact_for(@user2.person)
|
||||||
|
@user.getting_started = false
|
||||||
|
@user.save
|
||||||
|
sign_in :user, @user
|
||||||
|
@controller.stub(:current_user).and_return(@user)
|
||||||
|
request.env["HTTP_REFERER"] = 'http://' + request.host
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#new" do
|
||||||
|
it 'succeeds' do
|
||||||
|
get :new
|
||||||
|
response.should be_success
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#destroy" do
|
||||||
|
it 'removes contacts from an aspect' do
|
||||||
|
@user.add_contact_to_aspect(@contact, @aspect1)
|
||||||
|
delete :destroy,
|
||||||
|
:format => 'js', :id => 123,
|
||||||
|
:person_id => @user2.person.id,
|
||||||
|
:aspect_id => @aspect0.id
|
||||||
|
response.should be_success
|
||||||
|
@aspect0.reload
|
||||||
|
@aspect0.contacts.include?(@contact).should be false
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'aspect membership does not exist' do
|
||||||
|
it 'person does not exist' do
|
||||||
|
delete :destroy,
|
||||||
|
:format => 'js', :id => 123,
|
||||||
|
:person_id => 4324525,
|
||||||
|
:aspect_id => @aspect0.id
|
||||||
|
response.should_not be_success
|
||||||
|
response.body.should include "Could not find the selected person in that aspect"
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'contact is not in the aspect' do
|
||||||
|
delete :destroy,
|
||||||
|
:format => 'js', :id => 123,
|
||||||
|
:person_id => @user2.person.id,
|
||||||
|
:aspect_id => 2321
|
||||||
|
response.should_not be_success
|
||||||
|
response.body.should include "Could not find the selected person in that aspect"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'has the error of cannot delete contact from last aspect if its the last aspect' do
|
||||||
|
delete :destroy,
|
||||||
|
:format => 'js', :id => 123,
|
||||||
|
:person_id => @user2.person.id,
|
||||||
|
:aspect_id => @aspect0.id
|
||||||
|
response.should_not be_success
|
||||||
|
response.body.should include "Cannot remove person from last aspect"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -319,19 +319,6 @@ describe AspectsController do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "#remove_from_aspect" do
|
|
||||||
it 'removes contacts from an aspect' do
|
|
||||||
@user.add_contact_to_aspect(@contact, @aspect1)
|
|
||||||
post 'remove_from_aspect',
|
|
||||||
:format => 'js',
|
|
||||||
:person_id => @user2.person.id,
|
|
||||||
:aspect_id => @aspect0.id
|
|
||||||
response.should be_success
|
|
||||||
@aspect0.reload
|
|
||||||
@aspect0.contacts.include?(@contact).should be false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe "#hashes_for_posts" do
|
describe "#hashes_for_posts" do
|
||||||
it 'returns only distinct people' do
|
it 'returns only distinct people' do
|
||||||
end
|
end
|
||||||
|
|
|
||||||
24
spec/controllers/contacts_controller_spec.rb
Normal file
24
spec/controllers/contacts_controller_spec.rb
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
# Copyright (c) 2010, Diaspora Inc. This file is
|
||||||
|
# licensed under the Affero General Public License version 3 or later. See
|
||||||
|
# the COPYRIGHT file.
|
||||||
|
|
||||||
|
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe ContactsController do
|
||||||
|
render_views
|
||||||
|
|
||||||
|
before do
|
||||||
|
@user = alice
|
||||||
|
sign_in :user, @user
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'new' do
|
||||||
|
|
||||||
|
it 'succeeds' do
|
||||||
|
pending "This is going to be new request"
|
||||||
|
get :new
|
||||||
|
response.should be_success
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
34
spec/models/aspect_membership_spec.rb
Normal file
34
spec/models/aspect_membership_spec.rb
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
# Copyright (c) 2010, Diaspora Inc. This file is
|
||||||
|
# licensed under the Affero General Public License version 3 or later. See
|
||||||
|
# the COPYRIGHT file.
|
||||||
|
#
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe AspectMembership do
|
||||||
|
before do
|
||||||
|
@user = alice
|
||||||
|
@user2 = bob
|
||||||
|
@aspect = @user.aspects.create(:name => 'Boozers')
|
||||||
|
@contact = @user.contact_for(@user2.person)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'has an aspect' do
|
||||||
|
am = AspectMembership.new(:aspect => @aspect)
|
||||||
|
am.aspect.should == @aspect
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'has a contact' do
|
||||||
|
am = AspectMembership.new(:contact => @contact)
|
||||||
|
am.contact.should == @contact
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'validations' do
|
||||||
|
describe '#ensure_membership' do
|
||||||
|
it 'does not destroy from the final aspect' do
|
||||||
|
am = @contact.aspect_memberships.first
|
||||||
|
am.destroy
|
||||||
|
am.errors.should_not be_empty
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -193,6 +193,10 @@ describe User do
|
||||||
@user.should_receive(:contact_for_person_id).with(person_one.id)
|
@user.should_receive(:contact_for_person_id).with(person_one.id)
|
||||||
@user.contact_for(person_one)
|
@user.contact_for(person_one)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'returns nil if the input is nil' do
|
||||||
|
@user.contact_for(nil).should be_nil
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue