Added 'Estimated hours' attribute on issues.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@731 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
parent
4967f10356
commit
89b349818b
|
@ -42,6 +42,7 @@ class Issue < ActiveRecord::Base
|
||||||
validates_presence_of :subject, :description, :priority, :tracker, :author, :status
|
validates_presence_of :subject, :description, :priority, :tracker, :author, :status
|
||||||
validates_length_of :subject, :maximum => 255
|
validates_length_of :subject, :maximum => 255
|
||||||
validates_inclusion_of :done_ratio, :in => 0..100
|
validates_inclusion_of :done_ratio, :in => 0..100
|
||||||
|
validates_numericality_of :estimated_hours, :allow_nil => true
|
||||||
validates_associated :custom_values, :on => :update
|
validates_associated :custom_values, :on => :update
|
||||||
|
|
||||||
# set default status for new issues
|
# set default status for new issues
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
<div class="splitcontentright">
|
<div class="splitcontentright">
|
||||||
<p><%= f.text_field :start_date, :size => 10 %><%= calendar_for('issue_start_date') %></p>
|
<p><%= f.text_field :start_date, :size => 10 %><%= calendar_for('issue_start_date') %></p>
|
||||||
<p><%= f.text_field :due_date, :size => 10 %><%= calendar_for('issue_due_date') %></p>
|
<p><%= f.text_field :due_date, :size => 10 %><%= calendar_for('issue_due_date') %></p>
|
||||||
|
<p><%= f.text_field :estimated_hours, :size => 3 %> <%= l(:field_hours) %></p>
|
||||||
<p><%= f.select :done_ratio, ((0..10).to_a.collect {|r| ["#{r*10} %", r*10] }) %></p>
|
<p><%= f.select :done_ratio, ((0..10).to_a.collect {|r| ["#{r*10} %", r*10] }) %></p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -6,34 +6,37 @@
|
||||||
<%= link_to_if_authorized l(:button_delete), {:controller => 'issues', :action => 'destroy', :id => @issue}, :confirm => l(:text_are_you_sure), :method => :post, :class => 'icon icon-del' %>
|
<%= link_to_if_authorized l(:button_delete), {:controller => 'issues', :action => 'destroy', :id => @issue}, :confirm => l(:text_are_you_sure), :method => :post, :class => 'icon icon-del' %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h2><%= @issue.tracker.name %> #<%= @issue.id %> - <%=h @issue.subject %></h2>
|
<h2><%= @issue.tracker.name %> #<%= @issue.id %>: <%=h @issue.subject %></h2>
|
||||||
|
<p class="author">
|
||||||
|
<%= l(:label_added_time_by, distance_of_time_in_words(Time.now, @issue.created_on), link_to_user(@issue.author)) %>.
|
||||||
|
<%= l(:label_updated_time, distance_of_time_in_words(Time.now, @issue.updated_on)) if @issue.created_on != @issue.updated_on %>.
|
||||||
|
</p>
|
||||||
<div class="box">
|
<div class="box">
|
||||||
<table width="100%">
|
<table width="100%">
|
||||||
<tr>
|
<tr>
|
||||||
<td style="width:15%"><b><%=l(:field_status)%> :</b></td><td style="width:35%"><%= @issue.status.name %></td>
|
<td style="width:15%"><b><%=l(:field_status)%> :</b></td><td style="width:35%"><%= @issue.status.name %></td>
|
||||||
<td style="width:15%"><b><%=l(:field_priority)%> :</b></td><td style="width:35%"><%= @issue.priority.name %></td>
|
<td style="width:15%"><b><%=l(:field_start_date)%> :</b></td><td style="width:35%"><%= format_date(@issue.start_date) %></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><b><%=l(:field_assigned_to)%> :</b></td><td><%= @issue.assigned_to ? link_to_user(@issue.assigned_to) : "-" %></td>
|
<td><b><%=l(:field_priority)%> :</b></td><td><%= @issue.priority.name %></td>
|
||||||
<td><b><%=l(:field_category)%> :</b></td><td><%=h @issue.category ? @issue.category.name : "-" %></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><b><%=l(:field_author)%> :</b></td><td><%= link_to_user @issue.author %></td>
|
|
||||||
<td><b><%=l(:field_start_date)%> :</b></td><td><%= format_date(@issue.start_date) %></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><b><%=l(:field_created_on)%> :</b></td><td><%= format_date(@issue.created_on) %></td>
|
|
||||||
<td><b><%=l(:field_due_date)%> :</b></td><td><%= format_date(@issue.due_date) %></td>
|
<td><b><%=l(:field_due_date)%> :</b></td><td><%= format_date(@issue.due_date) %></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><b><%=l(:field_updated_on)%> :</b></td><td><%= format_date(@issue.updated_on) %></td>
|
<td><b><%=l(:field_assigned_to)%> :</b></td><td><%= @issue.assigned_to ? link_to_user(@issue.assigned_to) : "-" %></td>
|
||||||
<td><b><%=l(:field_done_ratio)%> :</b></td><td><%= @issue.done_ratio %> %</td>
|
<td><b><%=l(:field_done_ratio)%> :</b></td><td><%= @issue.done_ratio %> %</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><b><%=l(:field_fixed_version)%> :</b></td><td><%= @issue.fixed_version ? link_to_version(@issue.fixed_version) : "-" %></td>
|
<td><b><%=l(:field_category)%> :</b></td><td><%=h @issue.category ? @issue.category.name : "-" %></td>
|
||||||
|
<% if User.current.allowed_to?(:view_time_entries, @project) %>
|
||||||
<td><b><%=l(:label_spent_time)%> :</b></td>
|
<td><b><%=l(:label_spent_time)%> :</b></td>
|
||||||
<td><%= @issue.spent_hours > 0 ? (link_to lwr(:label_f_hour, @issue.spent_hours), {:controller => 'timelog', :action => 'details', :issue_id => @issue}, :class => 'icon icon-time') : "-" %></td>
|
<td><%= @issue.spent_hours > 0 ? (link_to lwr(:label_f_hour, @issue.spent_hours), {:controller => 'timelog', :action => 'details', :issue_id => @issue}, :class => 'icon icon-time') : "-" %></td>
|
||||||
|
<% end %>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><b><%=l(:field_fixed_version)%> :</b></td><td><%= @issue.fixed_version ? link_to_version(@issue.fixed_version) : "-" %></td>
|
||||||
|
<% if @issue.estimated_hours %>
|
||||||
|
<td><b><%=l(:field_estimated_hours)%> :</b></td><td><%= lwr(:label_f_hour, @issue.estimated_hours) %></td>
|
||||||
|
<% end %>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<% n = 0
|
<% n = 0
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
<div class="splitcontentright">
|
<div class="splitcontentright">
|
||||||
<p><%= f.text_field :start_date, :size => 10 %><%= calendar_for('issue_start_date') %></p>
|
<p><%= f.text_field :start_date, :size => 10 %><%= calendar_for('issue_start_date') %></p>
|
||||||
<p><%= f.text_field :due_date, :size => 10 %><%= calendar_for('issue_due_date') %></p>
|
<p><%= f.text_field :due_date, :size => 10 %><%= calendar_for('issue_due_date') %></p>
|
||||||
|
<p><%= f.text_field :estimated_hours, :size => 3 %> <%= l(:field_hours) %></p>
|
||||||
<p><%= f.select :done_ratio, ((0..10).to_a.collect {|r| ["#{r*10} %", r*10] }) %></p>
|
<p><%= f.select :done_ratio, ((0..10).to_a.collect {|r| ["#{r*10} %", r*10] }) %></p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
class AddIssuesEstimatedHours < ActiveRecord::Migration
|
||||||
|
def self.up
|
||||||
|
add_column :issues, :estimated_hours, :float
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.down
|
||||||
|
remove_column :issues, :estimated_hours
|
||||||
|
end
|
||||||
|
end
|
|
@ -158,6 +158,7 @@ field_issue_to_id: Related issue
|
||||||
field_delay: Delay
|
field_delay: Delay
|
||||||
field_assignable: Issues can be assigned to this role
|
field_assignable: Issues can be assigned to this role
|
||||||
field_redirect_existing_links: Redirect existing links
|
field_redirect_existing_links: Redirect existing links
|
||||||
|
field_estimated_hours: Estimated time
|
||||||
|
|
||||||
setting_app_title: Application title
|
setting_app_title: Application title
|
||||||
setting_app_subtitle: Application subtitle
|
setting_app_subtitle: Application subtitle
|
||||||
|
@ -416,6 +417,8 @@ label_sort_by: Sort by "%s"
|
||||||
label_send_test_email: Send a test email
|
label_send_test_email: Send a test email
|
||||||
label_feeds_access_key_created_on: RSS access key created %s ago
|
label_feeds_access_key_created_on: RSS access key created %s ago
|
||||||
label_module_plural: Modules
|
label_module_plural: Modules
|
||||||
|
label_added_time_by: Added %s ago by %s
|
||||||
|
label_updated_time: Updated %s ago
|
||||||
|
|
||||||
button_login: Login
|
button_login: Login
|
||||||
button_submit: Submit
|
button_submit: Submit
|
||||||
|
|
|
@ -158,6 +158,7 @@ field_issue_to_id: Demande liée
|
||||||
field_delay: Retard
|
field_delay: Retard
|
||||||
field_assignable: Demandes assignables à ce rôle
|
field_assignable: Demandes assignables à ce rôle
|
||||||
field_redirect_existing_links: Rediriger les liens existants
|
field_redirect_existing_links: Rediriger les liens existants
|
||||||
|
field_estimated_hours: Temps estimé
|
||||||
|
|
||||||
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
|
||||||
|
@ -416,6 +417,8 @@ label_sort_by: Trier par "%s"
|
||||||
label_send_test_email: Envoyer un email de test
|
label_send_test_email: Envoyer un email de test
|
||||||
label_feeds_access_key_created_on: Clé d'accès RSS créée il y a %s
|
label_feeds_access_key_created_on: Clé d'accès RSS créée il y a %s
|
||||||
label_module_plural: Modules
|
label_module_plural: Modules
|
||||||
|
label_added_time_by: Ajouté il y a %s par %s
|
||||||
|
label_updated_time: Mis à jour il y a %s
|
||||||
|
|
||||||
button_login: Connexion
|
button_login: Connexion
|
||||||
button_submit: Soumettre
|
button_submit: Soumettre
|
||||||
|
|
|
@ -414,6 +414,8 @@ background:#467aa7;
|
||||||
.textright{text-align:right;}
|
.textright{text-align:right;}
|
||||||
.important{color:#f02025; background-color:inherit; font-weight:bold;}
|
.important{color:#f02025; background-color:inherit; font-weight:bold;}
|
||||||
|
|
||||||
|
#content .author {color:#888; font-style:italic;}
|
||||||
|
|
||||||
.box{
|
.box{
|
||||||
margin:0 0 20px 0;
|
margin:0 0 20px 0;
|
||||||
padding:10px;
|
padding:10px;
|
||||||
|
|
|
@ -40,7 +40,7 @@ class ProjectsControllerTest < Test::Unit::TestCase
|
||||||
get :list
|
get :list
|
||||||
assert_response :success
|
assert_response :success
|
||||||
assert_template 'list'
|
assert_template 'list'
|
||||||
assert_not_nil assigns(:projects)
|
assert_not_nil assigns(:project_tree)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_show
|
def test_show
|
||||||
|
|
Loading…
Reference in New Issue