Commit 27eb1487df3f8f1eb7928bb692cfa4c84f35b53e

Authored by Caio Almeida
Committed by Daniela Feitosa
1 parent cd4a0e06

Done

app/controllers/my_profile/profile_editor_controller.rb
... ... @@ -14,6 +14,7 @@ class ProfileEditorController < MyProfileController
14 14 @profile_data = profile
15 15 @possible_domains = profile.possible_domains
16 16 if request.post?
  17 + params[:profile_data][:fields_privacy] ||= {} if profile.person? && params[:profile_data].is_a?(Hash)
17 18 begin
18 19 Profile.transaction do
19 20 Image.transaction do
... ...
app/helpers/application_helper.rb
... ... @@ -866,7 +866,7 @@ module ApplicationHelper
866 866 end
867 867 else
868 868 if profile.active_fields.include?(name)
869   - result = field_html
  869 + result = content_tag('div', field_html + profile_field_privacy_selector(profile, name), :class => 'field-with-privacy-selector')
870 870 end
871 871 end
872 872  
... ... @@ -881,6 +881,10 @@ module ApplicationHelper
881 881 result
882 882 end
883 883  
  884 + def profile_field_privacy_selector(profile, name)
  885 + profile.public? ? content_tag('div', check_box_tag('profile_data[fields_privacy][' + name + ']', 'public', profile.public_fields.include?(name)) + label_tag('profile_data_fields_privacy_' + name, _('Public')), :class => 'field-privacy-selector') : ''
  886 + end
  887 +
884 888 def template_stylesheet_path
885 889 if profile.nil?
886 890 "/designs/templates/#{environment.layout_template}/stylesheets/style.css"
... ...
app/helpers/profile_editor_helper.rb
... ... @@ -145,4 +145,12 @@ module ProfileEditorHelper
145 145 link_to title, url, :class => 'control-panel-%s' % icon
146 146 end
147 147  
  148 + def unchangeable_privacy_field(profile)
  149 + if profile.public?
  150 + check_box_tag('', '', true, :disabled => true) + ' ' + _('Public')
  151 + else
  152 + ''
  153 + end
  154 + end
  155 +
148 156 end
... ...
app/helpers/profile_helper.rb
1 1 module ProfileHelper
2 2  
3 3 def display_field(title, profile, field, force = false)
4   - if !force && !profile.active_fields.include?(field.to_s)
  4 + if (!force && field.to_s != 'email' && !profile.active_fields.include?(field.to_s)) ||
  5 + ((profile.active_fields.include?(field.to_s) || field.to_s == 'email') && !profile.public_fields.include?(field.to_s) && (!user || (user != profile && !user.is_a_friend?(profile))))
5 6 return ''
6 7 end
7 8 value = profile.send(field)
... ...
app/models/person.rb
... ... @@ -456,6 +456,10 @@ class Person < Profile
456 456 Scrap.find_by_sql("SELECT id, updated_at, '#{Scrap.to_s}' AS klass FROM #{Scrap.table_name} WHERE scraps.receiver_id = #{self.id} AND scraps.scrap_id IS NULL UNION SELECT id, updated_at, '#{ActionTracker::Record.to_s}' AS klass FROM #{ActionTracker::Record.table_name} WHERE action_tracker.user_id = #{self.id} and action_tracker.verb != 'leave_scrap_to_self' and action_tracker.verb != 'add_member_in_community' ORDER BY updated_at DESC")
457 457 end
458 458  
  459 + def public_fields
  460 + self.fields_privacy.nil? ? self.active_fields : self.fields_privacy.reject{ |k, v| v != 'public' }.keys.map(&:to_s)
  461 + end
  462 +
459 463 protected
460 464  
461 465 def followed_by?(profile)
... ...
app/models/profile.rb
... ... @@ -144,6 +144,7 @@ class Profile < ActiveRecord::Base
144 144 settings_items :redirect_l10n, :type => :boolean, :default => false
145 145 settings_items :public_content, :type => :boolean, :default => true
146 146 settings_items :description
  147 + settings_items :fields_privacy, :type => :hash, :default => {}
