##// END OF EJS Templates
Status can now be updated when bulk editing issues....
Status can now be updated when bulk editing issues. Workflow permissions are applied as when changing the status of a single issue. The issue is not saved (and an error is displayed) if the status transition is not allowed for the user. git-svn-id: http://redmine.rubyforge.org/svn/trunk@831 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r820:65e05d822acd
r820:65e05d822acd
Show More
projects_controller.rb
676 lines | 28.8 KiB | text/x-ruby | RubyLexer
/ app / controllers / projects_controller.rb
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 # redMine - project management software
# Copyright (C) 2006-2007 Jean-Philippe Lang
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
require 'csv'
class ProjectsController < ApplicationController
layout 'base'
Jean-Philippe Lang
Added the ability to archive projects:...
r546 before_filter :find_project, :except => [ :index, :list, :add ]
before_filter :authorize, :except => [ :index, :list, :add, :archive, :unarchive, :destroy ]
before_filter :require_admin, :only => [ :add, :archive, :unarchive, :destroy ]
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 accept_key_auth :activity, :calendar
Jean-Philippe Lang
Added fragment caching for calendar and gantt views...
r512
Jean-Philippe Lang
Added the ability to archive projects:...
r546 cache_sweeper :project_sweeper, :only => [ :add, :edit, :archive, :unarchive, :destroy ]
Jean-Philippe Lang
Added fragment caching for calendar and gantt views...
r512 cache_sweeper :issue_sweeper, :only => [ :add_issue ]
Jean-Philippe Lang
Fixed: calendar and gantt not updated when adding/editing/deleting a project version....
r659 cache_sweeper :version_sweeper, :only => [ :add_version ]
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330
helper :sort
include SortHelper
helper :custom_fields
include CustomFieldsHelper
helper :ifpdf
include IfpdfHelper
Jean-Philippe Lang
Performance improvement on calendar and gantt (about 45% on gantt for large number of issues)....
r783 helper :issues
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 helper IssuesHelper
helper :queries
include QueriesHelper
Jean-Philippe Lang
Added basic support for CVS and Mercurial SCMs....
r556 helper :repositories
include RepositoriesHelper
Jean-Philippe Lang
Gantt chart can now be exported to a graphic file (png)....
r660 include ProjectsHelper
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330
Jean-Philippe Lang
git-svn-id: http://redmine.rubyforge.org/svn/trunk@6 e93f8b46-1217-0410-a6f0-8f06a7374b81
r4 def index
list
Jean-Philippe Lang
ajaxified paginators...
r31 render :action => 'list' unless request.xhr?
Jean-Philippe Lang
git-svn-id: http://redmine.rubyforge.org/svn/trunk@6 e93f8b46-1217-0410-a6f0-8f06a7374b81
r4 end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330
Jean-Philippe Lang
Main project list now displays root projects with their subprojects....
r718 # Lists visible projects
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 def list
Jean-Philippe Lang
Main project list now displays root projects with their subprojects....
r718 projects = Project.find :all,
:conditions => Project.visible_by(logged_in_user),
:include => :parent
@project_tree = projects.group_by {|p| p.parent || p}
@project_tree.each_key {|p| @project_tree[p] -= [p]}
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
Jean-Philippe Lang
Main project list now displays root projects with their subprojects....
r718
Jean-Philippe Lang
Initial commit...
r2 # Add a new project
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 def add
@custom_fields = IssueCustomField.find(:all)
Jean-Philippe Lang
Fixed: "subproject of" list should not show archived projects....
r667 @root_projects = Project.find(:all, :conditions => "parent_id IS NULL AND status = #{Project::STATUS_ACTIVE}")
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 @project = Project.new(params[:project])
Jean-Philippe Lang
Project modules are checked (default) when creating a project....
r719 @project.enabled_module_names = Redmine::AccessControl.available_project_modules
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 if request.get?
@custom_values = ProjectCustomField.find(:all).collect { |x| CustomValue.new(:custom_field => x, :customized => @project) }
else
@project.custom_fields = CustomField.find(params[:custom_field_ids]) if params[:custom_field_ids]
Jean-Philippe Lang
Fix: error when posting to projects/add or users/add with no custom_fields parameter....
r664 @custom_values = ProjectCustomField.find(:all).collect { |x| CustomValue.new(:custom_field => x, :customized => @project, :value => (params[:custom_fields] ? params["custom_fields"][x.id.to_s] : nil)) }
Jean-Philippe Lang
Added project module concept....
r714 @project.custom_values = @custom_values
Jean-Philippe Lang
v0.2.0...
r5 if @project.save
Jean-Philippe Lang
Added project module concept....
r714 @project.enabled_module_names = params[:enabled_modules]
Jean-Philippe Lang
notice messages translation...
r15 flash[:notice] = l(:notice_successful_create)
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 redirect_to :controller => 'admin', :action => 'projects'
end
end
end
# Show @project
def show
@custom_values = @project.custom_values.find(:all, :include => :custom_field)
Jean-Philippe Lang
Various changes on views. On project summary, members are now grouped by role and subprojects are listed inline....
r431 @members_by_role = @project.members.find(:all, :include => [:user, :role], :order => 'position').group_by {|m| m.role}
Jean-Philippe Lang
Added the ability to archive projects:...
r546 @subprojects = @project.active_children
Jean-Philippe Lang
fixed #9308 table_name pre/suffix support...
r334 @news = @project.news.find(:all, :limit => 5, :include => [ :author, :project ], :order => "#{News.table_name}.created_on DESC")
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 @trackers = Tracker.find(:all, :order => 'position')
Jean-Philippe Lang
fixed #9308 table_name pre/suffix support...
r334 @open_issues_by_tracker = Issue.count(:group => :tracker, :joins => "INNER JOIN #{IssueStatus.table_name} ON #{IssueStatus.table_name}.id = #{Issue.table_name}.status_id", :conditions => ["project_id=? and #{IssueStatus.table_name}.is_closed=?", @project.id, false])
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 @total_issues_by_tracker = Issue.count(:group => :tracker, :conditions => ["project_id=?", @project.id])
Jean-Philippe Lang
Application layout refactored....
r736 @total_hours = @project.time_entries.sum(:hours)
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 @key = User.current.rss_key
Jean-Philippe Lang
v0.2.0...
r5 end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330
def settings
Jean-Philippe Lang
Fixed: "subproject of" list should not show archived projects....
r667 @root_projects = Project::find(:all, :conditions => ["parent_id IS NULL AND status = #{Project::STATUS_ACTIVE} AND id <> ?", @project.id])
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 @custom_fields = IssueCustomField.find(:all)
@issue_category ||= IssueCategory.new
@member ||= @project.members.new
@custom_values ||= ProjectCustomField.find(:all).collect { |x| @project.custom_values.find_by_custom_field_id(x.id) || CustomValue.new(:custom_field => x) }
Jean-Philippe Lang
Added project module concept....
r714 @repository ||= @project.repository
@wiki ||= @project.wiki
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
# Edit @project
def edit
if request.post?
@project.custom_fields = IssueCustomField.find(params[:custom_field_ids]) if params[:custom_field_ids]
if params[:custom_fields]
@custom_values = ProjectCustomField.find(:all).collect { |x| CustomValue.new(:custom_field => x, :customized => @project, :value => params["custom_fields"][x.id.to_s]) }
@project.custom_values = @custom_values
end
@project.attributes = params[:project]
Jean-Philippe Lang
svn browser merged in trunk...
r103 if @project.save
Jean-Philippe Lang
notice messages translation...
r15 flash[:notice] = l(:notice_successful_update)
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 redirect_to :action => 'settings', :id => @project
else
settings
render :action => 'settings'
end
Jean-Philippe Lang
v0.2.0...
r5 end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
Jean-Philippe Lang
Added project module concept....
r714
def modules
@project.enabled_module_names = params[:enabled_modules]
redirect_to :action => 'settings', :id => @project, :tab => 'modules'
end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330
Jean-Philippe Lang
Added the ability to archive projects:...
r546 def archive
@project.archive if request.post? && @project.active?
redirect_to :controller => 'admin', :action => 'projects'
end
def unarchive
@project.unarchive if request.post? && !@project.active?
redirect_to :controller => 'admin', :action => 'projects'
end
Jean-Philippe Lang
0.3 unstable...
r10 # Delete @project
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 def destroy
Jean-Philippe Lang
Added the ability to archive projects:...
r546 @project_to_destroy = @project
Jean-Philippe Lang
Initial commit...
r2 if request.post? and params[:confirm]
Jean-Philippe Lang
Added the ability to archive projects:...
r546 @project_to_destroy.destroy
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 redirect_to :controller => 'admin', :action => 'projects'
end
Jean-Philippe Lang
Added the ability to archive projects:...
r546 # hide project in layout
@project = nil
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
# Add a new issue category to @project
def add_issue_category
Jean-Philippe Lang
Each category can now be associated to a user, so that new issues in that category are automatically assigned to that user....
r574 @category = @project.issue_categories.build(params[:category])
if request.post? and @category.save
Jean-Philippe Lang
Added a link to add a new category when creating or editing an issue....
r642 respond_to do |format|
format.html do
flash[:notice] = l(:notice_successful_create)
redirect_to :action => 'settings', :tab => 'categories', :id => @project
end
format.js do
# IE doesn't support the replace_html rjs method for select box options
render(:update) {|page| page.replace "issue_category_id",
content_tag('select', '<option></option>' + options_from_collection_for_select(@project.issue_categories, 'id', 'name', @category.id), :id => 'issue_category_id', :name => 'issue[category_id]')
}
end
end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
Jean-Philippe Lang
Each category can now be associated to a user, so that new issues in that category are automatically assigned to that user....
r574 end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330
# Add a new version to @project
def add_version
@version = @project.versions.build(params[:version])
if request.post? and @version.save
flash[:notice] = l(:notice_successful_create)
redirect_to :action => 'settings', :tab => 'versions', :id => @project
end
end
# Add a new document to @project
def add_document
@categories = Enumeration::get_values('DCAT')
@document = @project.documents.build(params[:document])
if request.post? and @document.save
# Save the attachments
params[:attachments].each { |a|
Attachment.create(:container => @document, :file => a, :author => logged_in_user) unless a.size == 0
} if params[:attachments] and params[:attachments].is_a? Array
flash[:notice] = l(:notice_successful_create)
Jean-Philippe Lang
Mail notification options restored (default is: issue_added and issue_updated)....
r717 Mailer.deliver_document_add(@document) if Setting.notified_events.include?('document_added')
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 redirect_to :action => 'list_documents', :id => @project
Jean-Philippe Lang
Initial commit...
r2 end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
Jean-Philippe Lang
0.3 unstable...
r10 # Show documents list of @project
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 def list_documents
@documents = @project.documents.find :all, :include => :category
end
# Add a new issue to @project
def add_issue
@tracker = Tracker.find(params[:tracker_id])
@priorities = Enumeration::get_values('IPRI')
Jean-Philippe Lang
Feature 9784 Set status when raising issue....
r404
default_status = IssueStatus.default
Jean-Philippe Lang
Added an error message when trying to create an issue with no default status defined....
r557 unless default_status
Jean-Philippe Lang
Applied the flash notices patch by Matt Jones (slightly edited)....
r597 flash.now[:error] = 'No default issue status defined. Please check your configuration.'
Jean-Philippe Lang
Added an error message when trying to create an issue with no default status defined....
r557 render :nothing => true, :layout => true
return
end
Jean-Philippe Lang
Fixed a regression (crash when an admin with no role on the project try to create an issue)...
r417 @issue = Issue.new(:project => @project, :tracker => @tracker)
@issue.status = default_status
Jean-Philippe Lang
Fixed: default status not showing in new issue...
r472 @allowed_statuses = ([default_status] + default_status.find_new_statuses_allowed_to(logged_in_user.role_for_project(@project), @issue.tracker))if logged_in_user
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 if request.get?
@issue.start_date = Date.today
@custom_values = @project.custom_fields_for_issues(@tracker).collect { |x| CustomValue.new(:custom_field => x, :customized => @issue) }
else
@issue.attributes = params[:issue]
Jean-Philippe Lang
Feature 9784 Set status when raising issue....
r404
requested_status = IssueStatus.find_by_id(params[:issue][:status_id])
@issue.status = (@allowed_statuses.include? requested_status) ? requested_status : default_status
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 @issue.author_id = self.logged_in_user.id if self.logged_in_user
# Multiple file upload
@attachments = []
params[:attachments].each { |a|
@attachments << Attachment.new(:container => @issue, :file => a, :author => logged_in_user) unless a.size == 0
} if params[:attachments] and params[:attachments].is_a? Array
@custom_values = @project.custom_fields_for_issues(@tracker).collect { |x| CustomValue.new(:custom_field => x, :customized => @issue, :value => params["custom_fields"][x.id.to_s]) }
@issue.custom_values = @custom_values
if @issue.save
@attachments.each(&:save)
flash[:notice] = l(:notice_successful_create)
Jean-Philippe Lang
Mail notification options restored (default is: issue_added and issue_updated)....
r717 Mailer.deliver_issue_add(@issue) if Setting.notified_events.include?('issue_added')
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 redirect_to :action => 'list_issues', :id => @project
end
end
end
# Show filtered/sorted issues list of @project
def list_issues
Jean-Philippe Lang
fixed #9308 table_name pre/suffix support...
r334 sort_init "#{Issue.table_name}.id", "desc"
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 sort_update
retrieve_query
@results_per_page_options = [ 15, 25, 50, 100 ]
if params[:per_page] and @results_per_page_options.include? params[:per_page].to_i
@results_per_page = params[:per_page].to_i
session[:results_per_page] = @results_per_page
else
@results_per_page = session[:results_per_page] || 25
end
if @query.valid?
Jean-Philippe Lang
Fixed: queries with multiple custom fields return no result....
r662 @issue_count = Issue.count(:include => [:status, :project], :conditions => @query.statement)
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 @issue_pages = Paginator.new self, @issue_count, @results_per_page, params['page']
@issues = Issue.find :all, :order => sort_clause,
Jean-Philippe Lang
Custom query columns: checkboxes replaced by two selects that let the user specify columns order....
r773 :include => [ :assigned_to, :status, :tracker, :project, :priority, :category ],
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 :conditions => @query.statement,
:limit => @issue_pages.items_per_page,
:offset => @issue_pages.current.offset
Jean-Philippe Lang
Added per user custom queries....
r563 end
Jean-Philippe Lang
Application layout refactored....
r736
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 render :layout => false if request.xhr?
end
# Export filtered/sorted issues list to CSV
def export_issues_csv
Jean-Philippe Lang
fixed #9308 table_name pre/suffix support...
r334 sort_init "#{Issue.table_name}.id", "desc"
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 sort_update
retrieve_query
render :action => 'list_issues' and return unless @query.valid?
@issues = Issue.find :all, :order => sort_clause,
Jean-Philippe Lang
Subproject name added in csv and pdf exports....
r493 :include => [ :assigned_to, :author, :status, :tracker, :priority, :project, {:custom_values => :custom_field} ],
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 :conditions => @query.statement,
Jean-Philippe Lang
Fixed: error on csv/pdf export and feeds (oracle)...
r553 :limit => Setting.issues_export_limit.to_i
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330
ic = Iconv.new(l(:general_csv_encoding), 'UTF-8')
export = StringIO.new
CSV::Writer.generate(export, l(:general_csv_separator)) do |csv|
# csv header fields
headers = [ "#", l(:field_status),
Jean-Philippe Lang
Subproject name added in csv and pdf exports....
r493 l(:field_project),
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 l(:field_tracker),
l(:field_priority),
l(:field_subject),
Jean-Philippe Lang
"Author" column replaced by "Assigned to" in issue list....
r419 l(:field_assigned_to),
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 l(:field_author),
l(:field_start_date),
l(:field_due_date),
l(:field_done_ratio),
l(:field_created_on),
l(:field_updated_on)
]
for custom_field in @project.all_custom_fields
headers << custom_field.name
end
Jean-Philippe Lang
Fixed Iconv::IllegalSequence errors in csv exports...
r567 csv << headers.collect {|c| begin; ic.iconv(c.to_s); rescue; c.to_s; end }
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 # csv lines
@issues.each do |issue|
fields = [issue.id, issue.status.name,
Jean-Philippe Lang
Subproject name added in csv and pdf exports....
r493 issue.project.name,
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 issue.tracker.name,
issue.priority.name,
Jean-Philippe Lang
Subproject name added in csv and pdf exports....
r493 issue.subject,
Jean-Philippe Lang
"Author" column replaced by "Assigned to" in issue list....
r419 (issue.assigned_to ? issue.assigned_to.name : ""),
issue.author.name,
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 issue.start_date ? l_date(issue.start_date) : nil,
issue.due_date ? l_date(issue.due_date) : nil,
issue.done_ratio,
l_datetime(issue.created_on),
l_datetime(issue.updated_on)
]
for custom_field in @project.all_custom_fields
fields << (show_value issue.custom_value_for(custom_field))
end
Jean-Philippe Lang
Fixed Iconv::IllegalSequence errors in csv exports...
r567 csv << fields.collect {|c| begin; ic.iconv(c.to_s); rescue; c.to_s; end }
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
end
export.rewind
send_data(export.read, :type => 'text/csv; header=present', :filename => 'export.csv')
end
# Export filtered/sorted issues to PDF
def export_issues_pdf
Jean-Philippe Lang
fixed #9308 table_name pre/suffix support...
r334 sort_init "#{Issue.table_name}.id", "desc"
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 sort_update
retrieve_query
render :action => 'list_issues' and return unless @query.valid?
@issues = Issue.find :all, :order => sort_clause,
Jean-Philippe Lang
Fixed: queries with multiple custom fields return no result....
r662 :include => [ :author, :status, :tracker, :priority, :project ],
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 :conditions => @query.statement,
Jean-Philippe Lang
Fixed: error on csv/pdf export and feeds (oracle)...
r553 :limit => Setting.issues_export_limit.to_i
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330
@options_for_rfpdf ||= {}
@options_for_rfpdf[:file_name] = "export.pdf"
render :layout => false
end
Jean-Philippe Lang
Added 'Bulk edit' functionality....
r806
# Bulk edit issues
def bulk_edit_issues
if request.post?
Jean-Philippe Lang
Status can now be updated when bulk editing issues....
r820 status = IssueStatus.find_by_id(params[:status_id])
Jean-Philippe Lang
Added 'Bulk edit' functionality....
r806 priority = Enumeration.find_by_id(params[:priority_id])
assigned_to = User.find_by_id(params[:assigned_to_id])
Jean-Philippe Lang
Fixed: Bulk edit doesn't change the category or fixed version properties....
r809 category = @project.issue_categories.find_by_id(params[:category_id])
fixed_version = @project.versions.find_by_id(params[:fixed_version_id])
Jean-Philippe Lang
Added 'Bulk edit' functionality....
r806 issues = @project.issues.find_all_by_id(params[:issue_ids])
Jean-Philippe Lang
Status can now be updated when bulk editing issues....
r820 unsaved_issue_ids = []
Jean-Philippe Lang
Added 'Bulk edit' functionality....
r806 issues.each do |issue|
Jean-Philippe Lang
Bulk editing:...
r815 journal = issue.init_journal(User.current, params[:notes])
Jean-Philippe Lang
Added 'Bulk edit' functionality....
r806 issue.priority = priority if priority
issue.assigned_to = assigned_to if assigned_to
Jean-Philippe Lang
Fixed: Bulk edit doesn't change the category or fixed version properties....
r809 issue.category = category if category
issue.fixed_version = fixed_version if fixed_version
Jean-Philippe Lang
Added 'Bulk edit' functionality....
r806 issue.start_date = params[:start_date] unless params[:start_date].blank?
issue.due_date = params[:due_date] unless params[:due_date].blank?
issue.done_ratio = params[:done_ratio] unless params[:done_ratio].blank?
Jean-Philippe Lang
Status can now be updated when bulk editing issues....
r820 # Don't save any change to the issue if the user is not authorized to apply the requested status
if (status.nil? || (issue.status.new_status_allowed_to?(status, current_role, issue.tracker) && issue.status = status)) && issue.save
Jean-Philippe Lang
Bulk editing:...
r815 # Send notification for each issue (if changed)
Mailer.deliver_issue_edit(journal) if journal.details.any? && Setting.notified_events.include?('issue_updated')
else
Jean-Philippe Lang
Status can now be updated when bulk editing issues....
r820 # Keep unsaved issue ids to display them in flash error
Jean-Philippe Lang
Bulk editing:...
r815 unsaved_issue_ids << issue.id
end
Jean-Philippe Lang
Added 'Bulk edit' functionality....
r806 end
if unsaved_issue_ids.empty?
flash[:notice] = l(:notice_successful_update) unless issues.empty?
else
flash[:error] = l(:notice_failed_to_save_issues, unsaved_issue_ids.size, issues.size, '#' + unsaved_issue_ids.join(', #'))
end
redirect_to :action => 'list_issues', :id => @project
return
end
Jean-Philippe Lang
Status can now be updated when bulk editing issues....
r820 if current_role && User.current.allowed_to?(:change_issue_status, @project)
# Find potential statuses the user could be allowed to switch issues to
@available_statuses = Workflow.find(:all, :include => :new_status,
:conditions => {:role_id => current_role.id}).collect(&:new_status).compact.uniq
end
Jean-Philippe Lang
Added 'Bulk edit' functionality....
r806 render :update do |page|
page.hide 'query_form'
page.replace_html 'bulk-edit', :partial => 'issues/bulk_edit_form'
end
end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330
def move_issues
@issues = @project.issues.find(params[:issue_ids]) if params[:issue_ids]
redirect_to :action => 'list_issues', :id => @project and return unless @issues
@projects = []
# find projects to which the user is allowed to move the issue
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 User.current.memberships.each {|m| @projects << m.project if m.role.allowed_to?(:controller => 'projects', :action => 'move_issues')}
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 # issue can be moved to any tracker
@trackers = Tracker.find(:all)
if request.post? and params[:new_project_id] and params[:new_tracker_id]
Jean-Philippe Lang
Added the ability to move issues (to another project) without changing their trackers....
r676 new_project = Project.find_by_id(params[:new_project_id])
new_tracker = Tracker.find_by_id(params[:new_tracker_id])
@issues.each do |i|
if new_project && i.project_id != new_project.id
# issue is moved to another project
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 i.category = nil
i.fixed_version = nil
Jean-Philippe Lang
Issue relations first commit (not thoroughly tested). 4 kinds of relation are available:...
r503 # delete issue relations
i.relations_from.clear
i.relations_to.clear
Jean-Philippe Lang
Added the ability to move issues (to another project) without changing their trackers....
r676 i.project = new_project
end
if new_tracker
i.tracker = new_tracker
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
i.save
Jean-Philippe Lang
Added the ability to move issues (to another project) without changing their trackers....
r676 end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'list_issues', :id => @project
end
end
# Add a news to @project
def add_news
@news = News.new(:project => @project)
if request.post?
@news.attributes = params[:news]
@news.author_id = self.logged_in_user.id if self.logged_in_user
if @news.save
flash[:notice] = l(:notice_successful_create)
Jean-Philippe Lang
Mail notification options restored (default is: issue_added and issue_updated)....
r717 Mailer.deliver_news_added(@news) if Setting.notified_events.include?('news_added')
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 redirect_to :action => 'list_news', :id => @project
end
end
end
# Show news list of @project
def list_news
Jean-Philippe Lang
The news list now shows the full news contents....
r739 @news_pages, @newss = paginate :news, :per_page => 10, :conditions => ["project_id=?", @project.id], :include => :author, :order => "#{News.table_name}.created_on DESC"
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663
respond_to do |format|
format.html { render :layout => false if request.xhr? }
Jean-Philippe Lang
The news list now shows the full news contents....
r739 format.atom { render_feed(@newss, :title => "#{@project.name}: #{l(:label_news_plural)}") }
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
def add_file
if request.post?
@version = @project.versions.find_by_id(params[:version_id])
# Save the attachments
@attachments = []
params[:attachments].each { |file|
next unless file.size > 0
a = Attachment.create(:container => @version, :file => file, :author => logged_in_user)
@attachments << a unless a.new_record?
} if params[:attachments] and params[:attachments].is_a? Array
Jean-Philippe Lang
Mail notification options restored (default is: issue_added and issue_updated)....
r717 Mailer.deliver_attachments_add(@attachments) if !@attachments.empty? && Setting.notified_events.include?('file_added')
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 redirect_to :controller => 'projects', :action => 'list_files', :id => @project
end
Jean-Philippe Lang
Versions can now be created with no date....
r533 @versions = @project.versions.sort
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
def list_files
Jean-Philippe Lang
Versions can now be created with no date....
r533 @versions = @project.versions.sort
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
# Show changelog for @project
def changelog
@trackers = Tracker.find(:all, :conditions => ["is_in_chlog=?", true], :order => 'position')
Jean-Philippe Lang
Versions can now be created with no date....
r533 retrieve_selected_tracker_ids(@trackers)
@versions = @project.versions.sort
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
def roadmap
@trackers = Tracker.find(:all, :conditions => ["is_in_roadmap=?", true], :order => 'position')
Jean-Philippe Lang
Versions can now be created with no date....
r533 retrieve_selected_tracker_ids(@trackers)
Jean-Philippe Lang
Overdue versions (date reached and open issues > 0) are now always displayed on the roadmap....
r601 @versions = @project.versions.sort
@versions = @versions.select {|v| !v.completed? } unless params[:completed]
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
def activity
if params[:year] and params[:year].to_i > 1900
@year = params[:year].to_i
if params[:month] and params[:month].to_i > 0 and params[:month].to_i < 13
@month = params[:month].to_i
end
end
@year ||= Date.today.year
@month ||= Date.today.month
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 case params[:format]
Jean-Philippe Lang
Small fix in project activity feed....
r782 when 'atom'
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 # 30 last days
@date_from = Date.today - 30
@date_to = Date.today + 1
else
# current month
@date_from = Date.civil(@year, @month, 1)
@date_to = @date_from >> 1
end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330
Jean-Philippe Lang
Project activity view now only shows what the user is allowed to view....
r746 @event_types = %w(issues news files documents wiki_pages changesets)
@event_types.delete('wiki_pages') unless @project.wiki
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 @event_types.delete('changesets') unless @project.repository
Jean-Philippe Lang
Project activity view now only shows what the user is allowed to view....
r746 # only show what the user is allowed to view
@event_types = @event_types.select {|o| User.current.allowed_to?("view_#{o}".to_sym, @project)}
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 @scope = @event_types.select {|t| params["show_#{t}"]}
# default events if none is specified in parameters
Jean-Philippe Lang
Project activity view now only shows what the user is allowed to view....
r746 @scope = (@event_types - %w(wiki_pages))if @scope.empty?
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663
@events = []
if @scope.include?('issues')
@events += @project.issues.find(:all, :include => [:author, :tracker], :conditions => ["#{Issue.table_name}.created_on>=? and #{Issue.table_name}.created_on<=?", @date_from, @date_to] )
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 if @scope.include?('news')
@events += @project.news.find(:all, :conditions => ["#{News.table_name}.created_on>=? and #{News.table_name}.created_on<=?", @date_from, @date_to], :include => :author )
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
Jean-Philippe Lang
Project activity view now only shows what the user is allowed to view....
r746 if @scope.include?('files')
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 @events += Attachment.find(:all, :select => "#{Attachment.table_name}.*", :joins => "LEFT JOIN #{Version.table_name} ON #{Version.table_name}.id = #{Attachment.table_name}.container_id", :conditions => ["#{Attachment.table_name}.container_type='Version' and #{Version.table_name}.project_id=? and #{Attachment.table_name}.created_on>=? and #{Attachment.table_name}.created_on<=?", @project.id, @date_from, @date_to], :include => :author )
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 if @scope.include?('documents')
@events += @project.documents.find(:all, :conditions => ["#{Document.table_name}.created_on>=? and #{Document.table_name}.created_on<=?", @date_from, @date_to] )
@events += Attachment.find(:all, :select => "attachments.*", :joins => "LEFT JOIN #{Document.table_name} ON #{Document.table_name}.id = #{Attachment.table_name}.container_id", :conditions => ["#{Attachment.table_name}.container_type='Document' and #{Document.table_name}.project_id=? and #{Attachment.table_name}.created_on>=? and #{Attachment.table_name}.created_on<=?", @project.id, @date_from, @date_to], :include => :author )
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
Jean-Philippe Lang
Project activity view now only shows what the user is allowed to view....
r746 if @scope.include?('wiki_pages')
Jean-Philippe Lang
Fixed: 10342 Creation of Schema in Oracle...
r476 select = "#{WikiContent.versioned_table_name}.updated_on, #{WikiContent.versioned_table_name}.comments, " +
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 "#{WikiContent.versioned_table_name}.#{WikiContent.version_column}, #{WikiPage.table_name}.title, " +
"#{WikiContent.versioned_table_name}.page_id, #{WikiContent.versioned_table_name}.author_id, " +
"#{WikiContent.versioned_table_name}.id"
Jean-Philippe Lang
patch #9429 Display Wiki edits in activity log (Nick Read)...
r367 joins = "LEFT JOIN #{WikiPage.table_name} ON #{WikiPage.table_name}.id = #{WikiContent.versioned_table_name}.page_id " +
"LEFT JOIN #{Wiki.table_name} ON #{Wiki.table_name}.id = #{WikiPage.table_name}.wiki_id "
conditions = ["#{Wiki.table_name}.project_id = ? AND #{WikiContent.versioned_table_name}.updated_on BETWEEN ? AND ?",
@project.id, @date_from, @date_to]
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 @events += WikiContent.versioned_class.find(:all, :select => select, :joins => joins, :conditions => conditions)
Jean-Philippe Lang
patch #9429 Display Wiki edits in activity log (Nick Read)...
r367 end
Jean-Philippe Lang
Project activity view now only shows what the user is allowed to view....
r746 if @scope.include?('changesets')
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 @events += @project.repository.changesets.find(:all, :conditions => ["#{Changeset.table_name}.committed_on BETWEEN ? AND ?", @date_from, @date_to])
Jean-Philippe Lang
SVN commits are now stored in the database, and added to the activity view and the search engine....
r374 end
Jean-Philippe Lang
Merged 0.6 branch into trunk....
r663 @events_by_day = @events.group_by(&:event_date)
respond_to do |format|
format.html { render :layout => false if request.xhr? }
format.atom { render_feed(@events, :title => "#{@project.name}: #{l(:label_activity)}") }
end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
def calendar
Jean-Philippe Lang
Patch #9705 Tracker filtering on Main Calendar (Jeffrey Jones)...
r392 @trackers = Tracker.find(:all, :order => 'position')
retrieve_selected_tracker_ids(@trackers)
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 if params[:year] and params[:year].to_i > 1900
@year = params[:year].to_i
if params[:month] and params[:month].to_i > 0 and params[:month].to_i < 13
@month = params[:month].to_i
end
end
@year ||= Date.today.year
Jean-Philippe Lang
Calendar:...
r804 @month ||= Date.today.month
@calendar = Redmine::Helpers::Calendar.new(Date.civil(@year, @month, 1), current_language, :month)
Jean-Philippe Lang
Patch #9705 Tracker filtering on Main Calendar (Jeffrey Jones)...
r392
Jean-Philippe Lang
Calendar:...
r804 events = []
Jean-Philippe Lang
Added the ability to include subprojects issues on calendar & gantt (options box)...
r395 @project.issues_with_subprojects(params[:with_subprojects]) do
Jean-Philippe Lang
Calendar:...
r804 events += Issue.find(:all,
Jean-Philippe Lang
Subproject name displayed on issue list, calendar and gantt (only for issues that belong to a subproject)....
r481 :include => [:tracker, :status, :assigned_to, :priority, :project],
Jean-Philippe Lang
Calendar:...
r804 :conditions => ["((start_date BETWEEN ? AND ?) OR (due_date BETWEEN ? AND ?)) AND #{Issue.table_name}.tracker_id IN (#{@selected_tracker_ids.join(',')})", @calendar.startdt, @calendar.enddt, @calendar.startdt, @calendar.enddt]
Jean-Philippe Lang
Added the ability to include subprojects issues on calendar & gantt (options box)...
r395 ) unless @selected_tracker_ids.empty?
end
Jean-Philippe Lang
Calendar:...
r804 events += @project.versions.find(:all, :conditions => ["effective_date BETWEEN ? AND ?", @calendar.startdt, @calendar.enddt])
@calendar.events = events
Jean-Philippe Lang
Patch #9705 Tracker filtering on Main Calendar (Jeffrey Jones)...
r392
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 render :layout => false if request.xhr?
end
def gantt
Jean-Philippe Lang
Patch #9705 Tracker filtering on Main Calendar (Jeffrey Jones)...
r392 @trackers = Tracker.find(:all, :order => 'position')
retrieve_selected_tracker_ids(@trackers)
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 if params[:year] and params[:year].to_i >0
@year_from = params[:year].to_i
if params[:month] and params[:month].to_i >=1 and params[:month].to_i <= 12
@month_from = params[:month].to_i
else
@month_from = 1
end
else
Jean-Philippe Lang
Gantt chart:...
r818 @month_from ||= Date.today.month
@year_from ||= Date.today.year
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
Jean-Philippe Lang
Gantt chart:...
r818 zoom = (params[:zoom] || User.current.pref[:gantt_zoom]).to_i
@zoom = (zoom > 0 && zoom < 5) ? zoom : 2
months = (params[:months] || User.current.pref[:gantt_months]).to_i
@months = (months > 0 && months < 25) ? months : 6
# Save gantt paramters as user preference (zoom and months count)
if (User.current.logged? && (@zoom != User.current.pref[:gantt_zoom] || @months != User.current.pref[:gantt_months]))
User.current.pref[:gantt_zoom], User.current.pref[:gantt_months] = @zoom, @months
User.current.preference.save
end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330
@date_from = Date.civil(@year_from, @month_from, 1)
@date_to = (@date_from >> @months) - 1
Jean-Philippe Lang
Patch #9705 Tracker filtering on Main Calendar (Jeffrey Jones)...
r392
Jean-Philippe Lang
Added versions due dates on gantt chart....
r425 @events = []
Jean-Philippe Lang
Added the ability to include subprojects issues on calendar & gantt (options box)...
r395 @project.issues_with_subprojects(params[:with_subprojects]) do
Jean-Philippe Lang
Added versions due dates on gantt chart....
r425 @events += Issue.find(:all,
Jean-Philippe Lang
Added the ability to include subprojects issues on calendar & gantt (options box)...
r395 :order => "start_date, due_date",
Jean-Philippe Lang
Subproject name displayed on issue list, calendar and gantt (only for issues that belong to a subproject)....
r481 :include => [:tracker, :status, :assigned_to, :priority, :project],
Jean-Philippe Lang
Added the ability to include subprojects issues on calendar & gantt (options box)...
r395 :conditions => ["(((start_date>=? and start_date<=?) or (due_date>=? and due_date<=?) or (start_date<? and due_date>?)) and start_date is not null and due_date is not null and #{Issue.table_name}.tracker_id in (#{@selected_tracker_ids.join(',')}))", @date_from, @date_to, @date_from, @date_to, @date_from, @date_to]
) unless @selected_tracker_ids.empty?
end
Jean-Philippe Lang
Added versions due dates on gantt chart....
r425 @events += @project.versions.find(:all, :conditions => ["effective_date BETWEEN ? AND ?", @date_from, @date_to])
@events.sort! {|x,y| x.start_date <=> y.start_date }
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330
Jean-Philippe Lang
Gantt chart can now be exported to a graphic file (png)....
r660 if params[:format]=='pdf'
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 @options_for_rfpdf ||= {}
Jean-Philippe Lang
Gantt chart can now be exported to a graphic file (png)....
r660 @options_for_rfpdf[:file_name] = "#{@project.identifier}-gantt.pdf"
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 render :template => "projects/gantt.rfpdf", :layout => false
Jean-Philippe Lang
Gantt chart can now be exported to a graphic file (png)....
r660 elsif params[:format]=='png' && respond_to?('gantt_image')
image = gantt_image(@events, @date_from, @months, @zoom)
image.format = 'PNG'
send_data(image.to_blob, :disposition => 'inline', :type => 'image/png', :filename => "#{@project.identifier}-gantt.png")
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 else
render :template => "projects/gantt.rhtml"
end
end
Jean-Philippe Lang
added rss/atom feeds at project levels for:...
r336
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 private
# Find project of id params[:id]
# if not found, redirect to project list
# Used as a before_filter
def find_project
@project = Project.find(params[:id])
Jean-Philippe Lang
ActiveRecord::RecordNotFound exceptions handled more gracefully...
r130 rescue ActiveRecord::RecordNotFound
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 render_404
end
Jean-Philippe Lang
Patch #9705 Tracker filtering on Main Calendar (Jeffrey Jones)...
r392 def retrieve_selected_tracker_ids(selectable_trackers)
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 = selectable_trackers.collect {|t| t.id.to_s }
end
end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 # Retrieve query from session or build a new query
def retrieve_query
if params[:query_id]
@query = @project.queries.find(params[:query_id])
Jean-Philippe Lang
"me" value is now available in queries for "assigned to" and "author" filters....
r517 @query.executed_by = logged_in_user
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 session[:query] = @query
else
if params[:set_filter] or !session[:query] or session[:query].project_id != @project.id
# Give it a name, required to be valid
Jean-Philippe Lang
"me" value is now available in queries for "assigned to" and "author" filters....
r517 @query = Query.new(:name => "_", :executed_by => logged_in_user)
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 @query.project = @project
if params[:fields] and params[:fields].is_a? Array
params[:fields].each do |field|
@query.add_filter(field, params[:operators][field], params[:values][field])
end
else
@query.available_filters.keys.each do |field|
@query.add_short_filter(field, params[field]) if params[field]
end
end
session[:query] = @query
else
@query = session[:query]
end
end
end
Jean-Philippe Lang
Initial commit...
r2 end