172 lines
5.4 KiB
Ruby
172 lines
5.4 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? || @deliverables.empty?
|
|
|
|
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
|