147 148  
148 149 validates_length_of :description, :maximum => 550, :allow_nil => true
149 150  
... ... @@ -876,6 +877,15 @@ private :generate_url, :url_options
876 877 []
877 878 end
878 879  
  880 + # field => privacy (e.g.: "address" => "public")
  881 + def fields_privacy
  882 + self.data[:fields_privacy]
  883 + end
  884 +
  885 + def public_fields
  886 + self.active_fields
  887 + end
  888 +
879 889 private
880 890 def self.f_categories_label_proc(environment)
881 891 ids = environment.top_level_category_as_facet_ids
... ...
app/views/profile/_person_profile.rhtml
... ... @@ -13,15 +13,13 @@
13 13 <td><%= show_date(profile.created_at) %></td>
14 14 </tr>
15 15  
16   - <% if profile == user || profile.friends.include?(user) %>
17   - <tr>
18   - <th colspan='2'><%= _('Contact')%></th>
19   - </tr>
20   - <%= display_field(_('Address:'), profile, :address) %>
21   - <%= display_field(_('ZIP code:'), profile, :zip_code) %>
22   - <%= display_field(_('Contact phone:'), profile, :contact_phone) %>
23   - <%= display_field(_('e-Mail:'), profile, :email, true) { |email| link_to_email(email) } %>
24   - <% end %>
  16 + <tr>
  17 + <th colspan='2'><%= _('Contact')%></th>
  18 + </tr>
  19 + <%= display_field(_('Address:'), profile, :address) %>
  20 + <%= display_field(_('ZIP code:'), profile, :zip_code) %>
  21 + <%= display_field(_('Contact phone:'), profile, :contact_phone) %>
  22 + <%= display_field(_('e-Mail:'), profile, :email) { |email| link_to_email(email) } %>
25 23  
26 24 <% cache_timeout(profile.relationships_cache_key, 4.hours) do %>
27 25 <% if !(profile.organization.blank? && profile.organization_website.blank?) && (profile.active_fields.include?('organization') || profile.active_fields.include?('organization_website')) %>
... ...
app/views/profile_editor/_person.rhtml
... ... @@ -2,9 +2,19 @@
2 2  
3 3 <%= required_fields_message %>
4 4  
5   - <%= required f.text_field(:name) %>
  5 + <div class="field-with-privacy-selector">
  6 + <%= required f.text_field(:name) %>
  7 + <div class="field-privacy-selector">
  8 + <%= unchangeable_privacy_field @profile %>
  9 + </div>
  10 + </div>
6 11  
7   - <%= required f.text_field(:email) %>
  12 + <div class="field-with-privacy-selector">
  13 + <%= required f.text_field(:email) %>
  14 + <div class="field-privacy-selector">
  15 + <%= profile_field_privacy_selector @profile, 'email' %>
  16 + </div>
  17 + </div>
8 18  
9 19 <%= @plugins.dispatch(:profile_info_extra_contents).collect { |content| instance_eval(&content) }.join("") %>
10 20  
... ...
app/views/profile_editor/edit.rhtml
... ... @@ -13,8 +13,11 @@
13 13 <%= render :partial => partial_for_class(@profile.class), :locals => { :f => f } %>
14 14  
15 15 <% unless @profile.person? && @environment.active_person_fields.include?('image') %>
16   - <div id="profile_change_picture">
  16 + <div id="profile_change_picture_title">
17 17 <h2><%= _('Change picture') %></h2>
  18 + <span><%= unchangeable_privacy_field @profile %></span>
  19 + </div>
  20 + <div id="profile_change_picture">
