diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index c1215bdad..7c9fa3ae6 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -68,6 +68,12 @@ class UsersController < ApplicationController else flash[:error] = I18n.t 'users.update.unconfirmed_email_not_changed' end + elsif u[:auto_follow_back] + if @user.update_attributes(u) + flash[:notice] = I18n.t 'users.update.follow_settings_changed' + else + flash[:error] = I18n.t 'users.update.follow_settings_not_changed' + end end elsif aspect_order = params[:reorder_aspects] @user.reorder_aspects(aspect_order) diff --git a/app/helpers/aspect_global_helper.rb b/app/helpers/aspect_global_helper.rb index e84bfa666..b1d373f2c 100644 --- a/app/helpers/aspect_global_helper.rb +++ b/app/helpers/aspect_global_helper.rb @@ -79,4 +79,12 @@ LISTITEM def dropdown_may_create_new_aspect @aspect == :profile || @aspect == :tag || @aspect == :search || @aspect == :notification || params[:action] == "getting_started" end + + def aspect_options_for_select(aspects) + options = {} + aspects.each do |aspect| + options[aspect.to_s] = aspect.id + end + options + end end diff --git a/app/models/request.rb b/app/models/request.rb index 590a76dda..f9345fdec 100644 --- a/app/models/request.rb +++ b/app/models/request.rb @@ -69,6 +69,7 @@ class Request end # Finds or initializes a corresponding [Contact], and will set Contact#sharing to true + # Follows back if user setting is set so # @note A [Contact] may already exist if the [Request]'s recipient is sharing with the sender # @return [Request] def receive(user, person) @@ -77,6 +78,8 @@ class Request contact = user.contacts.find_or_initialize_by_person_id(self.sender.id) contact.sharing = true contact.save + + user.share_with(person, user.auto_follow_back_aspect) if user.auto_follow_back self end diff --git a/app/models/user.rb b/app/models/user.rb index b87f24784..edb976fcf 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -36,6 +36,7 @@ class User < ActiveRecord::Base has_many :invitations_from_me, :class_name => 'Invitation', :foreign_key => :sender_id, :dependent => :destroy has_many :invitations_to_me, :class_name => 'Invitation', :foreign_key => :recipient_id, :dependent => :destroy has_many :aspects, :order => 'order_id ASC' + belongs_to :auto_follow_back_aspect, :class_name => 'Aspect'#, :foreign_key => 'auto_follow_back_aspect_id' has_many :aspect_memberships, :through => :aspects has_many :contacts has_many :contact_people, :through => :contacts, :source => :person @@ -60,7 +61,9 @@ class User < ActiveRecord::Base :disable_mail, :invitation_service, :invitation_identifier, - :show_community_spotlight_in_stream + :show_community_spotlight_in_stream, + :auto_follow_back, + :auto_follow_back_aspect_id def self.all_sharing_with_person(person) diff --git a/app/views/users/edit.html.haml b/app/views/users/edit.html.haml index d0e6ac949..6e06b8eb8 100644 --- a/app/views/users/edit.html.haml +++ b/app/views/users/edit.html.haml @@ -90,6 +90,29 @@ %br %hr %br + + %h3#auto-follow-back-preferences + = t('.following') + = form_for current_user, :url => user_path, :html => { :method => :put } do |f| + = f.error_messages + + %p.checkbox_select + = f.label :auto_follow_back, t('.auto_follow_back') + = f.check_box :auto_follow_back + %br + %p.checkbox_select + %span{:style => "color: #999"} + = t('.auto_follow_aspect') + = f.select :auto_follow_back_aspect_id, aspect_options_for_select(current_user.aspects) + + %br + = f.submit t('.change'), :class => 'button' + + %br + %br + %hr + %br + %h3#getting-started-preferences = t('.show_getting_started') diff --git a/config/locales/diaspora/en.yml b/config/locales/diaspora/en.yml index 91889a651..28f374b67 100644 --- a/config/locales/diaspora/en.yml +++ b/config/locales/diaspora/en.yml @@ -944,6 +944,9 @@ en: show_community_spotlight: "Show Community Spotlight in Stream?" show_getting_started: 'Re-enable Getting Started' getting_started: 'New User Prefrences' + following: "Following Settings" + auto_follow_back: "Automatically follow back if a someone follows you" + auto_follow_aspect: "Aspect for automatically followed users:" privacy_settings: title: "Privacy Settings" @@ -984,6 +987,8 @@ en: email_notifications_changed: "Email notifications changed" unconfirmed_email_changed: "Email changed. Needs activation." unconfirmed_email_not_changed: "Email change failed" + follow_settings_changed: "Follow settings changed" + follow_settings_not_changed: "Follow settings change failed." public: does_not_exist: "User %{username} does not exist!" confirm_email: diff --git a/db/migrate/20111114173111_add_auto_follow_back_to_users.rb b/db/migrate/20111114173111_add_auto_follow_back_to_users.rb new file mode 100644 index 000000000..165691b23 --- /dev/null +++ b/db/migrate/20111114173111_add_auto_follow_back_to_users.rb @@ -0,0 +1,11 @@ +class AddAutoFollowBackToUsers < ActiveRecord::Migration + def self.up + add_column :users, :auto_follow_back, :boolean, :default => false + add_column :users, :auto_follow_back_aspect_id, :integer + end + + def self.down + remove_column :users, :auto_follow_back + remove_column :users, :auto_follow_back_aspect + end +end diff --git a/db/schema.rb b/db/schema.rb index 63a1b222d..b050a6bcc 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -1,4 +1,3 @@ -# encoding: UTF-8 # This file is auto-generated from the current state of the database. Instead # of editing this file, please use the migrations feature of Active Record to # incrementally modify your database, and then regenerate this schema definition. @@ -11,7 +10,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20111101202137) do +ActiveRecord::Schema.define(:version => 20111114173111) do create_table "aspect_memberships", :force => true do |t| t.integer "aspect_id", :null => false @@ -54,17 +53,17 @@ ActiveRecord::Schema.define(:version => 20111101202137) do end create_table "comments", :force => true do |t| - t.text "text", :null => false - t.integer "commentable_id", :null => false - t.integer "author_id", :null => false - t.string "guid", :null => false + t.text "text", :null => false + t.integer "commentable_id", :null => false + t.integer "author_id", :null => false + t.string "guid", :null => false t.text "author_signature" t.text "parent_author_signature" t.text "youtube_titles" t.datetime "created_at" t.datetime "updated_at" - t.integer "likes_count", :default => 0, :null => false - t.string "commentable_type", :default => "Post", :null => false + t.integer "likes_count", :default => 0, :null => false + t.string "commentable_type", :limit => 60, :default => "Post", :null => false end add_index "comments", ["author_id"], :name => "index_comments_on_person_id" @@ -253,6 +252,7 @@ ActiveRecord::Schema.define(:version => 20111101202137) do add_index "people", ["owner_id"], :name => "index_people_on_owner_id", :unique => true create_table "photos", :force => true do |t| + t.integer "tmp_old_id" t.integer "author_id", :null => false t.boolean "public", :default => false, :null => false t.string "diaspora_handle" @@ -371,12 +371,12 @@ ActiveRecord::Schema.define(:version => 20111101202137) do add_index "services", ["user_id"], :name => "index_services_on_user_id" create_table "share_visibilities", :force => true do |t| - t.integer "shareable_id", :null => false + t.integer "shareable_id", :null => false t.datetime "created_at" t.datetime "updated_at" - t.boolean "hidden", :default => false, :null => false - t.integer "contact_id", :null => false - t.string "shareable_type", :default => "Post", :null => false + t.boolean "hidden", :default => false, :null => false + t.integer "contact_id", :null => false + t.string "shareable_type", :limit => 60, :default => "Post", :null => false end add_index "share_visibilities", ["contact_id"], :name => "index_post_visibilities_on_contact_id" @@ -453,6 +453,8 @@ ActiveRecord::Schema.define(:version => 20111101202137) do t.string "confirm_email_token", :limit => 30 t.datetime "locked_at" t.boolean "show_community_spotlight_in_stream", :default => true, :null => false + t.boolean "auto_follow_back", :default => false + t.integer "auto_follow_back_aspect_id" end add_index "users", ["authentication_token"], :name => "index_users_on_authentication_token", :unique => true diff --git a/spec/models/request_spec.rb b/spec/models/request_spec.rb index 49cdaf858..bf969313d 100644 --- a/spec/models/request_spec.rb +++ b/spec/models/request_spec.rb @@ -92,6 +92,28 @@ describe Request do :into => eve.aspects.first).receive(alice, eve.person) alice.contact_for(eve.person).should be_sharing end + + it 'shares back if auto_following is enabled' do + alice.auto_follow_back = true + alice.auto_follow_back_aspect = alice.aspects.first + eve.save + + Request.diaspora_initialize(:from => eve.person, :to => alice.person, + :into => eve.aspects.first).receive(alice, eve.person) + + eve.contact_for(alice.person).should be_sharing + end + + it 'shares not back if auto_following is not enabled' do + alice.auto_follow_back = false + alice.auto_follow_back_aspect = alice.aspects.first + eve.save + + Request.diaspora_initialize(:from => eve.person, :to => alice.person, + :into => eve.aspects.first).receive(alice, eve.person) + + eve.contact_for(alice.person).should be_nil + end end context 'xml' do