diff app/controllers/versions_controller.rb @ 22:40f7cfd4df19

* Update to SVN trunk rev 4173
author Chris Cannam <chris.cannam@soundsoftware.ac.uk>
date Fri, 24 Sep 2010 14:06:04 +0100
parents cca12e1c1fd4
children 94944d00e43c
line wrap: on
line diff
--- a/app/controllers/versions_controller.rb	Wed Aug 25 16:30:24 2010 +0100
+++ b/app/controllers/versions_controller.rb	Fri Sep 24 14:06:04 2010 +0100
@@ -18,13 +18,37 @@
 class VersionsController < ApplicationController
   menu_item :roadmap
   model_object Version
-  before_filter :find_model_object, :except => [:new, :close_completed]
-  before_filter :find_project_from_association, :except => [:new, :close_completed]
-  before_filter :find_project, :only => [:new, :close_completed]
+  before_filter :find_model_object, :except => [:index, :new, :create, :close_completed]
+  before_filter :find_project_from_association, :except => [:index, :new, :create, :close_completed]
+  before_filter :find_project, :only => [:index, :new, :create, :close_completed]
   before_filter :authorize
 
   helper :custom_fields
   helper :projects
+
+  def index
+    @trackers = @project.trackers.find(:all, :order => 'position')
+    retrieve_selected_tracker_ids(@trackers, @trackers.select {|t| t.is_in_roadmap?})
+    @with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1')
+    project_ids = @with_subprojects ? @project.self_and_descendants.collect(&:id) : [@project.id]
+    
+    @versions = @project.shared_versions || []
+    @versions += @project.rolled_up_versions.visible if @with_subprojects
+    @versions = @versions.uniq.sort
+    @versions.reject! {|version| version.closed? || version.completed? } unless params[:completed]
+    
+    @issues_by_version = {}
+    unless @selected_tracker_ids.empty?
+      @versions.each do |version|
+        issues = version.fixed_issues.visible.find(:all,
+                                                   :include => [:project, :status, :tracker, :priority],
+                                                   :conditions => {:tracker_id => @selected_tracker_ids, :project_id => project_ids},
+                                                   :order => "#{Project.table_name}.lft, #{Tracker.table_name}.position, #{Issue.table_name}.id")
+        @issues_by_version[version] = issues
+      end
+    end
+    @versions.reject! {|version| !project_ids.include?(version.project_id) && @issues_by_version[version].blank?}
+  end
   
   def show
     @issues = @version.fixed_issues.visible.find(:all,
@@ -39,6 +63,17 @@
       attributes.delete('sharing') unless attributes.nil? || @version.allowed_sharings.include?(attributes['sharing'])
       @version.attributes = attributes
     end
+  end
+
+  def create
+    # TODO: refactor with code above in #new
+    @version = @project.versions.build
+    if params[:version]
+      attributes = params[:version].dup
+      attributes.delete('sharing') unless attributes.nil? || @version.allowed_sharings.include?(attributes['sharing'])
+      @version.attributes = attributes
+    end
+
     if request.post?
       if @version.save
         respond_to do |format|
@@ -55,7 +90,7 @@
         end
       else
         respond_to do |format|
-          format.html
+          format.html { render :action => 'new' }
           format.js do
             render(:update) {|page| page.alert(@version.errors.full_messages.join('\n')) }
           end
@@ -63,9 +98,12 @@
       end
     end
   end
+
+  def edit
+  end
   
-  def edit
-    if request.post? && params[:version]
+  def update
+    if request.put? && params[:version]
       attributes = params[:version].dup
       attributes.delete('sharing') unless @version.allowed_sharings.include?(attributes['sharing'])
       if @version.update_attributes(attributes)
@@ -76,7 +114,7 @@
   end
   
   def close_completed
-    if request.post?
+    if request.put?
       @project.close_completed_versions
     end
     redirect_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project
@@ -105,4 +143,13 @@
   rescue ActiveRecord::RecordNotFound
     render_404
   end
+
+  def retrieve_selected_tracker_ids(selectable_trackers, default_trackers=nil)
+    if ids = params[:tracker_ids]
+      @selected_tracker_ids = (ids.is_a? Array) ? ids.collect { |id| id.to_i.to_s } : ids.split('/').collect { |id| id.to_i.to_s }
+    else
+      @selected_tracker_ids = (default_trackers || selectable_trackers).collect {|t| t.id.to_s }
+    end
+  end
+
 end