18 21 <% f.fields_for :image_builder, @profile.image do |i| %>
19 22 <%= file_field_or_thumbnail(_('Image:'), @profile.image, i) %><%= _("Max size: %s (.jpg, .gif, .png)")% Image.max_size.to_humanreadable %>
20 23 <% end %>
... ...
public/stylesheets/application.css
... ... @@ -6097,3 +6097,49 @@ li.profile-activity-item.upload_image .activity-gallery-images-count-1 img {
6097 6097 margin: .8em 0 .2em;
6098 6098 line-height: 1.5;
6099 6099 }
  6100 +
  6101 +.controller-profile_editor #profile-data {
  6102 + display: table;
  6103 + width: auto;
  6104 +}
  6105 +
  6106 +.field-with-privacy-selector {
  6107 + display: table-row;
  6108 +}
  6109 +
  6110 +.controller-profile_editor #profile-data .field-with-privacy-selector .formfieldline {
  6111 + display: table-cell;
  6112 + width: auto;
  6113 +}
  6114 +
  6115 +.field-privacy-selector {
  6116 + display: table-cell;
  6117 + vertical-align: bottom;
  6118 + text-align: center;
  6119 + width: 100px;
  6120 +}
  6121 +
  6122 +#profile_change_picture {
  6123 + clear: both;
  6124 + margin-top: 20px;
  6125 +}
  6126 +
  6127 +#profile_change_picture_title {
  6128 + display: table-row;
  6129 + width: 100%;
  6130 +}
  6131 +
  6132 +#profile_change_picture_title h2,
  6133 +#profile_change_picture_title span {
  6134 + display: table-cell;
  6135 +}
  6136 +
  6137 +#profile_change_picture_title h2 {
  6138 + padding-top: 20px;
  6139 + width: auto;
  6140 +}
  6141 +
  6142 +#profile_change_picture_title span {
  6143 + width: 100px;
  6144 + text-align: center;
  6145 +}
... ...
test/functional/profile_controller_test.rb
... ... @@ -1371,4 +1371,80 @@ class ProfileControllerTest &lt; ActionController::TestCase
1371 1371 assert_redirected_to :action => 'members'
1372 1372 end
1373 1373  
  1374 + should 'show all fields to anonymous user' do
  1375 + viewed = create_user('person_1').person
  1376 + Environment.any_instance.stubs(:active_person_fields).returns(['sex', 'birth_date'])
  1377 + Environment.any_instance.stubs(:required_person_fields).returns([])
  1378 + viewed.birth_date = Time.now.ago(22.years)
  1379 + viewed.data = { :sex => 'male', :fields_privacy => { 'sex' => 'public', 'birth_date' => 'public' } }
  1380 + viewed.save!
  1381 + get :index, :profile => viewed.identifier
  1382 + assert_tag :tag => 'td', :content => 'Sex:'
  1383 + assert_tag :tag => 'td', :content => 'Male'
  1384 + assert_tag :tag => 'td', :content => 'Date of birth:'
  1385 + assert_tag :tag => 'td', :content => 'August 26, 1990'
  1386 + end
  1387 +
  1388 + should 'show some fields to anonymous user' do
  1389 + viewed = create_user('person_1').person
  1390 + Environment.any_instance.stubs(:active_person_fields).returns(['sex', 'birth_date'])
  1391 + Environment.any_instance.stubs(:required_person_fields).returns([])
  1392 + viewed.birth_date = Time.now.ago(22.years)
  1393 + viewed.data = { :sex => 'male', :fields_privacy => { 'sex' => 'public' } }
  1394 + viewed.save!
  1395 + get :index, :profile => viewed.identifier
  1396 + assert_tag :tag => 'td', :content => 'Sex:'
  1397 + assert_tag :tag => 'td', :content => 'Male'
  1398 + assert_no_tag :tag => 'td', :content => 'Date of birth:'
  1399 + assert_no_tag :tag => 'td', :content => 'August 26, 1990'
  1400 + end
  1401 +
  1402 + should 'show some fields to non friend' do
  1403 + viewed = create_user('person_1').person
  1404 + Environment.any_instance.stubs(:active_person_fields).returns(['sex', 'birth_date'])
  1405 + Environment.any_instance.stubs(:required_person_fields).returns([])
  1406 + viewed.birth_date = Time.now.ago(22.years)
  1407 + viewed.data = { :sex => 'male', :fields_privacy => { 'sex' => 'public' } }
  1408 + viewed.save!
  1409 + strange = create_user('person_2').person
  1410 + login_as(strange.identifier)
  1411 + get :index, :profile => viewed.identifier
  1412 + assert_tag :tag => 'td', :content => 'Sex:'
  1413 + assert_tag :tag => 'td', :content => 'Male'
  1414 + assert_no_tag :tag => 'td', :content => 'Date of birth:'
  1415 + assert_no_tag :tag => 'td', :content => 'August 26, 1990'
  1416 + end
  1417 +
  1418 + should 'show all fields to friend' do
  1419 + viewed = create_user('person_1').person
  1420 + friend = create_user('person_2').person
  1421 + Environment.any_instance.stubs(:active_person_fields).returns(['sex', 'birth_date'])
  1422 + Environment.any_instance.stubs(:required_person_fields).returns([])
  1423 + viewed.birth_date = Time.now.ago(22.years)
  1424 + viewed.data = { :sex => 'male', :fields_privacy => { 'sex' => 'public' } }
  1425 + viewed.save!
  1426 + Person.any_instance.stubs(:is_a_friend?).returns(true)
  1427 + login_as(friend.identifier)
  1428 + get :index, :profile => viewed.identifier
  1429 + assert_tag :tag => 'td', :content => 'Sex:'
  1430 + assert_tag :tag => 'td', :content => 'Male'
  1431 + assert_tag :tag => 'td', :content => 'Date of birth:'
  1432 + assert_tag :tag => 'td', :content => 'August 26, 1990'
  1433 + end
  1434 +
  1435 + should 'show all fields to self' do
  1436 + viewed = create_user('person_1').person
  1437 + Environment.any_instance.stubs(:active_person_fields).returns(['sex', 'birth_date'])
  1438 + Environment.any_instance.stubs(:required_person_fields).returns([])
  1439 + viewed.birth_date = Time.now.ago(22.years)
  1440 + viewed.data = { :sex => 'male', :fields_privacy => { 'sex' => 'public' } }
  1441 + viewed.save!
  1442 + login_as(viewed.identifier)
  1443 + get :index, :profile => viewed.identifier
  1444 + assert_tag :tag => 'td', :content => 'Sex:'
  1445 + assert_tag :tag => 'td', :content => 'Male'
  1446 + assert_tag :tag => 'td', :content => 'Date of birth:'
  1447 + assert_tag :tag => 'td', :content => 'August 26, 1990'
  1448 + end
  1449 +
