Commit 68934890fe022493063c10ab0b2cab46b6703b46

Authored by Moises Machado
Committed by Antonio Terceiro
1 parent 4a8583d3

ActionItem1126: organization can change address

app/controllers/my_profile/profile_editor_controller.rb
... ... @@ -17,7 +17,7 @@ class ProfileEditorController < MyProfileController
17 17 Profile.transaction do
18 18 Image.transaction do
19 19 if profile.update_attributes!(params[:profile_data])
20   - redirect_to :action => 'index'
  20 + redirect_to :action => 'index', :profile => profile.identifier
21 21 end
22 22 end
23 23 end
... ...
app/models/environment.rb
... ... @@ -127,6 +127,7 @@ class Environment < ActiveRecord::Base
127 127 'display_header_footer_explanation' => N_("Display explanation about header and footer"),
128 128 'articles_dont_accept_comments_by_default' => N_("Articles don't accept comments by default"),
129 129 'organizations_are_moderated_by_default' => N_("Organizations have moderated publication by default"),
  130 + 'enable_organization_url_change' => N_("Enable organizations to change its address"),
130 131 }
131 132 end
132 133  
... ...
app/models/person.rb
... ... @@ -12,6 +12,15 @@ class Person < Profile
12 12 Friendship.find(:all, :conditions => { :friend_id => person.id}).each { |friendship| friendship.destroy }
13 13 end
14 14  
  15 + # Sets the identifier for this person. Raises an exception when called on a
  16 + # existing person (since peoples' identifiers cannot be changed)
  17 + def identifier=(value)
  18 + unless self.new_record?
  19 + raise ArgumentError.new(_('An existing person cannot be renamed.'))
  20 + end
  21 + self[:identifier] = value
  22 + end
  23 +
15 24 settings_items :last_lang, :type => :string
16 25 def last_lang
17 26 if self.data[:last_lang].nil? or self.data[:last_lang].empty?
... ...
app/models/profile.rb
... ... @@ -194,15 +194,6 @@ class Profile < ActiveRecord::Base
194 194 end
195 195 @top_level_articles ||= Article.top_level_for(self)
196 196 end
197   -
198   - # Sets the identifier for this profile. Raises an exception when called on a
199   - # existing profile (since profiles cannot be renamed)
200   - def identifier=(value)
201   - unless self.new_record?
202   - raise ArgumentError.new(_('An existing profile cannot be renamed.'))
203   - end
204   - self[:identifier] = value
205   - end
206 197  
207 198 def self.is_available?(identifier)
208 199 !(identifier =~ IDENTIFIER_FORMAT).nil? && !RESERVED_IDENTIFIERS.include?(identifier) && Profile.find(:first, :conditions => ['environment_id = ? and identifier = ?', Environment.default.id, identifier]).nil?
... ...
app/views/profile_editor/_organization.rhtml
... ... @@ -2,14 +2,59 @@
2 2  
3 3 <%= required_fields_message if @profile.required_fields.any? %>
4 4  
  5 +<% if @environment.enabled?('enable_organization_url_change') %>
  6 + <script type="text/javascript">
  7 + function updateUrlField(name_field, id) {
  8 + url_field = $(id);
  9 + url_field.value = convToValidIdentifier(name_field.value, "-");
  10 + warn_value_change(url_field);
  11 + }
  12 + </script>
  13 +<% end %>
  14 +
5 15 <div class="formfieldline">
6 16 <label class="formlabel" for="profile_data_nickname"><%= _('Display name') %></label>
7 17 <div class="formfield type-text">
8   - <%= text_field_tag 'profile_data[nickname]', @profile_data.nickname, :id => 'profile_data_nickname', :size => 30, :maxlength => 16 %>
  18 + <%= text_field_tag 'profile_data[nickname]', @profile_data.nickname, :id => 'profile_data_nickname', :size => 30, :maxlength => 16, :onchange => (@environment.enabled?('enable_organization_url_change') ? "updateUrlField(this, 'profile_data_identifier')" : "") %>
9 19 <em><%= _('A short name by which the organization is know.')%></em>
  20 + </div>
