Commit 339df62d33ed7e1fd046e68821b7928f06bd822b
1 parent
2e89b866
Exists in
master
and in
8 other branches
Enhancements on privacy settings
Added tests Added background on edition of profile to be easier to know which field the checkbox is related (ActionItem1717)
Showing
8 changed files
with
124 additions
and
24 deletions
Show diff stats
app/helpers/profile_editor_helper.rb
| ... | ... | @@ -147,7 +147,7 @@ module ProfileEditorHelper |
| 147 | 147 | |
| 148 | 148 | def unchangeable_privacy_field(profile) |
| 149 | 149 | if profile.public? |
| 150 | - labelled_check_box(_('Public'), '', '', true, :disabled => true) | |
| 150 | + labelled_check_box(_('Public'), '', '', true, :disabled => true, :title => _('This field must be public'), :class => 'disabled') | |
| 151 | 151 | else |
| 152 | 152 | '' |
| 153 | 153 | 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 && 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)))) | |
| 4 | + if (!force && !profile.active_fields.include?(field.to_s)) || | |
| 5 | + (profile.active_fields.include?(field.to_s) && !profile.public_fields.include?(field.to_s) && (!user || (user != profile && !user.is_a_friend?(profile)))) | |
| 6 | 6 | return '' |
| 7 | 7 | end |
| 8 | 8 | value = profile.send(field) |
| ... | ... | @@ -28,4 +28,14 @@ module ProfileHelper |
| 28 | 28 | end |
| 29 | 29 | end |
| 30 | 30 | |
| 31 | + def display_work_info(profile) | |
| 32 | + organization = display_field(_('Organization:'), profile, :organization) | |
| 33 | + organization_site = display_field(_('Organization website:'), profile, :organization_website) { |url| link_to(url, url) } | |
| 34 | + if organization.blank? && organization_site.blank? | |
| 35 | + '' | |
| 36 | + else | |
| 37 | + content_tag('tr', content_tag('th', _('Work'), { :colspan => 2 })) + organization + organization_site | |
| 38 | + end | |
| 39 | + end | |
| 40 | + | |
| 31 | 41 | end | ... | ... |
app/models/person.rb
| ... | ... | @@ -178,7 +178,8 @@ class Person < Profile |
| 178 | 178 | include MaybeAddHttp |
| 179 | 179 | |
| 180 | 180 | def active_fields |
| 181 | - environment ? environment.active_person_fields : [] | |
| 181 | + fields = environment ? environment.active_person_fields : [] | |
| 182 | + fields << 'email' | |
| 182 | 183 | end |
| 183 | 184 | |
| 184 | 185 | def required_fields | ... | ... |
app/views/profile/_person_profile.rhtml
| ... | ... | @@ -16,14 +16,7 @@ |
| 16 | 16 | <%= display_contact profile %> |
| 17 | 17 | |
| 18 | 18 | <% cache_timeout(profile.relationships_cache_key, 4.hours) do %> |
| 19 | - <% if !(profile.organization.blank? && profile.organization_website.blank?) && (profile.active_fields.include?('organization') || profile.active_fields.include?('organization_website')) %> | |
| 20 | - <tr> | |
| 21 | - <th colspan='2'><%= _('Work')%></th> | |
| 22 | - </tr> | |
| 23 | - <% end %> | |
| 24 | - <%= display_field(_('Organization:'), profile, :organization) %> | |
| 25 | - <%= display_field(_('Organization website:'), profile, :organization_website) { |url| link_to(url, url) }%> | |
| 26 | - | |
| 19 | + <%= display_work_info profile %> | |
| 27 | 20 | |
| 28 | 21 | <% if !environment.enabled?('disable_asset_enterprises') && !profile.enterprises.empty? %> |
| 29 | 22 | <tr> |
| ... | ... | @@ -51,6 +44,6 @@ |
| 51 | 44 | |
| 52 | 45 | <%= render :partial => 'common' %> |
| 53 | 46 | |
| 54 | - </table> | |
| 55 | -<% end %> | |
| 47 | + <% end %> | |
| 48 | +</table> | |
| 56 | 49 | ... | ... |
public/stylesheets/application.css
| ... | ... | @@ -6107,14 +6107,17 @@ li.profile-activity-item.upload_image .activity-gallery-images-count-1 img { |
| 6107 | 6107 | display: table-row; |
| 6108 | 6108 | } |
| 6109 | 6109 | |
| 6110 | +.field-with-privacy-selector:hover { | |
| 6111 | + background-color: #F0F0F0; | |
| 6112 | +} | |
| 6113 | + | |
| 6110 | 6114 | .controller-profile_editor #profile-data .field-with-privacy-selector .formfieldline { |
| 6111 | - display: table-cell; | |
| 6112 | 6115 | width: auto; |
| 6113 | 6116 | } |
| 6114 | 6117 | |
| 6115 | 6118 | .field-privacy-selector { |
| 6116 | 6119 | display: table-cell; |
| 6117 | - vertical-align: bottom; | |
| 6120 | + vertical-align: middle; | |
| 6118 | 6121 | text-align: center; |
| 6119 | 6122 | width: 100px; |
| 6120 | 6123 | } | ... | ... |
test/unit/application_helper_test.rb
| ... | ... | @@ -379,8 +379,10 @@ class ApplicationHelperTest < ActiveSupport::TestCase |
| 379 | 379 | controller.stubs(:action_name).returns('edit') |
| 380 | 380 | |
| 381 | 381 | profile = Person.new |
| 382 | - profile.expects(:active_fields).returns(['field']) | |
| 383 | - assert_equal 'SIGNUP_FIELD', optional_field(profile, 'field', 'SIGNUP_FIELD') | |
| 382 | + profile.stubs(:active_fields).returns(['field']) | |
| 383 | + | |
| 384 | + expects(:profile_field_privacy_selector).with(profile, 'field').returns('') | |
| 385 | + assert_tag_in_string optional_field(profile, 'field', 'EDIT_FIELD'), :tag => 'div', :content => 'EDIT_FIELD', :attributes => {:class => 'field-with-privacy-selector'} | |
| 384 | 386 | end |
| 385 | 387 | |
| 386 | 388 | should 'not display active fields' do |
| ... | ... | @@ -394,7 +396,7 @@ class ApplicationHelperTest < ActiveSupport::TestCase |
| 394 | 396 | |
| 395 | 397 | profile = Person.new |
| 396 | 398 | profile.expects(:active_fields).returns([]) |
| 397 | - assert_equal '', optional_field(profile, 'field', 'SIGNUP_FIELD') | |
| 399 | + assert_equal '', optional_field(profile, 'field', 'EDIT_FIELD') | |
| 398 | 400 | end |
| 399 | 401 | |
| 400 | 402 | should 'display required fields' do |
| ... | ... | @@ -406,11 +408,13 @@ class ApplicationHelperTest < ActiveSupport::TestCase |
| 406 | 408 | controller.stubs(:controller_name).returns('') |
| 407 | 409 | controller.stubs(:action_name).returns('edit') |
| 408 | 410 | |
| 409 | - stubs(:required).with('SIGNUP_FIELD').returns('<span>SIGNUP_FIELD</span>') | |
| 410 | 411 | profile = Person.new |
| 411 | - profile.expects(:active_fields).returns(['field']) | |
| 412 | + profile.stubs(:active_fields).returns(['field']) | |
| 412 | 413 | profile.expects(:required_fields).returns(['field']) |
| 413 | - assert_equal '<span>SIGNUP_FIELD</span>', optional_field(profile, 'field', 'SIGNUP_FIELD') | |
| 414 | + | |
| 415 | + stubs(:required).with(anything).returns('<span>EDIT_FIELD</span>') | |
| 416 | + expects(:profile_field_privacy_selector).with(profile, 'field').returns('') | |
| 417 | + assert_equal '<span>EDIT_FIELD</span>', optional_field(profile, 'field', 'EDIT_FIELD') | |
| 414 | 418 | end |
| 415 | 419 | |
| 416 | 420 | should 'base theme uses default icon theme' do | ... | ... |
test/unit/person_test.rb
| ... | ... | @@ -441,6 +441,14 @@ class PersonTest < ActiveSupport::TestCase |
| 441 | 441 | assert_equal e.active_person_fields, person.active_fields |
| 442 | 442 | end |
| 443 | 443 | |
| 444 | + should 'return email as active_person_fields' do | |
| 445 | + e = Environment.default | |
| 446 | + e.expects(:active_person_fields).returns(['nickname']).at_least_once | |
| 447 | + person = Person.new(:environment => e) | |
| 448 | + | |
| 449 | + assert_equal ['nickname', 'email'], person.active_fields | |
| 450 | + end | |
| 451 | + | |
| 444 | 452 | should 'return required_person_fields' do |
| 445 | 453 | e = Environment.default |
| 446 | 454 | e.expects(:required_person_fields).returns(['cell_phone', 'comercial_phone']).at_least_once | ... | ... |
test/unit/profile_helper_test.rb
| ... | ... | @@ -2,6 +2,10 @@ require File.dirname(__FILE__) + '/../test_helper' |
| 2 | 2 | |
| 3 | 3 | class ProfileHelperTest < ActiveSupport::TestCase |
| 4 | 4 | |
| 5 | + include ProfileHelper | |
| 6 | + include ApplicationHelper | |
| 7 | + include ActionView::Helpers::TagHelper | |
| 8 | + | |
| 5 | 9 | def setup |
| 6 | 10 | @profile = mock |
| 7 | 11 | @helper = mock |
| ... | ... | @@ -9,8 +13,85 @@ class ProfileHelperTest < ActiveSupport::TestCase |
| 9 | 13 | end |
| 10 | 14 | attr_reader :profile, :helper |
| 11 | 15 | |
| 12 | - def test_true | |
| 13 | - assert true | |
| 16 | + should 'not display field if field is not active and not forced' do | |
| 17 | + profile.expects(:active_fields).returns([]) | |
| 18 | + assert_equal '', display_field('Title', profile, 'field') | |
| 19 | + end | |
| 20 | + | |
| 21 | + should 'display field if field is not active but is forced' do | |
| 22 | + profile.expects(:active_fields).returns([]) | |
| 23 | + profile.expects(:field).returns('value') | |
| 24 | + assert_match /Title.*value/, display_field('Title', profile, 'field', true) | |
| 25 | + end | |
| 26 | + | |
| 27 | + should 'not display field if field is active but not public and not logged in' do | |
| 28 | + profile.stubs(:active_fields).returns(['field']) | |
| 29 | + profile.expects(:public_fields).returns([]) | |
| 30 | + @controller = mock | |
| 31 | + @controller.stubs(:user).returns(nil) | |
| 32 | + assert_equal '', display_field('Title', profile, 'field') | |
| 33 | + end | |
| 34 | + | |
| 35 | + should 'not display field if field is active but not public and user is not friend' do | |
| 36 | + profile.stubs(:active_fields).returns(['field']) | |
| 37 | + profile.expects(:public_fields).returns([]) | |
| 38 | + user = mock | |
| 39 | + user.expects(:is_a_friend?).with(profile).returns(false) | |
| 40 | + @controller = mock | |
| 41 | + @controller.stubs(:user).returns(user) | |
| 42 | + assert_equal '', display_field('Title', profile, 'field') | |
| 43 | + end | |
| 44 | + | |
| 45 | + should 'display field if field is active and not public but user is profile owner' do | |
| 46 | + profile.stubs(:active_fields).returns(['field']) | |
| 47 | + profile.expects(:public_fields).returns([]) | |
| 48 | + profile.expects(:field).returns('value') | |
| 49 | + @controller = mock | |
| 50 | + @controller.stubs(:user).returns(profile) | |
| 51 | + assert_match /Title.*value/, display_field('Title', profile, 'field', true) | |
| 52 | + end | |
| 53 | + | |
| 54 | + should 'display field if field is active and not public but user is a friend' do | |
| 55 | + profile.stubs(:active_fields).returns(['field']) | |
| 56 | + profile.expects(:public_fields).returns([]) | |
| 57 | + profile.expects(:field).returns('value') | |
| 58 | + user = mock | |
| 59 | + user.expects(:is_a_friend?).with(profile).returns(true) | |
| 60 | + @controller = mock | |
| 61 | + @controller.stubs(:user).returns(user) | |
| 62 | + assert_match /Title.*value/, display_field('Title', profile, 'field', true) | |
| 63 | + end | |
| 64 | + | |
| 65 | + should 'not display work info if field is active but not public and user is not friend' do | |
| 66 | + profile.stubs(:active_fields).returns(['organization', 'organization_website']) | |
| 67 | + profile.expects(:public_fields).returns([]).times(2) | |
| 68 | + user = mock | |
| 69 | + user.expects(:is_a_friend?).with(profile).returns(false).times(2) | |
| 70 | + @controller = mock | |
| 71 | + @controller.stubs(:user).returns(user) | |
| 72 | + assert_equal '', display_work_info(profile) | |
| 73 | + end | |
| 74 | + | |
| 75 | + should 'display work info if field is active and not public but user is profile owner' do | |
| 76 | + profile.stubs(:active_fields).returns(['organization', 'organization_website']) | |
| 77 | + profile.expects(:public_fields).returns([]).times(2) | |
| 78 | + profile.expects(:organization).returns('Organization Name') | |
| 79 | + profile.expects(:organization_website).returns('') | |
| 80 | + @controller = mock | |
| 81 | + @controller.stubs(:user).returns(profile) | |
| 82 | + assert_match /Work.*Organization Name/, display_work_info(profile) | |
| 83 | + end | |
| 84 | + | |
| 85 | + should 'display work info if field is active and not public but user is a friend' do | |
| 86 | + profile.stubs(:active_fields).returns(['organization', 'organization_website']) | |
| 87 | + profile.expects(:public_fields).returns([]).times(2) | |
| 88 | + profile.expects(:organization).returns('Organization Name') | |
| 89 | + profile.expects(:organization_website).returns('') | |
| 90 | + user = mock | |
| 91 | + user.expects(:is_a_friend?).with(profile).returns(true).times(2) | |
| 92 | + @controller = mock | |
| 93 | + @controller.stubs(:user).returns(user) | |
| 94 | + assert_match /Work.*Organization Name/, display_work_info(profile) | |
| 14 | 95 | end |
| 15 | 96 | |
| 16 | 97 | end | ... | ... |