1374 1450 end
... ...
test/functional/profile_editor_controller_test.rb
... ... @@ -979,4 +979,12 @@ class ProfileEditorControllerTest &lt; ActionController::TestCase
979 979 get :edit, :profile => profile.identifier
980 980 assert_no_tag :tag => 'select', :attributes => {:id => 'profile_data_redirection_after_login'}
981 981 end
  982 +
  983 + should 'uncheck all field privacy fields' do
  984 + person = profile
  985 + assert_nil person.fields_privacy
  986 + post :edit, :profile => profile.identifier, :profile_data => {}
  987 + assert_equal({}, person.reload.fields_privacy)
  988 + end
  989 +
982 990 end
... ...
test/unit/person_test.rb
... ... @@ -1262,4 +1262,18 @@ class PersonTest &lt; ActiveSupport::TestCase
1262 1262  
1263 1263 assert person.has_permission?('bli', Profile.new)
1264 1264 end
  1265 +
  1266 + should 'active fields are public if fields privacy is nil' do
  1267 + p = fast_create(Person)
  1268 + p.expects(:fields_privacy).returns(nil)
  1269 + f = %w(sex birth_date)
  1270 + p.expects(:active_fields).returns(f)
  1271 + assert_equal f, p.public_fields
  1272 + end
  1273 +
  1274 + should 'return public fields' do
  1275 + p = fast_create(Person)
  1276 + p.stubs(:fields_privacy).returns({ 'sex' => 'public', 'birth_date' => 'private' })
  1277 + assert_equal ['sex'], p.public_fields
  1278 + end
1265 1279 end
... ...
test/unit/profile_test.rb
... ... @@ -1945,4 +1945,18 @@ class ProfileTest &lt; ActiveSupport::TestCase
1945 1945 end
1946 1946 end
1947 1947  
  1948 + should 'public fields are active fields' do
  1949 + p = fast_create(Profile)
  1950 + f = %w(sex birth_date)
  1951 + p.expects(:active_fields).returns(f)
  1952 + assert_equal f, p.public_fields
  1953 + end
  1954 +
  1955 + should 'return fields privacy' do
  1956 + p = fast_create(Profile)
  1957 + f = { 'sex' => 'public' }
  1958 + p.data[:fields_privacy] = f
  1959 + assert_equal f, p.fields_privacy
  1960 + end
  1961 +
1948 1962 end
... ...