Feature #465 » 465-shared-versions-work-in-progress.patch
| app/controllers/issues_controller.rb | ||
|---|---|---|
| 240 | 240 |
priority = params[:priority_id].blank? ? nil : IssuePriority.find_by_id(params[:priority_id]) |
| 241 | 241 |
assigned_to = (params[:assigned_to_id].blank? || params[:assigned_to_id] == 'none') ? nil : User.find_by_id(params[:assigned_to_id]) |
| 242 | 242 |
category = (params[:category_id].blank? || params[:category_id] == 'none') ? nil : @project.issue_categories.find_by_id(params[:category_id]) |
| 243 |
fixed_version = (params[:fixed_version_id].blank? || params[:fixed_version_id] == 'none') ? nil : @project.versions.find_by_id(params[:fixed_version_id])
|
|
| 243 |
fixed_version = (params[:fixed_version_id].blank? || params[:fixed_version_id] == 'none') ? nil : @project.inherited_versions.find {|v| v.id.to_s == params[:fixed_version_id] }
|
|
| 244 | 244 |
custom_field_values = params[:custom_field_values] ? params[:custom_field_values].reject {|k,v| v.blank?} : nil
|
| 245 | 245 |
|
| 246 | 246 |
unsaved_issue_ids = [] |
| app/controllers/projects_controller.rb | ||
|---|---|---|
| 240 | 240 |
'downloads' => "#{Attachment.table_name}.downloads"
|
| 241 | 241 |
|
| 242 | 242 |
@containers = [ Project.find(@project.id, :include => :attachments, :order => sort_clause)] |
| 243 |
@containers += @project.versions.find(:all, :include => :attachments, :order => sort_clause).sort.reverse |
|
| 243 |
# Need get the ids separately in order to add the finder options |
|
| 244 |
version_ids = @project.inherited_versions_visible_to_user.collect(&:id) |
|
| 245 |
@containers += Version.find_all_by_id(version_ids, :include => :attachments, :order => sort_clause).sort.reverse |
|
| 244 | 246 |
render :layout => !request.xhr? |
| 245 | 247 |
end |
| 246 | 248 |
|
| ... | ... | |
| 248 | 250 |
def changelog |
| 249 | 251 |
@trackers = @project.trackers.find(:all, :conditions => ["is_in_chlog=?", true], :order => 'position') |
| 250 | 252 |
retrieve_selected_tracker_ids(@trackers) |
| 251 |
@versions = @project.versions.sort |
|
| 253 |
if params[:inherited_versions] |
|
| 254 |
@versions = @project.inherited_versions_visible_to_user.sort |
|
| 255 |
else |
|
| 256 |
@versions = @project.versions.sort |
|
| 257 |
end |
|
| 252 | 258 |
end |
| 253 | 259 | |
| 254 | 260 |
def roadmap |
| 255 | 261 |
@trackers = @project.trackers.find(:all, :conditions => ["is_in_roadmap=?", true]) |
| 256 | 262 |
retrieve_selected_tracker_ids(@trackers) |
| 257 |
@versions = @project.versions.sort |
|
| 263 |
if params[:inherited_versions] |
|
| 264 |
@versions = @project.inherited_versions_visible_to_user.sort |
|
| 265 |
else |
|
| 266 |
@versions = @project.versions.sort |
|
| 267 |
end |
|
| 258 | 268 |
@versions = @versions.select {|v| !v.completed? } unless params[:completed]
|
| 259 | 269 |
end |
| 260 | 270 |
|
| app/helpers/application_helper.rb | ||
|---|---|---|
| 97 | 97 |
h(truncate(text.to_s, :length => 120).gsub(%r{[\r\n]*<(pre|code)>.*$}m, '...')).gsub(/[\r\n]+/, "<br />")
|
| 98 | 98 |
end |
| 99 | 99 | |
| 100 |
def format_version_name(version) |
|
| 101 |
if User.current.allowed_to?(:view_issues, version.project) |
|
| 102 |
"#{h(version.project.name)} - #{h(version.name)}"
|
|
| 103 |
else |
|
| 104 |
"#{l(:text_not_authorized)}"
|
|
| 105 |
end |
|
| 106 |
end |
|
| 107 | ||
| 108 |
# Given an Array of emails (+recipients+), do they all have |
|
| 109 |
# +permission+ on +project+ ? |
|
| 110 |
def recipients_all_allowed_to?(recipients, permission, project) |
|
| 111 |
recipients.uniq.all? do |recipient| |
|
| 112 |
user = User.find_by_mail(recipient) |
|
| 113 |
user && user.allowed_to?(permission, project) |
|
| 114 |
end |
|
| 115 |
end |
|
| 116 | ||
| 117 |
# Given an Array of +versions+, are all the email addresses |
|
| 118 |
# (+recipients+) allowed to view all of the versions? |
|
| 119 |
def recipients_all_allowed_to_see_versions?(recipients, versions) |
|
| 120 |
versions.uniq.all? do |version| |
|
| 121 |
if version.nil? |
|
| 122 |
true |
|
| 123 |
else |
|
| 124 |
recipients_all_allowed_to?(recipients, :view_issues, version.project) |
|
| 125 |
end |
|
| 126 |
end |
|
| 127 |
end |
|
| 128 |
|
|
| 100 | 129 |
def due_date_distance_in_words(date) |
| 101 | 130 |
if date |
| 102 | 131 |
l((date < Date.today ? :label_roadmap_overdue : :label_roadmap_due_in), distance_of_date_in_words(Date.today, date)) |
| app/helpers/issues_helper.rb | ||
|---|---|---|
| 66 | 66 |
@sidebar_queries |
| 67 | 67 |
end |
| 68 | 68 | |
| 69 |
def inherited_version_options(project) |
|
| 70 |
project.inherited_versions.sort.collect {|v| [format_version_name(v), v.id] }
|
|
| 71 |
end |
|
| 72 | ||
| 69 | 73 |
def show_detail(detail, no_html=false) |
| 70 | 74 |
case detail.property |
| 71 | 75 |
when 'attr' |
| ... | ... | |
| 93 | 97 |
c = IssueCategory.find_by_id(detail.value) and value = c.name if detail.value |
| 94 | 98 |
c = IssueCategory.find_by_id(detail.old_value) and old_value = c.name if detail.old_value |
| 95 | 99 |
when 'fixed_version_id' |
| 96 |
v = Version.find_by_id(detail.value) and value = v.name if detail.value
|
|
| 97 |
v = Version.find_by_id(detail.old_value) and old_value = v.name if detail.old_value
|
|
| 100 |
v = Version.find_by_id(detail.value) and value = format_version_name(v) if detail.value
|
|
| 101 |
v = Version.find_by_id(detail.old_value) and old_value = format_version_name(v) if detail.old_value
|
|
| 98 | 102 |
when 'estimated_hours' |
| 99 | 103 |
value = "%0.02f" % detail.value.to_f unless detail.value.blank? |
| 100 | 104 |
old_value = "%0.02f" % detail.old_value.to_f unless detail.old_value.blank? |
| app/helpers/mailer_helper.rb | ||
|---|---|---|
| 1 |
# redMine - project management software |
|
| 2 |
# Copyright (C) 2006-2009 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 |
module MailerHelper |
|
| 19 |
def unauthorized_version?(journal_detail, recipients) |
|
| 20 |
return false unless journal_detail.prop_key == "fixed_version_id" |
|
| 21 | ||
| 22 |
!recipients_all_allowed_to_see_versions?(recipients, |
|
| 23 |
Version.find_all_by_id([journal_detail.value, journal_detail.old_value])) |
|
| 24 |
end |
|
| 25 |
end |
|
| app/helpers/projects_helper.rb | ||
|---|---|---|
| 18 | 18 |
module ProjectsHelper |
| 19 | 19 |
def link_to_version(version, options = {})
|
| 20 | 20 |
return '' unless version && version.is_a?(Version) |
| 21 |
link_to h(version.name), { :controller => 'versions', :action => 'show', :id => version }, options
|
|
| 21 |
if User.current.allowed_to?(:view_issues, version.project) |
|
| 22 |
link_to format_version_name(version), { :controller => 'versions', :action => 'show', :id => version }, options
|
|
| 23 |
else |
|
| 24 |
format_version_name(version) |
|
| 25 |
end |
|
| 22 | 26 |
end |
| 23 | 27 |
|
| 24 | 28 |
def project_settings_tabs |
| app/models/mailer.rb | ||
|---|---|---|
| 19 | 19 |
helper :application |
| 20 | 20 |
helper :issues |
| 21 | 21 |
helper :custom_fields |
| 22 |
helper :mailer |
|
| 22 | 23 | |
| 23 | 24 |
include ActionController::UrlWriter |
| 24 | 25 |
include Redmine::I18n |
| app/models/project.rb | ||
|---|---|---|
| 247 | 247 |
:conditions => ["#{Project.table_name}.lft >= ? AND #{Project.table_name}.rgt <= ? AND #{Project.table_name}.status = #{STATUS_ACTIVE}", lft, rgt],
|
| 248 | 248 |
:order => "#{Tracker.table_name}.position")
|
| 249 | 249 |
end |
| 250 | ||
| 251 |
# Returns an array of the Versions used by the project, its active |
|
| 252 |
# sub projects, and its active parent projects |
|
| 253 |
def inherited_versions |
|
| 254 |
@inherited_versions ||= self.root.self_and_descendants. |
|
| 255 |
delete_if {|p| !p.active? }.
|
|
| 256 |
collect(&:versions). |
|
| 257 |
flatten. |
|
| 258 |
sort |
|
| 259 | ||
| 260 |
yield @inherited_versions if block_given? |
|
| 261 |
@inherited_versions |
|
| 262 |
end |
|
| 263 | ||
| 264 |
# Returns the inherited_versions that are visible to +user+ |
|
| 265 |
def inherited_versions_visible_to_user(user=User.current) |
|
| 266 |
return inherited_versions do |versions| |
|
| 267 |
versions.delete_if {|v| !user.allowed_to?(:view_issues, v.project) }
|
|
| 268 |
end |
|
| 269 |
end |
|
| 250 | 270 |
|
| 251 | 271 |
# Returns a hash of project users grouped by role |
| 252 | 272 |
def users_by_role |
| app/models/query.rb | ||
|---|---|---|
| 182 | 182 |
@available_filters["category_id"] = { :type => :list_optional, :order => 6, :values => @project.issue_categories.collect{|s| [s.name, s.id.to_s] } }
|
| 183 | 183 |
end |
| 184 | 184 |
unless @project.versions.empty? |
| 185 |
@available_filters["fixed_version_id"] = { :type => :list_optional, :order => 7, :values => @project.versions.sort.collect{|s| [s.name, s.id.to_s] } }
|
|
| 185 |
@available_filters["fixed_version_id"] = { :type => :list_optional, :order => 7, :values => @project.inherited_versions.sort.collect{|s| ["#{s.project.name} - #{s.name}", s.id.to_s] } }
|
|
| 186 | 186 |
end |
| 187 | 187 |
unless @project.descendants.active.empty? |
| 188 | 188 |
@available_filters["subproject_id"] = { :type => :list_subprojects, :order => 13, :values => @project.descendants.visible.collect{|s| [s.name, s.id.to_s] } }
|
| app/views/issues/_form.rhtml | ||
|---|---|---|
| 33 | 33 |
:class => 'small', :tabindex => 199) if authorize_for('projects', 'add_issue_category') %></p>
|
| 34 | 34 |
<% end %> |
| 35 | 35 |
<%= content_tag('p', f.select(:fixed_version_id,
|
| 36 |
(@project.versions.sort.collect {|v| [v.name, v.id]}),
|
|
| 37 |
{ :include_blank => true })) unless @project.versions.empty? %>
|
|
| 36 |
(inherited_version_options(@project)),
|
|
| 37 |
{ :include_blank => true })) unless @project.inherited_versions.empty? %>
|
|
| 38 | 38 |
</div> |
| 39 | 39 | |
| 40 | 40 |
<div class="splitcontentright"> |
| app/views/issues/bulk_edit.rhtml | ||
|---|---|---|
| 27 | 27 |
<label><%= l(:field_fixed_version) %>: |
| 28 | 28 |
<%= select_tag('fixed_version_id', content_tag('option', l(:label_no_change_option), :value => '') +
|
| 29 | 29 |
content_tag('option', l(:label_none), :value => 'none') +
|
| 30 |
options_from_collection_for_select(@project.versions.sort, :id, :name)) %></label>
|
|
| 30 |
options_for_select(inherited_version_options(@project))) %></label>
|
|
| 31 | 31 |
</p> |
| 32 | 32 | |
| 33 | 33 |
<p> |
| app/views/issues/context_menu.rhtml | ||
|---|---|---|
| 27 | 27 |
<% end -%> |
| 28 | 28 |
</ul> |
| 29 | 29 |
</li> |
| 30 |
<% unless @project.nil? || @project.versions.empty? -%> |
|
| 30 |
<% unless @project.nil? || @project.inherited_versions.empty? -%>
|
|
| 31 | 31 |
<li class="folder"> |
| 32 | 32 |
<a href="#" class="submenu"><%= l(:field_fixed_version) %></a> |
| 33 | 33 |
<ul> |
| 34 |
<% @project.versions.sort.each do |v| -%> |
|
| 35 |
<li><%= context_menu_link v.name, {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id), 'fixed_version_id' => v, :back_to => @back}, :method => :post,
|
|
| 34 |
<% @project.inherited_versions.sort.each do |v| -%>
|
|
| 35 |
<li><%= context_menu_link format_version_name(v), {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id), 'fixed_version_id' => v, :back_to => @back}, :method => :post,
|
|
| 36 | 36 |
:selected => (@issue && v == @issue.fixed_version), :disabled => !@can[:update] %></li> |
| 37 | 37 |
<% end -%> |
| 38 | 38 |
<li><%= context_menu_link l(:label_none), {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id), 'fixed_version_id' => 'none', :back_to => @back}, :method => :post,
|
| app/views/mailer/issue_edit.text.html.rhtml | ||
|---|---|---|
| 2 | 2 | |
| 3 | 3 |
<ul> |
| 4 | 4 |
<% for detail in @journal.details %> |
| 5 |
<% if unauthorized_version?(detail, @recipients + @cc) %> |
|
| 6 |
<li><%= l(:field_fixed_version) %> <%= l(:text_journal_set_to, l(:text_not_authorized)) %></li> |
|
| 7 |
<% else %> |
|
| 5 | 8 |
<li><%= show_detail(detail, true) %></li> |
| 9 |
<% end %> |
|
| 6 | 10 |
<% end %> |
| 7 | 11 |
</ul> |
| 8 | 12 | |
| app/views/mailer/issue_edit.text.plain.rhtml | ||
|---|---|---|
| 1 | 1 |
<%= l(:text_issue_updated, :id => "##{@issue.id}", :author => @journal.user) %>
|
| 2 | 2 | |
| 3 | 3 |
<% for detail in @journal.details -%> |
| 4 |
<% if unauthorized_version?(detail, @recipients + @cc) %> |
|
| 5 |
<%= l(:field_fixed_version) %> <%= l(:text_journal_set_to, l(:text_not_authorized)) %> |
|
| 6 |
<% else %> |
|
| 4 | 7 |
<%= show_detail(detail, true) %> |
| 8 |
<% end %> |
|
| 5 | 9 |
<% end -%> |
| 6 | 10 | |
| 7 | 11 |
<%= @journal.notes if @journal.notes? %> |
| app/views/projects/changelog.rhtml | ||
|---|---|---|
| 32 | 32 |
<label><%= check_box_tag "tracker_ids[]", tracker.id, (@selected_tracker_ids.include? tracker.id.to_s) %> |
| 33 | 33 |
<%= tracker.name %></label><br /> |
| 34 | 34 |
<% end %> |
| 35 |
<br /> |
|
| 36 |
<label for="inherited_versions"><%= check_box_tag "inherited_versions", 1, params[:inherited_versions] %> <%= l(:label_show_inherited_versions) %></label> |
|
| 35 | 37 |
<p><%= submit_tag l(:button_apply), :class => 'button-small' %></p> |
| 36 | 38 |
<% end %> |
| 37 | 39 | |
| app/views/projects/list_files.rhtml | ||
|---|---|---|
| 21 | 21 |
<% if container.is_a?(Version) -%> |
| 22 | 22 |
<tr> |
| 23 | 23 |
<th colspan="6" align="left"> |
| 24 |
<%= link_to(h(container), {:controller => 'versions', :action => 'show', :id => container}, :class => "icon icon-package") %>
|
|
| 24 |
<%= link_to(h(container.project.name) + ' - ' + h(container), {:controller => 'versions', :action => 'show', :id => container}, :class => "icon icon-package") %>
|
|
| 25 | 25 |
</th> |
| 26 | 26 |
</tr> |
| 27 | 27 |
<% end -%> |
| app/views/projects/roadmap.rhtml | ||
|---|---|---|
| 6 | 6 |
<div id="roadmap"> |
| 7 | 7 |
<% @versions.each do |version| %> |
| 8 | 8 |
<%= tag 'a', :name => version.name %> |
| 9 |
<h3 class="icon22 icon22-package"><%= link_to h(version.name), :controller => 'versions', :action => 'show', :id => version %></h3> |
|
| 9 |
<h3 class="icon22 icon22-package"><%= link_to h(version.project.name) + " - " + h(version.name), :controller => 'versions', :action => 'show', :id => version %></h3>
|
|
| 10 | 10 |
<%= render :partial => 'versions/overview', :locals => {:version => version} %>
|
| 11 | 11 |
<%= render(:partial => "wiki/content", :locals => {:content => version.wiki_page.content}) if version.wiki_page %>
|
| 12 | 12 | |
| ... | ... | |
| 39 | 39 |
<% end %> |
| 40 | 40 |
<br /> |
| 41 | 41 |
<label for="completed"><%= check_box_tag "completed", 1, params[:completed] %> <%= l(:label_show_completed_versions) %></label> |
| 42 |
<br /> |
|
| 43 |
<label for="inherited_versions"><%= check_box_tag "inherited_versions", 1, params[:inherited_versions] %> <%= l(:label_show_inherited_versions) %></label> |
|
| 42 | 44 |
<p><%= submit_tag l(:button_apply), :class => 'button-small', :name => nil %></p> |
| 43 | 45 |
<% end %> |
| 44 | 46 | |
| config/locales/en.yml | ||
|---|---|---|
| 615 | 615 |
label_stay_logged_in: Stay logged in |
| 616 | 616 |
label_disabled: disabled |
| 617 | 617 |
label_show_completed_versions: Show completed versions |
| 618 |
label_show_inherited_versions: Show inherited versions |
|
| 618 | 619 |
label_me: me |
| 619 | 620 |
label_board: Forum |
| 620 | 621 |
label_board_new: New forum |
| ... | ... | |
| 778 | 779 |
text_wiki_page_nullify_children: "Keep child pages as root pages" |
| 779 | 780 |
text_wiki_page_destroy_children: "Delete child pages and all their descendants" |
| 780 | 781 |
text_wiki_page_reassign_children: "Reassign child pages to this parent page" |
| 782 |
text_not_authorized: You are not authorized to view this. |
|
| 783 | ||
| 781 | 784 |
|
| 782 | 785 |
default_role_manager: Manager |
| 783 | 786 |
default_role_developper: Developer |
| test/fixtures/attachments.yml | ||
|---|---|---|
| 121 | 121 |
filename: picture.jpg |
| 122 | 122 |
author_id: 2 |
| 123 | 123 |
content_type: image/jpeg |
| 124 |
|
|
| 124 |
attachments_011: |
|
| 125 |
created_on: 2006-07-19 21:07:27 +02:00 |
|
| 126 |
container_type: Version |
|
| 127 |
container_id: 1 |
|
| 128 |
downloads: 0 |
|
| 129 |
disk_filename: 060719210727_version_file.zip |
|
| 130 |
digest: b91e08d0cf966d5c6ff411bd8c4cc3a2 |
|
| 131 |
id: 11 |
|
| 132 |
filesize: 452 |
|
| 133 |
filename: version_file.zip |
|
| 134 |
author_id: 2 |
|
| 135 |
content_type: application/octet-stream |
|
| test/fixtures/journal_details.yml | ||
|---|---|---|
| 13 | 13 |
value: "30" |
| 14 | 14 |
prop_key: done_ratio |
| 15 | 15 |
journal_id: 1 |
| 16 |
journal_details_003: |
|
| 17 |
old_value: nil |
|
| 18 |
property: attr |
|
| 19 |
id: 3 |
|
| 20 |
value: "6" |
|
| 21 |
prop_key: fixed_version_id |
|
| 22 |
journal_id: 4 |
|
| test/fixtures/journals.yml | ||
|---|---|---|
| 20 | 20 |
journalized_type: Issue |
| 21 | 21 |
user_id: 2 |
| 22 | 22 |
journalized_id: 2 |
| 23 |
|
|
| 23 |
journals_004: |
|
| 24 |
created_on: <%= 1.days.ago.to_date.to_s(:db) %> |
|
| 25 |
notes: "A comment with a private version." |
|
| 26 |
id: 4 |
|
| 27 |
journalized_type: Issue |
|
| 28 |
user_id: 1 |
|
| 29 |
journalized_id: 6 |
|
| 30 |
|
|
| test/fixtures/members.yml | ||
|---|---|---|
| 30 | 30 |
project_id: 5 |
| 31 | 31 |
user_id: 2 |
| 32 | 32 |
mail_notification: true |
| 33 |
members_006: |
|
| 34 |
created_on: 2006-07-19 19:35:33 +02:00 |
|
| 35 |
project_id: 5 |
|
| 36 |
id: 6 |
|
| 37 |
user_id: 1 |
|
| 38 |
mail_notification: true |
|
| 33 | 39 |
|
| test/fixtures/versions.yml | ||
|---|---|---|
| 23 | 23 |
id: 3 |
| 24 | 24 |
description: Future version |
| 25 | 25 |
effective_date: |
| 26 |
|
|
| 26 |
versions_004: |
|
| 27 |
created_on: 2006-07-19 21:00:33 +02:00 |
|
| 28 |
name: "2.0" |
|
| 29 |
project_id: 3 |
|
| 30 |
updated_on: 2006-07-19 21:00:33 +02:00 |
|
| 31 |
id: 4 |
|
| 32 |
description: Future version on subproject |
|
| 33 |
effective_date: |
|
| 34 |
versions_005: |
|
| 35 |
created_on: 2006-07-19 21:00:07 +02:00 |
|
| 36 |
name: "Alpha" |
|
| 37 |
project_id: 2 |
|
| 38 |
updated_on: 2006-07-19 21:00:07 +02:00 |
|
| 39 |
id: 5 |
|
| 40 |
description: Private Alpha |
|
| 41 |
effective_date: 2006-07-01 |
|
| 42 |
versions_006: |
|
| 43 |
created_on: 2006-07-19 21:00:07 +02:00 |
|
| 44 |
name: "Private Version of public subproject" |
|
| 45 |
project_id: 5 |
|
| 46 |
updated_on: 2006-07-19 21:00:07 +02:00 |
|
| 47 |
id: 6 |
|
| 48 |
description: "Should be done any day now..." |
|
| 49 |
effective_date: |
|
| test/functional/issues_controller_test.rb | ||
|---|---|---|
| 840 | 840 |
assert_tag :input, :attributes => { :name => 'time_entry[hours]', :value => "2z" }
|
| 841 | 841 |
end |
| 842 | 842 |
|
| 843 |
def test_post_edit_should_allow_fixed_version_to_be_set_to_a_subproject |
|
| 844 |
issue = Issue.find(2) |
|
| 845 |
@request.session[:user_id] = 2 |
|
| 846 | ||
| 847 |
post :edit, |
|
| 848 |
:id => issue.id, |
|
| 849 |
:issue => {
|
|
| 850 |
:fixed_version_id => 4 |
|
| 851 |
} |
|
| 852 | ||
| 853 |
assert_response :redirect |
|
| 854 |
issue.reload |
|
| 855 |
assert_equal 4, issue.fixed_version_id |
|
| 856 |
assert_not_equal issue.project_id, issue.fixed_version.project_id |
|
| 857 |
end |
|
| 858 |
|
|
| 843 | 859 |
def test_get_bulk_edit |
| 844 | 860 |
@request.session[:user_id] = 2 |
| 845 | 861 |
get :bulk_edit, :ids => [1, 2] |
| ... | ... | |
| 920 | 936 |
assert_nil Issue.find(2).assigned_to |
| 921 | 937 |
end |
| 922 | 938 |
|
| 939 |
def test_post_bulk_edit_should_allow_fixed_version_to_be_set_to_a_subproject |
|
| 940 |
@request.session[:user_id] = 2 |
|
| 941 | ||
| 942 |
post :bulk_edit, |
|
| 943 |
:ids => [1,2], |
|
| 944 |
:fixed_version_id => 4 |
|
| 945 | ||
| 946 |
assert_response :redirect |
|
| 947 |
issues = Issue.find([1,2]) |
|
| 948 |
issues.each do |issue| |
|
| 949 |
assert_equal 4, issue.fixed_version_id |
|
| 950 |
assert_not_equal issue.project_id, issue.fixed_version.project_id |
|
| 951 |
end |
|
| 952 |
end |
|
| 953 | ||
| 923 | 954 |
def test_move_routing |
| 924 | 955 |
assert_routing( |
| 925 | 956 |
{:method => :get, :path => '/issues/1/move'},
|
| ... | ... | |
| 982 | 1013 |
assert_tag :tag => 'a', :content => 'Immediate', |
| 983 | 1014 |
:attributes => { :href => '/issues/bulk_edit?ids%5B%5D=1&priority_id=8',
|
| 984 | 1015 |
:class => '' } |
| 1016 |
# Versions |
|
| 1017 |
assert_tag :tag => 'a', :content => 'eCookbook - 0.1', |
|
| 1018 |
:attributes => { :href => '/issues/bulk_edit?fixed_version_id=1&ids%5B%5D=1',
|
|
| 1019 |
:class => '' } |
|
| 1020 |
assert_tag :tag => 'a', :content => 'eCookbook - 1.0', |
|
| 1021 |
:attributes => { :href => '/issues/bulk_edit?fixed_version_id=2&ids%5B%5D=1',
|
|
| 1022 |
:class => '' } |
|
| 1023 |
assert_tag :tag => 'a', :content => 'eCookbook Subproject 1 - 2.0', |
|
| 1024 |
:attributes => { :href => '/issues/bulk_edit?fixed_version_id=4&ids%5B%5D=1',
|
|
| 1025 |
:class => '' } |
|
| 1026 | ||
| 985 | 1027 |
assert_tag :tag => 'a', :content => 'Dave Lopper', |
| 986 | 1028 |
:attributes => { :href => '/issues/bulk_edit?assigned_to_id=3&ids%5B%5D=1',
|
| 987 | 1029 |
:class => '' } |
| test/functional/projects_controller_test.rb | ||
|---|---|---|
| 316 | 316 |
:attributes => { :href => '/attachments/download/9/version_file.zip' }
|
| 317 | 317 |
end |
| 318 | 318 | |
| 319 |
def test_list_files_with_inherited_versions |
|
| 320 |
get :list_files, :id => 1 |
|
| 321 |
assert_response :success |
|
| 322 |
assert_not_nil assigns(:containers) |
|
| 323 |
|
|
| 324 |
# file attached to a subproject's version |
|
| 325 |
assert_tag :a, :content => 'version_file.zip', |
|
| 326 |
:attributes => { :href => '/attachments/download/11/version_file.zip' }
|
|
| 327 |
end |
|
| 328 | ||
| 319 | 329 |
def test_list_files_routing |
| 320 | 330 |
assert_routing( |
| 321 | 331 |
{:method => :get, :path => '/projects/33/files'},
|
| ... | ... | |
| 337 | 347 |
assert_not_nil assigns(:versions) |
| 338 | 348 |
end |
| 339 | 349 |
|
| 350 |
def test_changelog_showing_inherited_versions |
|
| 351 |
get :changelog, :id => 1, :inherited_versions => 1 |
|
| 352 |
assert_response :success |
|
| 353 |
assert_template 'changelog' |
|
| 354 |
assert_not_nil assigns(:versions) |
|
| 355 |
# Version on subproject appears |
|
| 356 |
assert assigns(:versions).include?(Version.find(4)) |
|
| 357 |
end |
|
| 358 | ||
| 340 | 359 |
def test_roadmap_routing |
| 341 | 360 |
assert_routing( |
| 342 | 361 |
{:method => :get, :path => 'projects/33/roadmap'},
|
| ... | ... | |
| 365 | 384 |
# Completed version appears |
| 366 | 385 |
assert assigns(:versions).include?(Version.find(1)) |
| 367 | 386 |
end |
| 387 | ||
| 388 |
def test_roadmap_showing_inherited_versions |
|
| 389 |
get :roadmap, :id => 1, :inherited_versions => 1 |
|
| 390 |
assert_response :success |
|
| 391 |
assert_template 'roadmap' |
|
| 392 |
assert_not_nil assigns(:versions) |
|
| 393 |
# Version on subproject appears |
|
| 394 |
assert assigns(:versions).include?(Version.find(4)) |
|
| 395 |
end |
|
| 368 | 396 |
|
| 369 | 397 |
def test_project_activity_routing |
| 370 | 398 |
assert_routing( |
| test/unit/helpers/application_helper_test.rb | ||
|---|---|---|
| 32 | 32 |
def setup |
| 33 | 33 |
super |
| 34 | 34 |
end |
| 35 | ||
| 36 |
def test_format_version_name_is_authorized |
|
| 37 |
User.current = User.find(1) |
|
| 38 |
assert_equal "eCookbook - 0.1", format_version_name(Version.find(1)) |
|
| 39 |
end |
|
| 40 |
|
|
| 41 |
def test_format_version_name_is_unauthorized |
|
| 42 |
User.current = User.find(3) |
|
| 43 |
assert_equal "You are not authorized to view this.", format_version_name(Version.find(5)) |
|
| 44 |
end |
|
| 35 | 45 |
|
| 36 | 46 |
def test_auto_links |
| 37 | 47 |
to_test = {
|
| test/unit/helpers/projects_helper_test.rb | ||
|---|---|---|
| 1 |
# Redmine - project management software |
|
| 2 |
# Copyright (C) 2006-2009 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 |
require File.dirname(__FILE__) + '/../../test_helper' |
|
| 19 | ||
| 20 |
class ProjectsHelperTest < HelperTestCase |
|
| 21 |
include ApplicationHelper |
|
| 22 |
include ProjectsHelper |
|
| 23 |
|
|
| 24 |
fixtures :all |
|
| 25 | ||
| 26 |
def setup |
|
| 27 |
super |
|
| 28 |
set_language_if_valid('en')
|
|
| 29 |
end |
|
| 30 | ||
| 31 |
def test_link_to_version |
|
| 32 |
User.current = User.find(1) |
|
| 33 |
assert_equal '<a href="/versions/show/1">eCookbook - 0.1</a>', link_to_version(Version.find(1)) |
|
| 34 |
end |
|
| 35 | ||
| 36 |
def test_link_to_version_invalid_version |
|
| 37 |
assert_equal '', link_to_version(Object) |
|
| 38 |
end |
|
| 39 | ||
| 40 |
def test_link_to_version_unauthorized |
|
| 41 |
User.current = User.find(3) |
|
| 42 |
assert_equal "You are not authorized to view this.", link_to_version(Version.find(5)) |
|
| 43 |
end |
|
| 44 |
end |
|
| test/unit/mailer_test.rb | ||
|---|---|---|
| 238 | 238 |
assert mail.bcc.include?('dlopper@somenet.foo')
|
| 239 | 239 |
assert mail.body.include?('Bug #3: Error 281 when updating a recipe')
|
| 240 | 240 |
end |
| 241 | ||
| 242 |
def test_issue_edit_should_not_show_private_version_changes_if_any_recipients_are_unauthorized |
|
| 243 |
Setting.default_language = 'en' |
|
| 244 |
# Move issue to a public project but with a Journal showing a |
|
| 245 |
# Private Version |
|
| 246 |
issue = Issue.find(6) |
|
| 247 |
issue.update_attribute(:project_id, 1) |
|
| 248 | ||
| 249 |
# User is allowed to see the Private Version |
|
| 250 |
User.current = User.find(1) |
|
| 251 |
# but another Member of Project #1 is not (dlopper@somenet.foo) |
|
| 252 | ||
| 253 |
journal = Journal.find(4) |
|
| 254 |
Mailer.deliver_issue_edit(journal) |
|
| 255 |
mail = ActionMailer::Base.deliveries.last |
|
| 256 |
|
|
| 257 |
assert !mail.body.include?('Private Version of public subproject'), "Private version exposed to unauthorized user"
|
|
| 258 |
assert mail.body.include?('You are not authorized to view this.'), "Unauthorized message not displayed"
|
|
| 259 |
end |
|
| 241 | 260 |
end |
| test/unit/project_test.rb | ||
|---|---|---|
| 21 | 21 |
fixtures :projects, :enabled_modules, |
| 22 | 22 |
:issues, :issue_statuses, :journals, :journal_details, |
| 23 | 23 |
:users, :members, :member_roles, :roles, :projects_trackers, :trackers, :boards, |
| 24 |
:queries |
|
| 24 |
:queries, :versions
|
|
| 25 | 25 |
|
| 26 | 26 |
def setup |
| 27 | 27 |
@ecookbook = Project.find(1) |
| ... | ... | |
| 233 | 233 |
|
| 234 | 234 |
assert_equal [1,2], parent.rolled_up_trackers.collect(&:id) |
| 235 | 235 |
end |
| 236 |
|
|
| 236 | ||
| 237 |
def test_inherited_versions |
|
| 238 |
parent = Project.find(1) |
|
| 239 |
child = parent.children.find(3) |
|
| 240 |
|
|
| 241 |
assert [1,2,3], parent.version_ids |
|
| 242 |
assert [4], child.version_ids |
|
| 243 | ||
| 244 |
assert_equal 5, parent.inherited_versions.size |
|
| 245 |
parent.inherited_versions.each do |version| |
|
| 246 |
assert_kind_of Version, version |
|
| 247 |
end |
|
| 248 | ||
| 249 |
assert_equal [1,2,3,4,6], parent.inherited_versions.collect(&:id) |
|
| 250 |
end |
|
| 251 | ||
| 252 |
def test_inherited_versions_should_ignore_archived_subprojects |
|
| 253 |
parent = Project.find(1) |
|
| 254 |
child = parent.children.find(3) |
|
| 255 |
child.archive |
|
| 256 |
parent.reload |
|
| 257 |
|
|
| 258 |
assert [1,2,3], parent.version_ids |
|
| 259 |
assert [4], child.version_ids |
|
| 260 |
assert !parent.inherited_versions.collect(&:id).include?(4) |
|
| 261 |
end |
|
| 262 | ||
| 263 |
def test_inherited_versions_visible_to_user |
|
| 264 |
user = User.find(3) |
|
| 265 |
parent = Project.find(1) |
|
| 266 |
child = parent.children.find(5) |
|
| 267 |
|
|
| 268 |
assert [1,2,3], parent.version_ids |
|
| 269 |
assert [6], child.version_ids |
|
| 270 | ||
| 271 |
versions = parent.inherited_versions_visible_to_user(user) |
|
| 272 |
|
|
| 273 |
assert_equal 4, versions.size |
|
| 274 |
versions.each do |version| |
|
| 275 |
assert_kind_of Version, version |
|
| 276 |
end |
|
| 277 | ||
| 278 |
assert !versions.collect(&:id).include?(6) |
|
| 279 |
end |
|
| 280 | ||
| 237 | 281 |
def test_next_identifier |
| 238 | 282 |
ProjectCustomField.delete_all |
| 239 | 283 |
Project.create!(:name => 'last', :identifier => 'p2008040') |
| test/unit/query_test.rb | ||
|---|---|---|
| 31 | 31 |
:include => [ :assigned_to, :status, :tracker, :project, :priority ], |
| 32 | 32 |
:conditions => query.statement |
| 33 | 33 |
end |
| 34 | ||
| 35 |
def test_query_should_allow_inherited_versions_for_a_project_query |
|
| 36 |
subproject_version = Version.find(4) |
|
| 37 |
query = Query.new(:project => Project.find(1), :name => '_') |
|
| 38 |
query.add_filter('fixed_version_id', '=', [subproject_version.id.to_s])
|
|
| 39 | ||
| 40 |
assert query.statement.include?("#{Issue.table_name}.fixed_version_id IN ('4')")
|
|
| 41 |
end |
|
| 34 | 42 |
|
| 35 | 43 |
def test_query_with_multiple_custom_fields |
| 36 | 44 |
query = Query.find(1) |