changeset 84:432bb11e0390 cannam

Merge from branch "luisf"
author Chris Cannam
date Thu, 16 Dec 2010 10:03:20 +0000
parents 8a49eabbb30a (current diff) 387ad4f40686 (diff)
children 22c68d60853d
files config/locales/en-GB.yml config/locales/en.yml
diffstat 19 files changed, 331 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- a/app/controllers/account_controller.rb	Tue Dec 14 14:05:06 2010 +0000
+++ b/app/controllers/account_controller.rb	Thu Dec 16 10:03:20 2010 +0000
@@ -77,13 +77,19 @@
   # User self-registration
   def register
     redirect_to(home_url) && return unless Setting.self_registration? || session[:auth_source_registration]
+
     if request.get?
       session[:auth_source_registration] = nil
       @user = User.new(:language => Setting.default_language)
+
+      @ssamr_user_details = SsamrUserDetail.new
+
     else
       @user = User.new(params[:user])
       @user.admin = false
+                  
       @user.register
+      
       if session[:auth_source_registration]
         @user.activate
         @user.login = session[:auth_source_registration][:login]
@@ -98,6 +104,11 @@
         @user.login = params[:user][:login]
         @user.password, @user.password_confirmation = params[:password], params[:password_confirmation]
 
+        @ssamr_user_details = SsamrUserDetail.new(params[:ssamr_user_details])
+
+        # associates the 2 objects
+        @user.ssamr_user_detail = @ssamr_user_details
+
         case Setting.self_registration
         when '1'
           register_by_email_activation(@user)
@@ -257,6 +268,9 @@
   # Pass a block for behavior when a user fails to save
   def register_manually_by_administrator(user, &block)
     if user.save
+
+       @ssamr_user_details.save!
+
       # Sends an email to the administrators
       Mailer.deliver_account_activation_request(user)
       account_pending
--- a/app/controllers/issues_controller.rb	Tue Dec 14 14:05:06 2010 +0000
+++ b/app/controllers/issues_controller.rb	Thu Dec 16 10:03:20 2010 +0000
@@ -132,7 +132,19 @@
       attachments = Attachment.attach_files(@issue, params[:attachments])
       render_attachment_warning_if_needed(@issue)
       flash[:notice] = l(:notice_successful_create)
+      
       call_hook(:controller_issues_new_after_save, { :params => params, :issue => @issue})
