To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Tag: | Revision:

root / app / controllers / versions_controller.rb @ 1360:45dbcd39b9e9

History | View | Annotate | Download (6.25 KB)

1
# Redmine - project management software
2
# Copyright (C) 2006-2012  Jean-Philippe Lang
3
#
4
# This program is free software; you can redistribute it and/or
5
# modify it under the terms of the GNU General Public License
6
# as published by the Free Software Foundation; either version 2
7
# of the License, or (at your option) any later version.
8
#
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
# GNU General Public License for more details.
13
#
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
16
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
17

    
18
class VersionsController < ApplicationController
19
  menu_item :roadmap
20
  model_object Version
21
  before_filter :find_model_object, :except => [:index, :new, :create, :close_completed]
22
  before_filter :find_project_from_association, :except => [:index, :new, :create, :close_completed]
23
  before_filter :find_project_by_project_id, :only => [:index, :new, :create, :close_completed]
24
  before_filter :authorize
25

    
26
  accept_api_auth :index, :show, :create, :update, :destroy
27

    
28
  helper :custom_fields
29
  helper :projects
30

    
31
  def index
32
    respond_to do |format|
33
      format.html {
34
        @trackers = @project.trackers.find(:all, :order => 'position')
35
        retrieve_selected_tracker_ids(@trackers, @trackers.select {|t| t.is_in_roadmap?})
36
        @with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1')
37
        project_ids = @with_subprojects ? @project.self_and_descendants.collect(&:id) : [@project.id]
38

    
39
        @versions = @project.shared_versions || []
40
        @versions += @project.rolled_up_versions.visible if @with_subprojects
41
        @versions = @versions.uniq.sort
42
        unless params[:completed]
43
          @completed_versions = @versions.select {|version| version.closed? || version.completed? }
44
          @versions -= @completed_versions
45
        end
46

    
47
        @issues_by_version = {}
48
        if @selected_tracker_ids.any? && @versions.any?
49
          issues = Issue.visible.all(
50
            :include => [:project, :status, :tracker, :priority, :fixed_version],
51
            :conditions => {:tracker_id => @selected_tracker_ids, :project_id => project_ids, :fixed_version_id => @versions.map(&:id)},
52
            :order => "#{Project.table_name}.lft, #{Tracker.table_name}.position, #{Issue.table_name}.id"
53
          )
54
          @issues_by_version = issues.group_by(&:fixed_version)
55
        end
56
        @versions.reject! {|version| !project_ids.include?(version.project_id) && @issues_by_version[version].blank?}
57
      }
58
      format.api {
59
        @versions = @project.shared_versions.all
60
      }
61
    end
62
  end
63

    
64
  def show
65
    respond_to do |format|
66
      format.html {
67
        @issues = @version.fixed_issues.visible.find(:all,
68
          :include => [:status, :tracker, :priority],
69
          :order => "#{Tracker.table_name}.position, #{Issue.table_name}.id")
70
      }
71
      format.api
72
    end
73
  end
74

    
75
  def new
76
    @version = @project.versions.build
77
    @version.safe_attributes = params[:version]
78

    
79
    respond_to do |format|
80
      format.html
81
      format.js
82
    end
83
  end
84

    
85
  def create
86
    @version = @project.versions.build
87
    if params[:version]
88
      attributes = params[:version].dup
89
      attributes.delete('sharing') unless attributes.nil? || @version.allowed_sharings.include?(attributes['sharing'])
90
      @version.safe_attributes = attributes
91
    end
92

    
93
    if request.post?
94
      if @version.save
95
        respond_to do |format|
96
          format.html do
97
            flash[:notice] = l(:notice_successful_create)
98
            redirect_back_or_default :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project
99
          end
100
          format.js
101
          format.api do
102
            render :action => 'show', :status => :created, :location => version_url(@version)
103
          end
104
        end
105
      else
106
        respond_to do |format|
107
          format.html { render :action => 'new' }
108
          format.js   { render :action => 'new' }
109
          format.api  { render_validation_errors(@version) }
110
        end
111
      end
112
    end
113
  end
114

    
115
  def edit
116
  end
117

    
118
  def update
119
    if request.put? && params[:version]
120
      attributes = params[:version].dup
121
      attributes.delete('sharing') unless @version.allowed_sharings.include?(attributes['sharing'])
122
      @version.safe_attributes = attributes
123
      if @version.save
124
        respond_to do |format|
125
          format.html {
126
            flash[:notice] = l(:notice_successful_update)
127
            redirect_back_or_default :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project
128
          }
129
          format.api  { render_api_ok }
130
        end
131
      else
132
        respond_to do |format|
133
          format.html { render :action => 'edit' }
134
          format.api  { render_validation_errors(@version) }
135
        end
136
      end
137
    end
138
  end
139

    
140
  def close_completed
141
    if request.put?
142
      @project.close_completed_versions
143
    end
144
    redirect_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project
145
  end
146

    
147
  def destroy
148
    if @version.fixed_issues.empty?
149
      @version.destroy
150
      respond_to do |format|
151
        format.html { redirect_back_or_default :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project }
152
        format.api  { render_api_ok }
153
      end
154
    else
155
      respond_to do |format|
156
        format.html {
157
          flash[:error] = l(:notice_unable_delete_version)
158
          redirect_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project
159
        }
160
        format.api  { head :unprocessable_entity }
161
      end
162
    end
163
  end
164

    
165
  def status_by
166
    respond_to do |format|
167
      format.html { render :action => 'show' }
168
      format.js
169
    end
170
  end
171

    
172
  private
173

    
174
  def retrieve_selected_tracker_ids(selectable_trackers, default_trackers=nil)
175
    if ids = params[:tracker_ids]
176
      @selected_tracker_ids = (ids.is_a? Array) ? ids.collect { |id| id.to_i.to_s } : ids.split('/').collect { |id| id.to_i.to_s }
177
    else
178
      @selected_tracker_ids = (default_trackers || selectable_trackers).collect {|t| t.id.to_s }
179
    end
180
  end
181
end