Feature #465 » 0001-Added-Version-sharing.-465.patch
| app/controllers/issues_controller.rb | ||
|---|---|---|
| 239 | 239 |
priority = params[:priority_id].blank? ? nil : IssuePriority.find_by_id(params[:priority_id]) |
| 240 | 240 |
assigned_to = (params[:assigned_to_id].blank? || params[:assigned_to_id] == 'none') ? nil : User.find_by_id(params[:assigned_to_id]) |
| 241 | 241 |
category = (params[:category_id].blank? || params[:category_id] == 'none') ? nil : @project.issue_categories.find_by_id(params[:category_id]) |
| 242 |
fixed_version = (params[:fixed_version_id].blank? || params[:fixed_version_id] == 'none') ? nil : @project.versions.find_by_id(params[:fixed_version_id])
|
|
| 242 |
fixed_version = (params[:fixed_version_id].blank? || params[:fixed_version_id] == 'none') ? nil : @project.shared_versions.find {|v| v.id.to_s == params[:fixed_version_id] }
|
|
| 243 | 243 |
custom_field_values = params[:custom_field_values] ? params[:custom_field_values].reject {|k,v| v.blank?} : nil
|
| 244 | 244 |
|
| 245 | 245 |
unsaved_issue_ids = [] |
| app/controllers/projects_controller.rb | ||
|---|---|---|
| 271 | 271 |
'downloads' => "#{Attachment.table_name}.downloads"
|
| 272 | 272 |
|
| 273 | 273 |
@containers = [ Project.find(@project.id, :include => :attachments, :order => sort_clause)] |
| 274 |
@containers += @project.versions.find(:all, :include => :attachments, :order => sort_clause).sort.reverse |
|
| 274 |
# Need get the ids separately in order to add the finder options |
|
| 275 |
version_ids = @project.shared_versions_visible_to_user.collect(&:id) |
|
| 276 |
@containers += Version.find_all_by_id(version_ids, :include => :attachments, :order => sort_clause).sort.reverse |
|
| 275 | 277 |
render :layout => !request.xhr? |
| 276 | 278 |
end |
| 277 | 279 |
|
| ... | ... | |
| 279 | 281 |
def changelog |
| 280 | 282 |
@trackers = @project.trackers.find(:all, :conditions => ["is_in_chlog=?", true], :order => 'position') |
| 281 | 283 |
retrieve_selected_tracker_ids(@trackers) |
| 282 |
@versions = @project.versions.sort |
|
| 284 |
if params[:shared_versions] |
|
| 285 |
@versions = @project.shared_versions_visible_to_user.sort |
|
| 286 |
else |
|
| 287 |
@versions = @project.versions.sort |
|
| 288 |
end |
|
| 283 | 289 |
end |
| 284 | 290 | |
| 285 | 291 |
def roadmap |
| 286 | 292 |
@trackers = @project.trackers.find(:all, :conditions => ["is_in_roadmap=?", true]) |
| 287 | 293 |
retrieve_selected_tracker_ids(@trackers) |
| 288 |
@versions = @project.versions.sort |
|
| 294 |
if params[:shared_versions] |
|
| 295 |
@versions = @project.shared_versions_visible_to_user.sort |
|
| 296 |
else |
|
| 297 |
@versions = @project.versions.sort |
|
| 298 |
end |
|
| 289 | 299 |
@versions = @versions.select {|v| !v.completed? } unless params[:completed]
|
| 290 | 300 |
end |
| 291 | 301 |
|
| app/helpers/application_helper.rb | ||
|---|---|---|
| 126 | 126 |
h(truncate(text.to_s, :length => 120).gsub(%r{[\r\n]*<(pre|code)>.*$}m, '...')).gsub(/[\r\n]+/, "<br />")
|
| 127 | 127 |
end |
| 128 | 128 | |
| 129 |
def format_version_name(version) |
|
| 130 |
if User.current.allowed_to?(:view_issues, version.project) || version.systemwide? |
|
| 131 |
"#{h(version.project.name)} - #{h(version.name)}"
|
|
| 132 |
else |
|
| 133 |
"#{l(:text_not_authorized)}"
|
|
| 134 |
end |
|
| 135 |
end |
|
| 136 | ||
| 137 |
def format_version_sharing_name(version) |
|
| 138 |
if version.shared && Version::SharedValues.key?(version.shared) |
|
| 139 |
l(Version::SharedValues[version.shared]) |
|
| 140 |
else |
|
| 141 |
l(:label_version_shared_none) |
|
| 142 |
end |
|
| 143 |
end |
|
| 144 | ||
| 145 |
# Given an Array of emails (+recipients+), do they all have |
|
| 146 |
# +permission+ on +project+ ? |
|
| 147 |
def recipients_all_allowed_to?(recipients, permission, project) |
|
| 148 |
recipients.uniq.all? do |recipient| |
|
| 149 |
user = User.find_by_mail(recipient) |
|
| 150 |
user && user.allowed_to?(permission, project) |
|
| 151 |
end |
|
| 152 |
end |
|
| 153 | ||
| 154 |
# Given an Array of +versions+, are all the email addresses |
|
| 155 |
# (+recipients+) allowed to view all of the versions? |
|
| 156 |
def recipients_all_allowed_to_see_versions?(recipients, versions) |
|
| 157 |
versions.uniq.all? do |version| |
|
| 158 |
if version.nil? |
|
| 159 |
true |
|
| 160 |
else |
|
| 161 |
recipients_all_allowed_to?(recipients, :view_issues, version.project) |
|
| 162 |
end |
|
| 163 |
end |
|
| 164 |
end |
|
| 165 |
|
|
| 129 | 166 |
def due_date_distance_in_words(date) |
| 130 | 167 |
if date |
| 131 | 168 |
l((date < Date.today ? :label_roadmap_overdue : :label_roadmap_due_in), distance_of_date_in_words(Date.today, date)) |
| app/helpers/issues_helper.rb | ||
|---|---|---|
| 64 | 64 |
@sidebar_queries |
| 65 | 65 |
end |
| 66 | 66 | |
| 67 |
# Returns a set of options for a select field, grouped by project. |
|
| 68 |
def shared_version_options(project, selected=nil) |
|
| 69 |
grouped = {}
|
|
| 70 |
project.shared_versions.each do |version| |
|
| 71 |
next unless version.open? |
|
| 72 |
|
|
| 73 |
if User.current.allowed_to?(:view_issues, version.project) || version.systemwide? |
|
| 74 |
grouped[version.project.name] ||= [] |
|
| 75 |
grouped[version.project.name] << [h(version.name), version.id] |
|
| 76 |
else |
|
| 77 |
grouped[l(:text_not_authorized)] ||=[] |
|
| 78 |
grouped[l(:text_not_authorized)] << [l(:text_not_authorized), version.id] |
|
| 79 |
end |
|
| 80 |
end |
|
| 81 | ||
| 82 |
# Add in the selected |
|
| 83 |
selected_version = Version.find_by_id(selected) |
|
| 84 |
if selected_version && !project.shared_versions.include?(selected_version) |
|
| 85 |
if User.current.allowed_to?(:view_issues, selected_version.project) || selected_version.systemwide? |
|
| 86 |
grouped[selected_version.project.name] ||= [] |
|
| 87 |
grouped[selected_version.project.name] << [h(selected_version.name), selected_version.id] |
|
| 88 |
else |
|
| 89 |
grouped[l(:text_not_authorized)] ||=[] |
|
| 90 |
grouped[l(:text_not_authorized)] << [l(:text_not_authorized), selected_version.id] |
|
| 91 |
end |
|
| 92 |
end |
|
| 93 |
|
|
| 94 |
grouped_options_for_select(grouped, selected) |
|
| 95 |
end |
|
| 96 | ||
| 67 | 97 |
def show_detail(detail, no_html=false) |
| 68 | 98 |
case detail.property |
| 69 | 99 |
when 'attr' |
| ... | ... | |
| 91 | 121 |
c = IssueCategory.find_by_id(detail.value) and value = c.name if detail.value |
| 92 | 122 |
c = IssueCategory.find_by_id(detail.old_value) and old_value = c.name if detail.old_value |
| 93 | 123 |
when 'fixed_version_id' |
| 94 |
v = Version.find_by_id(detail.value) and value = v.name if detail.value
|
|
| 95 |
v = Version.find_by_id(detail.old_value) and old_value = v.name if detail.old_value
|
|
| 124 |
v = Version.find_by_id(detail.value) and value = format_version_name(v) if detail.value
|
|
| 125 |
v = Version.find_by_id(detail.old_value) and old_value = format_version_name(v) if detail.old_value
|
|
| 96 | 126 |
when 'estimated_hours' |
| 97 | 127 |
value = "%0.02f" % detail.value.to_f unless detail.value.blank? |
| 98 | 128 |
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/issue.rb | ||
|---|---|---|
| 100 | 100 |
# reassign to the category with same name if any |
| 101 | 101 |
new_category = issue.category.nil? ? nil : new_project.issue_categories.find_by_name(issue.category.name) |
| 102 | 102 |
issue.category = new_category |
| 103 |
issue.fixed_version = nil |
|
| 103 |
# Keep the fixed_version if it's still valid in the new_project |
|
| 104 |
unless new_project.shared_versions.include?(issue.fixed_version) |
|
| 105 |
issue.fixed_version = nil |
|
| 106 |
end |
|
| 104 | 107 |
issue.project = new_project |
| 105 | 108 |
end |
| 106 | 109 |
if new_tracker |
| ... | ... | |
| 234 | 237 |
|
| 235 | 238 |
# Versions that the issue can be assigned to |
| 236 | 239 |
def assignable_versions |
| 237 |
@assignable_versions ||= (project.versions.open + [Version.find_by_id(fixed_version_id_was)]).compact.uniq.sort |
|
| 240 |
@assignable_versions ||= (project.shared_versions_visible_to_user(User.current).select {|v| v.open?} +
|
|
| 241 |
[Version.find_by_id(fixed_version_id_was)]). |
|
| 242 |
compact.uniq.sort |
|
| 238 | 243 |
end |
| 239 | 244 |
|
| 240 | 245 |
# Returns true if this issue is blocked by another issue that is still open |
| ... | ... | |
| 318 | 323 |
s << ' assigned-to-me' if User.current.logged? && assigned_to_id == User.current.id |
| 319 | 324 |
s |
| 320 | 325 |
end |
| 326 | ||
| 327 |
# Update all issues so their versions are not pointing to a |
|
| 328 |
# fixed_version that is outside of the issue's project hierarchy. |
|
| 329 |
# |
|
| 330 |
# OPTIMIZE: does a full table scan of Issues with a fixed_version. |
|
| 331 |
def self.update_fixed_versions_from_project_hierarchy_change |
|
| 332 |
Issue.all(:conditions => ['fixed_version_id IS NOT NULL'], |
|
| 333 |
:include => [:project, :fixed_version] |
|
| 334 |
).each do |issue| |
|
| 335 |
next if issue.project.nil? || issue.fixed_version.nil? |
|
| 336 |
unless issue.project.shared_versions.include?(issue.fixed_version) |
|
| 337 |
issue.init_journal(User.current) |
|
| 338 |
issue.fixed_version = nil |
|
| 339 |
issue.save |
|
| 340 |
end |
|
| 341 |
end |
|
| 342 |
end |
|
| 321 | 343 |
|
| 322 | 344 |
private |
| 323 | 345 |
|
| app/models/mailer.rb | ||
|---|---|---|
| 20 | 20 |
helper :application |
| 21 | 21 |
helper :issues |
| 22 | 22 |
helper :custom_fields |
| 23 |
helper :mailer |
|
| 23 | 24 | |
| 24 | 25 |
include ActionController::UrlWriter |
| 25 | 26 |
include Redmine::I18n |
| app/models/project.rb | ||
|---|---|---|
| 297 | 297 |
# move_to_child_of adds the project in last (ie.right) position |
| 298 | 298 |
move_to_child_of(p) |
| 299 | 299 |
end |
| 300 |
Issue.update_fixed_versions_from_project_hierarchy_change |
|
| 300 | 301 |
true |
| 301 | 302 |
else |
| 302 | 303 |
# Can not move to the given target |
| ... | ... | |
| 324 | 325 |
end |
| 325 | 326 |
end |
| 326 | 327 |
|
| 328 |
# Returns an array of the Versions used by the project, its active |
|
| 329 |
# sub projects, and its active parent projects |
|
| 330 |
def shared_versions |
|
| 331 |
unless @shared_versions |
|
| 332 |
@shared_versions = Version.systemwide_versions |
|
| 333 |
@shared_versions += Version.hierarchy_versions(active_projects_in_hierarchy.collect(&:id)) |
|
| 334 |
@shared_versions += versions |
|
| 335 | ||
| 336 |
@shared_versions.uniq! |
|
| 337 |
@shared_versions.sort! |
|
| 338 |
end |
|
| 339 | ||
| 340 |
yield @shared_versions if block_given? |
|
| 341 |
@shared_versions |
|
| 342 |
end |
|
| 343 | ||
| 344 |
# Returns the shared_versions that are visible to +user+ |
|
| 345 |
def shared_versions_visible_to_user(user=User.current) |
|
| 346 |
return shared_versions do |versions| |
|
| 347 |
versions.delete_if {|v| !user.allowed_to?(:view_issues, v.project) }
|
|
| 348 |
end |
|
| 349 |
end |
|
| 350 | ||
| 327 | 351 |
# Returns a hash of project users grouped by role |
| 328 | 352 |
def users_by_role |
| 329 | 353 |
members.find(:all, :include => [:user, :roles]).inject({}) do |h, m|
|
| ... | ... | |
| 600 | 624 |
self.time_entry_activities.active |
| 601 | 625 |
end |
| 602 | 626 |
end |
| 627 | ||
| 628 |
def active_projects_in_hierarchy |
|
| 629 |
self.root.self_and_descendants.delete_if {|p| !p.active? }
|
|
| 630 |
end |
|
| 603 | 631 |
end |
| app/models/query.rb | ||
|---|---|---|
| 200 | 200 |
unless @project.issue_categories.empty? |
| 201 | 201 |
@available_filters["category_id"] = { :type => :list_optional, :order => 6, :values => @project.issue_categories.collect{|s| [s.name, s.id.to_s] } }
|
| 202 | 202 |
end |
| 203 |
unless @project.versions.empty? |
|
| 204 |
@available_filters["fixed_version_id"] = { :type => :list_optional, :order => 7, :values => @project.versions.sort.collect{|s| [s.name, s.id.to_s] } }
|
|
| 203 |
unless @project.shared_versions.empty?
|
|
| 204 |
@available_filters["fixed_version_id"] = { :type => :list_optional, :order => 7, :values => @project.shared_versions.sort.collect{|s| ["#{s.project.name} - #{s.name}", s.id.to_s] } }
|
|
| 205 | 205 |
end |
| 206 | 206 |
unless @project.descendants.active.empty? |
| 207 | 207 |
@available_filters["subproject_id"] = { :type => :list_subprojects, :order => 13, :values => @project.descendants.visible.collect{|s| [s.name, s.id.to_s] } }
|
| app/models/version.rb | ||
|---|---|---|
| 16 | 16 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| 17 | 17 | |
| 18 | 18 |
class Version < ActiveRecord::Base |
| 19 |
SharedValues = {
|
|
| 20 |
"none" => :label_version_shared_none, |
|
| 21 |
"hierarchy" => :label_version_shared_hierarchy, |
|
| 22 |
"system" => :label_version_shared_systemwide |
|
| 23 |
} |
|
| 24 | ||
| 19 | 25 |
before_destroy :check_integrity |
| 26 |
after_save :update_issue_versions |
|
| 20 | 27 |
belongs_to :project |
| 21 | 28 |
has_many :fixed_issues, :class_name => 'Issue', :foreign_key => 'fixed_version_id' |
| 22 | 29 |
acts_as_customizable |
| ... | ... | |
| 30 | 37 |
validates_length_of :name, :maximum => 60 |
| 31 | 38 |
validates_format_of :effective_date, :with => /^\d{4}-\d{2}-\d{2}$/, :message => :not_a_date, :allow_nil => true
|
| 32 | 39 |
validates_inclusion_of :status, :in => VERSION_STATUSES |
| 40 |
validates_inclusion_of :shared, :in => SharedValues.keys |
|
| 33 | 41 | |
| 34 | 42 |
named_scope :open, :conditions => {:status => 'open'}
|
| 35 |
|
|
| 43 |
named_scope :systemwide_versions, :conditions => ["#{Version.table_name}.shared = ?", 'system' ]
|
|
| 44 |
named_scope :hierarchy_versions, lambda {|project_ids|
|
|
| 45 |
{
|
|
| 46 |
:conditions => ["#{Version.table_name}.shared = ? AND #{Version.table_name}.project_id IN (?)",
|
|
| 47 |
'hierarchy', project_ids] |
|
| 48 |
} |
|
| 49 |
} |
|
| 50 | ||
| 51 |
def systemwide? |
|
| 52 |
shared == 'system' |
|
| 53 |
end |
|
| 54 |
|
|
| 36 | 55 |
def start_date |
| 37 | 56 |
effective_date |
| 38 | 57 |
end |
| ... | ... | |
| 54 | 73 |
def closed? |
| 55 | 74 |
status == 'closed' |
| 56 | 75 |
end |
| 76 | ||
| 77 |
def open? |
|
| 78 |
status == 'open' |
|
| 79 |
end |
|
| 57 | 80 |
|
| 58 | 81 |
# Returns true if the version is completed: due date reached and no open issues |
| 59 | 82 |
def completed? |
| ... | ... | |
| 124 | 147 |
def check_integrity |
| 125 | 148 |
raise "Can't delete version" if self.fixed_issues.find(:first) |
| 126 | 149 |
end |
| 150 | ||
| 151 |
# Update the issue's fixed versions. Used if a version's sharing changes. |
|
| 152 |
def update_issue_versions |
|
| 153 |
Issue.update_fixed_versions_from_project_hierarchy_change |
|
| 154 |
end |
|
| 127 | 155 |
|
| 128 | 156 |
# Returns the average estimated time of assigned issues |
| 129 | 157 |
# or 1 if no issue has an estimated time |
| app/views/issues/_attributes.rhtml | ||
|---|---|---|
| 18 | 18 |
:title => l(:label_issue_category_new), |
| 19 | 19 |
:tabindex => 199) if authorize_for('projects', 'add_issue_category') %></p>
|
| 20 | 20 |
<% end %> |
| 21 |
<% unless @issue.assignable_versions.empty? %>
|
|
| 22 |
<p><%= f.select :fixed_version_id, (@issue.assignable_versions.collect {|v| [v.name, v.id]}), :include_blank => true %></p>
|
|
| 23 |
<% end %>
|
|
| 21 |
<p><%= f.select(:fixed_version_id,
|
|
| 22 |
(shared_version_options(@project, @issue.fixed_version_id)), |
|
| 23 |
{ :include_blank => true }) unless @project.shared_versions.empty? %></p>
|
|
| 24 | 24 |
</div> |
| 25 | 25 | |
| 26 | 26 |
<div class="splitcontentright"> |
| app/views/issues/bulk_edit.rhtml | ||
|---|---|---|
| 31 | 31 |
<label><%= l(:field_fixed_version) %>: |
| 32 | 32 |
<%= select_tag('fixed_version_id', content_tag('option', l(:label_no_change_option), :value => '') +
|
| 33 | 33 |
content_tag('option', l(:label_none), :value => 'none') +
|
| 34 |
options_from_collection_for_select(@project.versions.open.sort, :id, :name)) %></label>
|
|
| 34 |
options_for_select(shared_version_options(@project))) %></label>
|
|
| 35 | 35 |
</p> |
| 36 | 36 | |
| 37 | 37 |
<p> |
| app/views/issues/context_menu.rhtml | ||
|---|---|---|
| 38 | 38 |
<% end -%> |
| 39 | 39 |
</ul> |
| 40 | 40 |
</li> |
| 41 |
<% unless @project.nil? || @project.versions.open.empty? -%>
|
|
| 41 |
<% unless @project.nil? || @project.shared_versions.empty? -%>
|
|
| 42 | 42 |
<li class="folder"> |
| 43 | 43 |
<a href="#" class="submenu"><%= l(:field_fixed_version) %></a> |
| 44 | 44 |
<ul> |
| 45 |
<% @project.versions.open.sort.each do |v| -%>
|
|
| 46 |
<li><%= context_menu_link v.name, {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id), 'fixed_version_id' => v, :back_to => @back}, :method => :post,
|
|
| 45 |
<% @project.shared_versions.sort.each do |v| -%>
|
|
| 46 |
<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,
|
|
| 47 | 47 |
:selected => (@issue && v == @issue.fixed_version), :disabled => !@can[:update] %></li> |
| 48 | 48 |
<% end -%> |
| 49 | 49 |
<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(:text_journal_set_to, :label => l(:field_fixed_version), :value => 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(:text_journal_set_to, :label => l(:field_fixed_version), :value => 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 | ||
|---|---|---|
| 33 | 33 |
<label><%= check_box_tag "tracker_ids[]", tracker.id, (@selected_tracker_ids.include? tracker.id.to_s) %> |
| 34 | 34 |
<%= tracker.name %></label><br /> |
| 35 | 35 |
<% end %> |
| 36 |
<br /> |
|
| 37 |
<label for="shared_versions"><%= check_box_tag "shared_versions", 1, params[:shared_versions] %> <%= l(:label_show_shared_versions) %></label> |
|
| 36 | 38 |
<p><%= submit_tag l(:button_apply), :class => 'button-small' %></p> |
| 37 | 39 |
<% end %> |
| 38 | 40 | |
| 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="shared_versions"><%= check_box_tag "shared_versions", 1, params[:shared_versions] %> <%= l(:label_show_shared_versions) %></label> |
|
| 42 | 44 |
<p><%= submit_tag l(:button_apply), :class => 'button-small', :name => nil %></p> |
| 43 | 45 |
<% end %> |
| 44 | 46 | |
| app/views/projects/settings/_versions.rhtml | ||
|---|---|---|
| 5 | 5 |
<th><%= l(:field_effective_date) %></th> |
| 6 | 6 |
<th><%= l(:field_description) %></th> |
| 7 | 7 |
<th><%= l(:field_status) %></th> |
| 8 |
<th><%= l(:field_shared) %></th> |
|
| 8 | 9 |
<th><%= l(:label_wiki_page) unless @project.wiki.nil? %></th> |
| 9 | 10 |
<th style="width:15%"></th> |
| 10 | 11 |
</thead> |
| ... | ... | |
| 15 | 16 |
<td align="center"><%= format_date(version.effective_date) %></td> |
| 16 | 17 |
<td><%=h version.description %></td> |
| 17 | 18 |
<td><%= l("version_status_#{version.status}") %></td>
|
| 19 |
<td><%=h format_version_sharing_name(version) %></td> |
|
| 18 | 20 |
<td><%= link_to(h(version.wiki_page_title), :controller => 'wiki', :page => Wiki.titleize(version.wiki_page_title)) unless version.wiki_page_title.blank? || @project.wiki.nil? %></td> |
| 19 | 21 |
<td class="buttons"> |
| 20 | 22 |
<%= link_to_if_authorized l(:button_edit), {:controller => 'versions', :action => 'edit', :id => version }, :class => 'icon icon-edit' %>
|
| app/views/versions/_form.rhtml | ||
|---|---|---|
| 6 | 6 |
<p><%= f.select :status, Version::VERSION_STATUSES.collect {|s| [l("version_status_#{s}"), s]} %></p>
|
| 7 | 7 |
<p><%= f.text_field :wiki_page_title, :label => :label_wiki_page, :size => 60, :disabled => @project.wiki.nil? %></p> |
| 8 | 8 |
<p><%= f.text_field :effective_date, :size => 10 %><%= calendar_for('version_effective_date') %></p>
|
| 9 |
<p><%= f.select :shared, Version::SharedValues.collect {|v| [l(v[1]),v[0]]} %></p>
|
|
| 9 | 10 | |
| 10 | 11 |
<% @version.custom_field_values.each do |value| %> |
| 11 | 12 |
<p><%= custom_field_tag_with_label :version, value %></p> |
| 12 | 13 |
<% end %> |
| 14 | ||
| 13 | 15 |
</div> |
| config/locales/bg.yml | ||
|---|---|---|
| 835 | 835 |
button_move_and_follow: Move and follow |
| 836 | 836 |
setting_default_projects_modules: Default enabled modules for new projects |
| 837 | 837 |
setting_gravatar_default: Default Gravatar image |
| 838 |
label_version_shared_none: None |
|
| 839 |
text_not_authorized: You are not authorized to view this. |
|
| 840 |
field_shared: Shared |
|
| 841 |
label_version_shared_systemwide: Systemwide |
|
| 842 |
label_show_shared_versions: Show shared versions |
|
| 843 |
label_version_shared_hierarchy: Parent and child projects |
|
| config/locales/bs.yml | ||
|---|---|---|
| 859 | 859 |
button_move_and_follow: Move and follow |
| 860 | 860 |
setting_default_projects_modules: Default enabled modules for new projects |
| 861 | 861 |
setting_gravatar_default: Default Gravatar image |
| 862 |
label_version_shared_none: None |
|
| 863 |
text_not_authorized: You are not authorized to view this. |
|
| 864 |
field_shared: Shared |
|
| 865 |
label_version_shared_systemwide: Systemwide |
|
| 866 |
label_show_shared_versions: Show shared versions |
|
| 867 |
label_version_shared_hierarchy: Parent and child projects |
|
| config/locales/ca.yml | ||
|---|---|---|
| 838 | 838 |
button_move_and_follow: Move and follow |
| 839 | 839 |
setting_default_projects_modules: Default enabled modules for new projects |
| 840 | 840 |
setting_gravatar_default: Default Gravatar image |
| 841 |
label_version_shared_none: None |
|
| 842 |
text_not_authorized: You are not authorized to view this. |
|
| 843 |
field_shared: Shared |
|
| 844 |
label_version_shared_systemwide: Systemwide |
|
| 845 |
label_show_shared_versions: Show shared versions |
|
| 846 |
label_version_shared_hierarchy: Parent and child projects |
|
| config/locales/cs.yml | ||
|---|---|---|
| 841 | 841 |
button_move_and_follow: Move and follow |
| 842 | 842 |
setting_default_projects_modules: Default enabled modules for new projects |
| 843 | 843 |
setting_gravatar_default: Default Gravatar image |
| 844 |
label_version_shared_none: None |
|
| 845 |
text_not_authorized: You are not authorized to view this. |
|
| 846 |
field_shared: Shared |
|
| 847 |
label_version_shared_systemwide: Systemwide |
|
| 848 |
label_show_shared_versions: Show shared versions |
|
| 849 |
label_version_shared_hierarchy: Parent and child projects |
|
| config/locales/da.yml | ||
|---|---|---|
| 861 | 861 |
button_move_and_follow: Move and follow |
| 862 | 862 |
setting_default_projects_modules: Default enabled modules for new projects |
| 863 | 863 |
setting_gravatar_default: Default Gravatar image |
| 864 |
label_version_shared_none: None |
|
| 865 |
text_not_authorized: You are not authorized to view this. |
|
| 866 |
field_shared: Shared |
|
| 867 |
label_version_shared_systemwide: Systemwide |
|
| 868 |
label_show_shared_versions: Show shared versions |
|
| 869 |
label_version_shared_hierarchy: Parent and child projects |
|
| config/locales/de.yml | ||
|---|---|---|
| 861 | 861 |
button_move_and_follow: Move and follow |
| 862 | 862 |
setting_default_projects_modules: Default enabled modules for new projects |
| 863 | 863 |
setting_gravatar_default: Default Gravatar image |
| 864 |
label_version_shared_none: None |
|
| 865 |
text_not_authorized: You are not authorized to view this. |
|
| 866 |
field_shared: Shared |
|
| 867 |
label_version_shared_systemwide: Systemwide |
|
| 868 |
label_show_shared_versions: Show shared versions |
|
| 869 |
label_version_shared_hierarchy: Parent and child projects |
|
| config/locales/el.yml | ||
|---|---|---|
| 841 | 841 |
button_move_and_follow: Move and follow |
| 842 | 842 |
setting_default_projects_modules: Default enabled modules for new projects |
| 843 | 843 |
setting_gravatar_default: Default Gravatar image |
| 844 |
label_version_shared_none: None |
|
| 845 |
text_not_authorized: You are not authorized to view this. |
|
| 846 |
field_shared: Shared |
|
| 847 |
label_version_shared_systemwide: Systemwide |
|
| 848 |
label_show_shared_versions: Show shared versions |
|
| 849 |
label_version_shared_hierarchy: Parent and child projects |
|
| config/locales/en.yml | ||
|---|---|---|
| 267 | 267 |
field_identity_url: OpenID URL |
| 268 | 268 |
field_content: Content |
| 269 | 269 |
field_group_by: Group results by |
| 270 |
field_shared: Shared |
|
| 270 | 271 |
|
| 271 | 272 |
setting_app_title: Application title |
| 272 | 273 |
setting_app_subtitle: Application subtitle |
| ... | ... | |
| 639 | 640 |
label_stay_logged_in: Stay logged in |
| 640 | 641 |
label_disabled: disabled |
| 641 | 642 |
label_show_completed_versions: Show completed versions |
| 643 |
label_show_shared_versions: Show shared versions |
|
| 642 | 644 |
label_me: me |
| 643 | 645 |
label_board: Forum |
| 644 | 646 |
label_board_new: New forum |
| ... | ... | |
| 709 | 711 |
label_group_plural: Groups |
| 710 | 712 |
label_group_new: New group |
| 711 | 713 |
label_time_entry_plural: Spent time |
| 714 |
label_version_shared_none: None |
|
| 715 |
label_version_shared_hierarchy: "Parent and child projects" |
|
| 716 |
label_version_shared_systemwide: "Systemwide" |
|
| 712 | 717 |
|
| 713 | 718 |
button_login: Login |
| 714 | 719 |
button_submit: Submit |
| ... | ... | |
| 814 | 819 |
text_wiki_page_nullify_children: "Keep child pages as root pages" |
| 815 | 820 |
text_wiki_page_destroy_children: "Delete child pages and all their descendants" |
| 816 | 821 |
text_wiki_page_reassign_children: "Reassign child pages to this parent page" |
| 822 |
text_not_authorized: You are not authorized to view this. |
|
| 823 | ||
| 817 | 824 |
|
| 818 | 825 |
default_role_manager: Manager |
| 819 | 826 |
default_role_developper: Developer |
| config/locales/es.yml | ||
|---|---|---|
| 882 | 882 |
button_move_and_follow: Move and follow |
| 883 | 883 |
setting_default_projects_modules: Default enabled modules for new projects |
| 884 | 884 |
setting_gravatar_default: Default Gravatar image |
| 885 |
label_version_shared_none: None |
|
| 886 |
text_not_authorized: You are not authorized to view this. |
|
| 887 |
field_shared: Shared |
|
| 888 |
label_version_shared_systemwide: Systemwide |
|
| 889 |
label_show_shared_versions: Show shared versions |
|
| 890 |
label_version_shared_hierarchy: Parent and child projects |
|
| config/locales/fi.yml | ||
|---|---|---|
| 871 | 871 |
button_move_and_follow: Move and follow |
| 872 | 872 |
setting_default_projects_modules: Default enabled modules for new projects |
| 873 | 873 |
setting_gravatar_default: Default Gravatar image |
| 874 |
label_version_shared_none: None |
|
| 875 |
text_not_authorized: You are not authorized to view this. |
|
| 876 |
field_shared: Shared |
|
| 877 |
label_version_shared_systemwide: Systemwide |
|
| 878 |
label_show_shared_versions: Show shared versions |
|
| 879 |
label_version_shared_hierarchy: Parent and child projects |
|
| config/locales/fr.yml | ||
|---|---|---|
| 864 | 864 |
field_active: Actif |
| 865 | 865 |
enumeration_system_activity: Activité système |
| 866 | 866 |
setting_gravatar_default: Default Gravatar image |
| 867 |
label_version_shared_none: None |
|
| 868 |
text_not_authorized: You are not authorized to view this. |
|
| 869 |
field_shared: Shared |
|
| 870 |
label_version_shared_systemwide: Systemwide |
|
| 871 |
label_show_shared_versions: Show shared versions |
|
| 872 |
label_version_shared_hierarchy: Parent and child projects |
|
| config/locales/gl.yml | ||
|---|---|---|
| 861 | 861 |
button_move_and_follow: Move and follow |
| 862 | 862 |
setting_default_projects_modules: Default enabled modules for new projects |
| 863 | 863 |
setting_gravatar_default: Default Gravatar image |
| 864 |
label_version_shared_none: None |
|
| 865 |
text_not_authorized: You are not authorized to view this. |
|
| 866 |
field_shared: Shared |
|
| 867 |
label_version_shared_systemwide: Systemwide |
|
| 868 |
label_show_shared_versions: Show shared versions |
|
| 869 |
label_version_shared_hierarchy: Parent and child projects |
|
| config/locales/he.yml | ||
|---|---|---|
| 845 | 845 |
button_move_and_follow: Move and follow |
| 846 | 846 |
setting_default_projects_modules: Default enabled modules for new projects |
| 847 | 847 |
setting_gravatar_default: Default Gravatar image |
| 848 |
label_version_shared_none: None |
|
| 849 |
text_not_authorized: You are not authorized to view this. |
|
| 850 |
field_shared: Shared |
|
| 851 |
label_version_shared_systemwide: Systemwide |
|
| 852 |
label_show_shared_versions: Show shared versions |
|
| 853 |
label_version_shared_hierarchy: Parent and child projects |
|
| config/locales/hu.yml | ||
|---|---|---|
| 866 | 866 |
button_move_and_follow: Move and follow |
| 867 | 867 |
setting_default_projects_modules: Default enabled modules for new projects |
| 868 | 868 |
setting_gravatar_default: Default Gravatar image |
| 869 |
label_version_shared_none: None |
|
| 870 |
text_not_authorized: You are not authorized to view this. |
|
| 871 |
field_shared: Shared |
|
| 872 |
label_version_shared_systemwide: Systemwide |
|
| 873 |
label_show_shared_versions: Show shared versions |
|
| 874 |
label_version_shared_hierarchy: Parent and child projects |
|
| config/locales/it.yml | ||
|---|---|---|
| 848 | 848 |
button_move_and_follow: Move and follow |
| 849 | 849 |
setting_default_projects_modules: Default enabled modules for new projects |
| 850 | 850 |
setting_gravatar_default: Default Gravatar image |
| 851 |
label_version_shared_none: None |
|
| 852 |
text_not_authorized: You are not authorized to view this. |
|
| 853 |
field_shared: Shared |
|
| 854 |
label_version_shared_systemwide: Systemwide |
|
| 855 |
label_show_shared_versions: Show shared versions |
|
| 856 |
label_version_shared_hierarchy: Parent and child projects |
|
| config/locales/ja.yml | ||
|---|---|---|
| 870 | 870 |
button_move_and_follow: Move and follow |
| 871 | 871 |
setting_default_projects_modules: Default enabled modules for new projects |
| 872 | 872 |
setting_gravatar_default: Default Gravatar image |
| 873 |
label_version_shared_none: None |
|
| 874 |
text_not_authorized: You are not authorized to view this. |
|
| 875 |
field_shared: Shared |
|
| 876 |
label_version_shared_systemwide: Systemwide |
|
| 877 |
label_show_shared_versions: Show shared versions |
|
| 878 |
label_version_shared_hierarchy: Parent and child projects |
|
| config/locales/ko.yml | ||
|---|---|---|
| 901 | 901 |
button_move_and_follow: Move and follow |
| 902 | 902 |
setting_default_projects_modules: Default enabled modules for new projects |
| 903 | 903 |
setting_gravatar_default: Default Gravatar image |
| 904 |
label_version_shared_none: None |
|
| 905 |
text_not_authorized: You are not authorized to view this. |
|
| 906 |
field_shared: Shared |
|
| 907 |
label_version_shared_systemwide: Systemwide |
|
| 908 |
label_show_shared_versions: Show shared versions |
|
| 909 |
label_version_shared_hierarchy: Parent and child projects |
|
| config/locales/lt.yml | ||
|---|---|---|
| 871 | 871 |
button_move_and_follow: Move and follow |
| 872 | 872 |
setting_default_projects_modules: Default enabled modules for new projects |
| 873 | 873 |
setting_gravatar_default: Default Gravatar image |
| 874 |
label_version_shared_none: None |
|
| 875 |
text_not_authorized: You are not authorized to view this. |
|
| 876 |
field_shared: Shared |
|
| 877 |
label_version_shared_systemwide: Systemwide |
|
| 878 |
label_show_shared_versions: Show shared versions |
|
| 879 |
label_version_shared_hierarchy: Parent and child projects |
|
| config/locales/nl.yml | ||
|---|---|---|
| 823 | 823 |
button_move_and_follow: Move and follow |
| 824 | 824 |
setting_default_projects_modules: Default enabled modules for new projects |
| 825 | 825 |
setting_gravatar_default: Default Gravatar image |
| 826 |
label_version_shared_none: None |
|
| 827 |
text_not_authorized: You are not authorized to view this. |
|
| 828 |
field_shared: Shared |
|
| 829 |
label_version_shared_systemwide: Systemwide |
|
| 830 |
label_show_shared_versions: Show shared versions |
|
| 831 |
label_version_shared_hierarchy: Parent and child projects |
|
| config/locales/no.yml | ||
|---|---|---|
| 836 | 836 |
button_move_and_follow: Move and follow |
| 837 | 837 |
setting_default_projects_modules: Default enabled modules for new projects |
| 838 | 838 |
setting_gravatar_default: Default Gravatar image |
| 839 |
label_version_shared_none: None |
|
| 840 |
text_not_authorized: You are not authorized to view this. |
|
| 841 |
field_shared: Shared |
|
| 842 |
label_version_shared_systemwide: Systemwide |
|
| 843 |
label_show_shared_versions: Show shared versions |
|
| 844 |
label_version_shared_hierarchy: Parent and child projects |
|
| config/locales/pl.yml | ||
|---|---|---|
| 864 | 864 |
button_move_and_follow: Move and follow |
| 865 | 865 |
setting_default_projects_modules: Default enabled modules for new projects |
| 866 | 866 |
setting_gravatar_default: Default Gravatar image |
| 867 |
label_version_shared_none: None |
|
| 868 |
text_not_authorized: You are not authorized to view this. |
|
| 869 |
field_shared: Shared |
|
| 870 |
label_version_shared_systemwide: Systemwide |
|
| 871 |
label_show_shared_versions: Show shared versions |
|
| 872 |
label_version_shared_hierarchy: Parent and child projects |
|
| config/locales/pt-BR.yml | ||
|---|---|---|
| 867 | 867 |
button_move_and_follow: Mover e seguir |
| 868 | 868 |
setting_default_projects_modules: Módulos habilitados por padrão para novos projetos |
| 869 | 869 |
setting_gravatar_default: Imagem Gravatar padrão |
| 870 |
label_version_shared_none: None |
|
| 871 |
text_not_authorized: You are not authorized to view this. |
|
| 872 |
field_shared: Shared |
|
| 873 |
label_version_shared_systemwide: Systemwide |
|
| 874 |
label_show_shared_versions: Show shared versions |
|
| 875 |
label_version_shared_hierarchy: Parent and child projects |
|
| config/locales/pt.yml | ||
|---|---|---|
| 853 | 853 |
button_move_and_follow: Move and follow |
| 854 | 854 |
setting_default_projects_modules: Default enabled modules for new projects |
| 855 | 855 |
setting_gravatar_default: Default Gravatar image |
| 856 |
label_version_shared_none: None |
|
| 857 |
text_not_authorized: You are not authorized to view this. |
|
| 858 |
field_shared: Shared |
|
| 859 |
label_version_shared_systemwide: Systemwide |
|
| 860 |
label_show_shared_versions: Show shared versions |
|
| 861 |
label_version_shared_hierarchy: Parent and child projects |
|
| config/locales/ro.yml | ||
|---|---|---|
| 838 | 838 |
button_move_and_follow: Move and follow |
| 839 | 839 |
setting_default_projects_modules: Default enabled modules for new projects |
| 840 | 840 |
setting_gravatar_default: Default Gravatar image |
| 841 |
label_version_shared_none: None |
|
| 842 |
text_not_authorized: You are not authorized to view this. |
|
| 843 |
field_shared: Shared |
|
| 844 |
label_version_shared_systemwide: Systemwide |
|
| 845 |
label_show_shared_versions: Show shared versions |
|
| 846 |
label_version_shared_hierarchy: Parent and child projects |
|
| config/locales/ru.yml | ||
|---|---|---|
| 949 | 949 |
button_move_and_follow: Переместить и перейти |
| 950 | 950 |
setting_default_projects_modules: Включенные по умолчанию модули для новых проектов |
| 951 | 951 |
setting_gravatar_default: Изображение Gravatar по умолчанию |
| 952 |
label_version_shared_none: None |
|
| 953 |
text_not_authorized: You are not authorized to view this. |
|
| 954 |
field_shared: Shared |
|
| 955 |
label_version_shared_systemwide: Systemwide |
|
| 956 |
label_show_shared_versions: Show shared versions |
|
| 957 |
label_version_shared_hierarchy: Parent and child projects |
|
| config/locales/sk.yml | ||
|---|---|---|
| 840 | 840 |
button_move_and_follow: Move and follow |
| 841 | 841 |
setting_default_projects_modules: Default enabled modules for new projects |
| 842 | 842 |
setting_gravatar_default: Default Gravatar image |
| 843 |
label_version_shared_none: None |
|
| 844 |
text_not_authorized: You are not authorized to view this. |
|
| 845 |
field_shared: Shared |
|
| 846 |
label_version_shared_systemwide: Systemwide |
|
| 847 |
label_show_shared_versions: Show shared versions |
|
| 848 |
label_version_shared_hierarchy: Parent and child projects |
|
| config/locales/sl.yml | ||
|---|---|---|
| 837 | 837 |
button_move_and_follow: Move and follow |
| 838 | 838 |
setting_default_projects_modules: Default enabled modules for new projects |
| 839 | 839 |
setting_gravatar_default: Default Gravatar image |
| 840 |
label_version_shared_none: None |
|
| 841 |
text_not_authorized: You are not authorized to view this. |
|
| 842 |
field_shared: Shared |
|
| 843 |
label_version_shared_systemwide: Systemwide |
|
| 844 |
label_show_shared_versions: Show shared versions |
|
| 845 |
label_version_shared_hierarchy: Parent and child projects |
|
| config/locales/sr.yml | ||
|---|---|---|
| 856 | 856 |
button_move_and_follow: Move and follow |
| 857 | 857 |
setting_default_projects_modules: Default enabled modules for new projects |
| 858 | 858 |
setting_gravatar_default: Default Gravatar image |
| 859 |
label_version_shared_none: None |
|
| 860 |
text_not_authorized: You are not authorized to view this. |
|
| 861 |
field_shared: Shared |
|
| 862 |
label_version_shared_systemwide: Systemwide |
|
| 863 |
label_show_shared_versions: Show shared versions |
|
| 864 |
label_version_shared_hierarchy: Parent and child projects |
|
| config/locales/sv.yml | ||
|---|---|---|
| 889 | 889 |
button_move_and_follow: Move and follow |
| 890 | 890 |
setting_default_projects_modules: Default enabled modules for new projects |
| 891 | 891 |
setting_gravatar_default: Default Gravatar image |
| 892 |
label_version_shared_none: None |
|
| 893 |
text_not_authorized: You are not authorized to view this. |
|
| 894 |
field_shared: Shared |
|
| 895 |
label_version_shared_systemwide: Systemwide |
|
| 896 |
label_show_shared_versions: Show shared versions |
|
| 897 |
label_version_shared_hierarchy: Parent and child projects |
|
| config/locales/th.yml | ||
|---|---|---|
| 838 | 838 |
button_move_and_follow: Move and follow |
| 839 | 839 |
setting_default_projects_modules: Default enabled modules for new projects |
| 840 | 840 |
setting_gravatar_default: Default Gravatar image |
| 841 |
label_version_shared_none: None |
|
| 842 |
text_not_authorized: You are not authorized to view this. |
|
| 843 |
field_shared: Shared |
|
| 844 |
label_version_shared_systemwide: Systemwide |
|
| 845 |
label_show_shared_versions: Show shared versions |
|
| 846 |
label_version_shared_hierarchy: Parent and child projects |
|
| config/locales/tr.yml | ||
|---|---|---|
| 868 | 868 |
button_move_and_follow: Move and follow |
| 869 | 869 |
setting_default_projects_modules: Default enabled modules for new projects |
| 870 | 870 |
setting_gravatar_default: Default Gravatar image |
| 871 |
label_version_shared_none: None |
|
| 872 |
text_not_authorized: You are not authorized to view this. |
|
| 873 |
field_shared: Shared |
|
| 874 |
label_version_shared_systemwide: Systemwide |
|
| 875 |
label_show_shared_versions: Show shared versions |
|
| 876 |
label_version_shared_hierarchy: Parent and child projects |
|
| config/locales/uk.yml | ||
|---|---|---|
| 837 | 837 |
button_move_and_follow: Move and follow |
| 838 | 838 |
setting_default_projects_modules: Default enabled modules for new projects |
| 839 | 839 |
setting_gravatar_default: Default Gravatar image |
| 840 |
label_version_shared_none: None |
|
| 841 |
text_not_authorized: You are not authorized to view this. |
|
| 842 |
field_shared: Shared |
|
| 843 |
label_version_shared_systemwide: Systemwide |
|
| 844 |
label_show_shared_versions: Show shared versions |
|
| 845 |
label_version_shared_hierarchy: Parent and child projects |
|
| config/locales/vi.yml | ||
|---|---|---|
| 900 | 900 |
button_move_and_follow: Move and follow |
| 901 | 901 |
setting_default_projects_modules: Default enabled modules for new projects |
| 902 | 902 |
setting_gravatar_default: Default Gravatar image |
| 903 |
label_version_shared_none: None |
|
| 904 |
text_not_authorized: You are not authorized to view this. |
|
| 905 |
field_shared: Shared |
|
| 906 |
label_version_shared_systemwide: Systemwide |
|
| 907 |
label_show_shared_versions: Show shared versions |
|
| 908 |
label_version_shared_hierarchy: Parent and child projects |
|
| config/locales/zh-TW.yml | ||
|---|---|---|
| 932 | 932 |
enumeration_doc_categories: 文件分類 |
| 933 | 933 |
enumeration_activities: 活動 (時間追蹤) |
| 934 | 934 |
enumeration_system_activity: 系統活動 |
| 935 |
label_version_shared_none: None |
|
| 936 |
text_not_authorized: You are not authorized to view this. |
|
| 937 |
field_shared: Shared |
|
| 938 |
label_version_shared_systemwide: Systemwide |
|
| 939 |
label_show_shared_versions: Show shared versions |
|
| 940 |
label_version_shared_hierarchy: Parent and child projects |
|
| config/locales/zh.yml | ||
|---|---|---|
| 865 | 865 |
button_move_and_follow: Move and follow |
| 866 | 866 |
setting_default_projects_modules: Default enabled modules for new projects |
| 867 | 867 |
setting_gravatar_default: Default Gravatar image |
| 868 |
label_version_shared_none: None |
|
| 869 |
text_not_authorized: You are not authorized to view this. |
|
| 870 |
field_shared: Shared |
|
| 871 |
label_version_shared_systemwide: Systemwide |
|
| 872 |
label_show_shared_versions: Show shared versions |
|
| 873 |
label_version_shared_hierarchy: Parent and child projects |
|
| db/migrate/20090907153556_add_shared_to_versions.rb | ||
|---|---|---|
| 1 |
class AddSharedToVersions < ActiveRecord::Migration |
|
| 2 |
def self.up |
|
| 3 |
add_column :versions, :shared, :string, :default => 'none', :null => false |
|
| 4 |
add_index :versions, :shared |
|
| 5 |
end |
|
| 6 | ||
| 7 |
def self.down |
|
| 8 |
remove_column :versions, :shared |
|
| 9 |
end |
|
| 10 |
end |
|
| db/migrate/20090907170038_populate_version_shared.rb | ||
|---|---|---|
| 1 |
class PopulateVersionShared < ActiveRecord::Migration |
|
| 2 |
def self.up |
|
| 3 |
Version.update_all('shared = \'none\'', ['shared IS NULL OR shared = ?',''])
|
|
| 4 |
end |
|
| 5 | ||
| 6 |
def self.down |
|
| 7 |
# No-op |
|
| 8 |
end |
|
| 9 |
end |
|
| lib/redmine.rb | ||
|---|---|---|
| 142 | 142 |
menu.push :overview, { :controller => 'projects', :action => 'show' }
|
| 143 | 143 |
menu.push :activity, { :controller => 'projects', :action => 'activity' }
|
| 144 | 144 |
menu.push :roadmap, { :controller => 'projects', :action => 'roadmap' },
|
| 145 |
:if => Proc.new { |p| p.versions.any? }
|
|
| 145 |
:if => Proc.new { |p| p.shared_versions_visible_to_user.any? }
|
|
| 146 | 146 |
menu.push :issues, { :controller => 'issues', :action => 'index' }, :param => :project_id, :caption => :label_issue_plural
|
| 147 | 147 |
menu.push :new_issue, { :controller => 'issues', :action => 'new' }, :param => :project_id, :caption => :label_issue_new,
|
| 148 | 148 |
:html => { :accesskey => Redmine::AccessKeys.key_for(:new_issue) }
|
| test/exemplars/version_exemplar.rb | ||
|---|---|---|
| 1 | 1 |
class Version < ActiveRecord::Base |
| 2 | 2 |
generator_for :name, :method => :next_name |
| 3 |
generator_for :status => 'open' |
|
| 3 | 4 |
|
| 4 | 5 |
def self.next_name |
| 5 | 6 |
@last_name ||= 'Version 1.0.0' |
| test/fixtures/attachments.yml | ||
|---|---|---|
| 133 | 133 |
filename: picture.jpg |
| 134 | 134 |
author_id: 2 |
| 135 | 135 |
content_type: image/jpeg |
| 136 |
|
|
| 136 |
attachments_012: |
|
| 137 |
created_on: 2006-07-19 21:07:27 +02:00 |
|
| 138 |
container_type: Version |
|
| 139 |
container_id: 1 |
|
| 140 |
downloads: 0 |
|
| 141 |
disk_filename: 060719210727_version_file.zip |
|
| 142 |
digest: b91e08d0cf966d5c6ff411bd8c4cc3a2 |
|
| 143 |
id: 12 |
|
| 144 |
filesize: 452 |
|
| 145 |
filename: version_file.zip |
|
| 146 |
author_id: 2 |
|
| 147 |
content_type: application/octet-stream |
|
| test/fixtures/issues.yml | ||
|---|---|---|
| 189 | 189 |
status_id: 5 |
| 190 | 190 |
start_date: <%= 1.day.ago.to_date.to_s(:db) %> |
| 191 | 191 |
due_date: |
| 192 |
issues_013: |
|
| 193 |
created_on: <%= 5.days.ago.to_date.to_s(:db) %> |
|
| 194 |
project_id: 3 |
|
| 195 |
updated_on: <%= 2.days.ago.to_date.to_s(:db) %> |
|
| 196 |
priority_id: 4 |
|
| 197 |
subject: Subproject issue two |
|
| 198 |
id: 13 |
|
| 199 |
fixed_version_id: |
|
| 200 |
category_id: |
|
| 201 |
description: This is a second issue on a cookbook subproject |
|
| 202 |
tracker_id: 1 |
|
| 203 |
assigned_to_id: |
|
| 204 |
author_id: 2 |
|
| 205 |
status_id: 1 |
|
| 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 |
|
| test/fixtures/members.yml | ||
|---|---|---|
| 42 | 42 |
project_id: 5 |
| 43 | 43 |
user_id: 8 |
| 44 | 44 |
mail_notification: false |
| 45 |
|
|
| 45 |
members_008: |
|
| 46 |
created_on: 2006-07-19 19:35:33 +02:00 |
|
| 47 |
project_id: 5 |
|
| 48 |
id: 8 |
|
| 49 |
user_id: 1 |
|
| 50 |
mail_notification: true |
|
| test/fixtures/versions.yml | ||
|---|---|---|
| 1 |
--- |
|
| 2 |
versions_001: |
|
| 3 |
created_on: 2006-07-19 21:00:07 +02:00 |
|
| 4 |
name: "0.1" |
|
| 5 |
project_id: 1 |
|
| 6 |
updated_on: 2006-07-19 21:00:07 +02:00 |
|
| 7 |
id: 1 |
|
| 8 |
description: Beta |
|
| 9 |
effective_date: 2006-07-01 |
|
| 10 |
status: closed |
|
| 11 |
versions_002: |
|
| 12 |
created_on: 2006-07-19 21:00:33 +02:00 |
|
| 13 |
name: "1.0" |
|
| 14 |
project_id: 1 |
|
| 15 |
updated_on: 2006-07-19 21:00:33 +02:00 |
|
| 16 |
id: 2 |
|
| 17 |
description: Stable release |
|
| 18 |
effective_date: <%= 20.day.from_now.to_date.to_s(:db) %> |
|
| 19 |
status: locked |
|
| 20 |
versions_003: |
|
| 21 |
created_on: 2006-07-19 21:00:33 +02:00 |
|
| 22 |
name: "2.0" |
|
| 23 |
project_id: 1 |
|
| 24 |
updated_on: 2006-07-19 21:00:33 +02:00 |
|
| 25 |
id: 3 |
|
| 26 |
description: Future version |
|
| 27 |
effective_date: |
|
| 28 |
status: open |
|
| 29 |
|
|
| 1 |
--- |
|
| 2 |
versions_001: |
|
| 3 |
created_on: 2006-07-19 21:00:07 +02:00 |
|
| 4 |
name: "0.1" |
|
| 5 |
project_id: 1 |
|
| 6 |
updated_on: 2006-07-19 21:00:07 +02:00 |
|
| 7 |
id: 1 |
|
| 8 |
description: Beta |
|
| 9 |
effective_date: 2006-07-01 |
|
| 10 |
status: closed |
|
| 11 |
shared: 'none' |
|
| 12 |
versions_002: |
|
| 13 |
created_on: 2006-07-19 21:00:33 +02:00 |
|
| 14 |
name: "1.0" |
|
| 15 |
project_id: 1 |
|
| 16 |
updated_on: 2006-07-19 21:00:33 +02:00 |
|
| 17 |
id: 2 |
|
| 18 |
description: Stable release |
|
| 19 |
effective_date: <%= 20.day.from_now.to_date.to_s(:db) %> |
|
| 20 |
status: locked |
|
| 21 |
shared: 'none' |
|
| 22 |
versions_003: |
|
| 23 |
created_on: 2006-07-19 21:00:33 +02:00 |
|
| 24 |
name: "2.0" |
|
| 25 |
project_id: 1 |
|
| 26 |
updated_on: 2006-07-19 21:00:33 +02:00 |
|
| 27 |
id: 3 |
|
| 28 |
description: Future version |
|
| 29 |
effective_date: |
|
| 30 |
status: open |
|
| 31 |
shared: 'none' |
|
| 32 |
versions_004: |
|
| 33 |
created_on: 2006-07-19 21:00:33 +02:00 |
|
| 34 |
name: "2.0" |
|
| 35 |
project_id: 3 |
|
| 36 |
updated_on: 2006-07-19 21:00:33 +02:00 |
|
| 37 |
id: 4 |
|
| 38 |
description: Future version on subproject |
|
| 39 |
effective_date: |
|
| 40 |
status: open |
|
| 41 |
shared: 'hierarchy' |
|
| 42 |
versions_005: |
|
| 43 |
created_on: 2006-07-19 21:00:07 +02:00 |
|
| 44 |
name: "Alpha" |
|
| 45 |
project_id: 2 |
|
| 46 |
updated_on: 2006-07-19 21:00:07 +02:00 |
|
| 47 |
id: 5 |
|
| 48 |
description: Private Alpha |
|
| 49 |
effective_date: 2006-07-01 |
|
| 50 |
status: open |
|
| 51 |
shared: 'none' |
|
| 52 |
versions_006: |
|
| 53 |
created_on: 2006-07-19 21:00:07 +02:00 |
|
| 54 |
name: "Private Version of public subproject" |
|
| 55 |
project_id: 5 |
|
| 56 |
updated_on: 2006-07-19 21:00:07 +02:00 |
|
| 57 |
id: 6 |
|
| 58 |
description: "Should be done any day now..." |
|
| 59 |
effective_date: |
|
| 60 |
status: open |
|
| 61 |
shared: 'hierarchy' |
|
| 62 |
versions_007: |
|
| 63 |
created_on: 2006-07-19 21:00:07 +02:00 |
|
| 64 |
name: "Systemwide visible version" |
|
| 65 |
project_id: 2 |
|
| 66 |
updated_on: 2006-07-19 21:00:07 +02:00 |
|
| 67 |
id: 7 |
|
| 68 |
description: |
|
| 69 |
effective_date: |
|
| 70 |
status: open |
|
| 71 |
shared: 'system' |
|
| test/functional/issues_controller_test.rb | ||
|---|---|---|
| 925 | 925 |
assert_tag :input, :attributes => { :name => 'time_entry[hours]', :value => "2z" }
|
| 926 | 926 |
end |
| 927 | 927 |
|
| 928 |
def test_post_edit_should_allow_fixed_version_to_be_set_to_a_subproject |
|
| 929 |
issue = Issue.find(2) |
|
| 930 |
@request.session[:user_id] = 2 |
|
| 931 | ||
| 932 |
post :edit, |
|
| 933 |
:id => issue.id, |
|
| 934 |
:issue => {
|
|
| 935 |
:fixed_version_id => 4 |
|
| 936 |
} |
|
| 937 | ||
| 938 |
assert_response :redirect |
|
| 939 |
issue.reload |
|
| 940 |
assert_equal 4, issue.fixed_version_id |
|
| 941 |
assert_not_equal issue.project_id, issue.fixed_version.project_id |
|
| 942 |
end |
|
| 943 |
|
|
| 928 | 944 |
def test_get_bulk_edit |
| 929 | 945 |
@request.session[:user_id] = 2 |
| 930 | 946 |
get :bulk_edit, :ids => [1, 2] |
| ... | ... | |
| 1005 | 1021 |
assert_nil Issue.find(2).assigned_to |
| 1006 | 1022 |
end |
| 1007 | 1023 |
|
| 1024 |
def test_post_bulk_edit_should_allow_fixed_version_to_be_set_to_a_subproject |
|
| 1025 |
@request.session[:user_id] = 2 |
|
| 1026 | ||
| 1027 |
post :bulk_edit, |
|
| 1028 |
:ids => [1,2], |
|
| 1029 |
:fixed_version_id => 4 |
|
| 1030 | ||
| 1031 |
assert_response :redirect |
|
| 1032 |
issues = Issue.find([1,2]) |
|
| 1033 |
issues.each do |issue| |
|
| 1034 |
assert_equal 4, issue.fixed_version_id |
|
| 1035 |
assert_not_equal issue.project_id, issue.fixed_version.project_id |
|
| 1036 |
end |
|
| 1037 |
end |
|
| 1038 | ||
| 1008 | 1039 |
def test_move_routing |
| 1009 | 1040 |
assert_routing( |
| 1010 | 1041 |
{:method => :get, :path => '/issues/1/move'},
|
| ... | ... | |
| 1080 | 1111 |
assert_tag :tag => 'a', :content => 'Immediate', |
| 1081 | 1112 |
:attributes => { :href => '/issues/bulk_edit?ids%5B%5D=1&priority_id=8',
|
| 1082 | 1113 |
:class => '' } |
| 1114 |
# Versions |
|
| 1115 |
assert_tag :tag => 'a', :content => 'eCookbook - 0.1', |
|
| 1116 |
:attributes => { :href => '/issues/bulk_edit?fixed_version_id=1&ids%5B%5D=1',
|
|
| 1117 |
:class => '' } |
|
| 1118 |
assert_tag :tag => 'a', :content => 'eCookbook - 1.0', |
|
| 1119 |
:attributes => { :href => '/issues/bulk_edit?fixed_version_id=2&ids%5B%5D=1',
|
|
| 1120 |
:class => '' } |
|
| 1121 |
assert_tag :tag => 'a', :content => 'eCookbook Subproject 1 - 2.0', |
|
| 1122 |
:attributes => { :href => '/issues/bulk_edit?fixed_version_id=4&ids%5B%5D=1',
|
|
| 1123 |
:class => '' } |
|
| 1124 | ||
| 1083 | 1125 |
assert_tag :tag => 'a', :content => 'Dave Lopper', |
| 1084 | 1126 |
:attributes => { :href => '/issues/bulk_edit?assigned_to_id=3&ids%5B%5D=1',
|
- « Previous
- 1
- 2
- 3
- 4
- Next »