+
+      # Adds user to watcher's list
+      @issue.add_watcher(User.current)
+
+      # Also adds the assignee to the watcher's list
+       if params[:issue][:assigned_to_id] && !params[:issue][:assigned_to_id].empty?:
+        unless @issue.watcher_ids.include?(params[:issue][:assigned_to_id]):
+          @issue.add_watcher(User.find(params[:issue][:assigned_to_id]))
+        end
+       end
+
       respond_to do |format|
         format.html {
           redirect_to(params[:continue] ?  { :action => 'new', :project_id => @project, :issue => {:tracker_id => @issue.tracker, :parent_issue_id => @issue.parent_issue_id}.reject {|k,v| v.nil?} } :
@@ -274,6 +286,18 @@
     @notes = params[:notes] || (params[:issue].present? ? params[:issue][:notes] : nil)
     @issue.init_journal(User.current, @notes)
     @issue.safe_attributes = params[:issue]
+
+    # tests if the the user assigned_to_id
+    # is in this issues watcher's list
+    # if not, adds it.
+
+    if params[:issue][:assigned_to_id] && !params[:issue][:assigned_to_id].empty?:
+      unless @issue.watcher_ids.include?(params[:issue][:assigned_to_id]):
+        @issue.add_watcher(User.find(params[:issue][:assigned_to_id]))
+      end
+    end
+
+
   end
 
   # TODO: Refactor, lots of extra code in here
--- a/app/controllers/users_controller.rb	Tue Dec 14 14:05:06 2010 +0000
+++ b/app/controllers/users_controller.rb	Thu Dec 16 10:03:20 2010 +0000
@@ -52,6 +52,8 @@
   def show
     @user = User.find(params[:id])
     
+    @description = @user.ssamr_user_detail.description
+            
     # show projects based on current user visibility
     @memberships = @user.memberships.all(:conditions => Project.visible_by(User.current))
     
@@ -70,12 +72,15 @@
     render_404
   end
 
-  def new
+  def new      
     @notification_options = User::MAIL_NOTIFICATION_OPTIONS
     @notification_option = Setting.default_notification_option
 
     @user = User.new(:language => Setting.default_language)
     @auth_sources = AuthSource.find(:all)
+
+    @ssamr_user_details = SsamrUserDetail.new
+    
   end
   
   verify :method => :post, :only => :create, :render => {:nothing => true, :status => :method_not_allowed }
@@ -83,7 +88,7 @@
     @notification_options = User::MAIL_NOTIFICATION_OPTIONS
     @notification_option = Setting.default_notification_option
 
-    @user = User.new(params[:user])
+    @user = User.new(params[:user])    
     @user.admin = params[:user][:admin] || false
     @user.login = params[:user][:login]
     @user.password, @user.password_confirmation = params[:password], params[:password_confirmation] unless @user.auth_source_id
@@ -93,8 +98,16 @@
     @user.pref.attributes = params[:pref]
     @user.pref[:no_self_notified] = (params[:no_self_notified] == '1')
 
+    @ssamr_user_details = SsamrUserDetail.new(params[:ssamr_user_details])
+
+    # associates the 2 objects
+    @user.ssamr_user_detail = @ssamr_user_details
+
     if @user.save
       @user.pref.save
+                 
+      @ssamr_user_details.save!
+          
       @user.notified_project_ids = (params[:notification_option] == 'selected' ? params[:notified_project_ids] : [])
 
       Mailer.deliver_account_information(@user, params[:password]) if params[:send_information]
@@ -114,7 +127,9 @@
     @user = User.find(params[:id])
     @notification_options = @user.valid_notification_options
     @notification_option = @user.mail_notification
-
+    
+    @ssamr_user_details = @user.ssamr_user_detail
+    
     @auth_sources = AuthSource.find(:all)
     @membership ||= Member.new
   end
@@ -122,6 +137,7 @@
   verify :method => :put, :only => :update, :render => {:nothing => true, :status => :method_not_allowed }
   def update
     @user = User.find(params[:id])
+
     @notification_options = @user.valid_notification_options
     @notification_option = @user.mail_notification
 
@@ -139,6 +155,14 @@
     @user.pref.attributes = params[:pref]
     @user.pref[:no_self_notified] = (params[:no_self_notified] == '1')
 
+    @ssamr_user_details = @user.ssamr_user_detail
+    if params[:ssamr_user_details].nil? or params[:ssamr_user_details].empty?
+      @ssamr_user_details.description = @user.ssamr_user_detail.description
+    else
+      @ssamr_user_details.description = params[:ssamr_user_details][:description]
+      @ssamr_user_details.save!
+    end
+
     if @user.save
       @user.pref.save
       @user.notified_project_ids = (params[:notification_option] == 'selected' ? params[:notified_project_ids] : [])
--- a/app/helpers/projects_helper.rb	Tue Dec 14 14:05:06 2010 +0000
+++ b/app/helpers/projects_helper.rb	Thu Dec 16 10:03:20 2010 +0000
@@ -83,6 +83,113 @@
     s
   end
 
+
+  # Renders a tree of projects where the current user belongs
+  # as a nested set of unordered lists
+  # The given collection may be a subset of the whole project tree
+  # (eg. some intermediate nodes are private and can not be seen)
+  def render_my_project_hierarchy(projects)
+    s = ''
+
+    a = ''
+
+    # Flag to tell if user has any projects
+    t = FALSE
+    
+    if projects.any?
+      ancestors = []
+      original_project = @project
+      projects.each do |project|
+        # set the project environment to please macros.
+
+        @project = project
+
+        if User.current.member_of?(project):
+
+          t = TRUE
+
+          if (ancestors.empty? || project.is_descendant_of?(ancestors.last))
+            s << "<ul class='projects #{ ancestors.empty? ? 'root' : nil}'>\n"
+          else
+            ancestors.pop
+            s << "</li>"
+            while (ancestors.any? && !project.is_descendant_of?(ancestors.last))
+              ancestors.pop
+              s << "</ul></li>\n"
+            end
+          end
+
+          classes = (ancestors.empty? ? 'root' : 'child')
+          s << "<li class='#{classes}'><div class='#{classes}'>" +
+                 link_to_project(project, {}, :class => "project #{User.current.member_of?(project) ? 'my-project' : nil}")
+          s << "<div class='wiki description'>#{textilizable(project.short_description, :project => project)}</div>" unless project.description.blank?
+          s << "</div>\n"
+          ancestors << project
+        end
+       end
+        s << ("</li></ul>\n" * ancestors.size)
+        @project = original_project
+    end
+
+    if t == TRUE
+      a << "<h2>"
+      a <<  l("label_my_project_plural")
+      a << "</h2>"
+      a << s
+    else
+      a = s
+    end
+    
+    a
+  end
+
+  # Renders a tree of projects where the current DOES NOT belong
+  # as a nested set of unordered lists
+  # The given collection may be a subset of the whole project tree
+  # (eg. some intermediate nodes are private and can not be seen)
+  def render_other_project_hierarchy(projects)
+    s = ''
+
+    if projects.any?
+      ancestors = []
+      original_project = @project
+      projects.each do |project|
+        # set the project environment to please macros.
+
+        @project = project
+
+        if not User.current.member_of?(project):
+
+          if (ancestors.empty? || project.is_descendant_of?(ancestors.last))
+            s << "<ul class='projects #{ ancestors.empty? ? 'root' : nil}'>\n"
+          else
+            ancestors.pop
+            s << "</li>"
+            while (ancestors.any? && !project.is_descendant_of?(ancestors.last))
+              ancestors.pop
+              s << "</ul></li>\n"
+            end
+          end
+
+          classes = (ancestors.empty? ? 'root' : 'child')
+          s << "<li class='#{classes}'><div class='#{classes}'>" +
+                 link_to_project(project, {}, :class => "project #{User.current.member_of?(project) ? 'my-project' : nil}")
+          s << "<div class='wiki description'>#{textilizable(project.short_description, :project => project)}</div>" unless project.description.blank?
+          s << "</div>\n"
+          ancestors << project          
+        end
+       end
+
+      s << ("</li></ul>\n" * ancestors.size)
+      @project = original_project
+    end
+
+
+    s
+  end
+
+
+
   # Returns a set of options for a select field, grouped by project.
   def version_options_for_select(versions, selected=nil)
     grouped = Hash.new {|h,k| h[k] = []}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/app/models/ssamr_user_detail.rb	Thu Dec 16 10:03:20 2010 +0000
@@ -0,0 +1,5 @@
+class SsamrUserDetail < ActiveRecord::Base
+  belongs_to :user
+
+  validates_presence_of :description
+end
--- a/app/models/user.rb	Tue Dec 14 14:05:06 2010 +0000
+++ b/app/models/user.rb	Thu Dec 16 10:03:20 2010 +0000
@@ -51,6 +51,9 @@
   has_one :api_token, :dependent => :destroy, :class_name => 'Token', :conditions => "action='api'"
   belongs_to :auth_source
   
+  has_one :ssamr_user_detail, :dependent => :destroy, :class_name => 'SsamrUserDetail'
+  accepts_nested_attributes_for :ssamr_user_detail
+
   # Active non-anonymous users scope
   named_scope :active, :conditions => "#{User.table_name}.status = #{STATUS_ACTIVE}"
   
@@ -62,6 +65,9 @@
   attr_protected :login, :admin, :password, :password_confirmation, :hashed_password, :group_ids
 	
   validates_presence_of :login, :firstname, :lastname, :mail, :if => Proc.new { |user| !user.is_a?(AnonymousUser) }
+  
+  # TODO: is this validation correct validates_presence_of :ssamr_user_detail
+  
   validates_uniqueness_of :login, :if => Proc.new { |user| !user.login.blank? }, :case_sensitive => false
   validates_uniqueness_of :mail, :if => Proc.new { |user| !user.mail.blank? }, :case_sensitive => false
   # Login must contain lettres, numbers, underscores only
@@ -92,6 +98,10 @@
     write_attribute(:mail, arg.to_s.strip)
   end
   
+  def description=(arg)
+    write_attribute(:description, arg.to_s.strip)
+  end
+    
   def identity_url=(url)
     if url.blank?
       write_attribute(:identity_url, '')
--- a/app/views/account/register.rhtml	Tue Dec 14 14:05:06 2010 +0000
+++ b/app/views/account/register.rhtml	Thu Dec 16 10:03:20 2010 +0000
@@ -29,6 +29,23 @@
 <p><label for="user_language"><%=l(:field_language)%></label>
 <%= select("user", "language", lang_options_for_select) %></p>
 
+
+<h3><%=l(:label_ssamr_details)%></h3>
+	
+		<% fields_for :ssamr_user_details, :builder => TabularFormBuilder, :lang => current_language do |ssamr_user_detail| %>	
+			<p>
+
+                          <%= ssamr_user_detail.text_area :description, :rows => 3, :cols => 40, :required => true, :class => 'wiki-edit' %>
+                          <%= wikitoolbar_for 'ssamr_user_details_description' %>
+
+                          <br />
+                          <em> <%=l(:text_user_ssamr_description_info)%></em>
+                        </p>
+                <% end %>
+          
+
+
+
 <% if Setting.openid? %>
 <p><label for="user_identity_url"><%=l(:field_identity_url)%></label>
 <%= text_field 'user', 'identity_url'  %></p>
--- a/app/views/issues/_form.rhtml	Tue Dec 14 14:05:06 2010 +0000
+++ b/app/views/issues/_form.rhtml	Thu Dec 16 10:03:20 2010 +0000
@@ -9,9 +9,12 @@
 <p><%= f.text_field :subject, :size => 80, :required => true %></p>
                                      
 <% if User.current.allowed_to?(:manage_subtasks, @project) %>
-<p id="parent_issue"><%= f.text_field :parent_issue_id, :size => 10 %></p>
-<div id="parent_issue_candidates" class="autocomplete"></div>
-<%= javascript_tag "observeParentIssueField('#{auto_complete_issues_path(:id => @issue, :project_id => @project) }')" %>
+  <p id="parent_issue"><%= f.text_field :parent_issue_id, :size => 10, :autocomplete => :on %>
+  <br />
+                          <em> <%=l(:text_issue_parent_issue_info)%></em>
+  </p>
+  <div id="parent_issue_candidates" class="autocomplete"></div>
+    <%= javascript_tag "observeParentIssueField('#{auto_complete_issues_path(:id => @issue, :project_id => @project) }')" %>
 <% end %>
 
 <p><%= f.text_area :description,
--- a/app/views/mailer/account_activation_request.text.html.rhtml	Tue Dec 14 14:05:06 2010 +0000
+++ b/app/views/mailer/account_activation_request.text.html.rhtml	Thu Dec 16 10:03:20 2010 +0000
@@ -1,2 +1,12 @@
 <p><%= l(:mail_body_account_activation_request, h(@user.login)) %></p>
 <p><%= link_to @url, @url %></p>
+
+<h3><%= l(:label_ssamr_details) %></h3>
+<p>
+  <%=l(:field_name)%>: <%= h @user.name %><br />
+  <%=l(:field_mail)%>: <%= h @user.mail %>
+</p>
+
+<h4><%= l(:label_ssamr_description ) %></h4>
+<%= textilizable @user.ssamr_user_detail['description'] %>
+
--- a/app/views/mailer/account_activation_request.text.plain.rhtml	Tue Dec 14 14:05:06 2010 +0000
+++ b/app/views/mailer/account_activation_request.text.plain.rhtml	Thu Dec 16 10:03:20 2010 +0000
@@ -1,2 +1,11 @@
 <%= l(:mail_body_account_activation_request, @user.login) %>
 <%= @url %>
+
+*<%= l(:label_ssamr_details) %>*
+<%=l(:field_name)%>: <%= h @user.name %>
+<%=l(:field_mail)%>: <%= h @user.mail %>
+
+*<%= l(:label_ssamr_description ) %>*
+<%= h @user.ssamr_user_detail['description'] %>
+
+
--- a/app/views/projects/_form.rhtml	Tue Dec 14 14:05:06 2010 +0000
+++ b/app/views/projects/_form.rhtml	Thu Dec 16 10:03:20 2010 +0000
@@ -2,7 +2,10 @@
 
 <div class="box">
 <!--[form:project]-->
-<p><%= f.text_field :name, :required => true, :size => 60 %></p>
+<p><%= f.text_field :name, :required => true, :size => 60 %>
+  <br />
+  <em> <%= l(:text_project_name_info) %></em>
+</p>
 
 <% unless @project.allowed_parents.compact.empty? %>
     <p><%= label(:project, :parent_id, l(:field_parent)) %><%= parent_project_select_tag(@project) %></p>
@@ -11,10 +14,17 @@
 <p><%= f.text_area :description, :rows => 5, :class => 'wiki-edit' %></p>
 <p><%= f.text_field :identifier, :required => true, :size => 60, :disabled => @project.identifier_frozen? %>
 <% unless @project.identifier_frozen? %>
-<br /><em><%= l(:text_length_between, :min => 1, :max => Project::IDENTIFIER_MAX_LENGTH) %> <%= l(:text_project_identifier_info) %></em>
+  <br />
+  <em><%= l(:text_length_between, :min => 1, :max => Project::IDENTIFIER_MAX_LENGTH) %> <%= l(:text_project_identifier_info) %></em>
 <% end %></p>
-<p><%= f.text_field :homepage, :size => 60 %></p>
-<p><%= f.check_box :is_public %></p>
+<p><%= f.text_field :homepage, :size => 60 %>
+<br />
+  <em> <%= l(:text_project_homepage_info) %></em>
+</p>
+<p><%= f.check_box :is_public %>
+<br />
+  <em> <%= l(:text_project_visibility_info) %></em>
+</p>
 <%= wikitoolbar_for 'project_description' %>
 
 <% @project.custom_field_values.each do |value| %>
--- a/app/views/projects/index.rhtml	Tue Dec 14 14:05:06 2010 +0000
+++ b/app/views/projects/index.rhtml	Thu Dec 16 10:03:20 2010 +0000
@@ -9,9 +9,20 @@
     <%= link_to l(:label_overall_activity), { :controller => 'activities', :action => 'index' }%>
 </div>
 
-<h2><%=l(:label_project_plural)%></h2>
+<% if User.current.logged? %>
+  
+  <%= render_my_project_hierarchy(@projects)%>
 
-<%= render_project_hierarchy(@projects)%>
+  <h2><%=l(:label_other_project_plural)%></h2>
+  <%= render_other_project_hierarchy(@projects)%>
+
+<% else %>
+
+  <h2><%=l(:label_project_plural)%></h2>
+  <%= render_project_hierarchy(@projects)%>
+<% end %>
+
+
 
 <% if User.current.logged? %>
 <p style="text-align:right;">
@@ -19,6 +30,7 @@
 </p>
 <% end %>
 
+
 <% other_formats_links do |f| %>
 	<%= f.link_to 'Atom', :url => {:key => User.current.rss_key} %>
 <% end %>
--- a/app/views/projects/settings/_members.rhtml	Tue Dec 14 14:05:06 2010 +0000
+++ b/app/views/projects/settings/_members.rhtml	Thu Dec 16 10:03:20 2010 +0000
@@ -13,19 +13,18 @@
 	</tr></thead>
 	<tbody>
 	<% members.each do |member| %>
-	<% next if member.new_record? %>
-	<tr id="member-<%= member.id %>" class="<%= cycle 'odd', 'even' %> member">
-	<td class="<%= member.principal.class.name.downcase %>"><%= link_to_user member.principal %></td>
-  <td class="roles">
-    <span id="member-<%= member.id %>-roles"><%=h member.roles.sort.collect(&:to_s).join(', ') %></span>
-    <% if authorize_for('members', 'edit') %>
-      <% remote_form_for(:member, member, :url => {:controller => 'members', :action => 'edit', :id => member},
-      																		:method => :post,
-      																		:html => { :id => "member-#{member.id}-roles-form", :class => 'hol' }) do |f| %>
-      	<p><% roles.each do |role| %>
-        <label><%= check_box_tag 'member[role_ids][]', role.id, member.roles.include?(role),
+          <% next if member.new_record? %>
+          <tr id="member-<%= member.id %>" class="<%= cycle 'odd', 'even' %> member">
+          <td class="<%= member.principal.class.name.downcase %>"><%= link_to_user member.principal %></td>
+          <td class="roles">
+            <span id="member-<%= member.id %>-roles"><%=h member.roles.sort.collect(&:to_s).join(', ') %></span>
+            <% if authorize_for('members', 'edit') %>
+            <% remote_form_for(:member, member, :url => {:controller => 'members', :action => 'edit', :id => member},
+      			 :method => :post, :html => { :id => "member-#{member.id}-roles-form", :class => 'hol' }) do |f| %>
+            <p><% roles.each do |role| %>
+              <label><%= check_box_tag 'member[role_ids][]', role.id, member.roles.include?(role),
         																							 :disabled => member.member_roles.detect {|mr| mr.role_id == role.id && !mr.inherited_from.nil?} %> <%=h role %></label><br />
-        <% end %></p>
+              <% end %></p>
         <%= hidden_field_tag 'member[role_ids][]', '' %>
         <p><%= submit_tag l(:button_change), :class => "small" %>
         <%= link_to_function l(:button_cancel), "$('member-#{member.id}-roles').show(); $('member-#{member.id}-roles-form').hide(); return false;" %></p>
@@ -51,7 +50,7 @@
 </div>
 
 
-<% principals = Principal.active.find(:all, :limit => 100, :order => 'type, login, lastname ASC') - @project.principals %>
+<% principals = Principal.active.find(:all, :limit => 10, :order => 'type, login, lastname ASC') - @project.principals %>
 
 <div class="splitcontentright">
 <% if roles.any? && principals.any? %>
--- a/app/views/users/_form.rhtml	Tue Dec 14 14:05:06 2010 +0000
+++ b/app/views/users/_form.rhtml	Thu Dec 16 10:03:20 2010 +0000
@@ -20,6 +20,20 @@
 </div>
 
 <div class="box tabular">
+	<h3><%=l(:label_ssamr_details)%></h3>
+          <% fields_for :ssamr_user_details, :builder => TabularFormBuilder, :lang => current_language do |ssamr_user_detail| %>
+            <p>
+              <%= ssamr_user_detail.text_area :description, :rows => 3, :cols => 40, :required => true, :class => 'wiki-edit'  %>
+              <%= wikitoolbar_for 'ssamr_user_details_description' %>
+              <br />
+              <em> <%=l(:text_user_ssamr_description_info)%></em>
+            </p>
+          <% end %>          
+</div>
+
+
+
+<div class="box tabular">
 <h3><%=l(:label_authentication)%></h3>
 <% unless @auth_sources.empty? %>
 <p><%= f.select :auth_source_id, ([[l(:label_internal), ""]] + @auth_sources.collect { |a| [a.name, a.id] }), {}, :onchange => "if (this.value=='') {Element.show('password_fields');} else {Element.hide('password_fields');}" %></p>
--- a/app/views/users/show.rhtml	Tue Dec 14 14:05:06 2010 +0000
+++ b/app/views/users/show.rhtml	Thu Dec 16 10:03:20 2010 +0000
@@ -20,6 +20,10 @@
 	<% end %>
 </ul>
 
+<h3><%=l(:label_ssamr_description)%></h3>
+<%= textilizable @description %>
+
+
 <% unless @memberships.empty? %>
 <h3><%=l(:label_project_plural)%></h3>
 <ul>
--- a/config/locales/en.yml	Tue Dec 14 14:05:06 2010 +0000
+++ b/config/locales/en.yml	Thu Dec 16 10:03:20 2010 +0000
@@ -200,7 +200,9 @@
   
   gui_validation_error: 1 error
   gui_validation_error_plural: "{{count}} errors"
-  
+
+  field_ssamr_user_detail:
+    description: User Description
   field_name: Name
   field_description: Description
   field_summary: Summary
@@ -299,11 +301,12 @@
   field_text: Text field
   field_visible: Visible
   
+  setting_tipoftheday_text: Tip of the Day
+  setting_notifications_text: Notifications
+  label_ssamr_description: Description
   setting_app_title: Application title
   setting_app_subtitle: Application subtitle
   setting_welcome_text: Welcome text
-  setting_tipoftheday_text: Tip of the Day
-  setting_notifications_text: Notifications
   setting_default_language: Default language
   setting_login_required: Authentication required
   setting_self_registration: Self-registration
@@ -425,6 +428,7 @@
   project_module_gantt: Gantt
   
   label_tipoftheday: Tip of the day
+  label_ssamr_details: Other Details
   label_user: User
   label_user_plural: Users
   label_user_new: New user
@@ -432,6 +436,8 @@
   label_project: Project
   label_project_new: New project
   label_project_plural: Projects
+  label_my_project_plural: My Projects
+  label_other_project_plural: Other Projects
   label_x_projects:
     zero:  no projects
     one:   1 project
@@ -859,7 +865,12 @@
   text_tip_issue_begin_day: issue beginning this day
   text_tip_issue_end_day: issue ending this day
   text_tip_issue_begin_end_day: issue beginning and ending this day
-  text_project_identifier_info: 'Only lower case letters (a-z), numbers and dashes are allowed.<br />Once saved, the identifier can not be changed.'
+  text_project_identifier_info: 'Only lower case letters (a-z), numbers and dashes are allowed.<br /> This will be used in all project-related URLs, and as the repository name. Once saved, the identifier <b>can not</b> be changed.'
+  text_project_name_info: "This will be the name of your project throughout this site.<br /> You can change your project's name at any time, in the project's settings."
+  text_project_visibility_info: "If your project is not public, it will only be visible to users that you have added as project members."
+  text_project_homepage_info: 'Link to an external project page.'
+  text_user_ssamr_description_info: 'Description of your interests and experience as a Researcher/Developer in the field of Audio and Music.'
+  text_issue_parent_issue_info: 'If this is a subtask, please insert its parent task number or write the main task name.'
   text_caracters_maximum: "{{count}} characters maximum."
   text_caracters_minimum: "Must be at least {{count}} characters long."
   text_length_between: "Length between {{min}} and {{max}} characters."
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/db/migrate/20101123161346_create_ssamr_user_details.rb	Thu Dec 16 10:03:20 2010 +0000
@@ -0,0 +1,14 @@
+class CreateSsamrUserDetails < ActiveRecord::Migration
+  def self.up
+    create_table :ssamr_user_details do |t|
+      t.integer :user_id
+      t.text :description 
+      t.text :university
+    end
+  end
+
+  def self.down
+    drop_table :ssamr_user_details
+  end
+  
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/fixtures/ssamr_user_details.yml	Thu Dec 16 10:03:20 2010 +0000
@@ -0,0 +1,7 @@
+# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
+
+# one:
+#   column: value
+#
+# two:
+#   column: value
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/unit/ssamr_user_details_test.rb	Thu Dec 16 10:03:20 2010 +0000
@@ -0,0 +1,8 @@
+require 'test_helper'
+
+class SsamrUserDetailsTest < ActiveSupport::TestCase
+  # Replace this with your real tests.
+  test "User Id should be correct" do
+    assert_equal user_id, user.id 
+  end
+end