Compare commits

..

51 Commits

Author SHA1 Message Date
Jean-Philippe Lang 72c2aaf5c7 tagged version 2.1.3
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/tags/2.1.3@10833 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-17 12:50:11 +00:00
Jean-Philippe Lang 0e241bb857 Updates for 2.1.3 release.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10832 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-17 12:49:43 +00:00
Jean-Philippe Lang 9dcde53dab Merged r10829 from trunk (#12358).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10830 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-17 12:18:40 +00:00
Jean-Philippe Lang a44521527a Merged r10745 from trunk (#12231).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10824 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-17 09:24:19 +00:00
Jean-Philippe Lang f12590fa5c Merged r10806 from trunk (#12195).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10823 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-17 09:02:07 +00:00
Jean-Philippe Lang a1c6f710aa Backported r10792 and r10793 from trunk (#12310).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10822 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-17 08:58:26 +00:00
Jean-Philippe Lang 3ad82e4665 Merged r10810 from trunk (#12359).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10821 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-17 08:52:51 +00:00
Jean-Philippe Lang eef3b5b5ca Merged r10790 from trunk (#12294).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10820 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-17 08:51:17 +00:00
Jean-Philippe Lang ab69845ea2 Merged r10801 from trunk (#12349).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10819 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-17 08:50:19 +00:00
Toshi MARUYAMA af51a68b34 Merged r10813 from trunk (#12375)
svn propset svn:eol-style native to fixtures.


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10817 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-16 07:57:10 +00:00
Toshi MARUYAMA d5c08680f6 Merged r10812 from trunk (#12375)
fix receiving mail subject broken which does not begin with encoding name.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10816 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-16 07:52:05 +00:00
Toshi MARUYAMA 9b82b948e3 Merged r10811 from trunk (#12375)
add test of receiving mail subject begins with encoding name.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10815 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-16 07:51:53 +00:00
Toshi MARUYAMA 1c8510bc80 Merged r10763 from trunk (#12237)
German Translation updated by Daniel Felix.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10764 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-29 16:03:23 +00:00
Toshi MARUYAMA 23861c7cc1 Merged from r10758 trunk (#12237)
German Translation updated by Daniel Felix.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10760 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-29 13:08:12 +00:00
Toshi MARUYAMA 6550343cb9 Merged r10733 from trunk (#12232, #12235)
German translation for 2.1-stable updated by Daniel Felix.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10738 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-28 01:59:00 +00:00
Jean-Philippe Lang a70cf2f833 Merged r10715 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10724 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-26 03:16:15 +00:00
Jean-Philippe Lang 0f219b973a Merged r10714 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10723 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-26 03:15:21 +00:00
Jean-Philippe Lang d02e5e54a8 Merged r10580 and r10581 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10722 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-26 03:13:34 +00:00
Toshi MARUYAMA c050028102 Merged r10709 from trunk to 2.1-stable (#12196)
fix "Page not found" on OK button in SCM "View all revisions" page.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10710 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-24 10:22:17 +00:00
Toshi MARUYAMA 012ffdf9e8 Merged r10702 from trunk to 2.1-stable (#12189)
add tmp/pdf directory.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10703 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-23 10:56:43 +00:00
Toshi MARUYAMA 9e3aeeef88 Merged r10699 from trunk (#12188)
Simplified Chinese translation for 2.1-stable updated by Steven Wong.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10701 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-23 07:57:06 +00:00
Toshi MARUYAMA 21b162a624 Merged r10689 from trunk to 2.1-stable
Partial backout r10263.

Backout replacing shoulda context of test/unit/helpers/issues_helper_test.rb.
Test methods in shoulda context do not run on Ruby 1.8.7-p370.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10691 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-22 03:24:01 +00:00
Toshi MARUYAMA b7e999d1aa Merged r10688 from trunk to 2.1-stable
Backout r10253.

Backout replacing shoulda context of test/unit/helpers/issues_helper_test.rb.
Test methods in shoulda context do not run on Ruby 1.8.7-p370.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10690 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-22 03:23:28 +00:00
Toshi MARUYAMA 284d03e1f8 Merged r10596 from trunk to 2.1-stable (#9732)
German translation updated by Raphael Kallensee.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10600 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-11 03:47:22 +00:00
Toshi MARUYAMA 3b4126e14f Merged r10572 from trunk
add missing fixtures to test/unit/issue_relation_test.rb

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10577 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-09 11:56:45 +00:00
Toshi MARUYAMA 46a76ecb6e Merged r10571 from trunk
add missing fixture to test/integration/api_test/issues_test.rb

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10576 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-09 11:56:31 +00:00
Toshi MARUYAMA 5a74edef89 Merged r10563 from trunk (#12021)
Russian translation for 2.1-stable updated.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10565 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-04 23:47:53 +00:00
Jean-Philippe Lang 2f9c2e6bd3 Merged r10535 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10536 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-30 10:42:57 +00:00
Jean-Philippe Lang 2df7c0ff3a Merged r10465 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10534 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-30 08:33:25 +00:00
Jean-Philippe Lang f5d5077d2b Merged r10531 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10532 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-30 08:07:17 +00:00
Jean-Philippe Lang 94a1eb21a4 Merged r10527 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10528 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-29 17:13:15 +00:00
Jean-Philippe Lang 1f80a4b0d9 Merged r10433, r10437 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10526 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-29 16:38:53 +00:00
Jean-Philippe Lang 55220950d2 Merged r10412 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10525 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-29 16:34:30 +00:00
Jean-Philippe Lang daea57a37c Merged r10438 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10524 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-29 16:32:11 +00:00
Jean-Philippe Lang fe61739108 Merged r10494 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10523 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-29 16:31:13 +00:00
Jean-Philippe Lang a4cd96e8b0 Merged r10436 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10522 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-29 16:28:40 +00:00
Jean-Philippe Lang 804302ce61 Merged r10413 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10521 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-29 16:27:03 +00:00
Jean-Philippe Lang 89ecbe9cdc Merged r10439 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10520 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-29 16:26:08 +00:00
Toshi MARUYAMA aac3e1e51c Merged r10503 from trunk to 2.1-stable (#11982, #11966)
add functional test of sub repository diff path.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10511 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-28 06:38:50 +00:00
Toshi MARUYAMA 595fef0d68 Merged r10502 from trunk to 2.1-stable (#11982, #11966)
add functional test of main repository diff path.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10510 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-28 06:38:23 +00:00
Toshi MARUYAMA 65a6e3985e Merged r10490 from trunk to 2.1-stable (#11982, #11966)
explicitly define route at scm diff view.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10509 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-28 06:37:48 +00:00
Toshi MARUYAMA f27a0eca5b Merged r10501 from trunk
set user preference diff type nil at functional tests.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10505 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-28 03:54:07 +00:00
Toshi MARUYAMA 2d34ab9235 Merged r10498 from trunk
scm: git: use with_settings instead of assigned setting at functional test

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10499 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-28 00:17:59 +00:00
Toshi MARUYAMA 03bff3308f Merged r10487 from trunk (#11885)
fix broken issue list filter.

Array indexOf() is not defined on IE8.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10489 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-27 07:29:22 +00:00
Toshi MARUYAMA 006a1b4fd7 Merged r10486 from trunk (#11885)
fix javascript syntax mistake in application.js.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10488 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-27 07:29:07 +00:00
Toshi MARUYAMA 9095874a07 Merged r10478 from trunk
use set_language_if_valid 'en' at test_parent_should_be_in_same_project at unit board test.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10482 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-26 11:59:44 +00:00
Toshi MARUYAMA 8ecfd1dcf8 Merged r10477 from trunk
set default_language en at test_commit_closing_a_subproject_issue of unit changeset test.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10481 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-26 11:59:19 +00:00
Toshi MARUYAMA 35584bc53a Merged r10476 from trunk (#11922)
fix number_to_currency() raises exception on Rails3 bs and de locale.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10479 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-26 11:09:24 +00:00
Toshi MARUYAMA 21a16e0958 Merged r10472 from trunk (#11945)
add more error message if public/plugin_assets cannot be created.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10474 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-26 05:39:40 +00:00
Toshi MARUYAMA 76d24e44bf Merged r10471 from trunk (#11945)
fix "can't convert Errno::EACCES into String" in case of no permission of public/plugin_assets on Ruby 1.9.3.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10473 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-26 05:39:23 +00:00
Toshi MARUYAMA efbdef9357 Merged r10434 from trunk (#11897)
Traditional Chinese translation updated by ChunChang Lo.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.1-stable@10435 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-20 11:35:55 +00:00
52 changed files with 480 additions and 167 deletions
+1
View File
@@ -19,6 +19,7 @@
/public/plugin_assets
/tmp/*
/tmp/cache/*
/tmp/pdf/*
/tmp/sessions/*
/tmp/sockets/*
/tmp/test/*
+1
View File
@@ -21,6 +21,7 @@ public/dispatch.*
public/plugin_assets
tmp/*
tmp/cache/*
tmp/pdf/*
tmp/sessions/*
tmp/sockets/*
tmp/test/*
+1 -1
View File
@@ -238,7 +238,7 @@ class AccountController < ApplicationController
def onthefly_creation_failed(user, auth_source_options = { })
@user = user
session[:auth_source_registration] = auth_source_options unless auth_source_options.empty?
render register_path
render :action => 'register'
end
def invalid_credentials
+1 -1
View File
@@ -398,7 +398,7 @@ private
end
@issue.project = @project
@issue.author = User.current
@issue.author ||= User.current
# Tracker must be set before custom field values
@issue.tracker ||= @project.trackers.find((params[:issue] && params[:issue][:tracker_id]) || params[:tracker_id] || :first)
if @issue.tracker.nil?
+7 -3
View File
@@ -795,11 +795,10 @@ module ApplicationHelper
if repository && User.current.allowed_to?(:browse_repository, project)
name =~ %r{^[/\\]*(.*?)(@([0-9a-f]+))?(#(L\d+))?$}
path, rev, anchor = $1, $3, $5
link = link_to h("#{project_prefix}#{prefix}:#{repo_prefix}#{name}"), {:controller => 'repositories', :action => 'entry', :id => project, :repository_id => repository.identifier_param,
link = link_to h("#{project_prefix}#{prefix}:#{repo_prefix}#{name}"), {:controller => 'repositories', :action => (prefix == 'export' ? 'raw' : 'entry'), :id => project, :repository_id => repository.identifier_param,
:path => to_path_param(path),
:rev => rev,
:anchor => anchor,
:format => (prefix == 'export' ? 'raw' : nil)},
:anchor => anchor},
:class => (prefix == 'export' ? 'source download' : 'source')
end
end
@@ -1029,6 +1028,11 @@ module ApplicationHelper
content_tag(:a, name, {:href => '#', :onclick => "#{function}; return false;"}.merge(html_options))
end
# Helper to render JSON in views
def raw_json(arg)
arg.to_json.to_s.gsub('/', '\/').html_safe
end
def back_url
url = params[:back_url]
if url.nil? && referer = request.env['HTTP_REFERER']
+2 -2
View File
@@ -26,8 +26,8 @@ module ContextMenusHelper
end
if options.delete(:disabled)
options.delete(:method)
options.delete(:confirm)
options.delete(:onclick)
options.delete(:data)
options[:onclick] = 'return false;'
options[:class] << ' disabled'
url = '#'
end
+26 -18
View File
@@ -84,17 +84,21 @@ class Issue < ActiveRecord::Base
# Returns a SQL conditions string used to find all issues visible by the specified user
def self.visible_condition(user, options={})
Project.allowed_to_condition(user, :view_issues, options) do |role, user|
case role.issues_visibility
when 'all'
nil
when 'default'
user_ids = [user.id] + user.groups.map(&:id)
"(#{table_name}.is_private = #{connection.quoted_false} OR #{table_name}.author_id = #{user.id} OR #{table_name}.assigned_to_id IN (#{user_ids.join(',')}))"
when 'own'
user_ids = [user.id] + user.groups.map(&:id)
"(#{table_name}.author_id = #{user.id} OR #{table_name}.assigned_to_id IN (#{user_ids.join(',')}))"
if user.logged?
case role.issues_visibility
when 'all'
nil
when 'default'
user_ids = [user.id] + user.groups.map(&:id)
"(#{table_name}.is_private = #{connection.quoted_false} OR #{table_name}.author_id = #{user.id} OR #{table_name}.assigned_to_id IN (#{user_ids.join(',')}))"
when 'own'
user_ids = [user.id] + user.groups.map(&:id)
"(#{table_name}.author_id = #{user.id} OR #{table_name}.assigned_to_id IN (#{user_ids.join(',')}))"
else
'1=0'
end
else
'1=0'
"(#{table_name}.is_private = #{connection.quoted_false})"
end
end
end
@@ -102,15 +106,19 @@ class Issue < ActiveRecord::Base
# Returns true if usr or current user is allowed to view the issue
def visible?(usr=nil)
(usr || User.current).allowed_to?(:view_issues, self.project) do |role, user|
case role.issues_visibility
when 'all'
true
when 'default'
!self.is_private? || self.author == user || user.is_or_belongs_to?(assigned_to)
when 'own'
self.author == user || user.is_or_belongs_to?(assigned_to)
if user.logged?
case role.issues_visibility
when 'all'
true
when 'default'
!self.is_private? || (self.author == user || user.is_or_belongs_to?(assigned_to))
when 'own'
self.author == user || user.is_or_belongs_to?(assigned_to)
else
false
end
else
false
!self.is_private?
end
end
end
+2 -1
View File
@@ -373,7 +373,8 @@ class MailHandler < ActionMailer::Base
# try to reencode to utf8 manually with ruby1.8
begin
if h = email.header[:subject]
if m = h.value.match(/^=\?([^\?]+)\?/)
# http://tools.ietf.org/html/rfc2047#section-4
if m = h.value.match(/=\?([^\?]+)\?[BbQq]\?/)
subject = Redmine::CodesetUtil.to_utf8(subject, m[1])
end
end
+3 -3
View File
@@ -30,13 +30,13 @@ class Principal < ActiveRecord::Base
if q.blank?
{}
else
q = q.to_s.downcase
q = q.to_s
pattern = "%#{q}%"
sql = "LOWER(login) LIKE :p OR LOWER(firstname) LIKE :p OR LOWER(lastname) LIKE :p OR LOWER(mail) LIKE :p"
sql = "LOWER(login) LIKE LOWER(:p) OR LOWER(firstname) LIKE LOWER(:p) OR LOWER(lastname) LIKE LOWER(:p) OR LOWER(mail) LIKE LOWER(:p)"
params = {:p => pattern}
if q =~ /^(.+)\s+(.+)$/
a, b = "#{$1}%", "#{$2}%"
sql << " OR (LOWER(firstname) LIKE :a AND LOWER(lastname) LIKE :b) OR (LOWER(firstname) LIKE :b AND LOWER(lastname) LIKE :a)"
sql << " OR (LOWER(firstname) LIKE LOWER(:a) AND LOWER(lastname) LIKE LOWER(:b)) OR (LOWER(firstname) LIKE LOWER(:b) AND LOWER(lastname) LIKE LOWER(:a))"
params.merge!(:a => a, :b => b)
end
{:conditions => [sql, params]}
+5
View File
@@ -133,6 +133,11 @@ class Role < ActiveRecord::Base
self.builtin != 0
end
# Return true if the role is the anonymous role
def anonymous?
builtin == 2
end
# Return true if the role is a project member role
def member?
!self.builtin?
+1 -1
View File
@@ -44,7 +44,7 @@ class UserPreference < ActiveRecord::Base
if attribute_present? attr_name
super
else
h = read_attribute(:others).dup || {}
h = (read_attribute(:others) || {}).dup
h.update(attr_name => value)
write_attribute(:others, h)
value
+7
View File
@@ -33,6 +33,7 @@ class Version < ActiveRecord::Base
validates_format_of :effective_date, :with => /^\d{4}-\d{2}-\d{2}$/, :message => :not_a_date, :allow_nil => true
validates_inclusion_of :status, :in => VERSION_STATUSES
validates_inclusion_of :sharing, :in => VERSION_SHARINGS
validate :validate_version
scope :named, lambda {|arg| { :conditions => ["LOWER(#{table_name}.name) = LOWER(?)", arg.to_s.strip]}}
scope :open, :conditions => {:status => 'open'}
@@ -275,4 +276,10 @@ class Version < ActiveRecord::Base
progress
end
end
def validate_version
if effective_date.nil? && @attributes['effective_date'].present?
errors.add :effective_date, :not_a_date
end
end
end
+1 -1
View File
@@ -3,6 +3,6 @@
<% if @message.present? %>
<p id="errorExplanation"><%=h @message %></p>
<% end %>
<p><a href="javascript:history.back()">Back</a></p>
<p><a href="javascript:history.back()"><%= l(:button_back) %></a></p>
<% html_title @status %>
+1 -1
View File
@@ -6,7 +6,7 @@
<%= l(:field_delay) %>: <%= f.text_field :delay, :size => 3 %> <%= l(:label_day_plural) %>
</span>
<%= submit_tag l(:button_add) %>
<%= toggle_link l(:button_cancel), 'new-relation-form'%>
<%= link_to_function l(:button_cancel), '$("#new-relation-form").hide();'%>
</p>
<%= javascript_tag "observeAutocompleteField('relation_issue_to_id', '#{escape_javascript auto_complete_issues_path(:project_id => @project, :scope => (Setting.cross_project_issue_relations? ? 'all' : nil))}')" %>
+1 -1
View File
@@ -19,7 +19,7 @@
<tr class="group open">
<td colspan="<%= query.columns.size + 2 %>">
<span class="expander" onclick="toggleRowGroup(this);">&nbsp;</span>
<%= group.blank? ? 'None' : column_content(@query.group_by_column, issue) %> <span class="count">(<%= @issue_count_by_group[group] %>)</span>
<%= group.blank? ? l(:label_none) : column_content(@query.group_by_column, issue) %> <span class="count">(<%= @issue_count_by_group[group] %>)</span>
<%= link_to_function("#{l(:button_collapse_all)}/#{l(:button_expand_all)}", "toggleAllRowGroups(this)", :class => 'toggle-all') %>
</td>
</tr>
+5 -5
View File
@@ -1,12 +1,12 @@
<%= javascript_tag do %>
var operatorLabels = <%= raw Query.operators_labels.to_json %>;
var operatorByType = <%= raw Query.operators_by_filter_type.to_json %>;
var availableFilters = <%= raw query.available_filters_as_json.to_json %>;
var labelDayPlural = "<%= raw escape_javascript(l(:label_day_plural)) %>";
var operatorLabels = <%= raw_json Query.operators_labels %>;
var operatorByType = <%= raw_json Query.operators_by_filter_type %>;
var availableFilters = <%= raw_json query.available_filters_as_json %>;
var labelDayPlural = <%= raw_json l(:label_day_plural) %>;
$(document).ready(function(){
initFilters();
<% query.filters.each do |field, options| %>
addFilter("<%= field %>", <%= raw query.operator_for(field).to_json %>, <%= raw query.values_for(field).to_json %>);
addFilter("<%= field %>", <%= raw_json query.operator_for(field) %>, <%= raw_json query.values_for(field) %>);
<% end %>
});
<% end %>
+3 -2
View File
@@ -1,8 +1,9 @@
<h2><%= l(:label_revision) %> <%= @diff_format_revisions %> <%=h @path %></h2>
<!-- Choose view type -->
<%= form_tag({:path => to_path_param(@path)}, :method => 'get') do %>
<%= hidden_field_tag('rev', params[:rev]) if params[:rev] %>
<%= form_tag({:action => 'diff', :id => @project,
:repository_id => @repository.identifier_param,
:path => to_path_param(@path), :rev=> @rev}, :method => 'get') do %>
<%= hidden_field_tag('rev_to', params[:rev_to]) if params[:rev_to] %>
<p>
<label><%= l(:label_view_diff) %></label>
+2 -1
View File
@@ -1,7 +1,8 @@
<div class="contextual">
<%= form_tag(
{:controller => 'repositories', :action => 'revision', :id => @project,
:repository_id => @repository.identifier_param}
:repository_id => @repository.identifier_param},
:method => :get
) do %>
<%= l(:label_revision) %>: <%= text_field_tag 'rev', @rev, :size => 8 %>
<%= submit_tag 'OK' %>
+2
View File
@@ -1,5 +1,6 @@
<%= error_messages_for 'role' %>
<% unless @role.anonymous? %>
<div class="box tabular">
<% unless @role.builtin? %>
<p><%= f.text_field :name, :required => true %></p>
@@ -11,6 +12,7 @@
<%= select_tag(:copy_workflow_from, content_tag("option") + options_from_collection_for_select(@roles, :id, :name, params[:copy_workflow_from] || @copy_from.try(:id))) %></p>
<% end %>
</div>
<% end %>
<h3><%= l(:label_permissions) %></h3>
<div class="box tabular" id="permissions">
+2 -3
View File
@@ -80,9 +80,8 @@ bs:
format:
unit: 'KM'
format: '%u %n'
separator:
delimiter:
precision:
negative_format: '%u -%n'
delimiter: ''
percentage:
format:
delimiter: ""
+12 -14
View File
@@ -84,9 +84,7 @@ de:
format:
unit: '€'
format: '%n %u'
separator:
delimiter:
precision:
delimiter: ''
percentage:
format:
delimiter: ""
@@ -846,7 +844,7 @@ de:
button_show: Anzeigen
status_active: aktiv
status_registered: angemeldet
status_registered: nicht aktivierte
status_locked: gesperrt
version_status_open: offen
@@ -1019,8 +1017,8 @@ de:
description_date_from: Startdatum eintragen
description_date_to: Enddatum eintragen
label_parent_revision: Parent
label_child_revision: Child
label_parent_revision: Vorgänger
label_child_revision: Nachfolger
error_scm_annotate_big_text_file: Der Eintrag kann nicht umgesetzt werden, da er die maximale Textlänge überschreitet.
setting_default_issue_start_date_to_creation_date: Aktuelles Datum als Beginn für neue Tickets verwenden
button_edit_section: Diesen Bereich bearbeiten
@@ -1070,14 +1068,14 @@ de:
field_timeout: Auszeit (in Sekunden)
setting_thumbnails_enabled: Vorschaubilder von Dateianhängen anzeigen
setting_thumbnails_size: Größe der Vorschaubilder (in Pixel)
label_status_transitions: Status transitions
label_fields_permissions: Fields permissions
label_status_transitions: Statusänderungen
label_fields_permissions: Feldberechtigungen
label_readonly: Nur-Lese-Zugriff
label_required: Erforderlich
text_repository_identifier_info: 'Kleinbuchstaben (a-z), Ziffern, Binde- und Unterstriche erlaubt.<br />Einmal gespeichert, kann die Kennung nicht mehr geändert werden.'
field_board_parent: Parent forum
label_attribute_of_project: Project's %{name}
label_attribute_of_author: Author's %{name}
label_attribute_of_assigned_to: Assignee's %{name}
label_attribute_of_fixed_version: Target version's %{name}
label_copy_subtasks: Copy subtasks
field_board_parent: Übergeordnetes Forum
label_attribute_of_project: "%{name} des Projekts"
label_attribute_of_author: "%{name} des Autors"
label_attribute_of_assigned_to: "%{name} des Bearbeiters"
label_attribute_of_fixed_version: "%{name} der Zielversion"
label_copy_subtasks: Unteraufgaben kopieren
+17 -17
View File
@@ -1152,27 +1152,27 @@ ru:
setting_session_lifetime: Session maximum lifetime
setting_session_timeout: Session inactivity timeout
label_session_expiration: Session expiration
permission_close_project: Close / reopen the project
label_show_closed_projects: View closed projects
button_close: Close
button_reopen: Reopen
project_status_active: active
project_status_closed: closed
project_status_archived: archived
text_project_closed: This project is closed and read-only.
notice_user_successful_create: User %{id} created.
field_core_fields: Standard fields
permission_close_project: Закрывать / открывать проекты
label_show_closed_projects: Просматривать закрытые проекты
button_close: Сделать закрытым
button_reopen: Сделать открытым
project_status_active: открытые
project_status_closed: закрытые
project_status_archived: архивированные
text_project_closed: Проект закрыт и находиться в режиме только для чтения.
notice_user_successful_create: Пользователь %{id} создан.
field_core_fields: Стандартные поля
field_timeout: Timeout (in seconds)
setting_thumbnails_enabled: Display attachment thumbnails
setting_thumbnails_size: Thumbnails size (in pixels)
label_status_transitions: Status transitions
label_fields_permissions: Fields permissions
label_readonly: Read-only
label_required: Required
label_status_transitions: Статус-переходы
label_fields_permissions: Права на изменения полей
label_readonly: Не изменяется
label_required: Обязательное
text_repository_identifier_info: Допускаются только строчные латинские буквы (a-z), цифры, тире и подчеркивания.<br />После сохранения идентификатор изменить нельзя.
field_board_parent: Parent forum
field_board_parent: Родительский форум
label_attribute_of_project: Project's %{name}
label_attribute_of_author: Author's %{name}
label_attribute_of_author: Имя автора %{name}
label_attribute_of_assigned_to: Assignee's %{name}
label_attribute_of_fixed_version: Target version's %{name}
label_copy_subtasks: Copy subtasks
label_copy_subtasks: Копировать подзадачи
+1 -1
View File
@@ -939,6 +939,7 @@
label_child_revision: 子項
label_export_options: "%{export_format} 匯出選項"
label_copy_attachments: 複製附件
label_copy_subtasks: 複製子任務
label_item_position: "%{position} / %{count}"
label_completed_versions: 已完成版本
label_search_for_watchers: 搜尋可供加入的監看者
@@ -1143,4 +1144,3 @@
description_date_from: 輸入起始日期
description_date_to: 輸入結束日期
text_repository_identifier_info: '僅允許使用小寫英文字母 (a-z), 阿拉伯數字, 虛線與底線。<br />一旦儲存之後, 代碼便無法再次被更改。'
label_copy_subtasks: Copy subtasks
+6 -6
View File
@@ -1061,9 +1061,9 @@ zh:
label_readonly: 只读
label_required: 必填
text_repository_identifier_info: 仅小写字母(a-z)、数字、破折号(-)和下划线(_)可以使用。<br />一旦保存,标识无法修改。
field_board_parent: Parent forum
label_attribute_of_project: Project's %{name}
label_attribute_of_author: Author's %{name}
label_attribute_of_assigned_to: Assignee's %{name}
label_attribute_of_fixed_version: Target version's %{name}
label_copy_subtasks: Copy subtasks
field_board_parent: 父论坛
label_attribute_of_project: 项目 %{name}
label_attribute_of_author: 作者 %{name}
label_attribute_of_assigned_to: 分配给 %{name}
label_attribute_of_fixed_version: 目标版本 %{name}
label_copy_subtasks: 复制子任务
+39
View File
@@ -4,6 +4,45 @@ Redmine - project management software
Copyright (C) 2006-2012 Jean-Philippe Lang
http://www.redmine.org/
== 2012-11-17 v2.1.3
* Defect #12050: :export links to repository files lead to a 404 error
* Defect #12189: Missing tmp/pdf directory
* Defect #12195: Javascript error with IE7 / IE8 on new issue form
* Defect #12196: "Page not found" on OK button in SCM "View all revisions" page
* Defect #12199: Confirmation message displayed when clicking a disabled delete link in the context menu
* Defect #12231: Hardcoded "Back" in Repository
* Defect #12294: Incorrect german translation for "registered" users filter
* Defect #12349: Watchers auto-complete search on non-latin chars
* Defect #12358: 'None' grouped issue list section should be translated
* Defect #12359: Version date field regex validation accepts invalid date
* Defect #12375: Receiving mail subject encoding broken (MOJIBAKE) in some cases on Ruby 1.8
* Patch #9732: German translations
* Patch #12021: Russian locale translations
* Patch #12188: Simplified Chinese translation with zh.yml file based on Rev:10681
* Patch #12235: German translation for 2.1-stable
* Patch #12237: Added German Translation
== 2012-09-30 v2.1.2
* Defect #11929: XSS vulnerability in Redmine 2.1.x
== 2012-09-30 v2.1.1
* Defect #11290: ParseDate missing in Ruby 1.9x
* Defect #11844: "load_default_data" rake task fails to print the error message if one occurs
* Defect #11850: Can't create a user from ldap by on-the-fly on the redmine server using URI prefix
* Defect #11872: Private issue visible to anonymous users after its author is deleted
* Defect #11885: Filter misses Selectionfield on IE8
* Defect #11893: New relation form Cancel link is broken with Chrome 21
* Defect #11905: Potential "can't dup NilClass" error in UserPreference
* Defect #11909: Autocomplete results not reset after clearing search field
* Defect #11922: bs.yml and de.yml lead to error by number_to_currency()
* Defect #11945: rake task prints "can't convert Errno::EACCES into String" in case of no permission of public/plugin_assets
* Defect #11975: Undefined status transitions allowed in workflow (author of issue changes when selecting a new status)
* Defect #11982: SCM diff view generates extra parameter for switching mode
* Patch #11897: Traditional Chinese language file (to r10433)
== 2012-09-16 v2.1.0
* Defect #2071: Reordering priority-enumerations breaks alternate-theme's issue-colouring
+2 -5
View File
@@ -1,5 +1,4 @@
require 'SVG/Graph/Plot'
require 'parsedate'
module SVG
module Graph
@@ -157,8 +156,7 @@ module SVG
y = []
data[:data].each_index {|i|
if i%2 == 0
arr = ParseDate.parsedate( data[:data][i] )
t = Time.local( *arr[0,6].compact )
t = DateTime.parse( data[:data][i] ).to_time
x << t.to_i
else
y << data[:data][i]
@@ -173,8 +171,7 @@ module SVG
protected
def min_x_value=(value)
arr = ParseDate.parsedate( value )
@min_x_value = Time.local( *arr[0,6].compact ).to_i
@min_x_value = DateTime.parse( data[:data][i] ).to_time
end
@@ -30,7 +30,7 @@ module Redmine
attachable_options[:delete_permission] = options.delete(:delete_permission) || "edit_#{self.name.pluralize.underscore}".to_sym
has_many :attachments, options.merge(:as => :container,
:order => "#{Attachment.table_name}.created_on",
:order => "#{Attachment.table_name}.created_on ASC, #{Attachment.table_name}.id ASC",
:dependent => :destroy)
send :include, Redmine::Acts::Attachable::InstanceMethods
before_save :attach_saved_attachments
@@ -62,7 +62,19 @@ module Redmine
def save_attachments(attachments, author=User.current)
if attachments.is_a?(Hash)
attachments = attachments.values
attachments = attachments.stringify_keys
attachments = attachments.to_a.sort {|a, b|
if a.first.to_i > 0 && b.first.to_i > 0
a.first.to_i <=> b.first.to_i
elsif a.first.to_i > 0
1
elsif b.first.to_i > 0
-1
else
a.first <=> b.first
end
}
attachments = attachments.map(&:last)
end
if attachments.is_a?(Array)
attachments.each do |attachment|
+7 -3
View File
@@ -336,7 +336,11 @@ module Redmine #:nodoc:
unless source_files.empty?
base_target_dir = File.join(destination, File.dirname(source_files.first).gsub(source, ''))
FileUtils.mkdir_p(base_target_dir)
begin
FileUtils.mkdir_p(base_target_dir)
rescue Exception => e
raise "Could not create directory #{base_target_dir}: " + e.message
end
end
source_dirs.each do |dir|
@@ -346,7 +350,7 @@ module Redmine #:nodoc:
begin
FileUtils.mkdir_p(target_dir)
rescue Exception => e
raise "Could not create directory #{target_dir}: \n" + e
raise "Could not create directory #{target_dir}: " + e.message
end
end
@@ -357,7 +361,7 @@ module Redmine #:nodoc:
FileUtils.cp(file, target)
end
rescue Exception => e
raise "Could not copy #{file} to #{target}: \n" + e
raise "Could not copy #{file} to #{target}: " + e.message
end
end
end
+1 -1
View File
@@ -4,7 +4,7 @@ module Redmine
module VERSION #:nodoc:
MAJOR = 2
MINOR = 1
TINY = 0
TINY = 3
# Branch values:
# * official release: nil
+2 -2
View File
@@ -26,9 +26,9 @@ namespace :redmine do
Redmine::DefaultData::Loader.load(current_language)
puts "Default configuration data loaded."
rescue Redmine::DefaultData::DataAlreadyLoaded => error
puts error
puts error.message
rescue => error
puts "Error: " + error
puts "Error: " + error.message
puts "Default configuration data was not loaded."
end
end
+22 -22
View File
@@ -152,10 +152,10 @@ function buildFilterRow(field, operator, values) {
var option = $('<option>');
if ($.isArray(filterValue)) {
option.val(filterValue[1]).text(filterValue[0]);
if (values.indexOf(filterValue[1]) > -1) {option.attr('selected', true)};
if ($.inArray(filterValue[1], values) > -1) {option.attr('selected', true);}
} else {
option.val(filterValue).text(filterValue);
if (values.indexOf(filterValue) > -1) {option.attr('selected', true)};
if ($.inArray(filterValue, values) > -1) {option.attr('selected', true);}
}
select.append(option);
}
@@ -163,9 +163,9 @@ function buildFilterRow(field, operator, values) {
case "date":
case "date_past":
tr.find('td.values').append(
'<span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_1" size="10" class="value date_value" value="'+values[0]+'" /></span>' +
' <span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_2" size="10" class="value date_value" value="'+values[1]+'" /></span>' +
' <span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'" size="3" class="value" value="'+values[0]+'" /> '+labelDayPlural+'</span>'
'<span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_1" size="10" class="value date_value" /></span>' +
' <span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_2" size="10" class="value date_value" /></span>' +
' <span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'" size="3" class="value" /> '+labelDayPlural+'</span>'
);
$('#values_'+fieldId+'_1').val(values[0]).datepicker(datepickerOptions);
$('#values_'+fieldId+'_2').val(values[1]).datepicker(datepickerOptions);
@@ -174,15 +174,15 @@ function buildFilterRow(field, operator, values) {
case "string":
case "text":
tr.find('td.values').append(
'<span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'" size="30" class="value" value="'+values[0]+'" /></span>'
'<span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'" size="30" class="value" /></span>'
);
$('#values_'+fieldId).val(values[0]);
break;
case "integer":
case "float":
tr.find('td.values').append(
'<span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_1" size="6" class="value" value="'+values[0]+'" /></span>' +
' <span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_2" size="6" class="value" value="'+values[1]+'" /></span>'
'<span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_1" size="6" class="value" /></span>' +
' <span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_2" size="6" class="value" /></span>'
);
$('#values_'+fieldId+'_1').val(values[0]);
$('#values_'+fieldId+'_2').val(values[1]);
@@ -204,7 +204,7 @@ function toggleFilter(field) {
function enableValues(field, indexes) {
var fieldId = field.replace('.', '_');
$('#tr_'+fieldId+' td.values .value').each(function(index) {
if (indexes.indexOf(index) >= 0) {
if ($.inArray(index, indexes) >= 0) {
$(this).removeAttr('disabled');
$(this).parents('span').first().show();
} else {
@@ -464,9 +464,11 @@ function updateBulkEditFrom(url) {
}
function observeAutocompleteField(fieldId, url) {
$('#'+fieldId).autocomplete({
source: url,
minLength: 2,
$(document).ready(function() {
$('#'+fieldId).autocomplete({
source: url,
minLength: 2
});
});
}
@@ -478,16 +480,14 @@ function observeSearchfield(fieldId, targetId, url) {
var val = $this.val();
if ($this.attr('data-value-was') != val){
$this.attr('data-value-was', val);
if (val != '') {
$.ajax({
url: url,
type: 'get',
data: {q: $this.val()},
success: function(data){ $('#'+targetId).html(data); },
beforeSend: function(){ $this.addClass('ajax-loading'); },
complete: function(){ $this.removeClass('ajax-loading'); }
});
}
$.ajax({
url: url,
type: 'get',
data: {q: $this.val()},
success: function(data){ $('#'+targetId).html(data); },
beforeSend: function(){ $this.addClass('ajax-loading'); },
complete: function(){ $this.removeClass('ajax-loading'); }
});
}
};
var reset = function() {
+7
View File
@@ -0,0 +1,7 @@
From: John Smith <JSmith@somenet.foo>
To: "redmine@somenet.foo" <redmine@somenet.foo>
Subject: =?iso-2022-jp?b?GyRCJUYlOSVIGyhCCg=?=
Date: Fri, 1 Jun 2012 14:39:38 +0200
Message-ID: <87C31D42249DD0489D1A1444E3232DD7019D6183@foo.bar>
Fixture
+7
View File
@@ -0,0 +1,7 @@
From: John Smith <JSmith@somenet.foo>
To: "redmine@somenet.foo" <redmine@somenet.foo>
Subject: Re: =?iso-2022-jp?b?GyRCJUYlOSVIGyhCCg=?=
Date: Fri, 1 Jun 2012 14:39:38 +0200
Message-ID: <87C31D42249DD0489D1A1444E3232DD7019D6183@foo.bar>
Fixture
@@ -96,8 +96,13 @@ class AttachmentsControllerTest < ActionController::TestCase
end
def test_save_diff_type
@request.session[:user_id] = 1 # admin
user1 = User.find(1)
user1.pref[:diff_type] = nil
user1.preference.save
user = User.find(1)
assert_nil user.pref[:diff_type]
@request.session[:user_id] = 1 # admin
get :show, :id => 5
assert_response :success
assert_template 'diff'
+12
View File
@@ -2521,6 +2521,18 @@ class IssuesControllerTest < ActionController::TestCase
assert_equal 'This is the test_new issue', issue.subject
end
def test_update_edit_form_should_keep_issue_author
@request.session[:user_id] = 3
xhr :put, :new, :project_id => 1, :id => 1, :issue => {:subject => 'Changed'}
assert_response :success
assert_equal 'text/javascript', response.content_type
issue = assigns(:issue)
assert_equal User.find(2), issue.author
assert_equal 2, issue.author_id
assert_not_equal User.current, issue.author
end
def test_update_edit_form_should_propose_transitions_based_on_initial_status
@request.session[:user_id] = 2
WorkflowTransition.delete_all
@@ -273,4 +273,12 @@ class QueriesControllerTest < ActionController::TestCase
assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook', :set_filter => 1, :query_id => nil
assert_nil Query.find_by_id(1)
end
def test_backslash_should_be_escaped_in_filters
@request.session[:user_id] = 2
get :new, :subject => 'foo/bar'
assert_response :success
assert_template 'new'
assert_include 'addFilter("subject", "=", ["foo\/bar"]);', response.body
end
end
@@ -53,8 +53,6 @@ class RepositoriesGitControllerTest < ActionController::TestCase
if @char_1.respond_to?(:force_encoding)
@char_1.force_encoding('UTF-8')
end
Setting.default_language = 'en'
end
def test_create_and_update
@@ -263,6 +261,8 @@ class RepositoriesGitControllerTest < ActionController::TestCase
end
def test_diff
assert_equal true, @repository.is_default
assert_nil @repository.identifier
assert_equal 0, @repository.changesets.count
@repository.fetch_changesets
@project.reload
@@ -320,10 +320,12 @@ class RepositoriesGitControllerTest < ActionController::TestCase
with_settings :diff_max_lines_displayed => 5 do
# Truncated diff of changeset 2f9c0091
with_cache do
get :diff, :id => PRJ_ID, :type => 'inline',
:rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'
assert_response :success
assert @response.body.include?("... This diff was truncated")
with_settings :default_language => 'en' do
get :diff, :id => PRJ_ID, :type => 'inline',
:rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'
assert_response :success
assert @response.body.include?("... This diff was truncated")
end
with_settings :default_language => 'fr' do
get :diff, :id => PRJ_ID, :type => 'inline',
:rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'
@@ -351,9 +353,55 @@ class RepositoriesGitControllerTest < ActionController::TestCase
diff = assigns(:diff)
assert_not_nil diff
assert_tag :tag => 'h2', :content => /2f9c0091:61b685fb/
assert_tag :tag => "form",
:attributes => {
:action => "/projects/subproject1/repository/revisions/" +
"61b685fbe55ab05b5ac68402d5720c1a6ac973d1/diff"
}
assert_tag :tag => 'input',
:attributes => {
:id => "rev_to",
:name => "rev_to",
:type => "hidden",
:value => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'
}
end
end
def test_diff_path_in_subrepo
repo = Repository::Git.create(
:project => @project,
:url => REPOSITORY_PATH,
:identifier => 'test-diff-path',
:path_encoding => 'ISO-8859-1'
);
assert repo
assert_equal false, repo.is_default
assert_equal 'test-diff-path', repo.identifier
get :diff,
:id => PRJ_ID,
:repository_id => 'test-diff-path',
:rev => '61b685fbe55ab05b',
:rev_to => '2f9c0091c754a91a',
:type => 'inline'
assert_response :success
assert_template 'diff'
diff = assigns(:diff)
assert_not_nil diff
assert_tag :tag => "form",
:attributes => {
:action => "/projects/subproject1/repository/test-diff-path/" +
"revisions/61b685fbe55ab05b/diff"
}
assert_tag :tag => 'input',
:attributes => {
:id => "rev_to",
:name => "rev_to",
:type => "hidden",
:value => '2f9c0091c754a91a'
}
end
def test_diff_latin_1
if @ruby19_non_utf8_pass
puts_ruby19_non_utf8_pass()
@@ -385,8 +433,13 @@ class RepositoriesGitControllerTest < ActionController::TestCase
end
def test_save_diff_type
@request.session[:user_id] = 1 # admin
user1 = User.find(1)
user1.pref[:diff_type] = nil
user1.preference.save
user = User.find(1)
assert_nil user.pref[:diff_type]
@request.session[:user_id] = 1 # admin
get :diff,
:id => PRJ_ID,
:rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'
@@ -479,6 +532,21 @@ class RepositoriesGitControllerTest < ActionController::TestCase
end
end
def test_revisions
assert_equal 0, @repository.changesets.count
@repository.fetch_changesets
@project.reload
assert_equal NUM_REV, @repository.changesets.count
get :revisions, :id => PRJ_ID
assert_response :success
assert_template 'revisions'
assert_tag :tag => 'form',
:attributes => {
:method => 'get',
:action => '/projects/subproject1/repository/revision'
}
end
def test_revision
assert_equal 0, @repository.changesets.count
@repository.fetch_changesets
+8
View File
@@ -110,6 +110,14 @@ class RolesControllerTest < ActionController::TestCase
assert_response :success
assert_template 'edit'
assert_equal Role.find(1), assigns(:role)
assert_select 'select[name=?]', 'role[issues_visibility]'
end
def test_edit_anonymous
get :edit, :id => Role.anonymous.id
assert_response :success
assert_template 'edit'
assert_select 'select[name=?]', 'role[issues_visibility]', 0
end
def test_edit_invalid_should_respond_with_404
+1
View File
@@ -25,6 +25,7 @@ class ApiTest::IssuesTest < ActionController::IntegrationTest
:member_roles,
:issues,
:issue_statuses,
:issue_relations,
:versions,
:trackers,
:projects_trackers,
+2
View File
@@ -61,6 +61,8 @@ module ObjectHelpers
def Issue.generate!(attributes={})
issue = Issue.new(attributes)
issue.project ||= Project.find(1)
issue.tracker ||= issue.project.trackers.first
issue.subject = 'Generated' if issue.subject.blank?
issue.author ||= User.find(2)
yield issue if block_given?
+3
View File
@@ -22,6 +22,8 @@ require File.expand_path('../../test_helper', __FILE__)
class BoardTest < ActiveSupport::TestCase
fixtures :projects, :boards, :messages, :attachments, :watchers
include Redmine::I18n
def setup
@project = Project.find(1)
end
@@ -41,6 +43,7 @@ class BoardTest < ActiveSupport::TestCase
end
def test_parent_should_be_in_same_project
set_language_if_valid 'en'
board = Board.new(:project_id => 3, :name => 'Test', :description => 'Test', :parent_id => 1)
assert !board.save
assert_include "Parent forum is invalid", board.errors.full_messages
+2 -1
View File
@@ -179,7 +179,8 @@ class ChangesetTest < ActiveSupport::TestCase
end
def test_commit_closing_a_subproject_issue
with_settings :commit_fix_status_id => 5, :commit_fix_keywords => 'closes' do
with_settings :commit_fix_status_id => 5, :commit_fix_keywords => 'closes',
:default_language => 'en' do
issue = Issue.find(5)
assert !issue.closed?
assert_difference 'Journal.count' do
+19 -8
View File
@@ -253,8 +253,15 @@ RAW
project_url = {:controller => 'projects', :action => 'show', :id => 'subproject1'}
source_url = {:controller => 'repositories', :action => 'entry', :id => 'ecookbook', :path => ['some', 'file']}
source_url_with_ext = {:controller => 'repositories', :action => 'entry', :id => 'ecookbook', :path => ['some', 'file.ext']}
source_url = '/projects/ecookbook/repository/entry/some/file'
source_url_with_rev = '/projects/ecookbook/repository/revisions/52/entry/some/file'
source_url_with_ext = '/projects/ecookbook/repository/entry/some/file.ext'
source_url_with_rev_and_ext = '/projects/ecookbook/repository/revisions/52/entry/some/file.ext'
export_url = '/projects/ecookbook/repository/raw/some/file'
export_url_with_rev = '/projects/ecookbook/repository/revisions/52/raw/some/file'
export_url_with_ext = '/projects/ecookbook/repository/raw/some/file.ext'
export_url_with_rev_and_ext = '/projects/ecookbook/repository/revisions/52/raw/some/file.ext'
to_test = {
# tickets
@@ -284,12 +291,16 @@ RAW
'source:/some/file. ' => link_to('source:/some/file', source_url, :class => 'source') + ".",
'source:/some/file.ext. ' => link_to('source:/some/file.ext', source_url_with_ext, :class => 'source') + ".",
'source:/some/file, ' => link_to('source:/some/file', source_url, :class => 'source') + ",",
'source:/some/file@52' => link_to('source:/some/file@52', source_url.merge(:rev => 52), :class => 'source'),
'source:/some/file.ext@52' => link_to('source:/some/file.ext@52', source_url_with_ext.merge(:rev => 52), :class => 'source'),
'source:/some/file#L110' => link_to('source:/some/file#L110', source_url.merge(:anchor => 'L110'), :class => 'source'),
'source:/some/file.ext#L110' => link_to('source:/some/file.ext#L110', source_url_with_ext.merge(:anchor => 'L110'), :class => 'source'),
'source:/some/file@52#L110' => link_to('source:/some/file@52#L110', source_url.merge(:rev => 52, :anchor => 'L110'), :class => 'source'),
'export:/some/file' => link_to('export:/some/file', source_url.merge(:format => 'raw'), :class => 'source download'),
'source:/some/file@52' => link_to('source:/some/file@52', source_url_with_rev, :class => 'source'),
'source:/some/file.ext@52' => link_to('source:/some/file.ext@52', source_url_with_rev_and_ext, :class => 'source'),
'source:/some/file#L110' => link_to('source:/some/file#L110', source_url + "#L110", :class => 'source'),
'source:/some/file.ext#L110' => link_to('source:/some/file.ext#L110', source_url_with_ext + "#L110", :class => 'source'),
'source:/some/file@52#L110' => link_to('source:/some/file@52#L110', source_url_with_rev + "#L110", :class => 'source'),
# export
'export:/some/file' => link_to('export:/some/file', export_url, :class => 'source download'),
'export:/some/file.ext' => link_to('export:/some/file.ext', export_url_with_ext, :class => 'source download'),
'export:/some/file@52' => link_to('export:/some/file@52', export_url_with_rev, :class => 'source download'),
'export:/some/file.ext@52' => link_to('export:/some/file.ext@52', export_url_with_rev_and_ext, :class => 'source download'),
# forum
'forum#2' => link_to('Discussion', board_url, :class => 'board'),
'forum:Discussion' => link_to('Discussion', board_url, :class => 'board'),
+22 -18
View File
@@ -109,51 +109,55 @@ class IssuesHelperTest < ActionView::TestCase
end
end
def test_with_a_start_date_attribute_should_format_the_current_date
@detail = JournalDetail.new(
context "with a start_date attribute" do
should "format the current date" do
@detail = JournalDetail.new(
:property => 'attr',
:old_value => '2010-01-01',
:value => '2010-01-31',
:prop_key => 'start_date'
)
with_settings :date_format => '%m/%d/%Y' do
assert_match "01/31/2010", show_detail(@detail, true)
with_settings :date_format => '%m/%d/%Y' do
assert_match "01/31/2010", show_detail(@detail, true)
end
end
end
def test_with_a_start_date_attribute_should_format_the_old_date
@detail = JournalDetail.new(
should "format the old date" do
@detail = JournalDetail.new(
:property => 'attr',
:old_value => '2010-01-01',
:value => '2010-01-31',
:prop_key => 'start_date'
)
with_settings :date_format => '%m/%d/%Y' do
assert_match "01/01/2010", show_detail(@detail, true)
with_settings :date_format => '%m/%d/%Y' do
assert_match "01/01/2010", show_detail(@detail, true)
end
end
end
def test_with_a_due_date_attribute_should_with_a_due_date_attribute
@detail = JournalDetail.new(
context "with a due_date attribute" do
should "format the current date" do
@detail = JournalDetail.new(
:property => 'attr',
:old_value => '2010-01-01',
:value => '2010-01-31',
:prop_key => 'due_date'
)
with_settings :date_format => '%m/%d/%Y' do
assert_match "01/31/2010", show_detail(@detail, true)
with_settings :date_format => '%m/%d/%Y' do
assert_match "01/31/2010", show_detail(@detail, true)
end
end
end
def test_with_a_due_date_attribute_should_format_the_old_date
@detail = JournalDetail.new(
should "format the old date" do
@detail = JournalDetail.new(
:property => 'attr',
:old_value => '2010-01-01',
:value => '2010-01-31',
:prop_key => 'due_date'
)
with_settings :date_format => '%m/%d/%Y' do
assert_match "01/01/2010", show_detail(@detail, true)
with_settings :date_format => '%m/%d/%Y' do
assert_match "01/01/2010", show_detail(@detail, true)
end
end
end
+11 -1
View File
@@ -18,7 +18,17 @@
require File.expand_path('../../test_helper', __FILE__)
class IssueRelationTest < ActiveSupport::TestCase
fixtures :issue_relations, :issues
fixtures :projects,
:users,
:roles,
:members,
:member_roles,
:issues,
:issue_statuses,
:issue_relations,
:enabled_modules,
:enumerations,
:trackers
def test_create
from = Issue.find(1)
+29 -13
View File
@@ -25,7 +25,7 @@ class IssueTest < ActiveSupport::TestCase
:versions,
:issue_statuses, :issue_categories, :issue_relations, :workflows,
:enumerations,
:issues,
:issues, :journals, :journal_details,
:custom_fields, :custom_fields_projects, :custom_fields_trackers, :custom_values,
:time_entries
@@ -105,18 +105,6 @@ class IssueTest < ActiveSupport::TestCase
assert_visibility_match User.anonymous, issues
end
def test_visible_scope_for_anonymous_with_own_issues_visibility
Role.anonymous.update_attribute :issues_visibility, 'own'
Issue.create!(:project_id => 1, :tracker_id => 1,
:author_id => User.anonymous.id,
:subject => 'Issue by anonymous')
issues = Issue.visible(User.anonymous).all
assert issues.any?
assert_nil issues.detect {|issue| issue.author != User.anonymous}
assert_visibility_match User.anonymous, issues
end
def test_visible_scope_for_anonymous_without_view_issues_permissions
# Anonymous user should not see issues without permission
Role.anonymous.remove_permission!(:view_issues)
@@ -125,6 +113,20 @@ class IssueTest < ActiveSupport::TestCase
assert_visibility_match User.anonymous, issues
end
def test_anonymous_should_not_see_private_issues_with_issues_visibility_set_to_default
assert Role.anonymous.update_attribute(:issues_visibility, 'default')
issue = Issue.generate_for_project!(Project.find(1), :author => User.anonymous, :assigned_to => User.anonymous, :is_private => true)
assert_nil Issue.where(:id => issue.id).visible(User.anonymous).first
assert !issue.visible?(User.anonymous)
end
def test_anonymous_should_not_see_private_issues_with_issues_visibility_set_to_own
assert Role.anonymous.update_attribute(:issues_visibility, 'own')
issue = Issue.generate_for_project!(Project.find(1), :author => User.anonymous, :assigned_to => User.anonymous, :is_private => true)
assert_nil Issue.where(:id => issue.id).visible(User.anonymous).first
assert !issue.visible?(User.anonymous)
end
def test_visible_scope_for_non_member
user = User.find(9)
assert user.projects.empty?
@@ -1574,4 +1576,18 @@ class IssueTest < ActiveSupport::TestCase
def test_journals_after_with_blank_arg_should_return_all_journals
assert_equal [Journal.find(1), Journal.find(2)], Issue.find(1).journals_after('')
end
def test_save_attachments_with_hash_should_save_attachments_in_keys_order
set_tmp_attachments_directory
issue = Issue.generate!
issue.save_attachments({
'p0' => {'file' => mock_file_with_options(:original_filename => 'upload')},
'3' => {'file' => mock_file_with_options(:original_filename => 'bar')},
'1' => {'file' => mock_file_with_options(:original_filename => 'foo')}
})
issue.attach_saved_attachments
assert_equal 3, issue.reload.attachments.count
assert_equal %w(upload foo bar), issue.attachments.map(&:filename)
end
end
+18
View File
@@ -171,6 +171,24 @@ class Redmine::I18nTest < ActiveSupport::TestCase
assert_equal 'j', day_letter(4)
end
def test_number_to_currency_for_each_language
valid_languages.each do |lang|
set_language_if_valid lang
assert_nothing_raised "#{lang} failure" do
number_to_currency(-1000.2)
end
end
end
def test_number_to_currency_default
set_language_if_valid 'bs'
assert_equal "KM -1000,20", number_to_currency(-1000.2)
set_language_if_valid 'de'
euro_sign = "\xe2\x82\xac"
euro_sign.force_encoding('UTF-8') if euro_sign.respond_to?(:force_encoding)
assert_equal "-1000,20 #{euro_sign}", number_to_currency(-1000.2)
end
def test_valid_languages
assert valid_languages.is_a?(Array)
assert valid_languages.first.is_a?(Symbol)
+22
View File
@@ -382,6 +382,28 @@ class MailHandlerTest < ActiveSupport::TestCase
assert_equal 'Testmail from Webmail: ä ö ü...', issue.subject
end
def test_add_issue_with_japanese_subject
issue = submit_email(
'subject_japanese_1.eml',
:issue => {:project => 'ecookbook'}
)
assert_kind_of Issue, issue
ja = "\xe3\x83\x86\xe3\x82\xb9\xe3\x83\x88"
ja.force_encoding('UTF-8') if ja.respond_to?(:force_encoding)
assert_equal ja, issue.subject
end
def test_add_issue_with_mixed_japanese_subject
issue = submit_email(
'subject_japanese_2.eml',
:issue => {:project => 'ecookbook'}
)
assert_kind_of Issue, issue
ja = "Re: \xe3\x83\x86\xe3\x82\xb9\xe3\x83\x88"
ja.force_encoding('UTF-8') if ja.respond_to?(:force_encoding)
assert_equal ja, issue.subject
end
def test_should_ignore_emails_from_locked_users
User.find(2).lock!
+9
View File
@@ -1,3 +1,5 @@
# encoding: utf-8
#
# Redmine - project management software
# Copyright (C) 2006-2012 Jean-Philippe Lang
#
@@ -106,4 +108,11 @@ class PrincipalTest < ActiveSupport::TestCase
assert_equal @palmer, results.first
end
end
def test_like_scope_with_cyrillic_name
user = User.generate!(:firstname => 'Соболев', :lastname => 'Денис')
results = Principal.like('Собо')
assert_equal 1, results.count
assert_equal user, results.first
end
end
+15
View File
@@ -54,4 +54,19 @@ class UserPreferenceTest < ActiveSupport::TestCase
assert up.save
assert_kind_of Hash, up.others
end
def test_reading_value_from_nil_others_hash
up = UserPreference.new(:user => User.new)
up.others = nil
assert_nil up.others
assert_nil up[:foo]
end
def test_writing_value_to_nil_others_hash
up = UserPreference.new(:user => User.new)
up.others = nil
assert_nil up.others
up[:foo] = 'bar'
assert_equal 'bar', up[:foo]
end
end
+7 -1
View File
@@ -32,7 +32,13 @@ class VersionTest < ActiveSupport::TestCase
def test_invalid_effective_date_validation
v = Version.new(:project => Project.find(1), :name => '1.1', :effective_date => '99999-01-01')
assert !v.save
assert !v.valid?
v.effective_date = '2012-11-33'
assert !v.valid?
v.effective_date = '2012-31-11'
assert !v.valid?
v.effective_date = 'ABC'
assert !v.valid?
assert_include I18n.translate('activerecord.errors.messages.not_a_date'),
v.errors[:effective_date]
end
View File