Files
redmine-budget-plugin/app/controllers/deliverables_controller.rb

172 lines
5.5 KiB
Ruby

class DeliverablesController < ApplicationController
unloadable
layout 'base'
before_filter :find_project, :authorize, :get_settings
helper :sort
include SortHelper
# Main deliverable list
def index
sort_init "#{Deliverable.table_name}.id", "desc"
sort_update 'id' => "#{Deliverable.table_name}.id"
@deliverable_count = Deliverable.count(:conditions => { :project_id => @project.id})
@deliverable_pages = Paginator.new self, @deliverable_count, per_page_option, params['page']
@deliverables = Deliverable.find(:all,
{
:conditions => { :project_id => @project.id},
:limit => per_page_option,
:offset => @deliverable_pages.current.offset
}.merge(sort_order)
)
@deliverables = sort_if_needed @deliverables
@deliverable = Deliverable.new
@budget = Budget.new(@project.id)
@display_form = params[:new].present?
respond_to do |format|
format.html { render :action => 'index', :layout => !request.xhr? }
end
end
# Action to preview the Deliverable description
def preview
@text = params[:deliverable][:description]
render :partial => 'common/preview'
end
# Saves a new Deliverable
def create
if params[:deliverable][:type] == FixedDeliverable.name
@deliverable = FixedDeliverable.new(params[:deliverable])
elsif params[:deliverable][:type] == HourlyDeliverable.name
@deliverable = HourlyDeliverable.new(params[:deliverable])
else
@deliverable = Deliverable.new(params[:deliverable])
end
@deliverable.project = @project
@budget = Budget.new(@project.id)
respond_to do |format|
if @deliverable.save
@flash = l(:notice_successful_create)
format.html { redirect_to :action => 'index' }
format.js { render :action => 'create.js.rjs'}
else
format.js { render :action => 'create_error.js.rjs'}
end
end
end
# Builds the edit form for the Deliverable
def edit
@deliverable = Deliverable.find_by_id_and_project_id(params[:deliverable_id], params[:id])
end
# Updates an existing Deliverable, optionally changing it's type
def update
@deliverable = Deliverable.find(params[:deliverable_id])
if params[:deliverable][:type] != @deliverable.class
@deliverable = @deliverable.change_type(params[:deliverable][:type])
end
respond_to do |format|
if @deliverable.update_attributes(params[:deliverable])
@flash = l(:notice_successful_create)
format.html { redirect_to :action => 'index', :id => @project.id }
else
format.html { render :action => 'edit', :id => @project.id}
end
end
end
# Removes the Deliverable
def destroy
@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)
@deliverable.destroy
flash[:notice] = l(:notice_successful_delete)
redirect_to :action => 'index', :id => @project.id
end
# Create a query in the session and redirects to the issue list with that query
def issues
@query = Query.new(:name => "_")
@query.project = @project
unless params[:deliverable_id] == 'none'
@query.add_filter("deliverable_id", '=', [params[:deliverable_id]])
else
@query.add_filter("deliverable_id", '!*', ['']) # None
@query.add_filter("status_id", '*', ['']) # All statuses
end
session[:query] = {:project_id => @query.project_id, :filters => @query.filters}
redirect_to :controller => 'issues', :action => 'index', :project_id => @project.id
end
# Assigns issues to the Deliverable based on their Version
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])
end
def get_settings
@settings = Setting.plugin_budget_plugin
end
# Sorting orders
def sort_order
if session[@sort_name] && %w(score spent progress labor_budget).include?(session[@sort_name][:key])
return { }
else
return { :order => sort_clause }
end
end
# Sort +deliverables+ manually using the virtual fields
def sort_if_needed(deliverables)
if session[@sort_name] && %w(score spent progress labor_budget).include?(session[@sort_name][:key])
case session[@sort_name][:key]
when "score":
sorted = deliverables.sort {|a,b| a.score <=> b.score}
when "spent":
sorted = deliverables.sort {|a,b| a.spent <=> b.spent}
when "progress":
sorted = deliverables.sort {|a,b| a.progress <=> b.progress}
when "labor_budget":
sorted = deliverables.sort {|a,b| a.labor_budget <=> b.labor_budget}
end
return sorted if session[@sort_name][:order] == 'asc'
return sorted.reverse! if session[@sort_name][:order] == 'desc'
else
return deliverables
end
end
end