diff --git a/app/controllers/deliverables_controller.rb b/app/controllers/deliverables_controller.rb index 27ae40f..bb0d516 100644 --- a/app/controllers/deliverables_controller.rb +++ b/app/controllers/deliverables_controller.rb @@ -94,6 +94,18 @@ class DeliverablesController < ApplicationController redirect_to :controller => 'issues', :action => 'index', :project_id => @project.id end + def bulk_assign_issues + @deliverable = Deliverable.find_by_id_and_project_id(params[:deliverable_id], @project.id) + + render_404 and return unless @deliverable + render_403 and return unless @deliverable.editable_by?(User.current) + + number_updated = @deliverable.assign_issues_by_version(params[:version][:id]) + + flash[:notice] = l(:message_updated_issues, number_updated) + redirect_to :action => 'index', :id => @project.id + end + private def find_project @project = Project.find(params[:id]) diff --git a/app/models/deliverable.rb b/app/models/deliverable.rb index e3e0fd2..b0fffb7 100644 --- a/app/models/deliverable.rb +++ b/app/models/deliverable.rb @@ -5,6 +5,17 @@ class Deliverable < ActiveRecord::Base belongs_to :project has_many :issues + def assign_issues_by_version(version_id) + version = Version.find_by_id(version_id) + return 0 if version.nil? || version.fixed_issues.blank? + + version.fixed_issues.each do |issue| + issue.update_attribute(:deliverable_id, self.id) + end + + return version.fixed_issues.size + end + def score return self.progress - self.budget_ratio end diff --git a/app/views/deliverables/_deliverable.html.erb b/app/views/deliverables/_deliverable.html.erb index 6c0be4a..0f82c31 100644 --- a/app/views/deliverables/_deliverable.html.erb +++ b/app/views/deliverables/_deliverable.html.erb @@ -25,10 +25,15 @@ "", :colspan => 4) %> - <%= content_tag( - :td, - content_tag(:p,link_to("Assigned Issues", :action => 'issues', :id => @project.id, :deliverable_id => deliverable.id)) + - content_tag(:p,link_to("Edit", :action => 'edit', :id => @project.id, :deliverable_id => deliverable.id)) + - content_tag(:p,link_to("Delete", { :action => 'destroy', :id => @project.id, :deliverable_id => deliverable.id}, :confirm => l(:text_are_you_sure))), - :colspan => 4) %> + + <%= content_tag(:p,link_to("Assigned Issues", :action => 'issues', :id => @project.id, :deliverable_id => deliverable.id)) -%> + <%= content_tag(:p,link_to("Edit", :action => 'edit', :id => @project.id, :deliverable_id => deliverable.id)) -%> + <%= content_tag(:p,link_to("Delete", { :action => 'destroy', :id => @project.id, :deliverable_id => deliverable.id}, :confirm => l(:text_are_you_sure))) -%> +

+ <%= form_tag(:action => 'bulk_assign_issues', :id => @project.id, :deliverable_id => deliverable.id) %> + <%= select("version", "id", @project.versions.sort.collect {|v| [v.name, v.id ] }, { :include_blank => true }) %> + <%= submit_tag(l(:button_change)) %> + <% %> +

+ diff --git a/init.rb b/init.rb index f5c7968..bb24f7c 100644 --- a/init.rb +++ b/init.rb @@ -24,7 +24,7 @@ Redmine::Plugin.register :budget_plugin do project_module :budget_module do permission :view_budget, { :deliverables => [:index, :issues]} - permission :manage_budget, { :deliverables => [:new, :edit, :create, :update, :destroy, :preview]} + permission :manage_budget, { :deliverables => [:new, :edit, :create, :update, :destroy, :preview, :bulk_assign_issues]} end menu :project_menu, :budget, :controller => "deliverables", :action => 'index' diff --git a/lang/en.yml b/lang/en.yml index 9ef04f4..e7fb58c 100644 --- a/lang/en.yml +++ b/lang/en.yml @@ -10,3 +10,4 @@ field_client_signoff: Client Signoff field_deliverable: Deliverable field_deliverable_subject: Deliverable label_member_rate: Rate ($) +message_updated_issues: Updated %d issues