Feature #1953 ยป issue_1953.diff
app/controllers/issues_controller.rb | ||
---|---|---|
14 | 14 |
# You should have received a copy of the GNU General Public License |
15 | 15 |
# along with this program; if not, write to the Free Software |
16 | 16 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
17 |
require 'date' |
|
17 | 18 | |
18 | 19 |
class IssuesController < ApplicationController |
19 | 20 |
menu_item :new_issue, :only => :new |
... | ... | |
168 | 169 |
UPDATABLE_ATTRS_ON_TRANSITION = %w(status_id assigned_to_id fixed_version_id done_ratio) unless const_defined?(:UPDATABLE_ATTRS_ON_TRANSITION) |
169 | 170 |
|
170 | 171 |
def edit |
172 |
if ! manage_issue_due_date params |
|
173 |
flash[:error] = l(:error_update_due_date_fields_required) |
|
174 |
redirect_to(params[:back_to] || {:action => 'show', :id => @issue}) and return |
|
175 |
end |
|
176 | ||
171 | 177 |
@allowed_statuses = @issue.new_statuses_allowed_to(User.current) |
172 | 178 |
@priorities = IssuePriority.all |
173 | 179 |
@edit_allowed = User.current.allowed_to?(:edit_issues, @project) |
... | ... | |
459 | 465 |
end |
460 | 466 |
|
461 | 467 |
private |
468 |
def manage_issue_due_date(params) |
|
469 |
if params[:issue][:update_due_date_based_on_estimated_hours].to_i == 1 |
|
470 |
if params[:issue][:estimated_hours].blank? or params[:issue][:start_date].blank? |
|
471 |
return false |
|
472 |
else |
|
473 |
additional_days = 0 |
|
474 |
if params[:issue][:estimated_hours].to_f % Setting.hours_in_work_day.to_f != 0 && params[:issue][:estimated_hours].to_f > Setting.hours_in_work_day.to_f |
|
475 |
additional_days += 1 |
|
476 |
end |
|
477 |
work_days_needed = (params[:issue][:estimated_hours].to_f / Setting.hours_in_work_day.to_f).to_i |
|
478 |
work_days_needed += additional_days |
|
479 |
params[:issue][:due_date] = (Date.parse(params[:issue][:start_date]) + work_days_needed-1) |
|
480 | ||
481 |
# In the span from start date to due date, add additional days for every non-work day |
|
482 |
number_of_non_work_days = 0 |
|
483 |
(Date.parse(params[:issue][:start_date])..params[:issue][:due_date]).each do |date| |
|
484 |
if ! Setting.days_in_work_week.include?(Date::DAYNAMES[date.wday].downcase) |
|
485 |
number_of_non_work_days += 1 |
|
486 |
end |
|
487 |
end |
|
488 |
params[:issue][:due_date] = params[:issue][:due_date] + number_of_non_work_days |
|
489 |
# Now make sure our end date isn't a non-work day... |
|
490 |
while ! Setting.days_in_work_week.include?(Date::DAYNAMES[params[:issue][:due_date].wday].downcase) |
|
491 |
params[:issue][:due_date] = params[:issue][:due_date] + 1 |
|
492 |
end |
|
493 |
params[:issue][:due_date] = params[:issue][:due_date].strftime('%Y-%m-%d') |
|
494 |
end |
|
495 |
end |
|
496 | ||
497 |
return true |
|
498 |
end |
|
499 | ||
462 | 500 |
def find_issue |
463 | 501 |
@issue = Issue.find(params[:id], :include => [:project, :tracker, :status, :author, :priority, :category]) |
464 | 502 |
@project = @issue.project |
app/models/issue.rb | ||
---|---|---|
60 | 60 | |
61 | 61 |
before_save :update_done_ratio_from_issue_status |
62 | 62 |
after_save :create_journal |
63 | ||
64 |
attr_accessor :update_due_date_based_on_estimated_hours |
|
63 | 65 |
|
64 | 66 |
# Returns true if usr or current user is allowed to view the issue |
65 | 67 |
def visible?(usr=nil) |
app/views/issues/_attributes.rhtml | ||
---|---|---|
34 | 34 |
<p><%= f.text_field :start_date, :size => 10 %><%= calendar_for('issue_start_date') %></p> |
35 | 35 |
<p><%= f.text_field :due_date, :size => 10 %><%= calendar_for('issue_due_date') %></p> |
36 | 36 |
<p><%= f.text_field :estimated_hours, :size => 3 %> <%= l(:field_hours) %></p> |
37 |
<p><%= f.check_box :update_due_date_based_on_estimated_hours %></p> |
|
37 | 38 |
<% if Issue.use_field_for_done_ratio? %> |
38 | 39 |
<p><%= f.select :done_ratio, ((0..10).to_a.collect {|r| ["#{r*10} %", r*10] }) %></p> |
39 | 40 |
<% end %> |
app/views/settings/_issues.rhtml | ||
---|---|---|
15 | 15 |
<%= select_tag 'settings[issue_done_ratio]', |
16 | 16 |
options_for_select(Issue::DONE_RATIO_OPTIONS.collect {|i| [l("setting_issue_done_ratio_#{i}"), i]}, Setting.issue_done_ratio) %></p> |
17 | 17 | |
18 |
<p><label><%= l(:setting_hours_in_work_day) %></label> |
|
19 |
<%= text_field_tag 'settings[hours_in_work_day]', Setting.hours_in_work_day, :size => 2 %></p> |
|
20 | ||
18 | 21 |
<p><label><%= l(:setting_issues_export_limit) %></label> |
19 | 22 |
<%= text_field_tag 'settings[issues_export_limit]', Setting.issues_export_limit, :size => 6 %></p> |
20 | 23 |
</div> |
21 | 24 | |
25 |
<fieldset class="box settings"><legend><%= l(:setting_days_in_work_week) %></legend> |
|
26 |
<%= hidden_field_tag 'settings[days_in_work_week][]', '' %> |
|
27 |
<% l('date.day_names').map{|d| d.downcase}.each do |day| %> |
|
28 |
<label><%= check_box_tag 'settings[days_in_work_week][]', day, Setting.days_in_work_week.include?(day) %> |
|
29 |
<%= day.capitalize %></label><br /> |
|
30 |
<% end %> |
|
31 |
</fieldset> |
|
32 | ||
22 | 33 |
<fieldset class="box settings"><legend><%= l(:setting_issue_list_default_columns) %></legend> |
23 | 34 |
<%= hidden_field_tag 'settings[issue_list_default_columns][]', '' %> |
24 | 35 |
<% Query.new.available_columns.each do |column| %> |
config/locales/en.yml | ||
---|---|---|
161 | 161 |
error_issue_done_ratios_not_updated: "Issue done ratios not updated." |
162 | 162 |
error_workflow_copy_source: 'Please select a source tracker or role' |
163 | 163 |
error_workflow_copy_target: 'Please select target tracker(s) and role(s)' |
164 |
error_update_due_date_fields_required: Start date and estimated time are required in order to update due date based on estimated hours. |
|
164 | 165 |
|
165 | 166 |
warning_attachments_not_saved: "{{count}} file(s) could not be saved." |
166 | 167 |
|
... | ... | |
272 | 273 |
field_content: Content |
273 | 274 |
field_group_by: Group results by |
274 | 275 |
field_sharing: Sharing |
276 |
field_update_due_date_based_on_estimated_hours: Update Due Date Based On Estimated Hours |
|
275 | 277 |
|
276 | 278 |
setting_app_title: Application title |
277 | 279 |
setting_app_subtitle: Application subtitle |
... | ... | |
323 | 325 |
setting_issue_done_ratio_issue_field: Use the issue field |
324 | 326 |
setting_issue_done_ratio_issue_status: Use the issue status |
325 | 327 |
setting_start_of_week: Start calendars on |
328 |
setting_hours_in_work_day: Hours in work day |
|
329 |
setting_days_in_work_week: Days in work week |
|
326 | 330 |
|
327 | 331 |
permission_add_project: Create project |
328 | 332 |
permission_edit_project: Edit project |
config/settings.yml | ||
---|---|---|
118 | 118 |
default: 0 |
119 | 119 |
mail_handler_api_key: |
120 | 120 |
default: |
121 |
days_in_work_week: |
|
122 |
default: |
|
123 |
- monday |
|
124 |
- tuesday |
|
125 |
- wednesday |
|
126 |
- thursday |
|
127 |
- friday |
|
121 | 128 |
issue_list_default_columns: |
122 | 129 |
serialized: true |
123 | 130 |
default: |
... | ... | |
131 | 138 |
default: 1 |
132 | 139 |
issue_done_ratio: |
133 | 140 |
default: 'issue_field' |
141 |
hours_in_work_day: |
|
142 |
default: 8 |
|
134 | 143 |
default_projects_public: |
135 | 144 |
default: 1 |
136 | 145 |
default_projects_modules: |