Compare commits

..
1 Commits
Author SHA1 Message Date
Jean-Philippe Lang c49155426a tagged version 2.3.0
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/tags/2.3.0@11661 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-03-19 20:30:27 +00:00
118 changed files with 398 additions and 1320 deletions
+2 -3
View File
@@ -3,7 +3,7 @@ source 'https://rubygems.org'
gem "rails", "3.2.13" gem "rails", "3.2.13"
gem "jquery-rails", "~> 2.0.2" gem "jquery-rails", "~> 2.0.2"
gem "i18n", "~> 0.6.0" gem "i18n", "~> 0.6.0"
gem "coderay", "~> 1.0.9" gem "coderay", "~> 1.0.6"
gem "fastercsv", "~> 1.5.0", :platforms => [:mri_18, :mingw_18, :jruby] gem "fastercsv", "~> 1.5.0", :platforms => [:mri_18, :mingw_18, :jruby]
gem "builder", "3.0.0" gem "builder", "3.0.0"
@@ -14,7 +14,7 @@ end
# Optional gem for OpenID authentication # Optional gem for OpenID authentication
group :openid do group :openid do
gem "ruby-openid", "~> 2.2.3", :require => "openid" gem "ruby-openid", "~> 2.1.4", :require => "openid"
gem "rack-openid" gem "rack-openid"
end end
@@ -80,7 +80,6 @@ group :test do
gem "shoulda", "~> 3.3.2" gem "shoulda", "~> 3.3.2"
gem "mocha", "~> 0.13.3" gem "mocha", "~> 0.13.3"
gem 'capybara', '~> 2.0.0' gem 'capybara', '~> 2.0.0'
gem 'nokogiri', '< 1.6.0'
end end
local_gemfile = File.join(File.dirname(__FILE__), "Gemfile.local") local_gemfile = File.join(File.dirname(__FILE__), "Gemfile.local")
+7 -5
View File
@@ -70,12 +70,14 @@ class EnumerationsController < ApplicationController
@enumeration.destroy @enumeration.destroy
redirect_to enumerations_path redirect_to enumerations_path
return return
elsif params[:reassign_to_id].present? && (reassign_to = @enumeration.class.find_by_id(params[:reassign_to_id].to_i)) elsif params[:reassign_to_id]
@enumeration.destroy(reassign_to) if reassign_to = @enumeration.class.find_by_id(params[:reassign_to_id])
redirect_to enumerations_path @enumeration.destroy(reassign_to)
return redirect_to enumerations_path
return
end
end end
@enumerations = @enumeration.class.system.all - [@enumeration] @enumerations = @enumeration.class.all - [@enumeration]
end end
private private
+1
View File
@@ -53,6 +53,7 @@ class MyController < ApplicationController
if request.post? if request.post?
@user.safe_attributes = params[:user] @user.safe_attributes = params[:user]
@user.pref.attributes = params[:pref] @user.pref.attributes = params[:pref]
@user.pref[:no_self_notified] = (params[:no_self_notified] == '1')
if @user.save if @user.save
@user.pref.save @user.pref.save
@user.notified_project_ids = (@user.mail_notification == 'selected' ? params[:notified_project_ids] : []) @user.notified_project_ids = (@user.mail_notification == 'selected' ? params[:notified_project_ids] : [])
+11 -5
View File
@@ -43,10 +43,10 @@ class TimelogController < ApplicationController
def index def index
@query = TimeEntryQuery.build_from_params(params, :project => @project, :name => '_') @query = TimeEntryQuery.build_from_params(params, :project => @project, :name => '_')
scope = time_entry_scope
sort_init(@query.sort_criteria.empty? ? [['spent_on', 'desc']] : @query.sort_criteria) sort_init(@query.sort_criteria.empty? ? [['spent_on', 'desc']] : @query.sort_criteria)
sort_update(@query.sortable_columns) sort_update(@query.sortable_columns)
scope = time_entry_scope(:order => sort_clause)
respond_to do |format| respond_to do |format|
format.html { format.html {
@@ -55,6 +55,7 @@ class TimelogController < ApplicationController
@entry_pages = Paginator.new @entry_count, per_page_option, params['page'] @entry_pages = Paginator.new @entry_count, per_page_option, params['page']
@entries = scope.all( @entries = scope.all(
:include => [:project, :activity, :user, {:issue => :tracker}], :include => [:project, :activity, :user, {:issue => :tracker}],
:order => sort_clause,
:limit => @entry_pages.per_page, :limit => @entry_pages.per_page,
:offset => @entry_pages.offset :offset => @entry_pages.offset
) )
@@ -67,13 +68,15 @@ class TimelogController < ApplicationController
@offset, @limit = api_offset_and_limit @offset, @limit = api_offset_and_limit
@entries = scope.all( @entries = scope.all(
:include => [:project, :activity, :user, {:issue => :tracker}], :include => [:project, :activity, :user, {:issue => :tracker}],
:order => sort_clause,
:limit => @limit, :limit => @limit,
:offset => @offset :offset => @offset
) )
} }
format.atom { format.atom {
entries = scope.reorder("#{TimeEntry.table_name}.created_on DESC").all( entries = scope.all(
:include => [:project, :activity, :user, {:issue => :tracker}], :include => [:project, :activity, :user, {:issue => :tracker}],
:order => "#{TimeEntry.table_name}.created_on DESC",
:limit => Setting.feeds_limit.to_i :limit => Setting.feeds_limit.to_i
) )
render_feed(entries, :title => l(:label_spent_time)) render_feed(entries, :title => l(:label_spent_time))
@@ -81,7 +84,8 @@ class TimelogController < ApplicationController
format.csv { format.csv {
# Export all entries # Export all entries
@entries = scope.all( @entries = scope.all(
:include => [:project, :activity, :user, {:issue => [:tracker, :assigned_to, :priority]}] :include => [:project, :activity, :user, {:issue => [:tracker, :assigned_to, :priority]}],
:order => sort_clause
) )
send_data(query_to_csv(@entries, @query, params), :type => 'text/csv; header=present', :filename => 'timelog.csv') send_data(query_to_csv(@entries, @query, params), :type => 'text/csv; header=present', :filename => 'timelog.csv')
} }
@@ -291,10 +295,12 @@ private
end end
# Returns the TimeEntry scope for index and report actions # Returns the TimeEntry scope for index and report actions
def time_entry_scope(options={}) def time_entry_scope
scope = @query.results_scope(options) scope = TimeEntry.visible.where(@query.statement)
if @issue if @issue
scope = scope.on_issue(@issue) scope = scope.on_issue(@issue)
elsif @project
scope = scope.on_project(@project, Setting.display_subprojects_issues?)
end end
scope scope
end end
+2
View File
@@ -92,6 +92,7 @@ class UsersController < ApplicationController
if @user.save if @user.save
@user.pref.attributes = params[:pref] @user.pref.attributes = params[:pref]
@user.pref[:no_self_notified] = (params[:no_self_notified] == '1')
@user.pref.save @user.pref.save
@user.notified_project_ids = (@user.mail_notification == 'selected' ? params[:notified_project_ids] : []) @user.notified_project_ids = (@user.mail_notification == 'selected' ? params[:notified_project_ids] : [])
@@ -136,6 +137,7 @@ class UsersController < ApplicationController
was_activated = (@user.status_change == [User::STATUS_REGISTERED, User::STATUS_ACTIVE]) was_activated = (@user.status_change == [User::STATUS_REGISTERED, User::STATUS_ACTIVE])
# TODO: Similar to My#account # TODO: Similar to My#account
@user.pref.attributes = params[:pref] @user.pref.attributes = params[:pref]
@user.pref[:no_self_notified] = (params[:no_self_notified] == '1')
if @user.save if @user.save
@user.pref.save @user.pref.save
+2 -6
View File
@@ -471,11 +471,7 @@ module ApplicationHelper
end end
def accesskey(s) def accesskey(s)
@used_accesskeys ||= [] Redmine::AccessKeys.key_for s
key = Redmine::AccessKeys.key_for(s)
return nil if @used_accesskeys.include?(key)
@used_accesskeys << key
key
end end
# Formats text according to system settings. # Formats text according to system settings.
@@ -762,7 +758,7 @@ module ApplicationHelper
if repository && (changeset = Changeset.visible.where("repository_id = ? AND scmid LIKE ?", repository.id, "#{name}%").first) if repository && (changeset = Changeset.visible.where("repository_id = ? AND scmid LIKE ?", repository.id, "#{name}%").first)
link = link_to h("#{project_prefix}#{repo_prefix}#{name}"), {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => project, :repository_id => repository.identifier_param, :rev => changeset.identifier}, link = link_to h("#{project_prefix}#{repo_prefix}#{name}"), {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => project, :repository_id => repository.identifier_param, :rev => changeset.identifier},
:class => 'changeset', :class => 'changeset',
:title => truncate_single_line(changeset.comments, :length => 100) :title => truncate_single_line(h(changeset.comments), :length => 100)
end end
else else
if repository && User.current.allowed_to?(:browse_repository, project) if repository && User.current.allowed_to?(:browse_repository, project)
-22
View File
@@ -214,28 +214,6 @@ module IssuesHelper
out out
end end
def email_issue_attributes(issue)
items = []
%w(author status priority assigned_to category fixed_version).each do |attribute|
unless issue.disabled_core_fields.include?(attribute+"_id")
items << "#{l("field_#{attribute}")}: #{issue.send attribute}"
end
end
issue.custom_field_values.each do |value|
items << "#{value.custom_field.name}: #{show_value(value)}"
end
items
end
def render_email_issue_attributes(issue, html=false)
items = email_issue_attributes(issue)
if html
content_tag('ul', items.map{|s| content_tag('li', s)}.join("\n").html_safe)
else
items.map{|s| "* #{s}"}.join("\n")
end
end
# Returns the textual representation of a journal details # Returns the textual representation of a journal details
# as an array of strings # as an array of strings
def details_to_strings(details, no_html=false, options={}) def details_to_strings(details, no_html=false, options={})
-24
View File
@@ -29,30 +29,6 @@ module QueriesHelper
end end
end end
def query_filters_hidden_tags(query)
tags = ''.html_safe
query.filters.each do |field, options|
tags << hidden_field_tag("f[]", field, :id => nil)
tags << hidden_field_tag("op[#{field}]", options[:operator], :id => nil)
options[:values].each do |value|
tags << hidden_field_tag("v[#{field}][]", value, :id => nil)
end
end
tags
end
def query_columns_hidden_tags(query)
tags = ''.html_safe
query.columns.each do |column|
tags << hidden_field_tag("c[]", column.name, :id => nil)
end
tags
end
def query_hidden_tags(query)
query_filters_hidden_tags(query) + query_columns_hidden_tags(query)
end
def available_block_columns_tags(query) def available_block_columns_tags(query)
tags = ''.html_safe tags = ''.html_safe
query.available_block_columns.each do |column| query.available_block_columns.each do |column|
+1 -1
View File
@@ -24,7 +24,7 @@ module ReportsHelper
data.each { |row| data.each { |row|
match = 1 match = 1
criteria.each { |k, v| criteria.each { |k, v|
match = 0 unless (row[k].to_s == v.to_s) || (k == 'closed' && (v == 0 ? ['f', false] : ['t', true]).include?(row[k])) match = 0 unless (row[k].to_s == v.to_s) || (k == 'closed' && row[k] == (v == 0 ? "f" : "t"))
} unless criteria.nil? } unless criteria.nil?
a = a + row["total"].to_i if match == 1 a = a + row["total"].to_i if match == 1
} unless data.nil? } unless data.nil?
-1
View File
@@ -38,7 +38,6 @@ class Enumeration < ActiveRecord::Base
scope :shared, lambda { where(:project_id => nil) } scope :shared, lambda { where(:project_id => nil) }
scope :sorted, lambda { order("#{table_name}.position ASC") } scope :sorted, lambda { order("#{table_name}.position ASC") }
scope :active, lambda { where(:active => true) } scope :active, lambda { where(:active => true) }
scope :system, lambda { where(:project_id => nil) }
scope :named, lambda {|arg| where("LOWER(#{table_name}.name) = LOWER(?)", arg.to_s.strip)} scope :named, lambda {|arg| where("LOWER(#{table_name}.name) = LOWER(?)", arg.to_s.strip)}
def self.default def self.default
+9 -99
View File
@@ -744,16 +744,12 @@ class Issue < ActiveRecord::Base
initial_status = IssueStatus.find_by_id(status_id_was) initial_status = IssueStatus.find_by_id(status_id_was)
end end
initial_status ||= status initial_status ||= status
initial_assigned_to_id = assigned_to_id_changed? ? assigned_to_id_was : assigned_to_id
assignee_transitions_allowed = initial_assigned_to_id.present? &&
(user.id == initial_assigned_to_id || user.group_ids.include?(initial_assigned_to_id))
statuses = initial_status.find_new_statuses_allowed_to( statuses = initial_status.find_new_statuses_allowed_to(
user.admin ? Role.all : user.roles_for_project(project), user.admin ? Role.all : user.roles_for_project(project),
tracker, tracker,
author == user, author == user,
assignee_transitions_allowed assigned_to_id_changed? ? assigned_to_id_was == user.id : assigned_to_id == user.id
) )
statuses << initial_status unless statuses.empty? statuses << initial_status unless statuses.empty?
statuses << IssueStatus.default if include_default statuses << IssueStatus.default if include_default
@@ -858,100 +854,15 @@ class Issue < ActiveRecord::Base
end end
# Returns all the other issues that depend on the issue # Returns all the other issues that depend on the issue
# The algorithm is a modified breadth first search (bfs)
def all_dependent_issues(except=[]) def all_dependent_issues(except=[])
# The found dependencies except << self
dependencies = [] dependencies = []
dependencies += relations_from.map(&:issue_to)
# The visited flag for every node (issue) used by the breadth first search dependencies += children unless leaf?
eNOT_DISCOVERED = 0 # The issue is "new" to the algorithm, it has not seen it before. dependencies << parent
dependencies.compact!
ePROCESS_ALL = 1 # The issue is added to the queue. Process both children and relations of
# the issue when it is processed.
ePROCESS_RELATIONS_ONLY = 2 # The issue was added to the queue and will be output as dependent issue,
# but its children will not be added to the queue when it is processed.
eRELATIONS_PROCESSED = 3 # The related issues, the parent issue and the issue itself have been added to
# the queue, but its children have not been added.
ePROCESS_CHILDREN_ONLY = 4 # The relations and the parent of the issue have been added to the queue, but
# the children still need to be processed.
eALL_PROCESSED = 5 # The issue and all its children, its parent and its related issues have been
# added as dependent issues. It needs no further processing.
issue_status = Hash.new(eNOT_DISCOVERED)
# The queue
queue = []
# Initialize the bfs, add start node (self) to the queue
queue << self
issue_status[self] = ePROCESS_ALL
while (!queue.empty?) do
current_issue = queue.shift
current_issue_status = issue_status[current_issue]
dependencies << current_issue
# Add parent to queue, if not already in it.
parent = current_issue.parent
parent_status = issue_status[parent]
if parent && (parent_status == eNOT_DISCOVERED) && !except.include?(parent)
queue << parent
issue_status[parent] = ePROCESS_RELATIONS_ONLY
end
# Add children to queue, but only if they are not already in it and
# the children of the current node need to be processed.
if (current_issue_status == ePROCESS_CHILDREN_ONLY || current_issue_status == ePROCESS_ALL)
current_issue.children.each do |child|
next if except.include?(child)
if (issue_status[child] == eNOT_DISCOVERED)
queue << child
issue_status[child] = ePROCESS_ALL
elsif (issue_status[child] == eRELATIONS_PROCESSED)
queue << child
issue_status[child] = ePROCESS_CHILDREN_ONLY
elsif (issue_status[child] == ePROCESS_RELATIONS_ONLY)
queue << child
issue_status[child] = ePROCESS_ALL
end
end
end
# Add related issues to the queue, if they are not already in it.
current_issue.relations_from.map(&:issue_to).each do |related_issue|
next if except.include?(related_issue)
if (issue_status[related_issue] == eNOT_DISCOVERED)
queue << related_issue
issue_status[related_issue] = ePROCESS_ALL
elsif (issue_status[related_issue] == eRELATIONS_PROCESSED)
queue << related_issue
issue_status[related_issue] = ePROCESS_CHILDREN_ONLY
elsif (issue_status[related_issue] == ePROCESS_RELATIONS_ONLY)
queue << related_issue
issue_status[related_issue] = ePROCESS_ALL
end
end
# Set new status for current issue
if (current_issue_status == ePROCESS_ALL) || (current_issue_status == ePROCESS_CHILDREN_ONLY)
issue_status[current_issue] = eALL_PROCESSED
elsif (current_issue_status == ePROCESS_RELATIONS_ONLY)
issue_status[current_issue] = eRELATIONS_PROCESSED
end
end # while
# Remove the issues from the "except" parameter from the result array
dependencies -= except dependencies -= except
dependencies.delete(self) dependencies + dependencies.map {|issue| issue.all_dependent_issues(except)}.flatten
dependencies
end end
# Returns an array of issues that duplicate this one # Returns an array of issues that duplicate this one
@@ -1337,8 +1248,7 @@ class Issue < ActiveRecord::Base
if average == 0 if average == 0
average = 1 average = 1
end end
done = p.leaves.sum("COALESCE(CASE WHEN estimated_hours > 0 THEN estimated_hours ELSE NULL END, #{average}) " + done = p.leaves.sum("COALESCE(estimated_hours, #{average}) * (CASE WHEN is_closed = #{connection.quoted_true} THEN 100 ELSE COALESCE(done_ratio, 0) END)", :joins => :status).to_f
"* (CASE WHEN is_closed = #{connection.quoted_true} THEN 100 ELSE COALESCE(done_ratio, 0) END)", :joins => :status).to_f
progress = done / (average * leaves_count) progress = done / (average * leaves_count)
p.done_ratio = progress.round p.done_ratio = progress.round
end end
+3 -2
View File
@@ -393,9 +393,10 @@ class IssueQuery < Query
if relation_options[:sym] == field && !options[:reverse] if relation_options[:sym] == field && !options[:reverse]
sqls = [sql, sql_for_relations(field, operator, value, :reverse => true)] sqls = [sql, sql_for_relations(field, operator, value, :reverse => true)]
sql = sqls.join(["!", "!*", "!p"].include?(operator) ? " AND " : " OR ") sqls.join(["!", "!*", "!p"].include?(operator) ? " AND " : " OR ")
else
sql
end end
"(#{sql})"
end end
IssueRelation::TYPES.keys.each do |relation_type| IssueRelation::TYPES.keys.each do |relation_type|
+1 -1
View File
@@ -390,7 +390,7 @@ class Mailer < ActionMailer::Base
# Removes the author from the recipients and cc # Removes the author from the recipients and cc
# if he doesn't want to receive notifications about what he does # if he doesn't want to receive notifications about what he does
if @author && @author.logged? && @author.pref.no_self_notified if @author && @author.logged? && @author.pref[:no_self_notified]
headers[:to].delete(@author.mail) if headers[:to].is_a?(Array) headers[:to].delete(@author.mail) if headers[:to].is_a?(Array)
headers[:cc].delete(@author.mail) if headers[:cc].is_a?(Array) headers[:cc].delete(@author.mail) if headers[:cc].is_a?(Array)
end end
+1 -4
View File
@@ -673,7 +673,7 @@ class Project < ActiveRecord::Base
# Returns an auto-generated project identifier based on the last identifier used # Returns an auto-generated project identifier based on the last identifier used
def self.next_identifier def self.next_identifier
p = Project.order('id DESC').first p = Project.order('created_on DESC').first
p.nil? ? nil : p.identifier.to_s.succ p.nil? ? nil : p.identifier.to_s.succ
end end
@@ -840,9 +840,6 @@ class Project < ActiveRecord::Base
new_issue = Issue.new new_issue = Issue.new
new_issue.copy_from(issue, :subtasks => false, :link => false) new_issue.copy_from(issue, :subtasks => false, :link => false)
new_issue.project = self new_issue.project = self
# Changing project resets the custom field values
# TODO: handle this in Issue#project=
new_issue.custom_field_values = issue.custom_field_values.inject({}) {|h,v| h[v.custom_field_id] = v.value; h}
# Reassign fixed_versions by name, since names are unique per project # Reassign fixed_versions by name, since names are unique per project
if issue.fixed_version && issue.fixed_version.project == project if issue.fixed_version && issue.fixed_version.project == project
new_issue.fixed_version = self.versions.detect {|v| v.name == issue.fixed_version.name} new_issue.fixed_version = self.versions.detect {|v| v.name == issue.fixed_version.name}
+2 -5
View File
@@ -577,11 +577,8 @@ class Query < ActiveRecord::Base
customized_class = queried_class.reflect_on_association(assoc.to_sym).klass.base_class rescue nil customized_class = queried_class.reflect_on_association(assoc.to_sym).klass.base_class rescue nil
raise "Unknown #{queried_class.name} association #{assoc}" unless customized_class raise "Unknown #{queried_class.name} association #{assoc}" unless customized_class
end end
where = sql_for_field(field, operator, value, db_table, db_field, true) "#{queried_table_name}.#{customized_key} #{not_in} IN (SELECT #{customized_class.table_name}.id FROM #{customized_class.table_name} LEFT OUTER JOIN #{db_table} ON #{db_table}.customized_type='#{customized_class}' AND #{db_table}.customized_id=#{customized_class.table_name}.id AND #{db_table}.custom_field_id=#{custom_field_id} WHERE " +
if operator =~ /[<>]/ sql_for_field(field, operator, value, db_table, db_field, true) + ')'
where = "(#{where}) AND #{db_table}.#{db_field} <> ''"
end
"#{queried_table_name}.#{customized_key} #{not_in} IN (SELECT #{customized_class.table_name}.id FROM #{customized_class.table_name} LEFT OUTER JOIN #{db_table} ON #{db_table}.customized_type='#{customized_class}' AND #{db_table}.customized_id=#{customized_class.table_name}.id AND #{db_table}.custom_field_id=#{custom_field_id} WHERE #{where})"
end end
# Helper method to generate the WHERE sql for a +field+, +operator+ and a +value+ # Helper method to generate the WHERE sql for a +field+, +operator+ and a +value+
+2 -6
View File
@@ -24,15 +24,11 @@ class TimeEntryActivity < Enumeration
OptionName OptionName
end end
def objects
TimeEntry.where(:activity_id => self_and_descendants(1).map(&:id))
end
def objects_count def objects_count
objects.count time_entries.count
end end
def transfer_relations(to) def transfer_relations(to)
objects.update_all(:activity_id => to.id) time_entries.update_all("activity_id = #{to.id}")
end end
end end
-9
View File
@@ -100,15 +100,6 @@ class TimeEntryQuery < Query
@default_columns_names ||= [:project, :spent_on, :user, :activity, :issue, :comments, :hours] @default_columns_names ||= [:project, :spent_on, :user, :activity, :issue, :comments, :hours]
end end
def results_scope(options={})
order_option = [group_by_sort_order, options[:order]].flatten.reject(&:blank?)
TimeEntry.visible.
where(statement).
order(order_option).
joins(joins_for_order_statement(order_option.join(',')))
end
# Accepts :from/:to params as shortcut filters # Accepts :from/:to params as shortcut filters
def build_from_params(params) def build_from_params(params)
super super
+2 -5
View File
@@ -33,7 +33,7 @@ class UserPreference < ActiveRecord::Base
end end
def [](attr_name) def [](attr_name)
if has_attribute? attr_name if attribute_present? attr_name
super super
else else
others ? others[attr_name] : nil others ? others[attr_name] : nil
@@ -41,7 +41,7 @@ class UserPreference < ActiveRecord::Base
end end
def []=(attr_name, value) def []=(attr_name, value)
if has_attribute? attr_name if attribute_present? attr_name
super super
else else
h = (read_attribute(:others) || {}).dup h = (read_attribute(:others) || {}).dup
@@ -56,7 +56,4 @@ class UserPreference < ActiveRecord::Base
def warn_on_leaving_unsaved; self[:warn_on_leaving_unsaved] || '1'; end def warn_on_leaving_unsaved; self[:warn_on_leaving_unsaved] || '1'; end
def warn_on_leaving_unsaved=(value); self[:warn_on_leaving_unsaved]=value; end def warn_on_leaving_unsaved=(value); self[:warn_on_leaving_unsaved]=value; end
def no_self_notified; (self[:no_self_notified] == true || self[:no_self_notified] == '1'); end
def no_self_notified=(value); self[:no_self_notified]=value; end
end end
+1 -2
View File
@@ -47,8 +47,7 @@ class Version < ActiveRecord::Base
'wiki_page_title', 'wiki_page_title',
'status', 'status',
'sharing', 'sharing',
'custom_field_values', 'custom_field_values'
'custom_fields'
# Returns true if +user+ or current user is allowed to view the version # Returns true if +user+ or current user is allowed to view the version
def visible?(user=User.current) def visible?(user=User.current)
+1 -1
View File
@@ -12,7 +12,7 @@
<p><em><%=h @document.category.name %><br /> <p><em><%=h @document.category.name %><br />
<%= format_date @document.created_on %></em></p> <%= format_date @document.created_on %></em></p>
<div class="wiki"> <div class="wiki">
<%= textilizable @document, :description, :attachments => @document.attachments %> <%= textilizable @document.description, :attachments => @document.attachments %>
</div> </div>
<h3><%= l(:label_attachment_plural) %></h3> <h3><%= l(:label_attachment_plural) %></h3>
+1 -1
View File
@@ -4,7 +4,7 @@
<div class="box"> <div class="box">
<p><strong><%= l(:text_enumeration_destroy_question, @enumeration.objects_count) %></strong></p> <p><strong><%= l(:text_enumeration_destroy_question, @enumeration.objects_count) %></strong></p>
<p><label for='reassign_to_id'><%= l(:text_enumeration_category_reassign_to) %></label> <p><label for='reassign_to_id'><%= l(:text_enumeration_category_reassign_to) %></label>
<%= select_tag 'reassign_to_id', (content_tag('option', "--- #{l(:actionview_instancetag_blank_option)} ---", :value => '') + options_from_collection_for_select(@enumerations, 'id', 'name')) %></p> <%= select_tag 'reassign_to_id', (content_tag('option', "--- #{l(:actionview_instancetag_blank_option)} ---") + options_from_collection_for_select(@enumerations, 'id', 'name')) %></p>
</div> </div>
<%= submit_tag l(:button_apply) %> <%= submit_tag l(:button_apply) %>
+11 -1
View File
@@ -1,5 +1,15 @@
<h1><%= link_to(h("#{issue.tracker.name} ##{issue.id}: #{issue.subject}"), issue_url) %></h1> <h1><%= link_to(h("#{issue.tracker.name} ##{issue.id}: #{issue.subject}"), issue_url) %></h1>
<%= render_email_issue_attributes(issue, true) %> <ul>
<li><%=l(:field_author)%>: <%=h issue.author %></li>
<li><%=l(:field_status)%>: <%=h issue.status %></li>
<li><%=l(:field_priority)%>: <%=h issue.priority %></li>
<li><%=l(:field_assigned_to)%>: <%=h issue.assigned_to %></li>
<li><%=l(:field_category)%>: <%=h issue.category %></li>
<li><%=l(:field_fixed_version)%>: <%=h issue.fixed_version %></li>
<% issue.custom_field_values.each do |c| %>
<li><%=h c.custom_field.name %>: <%=h show_value(c) %></li>
<% end %>
</ul>
<%= textilizable(issue, :description, :only_path => false) %> <%= textilizable(issue, :description, :only_path => false) %>
+8 -1
View File
@@ -1,6 +1,13 @@
<%= "#{issue.tracker.name} ##{issue.id}: #{issue.subject}" %> <%= "#{issue.tracker.name} ##{issue.id}: #{issue.subject}" %>
<%= issue_url %> <%= issue_url %>
<%= render_email_issue_attributes(issue) %> * <%=l(:field_author)%>: <%= issue.author %>
* <%=l(:field_status)%>: <%= issue.status %>
* <%=l(:field_priority)%>: <%= issue.priority %>
* <%=l(:field_assigned_to)%>: <%= issue.assigned_to %>
* <%=l(:field_category)%>: <%= issue.category %>
* <%=l(:field_fixed_version)%>: <%= issue.fixed_version %>
<% issue.custom_field_values.each do |c| %>* <%= c.custom_field.name %>: <%= show_value(c) %>
<% end -%>
---------------------------------------- ----------------------------------------
<%= issue.description %> <%= issue.description %>
-3
View File
@@ -1,6 +1,3 @@
<% if @journal.private_notes? %>
(<%= l(:field_private_notes) %>)
<% end %>
<%= l(:text_issue_updated, :id => "##{@issue.id}", :author => h(@journal.user)) %> <%= l(:text_issue_updated, :id => "##{@issue.id}", :author => h(@journal.user)) %>
<ul> <ul>
+1 -1
View File
@@ -1,4 +1,4 @@
<%= "(#{l(:field_private_notes)}) " if @journal.private_notes? -%><%= l(:text_issue_updated, :id => "##{@issue.id}", :author => @journal.user) %> <%= l(:text_issue_updated, :id => "##{@issue.id}", :author => @journal.user) %>
<% details_to_strings(@journal.details, true).each do |string| -%> <% details_to_strings(@journal.details, true).each do |string| -%>
<%= string %> <%= string %>
+1 -1
View File
@@ -3,7 +3,7 @@ var operatorLabels = <%= raw_json Query.operators_labels %>;
var operatorByType = <%= raw_json Query.operators_by_filter_type %>; var operatorByType = <%= raw_json Query.operators_by_filter_type %>;
var availableFilters = <%= raw_json query.available_filters_as_json %>; var availableFilters = <%= raw_json query.available_filters_as_json %>;
var labelDayPlural = <%= raw_json l(:label_day_plural) %>; var labelDayPlural = <%= raw_json l(:label_day_plural) %>;
var allProjects = <%= raw_json query.all_projects_values %>; var allProjects = <%= raw query.all_projects_values.to_json %>;
$(document).ready(function(){ $(document).ready(function(){
initFilters(); initFilters();
<% query.filters.each do |field, options| %> <% query.filters.each do |field, options| %>
+1 -2
View File
@@ -27,8 +27,7 @@
<div id="csv-export-options" style="display:none;"> <div id="csv-export-options" style="display:none;">
<h3 class="title"><%= l(:label_export_options, :export_format => 'CSV') %></h3> <h3 class="title"><%= l(:label_export_options, :export_format => 'CSV') %></h3>
<%= form_tag(params.slice(:project_id, :issue_id).merge(:format => 'csv', :page=>nil), :method => :get, :id => 'csv-export-form') do %> <%= form_tag(params.merge({:format => 'csv',:page=>nil}), :method => :get, :id => 'csv-export-form') do %>
<%= query_hidden_tags @query %>
<p> <p>
<label><%= radio_button_tag 'columns', '', true %> <%= l(:description_selected_columns) %></label><br /> <label><%= radio_button_tag 'columns', '', true %> <%= l(:description_selected_columns) %></label><br />
<label><%= radio_button_tag 'columns', 'all' %> <%= l(:description_all_columns) %></label> <label><%= radio_button_tag 'columns', 'all' %> <%= l(:description_all_columns) %></label>
+4 -5
View File
@@ -19,10 +19,9 @@
end %> end %>
<p><em class="info"><%= l(:text_user_mail_option) %></em></p> <p><em class="info"><%= l(:text_user_mail_option) %></em></p>
<% end %> <% end %>
<%= fields_for :pref, @user.pref do |pref_fields| %>
<p> <p>
<%= pref_fields.check_box :no_self_notified %> <label>
<label for="pref_no_self_notified"><%= l(:label_user_mail_no_self_notified) %></label> <%= l(:label_user_mail_no_self_notified) %>
<%= check_box_tag 'no_self_notified', 1, @user.pref[:no_self_notified] %>
</label>
</p> </p>
<% end %>
+2 -2
View File
@@ -50,8 +50,8 @@ ar:
one: "حوالي ساعة" one: "حوالي ساعة"
other: "ساعات %{count}حوالي " other: "ساعات %{count}حوالي "
x_hours: x_hours:
one: "%{count} ساعة" one: "1 hour"
other: "%{count} ساعات" other: "%{count} hours"
x_days: x_days:
one: "يوم" one: "يوم"
other: "%{count} أيام" other: "%{count} أيام"
+2 -2
View File
@@ -109,8 +109,8 @@ az:
many: "təxminən %{count} saat" many: "təxminən %{count} saat"
other: "təxminən %{count} saat" other: "təxminən %{count} saat"
x_hours: x_hours:
one: "1 saat" one: "1 hour"
other: "%{count} saat" other: "%{count} hours"
x_days: x_days:
one: "%{count} gün" one: "%{count} gün"
few: "%{count} gün" few: "%{count} gün"
+2 -2
View File
@@ -51,8 +51,8 @@ bg:
one: "около 1 час" one: "около 1 час"
other: "около %{count} часа" other: "около %{count} часа"
x_hours: x_hours:
one: "1 час" one: "1 hour"
other: "%{count} часа" other: "%{count} hours"
x_days: x_days:
one: "1 ден" one: "1 ден"
other: "%{count} дена" other: "%{count} дена"
+2 -2
View File
@@ -49,8 +49,8 @@ bs:
one: "oko 1 sahat" one: "oko 1 sahat"
other: "oko %{count} sahata" other: "oko %{count} sahata"
x_hours: x_hours:
one: "1 sahat" one: "1 hour"
other: "%{count} sahata" other: "%{count} hours"
x_days: x_days:
one: "1 dan" one: "1 dan"
other: "%{count} dana" other: "%{count} dana"
+2 -2
View File
@@ -53,8 +53,8 @@ ca:
one: "aproximadament 1 hora" one: "aproximadament 1 hora"
other: "aproximadament %{count} hores" other: "aproximadament %{count} hores"
x_hours: x_hours:
one: "1 hora" one: "1 hour"
other: "%{count} hores" other: "%{count} hours"
x_days: x_days:
one: "1 dia" one: "1 dia"
other: "%{count} dies" other: "%{count} dies"
+2 -2
View File
@@ -55,8 +55,8 @@ cs:
one: "asi 1 hodina" one: "asi 1 hodina"
other: "asi %{count} hodin" other: "asi %{count} hodin"
x_hours: x_hours:
one: "1 hodina" one: "1 hour"
other: "%{count} hodin" other: "%{count} hours"
x_days: x_days:
one: "1 den" one: "1 den"
other: "%{count} dnů" other: "%{count} dnů"
+2 -2
View File
@@ -52,8 +52,8 @@ da:
one: "cirka en time" one: "cirka en time"
other: "cirka %{count} timer" other: "cirka %{count} timer"
x_hours: x_hours:
one: "1 time" one: "1 hour"
other: "%{count} timer" other: "%{count} hours"
x_days: x_days:
one: "en dag" one: "en dag"
other: "%{count} dage" other: "%{count} dage"
+2 -2
View File
@@ -53,8 +53,8 @@ de:
one: 'etwa 1 Stunde' one: 'etwa 1 Stunde'
other: 'etwa %{count} Stunden' other: 'etwa %{count} Stunden'
x_hours: x_hours:
one: "1 Stunde" one: "1 hour"
other: "%{count} Stunden" other: "%{count} hours"
x_days: x_days:
one: '1 Tag' one: '1 Tag'
other: '%{count} Tagen' other: '%{count} Tagen'
+2 -2
View File
@@ -52,8 +52,8 @@ el:
one: "περίπου 1 ώρα" one: "περίπου 1 ώρα"
other: "περίπου %{count} ώρες" other: "περίπου %{count} ώρες"
x_hours: x_hours:
one: "1 ώρα" one: "1 hour"
other: "%{count} ώρες" other: "%{count} hours"
x_days: x_days:
one: "1 ημέρα" one: "1 ημέρα"
other: "%{count} ημέρες" other: "%{count} ημέρες"
+6 -6
View File
@@ -80,8 +80,8 @@ es:
one: "alrededor de 1 hora" one: "alrededor de 1 hora"
other: "alrededor de %{count} horas" other: "alrededor de %{count} horas"
x_hours: x_hours:
one: "1 hora" one: "1 hour"
other: "%{count} horas" other: "%{count} hours"
x_days: x_days:
one: "1 día" one: "1 día"
other: "%{count} días" other: "%{count} días"
@@ -1118,8 +1118,8 @@ es:
permission_edit_documents: Editar documentos permission_edit_documents: Editar documentos
permission_delete_documents: Borrar documentos permission_delete_documents: Borrar documentos
label_gantt_progress_line: Línea de progreso label_gantt_progress_line: Línea de progreso
setting_jsonp_enabled: Habilitar soporte de JSONP setting_jsonp_enabled: Enable JSONP support
field_inherit_members: Heredar miembros field_inherit_members: Inherit members
field_closed_on: Cerrada field_closed_on: Closed
setting_default_projects_tracker_ids: Tipos de petición habilitados por defecto setting_default_projects_tracker_ids: Default trackers for new projects
label_total_time: Total label_total_time: Total
+2 -2
View File
@@ -67,8 +67,8 @@ et:
one: "umbes tund" one: "umbes tund"
other: "umbes %{count} tundi" other: "umbes %{count} tundi"
x_hours: x_hours:
one: "1 tund" one: "1 hour"
other: "%{count} tundi" other: "%{count} hours"
x_days: x_days:
one: "1 päev" one: "1 päev"
other: "%{count} päeva" other: "%{count} päeva"
+2 -2
View File
@@ -53,8 +53,8 @@ eu:
one: "ordu 1 inguru" one: "ordu 1 inguru"
other: "%{count} ordu inguru" other: "%{count} ordu inguru"
x_hours: x_hours:
one: "ordu 1" one: "1 hour"
other: "%{count} ordu" other: "%{count} hours"
x_days: x_days:
one: "egun 1" one: "egun 1"
other: "%{count} egun" other: "%{count} egun"
+2 -2
View File
@@ -50,8 +50,8 @@ fa:
one: "نزدیک 1 ساعت" one: "نزدیک 1 ساعت"
other: "نزدیک %{count} ساعت" other: "نزدیک %{count} ساعت"
x_hours: x_hours:
one: "1 ساعت" one: "1 hour"
other: "%{count} ساعت" other: "%{count} hours"
x_days: x_days:
one: "1 روز" one: "1 روز"
other: "%{count} روز" other: "%{count} روز"
+2 -2
View File
@@ -95,8 +95,8 @@ fi:
one: "noin tunti" one: "noin tunti"
other: "noin %{count} tuntia" other: "noin %{count} tuntia"
x_hours: x_hours:
one: "1 tunti" one: "1 hour"
other: "%{count} tuntia" other: "%{count} hours"
x_days: x_days:
one: "päivä" one: "päivä"
other: "%{count} päivää" other: "%{count} päivää"
+2 -2
View File
@@ -91,8 +91,8 @@ gl:
one: 'aproximadamente unha hora' one: 'aproximadamente unha hora'
other: '%{count} horas' other: '%{count} horas'
x_hours: x_hours:
one: "1 hora" one: "1 hour"
other: "%{count} horas" other: "%{count} hours"
x_days: x_days:
one: '1 día' one: '1 día'
other: '%{count} días' other: '%{count} días'
+2 -2
View File
@@ -56,8 +56,8 @@ he:
one: 'בערך שעה אחת' one: 'בערך שעה אחת'
other: 'בערך %{count} שעות' other: 'בערך %{count} שעות'
x_hours: x_hours:
one: "1 שעה" one: "1 hour"
other: "%{count} שעות" other: "%{count} hours"
x_days: x_days:
one: 'יום אחד' one: 'יום אחד'
other: '%{count} ימים' other: '%{count} ימים'
+2 -2
View File
@@ -49,8 +49,8 @@ hr:
one: "oko sat vremena" one: "oko sat vremena"
other: "oko %{count} sati" other: "oko %{count} sati"
x_hours: x_hours:
one: "1 sata" one: "1 hour"
other: "%{count} sati" other: "%{count} hours"
x_days: x_days:
one: "1 dan" one: "1 dan"
other: "%{count} dana" other: "%{count} dana"
+2 -2
View File
@@ -51,8 +51,8 @@
one: 'csaknem 1 órája' one: 'csaknem 1 órája'
other: 'csaknem %{count} órája' other: 'csaknem %{count} órája'
x_hours: x_hours:
one: "1 óra" one: "1 hour"
other: "%{count} óra" other: "%{count} hours"
x_days: x_days:
one: '1 napja' one: '1 napja'
other: '%{count} napja' other: '%{count} napja'
+2 -2
View File
@@ -47,8 +47,8 @@ id:
one: "sekitar sejam" one: "sekitar sejam"
other: "sekitar %{count} jam" other: "sekitar %{count} jam"
x_hours: x_hours:
one: "1 jam" one: "1 hour"
other: "%{count} jam" other: "%{count} hours"
x_days: x_days:
one: "sehari" one: "sehari"
other: "%{count} hari" other: "%{count} hari"
+71 -68
View File
@@ -55,8 +55,8 @@ it:
one: "circa un'ora" one: "circa un'ora"
other: "circa %{count} ore" other: "circa %{count} ore"
x_hours: x_hours:
one: "1 ora" one: "1 hour"
other: "%{count} ore" other: "%{count} hours"
x_days: x_days:
one: "1 giorno" one: "1 giorno"
other: "%{count} giorni" other: "%{count} giorni"
@@ -1001,87 +1001,90 @@ it:
button_export: Esporta button_export: Esporta
label_export_options: "%{export_format} opzioni per l'export" label_export_options: "%{export_format} opzioni per l'export"
error_attachment_too_big: Questo file non può essere caricato in quanto la sua dimensione supera la massima consentita (%{max_size}) error_attachment_too_big: Questo file non può essere caricato in quanto la sua dimensione supera la massima consentita (%{max_size})
notice_failed_to_save_time_entries: "Non ho potuto salvare %{count} registrazioni di tempo impiegato su %{total} selezionate: %{ids}." notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}."
label_x_issues: label_x_issues:
zero: 0 segnalazione zero: 0 segnalazione
one: 1 segnalazione one: 1 segnalazione
other: "%{count} segnalazioni" other: "%{count} segnalazioni"
label_repository_new: Nuovo repository label_repository_new: New repository
field_repository_is_default: Repository principale field_repository_is_default: Main repository
label_copy_attachments: Copia allegati label_copy_attachments: Copy attachments
label_item_position: "%{position}/%{count}" label_item_position: "%{position}/%{count}"
label_completed_versions: Completed versions label_completed_versions: Completed versions
text_project_identifier_info: Consentiti solo lettere minuscole (a-z), numeri, trattini e trattini bassi.<br />Una volta salvato, l'identificatore non può essere modificato. text_project_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.<br />Once saved, the identifier cannot be changed.
field_multiple: Valori multipli field_multiple: Multiple values
setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed
text_issue_conflict_resolution_add_notes: Aggiunge le mie note e non salvare le mie ulteriori modifiche text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes
text_issue_conflict_resolution_overwrite: Applica comunque le mie modifiche (le note precedenti verranno mantenute ma alcuni cambiamenti potrebbero essere sovrascritti) text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten)
notice_issue_update_conflict: La segnalazione è stata aggiornata da un altro utente mentre la stavi editando. notice_issue_update_conflict: The issue has been updated by an other user while you were editing it.
text_issue_conflict_resolution_cancel: Cancella ogni modifica e rivisualizza %{link} text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link}
permission_manage_related_issues: Gestisci relative segnalazioni permission_manage_related_issues: Manage related issues
field_auth_source_ldap_filter: Filtro LDAP field_auth_source_ldap_filter: LDAP filter
label_search_for_watchers: Cerca osservatori da aggiungere label_search_for_watchers: Search for watchers to add
notice_account_deleted: Il tuo account sarà definitivamente rimosso. notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Consentire agli utenti di cancellare il proprio account setting_unsubscribe: Allow users to delete their own account
button_delete_my_account: Cancella il mio account button_delete_my_account: Delete my account
text_account_destroy_confirmation: "Sei sicuro di voler procedere?\nIl tuo account sarà definitivamente cancellato, senza alcuna possibilità di ripristino." text_account_destroy_confirmation: |-
error_session_expired: "La tua sessione è scaduta. Effettua nuovamente il login." Are you sure you want to proceed?
text_session_expiration_settings: "Attenzione: la modifica di queste impostazioni può far scadere le sessioni correnti, compresa la tua." Your account will be permanently deleted, with no way to reactivate it.
setting_session_lifetime: Massima durata di una sessione error_session_expired: Your session has expired. Please login again.
setting_session_timeout: Timeout di inattività di una sessione text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
label_session_expiration: Scadenza sessione setting_session_lifetime: Session maximum lifetime
permission_close_project: Chiusura / riapertura progetto setting_session_timeout: Session inactivity timeout
label_show_closed_projects: Vedi progetti chiusi label_session_expiration: Session expiration
button_close: Chiudi permission_close_project: Close / reopen the project
button_reopen: Riapri label_show_closed_projects: View closed projects
project_status_active: attivo button_close: Close
project_status_closed: chiuso button_reopen: Reopen
project_status_archived: archiviato project_status_active: active
text_project_closed: Questo progetto è chiuso e in sola lettura. project_status_closed: closed
notice_user_successful_create: Creato utente %{id}. project_status_archived: archived
field_core_fields: Campi standard text_project_closed: This project is closed and read-only.
field_timeout: Timeout (in secondi) notice_user_successful_create: User %{id} created.
setting_thumbnails_enabled: Mostra miniature degli allegati field_core_fields: Standard fields
setting_thumbnails_size: Dimensioni delle miniature (in pixels) field_timeout: Timeout (in seconds)
label_status_transitions: Transizioni di stato setting_thumbnails_enabled: Display attachment thumbnails
label_fields_permissions: Permessi sui campi setting_thumbnails_size: Thumbnails size (in pixels)
label_readonly: Sola lettura label_status_transitions: Status transitions
label_required: Richiesto label_fields_permissions: Fields permissions
text_repository_identifier_info: Consentiti solo lettere minuscole (a-z), numeri, trattini e trattini bassi.<br />Una volta salvato, ll'identificatore non può essere modificato. label_readonly: Read-only
label_required: Required
text_repository_identifier_info: Only lower case letters (a-z), numbers, dashes and underscores are allowed.<br />Once saved, the identifier cannot be changed.
field_board_parent: Parent forum field_board_parent: Parent forum
label_attribute_of_project: Project's %{name} label_attribute_of_project: Project's %{name}
label_attribute_of_author: Author's %{name} label_attribute_of_author: Author's %{name}
label_attribute_of_assigned_to: Assegnatari %{name} label_attribute_of_assigned_to: Assignee's %{name}
label_attribute_of_fixed_version: Target version's %{name} label_attribute_of_fixed_version: Target version's %{name}
label_copy_subtasks: Copia sottoattività label_copy_subtasks: Copy subtasks
label_copied_to: copia a label_copied_to: copied to
label_copied_from: copia da label_copied_from: copied from
label_any_issues_in_project: ogni segnalazione del progetto label_any_issues_in_project: any issues in project
label_any_issues_not_in_project: ogni segnalazione non nel progetto label_any_issues_not_in_project: any issues not in project
field_private_notes: Note private field_private_notes: Private notes
permission_view_private_notes: Visualizza note private permission_view_private_notes: View private notes
permission_set_notes_private: Imposta note come private permission_set_notes_private: Set notes as private
label_no_issues_in_project: progetto privo di segnalazioni label_no_issues_in_project: no issues in project
label_any: tutti label_any: tutti
label_last_n_weeks: ultime %{count} settimane label_last_n_weeks: last %{count} weeks
setting_cross_project_subtasks: Consenti sottoattività cross-project setting_cross_project_subtasks: Allow cross-project subtasks
label_cross_project_descendants: Con sottoprogetti label_cross_project_descendants: Con sottoprogetti
label_cross_project_tree: Con progetto padre label_cross_project_tree: Con progetto padre
label_cross_project_hierarchy: Con gerarchia progetto label_cross_project_hierarchy: Con gerarchia progetto
label_cross_project_system: Con tutti i progetti label_cross_project_system: Con tutti i progetti
button_hide: Nascondi button_hide: Hide
setting_non_working_week_days: Giorni non lavorativi setting_non_working_week_days: Non-working days
label_in_the_next_days: nei prossimi label_in_the_next_days: in the next
label_in_the_past_days: nei passati label_in_the_past_days: in the past
label_attribute_of_user: Utente %{name} label_attribute_of_user: User's %{name}
text_turning_multiple_off: Disabilitando valori multipli, i valori multipli verranno rimossi, in modo da mantenere un solo valore per item. text_turning_multiple_off: If you disable multiple values, multiple values will be
label_attribute_of_issue: Segnalazione %{name} removed in order to preserve only one value per item.
permission_add_documents: Aggiungi documenti label_attribute_of_issue: Issue's %{name}
permission_edit_documents: Edita documenti permission_add_documents: Add documents
permission_delete_documents: Cancella documenti permission_edit_documents: Edit documents
permission_delete_documents: Delete documents
label_gantt_progress_line: Progress line label_gantt_progress_line: Progress line
setting_jsonp_enabled: Abilita supporto a JSONP setting_jsonp_enabled: Enable JSONP support
field_inherit_members: Eredita membri field_inherit_members: Inherit members
field_closed_on: Chiuso field_closed_on: Closed
setting_default_projects_tracker_ids: Trackers di default per nuovi progetti setting_default_projects_tracker_ids: Default trackers for new projects
label_total_time: Totale label_total_time: Totale
+2 -2
View File
@@ -50,8 +50,8 @@ ko:
one: "약 한시간" one: "약 한시간"
other: "약 %{count}시간" other: "약 %{count}시간"
x_hours: x_hours:
one: "1 시간" one: "1 hour"
other: "%{count} 시간" other: "%{count} hours"
x_days: x_days:
one: "하루" one: "하루"
other: "%{count}일" other: "%{count}일"
+32 -32
View File
@@ -1,10 +1,8 @@
# Lithuanian translations for Ruby on Rails # Lithuanian translations for Ruby on Rails
# by Laurynas Butkus (laurynas.butkus@gmail.com) # by Laurynas Butkus (laurynas.butkus@gmail.com)
# Redmine translation by Gediminas Muižis gediminas.muizis@gmail.com # Redmine translation by Gediminas Muižis gediminas.muizis@gmail.com
# and Sergej Jegorov sergej.jegorov@gmail.com # and Sergej Jegorov sergej.jegorov@gmail.com
# and Gytis Gurklys gytis.gurklys@gmail.com # and Gytis Gurklys gytis.gurklys@gmail.com
# and Andrius Kriučkovas andrius.kriuckovas@gmail.com
lt: lt:
direction: ltr direction: ltr
date: date:
@@ -230,8 +228,8 @@ lt:
notice_default_data_loaded: Numatytoji konfiguracija sėkmingai užkrauta. notice_default_data_loaded: Numatytoji konfiguracija sėkmingai užkrauta.
notice_unable_delete_version: Neįmanoma panaikinti versiją. notice_unable_delete_version: Neįmanoma panaikinti versiją.
notice_unable_delete_time_entry: Neįmano ištrinti laiko žurnalo įrašą. notice_unable_delete_time_entry: Neįmano ištrinti laiko žurnalo įrašą.
notice_issue_done_ratios_updated: Problemos baigtumo rodikliai atnaujinti. notice_issue_done_ratios_updated: Issue done ratios updated.
notice_gantt_chart_truncated: Grafikas buvo sutrumpintas, kadangi jis viršija maksimalų (%{max}) leistinų atvaizduoti elementų kiekį notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max})
notice_issue_successful_create: Darbas %{id} sukurtas. notice_issue_successful_create: Darbas %{id} sukurtas.
error_can_t_load_default_data: "Numatytoji konfiguracija negali būti užkrauta: %{value}" error_can_t_load_default_data: "Numatytoji konfiguracija negali būti užkrauta: %{value}"
@@ -243,16 +241,16 @@ lt:
error_no_tracker_in_project: 'Joks pėdsekys nesusietas su šiuo projektu. Prašom patikrinti Projekto nustatymus.' error_no_tracker_in_project: 'Joks pėdsekys nesusietas su šiuo projektu. Prašom patikrinti Projekto nustatymus.'
error_no_default_issue_status: Nenustatyta numatytoji darbų būsena. Prašome patikrinti konfigūravimą ("Administravimas -> Darbų būsenos"). error_no_default_issue_status: Nenustatyta numatytoji darbų būsena. Prašome patikrinti konfigūravimą ("Administravimas -> Darbų būsenos").
error_can_not_delete_custom_field: Negalima ištrinti kliento lauko error_can_not_delete_custom_field: Negalima ištrinti kliento lauko
error_can_not_delete_tracker: "Šis pėdsekys turi įrašus ir todėl negali būti ištrintas." error_can_not_delete_tracker: "This tracker contains issues and cannot be deleted."
error_can_not_remove_role: "Ši rolė yra naudojama ir negali būti ištrinta." error_can_not_remove_role: "This role is in use and cannot be deleted."
error_can_not_reopen_issue_on_closed_version: Uždarytai versijai priskirtas darbas negali būti atnaujintas. error_can_not_reopen_issue_on_closed_version: Uždarytai versijai priskirtas darbas negali būti atnaujintas.
error_can_not_archive_project: Šio projekto negalima suarchyvuoti error_can_not_archive_project: Šio projekto negalima suarchyvuoti
error_issue_done_ratios_not_updated: "Įrašo baigtumo rodikliai nebuvo atnaujinti. " error_issue_done_ratios_not_updated: "Issue done ratios not updated."
error_workflow_copy_source: 'Prašome pasirinkti pirminį šaltinio seklį arba rolę' error_workflow_copy_source: 'Please select a source tracker or role'
error_workflow_copy_target: 'Prašome pasirinkti galutinį paskirties seklį(-ius) arba rolę(-s)' error_workflow_copy_target: 'Please select target tracker(s) and role(s)'
error_unable_delete_issue_status: 'Negalima ištrinti darbo statuso' error_unable_delete_issue_status: 'Negalima ištrinti darbo statuso'
error_unable_to_connect: Negalima prisijungti (%{value}) error_unable_to_connect: Negalima prisijungti (%{value})
error_attachment_too_big: "Ši byla negali būti įkelta, nes viršija maksimalią (%{max_size}) leistiną bylos apimtį" error_attachment_too_big: "This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size})"
warning_attachments_not_saved: "%{count} byla(ų) negali būti išsaugota." warning_attachments_not_saved: "%{count} byla(ų) negali būti išsaugota."
mail_subject_lost_password: "Jūsų %{value} slaptažodis" mail_subject_lost_password: "Jūsų %{value} slaptažodis"
@@ -433,7 +431,7 @@ lt:
setting_cache_formatted_text: Paslėpti formatuotą tekstą setting_cache_formatted_text: Paslėpti formatuotą tekstą
setting_default_notification_option: Numatytosios pranešimų nuostatos setting_default_notification_option: Numatytosios pranešimų nuostatos
setting_commit_logtime_enabled: Įjungti laiko registravimą setting_commit_logtime_enabled: Įjungti laiko registravimą
setting_commit_logtime_activity_id: Laiko įrašų veikla setting_commit_logtime_activity_id: Activity for logged time
setting_gantt_items_limit: Maksimalus rodmenų skaičius rodomas Gantt'o grafike setting_gantt_items_limit: Maksimalus rodmenų skaičius rodomas Gantt'o grafike
setting_issue_group_assignment: Leisti darbo priskirimą grupėms setting_issue_group_assignment: Leisti darbo priskirimą grupėms
setting_default_issue_start_date_to_creation_date: Naudoti dabartinę datą kaip naujų darbų pradžios datą setting_default_issue_start_date_to_creation_date: Naudoti dabartinę datą kaip naujų darbų pradžios datą
@@ -879,8 +877,8 @@ lt:
label_issues_visibility_public: Visi vieši darbai label_issues_visibility_public: Visi vieši darbai
label_issues_visibility_own: Darbai, sukurti vartotojo arba jam priskirti label_issues_visibility_own: Darbai, sukurti vartotojo arba jam priskirti
label_git_report_last_commit: Nurodyti paskutinį failų ir katalogų pakeitimą label_git_report_last_commit: Nurodyti paskutinį failų ir katalogų pakeitimą
label_parent_revision: Pirminė revizija label_parent_revision: Parent
label_child_revision: Sekanti revizija label_child_revision: Child
label_export_options: "%{export_format} eksportavimo nustatymai" label_export_options: "%{export_format} eksportavimo nustatymai"
button_login: Registruotis button_login: Registruotis
@@ -993,19 +991,20 @@ lt:
text_enumeration_destroy_question: "%{count} objektai(ų) priskirti šiai reikšmei." text_enumeration_destroy_question: "%{count} objektai(ų) priskirti šiai reikšmei."
text_enumeration_category_reassign_to: 'Priskirti juos šiai reikšmei:' text_enumeration_category_reassign_to: 'Priskirti juos šiai reikšmei:'
text_email_delivery_not_configured: "El.pašto siuntimas nesukonfigūruotas, ir perspėjimai neaktyvus.\nSukonfigūruokite savo SMTP serverį byloje config/configuration.yml ir perleiskite programą norėdami pritaikyti pakeitimus." text_email_delivery_not_configured: "El.pašto siuntimas nesukonfigūruotas, ir perspėjimai neaktyvus.\nSukonfigūruokite savo SMTP serverį byloje config/configuration.yml ir perleiskite programą norėdami pritaikyti pakeitimus."
text_repository_usernames_mapping: "Select or update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped."
text_repository_usernames_mapping: "Parinkite ar atnaujinkite Redmine vartotoją, kuris paminėtas saugyklos log'e.\nVartotojai, turintys tą patį Redmine ir saugyklos vardą ar el.paštą yra automatiškai surišti." text_repository_usernames_mapping: "Parinkite ar atnaujinkite Redmine vartotoją, kuris paminėtas saugyklos log'e.\nVartotojai, turintys tą patį Redmine ir saugyklos vardą ar el.paštą yra automatiškai surišti."
text_diff_truncated: "... Šis diff'as nukarpytas, nes jis viršijo maksimalų rodomų eilučių skaičių." text_diff_truncated: "... Šis diff'as nukarpytas, nes jis viršijo maksimalų rodomų eilučių skaičių."
text_custom_field_possible_values_info: 'Po vieną eilutę kiekvienai reikšmei' text_custom_field_possible_values_info: 'Po vieną eilutę kiekvienai reikšmei'
text_wiki_page_destroy_question: "Šis puslapis turi %{descendants} susijusių arba išvestinių puslapių. Ką norėtumėte daryti?" text_wiki_page_destroy_question: "This page has %{descendants} child page(s) and descendant(s). What do you want to do?"
text_wiki_page_nullify_children: Laikyti child puslapius kaip pagrindinius puslapius text_wiki_page_nullify_children: Laikyti child puslapius kaip pagrindinius puslapius
text_wiki_page_destroy_children: "Pašalinti child puslapius ir jų palikuonis" text_wiki_page_destroy_children: "Pašalinti child puslapius ir jų palikuonis"
text_wiki_page_reassign_children: "Priskirkite iš naujo 'child' puslapius šiam pagrindiniam puslapiui" text_wiki_page_reassign_children: "Priskirkite iš naujo 'child' puslapius šiam pagrindiniam puslapiui"
text_own_membership_delete_confirmation: "Jūs esate pasiruošęs panaikinti dalį arba visus leidimus ir po šio pakeitimo galite prarasti šio projekto redagavimo galimybę. \n Ar jūs esate įsitikinęs ir tęsti?" text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?"
text_zoom_in: Priartinti text_zoom_in: Priartinti
text_zoom_out: Nutolinti text_zoom_out: Nutolinti
text_warn_on_leaving_unsaved: "Dabartinis puslapis turi neišsaugoto teksto, kuris bus prarastas, jeigu paliksite šį puslapį." text_warn_on_leaving_unsaved: "Dabartinis puslapis turi neišsaugoto teksto, kuris bus prarastas, jeigu paliksite šį puslapį."
text_scm_path_encoding_note: "Numatytasis: UTF-8" text_scm_path_encoding_note: "Numatytasis: UTF-8"
text_git_repository_note: Saugykla (repository) yra plika ir vietinė (pvz. /gitrepo, c:\gitrepo) text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo)
text_mercurial_repository_note: Vietinė saugykla (e.g. /hgrepo, c:\hgrepo) text_mercurial_repository_note: Vietinė saugykla (e.g. /hgrepo, c:\hgrepo)
text_scm_command: Komanda text_scm_command: Komanda
text_scm_command_version: Versija text_scm_command_version: Versija
@@ -1070,7 +1069,7 @@ lt:
label_completed_versions: Užbaigtos versijos label_completed_versions: Užbaigtos versijos
text_project_identifier_info: Leidžiamos tik mažosios raidės (a-z), skaitmenys, brūkšneliai ir pabraukimo simboliai.<br />Kartą išsaugojus pakeitimai negalimi text_project_identifier_info: Leidžiamos tik mažosios raidės (a-z), skaitmenys, brūkšneliai ir pabraukimo simboliai.<br />Kartą išsaugojus pakeitimai negalimi
field_multiple: Keletas reikšmių field_multiple: Keletas reikšmių
setting_commit_cross_project_ref: Leisti visų kitų projektų įrašus susieti nuorodomis ir sutaisyti setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed
text_issue_conflict_resolution_add_notes: Išsaugoti mano žinutę ir atmesti likusius mano pataisymus text_issue_conflict_resolution_add_notes: Išsaugoti mano žinutę ir atmesti likusius mano pataisymus
text_issue_conflict_resolution_overwrite: Išsaugoti mano pakeitimus (ankstesnių pakeitimų žinutės bus išsaugotos, tačiau kai kurie pakeitimai bus perrašyti) text_issue_conflict_resolution_overwrite: Išsaugoti mano pakeitimus (ankstesnių pakeitimų žinutės bus išsaugotos, tačiau kai kurie pakeitimai bus perrašyti)
notice_issue_update_conflict: Darbas buvo pakoreguotas kito vartotojo kol jūs atlikote pakeitimus. notice_issue_update_conflict: Darbas buvo pakoreguotas kito vartotojo kol jūs atlikote pakeitimus.
@@ -1132,17 +1131,18 @@ lt:
setting_non_working_week_days: Nedarbo dienos setting_non_working_week_days: Nedarbo dienos
label_in_the_next_days: per ateinančias label_in_the_next_days: per ateinančias
label_in_the_past_days: per paskutines label_in_the_past_days: per paskutines
label_attribute_of_user: Vartotojo %{name} label_attribute_of_user: User's %{name}
text_turning_multiple_off: Jei jūs išjungsite kelių reikšmių pasirinkimą, visos išvardintos reikšmės bus pašalintos ir palikta tik viena reikšmė kiekvienam laukui. text_turning_multiple_off: If you disable multiple values, multiple values will be
label_attribute_of_issue: Įrašai %{name} removed in order to preserve only one value per item.
permission_add_documents: Pridėti dokumentus label_attribute_of_issue: Issue's %{name}
permission_edit_documents: Redaguoti dokumentus permission_add_documents: Add documents
permission_delete_documents: Trinti dokumentus permission_edit_documents: Edit documents
label_gantt_progress_line: Progreso linija permission_delete_documents: Delete documents
setting_jsonp_enabled: Įgalinti JSONP palaikymą label_gantt_progress_line: Progress line
field_inherit_members: Paveldėti narius setting_jsonp_enabled: Enable JSONP support
field_closed_on: Uždarytas field_inherit_members: Inherit members
setting_default_projects_tracker_ids: Sekliai pagal nutylėjimą naujiems projektams field_closed_on: Closed
setting_default_projects_tracker_ids: Default trackers for new projects
label_total_time: Iš viso label_total_time: Iš viso
text_scm_config: Jūs galite pakeisti SCM komandas byloje config/configuration.yml. Prašome perkrauti programą po redagavimo, idant įgalinti pakeitimus. text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it.
text_scm_command_not_available: SCM komanda nepasiekiama. Patikrinkite administravimo skydelio nustatymus. text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel.
+3 -3
View File
@@ -46,8 +46,8 @@ lv:
one: "aptuveni 1 stunda" one: "aptuveni 1 stunda"
other: "aptuveni %{count} stundas" other: "aptuveni %{count} stundas"
x_hours: x_hours:
one: "1 stunda" one: "1 hour"
other: "%{count} stundas" other: "%{count} hours"
x_days: x_days:
one: "1 diena" one: "1 diena"
other: "%{count} dienas" other: "%{count} dienas"
@@ -775,7 +775,7 @@ lv:
button_cancel: Atcelt button_cancel: Atcelt
button_activate: Aktivizēt button_activate: Aktivizēt
button_sort: Kārtot button_sort: Kārtot
button_log_time: Reģistrēt laiku button_log_time: Ilgs laiks
button_rollback: Atjaunot uz šo versiju button_rollback: Atjaunot uz šo versiju
button_watch: Vērot button_watch: Vērot
button_unwatch: Nevērot button_unwatch: Nevērot
+2 -2
View File
@@ -50,8 +50,8 @@ mk:
one: "околу 1 час" one: "околу 1 час"
other: "околу %{count} часа" other: "околу %{count} часа"
x_hours: x_hours:
one: "1 час" one: "1 hour"
other: "%{count} часа" other: "%{count} hours"
x_days: x_days:
one: "1 ден" one: "1 ден"
other: "%{count} дена" other: "%{count} дена"
+2 -2
View File
@@ -51,8 +51,8 @@ mn:
one: "1 цаг орчим" one: "1 цаг орчим"
other: "ойролцоогоор %{count} цаг" other: "ойролцоогоор %{count} цаг"
x_hours: x_hours:
one: "1 цаг" one: "1 hour"
other: "%{count} цаг" other: "%{count} hours"
x_days: x_days:
one: "1 өдөр" one: "1 өдөр"
other: "%{count} өдөр" other: "%{count} өдөр"
+27 -26
View File
@@ -50,7 +50,7 @@ nl:
other: "ongeveer %{count} uren" other: "ongeveer %{count} uren"
x_hours: x_hours:
one: "1 uur" one: "1 uur"
other: "%{count} uren" other: "%{count} hours"
x_days: x_days:
one: "1 dag" one: "1 dag"
other: "%{count} dagen" other: "%{count} dagen"
@@ -343,9 +343,9 @@ nl:
one: 1 open one: 1 open
other: "%{count} open" other: "%{count} open"
label_x_closed_issues_abbr: label_x_closed_issues_abbr:
zero: 0 gesloten zero: 0 closed
one: 1 gesloten one: 1 closed
other: "%{count} gesloten" other: "%{count} closed"
label_comment: Commentaar label_comment: Commentaar
label_comment_add: Voeg commentaar toe label_comment_add: Voeg commentaar toe
label_comment_added: Commentaar toegevoegd label_comment_added: Commentaar toegevoegd
@@ -1022,7 +1022,7 @@ nl:
text_project_closed: Dit project is gesloten en op alleen-lezen text_project_closed: Dit project is gesloten en op alleen-lezen
notice_user_successful_create: Gebruiker %{id} aangemaakt. notice_user_successful_create: Gebruiker %{id} aangemaakt.
field_core_fields: Standaard verleden field_core_fields: Standaard verleden
field_timeout: Timeout (in seconden) field_timeout: Timeout (in seconds)
setting_thumbnails_enabled: Geef bijlage miniaturen weer setting_thumbnails_enabled: Geef bijlage miniaturen weer
setting_thumbnails_size: Grootte miniaturen (in pixels) setting_thumbnails_size: Grootte miniaturen (in pixels)
label_status_transitions: Status transitie label_status_transitions: Status transitie
@@ -1036,35 +1036,36 @@ nl:
label_attribute_of_assigned_to: Toegewezen %{name} label_attribute_of_assigned_to: Toegewezen %{name}
label_attribute_of_fixed_version: Target versions %{name} label_attribute_of_fixed_version: Target versions %{name}
label_copy_subtasks: Kopieer subtaken label_copy_subtasks: Kopieer subtaken
label_copied_to: gekopieerd naar label_copied_to: copied to
label_copied_from: gekopieerd van label_copied_from: copied from
label_any_issues_in_project: any issues in project label_any_issues_in_project: any issues in project
label_any_issues_not_in_project: any issues not in project label_any_issues_not_in_project: any issues not in project
field_private_notes: Privé notities field_private_notes: Private notes
permission_view_private_notes: Bekijk privé notities permission_view_private_notes: View private notes
permission_set_notes_private: Maak notities privé permission_set_notes_private: Set notes as private
label_no_issues_in_project: geen issues in project label_no_issues_in_project: no issues in project
label_any: alle label_any: alle
label_last_n_weeks: afgelopen %{count} weken label_last_n_weeks: last %{count} weeks
setting_cross_project_subtasks: Sta subtaken in andere projecten toe setting_cross_project_subtasks: Allow cross-project subtasks
label_cross_project_descendants: Met subprojecten label_cross_project_descendants: Met subprojecten
label_cross_project_tree: Met project boom label_cross_project_tree: Met project boom
label_cross_project_hierarchy: Met project hiërarchie label_cross_project_hierarchy: Met project hiërarchie
label_cross_project_system: Met alle projecten label_cross_project_system: Met alle projecten
button_hide: Verberg button_hide: Hide
setting_non_working_week_days: Niet-werkdagen setting_non_working_week_days: Non-working days
label_in_the_next_days: in de volgende label_in_the_next_days: in the next
label_in_the_past_days: in de afgelopen label_in_the_past_days: in the past
label_attribute_of_user: User's %{name} label_attribute_of_user: User's %{name}
text_turning_multiple_off: Bij het uitschakelen van meerdere waardes zal er maar een waarde bewaard blijven. text_turning_multiple_off: If you disable multiple values, multiple values will be
removed in order to preserve only one value per item.
label_attribute_of_issue: Issue's %{name} label_attribute_of_issue: Issue's %{name}
permission_add_documents: Voeg documenten toe permission_add_documents: Add documents
permission_edit_documents: Bewerk documenten permission_edit_documents: Edit documents
permission_delete_documents: Verwijder documenten permission_delete_documents: Delete documents
label_gantt_progress_line: Voortgangslijn label_gantt_progress_line: Progress line
setting_jsonp_enabled: Schakel JSONP support in setting_jsonp_enabled: Enable JSONP support
field_inherit_members: Neem leden over field_inherit_members: Inherit members
field_closed_on: Gesloten field_closed_on: Closed
setting_default_projects_tracker_ids: Standaard trackers voor nieuwe projecten setting_default_projects_tracker_ids: Default trackers for new projects
label_total_time: Totaal label_total_time: Totaal
setting_emails_header: Email header setting_emails_header: Email header
+2 -2
View File
@@ -44,8 +44,8 @@
one: "rundt 1 time" one: "rundt 1 time"
other: "rundt %{count} timer" other: "rundt %{count} timer"
x_hours: x_hours:
one: "1 time" one: "1 hour"
other: "%{count} timer" other: "%{count} hours"
x_days: x_days:
one: "1 dag" one: "1 dag"
other: "%{count} dager" other: "%{count} dager"
+3 -3
View File
@@ -82,8 +82,8 @@ pl:
one: "około godziny" one: "około godziny"
other: "około %{count} godzin" other: "około %{count} godzin"
x_hours: x_hours:
one: "1 godzina" one: "1 hour"
other: "%{count} godzin" other: "%{count} hours"
x_days: x_days:
one: "1 dzień" one: "1 dzień"
other: "%{count} dni" other: "%{count} dni"
@@ -772,7 +772,7 @@ pl:
text_default_administrator_account_changed: Zmieniono domyślne hasło administratora text_default_administrator_account_changed: Zmieniono domyślne hasło administratora
text_destroy_time_entries: Usuń wpisy dziennika text_destroy_time_entries: Usuń wpisy dziennika
text_destroy_time_entries_question: Przepracowano %{hours} godzin przy zagadnieniu, które chcesz usunąć. Co chcesz zrobić? text_destroy_time_entries_question: Przepracowano %{hours} godzin przy zagadnieniu, które chcesz usunąć. Co chcesz zrobić?
text_email_delivery_not_configured: "Dostarczanie poczty elektronicznej nie zostało skonfigurowane, więc powiadamianie jest nieaktywne.\nSkonfiguruj serwer SMTP w config/configuration.yml a następnie zrestartuj aplikację i uaktywnij to." text_email_delivery_not_configured: "Dostarczanie poczty elektronicznej nie zostało skonfigurowane, więc powiadamianie jest nieaktywne.\nSkonfiguruj serwer SMTP w config/email.yml a następnie zrestartuj aplikację i uaktywnij to."
text_enumeration_category_reassign_to: 'Zmień przypisanie na tą wartość:' text_enumeration_category_reassign_to: 'Zmień przypisanie na tą wartość:'
text_enumeration_destroy_question: "%{count} obiektów jest przypisanych do tej wartości." text_enumeration_destroy_question: "%{count} obiektów jest przypisanych do tej wartości."
text_file_repository_writable: Zapisywalne repozytorium plików text_file_repository_writable: Zapisywalne repozytorium plików
+1 -1
View File
@@ -1105,5 +1105,5 @@ pt-BR:
setting_jsonp_enabled: Ativar suporte JSONP setting_jsonp_enabled: Ativar suporte JSONP
field_inherit_members: Herdar membros field_inherit_members: Herdar membros
field_closed_on: Fechado field_closed_on: Fechado
setting_default_projects_tracker_ids: Tipos padrões para novos projeto setting_default_projects_tracker_ids: Default trackers for new projects
label_total_time: Total label_total_time: Total
+1 -1
View File
@@ -1091,5 +1091,5 @@ pt:
setting_jsonp_enabled: Activar suporte JSONP setting_jsonp_enabled: Activar suporte JSONP
field_inherit_members: Herdar membros field_inherit_members: Herdar membros
field_closed_on: Fechado field_closed_on: Fechado
setting_default_projects_tracker_ids: Tipo de tarefa padrão para novos projectos setting_default_projects_tracker_ids: Default trackers for new projects
label_total_time: Total label_total_time: Total
+2 -2
View File
@@ -45,8 +45,8 @@ ro:
one: "aproximativ o oră" one: "aproximativ o oră"
other: "aproximativ %{count} ore" other: "aproximativ %{count} ore"
x_hours: x_hours:
one: "1 oră" one: "1 hour"
other: "%{count} ore" other: "%{count} hours"
x_days: x_days:
one: "o zi" one: "o zi"
other: "%{count} zile" other: "%{count} zile"
+10 -10
View File
@@ -1080,17 +1080,17 @@ ru:
label_between: между label_between: между
setting_issue_group_assignment: Разрешить назначение задач группам пользователей setting_issue_group_assignment: Разрешить назначение задач группам пользователей
label_diff: Разница(diff) label_diff: Разница(diff)
text_git_repository_note: Хранилище пустое и локальное (т.е. /gitrepo, c:\gitrepo) text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo)
description_query_sort_criteria_direction: Порядок сортировки description_query_sort_criteria_direction: Порядок сортировки
description_project_scope: Область поиска description_project_scope: Search scope
description_filter: Фильтр description_filter: Фильтр
description_user_mail_notification: Настройки почтовых оповещений description_user_mail_notification: Mail notification settings
description_date_from: Введите дату начала description_date_from: Enter start date
description_message_content: Содержание сообщения description_message_content: Message content
description_available_columns: Доступные столбцы description_available_columns: Available Columns
description_date_range_interval: Выберите диапазон, установив дату начала и дату окончания description_date_range_interval: Choose range by selecting start and end date
description_issue_category_reassign: Выберите категорию задачи description_issue_category_reassign: Choose issue category
description_search: Поле поиска description_search: Searchfield
description_notes: Примечания description_notes: Примечания
description_date_range_list: Выберите диапазон из списка description_date_range_list: Выберите диапазон из списка
description_choose_project: Проекты description_choose_project: Проекты
@@ -1145,7 +1145,7 @@ ru:
project_status_active: открытые project_status_active: открытые
project_status_closed: закрытые project_status_closed: закрытые
project_status_archived: архивированные project_status_archived: архивированные
text_project_closed: Проект закрыт и находится в режиме только для чтения. text_project_closed: Проект закрыт и находиться в режиме только для чтения.
notice_user_successful_create: Пользователь %{id} создан. notice_user_successful_create: Пользователь %{id} создан.
field_core_fields: Стандартные поля field_core_fields: Стандартные поля
field_timeout: Таймаут (в секундах) field_timeout: Таймаут (в секундах)
+2 -2
View File
@@ -46,8 +46,8 @@ sk:
one: "okolo 1 hodiny" one: "okolo 1 hodiny"
other: "okolo %{count} hodín" other: "okolo %{count} hodín"
x_hours: x_hours:
one: "1 hodina" one: "1 hour"
other: "%{count} hodín" other: "%{count} hours"
x_days: x_days:
one: "1 deň" one: "1 deň"
other: "%{count} dní" other: "%{count} dní"
+2 -2
View File
@@ -50,8 +50,8 @@ sl:
one: "okrog 1. ure" one: "okrog 1. ure"
other: "okrog %{count} ur" other: "okrog %{count} ur"
x_hours: x_hours:
one: "1 ura" one: "1 hour"
other: "%{count} ur" other: "%{count} hours"
x_days: x_days:
one: "1 dan" one: "1 dan"
other: "%{count} dni" other: "%{count} dni"
+2 -2
View File
@@ -50,8 +50,8 @@ sq:
one: "about 1 hour" one: "about 1 hour"
other: "about %{count} hours" other: "about %{count} hours"
x_hours: x_hours:
one: "1 ore" one: "1 hour"
other: "%{count} ore" other: "%{count} hours"
x_days: x_days:
one: "1 day" one: "1 day"
other: "%{count} days" other: "%{count} days"
+2 -2
View File
@@ -53,8 +53,8 @@ sr-YU:
one: "približno jedan sat" one: "približno jedan sat"
other: "približno %{count} sati" other: "približno %{count} sati"
x_hours: x_hours:
one: "1 sat" one: "1 hour"
other: "%{count} sati" other: "%{count} hours"
x_days: x_days:
one: "jedan dan" one: "jedan dan"
other: "%{count} dana" other: "%{count} dana"
+2 -2
View File
@@ -51,8 +51,8 @@ sr:
one: "приближно један сат" one: "приближно један сат"
other: "приближно %{count} сати" other: "приближно %{count} сати"
x_hours: x_hours:
one: "1 сат" one: "1 hour"
other: "%{count} сати" other: "%{count} hours"
x_days: x_days:
one: "један дан" one: "један дан"
other: "%{count} дана" other: "%{count} дана"
+5 -5
View File
@@ -272,7 +272,6 @@ sv:
field_author: Författare field_author: Författare
field_created_on: Skapad field_created_on: Skapad
field_updated_on: Uppdaterad field_updated_on: Uppdaterad
field_closed_on: Stängd
field_field_format: Format field_field_format: Format
field_is_for_all: För alla projekt field_is_for_all: För alla projekt
field_possible_values: Möjliga värden field_possible_values: Möjliga värden
@@ -373,7 +372,6 @@ sv:
field_timeout: "Timeout (i sekunder)" field_timeout: "Timeout (i sekunder)"
field_board_parent: Förälderforum field_board_parent: Förälderforum
field_private_notes: Privata anteckningar field_private_notes: Privata anteckningar
field_inherit_members: Ärv medlemmar
setting_app_title: Applikationsrubrik setting_app_title: Applikationsrubrik
setting_app_subtitle: Applikationsunderrubrik setting_app_subtitle: Applikationsunderrubrik
@@ -442,8 +440,6 @@ sv:
setting_thumbnails_enabled: Visa miniatyrbilder av bilagor setting_thumbnails_enabled: Visa miniatyrbilder av bilagor
setting_thumbnails_size: Storlek på miniatyrbilder (i pixlar) setting_thumbnails_size: Storlek på miniatyrbilder (i pixlar)
setting_non_working_week_days: Lediga dagar setting_non_working_week_days: Lediga dagar
setting_jsonp_enabled: Aktivera JSONP-stöd
setting_default_projects_tracker_ids: Standardärendetyper för nya projekt
permission_add_project: Skapa projekt permission_add_project: Skapa projekt
permission_add_subprojects: Skapa underprojekt permission_add_subprojects: Skapa underprojekt
@@ -661,7 +657,6 @@ sv:
one: 1 ärende one: 1 ärende
other: "%{count} ärenden" other: "%{count} ärenden"
label_total: Total label_total: Total
label_total_time: Total tid
label_permissions: Behörigheter label_permissions: Behörigheter
label_current_status: Nuvarande status label_current_status: Nuvarande status
label_new_statuses_allowed: Nya tillåtna statusvärden label_new_statuses_allowed: Nya tillåtna statusvärden
@@ -1125,3 +1120,8 @@ sv:
description_date_from: Ange startdatum description_date_from: Ange startdatum
description_date_to: Ange slutdatum description_date_to: Ange slutdatum
text_repository_identifier_info: 'Endast gemener (a-z), siffror, streck och understreck är tillåtna.<br />När identifieraren sparats kan den inte ändras.' text_repository_identifier_info: 'Endast gemener (a-z), siffror, streck och understreck är tillåtna.<br />När identifieraren sparats kan den inte ändras.'
setting_jsonp_enabled: Enable JSONP support
field_inherit_members: Inherit members
field_closed_on: Closed
setting_default_projects_tracker_ids: Default trackers for new projects
label_total_time: Total
+2 -2
View File
@@ -56,8 +56,8 @@ tr:
one: 'yaklaşık 1 saat' one: 'yaklaşık 1 saat'
other: 'yaklaşık %{count} saat' other: 'yaklaşık %{count} saat'
x_hours: x_hours:
one: "1 saat" one: "1 hour"
other: "%{count} saat" other: "%{count} hours"
x_days: x_days:
one: '1 gün' one: '1 gün'
other: '%{count} gün' other: '%{count} gün'
+4 -6
View File
@@ -4,8 +4,6 @@
"zh-TW": "zh-TW":
direction: ltr direction: ltr
jquery:
locale: "zh-TW"
date: date:
formats: formats:
# Use the strftime parameters for formats. # Use the strftime parameters for formats.
@@ -123,8 +121,8 @@
one: "約 1 小時" one: "約 1 小時"
other: "約 %{count} 小時" other: "約 %{count} 小時"
x_hours: x_hours:
one: "1 小時" one: "1 hour"
other: "%{count} 小時" other: "%{count} hours"
x_days: x_days:
one: "1 天" one: "1 天"
other: "%{count} 天" other: "%{count} 天"
@@ -485,7 +483,6 @@
setting_thumbnails_size: "縮圖大小 (單位: 像素 pixels)" setting_thumbnails_size: "縮圖大小 (單位: 像素 pixels)"
setting_non_working_week_days: 非工作日 setting_non_working_week_days: 非工作日
setting_jsonp_enabled: 啟用 JSONP 支援 setting_jsonp_enabled: 啟用 JSONP 支援
setting_default_projects_tracker_ids: 新專案預設使用的追蹤標籤
permission_add_project: 建立專案 permission_add_project: 建立專案
permission_add_subprojects: 建立子專案 permission_add_subprojects: 建立子專案
@@ -712,7 +709,7 @@
label_nobody: 無名 label_nobody: 無名
label_next: 下一頁 label_next: 下一頁
label_previous: 上一頁 label_previous: 上一頁
label_used_by: 已使用專案 label_used_by: Used by
label_details: 明細 label_details: 明細
label_add_note: 加入一個新筆記 label_add_note: 加入一個新筆記
label_per_page: 每頁 label_per_page: 每頁
@@ -1168,4 +1165,5 @@
description_date_from: 輸入起始日期 description_date_from: 輸入起始日期
description_date_to: 輸入結束日期 description_date_to: 輸入結束日期
text_repository_identifier_info: '僅允許使用小寫英文字母 (a-z), 阿拉伯數字, 虛線與底線。<br />一旦儲存之後, 代碼便無法再次被更改。' text_repository_identifier_info: '僅允許使用小寫英文字母 (a-z), 阿拉伯數字, 虛線與底線。<br />一旦儲存之後, 代碼便無法再次被更改。'
setting_default_projects_tracker_ids: Default trackers for new projects
label_total_time: 總計 label_total_time: 總計
+9 -17
View File
@@ -99,11 +99,9 @@ RedmineApp::Application.routes.draw do
match 'copy', :via => [:get, :post] match 'copy', :via => [:get, :post]
end end
shallow do resources :memberships, :shallow => true, :controller => 'members', :only => [:index, :show, :new, :create, :update, :destroy] do
resources :memberships, :controller => 'members', :only => [:index, :show, :new, :create, :update, :destroy] do collection do
collection do get 'autocomplete'
get 'autocomplete'
end
end end
end end
@@ -136,19 +134,15 @@ RedmineApp::Application.routes.draw do
get 'report', :on => :collection get 'report', :on => :collection
end end
resources :queries, :only => [:new, :create] resources :queries, :only => [:new, :create]
shallow do resources :issue_categories, :shallow => true
resources :issue_categories
end
resources :documents, :except => [:show, :edit, :update, :destroy] resources :documents, :except => [:show, :edit, :update, :destroy]
resources :boards resources :boards
shallow do resources :repositories, :shallow => true, :except => [:index, :show] do
resources :repositories, :except => [:index, :show] do member do
member do match 'committers', :via => [:get, :post]
match 'committers', :via => [:get, :post]
end
end end
end end
match 'wiki/index', :controller => 'wiki', :action => 'index', :via => :get match 'wiki/index', :controller => 'wiki', :action => 'index', :via => :get
resources :wiki, :except => [:index, :new, :create], :as => 'wiki_page' do resources :wiki, :except => [:index, :new, :create], :as => 'wiki_page' do
member do member do
@@ -182,9 +176,7 @@ RedmineApp::Application.routes.draw do
get 'report' get 'report'
end end
end end
shallow do resources :relations, :shallow => true, :controller => 'issue_relations', :only => [:index, :show, :create, :destroy]
resources :relations, :controller => 'issue_relations', :only => [:index, :show, :create, :destroy]
end
end end
match '/issues', :controller => 'issues', :action => 'destroy', :via => :delete match '/issues', :controller => 'issues', :action => 'destroy', :via => :delete
-68
View File
@@ -4,74 +4,6 @@ Redmine - project management software
Copyright (C) 2006-2013 Jean-Philippe Lang Copyright (C) 2006-2013 Jean-Philippe Lang
http://www.redmine.org/ http://www.redmine.org/
== 2013-09-14 v2.3.3
* Defect #13008: Usage of attribute_present? in UserPreference
* Defect #14340: Autocomplete fields rendering issue with alternate theme
* Defect #14366: Spent Time report sorting on custom fields causes error
* Defect #14369: Open/closed issue counts on issues summary are not displayed with SQLServer
* Defect #14401: Filtering issues on "related to" may ignore other filters
* Defect #14415: Spent time details and report should ignore 'Setting.display_subprojects_issues?' when 'Subproject' filter is enabled.
* Defect #14422: CVS root_url not recognized when connection string does not include port
* Defect #14447: Additional status transitions for assignees do not work if assigned to a group
* Defect #14511: warning: class variable access from toplevel on Ruby 2.0
* Defect #14562: diff of CJK (Chinese/Japanese/Korean) is broken on Ruby 1.8
* Defect #14584: Standard fields disabled for certain trackers still appear in email notifications
* Defect #14607: rake redmine:load_default_data Error
* Defect #14697: Wrong Russian translation in close project message
* Defect #14798: Wrong done_ratio calculation for parent with subtask having estimated_hours=0
* Patch #14485: Traditional Chinese translation for 2.3-stable
* Patch #14502: Russian translation for 2.3-stable
* Patch #14531: Spanish translations for 2.3.x
* Patch #14686: Portuguese translation for 2.3-stable
== 2013-07-14 v2.3.2
* Defect #9996: configuration.yml in documentation , but redmine ask me to create email.yml
* Defect #13692: warning: already initialized constant on Ruby 1.8.7
* Defect #13783: Internal error on time tracking activity enumeration deletion
* Defect #13821: "obj" parameter is not defined for macros used in description of documents
* Defect #13850: Unable to set custom fields for versions using the REST API
* Defect #13910: Values of custom fields are not kept in issues when copying a project
* Defect #13950: Duplicate Lithuanian "error_attachment_too_big" translation keys
* Defect #14015: Ruby hangs when adding a subtask
* Defect #14020: Locking and unlocking a user resets the email notification checkbox
* Defect #14023: Can't delete relation when Redmine runs in a subpath
* Defect #14051: Filtering issues with custom field in date format with NULL(empty) value
* Defect #14178: PDF API broken in version 2.3.1
* Defect #14186: Project name is not properly escaped in issue filters JSON
* Defect #14242: Project auto generation fails when projects created in the same time
* Defect #14245: Gem::InstallError: nokogiri requires Ruby version >= 1.9.2.
* Defect #14346: Latvian translation for "Log time"
* Feature #12888: Adding markings to emails generated by Private comments
* Feature #14419: Include RUBY_PATCHLEVEL and RUBY_RELEASE_DATE in info.rb
* Patch #14005: Swedish Translation for 2.3-stable
* Patch #14101: Receive IMAP by uid's
* Patch #14103: Disconnect and logout from IMAP after mail receive
* Patch #14145: German translation of x_hours
* Patch #14182: pt-BR translation for 2.3-stable
* Patch #14196: Italian translation for 2.3-stable
* Patch #14221: Translation of x_hours for many languages
== 2013-05-01 v2.3.1
* Defect #12650: Lost text after selection in issue list with IE
* Defect #12684: Hotkey for Issue-Edit doesn't work as expected
* Defect #13405: Commit link title is escaped twice when using "commit:" prefix
* Defect #13541: Can't access SCM when log/production.scm.stderr.log is not writable
* Defect #13579: Datepicker uses Simplified Chinese in Traditional Chinese locale
* Defect #13584: Missing Portuguese jQuery UI date picker
* Defect #13586: Circular loop testing prevents precedes/follows relation between subtasks
* Defect #13618: CSV export of spent time ignores filters and columns selection
* Defect #13630: PDF export generates the issue id twice
* Defect #13644: Diff - Internal Error
* Defect #13712: Fix email rake tasks to also support no_account_notice and default_group options
* Defect #13811: Broken javascript in IE7 ; recurrence of #12195
* Defect #13823: Trailing comma in javascript files
* Patch #13531: Traditional Chinese translation for 2.3-stable
* Patch #13552: Dutch translations for 2.3-stable
* Patch #13678: Lithuanian translation for 2.3-stable
== 2013-03-19 v2.3.0 == 2013-03-19 v2.3.0
* Defect #3107: Issue with two digit year on Logtime * Defect #3107: Issue with two digit year on Logtime
+1 -8
View File
@@ -7,7 +7,7 @@ http://www.redmine.org/
== Requirements == Requirements
* Ruby 1.8.7, 1.9.2, 1.9.3 or 2.0.0 * Ruby 1.8.7, 1.9.2 or 1.9.3
* RubyGems * RubyGems
* Bundler >= 1.0.21 * Bundler >= 1.0.21
@@ -15,7 +15,6 @@ http://www.redmine.org/
* MySQL (tested with MySQL 5.1) * MySQL (tested with MySQL 5.1)
* PostgreSQL (tested with PostgreSQL 9.1) * PostgreSQL (tested with PostgreSQL 9.1)
* SQLite3 (tested with SQLite 3.7) * SQLite3 (tested with SQLite 3.7)
* SQLServer (tested with SQLServer 2012)
Optional: Optional:
* SCM binaries (e.g. svn, git...), for repository browsing (must be available in PATH) * SCM binaries (e.g. svn, git...), for repository browsing (must be available in PATH)
@@ -40,12 +39,6 @@ Optional:
of the rmagick gem using: of the rmagick gem using:
bundle install --without development test rmagick bundle install --without development test rmagick
Only the gems that are needed by the adapters you've specified in your database
configuration file are actually installed (eg. if your config/database.yml
uses the 'mysql2' adapter, then only the mysql2 gem will be installed). Don't
forget to re-run `bundle install` when you change config/database.yml for using
other database adapters.
If you need to load some gems that are not required by Redmine core (eg. fcgi), If you need to load some gems that are not required by Redmine core (eg. fcgi),
you can create a file named Gemfile.local at the root of your redmine directory. you can create a file named Gemfile.local at the root of your redmine directory.
It will be loaded automatically when running `bundle install`. It will be loaded automatically when running `bundle install`.
+3 -2
View File
@@ -1,7 +1,8 @@
begin begin
require 'zlib' require 'zlib'
@@__have_zlib = true
rescue rescue
# Zlib not available @@__have_zlib = false
end end
require 'rexml/document' require 'rexml/document'
@@ -210,7 +211,7 @@ module SVG
@doc.write( data, 0 ) @doc.write( data, 0 )
if @config[:compress] if @config[:compress]
if Object.const_defined?(:Zlib) if @@__have_zlib
inp, out = IO.pipe inp, out = IO.pipe
gz = Zlib::GzipWriter.new( out ) gz = Zlib::GzipWriter.new( out )
gz.write data gz.write data
+16 -16
View File
@@ -380,7 +380,7 @@ module Redmine
col_width col_width
end end
def render_table_header(pdf, query, col_width, row_height, table_width) def render_table_header(pdf, query, col_width, row_height, col_id_width, table_width)
# headers # headers
pdf.SetFontStyle('B',8) pdf.SetFontStyle('B',8)
pdf.SetFillColor(230, 230, 230) pdf.SetFillColor(230, 230, 230)
@@ -389,12 +389,13 @@ module Redmine
base_x = pdf.GetX base_x = pdf.GetX
base_y = pdf.GetY base_y = pdf.GetY
max_height = issues_to_pdf_write_cells(pdf, query.inline_columns, col_width, row_height, true) max_height = issues_to_pdf_write_cells(pdf, query.inline_columns, col_width, row_height, true)
pdf.Rect(base_x, base_y, table_width, max_height, 'FD'); pdf.Rect(base_x, base_y, table_width + col_id_width, max_height, 'FD');
pdf.SetXY(base_x, base_y); pdf.SetXY(base_x, base_y);
# write the cells on page # write the cells on page
pdf.RDMCell(col_id_width, row_height, "#", "T", 0, 'C', 1)
issues_to_pdf_write_cells(pdf, query.inline_columns, col_width, row_height, true) issues_to_pdf_write_cells(pdf, query.inline_columns, col_width, row_height, true)
issues_to_pdf_draw_borders(pdf, base_x, base_y, base_y + max_height, 0, col_width) issues_to_pdf_draw_borders(pdf, base_x, base_y, base_y + max_height, col_id_width, col_width)
pdf.SetY(base_y + max_height); pdf.SetY(base_y + max_height);
# rows # rows
@@ -416,22 +417,22 @@ module Redmine
# Landscape A4 = 210 x 297 mm # Landscape A4 = 210 x 297 mm
page_height = 210 page_height = 210
page_width = 297 page_width = 297
left_margin = 10
right_margin = 10 right_margin = 10
bottom_margin = 20 bottom_margin = 20
col_id_width = 10
row_height = 4 row_height = 4
# column widths # column widths
table_width = page_width - right_margin - left_margin table_width = page_width - right_margin - 10 # fixed left margin
col_width = [] col_width = []
unless query.inline_columns.empty? unless query.inline_columns.empty?
col_width = calc_col_width(issues, query, table_width, pdf) col_width = calc_col_width(issues, query, table_width - col_id_width, pdf)
table_width = col_width.inject(0) {|s,v| s += v} table_width = col_width.inject(0) {|s,v| s += v}
end end
# use full width if the description is displayed # use full width if the description is displayed
if table_width > 0 && query.has_column?(:description) if table_width > 0 && query.has_column?(:description)
col_width = col_width.map {|w| w * (page_width - right_margin - left_margin) / table_width} col_width = col_width.map {|w| w = w * (page_width - right_margin - 10 - col_id_width) / table_width}
table_width = col_width.inject(0) {|s,v| s += v} table_width = col_width.inject(0) {|s,v| s += v}
end end
@@ -439,7 +440,7 @@ module Redmine
pdf.SetFontStyle('B',11) pdf.SetFontStyle('B',11)
pdf.RDMCell(190,10, title) pdf.RDMCell(190,10, title)
pdf.Ln pdf.Ln
render_table_header(pdf, query, col_width, row_height, table_width) render_table_header(pdf, query, col_width, row_height, col_id_width, table_width)
previous_group = false previous_group = false
issue_list(issues) do |issue, level| issue_list(issues) do |issue, level|
if query.grouped? && if query.grouped? &&
@@ -448,7 +449,7 @@ module Redmine
group_label = group.blank? ? 'None' : group.to_s.dup group_label = group.blank? ? 'None' : group.to_s.dup
group_label << " (#{query.issue_count_by_group[group]})" group_label << " (#{query.issue_count_by_group[group]})"
pdf.Bookmark group_label, 0, -1 pdf.Bookmark group_label, 0, -1
pdf.RDMCell(table_width, row_height * 2, group_label, 1, 1, 'L') pdf.RDMCell(table_width + col_id_width, row_height * 2, group_label, 1, 1, 'L')
pdf.SetFontStyle('',8) pdf.SetFontStyle('',8)
previous_group = group previous_group = group
end end
@@ -467,14 +468,15 @@ module Redmine
space_left = page_height - base_y - bottom_margin space_left = page_height - base_y - bottom_margin
if max_height > space_left if max_height > space_left
pdf.AddPage("L") pdf.AddPage("L")
render_table_header(pdf, query, col_width, row_height, table_width) render_table_header(pdf, query, col_width, row_height, col_id_width, table_width)
base_x = pdf.GetX base_x = pdf.GetX
base_y = pdf.GetY base_y = pdf.GetY
end end
# write the cells on page # write the cells on page
pdf.RDMCell(col_id_width, row_height, issue.id.to_s, "T", 0, 'C', 1)
issues_to_pdf_write_cells(pdf, col_values, col_width, row_height) issues_to_pdf_write_cells(pdf, col_values, col_width, row_height)
issues_to_pdf_draw_borders(pdf, base_x, base_y, base_y + max_height, 0, col_width) issues_to_pdf_draw_borders(pdf, base_x, base_y, base_y + max_height, col_id_width, col_width)
pdf.SetY(base_y + max_height); pdf.SetY(base_y + max_height);
if query.has_column?(:description) && issue.description? if query.has_column?(:description) && issue.description?
@@ -511,11 +513,9 @@ module Redmine
end end
# Draw lines to close the row (MultiCell border drawing in not uniform) # Draw lines to close the row (MultiCell border drawing in not uniform)
#
# parameter "col_id_width" is not used. it is kept for compatibility.
def issues_to_pdf_draw_borders(pdf, top_x, top_y, lower_y, def issues_to_pdf_draw_borders(pdf, top_x, top_y, lower_y,
col_id_width, col_widths) id_width, col_widths)
col_x = top_x col_x = top_x + id_width
pdf.Line(col_x, top_y, col_x, lower_y) # id right border pdf.Line(col_x, top_y, col_x, lower_y) # id right border
col_widths.each do |width| col_widths.each do |width|
col_x += width col_x += width
+1 -1
View File
@@ -675,7 +675,7 @@ module Redmine
start_date + (end_date - start_date + 1) * (progress / 100.0) start_date + (end_date - start_date + 1) * (progress / 100.0)
end end
# TODO: Sorts a collection of issues by start_date, due_date, id for gantt rendering # Sorts a collection of issues by start_date, due_date, id for gantt rendering
def sort_issues!(issues) def sort_issues!(issues)
issues.sort! { |a, b| gantt_issue_compare(a, b) } issues.sort! { |a, b| gantt_issue_compare(a, b) }
end end
+10 -12
View File
@@ -29,27 +29,25 @@ module Redmine
imap = Net::IMAP.new(host, port, ssl) imap = Net::IMAP.new(host, port, ssl)
imap.login(imap_options[:username], imap_options[:password]) unless imap_options[:username].nil? imap.login(imap_options[:username], imap_options[:password]) unless imap_options[:username].nil?
imap.select(folder) imap.select(folder)
imap.uid_search(['NOT', 'SEEN']).each do |uid| imap.search(['NOT', 'SEEN']).each do |message_id|
msg = imap.uid_fetch(uid,'RFC822')[0].attr['RFC822'] msg = imap.fetch(message_id,'RFC822')[0].attr['RFC822']
logger.debug "Receiving message #{uid}" if logger && logger.debug? logger.debug "Receiving message #{message_id}" if logger && logger.debug?
if MailHandler.receive(msg, options) if MailHandler.receive(msg, options)
logger.debug "Message #{uid} successfully received" if logger && logger.debug? logger.debug "Message #{message_id} successfully received" if logger && logger.debug?
if imap_options[:move_on_success] if imap_options[:move_on_success]
imap.uid_copy(uid, imap_options[:move_on_success]) imap.copy(message_id, imap_options[:move_on_success])
end end
imap.uid_store(uid, "+FLAGS", [:Seen, :Deleted]) imap.store(message_id, "+FLAGS", [:Seen, :Deleted])
else else
logger.debug "Message #{uid} can not be processed" if logger && logger.debug? logger.debug "Message #{message_id} can not be processed" if logger && logger.debug?
imap.uid_store(uid, "+FLAGS", [:Seen]) imap.store(message_id, "+FLAGS", [:Seen])
if imap_options[:move_on_failure] if imap_options[:move_on_failure]
imap.uid_copy(uid, imap_options[:move_on_failure]) imap.copy(message_id, imap_options[:move_on_failure])
imap.uid_store(uid, "+FLAGS", [:Deleted]) imap.store(message_id, "+FLAGS", [:Deleted])
end end
end end
end end
imap.expunge imap.expunge
imap.logout
imap.disconnect
end end
private private
+3 -3
View File
@@ -10,16 +10,16 @@ module Redmine
s = "Environment:\n" s = "Environment:\n"
s << [ s << [
["Redmine version", Redmine::VERSION], ["Redmine version", Redmine::VERSION],
["Ruby version", "#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]"], ["Ruby version", "#{RUBY_VERSION} (#{RUBY_PLATFORM})"],
["Rails version", Rails::VERSION::STRING], ["Rails version", Rails::VERSION::STRING],
["Environment", Rails.env], ["Environment", Rails.env],
["Database adapter", ActiveRecord::Base.connection.adapter_name] ["Database adapter", ActiveRecord::Base.connection.adapter_name]
].map {|info| " %-30s %s" % info}.join("\n") ].map {|info| " %-40s %s" % info}.join("\n")
s << "\nRedmine plugins:\n" s << "\nRedmine plugins:\n"
plugins = Redmine::Plugin.all plugins = Redmine::Plugin.all
if plugins.any? if plugins.any?
s << plugins.map {|plugin| " %-30s %s" % [plugin.id.to_s, plugin.version.to_s]}.join("\n") s << plugins.map {|plugin| " %-40s %s" % [plugin.id.to_s, plugin.version.to_s]}.join("\n")
else else
s << " no plugin installed" s << " no plugin installed"
end end
+5 -26
View File
@@ -219,39 +219,18 @@ module Redmine
end end
# Path to the file where scm stderr output is logged # Path to the file where scm stderr output is logged
# Returns nil if the log file is not writable
def self.stderr_log_file def self.stderr_log_file
if @stderr_log_file.nil? @stderr_log_path ||=
writable = false Redmine::Configuration['scm_stderr_log_file'].presence ||
path = Redmine::Configuration['scm_stderr_log_file'].presence Rails.root.join("log/#{Rails.env}.scm.stderr.log").to_s
path ||= Rails.root.join("log/#{Rails.env}.scm.stderr.log").to_s
if File.exists?(path)
if File.file?(path) && File.writable?(path)
writable = true
else
logger.warn("SCM log file (#{path}) is not writable")
end
else
begin
File.open(path, "w") {}
writable = true
rescue => e
logger.warn("SCM log file (#{path}) cannot be created: #{e.message}")
end
end
@stderr_log_file = writable ? path : false
end
@stderr_log_file || nil
end end
def self.shellout(cmd, options = {}, &block) def self.shellout(cmd, options = {}, &block)
if logger && logger.debug? if logger && logger.debug?
logger.debug "Shelling out: #{strip_credential(cmd)}" logger.debug "Shelling out: #{strip_credential(cmd)}"
# Capture stderr in a log file
if stderr_log_file
cmd = "#{cmd} 2>>#{shell_quote(stderr_log_file)}"
end
end end
# Capture stderr in a log file
cmd = "#{cmd} 2>>#{shell_quote(stderr_log_file)}"
begin begin
mode = "r+" mode = "r+"
IO.popen(cmd, mode) do |io| IO.popen(cmd, mode) do |io|
+1 -1
View File
@@ -335,7 +335,7 @@ module Redmine
# :pserver:anonymous@foo.bar:/path => /path # :pserver:anonymous@foo.bar:/path => /path
# :ext:cvsservername:/path => /path # :ext:cvsservername:/path => /path
def root_url_path def root_url_path
root_url.to_s.gsub(%r{^:.+?(?=/)}, '') root_url.to_s.gsub(/^:.+:\d*/, '')
end end
# convert a date/time into the CVS-format # convert a date/time into the CVS-format
+1
View File
@@ -33,6 +33,7 @@ module Redmine
module CodeRay module CodeRay
require 'coderay' require 'coderay'
require 'coderay/helpers/file_type'
class << self class << self
# Highlights +text+ as the content of +filename+ # Highlights +text+ as the content of +filename+
+5 -17
View File
@@ -199,27 +199,15 @@ module Redmine
while starting < max && line_left[starting] == line_right[starting] while starting < max && line_left[starting] == line_right[starting]
starting += 1 starting += 1
end end
if (! "".respond_to?(:force_encoding)) && starting < line_left.size while line_left[starting].ord.between?(128, 191) && starting > 0
while line_left[starting].ord.between?(128, 191) && starting > 0 starting -= 1
starting -= 1
end
end end
ending = -1 ending = -1
while ending >= -(max - starting) && (line_left[ending] == line_right[ending]) while ending >= -(max - starting) && line_left[ending] == line_right[ending]
ending -= 1 ending -= 1
end end
if (! "".respond_to?(:force_encoding)) && ending > (-1 * line_left.size) while line_left[ending].ord.between?(128, 191) && ending > -1
while line_left[ending].ord.between?(128, 255) && ending < -1 ending -= 1
if line_left[ending].ord.between?(128, 191)
if line_left[ending + 1].ord.between?(128, 191)
ending += 1
else
break
end
else
ending += 1
end
end
end end
unless starting == 0 && ending == -1 unless starting == 0 && ending == -1
[starting, ending] [starting, ending]
+1 -1
View File
@@ -4,7 +4,7 @@ module Redmine
module VERSION #:nodoc: module VERSION #:nodoc:
MAJOR = 2 MAJOR = 2
MINOR = 3 MINOR = 3
TINY = 3 TINY = 0
# Branch values: # Branch values:
# * official release: nil # * official release: nil
-10
View File
@@ -29,8 +29,6 @@ General options:
create: create a user account create: create a user account
no_permission_check=1 disable permission checking when receiving no_permission_check=1 disable permission checking when receiving
the email the email
no_account_notice=1 disable new user account notification
default_group=foo,bar adds created user to foo and bar groups
Issue attributes control options: Issue attributes control options:
project=PROJECT identifier of the target project project=PROJECT identifier of the target project
@@ -60,8 +58,6 @@ END_DESC
options[:allow_override] = ENV['allow_override'] if ENV['allow_override'] options[:allow_override] = ENV['allow_override'] if ENV['allow_override']
options[:unknown_user] = ENV['unknown_user'] if ENV['unknown_user'] options[:unknown_user] = ENV['unknown_user'] if ENV['unknown_user']
options[:no_permission_check] = ENV['no_permission_check'] if ENV['no_permission_check'] options[:no_permission_check] = ENV['no_permission_check'] if ENV['no_permission_check']
options[:no_account_notice] = ENV['no_account_notice'] if ENV['no_account_notice']
options[:default_group] = ENV['default_group'] if ENV['default_group']
MailHandler.receive(STDIN.read, options) MailHandler.receive(STDIN.read, options)
end end
@@ -77,8 +73,6 @@ General options:
create: create a user account create: create a user account
no_permission_check=1 disable permission checking when receiving no_permission_check=1 disable permission checking when receiving
the email the email
no_account_notice=1 disable new user account notification
default_group=foo,bar adds created user to foo and bar groups
Available IMAP options: Available IMAP options:
host=HOST IMAP server host (default: 127.0.0.1) host=HOST IMAP server host (default: 127.0.0.1)
@@ -135,8 +129,6 @@ END_DESC
options[:allow_override] = ENV['allow_override'] if ENV['allow_override'] options[:allow_override] = ENV['allow_override'] if ENV['allow_override']
options[:unknown_user] = ENV['unknown_user'] if ENV['unknown_user'] options[:unknown_user] = ENV['unknown_user'] if ENV['unknown_user']
options[:no_permission_check] = ENV['no_permission_check'] if ENV['no_permission_check'] options[:no_permission_check] = ENV['no_permission_check'] if ENV['no_permission_check']
options[:no_account_notice] = ENV['no_account_notice'] if ENV['no_account_notice']
options[:default_group] = ENV['default_group'] if ENV['default_group']
Redmine::IMAP.check(imap_options, options) Redmine::IMAP.check(imap_options, options)
end end
@@ -170,8 +162,6 @@ END_DESC
options[:allow_override] = ENV['allow_override'] if ENV['allow_override'] options[:allow_override] = ENV['allow_override'] if ENV['allow_override']
options[:unknown_user] = ENV['unknown_user'] if ENV['unknown_user'] options[:unknown_user] = ENV['unknown_user'] if ENV['unknown_user']
options[:no_permission_check] = ENV['no_permission_check'] if ENV['no_permission_check'] options[:no_permission_check] = ENV['no_permission_check'] if ENV['no_permission_check']
options[:no_account_notice] = ENV['no_account_notice'] if ENV['no_account_notice']
options[:default_group] = ENV['default_group'] if ENV['default_group']
Redmine::POP3.check(pop_options, options) Redmine::POP3.check(pop_options, options)
end end
-1
View File
@@ -2,7 +2,6 @@ desc 'Load Redmine default configuration data. Language is chosen interactively
namespace :redmine do namespace :redmine do
task :load_default_data => :environment do task :load_default_data => :environment do
require 'custom_field'
include Redmine::I18n include Redmine::I18n
set_language_if_valid('en') set_language_if_valid('en')
+10 -10
View File
@@ -14,12 +14,12 @@ function toggleCheckboxesBySelector(selector) {
$(selector).each(function(index) { $(selector).each(function(index) {
if (!$(this).is(':checked')) { all_checked = false; } if (!$(this).is(':checked')) { all_checked = false; }
}); });
$(selector).attr('checked', !all_checked); $(selector).attr('checked', !all_checked)
} }
function showAndScrollTo(id, focus) { function showAndScrollTo(id, focus) {
$('#'+id).show(); $('#'+id).show();
if (focus !== null) { if (focus!=null) {
$('#'+focus).focus(); $('#'+focus).focus();
} }
$('html, body').animate({scrollTop: $('#'+id).offset().top}, 100); $('html, body').animate({scrollTop: $('#'+id).offset().top}, 100);
@@ -131,10 +131,10 @@ function buildFilterRow(field, operator, values) {
select = tr.find('td.operator select'); select = tr.find('td.operator select');
for (i=0;i<operators.length;i++){ for (i=0;i<operators.length;i++){
var option = $('<option>').val(operators[i]).text(operatorLabels[operators[i]]); var option = $('<option>').val(operators[i]).text(operatorLabels[operators[i]]);
if (operators[i] == operator) { option.attr('selected', true); } if (operators[i] == operator) {option.attr('selected', true)};
select.append(option); select.append(option);
} }
select.change(function(){ toggleOperator(field); }); select.change(function(){toggleOperator(field)});
switch (filterOptions['type']){ switch (filterOptions['type']){
case "list": case "list":
@@ -146,7 +146,7 @@ function buildFilterRow(field, operator, values) {
' <span class="toggle-multiselect">&nbsp;</span></span>' ' <span class="toggle-multiselect">&nbsp;</span></span>'
); );
select = tr.find('td.values select'); select = tr.find('td.values select');
if (values.length > 1) { select.attr('multiple', true); } if (values.length > 1) {select.attr('multiple', true)};
for (i=0;i<filterValues.length;i++){ for (i=0;i<filterValues.length;i++){
var filterValue = filterValues[i]; var filterValue = filterValues[i];
var option = $('<option>'); var option = $('<option>');
@@ -189,7 +189,7 @@ function buildFilterRow(field, operator, values) {
var filterValue = allProjects[i]; var filterValue = allProjects[i];
var option = $('<option>'); var option = $('<option>');
option.val(filterValue[1]).text(filterValue[0]); option.val(filterValue[1]).text(filterValue[0]);
if (values[0] == filterValue[1]) { option.attr('selected', true); } if (values[0] == filterValue[1]) {option.attr('selected', true)};
select.append(option); select.append(option);
} }
case "integer": case "integer":
@@ -352,7 +352,7 @@ function setPredecessorFieldsVisibility() {
function showModal(id, width) { function showModal(id, width) {
var el = $('#'+id).first(); var el = $('#'+id).first();
if (el.length === 0 || el.is(':visible')) {return;} if (el.length == 0 || el.is(':visible')) {return;}
var title = el.find('h3.title').text(); var title = el.find('h3.title').text();
el.dialog({ el.dialog({
width: width, width: width,
@@ -462,7 +462,7 @@ function observeAutocompleteField(fieldId, url, options) {
source: url, source: url,
minLength: 2, minLength: 2,
search: function(){$('#'+fieldId).addClass('ajax-loading');}, search: function(){$('#'+fieldId).addClass('ajax-loading');},
response: function(){$('#'+fieldId).removeClass('ajax-loading');} response: function(){$('#'+fieldId).removeClass('ajax-loading');},
}, options)); }, options));
$('#'+fieldId).addClass('autocomplete'); $('#'+fieldId).addClass('autocomplete');
}); });
@@ -546,13 +546,13 @@ function warnLeavingUnsaved(message) {
}); });
if (warn) {return warnLeavingUnsavedMessage;} if (warn) {return warnLeavingUnsavedMessage;}
}; };
} };
function setupAjaxIndicator() { function setupAjaxIndicator() {
$('#ajax-indicator').bind('ajaxSend', function(event, xhr, settings) { $('#ajax-indicator').bind('ajaxSend', function(event, xhr, settings) {
if ($('.ajax-loading').length === 0 && settings.contentType != 'application/octet-stream') { if ($('.ajax-loading').length == 0 && settings.contentType != 'application/octet-stream') {
$('#ajax-indicator').show(); $('#ajax-indicator').show();
} }
}); });
+1 -1
View File
@@ -186,7 +186,7 @@ function contextMenuCheckSelectionBox(tr, checked) {
function contextMenuClearDocumentSelection() { function contextMenuClearDocumentSelection() {
// TODO // TODO
if (document.selection) { if (document.selection) {
document.selection.empty(); // IE document.selection.clear(); // IE
} else { } else {
window.getSelection().removeAllRanges(); window.getSelection().removeAllRanges();
} }
+1 -1
View File
@@ -93,7 +93,7 @@ function drawRelations() {
.attr({stroke: "none", .attr({stroke: "none",
fill: color, fill: color,
"stroke-linecap": "butt", "stroke-linecap": "butt",
"stroke-linejoin": "miter" "stroke-linejoin": "miter",
}); });
}); });
} }
-22
View File
@@ -1,22 +0,0 @@
/* Portuguese initialisation for the jQuery UI date picker plugin. */
jQuery(function($){
$.datepicker.regional['pt'] = {
closeText: 'Fechar',
prevText: '&#x3C;Anterior',
nextText: 'Seguinte',
currentText: 'Hoje',
monthNames: ['Janeiro','Fevereiro','Março','Abril','Maio','Junho',
'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun',
'Jul','Ago','Set','Out','Nov','Dez'],
dayNames: ['Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'],
dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],
dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],
weekHeader: 'Sem',
dateFormat: 'dd/mm/yy',
firstDay: 0,
isRTL: false,
showMonthAfterYear: false,
yearSuffix: ''};
$.datepicker.setDefaults($.datepicker.regional['pt']);
});
@@ -9,8 +9,8 @@ jsToolBar.strings['Heading 2'] = 'Heading 2';
jsToolBar.strings['Heading 3'] = 'Heading 3'; jsToolBar.strings['Heading 3'] = 'Heading 3';
jsToolBar.strings['Unordered list'] = 'Nenumeruotas sąrašas'; jsToolBar.strings['Unordered list'] = 'Nenumeruotas sąrašas';
jsToolBar.strings['Ordered list'] = 'Numeruotas sąrašas'; jsToolBar.strings['Ordered list'] = 'Numeruotas sąrašas';
jsToolBar.strings['Quote'] = 'Cituoti'; jsToolBar.strings['Quote'] = 'Quote';
jsToolBar.strings['Unquote'] = 'Pašalinti citavimą'; jsToolBar.strings['Unquote'] = 'Remove Quote';
jsToolBar.strings['Preformatted text'] = 'Preformatuotas tekstas'; jsToolBar.strings['Preformatted text'] = 'Preformatuotas tekstas';
jsToolBar.strings['Wiki link'] = 'Nuoroda į Wiki puslapį'; jsToolBar.strings['Wiki link'] = 'Nuoroda į Wiki puslapį';
jsToolBar.strings['Image'] = 'Paveikslas'; jsToolBar.strings['Image'] = 'Paveikslas';
+1 -1
View File
@@ -43,7 +43,7 @@ function drawRevisionGraph(holder, commits_hash, graph_space) {
revisionGraph.circle(x, y, 3) revisionGraph.circle(x, y, 3)
.attr({ .attr({
fill: colors[commit.space], fill: colors[commit.space],
stroke: 'none' stroke: 'none',
}).toFront(); }).toFront();
// paths to parents // paths to parents
$.each(commit.parent_scmids, function(index, parent_scmid) { $.each(commit.parent_scmids, function(index, parent_scmid) {
+1 -1
View File
@@ -575,7 +575,7 @@ table.members td.group { padding-left: 20px; background: url(../images/group.png
input#principal_search, input#user_search {width:90%} input#principal_search, input#user_search {width:90%}
input.autocomplete { input.autocomplete {
background: #fff url(../images/magnifier.png) no-repeat 2px 50%; padding-left:20px !important; background: #fff url(../images/magnifier.png) no-repeat 2px 50%; padding-left:20px;
border:1px solid #9EB1C2; border-radius:2px; height:1.5em; border:1px solid #9EB1C2; border-radius:2px; height:1.5em;
} }
input.autocomplete.ajax-loading { input.autocomplete.ajax-loading {
+1 -2
View File
@@ -3,9 +3,8 @@ changesets_001:
commit_date: 2007-04-11 commit_date: 2007-04-11
committed_on: 2007-04-11 15:14:44 +02:00 committed_on: 2007-04-11 15:14:44 +02:00
revision: 1 revision: 1
scmid: 691322a8eb01e11fd7
id: 100 id: 100
comments: 'My very first commit do not escaping #<>&' comments: My very first commit
repository_id: 10 repository_id: 10
committer: dlopper committer: dlopper
user_id: 3 user_id: 3
-7
View File
@@ -1,7 +0,0 @@
--- a.txt 2013-04-05 14:19:39.000000000 +0900
+++ b.txt 2013-04-05 14:19:51.000000000 +0900
@@ -1,3 +1,3 @@
aaaa
-日本
+日本語
bbbb
-7
View File
@@ -1,7 +0,0 @@
--- a.txt 2013-04-05 14:19:39.000000000 +0900
+++ b.txt 2013-04-05 14:19:51.000000000 +0900
@@ -1,3 +1,3 @@
aaaa
-日本
+にっぽん日本
bbbb
-7
View File
@@ -1,7 +0,0 @@
--- a.txt 2013-07-27 06:03:49.133257759 +0900
+++ b.txt 2013-07-27 06:03:58.791221118 +0900
@@ -1,3 +1,3 @@
aaaa
-日本記
+日本娘
bbbb
-7
View File
@@ -1,7 +0,0 @@
--- a.txt 2013-07-27 04:20:45.973229414 +0900
+++ b.txt 2013-07-27 04:20:52.366228105 +0900
@@ -1,3 +1,3 @@
aaaa
-日本記
+日本誘
bbbb
-7
View File
@@ -1,7 +0,0 @@
--- a.txt 2013-07-27 05:52:11.415223830 +0900
+++ b.txt 2013-07-27 05:52:18.249190358 +0900
@@ -1,3 +1,3 @@
aaaa
-日本記ok
+日本誘ok
bbbb
+1 -1
View File
@@ -83,7 +83,7 @@ class AdminControllerTest < ActionController::TestCase
def test_test_email def test_test_email
user = User.find(1) user = User.find(1)
user.pref.no_self_notified = '1' user.pref[:no_self_notified] = '1'
user.pref.save! user.pref.save!
ActionMailer::Base.deliveries.clear ActionMailer::Base.deliveries.clear
@@ -126,11 +126,4 @@ class EnumerationsControllerTest < ActionController::TestCase
# check that the issue was reassign # check that the issue was reassign
assert_equal 6, issue.reload.priority_id assert_equal 6, issue.reload.priority_id
end end
def test_destroy_enumeration_in_use_with_blank_reassignment
assert_no_difference 'IssuePriority.count' do
delete :destroy, :id => 4, :reassign_to_id => ''
end
assert_response :success
end
end end
+3 -3
View File
@@ -209,7 +209,7 @@ class ProjectsControllerTest < ActionController::TestCase
assert_response :success assert_response :success
project = assigns(:project) project = assigns(:project)
assert_kind_of Project, project assert_kind_of Project, project
assert_not_equal [], project.errors[:parent_id] assert_not_nil project.errors[:parent_id]
end end
test "#create by non-admin user with add_subprojects permission should create a project with a parent_id" do test "#create by non-admin user with add_subprojects permission should create a project with a parent_id" do
@@ -244,7 +244,7 @@ class ProjectsControllerTest < ActionController::TestCase
assert_response :success assert_response :success
project = assigns(:project) project = assigns(:project)
assert_kind_of Project, project assert_kind_of Project, project
assert_not_equal [], project.errors[:parent_id] assert_not_nil project.errors[:parent_id]
end end
test "#create by non-admin user with add_subprojects permission should fail with unauthorized parent_id" do test "#create by non-admin user with add_subprojects permission should fail with unauthorized parent_id" do
@@ -265,7 +265,7 @@ class ProjectsControllerTest < ActionController::TestCase
assert_response :success assert_response :success
project = assigns(:project) project = assigns(:project)
assert_kind_of Project, project assert_kind_of Project, project
assert_not_equal [], project.errors[:parent_id] assert_not_nil project.errors[:parent_id]
end end
def test_create_subproject_with_inherit_members_should_inherit_members def test_create_subproject_with_inherit_members_should_inherit_members
@@ -54,24 +54,6 @@ class ReportsControllerTest < ActionController::TestCase
end end
end end
def test_get_issue_report_details_by_tracker_should_show_issue_count
Issue.delete_all
Issue.generate!(:tracker_id => 1)
Issue.generate!(:tracker_id => 1)
Issue.generate!(:tracker_id => 1, :status_id => 5)
Issue.generate!(:tracker_id => 2)
get :issue_report_details, :id => 1, :detail => 'tracker'
assert_select 'table.list tbody :nth-child(1)' do
assert_select 'td', :text => 'Bug'
assert_select ':nth-child(2)', :text => '2' # status:1
assert_select ':nth-child(3)', :text => '-' # status:2
assert_select ':nth-child(8)', :text => '2' # open
assert_select ':nth-child(9)', :text => '1' # closed
assert_select ':nth-child(10)', :text => '3' # total
end
end
def test_get_issue_report_details_by_priority def test_get_issue_report_details_by_priority
get :issue_report_details, :id => 1, :detail => 'priority' get :issue_report_details, :id => 1, :detail => 'priority'
assert_equal IssuePriority.all.reverse, assigns(:rows) assert_equal IssuePriority.all.reverse, assigns(:rows)

Some files were not shown because too many files have changed in this diff Show More