User custom fields can now be set as editable so that users can edit them on 'My account'.

For existing user custom fields, this new attribute is set to false by default to preserve the prior behaviour (it can turned on by editing the custom field in admin area).

Note: on the registration form, *required* custom fields will be displayed even if they are not defined as editable so that the account can be created.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2276 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
Jean-Philippe Lang 2009-01-17 11:18:04 +00:00
parent 99c2e98975
commit 12792d8068
40 changed files with 90 additions and 4 deletions

View File

@ -19,6 +19,7 @@ class MyController < ApplicationController
before_filter :require_login before_filter :require_login
helper :issues helper :issues
helper :custom_fields
BLOCKS = { 'issuesassignedtome' => :label_assigned_to_me_issues, BLOCKS = { 'issuesassignedtome' => :label_assigned_to_me_issues,
'issuesreportedbyme' => :label_reported_issues, 'issuesreportedbyme' => :label_reported_issues,

View File

@ -30,6 +30,14 @@ class CustomValue < ActiveRecord::Base
self.value == '1' self.value == '1'
end end
def editable?
custom_field.editable?
end
def required?
custom_field.is_required?
end
def to_s def to_s
value.to_s value.to_s
end end

View File

@ -29,7 +29,7 @@
<p><label for="user_language"><%=l(:field_language)%></label> <p><label for="user_language"><%=l(:field_language)%></label>
<%= select("user", "language", lang_options_for_select) %></p> <%= select("user", "language", lang_options_for_select) %></p>
<% @user.custom_field_values.each do |value| %> <% @user.custom_field_values.select {|v| v.editable? || v.required?}.each do |value| %>
<p><%= custom_field_tag_with_label :user, value %></p> <p><%= custom_field_tag_with_label :user, value %></p>
<% end %> <% end %>
<!--[eoform:user]--> <!--[eoform:user]-->

View File

@ -84,6 +84,7 @@ when "IssueCustomField" %>
<% when "UserCustomField" %> <% when "UserCustomField" %>
<p><%= f.check_box :is_required %></p> <p><%= f.check_box :is_required %></p>
<p><%= f.check_box :editable %></p>
<% when "ProjectCustomField" %> <% when "ProjectCustomField" %>
<p><%= f.check_box :is_required %></p> <p><%= f.check_box :is_required %></p>

View File

@ -15,6 +15,10 @@
<p><%= f.text_field :lastname, :required => true %></p> <p><%= f.text_field :lastname, :required => true %></p>
<p><%= f.text_field :mail, :required => true %></p> <p><%= f.text_field :mail, :required => true %></p>
<p><%= f.select :language, lang_options_for_select %></p> <p><%= f.select :language, lang_options_for_select %></p>
<% @user.custom_field_values.select(&:editable?).each do |value| %>
<p><%= custom_field_tag_with_label :user, value %></p>
<% end %>
</div> </div>
<%= submit_tag l(:button_save) %> <%= submit_tag l(:button_save) %>

View File

@ -0,0 +1,9 @@
class AddCustomFieldsEditable < ActiveRecord::Migration
def self.up
add_column :custom_fields, :editable, :boolean, :default => true
end
def self.down
remove_column :custom_fields, :editable
end
end

View File

@ -0,0 +1,9 @@
class SetCustomFieldsEditable < ActiveRecord::Migration
def self.up
UserCustomField.update_all('editable = false')
end
def self.down
UserCustomField.update_all('editable = true')
end
end

View File

@ -701,3 +701,4 @@ warning_attachments_not_saved: "%d file(s) could not be saved."
button_create_and_continue: Create and continue button_create_and_continue: Create and continue
text_custom_field_possible_values_info: 'One line for each value' text_custom_field_possible_values_info: 'One line for each value'
label_display: Display label_display: Display
field_editable: Editable

View File

@ -702,3 +702,4 @@ warning_attachments_not_saved: "%d file(s) could not be saved."
button_create_and_continue: Create and continue button_create_and_continue: Create and continue
text_custom_field_possible_values_info: 'One line for each value' text_custom_field_possible_values_info: 'One line for each value'
label_display: Display label_display: Display
field_editable: Editable

View File

@ -706,3 +706,4 @@ warning_attachments_not_saved: "%d file(s) could not be saved."
button_create_and_continue: Create and continue button_create_and_continue: Create and continue
text_custom_field_possible_values_info: 'One line for each value' text_custom_field_possible_values_info: 'One line for each value'
label_display: Display label_display: Display
field_editable: Editable

View File

@ -702,3 +702,4 @@ warning_attachments_not_saved: "%d file(s) could not be saved."
button_create_and_continue: Create and continue button_create_and_continue: Create and continue
text_custom_field_possible_values_info: 'One line for each value' text_custom_field_possible_values_info: 'One line for each value'
label_display: Display label_display: Display
field_editable: Editable

View File

@ -703,3 +703,4 @@ warning_attachments_not_saved: "%d file(s) could not be saved."
button_create_and_continue: Create and continue button_create_and_continue: Create and continue
text_custom_field_possible_values_info: 'One line for each value' text_custom_field_possible_values_info: 'One line for each value'
label_display: Display label_display: Display
field_editable: Editable

View File

@ -186,6 +186,7 @@ field_searchable: Searchable
field_default_value: Default value field_default_value: Default value
field_comments_sorting: Display comments field_comments_sorting: Display comments
field_parent_title: Parent page field_parent_title: Parent page
field_editable: Editable
setting_app_title: Application title setting_app_title: Application title
setting_app_subtitle: Application subtitle setting_app_subtitle: Application subtitle

View File

@ -686,3 +686,4 @@ warning_attachments_not_saved: "%d file(s) could not be saved."
button_create_and_continue: Create and continue button_create_and_continue: Create and continue
text_custom_field_possible_values_info: 'One line for each value' text_custom_field_possible_values_info: 'One line for each value'
label_display: Display label_display: Display
field_editable: Editable

View File

@ -701,3 +701,4 @@ warning_attachments_not_saved: "%d file(s) could not be saved."
button_create_and_continue: Create and continue button_create_and_continue: Create and continue
text_custom_field_possible_values_info: 'One line for each value' text_custom_field_possible_values_info: 'One line for each value'
label_display: Display label_display: Display
field_editable: Editable

View File

@ -186,6 +186,7 @@ field_searchable: Utilisé pour les recherches
field_default_value: Valeur par défaut field_default_value: Valeur par défaut
field_comments_sorting: Afficher les commentaires field_comments_sorting: Afficher les commentaires
field_parent_title: Page parent field_parent_title: Page parent
field_editable: Modifiable
setting_app_title: Titre de l'application setting_app_title: Titre de l'application
setting_app_subtitle: Sous-titre de l'application setting_app_subtitle: Sous-titre de l'application

View File

@ -701,3 +701,4 @@ warning_attachments_not_saved: "%d file(s) could not be saved."
button_create_and_continue: Create and continue button_create_and_continue: Create and continue
text_custom_field_possible_values_info: 'One line for each value' text_custom_field_possible_values_info: 'One line for each value'
label_display: Display label_display: Display
field_editable: Editable

View File

@ -702,3 +702,4 @@ warning_attachments_not_saved: "%d file(s) could not be saved."
button_create_and_continue: Create and continue button_create_and_continue: Create and continue
text_custom_field_possible_values_info: 'One line for each value' text_custom_field_possible_values_info: 'One line for each value'
label_display: Display label_display: Display
field_editable: Editable

View File

@ -701,3 +701,4 @@ warning_attachments_not_saved: "%d file(s) could not be saved."
button_create_and_continue: Create and continue button_create_and_continue: Create and continue
text_custom_field_possible_values_info: 'One line for each value' text_custom_field_possible_values_info: 'One line for each value'
label_display: Display label_display: Display
field_editable: Editable

View File

@ -702,3 +702,4 @@ warning_attachments_not_saved: "%d file(s) could not be saved."
button_create_and_continue: Create and continue button_create_and_continue: Create and continue
text_custom_field_possible_values_info: 'One line for each value' text_custom_field_possible_values_info: 'One line for each value'
label_display: Display label_display: Display
field_editable: Editable

View File

@ -701,3 +701,4 @@ warning_attachments_not_saved: "%d file(s) could not be saved."
button_create_and_continue: Create and continue button_create_and_continue: Create and continue
text_custom_field_possible_values_info: 'One line for each value' text_custom_field_possible_values_info: 'One line for each value'
label_display: Display label_display: Display
field_editable: Editable

View File

@ -703,3 +703,4 @@ warning_attachments_not_saved: "%d file(s) could not be saved."
button_create_and_continue: Create and continue button_create_and_continue: Create and continue
text_custom_field_possible_values_info: 'One line for each value' text_custom_field_possible_values_info: 'One line for each value'
label_display: Display label_display: Display
field_editable: Editable

View File

@ -703,3 +703,4 @@ warning_attachments_not_saved: "%d file(s) could not be saved."
button_create_and_continue: Create and continue button_create_and_continue: Create and continue
text_custom_field_possible_values_info: 'One line for each value' text_custom_field_possible_values_info: 'One line for each value'
label_display: Display label_display: Display
field_editable: Editable

View File

@ -702,3 +702,4 @@ warning_attachments_not_saved: "%d file(s) could not be saved."
button_create_and_continue: Create and continue button_create_and_continue: Create and continue
text_custom_field_possible_values_info: 'One line for each value' text_custom_field_possible_values_info: 'One line for each value'
label_display: Display label_display: Display
field_editable: Editable

View File

@ -720,3 +720,4 @@ warning_attachments_not_saved: "%d file(s) could not be saved."
button_create_and_continue: Create and continue button_create_and_continue: Create and continue
text_custom_field_possible_values_info: 'One line for each value' text_custom_field_possible_values_info: 'One line for each value'
label_display: Display label_display: Display
field_editable: Editable

View File

@ -702,3 +702,4 @@ warning_attachments_not_saved: "%d file(s) could not be saved."
button_create_and_continue: Create and continue button_create_and_continue: Create and continue
text_custom_field_possible_values_info: 'One line for each value' text_custom_field_possible_values_info: 'One line for each value'
label_display: Display label_display: Display
field_editable: Editable

View File

@ -703,3 +703,4 @@ warning_attachments_not_saved: "%d file(s) could not be saved."
button_create_and_continue: Create and continue button_create_and_continue: Create and continue
text_custom_field_possible_values_info: 'One line for each value' text_custom_field_possible_values_info: 'One line for each value'
label_display: Display label_display: Display
field_editable: Editable

View File

@ -701,3 +701,4 @@ warning_attachments_not_saved: "%d file(s) could not be saved."
button_create_and_continue: Create and continue button_create_and_continue: Create and continue
text_custom_field_possible_values_info: 'One line for each value' text_custom_field_possible_values_info: 'One line for each value'
label_display: Display label_display: Display
field_editable: Editable

View File

@ -735,3 +735,4 @@ warning_attachments_not_saved: "%d file(s) could not be saved."
button_create_and_continue: Create and continue button_create_and_continue: Create and continue
text_custom_field_possible_values_info: 'One line for each value' text_custom_field_possible_values_info: 'One line for each value'
label_display: Display label_display: Display
field_editable: Editable

View File

@ -707,3 +707,4 @@ warning_attachments_not_saved: "%d file(s) could not be saved."
button_create_and_continue: Create and continue button_create_and_continue: Create and continue
text_custom_field_possible_values_info: 'One line for each value' text_custom_field_possible_values_info: 'One line for each value'
label_display: Display label_display: Display
field_editable: Editable

View File

@ -702,3 +702,4 @@ warning_attachments_not_saved: "%d file(s) could not be saved."
button_create_and_continue: Create and continue button_create_and_continue: Create and continue
text_custom_field_possible_values_info: 'One line for each value' text_custom_field_possible_values_info: 'One line for each value'
label_display: Display label_display: Display
field_editable: Editable

View File

@ -702,3 +702,4 @@ warning_attachments_not_saved: "%d file(s) could not be saved."
button_create_and_continue: Create and continue button_create_and_continue: Create and continue
text_custom_field_possible_values_info: 'One line for each value' text_custom_field_possible_values_info: 'One line for each value'
label_display: Display label_display: Display
field_editable: Editable

View File

@ -704,3 +704,4 @@ warning_attachments_not_saved: "%d file(s) could not be saved."
button_create_and_continue: Create and continue button_create_and_continue: Create and continue
text_custom_field_possible_values_info: 'One line for each value' text_custom_field_possible_values_info: 'One line for each value'
label_display: Display label_display: Display
field_editable: Editable

View File

@ -702,3 +702,4 @@ warning_attachments_not_saved: "%d file(s) could not be saved."
button_create_and_continue: Create and continue button_create_and_continue: Create and continue
text_custom_field_possible_values_info: 'One line for each value' text_custom_field_possible_values_info: 'One line for each value'
label_display: Display label_display: Display
field_editable: Editable

View File

@ -703,3 +703,4 @@ warning_attachments_not_saved: "%d file(s) could not be saved."
button_create_and_continue: Create and continue button_create_and_continue: Create and continue
text_custom_field_possible_values_info: 'One line for each value' text_custom_field_possible_values_info: 'One line for each value'
label_display: Display label_display: Display
field_editable: Editable

View File

@ -704,3 +704,4 @@ warning_attachments_not_saved: "%d file(s) could not be saved."
button_create_and_continue: Create and continue button_create_and_continue: Create and continue
text_custom_field_possible_values_info: 'One line for each value' text_custom_field_possible_values_info: 'One line for each value'
label_display: Display label_display: Display
field_editable: Editable

View File

@ -703,3 +703,4 @@ warning_attachments_not_saved: "%d file(s) could not be saved."
button_create_and_continue: Create and continue button_create_and_continue: Create and continue
text_custom_field_possible_values_info: 'One line for each value' text_custom_field_possible_values_info: 'One line for each value'
label_display: Display label_display: Display
field_editable: Editable

View File

@ -703,3 +703,4 @@ warning_attachments_not_saved: "%d file(s) could not be saved."
button_create_and_continue: Create and continue button_create_and_continue: Create and continue
text_custom_field_possible_values_info: 'One line for each value' text_custom_field_possible_values_info: 'One line for each value'
label_display: Display label_display: Display
field_editable: Editable

View File

@ -15,6 +15,7 @@ custom_fields_001:
is_required: false is_required: false
field_format: list field_format: list
default_value: "" default_value: ""
editable: true
custom_fields_002: custom_fields_002:
name: Searchable field name: Searchable field
min_length: 1 min_length: 1
@ -28,6 +29,7 @@ custom_fields_002:
field_format: string field_format: string
searchable: true searchable: true
default_value: "Default string" default_value: "Default string"
editable: true
custom_fields_003: custom_fields_003:
name: Development status name: Development status
min_length: 0 min_length: 0
@ -45,6 +47,7 @@ custom_fields_003:
is_required: true is_required: true
field_format: list field_format: list
default_value: "" default_value: ""
editable: true
custom_fields_004: custom_fields_004:
name: Phone number name: Phone number
min_length: 0 min_length: 0
@ -57,6 +60,7 @@ custom_fields_004:
is_required: false is_required: false
field_format: string field_format: string
default_value: "" default_value: ""
editable: true
custom_fields_005: custom_fields_005:
name: Money name: Money
min_length: 0 min_length: 0
@ -69,6 +73,7 @@ custom_fields_005:
is_required: false is_required: false
field_format: float field_format: float
default_value: "" default_value: ""
editable: true
custom_fields_006: custom_fields_006:
name: Float field name: Float field
min_length: 0 min_length: 0
@ -81,4 +86,5 @@ custom_fields_006:
is_required: false is_required: false
field_format: float field_format: float
default_value: "" default_value: ""
editable: true

View File

@ -22,7 +22,7 @@ require 'my_controller'
class MyController; def rescue_action(e) raise e end; end class MyController; def rescue_action(e) raise e end; end
class MyControllerTest < Test::Unit::TestCase class MyControllerTest < Test::Unit::TestCase
fixtures :users, :issues, :issue_statuses, :trackers, :enumerations fixtures :users, :issues, :issue_statuses, :trackers, :enumerations, :custom_fields
def setup def setup
@controller = MyController.new @controller = MyController.new
@ -43,20 +43,37 @@ class MyControllerTest < Test::Unit::TestCase
assert_template 'page' assert_template 'page'
end end
def test_get_account def test_my_account_should_show_editable_custom_fields
get :account get :account
assert_response :success assert_response :success
assert_template 'account' assert_template 'account'
assert_equal User.find(2), assigns(:user) assert_equal User.find(2), assigns(:user)
assert_tag :input, :attributes => { :name => 'user[custom_field_values][4]'}
end
def test_my_account_should_not_show_non_editable_custom_fields
UserCustomField.find(4).update_attribute :editable, false
get :account
assert_response :success
assert_template 'account'
assert_equal User.find(2), assigns(:user)
assert_no_tag :input, :attributes => { :name => 'user[custom_field_values][4]'}
end end
def test_update_account def test_update_account
post :account, :user => {:firstname => "Joe", :login => "root", :admin => 1} post :account, :user => {:firstname => "Joe",
:login => "root",
:admin => 1,
:custom_field_values => {"4" => "0100562500"}}
assert_redirected_to 'my/account' assert_redirected_to 'my/account'
user = User.find(2) user = User.find(2)
assert_equal user, assigns(:user) assert_equal user, assigns(:user)
assert_equal "Joe", user.firstname assert_equal "Joe", user.firstname
assert_equal "jsmith", user.login assert_equal "jsmith", user.login
assert_equal "0100562500", user.custom_value_for(4).value
assert !user.admin? assert !user.admin?
end end