<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>db/migrate/20090112025756_add_display_name_and_resolved_name_to_users.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -40,7 +40,7 @@ class MembersController &lt; ApplicationController
     end
 
     @default_sorting = {:order =&gt; 'roles_users.created_at', :direction =&gt; 'desc'}
-    paginate_order = current_sorting_options(@default_sorting[:order], @default_sorting[:direction], ['users.login', 'roles_users.created_at', 'users.email'])
+    paginate_order = current_sorting_options(@default_sorting[:order], @default_sorting[:direction], ['users.resolved_name', 'users.login', 'roles_users.created_at', 'users.email'])
 
     # this sets up all instance variables
     # as well as preparing @members</diff>
      <filename>app/controllers/members_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -96,6 +96,9 @@ class User &lt; ActiveRecord::Base
 
   before_save :encrypt_password
 
+  # Create the resolved name based on the display name or login
+  before_save :display_name_or_login
+
   # Authenticates a user by their login name and unencrypted password.  Returns the user or nil.
   def self.authenticate(login, password)
     # hide records with a nil activated_at
@@ -186,14 +189,7 @@ class User &lt; ActiveRecord::Base
   end
 
   def user_name
-    user_name_field = EXTENDED_FIELD_FOR_USER_NAME
-    extended_content_hash = self.xml_attributes_without_position
-    @user_name = self.login
-    if !extended_content_hash.blank? &amp;&amp; !extended_content_hash[user_name_field].blank? &amp;&amp; !extended_content_hash[user_name_field]['value'].blank?
-      # most likely have to pull the other attributes out
-      @user_name = extended_content_hash[user_name_field]['value'].strip
-    end
-    return @user_name
+    self.resolved_name
   end
 
   def show_email?
@@ -290,6 +286,10 @@ class User &lt; ActiveRecord::Base
     crypted_password.blank? || !password.blank?
   end
 
+  def display_name_or_login
+    self.resolved_name = (self.display_name || self.login)
+  end
+
   private
 
   # when a user is to be deleted</diff>
      <filename>app/models/user.rb</filename>
    </modified>
    <modified>
      <diff>@@ -34,7 +34,12 @@
 &lt;p&gt;
   &lt;table class=&quot;members-list-table&quot;&gt;
     &lt;tr valign=&quot;top&quot;&gt;
-      &lt;th colspan=&quot;2&quot; abbr=&quot;Login&quot; class=&quot;member_login&quot;&gt;&lt;%= search_sorting_controls_for('User name and/or Login', 'users.login', false) -%&gt;&lt;/th&gt;
+      &lt;th colspan=&quot;2&quot; abbr=&quot;Login&quot; class=&quot;member_login&quot;&gt;
+        &lt;%= search_sorting_controls_for('User name', 'users.resolved_name', false) -%&gt;
+        &lt;% if @site_admin -%&gt;
+          or &lt;%= search_sorting_controls_for('Login', 'users.login', false) -%&gt;
+        &lt;% end -%&gt;
+      &lt;/th&gt;
       &lt;th abbr=&quot;Joined&quot; class=&quot;member_joined&quot;&gt;&lt;%= search_sorting_controls_for('Joined', 'roles_users.created_at', true, 'desc') -%&gt;&lt;/th&gt;
 
       &lt;% if @site_admin -%&gt;</diff>
      <filename>app/views/members/list.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -19,7 +19,8 @@ namespace :kete do
                     'kete:upgrade:make_baskets_approved_if_status_null',
                     'zebra:load_initial_records',
                     'kete:upgrade:update_existing_comments_commentable_private',
-                    'kete:tools:remove_robots_txt']
+                    'kete:tools:remove_robots_txt',
+                    'kete:upgrade:move_user_name_to_display_and_resolved_name']
   namespace :upgrade do
     desc 'Privacy Controls require that Comment#commentable_private be set.  Update existing comments to have this data.'
     task :update_existing_comments_commentable_private =&gt; :environment do
@@ -185,6 +186,28 @@ namespace :kete do
       end
     end
 
+    desc 'Transfer the old user names in the extended content fields into the display/resolved name fields on the users table, and remove the user name field mapping for Users'
+    task :move_user_name_to_display_and_resolved_name =&gt; :environment do
+      User.all.each do |user|
+        unless user.display_name.nil?
+          user_name_field = EXTENDED_FIELD_FOR_USER_NAME
+          extended_content_hash = user.xml_attributes_without_position
+          if !extended_content_hash.blank? &amp;&amp; !extended_content_hash[user_name_field].blank? &amp;&amp; !extended_content_hash[user_name_field]['value'].blank?
+            user.display_name = extended_content_hash[user_name_field]['value'].strip
+            extended_content_hash = extended_content_hash.delete(user_name_field)
+            user.extended_content_values = extended_content_hash
+          end
+        end
+        user.resolved_name = user.login # this will get rewritten using an before save callback on the User model
+        user.save!
+      end
+      # finally, lets removing the user name field mapping to prevent new user names from being set
+      content_type_id = ContentType.find_by_class_name('User').id
+      extended_field_id = ExtendedField.find_by_label('User Name').id
+      content_mapping = ContentTypeToFieldMapping.find_by_content_type_id_and_extended_field_id(content_type_id, extended_field_id)
+      content_mapping.destroy unless content_mapping.nil?
+    end
+
     desc 'Checks for mimetypes an adds them if needed.'
     task :add_missing_mime_types =&gt; ['kete:upgrade:add_octet_stream_and_word_types',
                                      'kete:upgrade:add_aiff_to_audio_recordings',</diff>
      <filename>lib/tasks/upgrade.rake</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>db/bootstrap/content_type_to_field_mappings.yml</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>f9e9103c906792b8b78ae6d14a1942dea1ff68ef</id>
    </parent>
  </parents>
  <author>
    <name>Kieran Pilkington</name>
    <email>kieran@katipo.co.nz</email>
  </author>
  <url>http://github.com/kete/kete/commit/143b8c33afc2d32c696991e2f018317b689a94cc</url>
  <id>143b8c33afc2d32c696991e2f018317b689a94cc</id>
  <committed-date>2009-01-11T20:30:04-08:00</committed-date>
  <authored-date>2009-01-11T20:30:04-08:00</authored-date>
  <message>refinement: moving the user_name from extended fields to display_name and resolved_name on the Users table, adding a rake task to migrate them, delete them from the users extended content, and remove the content mapping. And allow sorting by resolved name and login on a basket member list. Removing the bootstrapped content mapping as well.</message>
  <tree>3ebaec9781f15664814ae7259e7b173e7e7d212c</tree>
  <committer>
    <name>Kieran Pilkington</name>
    <email>kieran@katipo.co.nz</email>
  </committer>
</commit>