10 21 </div>
11 22  
12   - </div>
  23 +<% if @environment.enabled?('enable_organization_url_change') %>
  24 + <script type="text/javascript">
  25 + function submit_button() {
  26 + return $("profile_data_identifier").form.select("input.submit")[0];
  27 + }
  28 +
  29 + function warn_value_change(field) {
  30 + new Effect.Highlight($("profile-identifier-formitem"), {duration:3});
  31 + $("identifier-change-confirmation").show();
  32 + submit_button().disable();
  33 + submit_button().addClassName("disabled");
  34 + }
  35 +
  36 + function hide_warning() {
  37 + submit_button().enable();
  38 + submit_button().removeClassName("disabled");
  39 + $("identifier-change-confirmation").hide()
  40 + }
  41 + </script>
  42 +
  43 + <%= hidden_field_tag 'old_profile_identifier', @profile.identifier %>
  44 + <div id="profile-identifier-formitem">
  45 + <%= labelled_form_field( _('Address'),
  46 + '<code>' + url_for(profile.url).gsub(/#{profile.identifier}$/, '') +
  47 + text_field(:profile_data, :identifier, :onchange => "warn_value_change(this)", :size => 15) + '</code>' +
  48 + content_tag('div', '<strong>' + _('WARNING:') + '</strong> ' + _("the address was changed, this might break any external links to this profile and articles in this profile, you really want to change? ") +
  49 + '<div>' + button_to_function(:ok, _("Yes"), 'hide_warning()') + ' ' +
  50 + button_to_function(:cancel, _('No'), '$("profile_data_identifier").value = $("old_profile_identifier").value; hide_warning()') + '</div>',
  51 + :id => 'identifier-change-confirmation'
  52 + )
  53 + )
  54 + %>
  55 + </div>
  56 +<% end %>
  57 +
13 58 <%= f.text_field(:acronym) %>
14 59 <%= f.text_field(:foundation_year) %>
15 60 <%= optional_field(@profile, 'contact_person', f.text_field(:contact_person)) %>
... ...
public/javascripts/application.js
... ... @@ -29,6 +29,11 @@ function focus_first_field() {
29 29  
30 30 /* * * Convert a string to a valid login name * * */
31 31 function convToValidLogin( str ) {
  32 + return convToValidIdentifier(str, '')
  33 +}
  34 +
  35 +/* * * Convert a string to a valid login name * * */
  36 +function convToValidIdentifier( str, sep ) {
32 37 return str.toLowerCase()
33 38 .replace( /@.*$/, "" )
34 39 .replace( /á|à|ã|â/g, "a" )
... ... @@ -38,7 +43,7 @@ function convToValidLogin( str ) {
38 43 .replace( /ú|ũ|ü/g, "u" )
39 44 .replace( /ñ/g, "n" )
40 45 .replace( /ç/g, "c" )
41   - .replace( /[^-_a-z0-9]+/g, "" )
  46 + .replace( /[^-_a-z0-9]+/g, sep )
42 47 }
43 48  
44 49 document.observe("dom:loaded", function() {
... ...
public/stylesheets/button.css
... ... @@ -96,3 +96,7 @@ input.button.with-text:hover {
96 96 border: none;
97 97 }
98 98  
  99 +input.disabled {
  100 + opacity: 0.5;
  101 + filter-opacity: 50%;
  102 +}
... ...
public/stylesheets/controller_profile_editor.css
... ... @@ -31,6 +31,21 @@
31 31 -moz-border-radius: 3px;
32 32 }
33 33  
  34 +#identifier-change-confirmation {
  35 + background-color: #EE4444;
  36 + padding: 3px 20px 3px 20px;
  37 + margin: 5px 30px 10px 30px;
  38 +}
  39 +
  40 +#identifier-change-confirmation div {
  41 + text-align: right;
  42 + padding: 0px 10px 5px 0px;
  43 +}
  44 +
  45 +code input {
  46 + font-family: monospace;
  47 +}
  48 +
34 49 a.control-panel-groups { background-image: url(../images/control-panel/system-users.png) }
35 50 .msie6 a.control-panel-groups { background-image: url(../images/control-panel/system-users.gif) }
36 51  
... ... @@ -87,3 +102,4 @@ a.control-panel-validation {background-image: url(../images/control-panel/applic
87 102  
88 103 a.control-panel-mail {background-image: url(../images/control-panel/email.png)}
89 104 .msie6 a.control-panel-mail {background-image: url(../images/control-panel/email.gif)}
  105 +
... ...
test/functional/profile_editor_controller_test.rb
... ... @@ -724,5 +724,37 @@ class ProfileEditorControllerTest &lt; Test::Unit::TestCase
724 724 assert_no_tag :tag => 'div', :attributes => { :id => 'activation_enterprise' }, :descendant => {:tag => 'form', :attributes => {:action => '/account/activation_question'}}
725 725 end
726 726  
  727 + should 'have url field for identifier when environment allows' do
  728 + c = Community.create!(:name => 'test community', :identifier => 'test_comm')
  729 + env = c.environment
  730 + env.enable('enable_organization_url_change')
  731 + env.save!
  732 +
  733 + get :edit, :profile => c.identifier
  734 + assert_tag :tag => 'div',
  735 + :attributes => { :class => 'formfield type-text' },
  736 + :content => /https?:\/\/#{c.environment.default_hostname}\//,
  737 + :descendant => {:tag => 'input', :attributes => {:id => 'profile_data_identifier'} }
  738 + end
  739 +
  740 + should 'not have url field for identifier when environment not allows' do
  741 + c = Community.create!(:name => 'test community', :identifier => 'test_comm')
  742 + env = c.environment
  743 + env.disable('enable_organization_url_change')
  744 + env.save!
  745 +
  746 + get :edit, :profile => c.identifier
  747 + assert_no_tag :tag => 'div',
  748 + :attributes => { :class => 'formfield type-text' },
  749 + :content => /https?:\/\/#{c.environment.default_hostname}\//,
  750 + :descendant => {:tag => 'input', :attributes => {:id => 'profile_data_identifier'} }
  751 + end
  752 +
  753 + should 'redirect to new url when is changed' do
  754 + c = Community.create!(:name => 'test community', :identifier => 'test_comm')
  755 + post :edit, :profile => c.identifier, :profile_data => {:identifier => 'new_address'}
  756 + assert_response :redirect
  757 + assert_redirected_to :action => 'index', :profile => 'new_address'
  758 + end
727 759  
728 760 end
... ...
test/unit/organization_test.rb
... ... @@ -232,4 +232,11 @@ class OrganizationTest &lt; Test::Unit::TestCase
232 232 assert p.has_permission?(:moderate_comments, o)
233 233 end
234 234  
  235 + should 'be able to change identifier' do
  236 + o = Organization.create!(:name => 'Test Org', :identifier => 'test_org')
  237 + assert_nothing_raised do
  238 + o.identifier = 'test_org_new_url'
  239 + end
  240 + end
  241 +
235 242 end
... ...
test/unit/person_test.rb
... ... @@ -574,4 +574,11 @@ class PersonTest &lt; Test::Unit::TestCase
574 574 end
575 575 end
576 576  
  577 + should 'not rename' do
  578 + assert_valid p = create_user('test_user').person
  579 + assert_raise ArgumentError do
  580 + p.identifier = 'other_person_name'
  581 + end
  582 + end
  583 +
577 584 end
... ...
test/unit/profile_test.rb
... ... @@ -72,13 +72,6 @@ class ProfileTest &lt; Test::Unit::TestCase
72 72 assert_equal Environment.default, e
73 73 end
74 74  
75   - def test_cannot_rename
76   - assert_valid p = Profile.create(:name => 'new_profile', :identifier => 'new_profile')
77   - assert_raise ArgumentError do
78   - p.identifier = 'other_profile'
79   - end
80   - end
81   -
82 75 should 'provide access to home page' do
83 76 profile = Profile.create!(:identifier => 'newprofile', :name => 'New Profile')
84 77 assert_kind_of Article, profile.home_page
... ...