Compare commits

..

465 Commits
2.1.5 ... 2.2.4

Author SHA1 Message Date
Jean-Philippe Lang
2c30292e85 tagged version 2.2.4
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/tags/2.2.4@11660 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-03-19 20:29:57 +00:00
Jean-Philippe Lang
c4164a0a7f Updates for 2.2.4 release.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11659 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-03-19 19:34:01 +00:00
Toshi MARUYAMA
504a767028 Merged r11648, r11649, r11650 from trunk to 2.2-stable.
upgrade Rails 3.2.13.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11653 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-03-19 08:40:52 +00:00
Toshi MARUYAMA
0eaba11e20 Merged r11637 from trunk to 2.2-stable (#13354)
PDF: fix incompatible character encodings: UTF-8 and ASCII-8BIT.

Contributed by Jun NAITOH.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11638 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-03-16 08:02:20 +00:00
Jean-Philippe Lang
c2eb28b901 Merged r11446 from trunk (#13232).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11596 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-03-11 18:30:20 +00:00
Jean-Philippe Lang
f09ea7b65a Merged r11351 from trunk (#13127).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11595 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-03-11 18:28:49 +00:00
Jean-Philippe Lang
878e85848f Backported r11424 from trunk (#12243).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11594 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-03-11 18:27:46 +00:00
Jean-Philippe Lang
4b010fb653 Merged r11371 from trunk (#13165).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11593 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-03-11 18:22:03 +00:00
Toshi MARUYAMA
5f96e64cd7 Merged r11553 from trunk to 2.2-stable (#13398, #13391)
Czech translation for 2.2-stable updated by Karel Pičman.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11557 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-03-08 01:02:47 +00:00
Toshi MARUYAMA
ec1cb4632c Merged r11529 from trunk to 2.2-stable (#13343, #13339)
r11529 has some 2.2-stable translation.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11532 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-03-03 12:00:40 +00:00
Toshi MARUYAMA
e4a1b1324a Merged r11528 from trunk to 2.2-stable (#13343, #13339)
Vietnamese translation for 2.2-stable updated by Minh Thien Nguyen.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11531 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-03-03 12:00:29 +00:00
Toshi MARUYAMA
6991874911 Merged r11498 from trunk to 2.2-stable (#13325, #13324)
pt-BR translation for 2.2-stable updated.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11500 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-03-01 01:52:02 +00:00
Toshi MARUYAMA
17bd53ae43 Merged r11491 from trunk to 2.2-stable (#13310)
pt-BR "label_last_n_weeks" translation updated.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11492 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-02-28 08:33:38 +00:00
Toshi MARUYAMA
559dc4f523 Merged r11432 from trunk to 2.2-stable (#13207, #13206)
Portuguese translation for 2.2-stable updated by Rui Rebelo.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11436 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-02-18 14:19:38 +00:00
Toshi MARUYAMA
6dcd50047d Merged r11389 from trunk to 2.2-stable.
add "tmp:clear" to "ci:setup" rake task for translation.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11435 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-02-18 13:22:25 +00:00
Toshi MARUYAMA
252df8dfc0 Merged r11399 from trunk to 2.2-stable (#13138)
not use htmlentities gem in rfpdf plugin.

Contributed by Jun NAITOH.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11400 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-02-15 14:32:45 +00:00
Toshi MARUYAMA
cbd3b057e0 Merged r11390 from trunk to 2.2-stable.
Bulgarian translation of jstoolbar-bg.js updated by Ivan Cenov (#13181)

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11391 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-02-15 06:23:34 +00:00
Jean-Philippe Lang
d094dea0ec Merged r11366 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11367 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-02-12 18:08:38 +00:00
Jean-Philippe Lang
3a98a14250 Merged r11350 from trunk (#13126).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11365 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-02-12 18:04:49 +00:00
Jean-Philippe Lang
ecef96a6b9 Merged r11332 from trunk (#13097).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11364 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-02-12 18:03:16 +00:00
Jean-Philippe Lang
0951522247 Merged r11331 and r11333 from trunk (#13075).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11363 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-02-12 18:01:15 +00:00
Jean-Philippe Lang
42cc2d322a Merged r11281 from trunk (#12979).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11362 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-02-12 17:57:46 +00:00
Jean-Philippe Lang
0367c323de Merged r11258 from trunk (#12930).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11361 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-02-12 17:56:39 +00:00
Toshi MARUYAMA
80be82ae50 Merged r11353 from trunk to 2.2-stable
upgrade Rails to 3.2.12.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11358 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-02-12 06:28:11 +00:00
Toshi MARUYAMA
ebed927de5 2.2-stable: svn propset svn:eol-style native SVG source files (#12971)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11357 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-02-12 03:52:41 +00:00
Toshi MARUYAMA
cbd069118a 2.2-stable: backout r11355 (back to Rails 3.2.11)
jruby-1.6.7 tests fail on CI server.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11356 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-02-12 02:49:25 +00:00
Toshi MARUYAMA
a211d1be7d Merged r11353 from trunk to 2.2-stable
upgrade Rails to 3.2.12.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11355 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-02-12 01:46:21 +00:00
Toshi MARUYAMA
0a8e0a3bed Merged r11306 from trunk to 2.2-stable (#11987)
pdf: fix broken new line in table.

Contributed by Jun NAITOH.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11308 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-02-03 06:53:18 +00:00
Toshi MARUYAMA
58cf34dea5 Merged r11263 from trunk to 2.2-stable (#12987)
Russian translation for 2.2-stable updated.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11266 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-01-26 00:40:21 +00:00
Toshi MARUYAMA
594a7bde95 Merged r11246 from trunk to 2.2-stable (#12926, #12928)
Bulgarian translation for 2.2-stable updated by Ivan Cenov.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11251 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-01-21 13:54:49 +00:00
Toshi MARUYAMA
c5e257d82b Merged r11243 from trunk to 2.2-stable (#12922)
Spanish translation for 2.2-stable updated by Jorge López.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11245 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-01-21 11:50:27 +00:00
Jean-Philippe Lang
56b12b289f Merged r11239 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11240 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-01-20 18:24:43 +00:00
Jean-Philippe Lang
c99eef1aff Merged r11228 from trunk (#12851).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11236 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-01-20 17:09:36 +00:00
Jean-Philippe Lang
ed891e2733 Merged r11227 from trunk (#9842).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11235 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-01-20 17:06:46 +00:00
Jean-Philippe Lang
4620b8b8db Backported r11233 from trunk (#12833).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11234 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-01-20 17:03:40 +00:00
Jean-Philippe Lang
98eb2edd25 Merged r11225 from trunk (#12838).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11232 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-01-20 17:01:03 +00:00
Jean-Philippe Lang
ed7318fb8d Backported r11157 and r11158 from trunk (#12801).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11231 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-01-20 16:59:42 +00:00
Jean-Philippe Lang
5a1a2f5855 Merged r11159 from trunk (#12799).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11230 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-01-20 16:56:50 +00:00
Jean-Philippe Lang
f1314278d5 Backported r11196 from trunk (#7510).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11229 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-01-20 16:55:37 +00:00
Toshi MARUYAMA
3a8b872a09 Merged r11170 from trunk to 2.2-stable (#12818)
Swedish translation updated by Nicklas Holm.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11172 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-01-12 12:43:51 +00:00
Toshi MARUYAMA
56290979fc Merged r11163 from trunk to 2.2-stable (#12809)
Swedish translation updated by Nicklas Holm.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11165 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-01-11 13:19:18 +00:00
Toshi MARUYAMA
6e0fb415a7 Merged r11160 from trunk to 2.2-stable (#12800)
Serbian translation updated by Miodrag Milic.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11162 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-01-11 08:31:14 +00:00
Jean-Philippe Lang
f26654b29f Merged r11146 from trunk: Changes for 2.2.1 release.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11147 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-01-09 13:33:24 +00:00
Jean-Philippe Lang
5c62c1cf95 Merged r11126 from trunk (#12744).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11145 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-01-09 13:31:05 +00:00
Jean-Philippe Lang
2d6adbd7ff Merged r11088 from trunk (#12691).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11144 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-01-09 13:29:59 +00:00
Jean-Philippe Lang
b0ccaffe1b Merged r11064 from trunk (#12652).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11143 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-01-09 13:29:08 +00:00
Toshi MARUYAMA
2c37617973 Merged r11140 from trunk to 2.2-stable.
Upgrade to Rails 3.2.11.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11142 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-01-08 23:57:13 +00:00
Toshi MARUYAMA
567eb70fdb Merged r11128 from trunk to 2.2-stable.
Test fails when run at the beginning of the day.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11141 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-01-08 23:14:03 +00:00
Toshi MARUYAMA
de63102925 Merged r11109 from trunk to 2.2-stable
Upgrade to Rails 3.2.10.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11111 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-01-04 02:05:44 +00:00
Toshi MARUYAMA
a8fcf9389e Merged r11091 from trunk (#12711, #11290)
fix incorrect min_x_value of lib/SVG/Graph/TimeSeries.rb by r10439.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11093 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-01-03 00:15:32 +00:00
Toshi MARUYAMA
3e4b36de83 Merged r11051 from trunk to 2.2-stable (#12630)
Russian "x_hours" translation updated by Mikhail Velkin.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11054 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-12-19 00:00:04 +00:00
Jean-Philippe Lang
edd584d59e Merged r11041 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11042 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-12-18 12:24:17 +00:00
Toshi MARUYAMA
e2b27ab696 Merged r11036 from trunk to 2.2-stable (#12615, #12619)
Russian translation changed by Kirill Bezrukov.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11040 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-12-18 00:04:49 +00:00
Toshi MARUYAMA
1968d039ee Merged r11035 from trunk to 2.2-stable (#12615)
Russian translation updated by Kirill Bezrukov.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11037 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-12-17 23:24:31 +00:00
Toshi MARUYAMA
fddc33cd45 Merged r11022 from trunk to 2.2-stable (#12614)
Dutch translation updated.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11023 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-12-17 12:43:15 +00:00
Toshi MARUYAMA
29518ba0cf Merged r11015 from trunk to 2.2-stable (#12605, #12608)
Norwegian translation changed by Ketil Mehl.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11018 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-12-16 07:34:34 +00:00
Toshi MARUYAMA
acd27b9eb1 Merged r11014 from trunk to 2.2-stable (#12605)
Norwegian translation for 1.4-stable updated by Ketil Mehl.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11017 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-12-16 07:34:09 +00:00
Toshi MARUYAMA
6445b5997c Merged r11012 from trunk to 2.2-stable (#12607)
Japanese translation for 2.2-stable updated.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11016 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-12-16 07:33:39 +00:00
Jean-Philippe Lang
416d33973f Merged r10991 from trunk (#12568).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11009 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-12-15 07:55:50 +00:00
Jean-Philippe Lang
82c7dc11d2 Merged r10992 from trunk (#12400).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11006 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-12-15 07:52:39 +00:00
Jean-Philippe Lang
d22f782d3f Merged r10956 from trunk (#12513).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11004 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-12-15 07:51:12 +00:00
Jean-Philippe Lang
3717fdfa79 Merged r10975 from trunk (#12566).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11002 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-12-15 07:49:31 +00:00
Toshi MARUYAMA
9d3d932703 Merged r10999 from trunk (#12602)
Korean translation updated by Jongwook Choi.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@11000 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-12-15 01:32:43 +00:00
Jean-Philippe Lang
3a379ce4b9 Merged r10948 into 2.2-stable (#3447).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@10952 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-12-08 08:41:59 +00:00
Toshi MARUYAMA
daa77f0109 Merged r10946 from trunk to 2.2-stable (#12514)
Lithuanian translation updated by Egidijus Zideckas.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@10947 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-12-06 06:30:05 +00:00
Toshi MARUYAMA
c0d66d626b Merged r10940 from trunk to 2.2-stable (#12494)
Bulgarian "button_submit" translation changed by Ivan Cenov.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@10942 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-12-04 05:43:41 +00:00
Jean-Philippe Lang
bf02b76ca3 Sets stable branch.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@10908 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-12-02 18:01:48 +00:00
Jean-Philippe Lang
75e02ca486 branch 2.2-stable added
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.2-stable@10907 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-12-02 17:58:22 +00:00
Jean-Philippe Lang
ee3d6dbdbb Set version to 2.2.0.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10906 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-12-02 17:57:30 +00:00
Jean-Philippe Lang
e97a3ab97b Fixed find_issues logic.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10905 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-12-02 10:25:30 +00:00
Jean-Philippe Lang
6e1ff5bba6 Code cleanup.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10904 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-12-02 09:59:22 +00:00
Jean-Philippe Lang
88d5663ad2 Code cleanup.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10903 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-12-01 17:57:30 +00:00
Jean-Philippe Lang
16441b4938 Code cleanup.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10902 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-12-01 16:25:20 +00:00
Jean-Philippe Lang
65d3bffad7 Moved duplicate #options_for_membership_project_select to ApplicationHelper.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10901 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-12-01 16:19:52 +00:00
Jean-Philippe Lang
4d71446791 Don't load all helpers.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10900 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-12-01 16:14:05 +00:00
Jean-Philippe Lang
0ef82b3dcf Removes textarea resizer in favour of built-in browser support.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10894 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-30 08:56:02 +00:00
Jean-Philippe Lang
a1d156d794 Fixed that roles API should accept API auth for when authentication is required (#12472).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10893 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-30 07:48:47 +00:00
Toshi MARUYAMA
a1119624c0 fix comment of RMagcik font configuration (#4787)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10892 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-28 11:00:57 +00:00
Toshi MARUYAMA
0a675c7c77 remove trailing white-spaces from app/models/repository.rb
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10891 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-28 10:46:10 +00:00
Toshi MARUYAMA
c7ee26b144 add configuration of RMagcik font for CJK (Chinese, Japanese and Korean) (#4787)
Contributed by Jun NAITOH.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10890 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-28 10:11:33 +00:00
Toshi MARUYAMA
f4cf7bc6f5 code layout cleanup app/models/issue_relation.rb
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10889 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-28 01:11:32 +00:00
Jean-Philippe Lang
c3817e620f Code cleanup.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10888 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-27 22:16:33 +00:00
Jean-Philippe Lang
9a270c46c0 Code cleanup.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10887 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-27 22:13:14 +00:00
Jean-Philippe Lang
e43448f6ca Use 8+ characters long passwords in tests.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10886 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-27 21:52:38 +00:00
Jean-Philippe Lang
14e56006a1 Fixed that #extract_macro_options should not be greedy (#12451).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10885 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-27 19:59:33 +00:00
Jean-Philippe Lang
bf5b6014f7 Set the default minimum password length to 8.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10884 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-27 19:27:21 +00:00
Jean-Philippe Lang
6c0f3cd5d4 Validate email only if changed.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10883 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-27 19:25:56 +00:00
Jean-Philippe Lang
04dcdb3290 Code cleanup.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10882 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-27 19:24:22 +00:00
Jean-Philippe Lang
457f0bb337 Code cleanup.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10881 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-27 19:21:21 +00:00
Jean-Philippe Lang
96e01c6d4a Fixed the behaviour for when rescheduling a parent task (#4590).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10880 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-24 15:09:51 +00:00
Jean-Philippe Lang
fb9a2901e9 Fixed that autolinks and textile links ending with cyrilic characters are broken (#12397).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10879 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-24 14:20:01 +00:00
Jean-Philippe Lang
b94c971755 Precede-Follow relation should move following issues earlier when rescheduling issue earlier (#4590).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10878 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-24 13:43:52 +00:00
Jean-Philippe Lang
29fc292b18 Respond with 404 instead of 500 when requesting a wiki diff with invalid versions (#12434).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10877 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-24 12:27:00 +00:00
Jean-Philippe Lang
845d7bc645 Updates for 2.1.4 release.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10874 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-24 09:34:42 +00:00
Jean-Philippe Lang
cb24cafedc Removed duplicated test.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10869 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-23 17:53:47 +00:00
Jean-Philippe Lang
dc68be983a Use Project.rebuild_tree! instead of .rebuild! in migration.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10868 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-23 17:53:12 +00:00
Jean-Philippe Lang
25c63ec747 Adds a Project.rebuild_tree! method to force the rebuild of the nested set.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10867 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-23 17:50:46 +00:00
Jean-Philippe Lang
13f5301c09 Fixed that Project.rebuild! sorts projects by id instead of name (#12431).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10866 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-23 17:39:38 +00:00
Jean-Philippe Lang
be7895e04e Do not create projects in alphabetical order in nested set tests (#12431).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10865 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-23 17:36:04 +00:00
Toshi MARUYAMA
921ad01bde scm: git: change extra_report_last_commit type at unit test to string (#12409)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10862 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-21 23:34:27 +00:00
Jean-Philippe Lang
d00cc4d9b5 Upgrade to Rails 3.2.9 (#12393).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10860 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-21 20:22:43 +00:00
Toshi MARUYAMA
f6367b8ba7 scm: git: fix tests fail when extra_info is nil (#12409)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10857 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-21 08:17:56 +00:00
Toshi MARUYAMA
5d8d38aa60 scm: git: fix changesets aren't read after clear_changesets call (#12409)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10856 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-21 07:44:29 +00:00
Toshi MARUYAMA
7048f66619 svn propset svn:eol-style native to fixtures (#12399)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10853 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-21 05:43:36 +00:00
Toshi MARUYAMA
6740f441c4 fix non ASCII attachment filename encoding broken (MOJIBAKE) in receiving mail on Ruby 1.8 (#12399)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10852 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-21 05:37:22 +00:00
Toshi MARUYAMA
adcf54a92b remove trailing white-space from app/controllers/trackers_controller.rb
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10851 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-18 23:15:45 +00:00
Jean-Philippe Lang
a829bfa755 Fixed that MailHandler raises an error when email has no subject header (#12396).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10850 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-18 23:09:45 +00:00
Jean-Philippe Lang
f232f56d97 Adds copyright.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10847 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-18 18:21:16 +00:00
Jean-Philippe Lang
26b3e48545 Symbols can not be sorted with ruby1.8.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10846 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-18 18:19:48 +00:00
Jean-Philippe Lang
2d1e7ff829 Adds english names for several languages.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10845 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-18 18:16:14 +00:00
Jean-Philippe Lang
a49de1c39d Cache languages names to avoid loading all translations files.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10844 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-18 18:01:24 +00:00
Jean-Philippe Lang
3739810afa Adds a custom i18n backend that lazily loads translations files.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10843 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-18 17:41:31 +00:00
Jean-Philippe Lang
f36b3fff60 Code cleanup.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10842 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-18 16:01:07 +00:00
Jean-Philippe Lang
46d27348fd Eager-load authors.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10841 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-18 14:37:37 +00:00
Jean-Philippe Lang
1ff8bbf080 Pins mysql gem to ~> 2.8.1.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10840 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-18 14:28:45 +00:00
Jean-Philippe Lang
628b3cde71 Removed unused i18n string (#8373).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10839 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-18 10:31:20 +00:00
Jean-Philippe Lang
5f36e1fff2 Removed the limit of 75 pages when exporting wiki pages (#12274).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10838 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-18 10:18:30 +00:00
Jean-Philippe Lang
aa45516a02 Fixed that repository identifier may not be displayed in project settings (#12332).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10837 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-18 10:10:09 +00:00
Jean-Philippe Lang
3cf6a56b97 Fixed context menu for IE 7/8 (#12298).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10836 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-18 10:02:07 +00:00
Jean-Philippe Lang
98f225f6cd Updates for 2.1.3 release.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10831 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-17 12:49:08 +00:00
Jean-Philippe Lang
72ea1851b9 'None' grouped issue list section should be translated (#12358).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10829 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-17 11:18:54 +00:00
Jean-Philippe Lang
1c14dd35cf Fixes #requires_redmine comments (#12299).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10828 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-17 11:05:27 +00:00
Jean-Philippe Lang
4bd1e887d9 Makes Plugin#requires_redmine accept a range of versions (#12299).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10827 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-17 10:55:38 +00:00
Jean-Philippe Lang
b3cf67cad4 Makes Plugin#requires_redmine accept only major and minor version (#12299).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10826 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-17 10:07:21 +00:00
Jean-Philippe Lang
19bd857790 Rewrites requires_redmine tests.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10825 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-17 09:54:56 +00:00
Jean-Philippe Lang
dd96ef4248 Issue "Update" link broken focus (#12356).
Patch by Alexander Oryol.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10818 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-17 08:48:08 +00:00
Toshi MARUYAMA
70bcbd1404 replace non ASCII characters to hexadecimals at unit mail handler test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10814 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-16 06:48:46 +00:00
Toshi MARUYAMA
9f6cf296d1 svn propset svn:eol-style native to fixtures (#12375)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10813 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-16 06:26:43 +00:00
Toshi MARUYAMA
617cb7ac53 fix receiving mail subject broken which does not begin with encoding name (#12375)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10812 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-16 06:19:42 +00:00
Toshi MARUYAMA
1da74009cd add test of receiving mail subject begins with encoding name (#12375)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10811 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-16 05:25:18 +00:00
Jean-Philippe Lang
8b527ce247 Fixed version date validation (#12359).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10810 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-15 22:43:10 +00:00
Jean-Philippe Lang
e9e5d2e072 Fixed new issue form rendering with IE8.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10806 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-15 19:59:14 +00:00
Toshi MARUYAMA
fd41840434 Gemfile: remove rake
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10805 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-13 22:44:13 +00:00
Jean-Philippe Lang
b880020527 Code cleanup.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10804 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-13 22:15:47 +00:00
Jean-Philippe Lang
547b85c4ef Adds table name to the SQL clause used by Principale.like scope.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10803 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-13 22:13:39 +00:00
Jean-Philippe Lang
d21cfe6bb4 Code cleanup.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10802 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-13 22:03:42 +00:00
Jean-Philippe Lang
ce04c41830 Fixed that Principal#like scope does not work with cyrillic characters and Postgresql (#12349).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10801 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-13 22:01:31 +00:00
Jean-Philippe Lang
37c590bfef Unpin rake version.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10800 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-13 18:10:04 +00:00
Toshi MARUYAMA
b0b8352bc5 Gemfile: pin rake version 0.9.2.2
CI server tests fail.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10799 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-13 04:46:46 +00:00
Toshi MARUYAMA
37a600475c Gemfile: pin rake version 0.9
CI server tests fail.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10798 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-13 04:24:54 +00:00
Toshi MARUYAMA
cb68851eac remove trailing white-space from app/controllers/timelog_controller.rb
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10797 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-13 03:58:38 +00:00
Jean-Philippe Lang
d6b1ad38a7 Adds a div that wraps everything except the footer.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10794 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-08 18:26:48 +00:00
Jean-Philippe Lang
a17f4c8375 Make sure that attachments are created in the same order they were selected (#12310).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10793 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-07 18:45:56 +00:00
Jean-Philippe Lang
00927f58af Make sure that #attachments returns attachments with same timestamp in the order they were created (#12310).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10792 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-07 18:06:42 +00:00
Toshi MARUYAMA
4ef90b6096 fix Lithuanian numeral translation (#12316)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10791 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-06 22:54:40 +00:00
Jean-Philippe Lang
d6e8a2d4e6 Fixed misleading German translation for "Registered" (#12294).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10790 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-05 16:47:14 +00:00
Jean-Philippe Lang
c8b722456c Fixed that watchers receive notifications for private comments without permission (#12286).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10789 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-05 15:49:07 +00:00
Jean-Baptiste Barth
7f3cc6e38b Fixed some more test/integration/*_test.rb breaking when run alone (#12285)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10788 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-01 22:47:59 +00:00
Jean-Baptiste Barth
7d9c45fb8a Fixed some more test/functional/*_test.rb breaking when run alone (#12285)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10787 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-01 22:47:44 +00:00
Jean-Baptiste Barth
0beef88850 Fixed some more test/unit/*_test.rb breaking when run alone (#12285)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10786 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-01 22:47:25 +00:00
Jean-Baptiste Barth
ff9b3d3a06 Fixed test/functional/welcome_controller_test.rb breaking when run alone (#12285)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10785 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-01 13:26:50 +00:00
Jean-Baptiste Barth
3ac94be04b Fixed test/functional/sessions_test.rb breaking when run alone (#12285)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10784 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-01 13:23:57 +00:00
Jean-Baptiste Barth
9280182bde Fixed test/functional/mail_handler_controller_test.rb breaking when run alone (#12285)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10783 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-01 13:20:42 +00:00
Jean-Baptiste Barth
68cd78f7cc Fixed test/functional/groups_controller_test.rb breaking when run alone (#12285)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10782 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-01 11:58:45 +00:00
Jean-Baptiste Barth
45e7c63fc4 Fixed test/unit/issue_category_test.rb breaking when run alone (#12285)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10781 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-01 10:29:55 +00:00
Jean-Baptiste Barth
0eabfc5e72 Fixed test/unit/version_test.rb breaking when run alone (#12285)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10780 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-01 10:23:49 +00:00
Jean-Baptiste Barth
6e190a76fb Fixed test/unit/watcher_test.rb breaking when run alone (#12285)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10779 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-01 10:22:37 +00:00
Jean-Baptiste Barth
e00b4acf1e Use Rake::TestTask#pattern for plugin tests instead of #test_files (#11534)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10778 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-11-01 09:40:40 +00:00
Toshi MARUYAMA
511e46e978 Bulgarian translation updated by Ivan Cenov (#12280)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10777 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-31 22:55:51 +00:00
Toshi MARUYAMA
8a66522314 fix unit issue test fails on Wednesday
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10776 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-31 10:20:59 +00:00
Toshi MARUYAMA
b49948d880 Traditional Chinese translation updated by ChunChang Lo (#12271)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10775 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-31 09:05:20 +00:00
Toshi MARUYAMA
fdff662f4e German translation updated by Daniel Felix (#12257)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10774 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-30 22:49:13 +00:00
Toshi MARUYAMA
7158a51add Japanese translation updated by Go MAEDA (#12256)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10773 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-30 22:48:43 +00:00
Jean-Philippe Lang
b5f8290f4c Fixed source indentation (#8106).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10772 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-30 15:17:11 +00:00
Jean-Philippe Lang
f909a8c006 Issues by Category should show tasks without category (#8106).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10771 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-30 14:24:33 +00:00
Jean-Philippe Lang
399223daba New user name format: firstname + first letter of lastname (#12085).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10770 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-30 08:40:12 +00:00
Jean-Philippe Lang
cdc8944a89 Filling locales (#11426).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10769 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-30 08:21:54 +00:00
Jean-Philippe Lang
d62ef6b9b1 Changes how relative date filters work and adds specific filters for filtering dates in past/next n days (#11426).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10768 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-30 08:21:15 +00:00
Jean-Philippe Lang
b9c72bf590 Validate value for date filters.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10767 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-30 07:53:14 +00:00
Toshi MARUYAMA
cb7ab9bc0c Bulgarian translation updated by Ivan Cenov (#12254)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10766 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-30 07:47:09 +00:00
Jean-Philippe Lang
9f148e098b Ability to sort issues by grouped column (#3511).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10765 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-29 18:32:41 +00:00
Toshi MARUYAMA
1fc324b74c German Translation updated by Daniel Felix (#12237)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10763 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-29 14:44:16 +00:00
Toshi MARUYAMA
69b5e929af Japanese translation updated by Go MAEDA (#12246)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10762 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-29 13:23:14 +00:00
Jean-Philippe Lang
ea0e3849e3 Limit resizing of textare vertically.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10761 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-29 13:11:29 +00:00
Jean-Philippe Lang
96b7c041c8 German Translation updated by Daniel Felix.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10758 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-29 12:12:25 +00:00
Jean-Philippe Lang
e74986391a German Translation updated by Daniel Felix.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10757 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-29 12:11:24 +00:00
Jean-Philippe Lang
c00084b80b Display non working days on gantt image according to settings (#2161).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10751 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-29 10:23:59 +00:00
Jean-Philippe Lang
1f55907f83 Display non working days on gantt according to settings (#2161).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10750 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-29 10:21:00 +00:00
Jean-Philippe Lang
5fe4aae7ba Non working days is an array of strings (#2161).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10749 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-29 10:19:40 +00:00
Jean-Philippe Lang
6b2e0333ca Filling locales (#2161).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10748 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-29 10:07:07 +00:00
Jean-Philippe Lang
b71355f10b Ignore non-working days when rescheduling an issue (#2161).
Weekly non-working days can be configured in application settings (set to saturday and sunday by default).

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10747 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-29 10:06:30 +00:00
Jean-Philippe Lang
48d83884c3 Hard-coded "Back" on 404 view (#12231).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10745 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-28 20:42:18 +00:00
Jean-Philippe Lang
fe690dcf20 Use page parameter instead of p for pagination.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10744 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-28 20:27:50 +00:00
Jean-Philippe Lang
beb2610650 REST API for deleting wiki pages (#7082).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10743 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-28 20:17:38 +00:00
Toshi MARUYAMA
625eebb720 code cleanup scm_iconv (#12228)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10742 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-28 11:39:43 +00:00
Toshi MARUYAMA
123d2b318f fix scm_iconv local variable name (#12228)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10741 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-28 07:12:23 +00:00
Toshi MARUYAMA
5a2c80cb48 use String#encode at scm_iconv on Ruby 1.9 (#12228)
Unit git adapter test fails on JRuby 1.7.

<pre>
Failure:
  <"test-Ü-2.txt">("UTF-8") expected but was
  <"test-\xC3\x9C-2.txt">("ASCII-8BIT").

  diff:
  - test-Ü-2.txt
  ?      ^
  + test-Ü-2.txt
  ?      ^^
test_entries_latin_1_files(GitAdapterTest)
test/unit/lib/redmine/scm/adapters/git_adapter_test.rb:468:in `test_entries_latin_1_files'
     465:         assert entries1
     466:         assert_equal 3, entries1.size
     467:         f1 = entries1[1]
  => 468:         assert_equal "test-#{@char_1}-2.txt", f1.name
     469:         assert_equal "latin-1-dir/test-#{@char_1}-2.txt", f1.path
     470:         assert_equal 'file', f1.kind
     471:       end
</pre>

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10740 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-28 06:19:29 +00:00
Toshi MARUYAMA
a71ff93f8f fix JRuby 1.6 tests fail on CI server (#12228)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10739 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-28 03:59:09 +00:00
Toshi MARUYAMA
49f2d4729d prevent rake task error on JRuby 1.7 (#12228)
Following is "rake db:migrate RAILS_ENV=test" output
on jruby 1.7.0 (1.9.3p203) 2012-10-22 ff1ebbe on OpenJDK Client VM 1.6.0_18-b18 [linux-i386].

<pre>
ArgumentError: file not found: db:migrate
   non_options at /xxxxx/rubies/jruby-1.7.0/lib/ruby/1.9/test/unit.rb:167
          map! at org/jruby/RubyArray.java:2387
   non_options at /xxxxx/rubies/jruby-1.7.0/lib/ruby/1.9/test/unit.rb:146
   non_options at /xxxxx/rubies/jruby-1.7.0/lib/ruby/1.9/test/unit.rb:207
  process_args at /xxxxx/rubies/jruby-1.7.0/lib/ruby/1.9/test/unit.rb:52
          _run at /xxxxx/rubies/jruby-1.7.0/lib/ruby/1.9/minitest/unit.rb:891
           run at /xxxxx/rubies/jruby-1.7.0/lib/ruby/1.9/minitest/unit.rb:884
           run at /xxxxx/rubies/jruby-1.7.0/lib/ruby/1.9/test/unit.rb:21
       autorun at /xxxxx/rubies/jruby-1.7.0/lib/ruby/1.9/test/unit.rb:326
      run_once at /xxxxx/rubies/jruby-1.7.0/lib/ruby/1.9/test/unit.rb:27
       autorun at /xxxxx/rubies/jruby-1.7.0/lib/ruby/1.9/test/unit.rb:325
</pre>

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10737 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-28 01:52:01 +00:00
Toshi MARUYAMA
d840837563 remove trailing white-space from app/controllers/repositories_controller.rb
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10736 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-28 01:12:00 +00:00
Toshi MARUYAMA
ac75aad581 German translation enhancements by Daniel Felix (#12232)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10735 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-28 00:43:53 +00:00
Toshi MARUYAMA
176e239e23 German translation for trunk updated by Daniel Felix (#12232)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10734 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-28 00:43:25 +00:00
Toshi MARUYAMA
0932689ef6 German translation for 2.1-stable updated by Daniel Felix (#12232, #12235)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10733 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-28 00:42:36 +00:00
Jean-Philippe Lang
00736951cf Adds double quotes in mysql configuration example (#12229).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10729 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-27 08:50:33 +00:00
Jean-Philippe Lang
29a474b641 Wrap issue description and its contextual menu in a div (#12211).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10728 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-27 08:35:19 +00:00
Jean-Philippe Lang
8a2786c91e Fixes that test randomly fails.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10727 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-27 07:36:06 +00:00
Jean-Philippe Lang
fb68f4703b Use textual CSS class for priorities in alternate theme (#12216).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10726 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-27 06:26:24 +00:00
Jean-Philippe Lang
2af516bd05 Use textual CSS class for priorities in alternate theme (#12216).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10725 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-27 06:25:41 +00:00
Jean-Philippe Lang
166cbfdb3c Adjusts tests for the css class added in r10720 (#12216).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10721 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-26 02:46:38 +00:00
Jean-Philippe Lang
113f8b5cf2 Adds a textual css class for issue priorities (#12216).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10720 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-26 01:25:23 +00:00
Jean-Philippe Lang
a679d19709 Adds last edit comments on the wiki page (#7082).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10719 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-25 21:17:46 +00:00
Jean-Philippe Lang
03062394fc Adds ?include=attachments option when retrieving a wiki page with the REST API (#7082).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10718 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-25 20:44:37 +00:00
Jean-Philippe Lang
eff874b29a REST API for creating/updating wiki pages (#7082).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10717 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-25 20:38:29 +00:00
Jean-Philippe Lang
9e31308720 REST API for retrieving wiki pages (#7082).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10716 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-25 19:44:04 +00:00
Jean-Philippe Lang
b2e035fa96 Don't show confirmation message when disabled delete link in the context menu (#12199).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10715 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-24 21:24:40 +00:00
Jean-Philippe Lang
1c7e4bb7f0 Javascript syntax error (#12195).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10714 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-24 21:01:37 +00:00
Toshi MARUYAMA
e0811bc80d scm: use nil instead of @rev at revision text box of "View all revisions" page
@rev is set as default branch at controller.
On Git, in most cases it is "master".
And it is set on revision text box of "View all revisions" page.
"master" branch is NOT revision, so clicking OK button causes error.
It is very confused.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10713 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-24 11:12:05 +00:00
Toshi MARUYAMA
60afbcd37f add tmp/thumbnails/* to .hgignore and .gitignore
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10712 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-24 11:11:38 +00:00
Toshi MARUYAMA
c4ce048970 fix "Page not found" on OK button in SCM "View all revisions" page (#12196)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10709 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-24 09:24:30 +00:00
Toshi MARUYAMA
2beae77c58 backout r10707 (#12196)
fix "Page not found" on OK button in SCM "View all revisions" page.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10708 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-24 09:23:59 +00:00
Toshi MARUYAMA
440232a54d fix "Page not found" on OK button in SCM "View all revisions" page (#12196)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10707 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-24 07:59:16 +00:00
Jean-Philippe Lang
881a22d248 Fixed test case class name (#10852).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10706 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-23 21:24:38 +00:00
Jean-Philippe Lang
6cccdce06e Ability to delete a version from a wiki page history (#10852).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10705 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-23 18:45:14 +00:00
Toshi MARUYAMA
9e7f71080f add tmp/pdf directory (#12189)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10702 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-23 10:50:09 +00:00
Toshi MARUYAMA
ff4a92a782 Simplified Chinese translation for trunk updated by Steven Wong (#12188)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10700 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-23 06:18:06 +00:00
Toshi MARUYAMA
a829e381be Simplified Chinese translation for 2.1-stable updated by Steven Wong (#12188)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10699 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-23 06:17:39 +00:00
Toshi MARUYAMA
1db6a0f89c gantt: remove unused issues parameter from gantt_issue_compare method
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10698 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-23 00:17:05 +00:00
Toshi MARUYAMA
8975f9c235 Traditional Chinese translation updated by ChunChang Lo (#12176)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10696 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-22 08:13:37 +00:00
Toshi MARUYAMA
4ff3c9fdb5 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/trunk@10689 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-22 02:03:23 +00:00
Toshi MARUYAMA
f188277ab2 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/trunk@10688 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-22 02:03:11 +00:00
Jean-Philippe Lang
d66b3452db Wiki page versions routes cleanup.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10687 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-21 18:46:26 +00:00
Toshi MARUYAMA
9ec142713d Japanese translation updated by Go MAEDA (#12171)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10686 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-21 10:12:11 +00:00
Jean-Philippe Lang
61d8e8f1f4 Don't show watch, lock/unlock, delete links on previous wiki page versions.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10685 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-21 04:56:58 +00:00
Jean-Philippe Lang
9796d18609 Handle deleted wiki page versions (#10852).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10684 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-21 04:43:15 +00:00
Jean-Philippe Lang
f09be68323 Adds cc and bcc to email log messages (#12090).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10683 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-21 03:38:54 +00:00
Jean-Philippe Lang
82eab51203 Bulgarian translation updated by Ivan Cenov (#12168).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10682 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-20 17:17:25 +00:00
Jean-Philippe Lang
d22b57a27d Filling locales (#12167).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10681 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-20 15:01:44 +00:00
Jean-Philippe Lang
d29fa4735b Adds a macro for inserting collapsed text (#12167).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10680 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-20 14:49:32 +00:00
Toshi MARUYAMA
0faab70be5 Lithuanian "label_in" translation updated by Gediminas Muižis (#12142)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10679 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-20 11:39:02 +00:00
Jean-Philippe Lang
251f263abd Let the attachment filename be specified on upload (#12125).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10678 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-18 21:06:35 +00:00
Jean-Philippe Lang
79c1ec7adc Reverts r10676 that broke a test.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10677 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-18 18:11:42 +00:00
Jean-Philippe Lang
e7dfc30c2f Code cleanup.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10676 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-18 17:15:26 +00:00
Jean-Philippe Lang
9b702971bf Use named route.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10675 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-18 17:12:22 +00:00
Jean-Philippe Lang
2b4389466f Use named route.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10674 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-18 17:10:00 +00:00
Jean-Philippe Lang
7729178d9d Adds links to locked users when current user is admin.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10673 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-18 17:08:42 +00:00
Jean-Philippe Lang
50037b18c4 Adds a test for start date < due date validation.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10672 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-18 16:48:19 +00:00
Jean-Philippe Lang
1a9d482fc9 Code cleanup.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10671 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-18 16:47:41 +00:00
Jean-Philippe Lang
1737552eca Fixed that invalid start date is ignored (#12092).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10670 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-18 16:43:14 +00:00
Toshi MARUYAMA
9ff16dd411 remove duplicate keys from Lithuanian translation file (#12142)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10669 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-18 03:30:52 +00:00
Toshi MARUYAMA
59cf6dea86 Lithuanian translation updated by Gediminas Muižis (#12142)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10668 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-18 02:29:44 +00:00
Toshi MARUYAMA
f293f82c3f remove field_is_in_chlog and label_change_log from locales which removed r3162
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10667 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-18 00:31:46 +00:00
Toshi MARUYAMA
e764349a1b backout r10665
Removed field_is_in_chlog and label_change_log revision from locales is not r3147.
It is r3162.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10666 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-18 00:31:30 +00:00
Toshi MARUYAMA
c3788674ff remove field_is_in_chlog and label_change_log from locales which removed r3147
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10665 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-17 23:39:19 +00:00
Jean-Philippe Lang
d62b90db73 Makes enumerations available through the REST API.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10664 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-17 17:29:27 +00:00
Jean-Philippe Lang
fcb22595d0 Use named route (#12113).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10663 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-17 17:01:07 +00:00
Jean-Philippe Lang
ef1f14905b Use parent tracker as the default tracker when adding a subtask (#12113).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10662 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-17 17:00:24 +00:00
Jean-Philippe Lang
b8fbb41d5f Adds a helper for displaying a link to add a subtask (#12113).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10661 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-17 16:58:44 +00:00
Jean-Philippe Lang
0a000921f8 Use a local variable.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10660 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-17 16:54:26 +00:00
Toshi MARUYAMA
c945fe82b2 change Japanese translation of "admin" (#12117)
Contributed by Go MAEDA.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10659 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-17 09:16:26 +00:00
Jean-Philippe Lang
4b6b568635 Fixed that entering #nnn as parent task should validate (#11979).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10658 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-14 14:35:57 +00:00
Toshi MARUYAMA
5aaf9c734c svn propset svn:eol-style native extra/sample_plugin/test/integration/routing_test.rb
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10657 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-13 16:29:12 +00:00
Toshi MARUYAMA
ff2d374a14 add routing test to sample plugin
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10656 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-13 16:22:04 +00:00
Toshi MARUYAMA
9581afe060 code layout clean up test_should_not_be_able_to_assign_a_new_issue_to_a_locked_version of unit issue test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10655 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-13 11:20:55 +00:00
Toshi MARUYAMA
6ebfe54e6e code layout clean up test_assignable_versions of unit issue test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10654 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-13 11:20:31 +00:00
Toshi MARUYAMA
02c770968f code layout clean up test_should_not_be_able_to_assign_a_new_issue_to_a_closed_version of unit issue test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10653 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-13 11:20:06 +00:00
Toshi MARUYAMA
5ae73e3784 code layout clean up test_should_not_close_duplicated_issue of unit issue test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10652 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-13 11:19:39 +00:00
Toshi MARUYAMA
d5abb11c0b code layout clean up test_should_close_duplicates of unit issue test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10651 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-13 11:19:12 +00:00
Toshi MARUYAMA
04ac60d891 code layout clean up test_should_not_call_after_project_change_on_creation of unit issue test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10650 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-13 11:18:45 +00:00
Toshi MARUYAMA
eedad03141 code layout clean up test_read_only_attribute_names_for_multiple_roles_should_intersect_rules of unit issue test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10649 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-13 11:18:16 +00:00
Toshi MARUYAMA
8487a3e0e6 code layout clean up test_required_attribute_names_for_multiple_roles_should_intersect_rules of unit issue test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10648 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-13 11:17:43 +00:00
Toshi MARUYAMA
a1b82c7650 code layout clean up test_should_be_able_to_assign_a_new_issue_to_an_open_version of unit issue test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10647 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-13 10:55:49 +00:00
Toshi MARUYAMA
93daf6865e code layout clean up test_required_attributes_should_be_validated of unit issue test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10646 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-13 10:55:09 +00:00
Toshi MARUYAMA
0df2c4a975 code layout clean up test_safe_attributes_should_accept_target_status_writable_fields of unit issue test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10645 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-13 10:54:27 +00:00
Toshi MARUYAMA
0cf44b976f code layout clean up test_new_statuses_allowed_to_should_return_all_transitions_for_admin of unit issue test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10644 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-13 10:53:44 +00:00
Toshi MARUYAMA
f76de605a0 code layout clean up test_new_statuses_allowed_to of unit issue test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10643 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-13 10:53:05 +00:00
Toshi MARUYAMA
7a162b7255 code layout clean up test_safe_attributes_should_accept_target_tracker_writable_fields of unit issue test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10642 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-13 10:52:31 +00:00
Toshi MARUYAMA
9da555fcb7 code layout clean up test_editable_custom_field_values_should_return_non_readonly_custom_values of unit issue test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10641 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-13 10:51:57 +00:00
Toshi MARUYAMA
ed9f954c6c code layout clean up test_safe_attributes_should_not_include_readonly_custom_fields of unit issue test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10640 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-13 10:51:21 +00:00
Toshi MARUYAMA
0f6be546b8 code layout clean up test_safe_attributes_should_not_include_readonly_fields of unit issue test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10639 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-13 10:50:49 +00:00
Toshi MARUYAMA
a66a50eda2 code layout clean up test_should_not_update_custom_fields_on_changing_tracker_with_different_custom_fields of unit issue test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10638 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-13 10:50:19 +00:00
Jean-Philippe Lang
69f863b3c8 Tests cleanup, use #assert_select instead of #assert_tag.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10637 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-13 10:24:17 +00:00
Toshi MARUYAMA
db67eff913 code layout clean up test_journalized_multi_custom_field of unit issue test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10636 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-13 10:15:59 +00:00
Toshi MARUYAMA
756adebb96 code layout clean up context "#assignable_users" of unit issue test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10635 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-13 10:15:34 +00:00
Toshi MARUYAMA
0bcc6115c3 code layout clean up context "#behind_schedule?" of unit issue test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10634 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-13 10:15:08 +00:00
Toshi MARUYAMA
be79553f33 code layout clean up test_overdue of unit issue test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10633 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-13 10:14:42 +00:00
Toshi MARUYAMA
dd887891f7 code layout clean up test_rescheduling_an_issue_should_reschedule_following_issue of unit issue test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10632 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-13 10:14:16 +00:00
Jean-Philippe Lang
55dbd8886f Tests cleanup, use #assert_select instead of #assert_tag.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10631 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-13 09:54:31 +00:00
Toshi MARUYAMA
5d9bdf888a Traditional Chinese translation updated by ChunChang Lo (#12091)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10630 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-13 09:40:07 +00:00
Jean-Philippe Lang
43da05f3cb Set proper locale.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10629 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-13 08:22:49 +00:00
Jean-Philippe Lang
6c3e38c4c0 Tests cleanup.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10628 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-13 08:21:18 +00:00
Jean-Philippe Lang
a88782bdec Tests cleanup.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10627 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-13 08:14:53 +00:00
Jean-Philippe Lang
31ee1d22eb Test moved to tests with transactional fixtures disabled.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10626 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-13 08:03:19 +00:00
Jean-Philippe Lang
9af6141c91 Reverts r10623 for clarity, this test does not need the default language to be forced to "en".
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10625 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-13 07:56:45 +00:00
Jean-Philippe Lang
8a6ce3a646 Make sure that custom field format cannot be changed.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10624 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-13 07:40:07 +00:00
Toshi MARUYAMA
e04bd297e0 set language en at test_put_update_with_spent_time_and_failure_should_not_add_spent_time at functional issues controller test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10623 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-12 23:23:32 +00:00
Toshi MARUYAMA
3bda16f825 remove trailing white-spaces from app/controllers/issue_categories_controller.rb
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10622 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-12 22:57:15 +00:00
Jean-Philippe Lang
7b5d15eca8 Test that spent time should not be added when issue update fails (#11283).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10621 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-12 21:30:12 +00:00
Jean-Philippe Lang
ad94777d9c Expose roles details via REST API (#11502).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10620 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-12 17:22:52 +00:00
Toshi MARUYAMA
90e0d681dc code layout cleanup test/unit/issue_test.rb
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10619 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-12 14:33:22 +00:00
Toshi MARUYAMA
924e5ad61b set language en at test_create_with_invalid_parent_issue_id of unit issue test (#11979)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10618 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-12 14:32:55 +00:00
Toshi MARUYAMA
b537a2f1de add test of parent issue id beginning sharp to unit issue test (#11979)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10617 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-12 14:32:24 +00:00
Jean-Philippe Lang
7af1504672 Fixed that Redmine::VERSION.revision returns nil with svn 1.7 (#12012).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10616 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-12 14:09:58 +00:00
Jean-Philippe Lang
2b797fa82f Fixed: No validation errors when entering an invalid "Parent task" (#11979).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10615 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-12 13:40:41 +00:00
Jean-Philippe Lang
8358dc1cc5 Fixed that User#allowed_to? should return true or false (#12078).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10614 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-12 09:12:03 +00:00
Jean-Philippe Lang
92391abd1e Removed issue_create! helper in favour of Issue.generate!
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10613 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-12 09:02:25 +00:00
Jean-Philippe Lang
51818cbbb6 Makes Issue.generate_with_descendants! helper accept attributes only.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10612 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-12 08:56:09 +00:00
Jean-Philippe Lang
8bde60dc56 Remove Issue.generate_for_project! test helper and use Issue.generate! instead.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10611 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-12 08:39:22 +00:00
Jean-Philippe Lang
d8f039f489 Isolate the test that actually require non transactional fixtures.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10610 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-11 19:07:08 +00:00
Jean-Philippe Lang
3e706adddd Preserve username when authentification failed (#11846).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10609 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-11 17:17:30 +00:00
Jean-Philippe Lang
5344a35f72 Adds an optional X-Redmine-Switch-User header to let admin users swicth user in API calls (#11755).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10608 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-11 17:07:24 +00:00
Toshi MARUYAMA
2ac9f7d6ac remove empty line and add newline at end of test/fixtures/wikis.yml
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10607 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-11 04:30:29 +00:00
Toshi MARUYAMA
f9b073f9d0 remove empty line and add newline at end of test/fixtures/watchers.yml
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10606 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-11 04:30:15 +00:00
Toshi MARUYAMA
ee3ef85157 remove empty line and add newline at end of test/fixtures/issue_categories.yml
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10605 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-11 04:30:00 +00:00
Toshi MARUYAMA
3ba648e2dc remove empty line and add newline at end of test/fixtures/groups_users.yml
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10604 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-11 04:29:45 +00:00
Toshi MARUYAMA
fd79c1b5b4 remove empty line and add newline at end of test/fixtures/comments.yml
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10603 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-11 04:29:30 +00:00
Toshi MARUYAMA
3a683c8ef3 remove empty line and add newline at end of test/fixtures/changesets.yml
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10602 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-11 04:29:14 +00:00
Toshi MARUYAMA
2f555a3183 remove empty line and add newline at end of test/fixtures/changes.yml
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10599 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-11 03:37:32 +00:00
Toshi MARUYAMA
da85ca221a Japanese translation updated by Go MAEDA (#12067)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10598 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-11 03:36:59 +00:00
Toshi MARUYAMA
54f7fe5bd3 Japanese translation improvement by Go MAEDA (#12061)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10597 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-11 03:36:24 +00:00
Toshi MARUYAMA
f683f956bb German translation updated by Raphael Kallensee (#9732)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10596 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-11 02:49:11 +00:00
Toshi MARUYAMA
667ad23f9c add newline at end of test/fixtures/user_preferences.yml
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10595 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-11 01:15:31 +00:00
Toshi MARUYAMA
578d15ed00 add newline at end of test/fixtures/documents.yml
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10594 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-11 01:15:17 +00:00
Toshi MARUYAMA
70d75ad222 remove empty line from end of test/fixtures/issue_relations.yml
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10593 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-11 01:15:02 +00:00
Toshi MARUYAMA
9a3ab9c704 Bulgarian translation updated by Ivan Cenov (#12064)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10592 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-10 23:57:41 +00:00
Toshi MARUYAMA
00100a15eb remove empty line and add newline at end of test/fixtures/projects.yml
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10591 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-10 23:57:14 +00:00
Toshi MARUYAMA
6c692d9715 remove empty line and add newline at end of test/fixtures/projects_trackers.yml
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10590 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-10 23:56:38 +00:00
Jean-Philippe Lang
b15bd840ec Filling locales (#5487).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10589 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-10 17:43:10 +00:00
Jean-Philippe Lang
d0e090eff9 Filling locales (#5487).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10588 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-10 17:38:52 +00:00
Jean-Philippe Lang
83bcc1f043 Adds a setting to allow subtasks to belong to other projects (#5487).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10587 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-10 17:38:17 +00:00
Jean-Philippe Lang
b0013d9f68 Do not show parents/subtasks subjects that are not visible.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10586 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-09 21:30:40 +00:00
Jean-Philippe Lang
5a02dcf0a9 Fixed that issue notes preview is broken by r10547 (#1554).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10585 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-09 19:11:49 +00:00
Jean-Philippe Lang
c4e040fa88 Filling locales (#11862).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10584 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-09 17:41:03 +00:00
Jean-Philippe Lang
3a178a42cf Add "last 2 weeks" preset to time entries reporting (#11862).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10583 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-09 17:40:00 +00:00
Jean-Philippe Lang
340b4a30d0 Removed invalid/duplicate test.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10582 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-09 17:38:46 +00:00
Jean-Philippe Lang
7263862ce3 Cleanup (#12050).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10581 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-09 17:03:40 +00:00
Jean-Philippe Lang
7626b21a1e Fixed that export: links are broken (#12050).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10580 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-09 17:02:22 +00:00
Toshi MARUYAMA
16befaf2e9 Traditional Chinese translation updated by ChunChang Lo (#12042)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10575 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-09 11:03:45 +00:00
Toshi MARUYAMA
92f9280352 code layout cleanup test/integration/api_test/issues_test.rb
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10574 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-09 11:03:20 +00:00
Toshi MARUYAMA
178f64950f code layout cleanup test/unit/issue_relation_test.rb
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10573 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-09 11:02:56 +00:00
Toshi MARUYAMA
727aad50b7 add missing fixtures to test/unit/issue_relation_test.rb
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10572 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-09 10:41:16 +00:00
Toshi MARUYAMA
3599cb15a2 add missing fixture to test/integration/api_test/issues_test.rb
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10571 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-09 10:14:14 +00:00
Jean-Philippe Lang
fa237901b0 Adjusts test for r10569.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10570 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-07 13:47:22 +00:00
Jean-Philippe Lang
6f13f2b842 Restyles the issue counts.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10569 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-07 13:42:40 +00:00
Toshi MARUYAMA
f26662f31f Bulgarian translation updated by Ivan Cenov (#12034)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10568 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-06 16:20:34 +00:00
Toshi MARUYAMA
4df979fdc2 fix incorrect Spanish "September" month name (#12027)
Contributed by Bruno Orcha García.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10567 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-05 12:36:10 +00:00
Toshi MARUYAMA
6d6f42c6a9 remove trailing white-spaces from app/controllers/application_controller.rb
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10566 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-05 00:30:52 +00:00
Toshi MARUYAMA
615f8957c5 Russian translation for trunk updated (#12021)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10564 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-04 23:30:44 +00:00
Toshi MARUYAMA
e6596dbc43 Russian translation for 2.1-stable updated (#12021)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10563 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-04 23:08:09 +00:00
Jean-Philippe Lang
9d8c0f9a63 Adds label_any string for filters.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10562 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-04 18:50:43 +00:00
Jean-Philippe Lang
5411f93a9a Passing the format in the template name is deprecated.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10561 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-04 18:15:05 +00:00
Jean-Philippe Lang
cbe8226759 Filling locales (#3265).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10560 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-04 18:11:15 +00:00
Jean-Philippe Lang
b9d7c22297 Adds no_issue_in_project operator for relations filter (#3265).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10559 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-04 18:10:41 +00:00
Toshi MARUYAMA
44137cb1d4 Bulgarian translation updated by Ivan Cenov (#12020)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10558 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-04 12:48:44 +00:00
Toshi MARUYAMA
1503c6cce7 Traditional Chinese translation updated by ChunChang Lo (#12019)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10557 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-04 09:39:11 +00:00
Toshi MARUYAMA
8162d86192 Japanese translation updated by Go MAEDA (#12017)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10556 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-04 04:49:14 +00:00
Toshi MARUYAMA
88e1587b08 sort custom field issue filter by type and position (#12018)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10555 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-04 04:48:48 +00:00
Toshi MARUYAMA
fb4210b6d9 move CustomFieldsHelper tabs variable to model constant for common use (#12018)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10554 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-04 04:48:20 +00:00
Toshi MARUYAMA
65a045e207 svn propset svn:eol-style native test/unit/helpers/queries_helper_test.rb (#12018)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10553 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-04 04:18:37 +00:00
Toshi MARUYAMA
7c0c699f95 change "is_private" issue filter order from 15 to 16 (#12018)
Order 15 is duplicate with "watcher_id" filter.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10552 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-04 04:09:41 +00:00
Toshi MARUYAMA
eaf46c5512 change "status" issue filter order from 1 to 0 (#12018)
Order 1 is duplicate with "project" filter.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10551 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-04 04:09:14 +00:00
Toshi MARUYAMA
b571c3dbc9 split QueriesHelper filters_options_for_select method and add new unit test (#12018)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10550 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-04 04:08:38 +00:00
Toshi MARUYAMA
5ddd6e7d1f insert position field to custom_fields fixture (#12018)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10549 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-04 03:44:47 +00:00
Toshi MARUYAMA
0e87672c49 update locale files (#1554)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10548 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-03 23:21:29 +00:00
Jean-Philippe Lang
0178b5a2fe Private issue notes (#1554).
Adds 2 new permissions for viewing/adding private comments to issues.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10547 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-03 21:36:19 +00:00
Toshi MARUYAMA
bb1563f23f fix integration hook test name
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10546 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-02 22:30:44 +00:00
Toshi MARUYAMA
1d4c8abe96 code layout cleanup Query available_filters method
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10545 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-02 10:29:18 +00:00
Toshi MARUYAMA
ef988ba17c code cleanup r10542 changes (#10937)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10544 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-01 07:19:11 +00:00
Toshi MARUYAMA
a29854707b add new user format "lastname" (#10937)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10543 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-01 07:08:04 +00:00
Toshi MARUYAMA
de0e0f09a3 pin user format order at setting panel (#10937)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10542 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-01 07:07:49 +00:00
Toshi MARUYAMA
5f794b5af5 fix replacing shoulda test name at r10540
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10541 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-01 07:07:35 +00:00
Toshi MARUYAMA
df44af819c replace "User#before_create" and "User.login" shoulda contexts at unit user test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10540 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-01 06:41:18 +00:00
Toshi MARUYAMA
b04f44f944 fix 'object_daddy creation' test name at unit user test
Redmine dropped object_daddy at r9469 for Rails3 porting.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10539 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-10-01 06:41:04 +00:00
Jean-Philippe Lang
b49abf0c22 Updates for 2.1.2 release.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10535 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-30 10:42:28 +00:00
Jean-Philippe Lang
757073edef Updates for 2.1.1 release.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10531 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-30 08:06:41 +00:00
Toshi MARUYAMA
ecdd77c582 Japanese translation updated by Go MAEDA (#11995)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10530 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-30 06:04:51 +00:00
Toshi MARUYAMA
ba2330d0a0 Bulgarian translation updated by Ivan Cenov (#11994)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10529 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-29 22:49:17 +00:00
Jean-Philippe Lang
8cf8f5bdbf Fixed that autocomplete results are not reset after clearing search field (#11909).
Contributed by Jongwook Choi.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10527 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-29 16:43:11 +00:00
Jean-Philippe Lang
81782f2408 Call sort for array with more than one element only.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10519 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-29 15:28:26 +00:00
Jean-Philippe Lang
99662fa18e Test failure.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10518 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-29 15:26:52 +00:00
Jean-Philippe Lang
61248d1dbc Test failure.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10517 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-29 15:19:34 +00:00
Etienne Massip
d60b8c927c Japanese translation updated (#11992).
Contributed by Go MAEDA.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10516 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-29 14:35:57 +00:00
Jean-Philippe Lang
1d7f5e34c5 Filling locales (#3239, #3265).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10515 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-29 13:03:33 +00:00
Jean-Philippe Lang
c292971390 Display visible relations in API response.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10514 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-29 13:01:09 +00:00
Jean-Philippe Lang
1b6da80e16 Makes related issues available for display and filtering on the issue list (#3239, #3265).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10513 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-29 12:57:38 +00:00
Toshi MARUYAMA
69b8931e92 add functional test of sub repository diff path (#11966)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10503 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-28 03:43:51 +00:00
Toshi MARUYAMA
69a3941ac8 add functional test of main repository diff path (#11966)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10502 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-28 03:43:25 +00:00
Toshi MARUYAMA
086478c5a6 set user preference diff type nil at functional tests
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10501 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-28 02:02:30 +00:00
Toshi MARUYAMA
1efd303b4a scm: git: use with_settings instead of assigned setting at functional test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10498 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-27 23:16:56 +00:00
Toshi MARUYAMA
b6be866151 Bulgarian translation updated by Ivan Cenov (#11974)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10497 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-27 22:55:36 +00:00
Jean-Philippe Lang
3e7bb3c632 Missing fixtures.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10496 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-27 22:30:10 +00:00
Jean-Philippe Lang
f1fdbf8d80 Do not link copied issues when copying a project (#6899).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10495 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-27 22:27:37 +00:00
Jean-Philippe Lang
f58ed6c206 Fixed that issue author is assigned with current user when the edit form is updated (#11975).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10494 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-27 22:12:11 +00:00
Jean-Philippe Lang
d255f7f5b0 Don't display the dropdown if no transition is allowed.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10493 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-27 22:03:38 +00:00
Jean-Philippe Lang
c6ea8fbf21 Filling locales (#6899).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10492 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-27 19:10:04 +00:00
Jean-Philippe Lang
cc4cff9f11 Adds a "Copied from/to" relation when copying issue(s) (#6899).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10491 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-27 19:09:30 +00:00
Toshi MARUYAMA
c3e055bd70 explicitly define route at scm diff view (#11966)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10490 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-27 16:05:33 +00:00
Toshi MARUYAMA
fe832071d4 fix broken issue list filter (#11885)
Array indexOf() is not defined on IE8.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10487 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-27 05:42:10 +00:00
Toshi MARUYAMA
9c3543ac3f fix javascript syntax mistake in application.js (#11885)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10486 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-27 05:41:52 +00:00
Toshi MARUYAMA
7690aff8bd remove empty setup method from test/unit/changeset_test.rb
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10480 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-26 11:17:53 +00:00
Toshi MARUYAMA
455738cbe9 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/trunk@10478 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-26 10:54:47 +00:00
Toshi MARUYAMA
cf52a6ccb4 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/trunk@10477 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-26 10:54:30 +00:00
Toshi MARUYAMA
c91ce512a9 fix number_to_currency() raises exception on Rails3 bs and de locale (#11922)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10476 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-26 08:45:39 +00:00
Toshi MARUYAMA
b7c71fe427 add more error message if public/plugin_assets cannot be created (#11945)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10472 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-26 04:11:14 +00:00
Toshi MARUYAMA
29292a3faf fix "can't convert Errno::EACCES into String" in case of no permission of public/plugin_assets on Ruby 1.9.3 (#11945)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10471 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-26 04:11:00 +00:00
Toshi MARUYAMA
d1d8640822 code layout cleanup app/views/issues/_list.html.erb
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10470 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-25 23:32:39 +00:00
Toshi MARUYAMA
49c2f316c2 remove trailing white-spaces from app/models/query.rb
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10469 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-25 23:32:15 +00:00
Toshi MARUYAMA
95fe4d61c9 replace tab to space at app/models/query.rb
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10468 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-25 23:31:49 +00:00
Jean-Philippe Lang
917a89fbf7 Fixed JSON escaping of filters (#11929).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10465 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-25 18:23:11 +00:00
Jean-Philippe Lang
18d1c62ca8 Use eager loaded #principal association instead of #user (#11904).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10442 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-22 10:12:59 +00:00
Jean-Philippe Lang
5ce2f4f81c Use eager loaded #principal association instead of #user (#11904).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10441 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-22 09:48:38 +00:00
Jean-Philippe Lang
7c8ac2eecc Avoid to run one SQL query per member on Project#assignable_users (#11904).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10440 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-22 09:33:30 +00:00
Jean-Philippe Lang
3bde603029 ParseDate missing in Ruby 1.9x (#11290).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10439 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-22 07:46:52 +00:00
Jean-Philippe Lang
838025372d Potential can't dup NilClass error in UserPreference (#11905).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10438 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-22 06:16:53 +00:00
Jean-Philippe Lang
5328c4adcb Anonymous users should always see public issues only (#11872).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10437 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-20 19:26:58 +00:00
Jean-Philippe Lang
30b3e796ff New relation form Cancel link is broken with Chrome 21 (#11036).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10436 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-20 16:59:37 +00:00
Toshi MARUYAMA
c1b71e84c6 Traditional Chinese translation updated by ChunChang Lo (#11897)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10434 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-20 10:48:47 +00:00
Jean-Philippe Lang
59d8ae61ef Anonymous users should not see private issues with anonymous author (#11872).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10433 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-19 21:48:33 +00:00
Jean-Philippe Lang
fa2fe3e1e8 Slight changes to diff/file/annotate styles.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10432 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-19 18:32:34 +00:00
Toshi MARUYAMA
cb01d87ddd set svn:eol-style native to test/fixtures/files/hg-export.diff (#11868)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10431 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-19 03:08:07 +00:00
Toshi MARUYAMA
37351ddecc remove empty setup method from test/unit/lib/redmine/unified_diff_test.rb
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10430 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-19 03:02:17 +00:00
Toshi MARUYAMA
551c024b45 add functional attachment test of mercurial export file (#11868)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10429 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-19 03:02:03 +00:00
Toshi MARUYAMA
f18edc4e1c use git diff format for all diff (#11868)
Mercurial diff uses git format.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10428 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-19 02:29:11 +00:00
Toshi MARUYAMA
0af04b8ae0 use radio buttons instead of a select at attachment as same as r10426 repository
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10427 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-18 23:48:52 +00:00
Jean-Philippe Lang
3586e44c1d Use radio buttons instead of a select.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10426 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-18 20:51:31 +00:00
Jean-Philippe Lang
d277d14432 Remove trailing (revision nn) from filenames in subversion diffs.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10425 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-18 19:44:08 +00:00
Jean-Philippe Lang
12de6a177a Fixed that git diff displays deleted files as /dev/null (#11868).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10424 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-18 19:32:58 +00:00
Toshi MARUYAMA
74f7fc38f0 scm: bazaar: add more comment to non ASCII path tests at unit model test (#11834)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10423 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-18 10:10:55 +00:00
Toshi MARUYAMA
1f58b94bd8 scm: bazaar: do not call super initialize method at adapter (#11834)
On Bazaar 2.0.5, in case of using non ASCII *repository* path,
following trace raise on all operation.

<pre>
Traceback (most recent call last):
  File "/usr/bin/bzr", line 142, in <module>
    exit_val = bzrlib.commands.main()
  File "/usr/lib/python2.6/site-packages/bzrlib/commands.py", line 1102, in main
    argv = osutils.get_unicode_argv()
  File "/usr/lib/python2.6/site-packages/bzrlib/osutils.py", line 90, in get_unicode_argv
    "encoding." % a))
bzrlib.errors.BzrError:
 Parameter ''/somewhere/\xe3\x83\x90\xe3\x82\xb6\xe3\x83\xbc/non_ascii/''
 is unsupported by the current encoding.
</pre>

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10422 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-18 10:10:29 +00:00
Toshi MARUYAMA
1fcd3d956f scm: bazaar: add non ASCII path test to unit model test (#11834)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10421 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-18 09:30:35 +00:00
Toshi MARUYAMA
f9208d7c5c scm: bazaar: use log encoding as path encoding (#11834)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10420 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-18 09:30:11 +00:00
Toshi MARUYAMA
cbe28d75d0 fix deprecation warning of the format in the template name
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10419 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-18 03:15:00 +00:00
Toshi MARUYAMA
a701bd5fbd scm: bazaar: convert path encoding from @path_encoding to UTF-8 at adapter entries method (#11834)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10418 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-17 23:46:53 +00:00
Toshi MARUYAMA
a3ae06921d scm: bazaar: convert path encoding from @path_encoding to UTF-8 at adapter revisions method (#11834)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10417 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-17 23:46:27 +00:00
Toshi MARUYAMA
a6368733ad scm: bazaar: convert command line character encoding to @path_encoding (#11834)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10416 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-17 23:45:59 +00:00
Toshi MARUYAMA
f230ffbd54 scm: bazaar: add @path_encoding instance value and set it UTF-8 at adapter initialize method (#11834)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10415 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-17 23:45:31 +00:00
Toshi MARUYAMA
51e6c7589e scm: bazaar: update test repository (#11834)
Add new "non_ascii" branch.
It was created by "bzr branch --no-tree branch00 non_ascii".
It is equivalent to Git bare repository and Mercurial "hg update null".
It has non ASCII path name files and directory.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10414 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-17 22:49:31 +00:00
Jean-Philippe Lang
581058f663 Fixed: load_default_data task fails to print the error message if one occurs (#11844).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10413 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-17 18:38:54 +00:00
Jean-Philippe Lang
187d5db6b4 Fixed #onthefly_creation_failed broken by r9940 (#11850).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10412 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-17 18:31:20 +00:00
Toshi MARUYAMA
01e2472c92 scm: bazaar: add entry test to unit lib test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10411 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-17 10:41:59 +00:00
Toshi MARUYAMA
2da70de1a7 scm: git: add entry test to unit lib test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10410 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-17 10:41:33 +00:00
Toshi MARUYAMA
dd89ce4594 scm: bazaar: code layout cleanup adapter revisions method
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10409 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-17 07:58:31 +00:00
Toshi MARUYAMA
55748b6fc0 scm: bazaar: add revisions test to unit lib test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10408 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-17 07:58:05 +00:00
Jean-Philippe Lang
e05e9179fd Added a test for JSON upload.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10407 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-16 19:14:44 +00:00
Jean-Philippe Lang
f825167003 Removed test contexts.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10406 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-16 19:11:59 +00:00
Jean-Philippe Lang
57c38a33e5 Adds assertions on the confirmation form.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10405 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-16 15:39:11 +00:00
Jean-Philippe Lang
b81a578eb6 Adjust tests for new fixture.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10404 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-16 15:36:05 +00:00
Jean-Philippe Lang
8593e34722 Adds missing WikiContent fixture.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10403 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-16 15:31:59 +00:00
Jean-Philippe Lang
34b64d646f Updates macro description (#10789).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10402 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-16 15:27:21 +00:00
Jean-Philippe Lang
747e4ecd3a Adds a "depth" option to the child_pages macro (#10789).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10401 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-16 15:24:35 +00:00
Jean-Philippe Lang
ca4f2c59b6 Attachments should be available to the text formatter when previewing an existing news.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10400 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-16 14:18:43 +00:00
Toshi MARUYAMA
2058c66d73 scm: bazaar: remove unused scm.revisions ":with_paths => true" option from fetch_changesets method
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10399 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-16 14:15:07 +00:00
Toshi MARUYAMA
53e2eb1867 scm: bazaar: add asserting entries root path at unit model test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10398 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-16 14:14:52 +00:00
Jean-Philippe Lang
a81da3491e Do not consider that versions that are due today are completed.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10397 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-16 14:09:41 +00:00
Jean-Philippe Lang
ff0989a702 Accept float in inline styles.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10396 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-16 13:54:04 +00:00
Jean-Philippe Lang
49d93a5cab Updates for 2.0.4 and 2.1.0 releases.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10391 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-16 12:42:48 +00:00
Toshi MARUYAMA
17db2dca3d scm: mercurial: add test of diff from new to old revision to unit lib test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10390 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-16 08:51:19 +00:00
Toshi MARUYAMA
3cd15102c6 scm: bazaar: add diff test to unit lib test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10389 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-16 08:50:55 +00:00
Toshi MARUYAMA
dd5844b86c scm: bazaar: separate constant repository path to repository and trunk branch at unit model test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10388 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-16 06:13:23 +00:00
Toshi MARUYAMA
ee0fc2e1d5 scm: bazaar: do not use file:// for repository path at unit app test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10387 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-16 04:12:42 +00:00
Toshi MARUYAMA
4a7e148aff scm: bazaar: add asserting entries subdirectory path at unit app test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10386 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-16 00:22:25 +00:00
Toshi MARUYAMA
c2b12d853f scm: git: remove unnecessary encoding header from unit adapter test
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10385 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-15 15:42:14 +00:00
Toshi MARUYAMA
67cdaabe6f scm: git: change test author encoding in unit adapter test to ASCII-8BIT
Author encoding in adapter is ASCII-8BIT.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10384 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-15 15:41:47 +00:00
Toshi MARUYAMA
72af2730ff remove unused "require 'redmine/codeset_util'" from RepositoriesHelper
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10383 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-15 15:40:58 +00:00
Toshi MARUYAMA
5441f8de4d remove redundant empty lines from RepositoriesHelper
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10382 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-15 15:08:28 +00:00
Toshi MARUYAMA
e659aff468 remove unused "require 'iconv'" from RepositoriesHelper
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10381 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-15 15:07:29 +00:00
Toshi MARUYAMA
2566aef8ab Japanese translation updated by Go MAEDA (#11836)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10379 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-15 11:13:52 +00:00
Toshi MARUYAMA
c70bc540dd add copyright statement to test/unit/lib/redmine/scm/adapters/*.rb
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10378 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-14 21:40:45 +00:00
Etienne Massip
597fbf0e04 Fixed comment.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10377 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-12 21:30:30 +00:00
Jean-Philippe Lang
338d81d6e3 Redmine.pm fails when permissions are NULL (#11818).
Contributed by John Yani.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10375 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-12 19:13:05 +00:00
Jean-Philippe Lang
40302566a8 Code cleanup (#11814).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10373 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-11 17:26:42 +00:00
Jean-Philippe Lang
6d0aed1f44 Set the first day of week in the date picker according to settings (#11814).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10372 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-11 17:15:54 +00:00
Jean-Philippe Lang
a3d0e82552 Use javascript_tag.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10371 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-11 17:01:45 +00:00
Jean-Philippe Lang
818f3564fa Moved the javascript includes in html head.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10370 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-11 16:59:30 +00:00
Jean-Philippe Lang
745c5d053e Revision graph sometimes broken (#11612).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10369 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-11 16:55:32 +00:00
Jean-Philippe Lang
049aa3971d Upgraded raphael.js to 2.1.0 (#10419).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10368 e93f8b46-1217-0410-a6f0-8f06a7374b81
2012-09-11 16:48:57 +00:00
293 changed files with 9956 additions and 5349 deletions

1
.gitignore vendored
View File

@@ -23,6 +23,7 @@
/tmp/sessions/*
/tmp/sockets/*
/tmp/test/*
/tmp/thumbnails/*
/vendor/cache
/vendor/rails
*.rbc

View File

@@ -25,6 +25,7 @@ tmp/pdf/*
tmp/sessions/*
tmp/sockets/*
tmp/test/*
tmp/thumbnails/*
vendor/cache
vendor/rails
*.rbc

11
Gemfile
View File

@@ -1,6 +1,6 @@
source 'http://rubygems.org'
gem 'rails', '3.2.8'
gem "rails", "3.2.13"
gem "jquery-rails", "~> 2.0.2"
gem "i18n", "~> 0.6.0"
gem "coderay", "~> 1.0.6"
@@ -74,9 +74,12 @@ end
group :test do
gem "shoulda", "~> 2.11"
# Shoulda does not work nice on Ruby 1.9.3 and seems to need test-unit explicitely.
gem "test-unit", :platforms => [:mri_19]
gem "mocha", "0.12.3"
# Shoulda does not work nice on Ruby 1.9.3 and JRuby 1.7.
# It seems to need test-unit explicitely.
platforms = [:mri_19]
platforms << :jruby if defined?(JRUBY_VERSION) && JRUBY_VERSION >= "1.7"
gem "test-unit", :platforms => platforms
gem "mocha", "~> 0.13.3"
end
local_gemfile = File.join(File.dirname(__FILE__), "Gemfile.local")

View File

@@ -22,7 +22,7 @@ class Unauthorized < Exception; end
class ApplicationController < ActionController::Base
include Redmine::I18n
class_attribute :accept_api_auth_actions
class_attribute :accept_rss_auth_actions
class_attribute :model_object
@@ -90,7 +90,7 @@ class ApplicationController < ActionController::Base
def find_current_user
user = nil
unless api_request?
if session[:user_id]
if session[:user_id]
# existing session
user = (User.active.find(session[:user_id]) rescue nil)
elsif autologin_user = try_to_autologin
@@ -110,6 +110,16 @@ class ApplicationController < ActionController::Base
user = User.try_to_login(username, password) || User.find_by_api_key(username)
end
end
# Switch user if requested by an admin user
if user && user.admin? && (username = api_switch_user_from_request)
su = User.find_by_login(username)
if su && su.active?
logger.info(" User switched by: #{user.login} (id=#{user.id})") if logger
user = su
else
render_error :message => 'Invalid X-Redmine-Switch-User header', :status => 412
end
end
end
user
end
@@ -266,14 +276,24 @@ class ApplicationController < ActionController::Base
self.model_object = model
end
# Filter for bulk issue operations
# Find the issue whose id is the :id parameter
# Raises a Unauthorized exception if the issue is not visible
def find_issue
# Issue.visible.find(...) can not be used to redirect user to the login form
# if the issue actually exists but requires authentication
@issue = Issue.find(params[:id])
raise Unauthorized unless @issue.visible?
@project = @issue.project
rescue ActiveRecord::RecordNotFound
render_404
end
# Find issues with a single :id param or :ids array param
# Raises a Unauthorized exception if one of the issues is not visible
def find_issues
@issues = Issue.find_all_by_id(params[:id] || params[:ids])
raise ActiveRecord::RecordNotFound if @issues.empty?
if @issues.detect {|issue| !issue.visible?}
deny_access
return
end
raise Unauthorized unless @issues.all?(&:visible?)
@projects = @issues.collect(&:project).compact.uniq
@project = @projects.first if @projects.size == 1
rescue ActiveRecord::RecordNotFound
@@ -402,7 +422,7 @@ class ApplicationController < ActionController::Base
@items.sort! {|x,y| y.event_datetime <=> x.event_datetime }
@items = @items.slice(0, Setting.feeds_limit.to_i)
@title = options[:title] || Setting.app_title
render :template => "common/feed.atom", :layout => false,
render :template => "common/feed", :formats => [:atom], :layout => false,
:content_type => 'application/atom+xml'
end
@@ -508,6 +528,11 @@ class ApplicationController < ActionController::Base
end
end
# Returns the API 'switch user' value if present
def api_switch_user_from_request
request.headers["X-Redmine-Switch-User"].to_s.presence
end
# Renders a warning flash if obj has unsaved attachments
def render_attachment_warning_if_needed(obj)
flash[:warning] = l(:warning_attachments_not_saved, obj.unsaved_attachments.size) if obj.unsaved_attachments.present?
@@ -538,8 +563,13 @@ class ApplicationController < ActionController::Base
# Renders a 200 response for successfull updates or deletions via the API
def render_api_ok
# head :ok would return a response body with one space
render :text => '', :status => :ok, :layout => nil
render_api_head :ok
end
# Renders a head API response
def render_api_head(status)
# #head would return a response body with one space
render :text => '', :status => status, :layout => nil
end
# Renders API response on validation failure

View File

@@ -84,7 +84,7 @@ class AttachmentsController < ApplicationController
@attachment = Attachment.new(:file => request.raw_post)
@attachment.author = User.current
@attachment.filename = Redmine::Utils.random_hex(16)
@attachment.filename = params[:filename].presence || Redmine::Utils.random_hex(16)
if @attachment.save
respond_to do |format|

View File

@@ -39,14 +39,18 @@ class BoardsController < ApplicationController
sort_init 'updated_on', 'desc'
sort_update 'created_on' => "#{Message.table_name}.created_on",
'replies' => "#{Message.table_name}.replies_count",
'updated_on' => "#{Message.table_name}.updated_on"
'updated_on' => "COALESCE(last_replies_messages.created_on, #{Message.table_name}.created_on)"
@topic_count = @board.topics.count
@topic_pages = Paginator.new self, @topic_count, per_page_option, params['page']
@topics = @board.topics.reorder("#{Message.table_name}.sticky DESC").order(sort_clause).all(
:include => [:author, {:last_reply => :author}],
:limit => @topic_pages.items_per_page,
:offset => @topic_pages.current.offset)
@topics = @board.topics.
reorder("#{Message.table_name}.sticky DESC").
includes(:last_reply).
limit(@topic_pages.items_per_page).
offset(@topic_pages.current.offset).
order(sort_clause).
preload(:author, {:last_reply => :author}).
all
@message = Message.new(:board => @board)
render :action => 'show', :layout => !request.xhr?
}

View File

@@ -18,13 +18,26 @@
class EnumerationsController < ApplicationController
layout 'admin'
before_filter :require_admin
before_filter :require_admin, :except => :index
before_filter :require_admin_or_api_request, :only => :index
before_filter :build_new_enumeration, :only => [:new, :create]
before_filter :find_enumeration, :only => [:edit, :update, :destroy]
accept_api_auth :index
helper :custom_fields
def index
respond_to do |format|
format.html
format.api {
@klass = Enumeration.get_subclass(params[:type])
if @klass
@enumerations = @klass.shared.sorted.all
else
render_404
end
}
end
end
def new
@@ -33,7 +46,7 @@ class EnumerationsController < ApplicationController
def create
if request.post? && @enumeration.save
flash[:notice] = l(:notice_successful_create)
redirect_to :action => 'index', :type => @enumeration.type
redirect_to :action => 'index'
else
render :action => 'new'
end
@@ -45,7 +58,7 @@ class EnumerationsController < ApplicationController
def update
if request.put? && @enumeration.update_attributes(params[:enumeration])
flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'index', :type => @enumeration.type
redirect_to :action => 'index'
else
render :action => 'edit'
end

View File

@@ -23,7 +23,7 @@ class IssueCategoriesController < ApplicationController
before_filter :find_project_by_project_id, :only => [:index, :new, :create]
before_filter :authorize
accept_api_auth :index, :show, :create, :update, :destroy
def index
respond_to do |format|
format.html { redirect_to :controller => 'projects', :action => 'settings', :tab => 'categories', :id => @project }
@@ -92,7 +92,7 @@ class IssueCategoriesController < ApplicationController
def destroy
@issue_count = @category.issues.size
if @issue_count == 0 || params[:todo] || api_request?
if @issue_count == 0 || params[:todo] || api_request?
reassign_to = nil
if params[:reassign_to_id] && (params[:todo] == 'reassign' || params[:todo].blank?)
reassign_to = @project.issue_categories.find_by_id(params[:reassign_to_id])

View File

@@ -56,6 +56,7 @@ class IssuesController < ApplicationController
retrieve_query
sort_init(@query.sort_criteria.empty? ? [['id', 'desc']] : @query.sort_criteria)
sort_update(@query.sortable_columns)
@query.sort_criteria = sort_criteria.to_a
if @query.valid?
case params[:format]
@@ -81,7 +82,7 @@ class IssuesController < ApplicationController
respond_to do |format|
format.html { render :template => 'issues/index', :layout => !request.xhr? }
format.api {
Issue.load_relations(@issues) if include_in_api_response?('relations')
Issue.load_visible_relations(@issues) if include_in_api_response?('relations')
}
format.atom { render_feed(@issues, :title => "#{@project || Setting.app_title}: #{l(:label_issue_plural)}") }
format.csv { send_data(issues_to_csv(@issues, @project, @query, params), :type => 'text/csv; header=present', :filename => 'export.csv') }
@@ -99,8 +100,9 @@ class IssuesController < ApplicationController
end
def show
@journals = @issue.journals.find(:all, :include => [:user, :details], :order => "#{Journal.table_name}.created_on ASC")
@journals = @issue.journals.includes(:user, :details).reorder("#{Journal.table_name}.id ASC").all
@journals.each_with_index {|j,i| j.indice = i+1}
@journals.reject!(&:private_notes?) unless User.current.allowed_to?(:view_private_notes, @issue.project)
@journals.reverse! if User.current.wants_comments_in_reverse_order?
@changesets = @issue.changesets.visible.all
@@ -118,7 +120,10 @@ class IssuesController < ApplicationController
}
format.api
format.atom { render :template => 'journals/index', :layout => false, :content_type => 'application/atom+xml' }
format.pdf { send_data(issue_to_pdf(@issue), :type => 'application/pdf', :filename => "#{@project.identifier}-#{@issue.id}.pdf") }
format.pdf {
pdf = issue_to_pdf(@issue, :journals => @journals)
send_data(pdf, :type => 'application/pdf', :filename => "#{@project.identifier}-#{@issue.id}.pdf")
}
end
end
@@ -173,6 +178,7 @@ class IssuesController < ApplicationController
@conflict = true
if params[:last_journal_id]
@conflict_journals = @issue.journals_after(params[:last_journal_id]).all
@conflict_journals.reject!(&:private_notes?) unless User.current.allowed_to?(:view_private_notes, @issue.project)
end
end
@@ -307,19 +313,7 @@ class IssuesController < ApplicationController
end
end
private
def find_issue
# Issue.visible.find(...) can not be used to redirect user to the login form
# if the issue actually exists but requires authentication
@issue = Issue.find(params[:id], :include => [:project, :tracker, :status, :author, :priority, :category])
unless @issue.visible?
deny_access
return
end
@project = @issue.project
rescue ActiveRecord::RecordNotFound
render_404
end
private
def find_project
project_id = params[:project_id] || (params[:issue] && params[:issue][:project_id])
@@ -354,8 +348,7 @@ private
@time_entry = TimeEntry.new(:issue => @issue, :project => @issue.project)
@time_entry.attributes = params[:time_entry]
@notes = params[:notes] || (params[:issue].present? ? params[:issue][:notes] : nil)
@issue.init_journal(User.current, @notes)
@issue.init_journal(User.current)
issue_attributes = params[:issue]
if issue_attributes && params[:conflict_resolution]
@@ -364,7 +357,7 @@ private
issue_attributes = issue_attributes.dup
issue_attributes.delete(:lock_version)
when 'add_notes'
issue_attributes = {}
issue_attributes = issue_attributes.slice(:notes)
when 'cancel'
redirect_to issue_path(@issue)
return false

View File

@@ -57,10 +57,10 @@ class JournalsController < ApplicationController
end
def new
journal = Journal.find(params[:journal_id]) if params[:journal_id]
if journal
user = journal.user
text = journal.notes
@journal = Journal.visible.find(params[:journal_id]) if params[:journal_id]
if @journal
user = @journal.user
text = @journal.notes
else
user = @issue.author
text = @issue.description
@@ -69,6 +69,8 @@ class JournalsController < ApplicationController
text = text.to_s.strip.gsub(%r{<pre>((.|\s)*?)</pre>}m, '[...]')
@content = "#{ll(Setting.default_language, :text_user_wrote, user)}\n> "
@content << text.gsub(/(\r?\n|\r\n?)/, "\n> ") + "\n\n"
rescue ActiveRecord::RecordNotFound
render_404
end
def edit
@@ -95,17 +97,9 @@ class JournalsController < ApplicationController
private
def find_journal
@journal = Journal.find(params[:id])
@journal = Journal.visible.find(params[:id])
@project = @journal.journalized.project
rescue ActiveRecord::RecordNotFound
render_404
end
# TODO: duplicated in IssuesController
def find_issue
@issue = Issue.find(params[:id], :include => [:project, :tracker, :status, :author, :priority, :category])
@project = @issue.project
rescue ActiveRecord::RecordNotFound
render_404
end
end

View File

@@ -123,7 +123,7 @@ class MessagesController < ApplicationController
private
def find_message
find_board
return unless find_board
@message = @board.messages.find(params[:id], :include => :parent)
@topic = @message.root
rescue ActiveRecord::RecordNotFound
@@ -135,5 +135,6 @@ private
@project = @board.project
rescue ActiveRecord::RecordNotFound
render_404
nil
end
end

View File

@@ -147,15 +147,16 @@ class MyController < ApplicationController
# params[:block] : id of the block to add
def add_block
block = params[:block].to_s.underscore
(render :nothing => true; return) unless block && (BLOCKS.keys.include? block)
@user = User.current
layout = @user.pref[:my_page_layout] || {}
# remove if already present in a group
%w(top left right).each {|f| (layout[f] ||= []).delete block }
# add it on top
layout['top'].unshift block
@user.pref[:my_page_layout] = layout
@user.pref.save
if block.present? && BLOCKS.key?(block)
@user = User.current
layout = @user.pref[:my_page_layout] || {}
# remove if already present in a group
%w(top left right).each {|f| (layout[f] ||= []).delete block }
# add it on top
layout['top'].unshift block
@user.pref[:my_page_layout] = layout
@user.pref.save
end
redirect_to :action => 'page_layout'
end

View File

@@ -35,6 +35,10 @@ class PreviewsController < ApplicationController
end
def news
if params[:id].present? && news = News.visible.find_by_id(params[:id])
@previewed = news
@attachments = news.attachments
end
@text = (params[:news] ? params[:news][:description] : nil)
render :partial => 'common/preview'
end

View File

@@ -116,11 +116,7 @@ class ProjectsController < ApplicationController
@source_project = Project.find(params[:id])
if request.get?
@project = Project.copy_from(@source_project)
if @project
@project.identifier = Project.next_identifier if Setting.sequential_project_identifiers?
else
redirect_to :controller => 'admin', :action => 'projects'
end
@project.identifier = Project.next_identifier if Setting.sequential_project_identifiers?
else
Mailer.with_deliveries(params[:notifications] == '1') do
@project = Project.new
@@ -139,7 +135,8 @@ class ProjectsController < ApplicationController
end
end
rescue ActiveRecord::RecordNotFound
redirect_to :controller => 'admin', :action => 'projects'
# source_project not found
render_404
end
# Show @project

View File

@@ -242,7 +242,7 @@ class RepositoriesController < ApplicationController
# DELETE /projects/:project_id/repository/(:repository_id/)revisions/:rev/issues/:issue_id
def remove_related_issue
@issue = Issue.visible.find_by_id(params[:issue_id])
if @issue
if @issue
@changeset.issues.delete(@issue)
end
end

View File

@@ -18,10 +18,10 @@
class RolesController < ApplicationController
layout 'admin'
before_filter :require_admin, :except => :index
before_filter :require_admin_or_api_request, :only => :index
before_filter :find_role, :only => [:edit, :update, :destroy]
accept_api_auth :index
before_filter :require_admin, :except => [:index, :show]
before_filter :require_admin_or_api_request, :only => [:index, :show]
before_filter :find_role, :only => [:show, :edit, :update, :destroy]
accept_api_auth :index, :show
def index
respond_to do |format|
@@ -35,6 +35,12 @@ class RolesController < ApplicationController
end
end
def show
respond_to do |format|
format.api
end
end
def new
# Prefills the form with 'Non member' role permissions by default
@role = Role.new(params[:role] || {:permissions => Role.non_member.permissions})

View File

@@ -39,7 +39,8 @@ class SettingsController < ApplicationController
redirect_to :action => 'edit', :tab => params[:tab]
else
@options = {}
@options[:user_format] = User::USER_FORMATS.keys.collect {|f| [User.current.name(f), f.to_s] }
user_format = User::USER_FORMATS.collect{|key, value| [key, value[:setting_order]]}.sort{|a, b| a[1] <=> b[1]}
@options[:user_format] = user_format.collect{|f| [User.current.name(f[0]), f[0].to_s]}
@deliveries = ActionMailer::Base.perform_deliveries
@guessed_host_and_path = request.host_with_port.dup

View File

@@ -138,7 +138,7 @@ class TimelogController < ApplicationController
:time_entry => {:issue_id => @time_entry.issue_id, :activity_id => @time_entry.activity_id},
:back_url => params[:back_url]
else
redirect_to :action => 'new',
redirect_to :action => 'new',
:time_entry => {:project_id => @time_entry.project_id, :issue_id => @time_entry.issue_id, :activity_id => @time_entry.activity_id},
:back_url => params[:back_url]
end
@@ -308,6 +308,9 @@ private
when 'last_week'
@from = Date.today - 7 - (Date.today.cwday - 1)%7
@to = @from + 6
when 'last_2_weeks'
@from = Date.today - 14 - (Date.today.cwday - 1)%7
@to = @from + 13
when '7_days'
@from = Date.today - 7
@to = Date.today

View File

@@ -59,7 +59,7 @@ class TrackersController < ApplicationController
@tracker ||= Tracker.find(params[:id])
@projects = Project.find(:all)
end
def update
@tracker = Tracker.find(params[:id])
if request.put? and @tracker.update_attributes(params[:tracker])

View File

@@ -20,7 +20,7 @@ class VersionsController < ApplicationController
model_object Version
before_filter :find_model_object, :except => [:index, :new, :create, :close_completed]
before_filter :find_project_from_association, :except => [:index, :new, :create, :close_completed]
before_filter :find_project, :only => [:index, :new, :create, :close_completed]
before_filter :find_project_by_project_id, :only => [:index, :new, :create, :close_completed]
before_filter :authorize
accept_api_auth :index, :show, :create, :update, :destroy
@@ -169,12 +169,7 @@ class VersionsController < ApplicationController
end
end
private
def find_project
@project = Project.find(params[:project_id])
rescue ActiveRecord::RecordNotFound
render_404
end
private
def retrieve_selected_tracker_ids(selectable_trackers, default_trackers=nil)
if ids = params[:tracker_ids]
@@ -183,5 +178,4 @@ private
@selected_tracker_ids = (default_trackers || selectable_trackers).collect {|t| t.id.to_s }
end
end
end

View File

@@ -35,7 +35,8 @@ class WikiController < ApplicationController
default_search_scope :wiki_pages
before_filter :find_wiki, :authorize
before_filter :find_existing_or_new_page, :only => [:show, :edit, :update]
before_filter :find_existing_page, :only => [:rename, :protect, :history, :diff, :annotate, :add_attachment, :destroy]
before_filter :find_existing_page, :only => [:rename, :protect, :history, :diff, :annotate, :add_attachment, :destroy, :destroy_version]
accept_api_auth :index, :show, :update, :destroy
helper :attachments
include AttachmentsHelper
@@ -45,7 +46,13 @@ class WikiController < ApplicationController
# List of pages, sorted alphabetically and by parent (hierarchy)
def index
load_pages_for_index
@pages_by_parent_id = @pages.group_by(&:parent_id)
respond_to do |format|
format.html {
@pages_by_parent_id = @pages.group_by(&:parent_id)
}
format.api
end
end
# List of page, by last update
@@ -57,7 +64,7 @@ class WikiController < ApplicationController
# display a page (in editing mode if it doesn't exist)
def show
if @page.new_record?
if User.current.allowed_to?(:edit_wiki_pages, @project) && editable?
if User.current.allowed_to?(:edit_wiki_pages, @project) && editable? && !api_request?
edit
render :action => 'edit'
else
@@ -66,8 +73,7 @@ class WikiController < ApplicationController
return
end
if params[:version] && !User.current.allowed_to?(:view_wiki_edits, @project)
# Redirects user to the current version if he's not allowed to view previous versions
redirect_to :version => nil
deny_access
return
end
@content = @page.content_for_version(params[:version])
@@ -89,7 +95,10 @@ class WikiController < ApplicationController
@content.current_version? &&
Redmine::WikiFormatting.supports_section_edit?
render :action => 'show'
respond_to do |format|
format.html
format.api
end
end
# edit an existing page or a new one
@@ -121,50 +130,65 @@ class WikiController < ApplicationController
# Creates a new page or updates an existing one
def update
return render_403 unless editable?
was_new_page = @page.new_record?
@page.content = WikiContent.new(:page => @page) if @page.new_record?
@page.safe_attributes = params[:wiki_page]
@content = @page.content_for_version(params[:version])
@content.text = initial_page_content(@page) if @content.text.blank?
# don't keep previous comment
@content.comments = nil
if !@page.new_record? && params[:content].present? && @content.text == params[:content][:text]
attachments = Attachment.attach_files(@page, params[:attachments])
render_attachment_warning_if_needed(@page)
# don't save content if text wasn't changed
@page.save
redirect_to :action => 'show', :project_id => @project, :id => @page.title
return
@content = @page.content
content_params = params[:content]
if content_params.nil? && params[:wiki_page].is_a?(Hash)
content_params = params[:wiki_page].slice(:text, :comments, :version)
end
content_params ||= {}
@content.comments = params[:content][:comments]
@text = params[:content][:text]
@content.comments = content_params[:comments]
@text = content_params[:text]
if params[:section].present? && Redmine::WikiFormatting.supports_section_edit?
@section = params[:section].to_i
@section_hash = params[:section_hash]
@content.text = Redmine::WikiFormatting.formatter.new(@content.text).update_section(params[:section].to_i, @text, @section_hash)
else
@content.version = params[:content][:version]
@content.version = content_params[:version] if content_params[:version]
@content.text = @text
end
@content.author = User.current
@page.content = @content
if @page.save
if @page.save_with_content
attachments = Attachment.attach_files(@page, params[:attachments])
render_attachment_warning_if_needed(@page)
call_hook(:controller_wiki_edit_after_save, { :params => params, :page => @page})
redirect_to :action => 'show', :project_id => @project, :id => @page.title
respond_to do |format|
format.html { redirect_to :action => 'show', :project_id => @project, :id => @page.title }
format.api {
if was_new_page
render :action => 'show', :status => :created, :location => url_for(:controller => 'wiki', :action => 'show', :project_id => @project, :id => @page.title)
else
render_api_ok
end
}
end
else
render :action => 'edit'
respond_to do |format|
format.html { render :action => 'edit' }
format.api { render_validation_errors(@content) }
end
end
rescue ActiveRecord::StaleObjectError, Redmine::WikiFormatting::StaleSectionError
# Optimistic locking exception
flash.now[:error] = l(:notice_locking_conflict)
render :action => 'edit'
respond_to do |format|
format.html {
flash.now[:error] = l(:notice_locking_conflict)
render :action => 'edit'
}
format.api { render_api_head :conflict }
end
rescue ActiveRecord::RecordNotSaved
render :action => 'edit'
respond_to do |format|
format.html { render :action => 'edit' }
format.api { render_validation_errors(@content) }
end
end
# rename a page
@@ -187,7 +211,7 @@ class WikiController < ApplicationController
# show page history
def history
@version_count = @page.content.versions.count
@version_pages = Paginator.new self, @version_count, per_page_option, params['p']
@version_pages = Paginator.new self, @version_count, per_page_option, params['page']
# don't load text
@versions = @page.content.versions.find :all,
:select => "id, author_id, comments, updated_on, version",
@@ -230,16 +254,28 @@ class WikiController < ApplicationController
end
else
@reassignable_to = @wiki.pages - @page.self_and_descendants
return
# display the destroy form if it's a user request
return unless api_request?
end
end
@page.destroy
redirect_to :action => 'index', :project_id => @project
respond_to do |format|
format.html { redirect_to :action => 'index', :project_id => @project }
format.api { render_api_ok }
end
end
def destroy_version
return render_403 unless editable?
@content = @page.content_for_version(params[:version])
@content.destroy
redirect_to_referer_or :action => 'history', :id => @page.title, :project_id => @project
end
# Export wiki to a single pdf or html file
def export
@pages = @wiki.pages.all(:order => 'title', :include => [:content, :attachments])
@pages = @wiki.pages.all(:order => 'title', :include => [:content, {:attachments => :author}])
respond_to do |format|
format.html {
export = render_to_string :action => 'export_multiple', :layout => false
@@ -313,6 +349,6 @@ private
end
def load_pages_for_index
@pages = @wiki.pages.with_updated_on.all(:order => 'title', :include => {:wiki => :project})
@pages = @wiki.pages.with_updated_on.order("#{WikiPage.table_name}.title").includes(:wiki => :project).includes(:parent).all
end
end

View File

@@ -47,8 +47,8 @@ module ApplicationHelper
def link_to_user(user, options={})
if user.is_a?(User)
name = h(user.name(options[:format]))
if user.active?
link_to name, :controller => 'users', :action => 'show', :id => user
if user.active? || (User.current.admin? && user.logged?)
link_to name, user_path(user), :class => user.css_classes
else
name
end
@@ -64,10 +64,12 @@ module ApplicationHelper
# link_to_issue(issue, :truncate => 6) # => Defect #6: This i...
# link_to_issue(issue, :subject => false) # => Defect #6
# link_to_issue(issue, :project => true) # => Foo - Defect #6
# link_to_issue(issue, :subject => false, :tracker => false) # => #6
#
def link_to_issue(issue, options={})
title = nil
subject = nil
text = options[:tracker] == false ? "##{issue.id}" : "#{issue.tracker} ##{issue.id}"
if options[:subject] == false
title = truncate(issue.subject, :length => 60)
else
@@ -76,9 +78,7 @@ module ApplicationHelper
subject = truncate(subject, :length => options[:truncate])
end
end
s = link_to "#{h(issue.tracker)} ##{issue.id}", {:controller => "issues", :action => "show", :id => issue},
:class => issue.css_classes,
:title => title
s = link_to text, issue_path(issue), :class => issue.css_classes, :title => title
s << h(": #{subject}") if subject
s = h("#{issue.project} - ") + s if options[:project]
s
@@ -147,6 +147,10 @@ module ApplicationHelper
end
end
def wiki_page_path(page, options={})
url_for({:controller => 'wiki', :action => 'show', :project_id => page.project, :id => page.title}.merge(options))
end
def thumbnail_tag(attachment)
link_to image_tag(url_for(:controller => 'attachments', :action => 'thumbnail', :id => attachment)),
{:controller => 'attachments', :action => 'show', :id => attachment, :filename => attachment.filename},
@@ -234,7 +238,7 @@ module ApplicationHelper
content << "<ul class=\"pages-hierarchy\">\n"
pages[node].each do |page|
content << "<li>"
content << link_to(h(page.pretty_title), {:controller => 'wiki', :action => 'show', :project_id => page.project, :id => page.title},
content << link_to(h(page.pretty_title), {:controller => 'wiki', :action => 'show', :project_id => page.project, :id => page.title, :version => nil},
:title => (options[:timestamp] && page.updated_on ? l(:label_updated_time, distance_of_time_in_words(Time.now, page.updated_on)) : nil))
content << "\n" + render_page_hierarchy(pages, page.id, options) if pages[page.id]
content << "</li>\n"
@@ -327,6 +331,15 @@ module ApplicationHelper
s.html_safe
end
# Options for the new membership projects combo-box
def options_for_membership_project_select(principal, projects)
options = content_tag('option', "--- #{l(:actionview_instancetag_blank_option)} ---")
options << project_tree_options_for_select(projects) do |p|
{:disabled => principal.projects.include?(p)}
end
options
end
# Truncates and returns the string as a single line
def truncate_single_line(string, *args)
truncate(string.to_s, *args).gsub(%r{[\r\n]+}m, ' ')
@@ -584,8 +597,9 @@ module ApplicationHelper
def parse_inline_attachments(text, project, obj, attr, only_path, options)
# when using an image link, try to use an attachment, if possible
if options[:attachments] || (obj && obj.respond_to?(:attachments))
attachments = options[:attachments] || obj.attachments
attachments = options[:attachments] || []
attachments += obj.attachments if obj.respond_to?(:attachments)
if attachments.present?
text.gsub!(/src="([^\/"]+\.(bmp|gif|jpg|jpe|jpeg|png))"(\s+alt="([^"]*)")?/i) do |m|
filename, ext, alt, alttext = $1.downcase, $2, $3, $4
# search for the picture in attachments
@@ -644,7 +658,7 @@ module ApplicationHelper
wiki_page_id = page.present? ? Wiki.titleize(page) : nil
parent = wiki_page.nil? && obj.is_a?(WikiContent) && obj.page && project == link_project ? obj.page.title : nil
url_for(:only_path => only_path, :controller => 'wiki', :action => 'show', :project_id => link_project,
:id => wiki_page_id, :anchor => anchor, :parent => parent)
:id => wiki_page_id, :version => nil, :anchor => anchor, :parent => parent)
end
end
link_to(title.present? ? title.html_safe : h(page), url, :class => ('wiki-page' + (wiki_page ? '' : ' new')))
@@ -690,10 +704,11 @@ module ApplicationHelper
# identifier:document:"Some document"
# identifier:version:1.0.0
# identifier:source:some/file
def parse_redmine_links(text, project, obj, attr, only_path, options)
text.gsub!(%r{([\s\(,\-\[\>]|^)(!)?(([a-z0-9\-_]+):)?(attachment|document|version|forum|news|message|project|commit|source|export)?(((#)|((([a-z0-9\-]+)\|)?(r)))((\d+)((#note)?-(\d+))?)|(:)([^"\s<>][^\s<>]*?|"[^"]+?"))(?=(?=[[:punct:]][^A-Za-z0-9_/])|,|\s|\]|<|$)}) do |m|
def parse_redmine_links(text, default_project, obj, attr, only_path, options)
text.gsub!(%r{([\s\(,\-\[\>]|^)(!)?(([a-z0-9\-_]+):)?(attachment|document|version|forum|news|message|project|commit|source|export)?(((#)|((([a-z0-9\-_]+)\|)?(r)))((\d+)((#note)?-(\d+))?)|(:)([^"\s<>][^\s<>]*?|"[^"]+?"))(?=(?=[[:punct:]][^A-Za-z0-9_/])|,|\s|\]|<|$)}) do |m|
leading, esc, project_prefix, project_identifier, prefix, repo_prefix, repo_identifier, sep, identifier, comment_suffix, comment_id = $1, $2, $3, $4, $5, $10, $11, $8 || $12 || $18, $14 || $19, $15, $17
link = nil
project = default_project
if project_identifier
project = Project.visible.find_by_identifier(project_identifier)
end
@@ -779,7 +794,7 @@ module ApplicationHelper
when 'commit', 'source', 'export'
if project
repository = nil
if name =~ %r{^(([a-z0-9\-]+)\|)(.+)$}
if name =~ %r{^(([a-z0-9\-_]+)\|)(.+)$}
repo_prefix, repo_identifier, name = $1, $2, $3
repository = project.repositories.detect {|repo| repo.identifier == repo_identifier}
else
@@ -806,7 +821,7 @@ module ApplicationHelper
end
when 'attachment'
attachments = options[:attachments] || (obj && obj.respond_to?(:attachments) ? obj.attachments : nil)
if attachments && attachment = attachments.detect {|a| a.filename == name }
if attachments && attachment = Attachment.latest_attach(attachments, name)
link = link_to h(attachment.filename), {:only_path => only_path, :controller => 'attachments', :action => 'download', :id => attachment},
:class => 'attachment'
end
@@ -958,8 +973,7 @@ module ApplicationHelper
end
def lang_options_for_select(blank=true)
(blank ? [["(auto)", ""]] : []) +
valid_languages.collect{|lang| [ ll(lang.to_s, :general_lang_name), lang.to_s]}.sort{|x,y| x.last <=> y.last }
(blank ? [["(auto)", ""]] : []) + languages_options
end
def label_tag_for(name, option_tags = nil, options = {})

View File

@@ -20,16 +20,7 @@
module CustomFieldsHelper
def custom_fields_tabs
tabs = [{:name => 'IssueCustomField', :partial => 'custom_fields/index', :label => :label_issue_plural},
{:name => 'TimeEntryCustomField', :partial => 'custom_fields/index', :label => :label_spent_time},
{:name => 'ProjectCustomField', :partial => 'custom_fields/index', :label => :label_project_plural},
{:name => 'VersionCustomField', :partial => 'custom_fields/index', :label => :label_version_plural},
{:name => 'UserCustomField', :partial => 'custom_fields/index', :label => :label_user_plural},
{:name => 'GroupCustomField', :partial => 'custom_fields/index', :label => :label_group_plural},
{:name => 'TimeEntryActivityCustomField', :partial => 'custom_fields/index', :label => TimeEntryActivity::OptionName},
{:name => 'IssuePriorityCustomField', :partial => 'custom_fields/index', :label => IssuePriority::OptionName},
{:name => 'DocumentCategoryCustomField', :partial => 'custom_fields/index', :label => DocumentCategory::OptionName}
]
CustomField::CUSTOM_FIELDS_TABS
end
# Return custom field html tag corresponding to its format

View File

@@ -18,15 +18,6 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
module GroupsHelper
# Options for the new membership projects combo-box
def options_for_membership_project_select(user, projects)
options = content_tag('option', "--- #{l(:actionview_instancetag_blank_option)} ---")
options << project_tree_options_for_select(projects) do |p|
{:disabled => (user.projects.include?(p))}
end
options
end
def group_settings_tabs
tabs = [{:name => 'general', :partial => 'groups/general', :label => :label_general},
{:name => 'users', :partial => 'groups/users', :label => :label_user_plural},

View File

@@ -65,7 +65,7 @@ module IssuesHelper
s = ''
ancestors = issue.root? ? [] : issue.ancestors.visible.all
ancestors.each do |ancestor|
s << '<div>' + content_tag('p', link_to_issue(ancestor))
s << '<div>' + content_tag('p', link_to_issue(ancestor, :project => (issue.project_id != ancestor.project_id)))
end
s << '<div>'
subject = h(issue.subject)
@@ -80,18 +80,29 @@ module IssuesHelper
def render_descendants_tree(issue)
s = '<form><table class="list issues">'
issue_list(issue.descendants.visible.sort_by(&:lft)) do |child, level|
css = "issue issue-#{child.id} hascontextmenu"
css << " idnt idnt-#{level}" if level > 0
s << content_tag('tr',
content_tag('td', check_box_tag("ids[]", child.id, false, :id => nil), :class => 'checkbox') +
content_tag('td', link_to_issue(child, :truncate => 60), :class => 'subject') +
content_tag('td', link_to_issue(child, :truncate => 60, :project => (issue.project_id != child.project_id)), :class => 'subject') +
content_tag('td', h(child.status)) +
content_tag('td', link_to_user(child.assigned_to)) +
content_tag('td', progress_bar(child.done_ratio, :width => '80px')),
:class => "issue issue-#{child.id} hascontextmenu #{level > 0 ? "idnt idnt-#{level}" : nil}")
:class => css)
end
s << '</table></form>'
s.html_safe
end
# Returns a link for adding a new subtask to the given issue
def link_to_new_subtask(issue)
attrs = {
:tracker_id => issue.tracker,
:parent_issue_id => issue
}
link_to(l(:button_add), new_project_issue_path(issue.project, :issue => attrs))
end
class IssueFieldsRows
include ActionView::Helpers::TagHelper
@@ -339,7 +350,10 @@ module IssuesHelper
association = Issue.reflect_on_association(field.to_sym)
if association
record = association.class_name.constantize.find_by_id(id)
return record.name if record
if record
record.name.force_encoding('UTF-8') if record.name.respond_to?(:force_encoding)
return record.name
end
end
end
@@ -360,12 +374,16 @@ module IssuesHelper
def issues_to_csv(issues, project, query, options={})
decimal_separator = l(:general_csv_decimal_separator)
encoding = l(:general_csv_encoding)
columns = (options[:columns] == 'all' ? query.available_columns : query.columns)
columns = (options[:columns] == 'all' ? query.available_inline_columns : query.inline_columns)
if options[:description]
if description = query.available_columns.detect {|q| q.name == :description}
columns << description
end
end
export = FCSV.generate(:col_sep => l(:general_csv_separator)) do |csv|
# csv header fields
csv << [ "#" ] + columns.collect {|c| Redmine::CodesetUtil.from_utf8(c.caption.to_s, encoding) } +
(options[:description] ? [Redmine::CodesetUtil.from_utf8(l(:field_description), encoding)] : [])
csv << [ "#" ] + columns.collect {|c| Redmine::CodesetUtil.from_utf8(c.caption.to_s, encoding) }
# csv lines
issues.each do |issue|
@@ -387,8 +405,7 @@ module IssuesHelper
end
s.to_s
end
csv << [ issue.id.to_s ] + col_values.collect {|c| Redmine::CodesetUtil.from_utf8(c.to_s, encoding) } +
(options[:description] ? [Redmine::CodesetUtil.from_utf8(issue.description, encoding)] : [])
csv << [ issue.id.to_s ] + col_values.collect {|c| Redmine::CodesetUtil.from_utf8(c.to_s, encoding) }
end
end
export

View File

@@ -19,11 +19,43 @@
module QueriesHelper
def filters_options_for_select(query)
options_for_select(filters_options(query))
end
def filters_options(query)
options = [[]]
options += query.available_filters.sort {|a,b| a[1][:order] <=> b[1][:order]}.map do |field, field_options|
sorted_options = query.available_filters.sort do |a, b|
ord = 0
if !(a[1][:order] == 20 && b[1][:order] == 20)
ord = a[1][:order] <=> b[1][:order]
else
cn = (CustomField::CUSTOM_FIELDS_NAMES.index(a[1][:field].class.name) <=>
CustomField::CUSTOM_FIELDS_NAMES.index(b[1][:field].class.name))
if cn != 0
ord = cn
else
f = (a[1][:field] <=> b[1][:field])
if f != 0
ord = f
else
# assigned_to or author
ord = (a[0] <=> b[0])
end
end
end
ord
end
options += sorted_options.map do |field, field_options|
[field_options[:name], field]
end
options_for_select(options)
end
def available_block_columns_tags(query)
tags = ''.html_safe
query.available_block_columns.each do |column|
tags << content_tag('label', check_box_tag('c[]', column.name.to_s, query.has_column?(column)) + " #{column.caption}", :class => 'inline')
end
tags
end
def column_header(column)
@@ -35,7 +67,7 @@ module QueriesHelper
def column_content(column, issue)
value = column.value(issue)
if value.is_a?(Array)
value.collect {|v| column_value(column, issue, v)}.compact.sort.join(', ').html_safe
value.collect {|v| column_value(column, issue, v)}.compact.join(', ').html_safe
else
column_value(column, issue, value)
end
@@ -46,6 +78,8 @@ module QueriesHelper
when 'String'
if column.name == :subject
link_to(h(value), :controller => 'issues', :action => 'show', :id => issue)
elsif column.name == :description
issue.description? ? content_tag('div', textilizable(issue, :description), :class => "wiki") : ''
else
h(value)
end
@@ -53,14 +87,14 @@ module QueriesHelper
format_time(value)
when 'Date'
format_date(value)
when 'Fixnum', 'Float'
when 'Fixnum'
if column.name == :done_ratio
progress_bar(value, :width => '80px')
elsif column.name == :spent_hours
sprintf "%.2f", value
else
h(value.to_s)
value.to_s
end
when 'Float'
sprintf "%.2f", value
when 'User'
link_to_user value
when 'Project'
@@ -73,6 +107,11 @@ module QueriesHelper
l(:general_text_No)
when 'Issue'
link_to_issue(value, :subject => false)
when 'IssueRelation'
other = value.other_issue(issue)
content_tag('span',
(l(value.label_for(issue)) + " " + link_to_issue(other, :subject => false, :tracker => false)).html_safe,
:class => value.css_classes_for(issue))
else
h(value)
end

View File

@@ -17,9 +17,6 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
require 'iconv'
require 'redmine/codeset_util'
module RepositoriesHelper
def format_revision(revision)
if revision.respond_to? :format_identifier
@@ -253,16 +250,13 @@ module RepositoriesHelper
def index_commits(commits, heads)
return nil if commits.nil? or commits.first.parents.nil?
refs_map = {}
heads.each do |head|
refs_map[head.scmid] ||= []
refs_map[head.scmid] << head
end
commits_by_scmid = {}
commits.reverse.each_with_index do |commit, commit_index|
commits_by_scmid[commit.scmid] = {
:parent_scmids => commit.parents.collect { |parent| parent.scmid },
:rdmid => commit_index,
@@ -271,38 +265,28 @@ module RepositoriesHelper
:href => block_given? ? yield(commit.scmid) : commit.scmid
}
end
heads.sort! { |head1, head2| head1.to_s <=> head2.to_s }
space = nil
heads.each do |head|
if commits_by_scmid.include? head.scmid
space = index_head((space || -1) + 1, head, commits_by_scmid)
end
end
# when no head matched anything use first commit
space ||= index_head(0, commits.first, commits_by_scmid)
return commits_by_scmid, space
end
def index_head(space, commit, commits_by_scmid)
stack = [[space, commits_by_scmid[commit.scmid]]]
max_space = space
until stack.empty?
space, commit = stack.pop
commit[:space] = space if commit[:space].nil?
space -= 1
commit[:parent_scmids].each_with_index do |parent_scmid, parent_index|
parent_commit = commits_by_scmid[parent_scmid]
if parent_commit and parent_commit[:space].nil?
stack.unshift [space += 1, parent_commit]
end
end

View File

@@ -56,7 +56,7 @@ module SettingsHelper
Setting.send(setting).include?(value),
:id => nil
) + text.to_s,
:class => 'block'
:class => (options[:inline] ? 'inline' : 'block')
)
end.join.html_safe
end
@@ -91,4 +91,16 @@ module SettingsHelper
l_or_humanize(notifiable.name, :prefix => 'label_').html_safe,
:class => notifiable.parent.present? ? "parent" : '').html_safe
end
def cross_project_subtasks_options
options = [
[:label_disabled, ''],
[:label_cross_project_system, 'system'],
[:label_cross_project_tree, 'tree'],
[:label_cross_project_hierarchy, 'hierarchy'],
[:label_cross_project_descendants, 'descendants']
]
options.map {|label, value| [l(label), value.to_s]}
end
end

View File

@@ -89,6 +89,10 @@ module SortHelper
sql.blank? ? nil : sql
end
def to_a
@criteria.dup
end
def add!(key, asc)
@criteria.delete_if {|k,o| k == key}
@criteria = [[key, asc]] + @criteria
@@ -182,6 +186,10 @@ module SortHelper
@sort_criteria.to_sql
end
def sort_criteria
@sort_criteria
end
# Returns a link which sorts by the named column.
#
# - column is the name of an attribute in the sorted record collection.

View File

@@ -77,6 +77,7 @@ module TimelogHelper
[l(:label_yesterday), 'yesterday'],
[l(:label_this_week), 'current_week'],
[l(:label_last_week), 'last_week'],
[l(:label_last_n_weeks, 2), 'last_2_weeks'],
[l(:label_last_n_days, 7), '7_days'],
[l(:label_this_month), 'current_month'],
[l(:label_last_month), 'last_month'],

View File

@@ -26,15 +26,6 @@ module UsersHelper
["#{l(:status_locked)} (#{user_count_by_status[3].to_i})", '3']], selected.to_s)
end
# Options for the new membership projects combo-box
def options_for_membership_project_select(user, projects)
options = content_tag('option', "--- #{l(:actionview_instancetag_blank_option)} ---")
options << project_tree_options_for_select(projects) do |p|
{:disabled => (user.projects.include?(p))}
end
options
end
def user_mail_notification_options(user)
user.valid_notification_options.collect {|o| [l(o.last), o.first]}
end

View File

@@ -44,7 +44,8 @@ module VersionsHelper
rescue ActiveRecord::RecordNotFound
# When grouping by an association, Rails throws this exception if there's no result (bug)
end
counts = h.keys.compact.sort.collect {|k| {:group => k, :total => h[k][0], :open => h[k][1], :closed => (h[k][0] - h[k][1])}}
# Sort with nil keys in last position
counts = h.keys.sort {|a,b| a.nil? ? 1 : (b.nil? ? -1 : a <=> b)}.collect {|k| {:group => k, :total => h[k][0], :open => h[k][1], :closed => (h[k][0] - h[k][1])}}
max = counts.collect {|c| c[:total]}.max
render :partial => 'issue_counts', :locals => {:version => version, :criteria => criteria, :counts => counts, :max => max}

View File

@@ -37,7 +37,7 @@ module WikiHelper
def wiki_page_breadcrumb(page)
breadcrumb(page.ancestors.reverse.collect {|parent|
link_to(h(parent.pretty_title), {:controller => 'wiki', :action => 'show', :id => parent.title, :project_id => parent.project})
link_to(h(parent.pretty_title), {:controller => 'wiki', :action => 'show', :id => parent.title, :project_id => parent.project, :version => nil})
})
end
end

View File

@@ -30,6 +30,34 @@ class CustomField < ActiveRecord::Base
validate :validate_custom_field
before_validation :set_searchable
CUSTOM_FIELDS_TABS = [
{:name => 'IssueCustomField', :partial => 'custom_fields/index',
:label => :label_issue_plural},
{:name => 'TimeEntryCustomField', :partial => 'custom_fields/index',
:label => :label_spent_time},
{:name => 'ProjectCustomField', :partial => 'custom_fields/index',
:label => :label_project_plural},
{:name => 'VersionCustomField', :partial => 'custom_fields/index',
:label => :label_version_plural},
{:name => 'UserCustomField', :partial => 'custom_fields/index',
:label => :label_user_plural},
{:name => 'GroupCustomField', :partial => 'custom_fields/index',
:label => :label_group_plural},
{:name => 'TimeEntryActivityCustomField', :partial => 'custom_fields/index',
:label => TimeEntryActivity::OptionName},
{:name => 'IssuePriorityCustomField', :partial => 'custom_fields/index',
:label => IssuePriority::OptionName},
{:name => 'DocumentCategoryCustomField', :partial => 'custom_fields/index',
:label => DocumentCategory::OptionName}
]
CUSTOM_FIELDS_NAMES = CUSTOM_FIELDS_TABS.collect{|v| v[:name]}
def field_format=(arg)
# cannot change format of a saved custom field
super if new_record?
end
def set_searchable
# make sure these fields are not searchable
self.searchable = false if %w(int float date bool).include?(field_format)

View File

@@ -36,6 +36,7 @@ class Enumeration < ActiveRecord::Base
validates_length_of :name, :maximum => 30
scope :shared, where(:project_id => nil)
scope :sorted, order("#{table_name}.position ASC")
scope :active, where(:active => true)
scope :named, lambda {|arg| where("LOWER(#{table_name}.name) = LOWER(?)", arg.to_s.strip)}

View File

@@ -17,6 +17,7 @@
class Issue < ActiveRecord::Base
include Redmine::SafeAttributes
include Redmine::Utils::DateCalculation
belongs_to :project
belongs_to :tracker
@@ -28,6 +29,14 @@ class Issue < ActiveRecord::Base
belongs_to :category, :class_name => 'IssueCategory', :foreign_key => 'category_id'
has_many :journals, :as => :journalized, :dependent => :destroy
has_many :visible_journals,
:class_name => 'Journal',
:as => :journalized,
:conditions => Proc.new {
["(#{Journal.table_name}.private_notes = ? OR (#{Project.allowed_to_condition(User.current, :view_private_notes)}))", false]
},
:readonly => true
has_many :time_entries, :dependent => :delete_all
has_and_belongs_to_many :changesets, :order => "#{Changeset.table_name}.committed_on ASC, #{Changeset.table_name}.id ASC"
@@ -39,7 +48,7 @@ class Issue < ActiveRecord::Base
acts_as_customizable
acts_as_watchable
acts_as_searchable :columns => ['subject', "#{table_name}.description", "#{Journal.table_name}.notes"],
:include => [:project, :journals],
:include => [:project, :visible_journals],
# sort by id so that limited eager loading doesn't break with postgresql
:order_column => "#{table_name}.id"
acts_as_event :title => Proc.new {|o| "#{o.tracker.name} ##{o.id} (#{o.status}): #{o.subject}"},
@@ -52,6 +61,7 @@ class Issue < ActiveRecord::Base
DONE_RATIO_OPTIONS = %w(issue_field issue_status)
attr_reader :current_journal
delegate :notes, :notes=, :private_notes, :private_notes=, :to => :current_journal, :allow_nil => true
validates_presence_of :subject, :priority, :project, :tracker, :author, :status
@@ -276,7 +286,8 @@ class Issue < ActiveRecord::Base
if fixed_version && fixed_version.project != project && !project.shared_versions.include?(fixed_version)
self.fixed_version = nil
end
if parent && parent.project_id != project_id
# Clear the parent task if it's no longer valid
unless valid_parent_project?
self.parent_issue_id = nil
end
@custom_field_values = nil
@@ -335,6 +346,7 @@ class Issue < ActiveRecord::Base
'custom_field_values',
'custom_fields',
'lock_version',
'notes',
:if => lambda {|issue, user| issue.new_record? || user.allowed_to?(:edit_issues, issue.project) }
safe_attributes 'status_id',
@@ -342,8 +354,15 @@ class Issue < ActiveRecord::Base
'fixed_version_id',
'done_ratio',
'lock_version',
'notes',
:if => lambda {|issue, user| issue.new_statuses_allowed_to(user).any? }
safe_attributes 'notes',
:if => lambda {|issue, user| user.allowed_to?(:add_issue_notes, issue.project)}
safe_attributes 'private_notes',
:if => lambda {|issue, user| !issue.new_record? && user.allowed_to?(:set_notes_private, issue.project)}
safe_attributes 'watcher_user_ids',
:if => lambda {|issue, user| issue.new_record? && user.allowed_to?(:add_issue_watchers, issue.project)}
@@ -398,7 +417,10 @@ class Issue < ActiveRecord::Base
end
if attrs['parent_issue_id'].present?
attrs.delete('parent_issue_id') unless Issue.visible(user).exists?(attrs['parent_issue_id'].to_i)
s = attrs['parent_issue_id'].to_s
unless (m = s.match(%r{\A#?(\d+)\z})) && (m[1] == parent_id.to_s || Issue.visible(user).exists?(m[1]))
@invalid_parent_issue_id = attrs.delete('parent_issue_id')
end
end
if attrs['custom_field_values'].present?
@@ -504,11 +526,15 @@ class Issue < ActiveRecord::Base
end
def validate_issue
if self.due_date.nil? && @attributes['due_date'] && !@attributes['due_date'].empty?
if due_date.nil? && @attributes['due_date'].present?
errors.add :due_date, :not_a_date
end
if self.due_date and self.start_date and self.due_date < self.start_date
if start_date.nil? && @attributes['start_date'].present?
errors.add :start_date, :not_a_date
end
if due_date && start_date && due_date < start_date
errors.add :due_date, :greater_than_start_date
end
@@ -532,9 +558,11 @@ class Issue < ActiveRecord::Base
end
# Checks parent issue assignment
if @parent_issue
if @parent_issue.project_id != project_id
errors.add :parent_issue_id, :not_same_project
if @invalid_parent_issue_id.present?
errors.add :parent_issue_id, :invalid
elsif @parent_issue
if !valid_parent_project?(@parent_issue)
errors.add :parent_issue_id, :invalid
elsif !new_record?
# moving an existing issue
if @parent_issue.root_id != root_id
@@ -542,7 +570,7 @@ class Issue < ActiveRecord::Base
elsif move_possible?(@parent_issue)
# move accepted inside tree
else
errors.add :parent_issue_id, :not_a_valid_parent
errors.add :parent_issue_id, :invalid
end
end
end
@@ -715,8 +743,8 @@ class Issue < ActiveRecord::Base
end
end
# Returns the mail adresses of users that should be notified
def recipients
# Returns the users that should be notified
def notified_users
notified = []
# Author and assignee are always notified unless they have been
# locked or don't want to be notified
@@ -733,7 +761,12 @@ class Issue < ActiveRecord::Base
notified.uniq!
# Remove users that can not view the issue
notified.reject! {|user| !visible?(user)}
notified.collect(&:mail)
notified
end
# Returns the email addresses that should be notified
def recipients
notified_users.collect(&:mail)
end
# Returns the number of hours spent on this issue
@@ -752,7 +785,7 @@ class Issue < ActiveRecord::Base
end
def relations
@relations ||= (relations_from + relations_to).sort
@relations ||= IssueRelations.new(self, (relations_from + relations_to).sort)
end
# Preloads relations for a collection of issues
@@ -775,6 +808,25 @@ class Issue < ActiveRecord::Base
end
end
# Preloads visible relations for a collection of issues
def self.load_visible_relations(issues, user=User.current)
if issues.any?
issue_ids = issues.map(&:id)
# Relations with issue_from in given issues and visible issue_to
relations_from = IssueRelation.includes(:issue_to => [:status, :project]).where(visible_condition(user)).where(:issue_from_id => issue_ids).all
# Relations with issue_to in given issues and visible issue_from
relations_to = IssueRelation.includes(:issue_from => [:status, :project]).where(visible_condition(user)).where(:issue_to_id => issue_ids).all
issues.each do |issue|
relations =
relations_from.select {|relation| relation.issue_from_id == issue.id} +
relations_to.select {|relation| relation.issue_to_id == issue.id}
issue.instance_variable_set "@relations", IssueRelations.new(issue, relations.sort)
end
end
end
# Finds an issue relation given its id.
def find_relation(relation_id)
IssueRelation.find(relation_id, :conditions => ["issue_to_id = ? OR issue_from_id = ?", id, id])
@@ -812,29 +864,58 @@ class Issue < ActiveRecord::Base
(start_date && due_date) ? due_date - start_date : 0
end
def soonest_start
# Returns the duration in working days
def working_duration
(start_date && due_date) ? working_days(start_date, due_date) : 0
end
def soonest_start(reload=false)
@soonest_start = nil if reload
@soonest_start ||= (
relations_to.collect{|relation| relation.successor_soonest_start} +
relations_to(reload).collect{|relation| relation.successor_soonest_start} +
ancestors.collect(&:soonest_start)
).compact.max
end
def reschedule_after(date)
# Sets start_date on the given date or the next working day
# and changes due_date to keep the same working duration.
def reschedule_on(date)
wd = working_duration
date = next_working_date(date)
self.start_date = date
self.due_date = add_working_days(date, wd)
end
# Reschedules the issue on the given date or the next working day and saves the record.
# If the issue is a parent task, this is done by rescheduling its subtasks.
def reschedule_on!(date)
return if date.nil?
if leaf?
if start_date.nil? || start_date < date
self.start_date, self.due_date = date, date + duration
if start_date.nil? || start_date != date
if start_date && start_date > date
# Issue can not be moved earlier than its soonest start date
date = [soonest_start(true), date].compact.max
end
reschedule_on(date)
begin
save
rescue ActiveRecord::StaleObjectError
reload
self.start_date, self.due_date = date, date + duration
reschedule_on(date)
save
end
end
else
leaves.each do |leaf|
leaf.reschedule_after(date)
if leaf.start_date
# Only move subtask if it starts at the same date as the parent
# or if it starts before the given date
if start_date == leaf.start_date || date > leaf.start_date
leaf.reschedule_on!(date)
end
else
leaf.reschedule_on!(date)
end
end
end
end
@@ -855,7 +936,7 @@ class Issue < ActiveRecord::Base
# Returns a string of css classes that apply to the issue
def css_classes
s = "issue status-#{status_id} priority-#{priority_id}"
s = "issue status-#{status_id} #{priority.try(:css_classes)}"
s << ' closed' if closed?
s << ' overdue' if overdue?
s << ' child' if child?
@@ -905,23 +986,44 @@ class Issue < ActiveRecord::Base
end
def parent_issue_id=(arg)
parent_issue_id = arg.blank? ? nil : arg.to_i
if parent_issue_id && @parent_issue = Issue.find_by_id(parent_issue_id)
s = arg.to_s.strip.presence
if s && (m = s.match(%r{\A#?(\d+)\z})) && (@parent_issue = Issue.find_by_id(m[1]))
@parent_issue.id
else
@parent_issue = nil
nil
@invalid_parent_issue_id = arg
end
end
def parent_issue_id
if instance_variable_defined? :@parent_issue
if @invalid_parent_issue_id
@invalid_parent_issue_id
elsif instance_variable_defined? :@parent_issue
@parent_issue.nil? ? nil : @parent_issue.id
else
parent_id
end
end
# Returns true if issue's project is a valid
# parent issue project
def valid_parent_project?(issue=parent)
return true if issue.nil? || issue.project_id == project_id
case Setting.cross_project_subtasks
when 'system'
true
when 'tree'
issue.project.root == project.root
when 'hierarchy'
issue.project.is_or_is_ancestor_of?(project) || issue.project.is_descendant_of?(project)
when 'descendants'
issue.project.is_or_is_ancestor_of?(project)
else
false
end
end
# Extracted from the ReportsController.
def self.by_tracker(project)
count_and_group_by(:project => project,
@@ -1001,8 +1103,9 @@ class Issue < ActiveRecord::Base
relations_to.clear
end
# Move subtasks
# Move subtasks that were in the same project
children.each do |child|
next unless child.project_id == project_id_was
# Change project and keep project
child.send :project=, project, true
unless child.save
@@ -1011,11 +1114,20 @@ class Issue < ActiveRecord::Base
end
end
# Copies subtasks from the copied issue
# Callback for after the creation of an issue by copy
# * adds a "copied to" relation with the copied issue
# * copies subtasks from the copied issue
def after_create_from_copy
return unless copy?
return unless copy? && !@after_create_from_copy_handled
unless @copied_from.leaf? || @copy_options[:subtasks] == false || @subtasks_copied
if (@copied_from.project_id == project_id || Setting.cross_project_issue_relations?) && @copy_options[:link] != false
relation = IssueRelation.new(:issue_from => @copied_from, :issue_to => self, :relation_type => IssueRelation::TYPE_COPIED_TO)
unless relation.save
logger.error "Could not create relation while copying ##{@copied_from.id} to ##{id} due to validation errors: #{relation.errors.full_messages.join(', ')}" if logger
end
end
unless @copied_from.leaf? || @copy_options[:subtasks] == false
@copied_from.children.each do |child|
unless child.visible?
# Do not copy subtasks that are not visible to avoid potential disclosure of private data
@@ -1031,8 +1143,8 @@ class Issue < ActiveRecord::Base
logger.error "Could not copy subtask ##{child.id} while copying ##{@copied_from.id} to ##{id} due to validation errors: #{copy.errors.full_messages.join(', ')}" if logger
end
end
@subtasks_copied = true
end
@after_create_from_copy_handled = true
end
def update_nested_set_attributes
@@ -1143,7 +1255,7 @@ class Issue < ActiveRecord::Base
end
end
# Callback on attachment deletion
# Callback on file attachment
def attachment_added(obj)
if @current_journal && !obj.new_record?
@current_journal.details << JournalDetail.new(:property => 'attachment', :prop_key => obj.id, :value => obj.filename)

View File

@@ -27,7 +27,7 @@ class IssueCategory < ActiveRecord::Base
safe_attributes 'name', 'assigned_to_id'
scope :named, lambda {|arg| { :conditions => ["LOWER(#{table_name}.name) = LOWER(?)", arg.to_s.strip]}}
scope :named, lambda {|arg| where("LOWER(#{table_name}.name) = LOWER(?)", arg.to_s.strip)}
alias :destroy_without_reassign :destroy

View File

@@ -18,6 +18,9 @@
class IssuePriority < Enumeration
has_many :issues, :foreign_key => 'priority_id'
after_destroy {|priority| priority.class.compute_position_names}
after_save {|priority| priority.class.compute_position_names if priority.position_changed? && priority.position}
OptionName = :enumeration_issue_priorities
def option_name
@@ -31,4 +34,35 @@ class IssuePriority < Enumeration
def transfer_relations(to)
issues.update_all("priority_id = #{to.id}")
end
def css_classes
"priority-#{id} priority-#{position_name}"
end
# Clears position_name for all priorities
# Called from migration 20121026003537_populate_enumerations_position_name
def self.clear_position_names
update_all :position_name => nil
end
# Updates position_name for active priorities
# Called from migration 20121026003537_populate_enumerations_position_name
def self.compute_position_names
priorities = where(:active => true).all.sort_by(&:position)
if priorities.any?
default = priorities.detect(&:is_default?) || priorities[(priorities.size - 1) / 2]
priorities.each_with_index do |priority, index|
name = case
when priority.position == default.position
"default"
when priority.position < default.position
index == 0 ? "lowest" : "low#{index+1}"
else
index == (priorities.size - 1) ? "highest" : "high#{priorities.size - index}"
end
update_all({:position_name => name}, :id => priority.id)
end
end
end
end

View File

@@ -15,6 +15,20 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
# Class used to represent the relations of an issue
class IssueRelations < Array
include Redmine::I18n
def initialize(issue, *args)
@issue = issue
super(*args)
end
def to_s(*args)
map {|relation| "#{l(relation.label_for(@issue))} ##{relation.other_issue(@issue).id}"}.join(', ')
end
end
class IssueRelation < ActiveRecord::Base
belongs_to :issue_from, :class_name => 'Issue', :foreign_key => 'issue_from_id'
belongs_to :issue_to, :class_name => 'Issue', :foreign_key => 'issue_to_id'
@@ -26,25 +40,37 @@ class IssueRelation < ActiveRecord::Base
TYPE_BLOCKED = "blocked"
TYPE_PRECEDES = "precedes"
TYPE_FOLLOWS = "follows"
TYPE_COPIED_TO = "copied_to"
TYPE_COPIED_FROM = "copied_from"
TYPES = { TYPE_RELATES => { :name => :label_relates_to, :sym_name => :label_relates_to, :order => 1, :sym => TYPE_RELATES },
TYPE_DUPLICATES => { :name => :label_duplicates, :sym_name => :label_duplicated_by, :order => 2, :sym => TYPE_DUPLICATED },
TYPE_DUPLICATED => { :name => :label_duplicated_by, :sym_name => :label_duplicates, :order => 3, :sym => TYPE_DUPLICATES, :reverse => TYPE_DUPLICATES },
TYPE_BLOCKS => { :name => :label_blocks, :sym_name => :label_blocked_by, :order => 4, :sym => TYPE_BLOCKED },
TYPE_BLOCKED => { :name => :label_blocked_by, :sym_name => :label_blocks, :order => 5, :sym => TYPE_BLOCKS, :reverse => TYPE_BLOCKS },
TYPE_PRECEDES => { :name => :label_precedes, :sym_name => :label_follows, :order => 6, :sym => TYPE_FOLLOWS },
TYPE_FOLLOWS => { :name => :label_follows, :sym_name => :label_precedes, :order => 7, :sym => TYPE_PRECEDES, :reverse => TYPE_PRECEDES }
}.freeze
TYPES = {
TYPE_RELATES => { :name => :label_relates_to, :sym_name => :label_relates_to,
:order => 1, :sym => TYPE_RELATES },
TYPE_DUPLICATES => { :name => :label_duplicates, :sym_name => :label_duplicated_by,
:order => 2, :sym => TYPE_DUPLICATED },
TYPE_DUPLICATED => { :name => :label_duplicated_by, :sym_name => :label_duplicates,
:order => 3, :sym => TYPE_DUPLICATES, :reverse => TYPE_DUPLICATES },
TYPE_BLOCKS => { :name => :label_blocks, :sym_name => :label_blocked_by,
:order => 4, :sym => TYPE_BLOCKED },
TYPE_BLOCKED => { :name => :label_blocked_by, :sym_name => :label_blocks,
:order => 5, :sym => TYPE_BLOCKS, :reverse => TYPE_BLOCKS },
TYPE_PRECEDES => { :name => :label_precedes, :sym_name => :label_follows,
:order => 6, :sym => TYPE_FOLLOWS },
TYPE_FOLLOWS => { :name => :label_follows, :sym_name => :label_precedes,
:order => 7, :sym => TYPE_PRECEDES, :reverse => TYPE_PRECEDES },
TYPE_COPIED_TO => { :name => :label_copied_to, :sym_name => :label_copied_from,
:order => 8, :sym => TYPE_COPIED_FROM },
TYPE_COPIED_FROM => { :name => :label_copied_from, :sym_name => :label_copied_to,
:order => 9, :sym => TYPE_COPIED_TO, :reverse => TYPE_COPIED_TO }
}.freeze
validates_presence_of :issue_from, :issue_to, :relation_type
validates_inclusion_of :relation_type, :in => TYPES.keys
validates_numericality_of :delay, :allow_nil => true
validates_uniqueness_of :issue_to_id, :scope => :issue_from_id
validate :validate_issue_relation
attr_protected :issue_from_id, :issue_to_id
before_save :handle_issue_order
def visible?(user=User.current)
@@ -69,14 +95,19 @@ class IssueRelation < ActiveRecord::Base
def validate_issue_relation
if issue_from && issue_to
errors.add :issue_to_id, :invalid if issue_from_id == issue_to_id
errors.add :issue_to_id, :not_same_project unless issue_from.project_id == issue_to.project_id || Setting.cross_project_issue_relations?
#detect circular dependencies depending wether the relation should be reversed
unless issue_from.project_id == issue_to.project_id ||
Setting.cross_project_issue_relations?
errors.add :issue_to_id, :not_same_project
end
# detect circular dependencies depending wether the relation should be reversed
if TYPES.has_key?(relation_type) && TYPES[relation_type][:reverse]
errors.add :base, :circular_dependency if issue_from.all_dependent_issues.include? issue_to
else
errors.add :base, :circular_dependency if issue_to.all_dependent_issues.include? issue_from
end
errors.add :base, :cant_link_an_issue_with_a_descendant if issue_from.is_descendant_of?(issue_to) || issue_from.is_ancestor_of?(issue_to)
if issue_from.is_descendant_of?(issue_to) || issue_from.is_ancestor_of?(issue_to)
errors.add :base, :cant_link_an_issue_with_a_descendant
end
end
end
@@ -96,7 +127,13 @@ class IssueRelation < ActiveRecord::Base
end
def label_for(issue)
TYPES[relation_type] ? TYPES[relation_type][(self.issue_from_id == issue.id) ? :name : :sym_name] : :unknow
TYPES[relation_type] ?
TYPES[relation_type][(self.issue_from_id == issue.id) ? :name : :sym_name] :
:unknow
end
def css_classes_for(issue)
"rel-#{relation_type_for(issue)}"
end
def handle_issue_order
@@ -113,18 +150,20 @@ class IssueRelation < ActiveRecord::Base
def set_issue_to_dates
soonest_start = self.successor_soonest_start
if soonest_start && issue_to
issue_to.reschedule_after(soonest_start)
issue_to.reschedule_on!(soonest_start)
end
end
def successor_soonest_start
if (TYPE_PRECEDES == self.relation_type) && delay && issue_from && (issue_from.start_date || issue_from.due_date)
if (TYPE_PRECEDES == self.relation_type) && delay && issue_from &&
(issue_from.start_date || issue_from.due_date)
(issue_from.due_date || issue_from.start_date) + 1 + delay
end
end
def <=>(relation)
TYPES[self.relation_type][:order] <=> TYPES[relation.relation_type][:order]
r = TYPES[self.relation_type][:order] <=> TYPES[relation.relation_type][:order]
r == 0 ? id <=> relation.id : r
end
private

View File

@@ -29,7 +29,7 @@ class IssueStatus < ActiveRecord::Base
validates_inclusion_of :default_done_ratio, :in => 0..100, :allow_nil => true
scope :sorted, order("#{table_name}.position ASC")
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 update_default
IssueStatus.update_all({:is_default => false}, ['id <> ?', id]) if self.is_default?

View File

@@ -37,10 +37,15 @@ class Journal < ActiveRecord::Base
:conditions => "#{Journal.table_name}.journalized_type = 'Issue' AND" +
" (#{JournalDetail.table_name}.prop_key = 'status_id' OR #{Journal.table_name}.notes <> '')"}
scope :visible, lambda {|*args| {
:include => {:issue => :project},
:conditions => Issue.visible_condition(args.shift || User.current, *args)
}}
before_create :split_private_notes
scope :visible, lambda {|*args|
user = args.shift || User.current
includes(:issue => :project).
where(Issue.visible_condition(user, *args)).
where("(#{Journal.table_name}.private_notes = ? OR (#{Project.allowed_to_condition(user, :view_private_notes, *args)}))", false)
}
def save(*args)
# Do not save an empty journal
@@ -75,6 +80,7 @@ class Journal < ActiveRecord::Base
s = 'journal'
s << ' has-notes' unless notes.blank?
s << ' has-details' unless details.blank?
s << ' private-notes' if private_notes?
s
end
@@ -85,4 +91,41 @@ class Journal < ActiveRecord::Base
def notify=(arg)
@notify = arg
end
def recipients
notified = journalized.notified_users
if private_notes?
notified = notified.select {|user| user.allowed_to?(:view_private_notes, journalized.project)}
end
notified.map(&:mail)
end
def watcher_recipients
notified = journalized.notified_watchers
if private_notes?
notified = notified.select {|user| user.allowed_to?(:view_private_notes, journalized.project)}
end
notified.map(&:mail)
end
private
def split_private_notes
if private_notes?
if notes.present?
if details.any?
# Split the journal (notes/changes) so we don't have half-private journals
journal = Journal.new(:journalized => journalized, :user => user, :notes => nil, :private_notes => false)
journal.details = details
journal.save
self.details = []
self.created_on = journal.created_on
end
else
# Blank notes should not be private
self.private_notes = false
end
end
true
end
end

View File

@@ -182,7 +182,7 @@ class MailHandler < ActionMailer::Base
end
# Adds a note to an existing issue
def receive_issue_reply(issue_id)
def receive_issue_reply(issue_id, from_journal=nil)
issue = Issue.find_by_id(issue_id)
return unless issue
# check permission
@@ -197,6 +197,10 @@ class MailHandler < ActionMailer::Base
@@handler_options[:issue].clear
journal = issue.init_journal(user)
if from_journal && from_journal.private_notes?
# If the received email was a reply to a private note, make the added note private
issue.private_notes = true
end
issue.safe_attributes = issue_attributes_from_keywords(issue)
issue.safe_attributes = {'custom_field_values' => custom_field_values_from_keywords(issue)}
journal.notes = cleaned_up_text_body
@@ -212,7 +216,7 @@ class MailHandler < ActionMailer::Base
def receive_journal_reply(journal_id)
journal = Journal.find_by_id(journal_id)
if journal && journal.journalized_type == 'Issue'
receive_issue_reply(journal.journalized_id)
receive_issue_reply(journal.journalized_id, journal)
end
end
@@ -245,26 +249,9 @@ class MailHandler < ActionMailer::Base
def add_attachments(obj)
if email.attachments && email.attachments.any?
email.attachments.each do |attachment|
filename = attachment.filename
unless filename.respond_to?(:encoding)
# try to reencode to utf8 manually with ruby1.8
h = attachment.header['Content-Disposition']
unless h.nil?
begin
if m = h.value.match(/filename\*[0-9\*]*=([^=']+)'/)
filename = Redmine::CodesetUtil.to_utf8(filename, m[1])
elsif m = h.value.match(/filename=.*=\?([^\?]+)\?[BbQq]\?/)
# http://tools.ietf.org/html/rfc2047#section-4
filename = Redmine::CodesetUtil.to_utf8(filename, m[1])
end
rescue
# nop
end
end
end
obj.attachments << Attachment.create(:container => obj,
:file => attachment.decoded,
:filename => filename,
:filename => attachment.filename,
:author => user,
:content_type => attachment.mime_type)
end
@@ -387,19 +374,6 @@ class MailHandler < ActionMailer::Base
def cleaned_up_subject
subject = email.subject.to_s
unless subject.respond_to?(:encoding)
# try to reencode to utf8 manually with ruby1.8
begin
if h = email.header[:subject]
# http://tools.ietf.org/html/rfc2047#section-4
if m = h.value.match(/=\?([^\?]+)\?[BbQq]\?/)
subject = Redmine::CodesetUtil.to_utf8(subject, m[1])
end
end
rescue
# nop
end
end
subject.strip[0,255]
end

View File

@@ -62,9 +62,9 @@ class Mailer < ActionMailer::Base
message_id journal
references issue
@author = journal.user
recipients = issue.recipients
recipients = journal.recipients
# Watchers in cc
cc = issue.watcher_recipients - recipients
cc = journal.watcher_recipients - recipients
s = "[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}] "
s << "(#{issue.status.name}) " if journal.new_value_for('status_id')
s << issue.subject

View File

@@ -27,19 +27,20 @@ class Principal < ActiveRecord::Base
scope :active, :conditions => "#{Principal.table_name}.status = 1"
scope :like, lambda {|q|
q = q.to_s
if q.blank?
{}
where({})
else
q = q.to_s
pattern = "%#{q}%"
sql = "LOWER(login) LIKE LOWER(:p) OR LOWER(firstname) LIKE LOWER(:p) OR LOWER(lastname) LIKE LOWER(:p) OR LOWER(mail) LIKE LOWER(:p)"
sql = %w(login firstname lastname mail).map {|column| "LOWER(#{table_name}.#{column}) LIKE LOWER(:p)"}.join(" OR ")
params = {:p => pattern}
if q =~ /^(.+)\s+(.+)$/
a, b = "#{$1}%", "#{$2}%"
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))"
sql << " OR (LOWER(#{table_name}.firstname) LIKE LOWER(:a) AND LOWER(#{table_name}.lastname) LIKE LOWER(:b))"
sql << " OR (LOWER(#{table_name}.firstname) LIKE LOWER(:b) AND LOWER(#{table_name}.lastname) LIKE LOWER(:a))"
params.merge!(:a => a, :b => b)
end
{:conditions => [sql, params]}
where(sql, params)
end
}
@@ -47,20 +48,20 @@ class Principal < ActiveRecord::Base
scope :member_of, lambda {|projects|
projects = [projects] unless projects.is_a?(Array)
if projects.empty?
{:conditions => "1=0"}
where("1=0")
else
ids = projects.map(&:id)
{:conditions => ["#{Principal.table_name}.status = 1 AND #{Principal.table_name}.id IN (SELECT DISTINCT user_id FROM #{Member.table_name} WHERE project_id IN (?))", ids]}
where("#{Principal.table_name}.status = 1 AND #{Principal.table_name}.id IN (SELECT DISTINCT user_id FROM #{Member.table_name} WHERE project_id IN (?))", ids)
end
}
# Principals that are not members of projects
scope :not_member_of, lambda {|projects|
projects = [projects] unless projects.is_a?(Array)
if projects.empty?
{:conditions => "1=0"}
where("1=0")
else
ids = projects.map(&:id)
{:conditions => ["#{Principal.table_name}.id NOT IN (SELECT DISTINCT user_id FROM #{Member.table_name} WHERE project_id IN (?))", ids]}
where("#{Principal.table_name}.id NOT IN (SELECT DISTINCT user_id FROM #{Member.table_name} WHERE project_id IN (?))", ids)
end
}

View File

@@ -28,7 +28,7 @@ class Project < ActiveRecord::Base
# Specific overidden Activities
has_many :time_entry_activities
has_many :members, :include => [:user, :roles], :conditions => "#{User.table_name}.type='User' AND #{User.table_name}.status=#{User::STATUS_ACTIVE}"
has_many :members, :include => [:principal, :roles], :conditions => "#{User.table_name}.type='User' AND #{User.table_name}.status=#{User::STATUS_ACTIVE}"
has_many :memberships, :class_name => 'Member'
has_many :member_principals, :class_name => 'Member',
:include => :principal,
@@ -393,6 +393,16 @@ class Project < ActiveRecord::Base
end
end
# Recalculates all lft and rgt values based on project names
# Unlike Project.rebuild!, these values are recalculated even if the tree "looks" valid
# Used in BuildProjectsTree migration
def self.rebuild_tree!
transaction do
update_all "lft = NULL, rgt = NULL"
rebuild!(false)
end
end
# Returns an array of the trackers used by the project and its active sub projects
def rolled_up_trackers
@rolled_up_trackers ||=
@@ -472,7 +482,7 @@ class Project < ActiveRecord::Base
# Returns the users that should be notified on project events
def notified_users
# TODO: User part should be extracted to User#notify_about?
members.select {|m| m.mail_notification? || m.user.mail_notification == 'all'}.collect {|m| m.user}
members.select {|m| m.principal.present? && (m.mail_notification? || m.principal.mail_notification == 'all')}.collect {|m| m.principal}
end
# Returns an array of all custom fields enabled for project issues
@@ -721,7 +731,7 @@ class Project < ActiveRecord::Base
def copy_wiki(project)
# Check that the source project has a wiki first
unless project.wiki.nil?
self.wiki ||= Wiki.new
wiki = self.wiki || Wiki.new
wiki.attributes = project.wiki.attributes.dup.except("id", "project_id")
wiki_pages_map = {}
project.wiki.pages.each do |page|
@@ -733,6 +743,8 @@ class Project < ActiveRecord::Base
wiki.pages << new_wiki_page
wiki_pages_map[page.id] = new_wiki_page
end
self.wiki = wiki
wiki.save
# Reproduce page hierarchy
project.wiki.pages.each do |page|
@@ -778,7 +790,7 @@ class Project < ActiveRecord::Base
# get copied before their children
project.issues.find(:all, :order => 'root_id, lft').each do |issue|
new_issue = Issue.new
new_issue.copy_from(issue, :subtasks => false)
new_issue.copy_from(issue, :subtasks => false, :link => false)
new_issue.project = self
# Reassign fixed_versions by name, since names are unique per project
if issue.fixed_version && issue.fixed_version.project == project

View File

@@ -27,6 +27,7 @@ class QueryColumn
self.groupable = name.to_s
end
self.default_order = options[:default_order]
@inline = options.key?(:inline) ? options[:inline] : true
@caption_key = options[:caption] || "field_#{name}"
end
@@ -38,11 +39,15 @@ class QueryColumn
def sortable?
!@sortable.nil?
end
def sortable
@sortable.is_a?(Proc) ? @sortable.call : @sortable
end
def inline?
@inline
end
def value(issue)
issue.send name
end
@@ -58,6 +63,7 @@ class QueryCustomFieldColumn < QueryColumn
self.name = "cf_#{custom_field.id}".to_sym
self.sortable = custom_field.order_statement || false
self.groupable = custom_field.group_statement || false
@inline = true
@cf = custom_field
end
@@ -71,7 +77,7 @@ class QueryCustomFieldColumn < QueryColumn
def value(issue)
cv = issue.custom_values.select {|v| v.custom_field_id == @cf.id}.collect {|v| @cf.cast_value(v.value)}
cv.size > 1 ? cv : cv.first
cv.size > 1 ? cv.sort {|a,b| a.to_s <=> b.to_s} : cv.first
end
def css_classes
@@ -100,20 +106,25 @@ class Query < ActiveRecord::Base
"o" => :label_open_issues,
"c" => :label_closed_issues,
"!*" => :label_none,
"*" => :label_all,
"*" => :label_any,
">=" => :label_greater_or_equal,
"<=" => :label_less_or_equal,
"><" => :label_between,
"<t+" => :label_in_less_than,
">t+" => :label_in_more_than,
"><t+"=> :label_in_the_next_days,
"t+" => :label_in,
"t" => :label_today,
"w" => :label_this_week,
">t-" => :label_less_than_ago,
"<t-" => :label_more_than_ago,
"><t-"=> :label_in_the_past_days,
"t-" => :label_ago,
"~" => :label_contains,
"!~" => :label_not_contains }
"!~" => :label_not_contains,
"=p" => :label_any_issues_in_project,
"=!p" => :label_any_issues_not_in_project,
"!p" => :label_no_issues_in_project}
cattr_reader :operators
@@ -121,12 +132,13 @@ class Query < ActiveRecord::Base
:list_status => [ "o", "=", "!", "c", "*" ],
:list_optional => [ "=", "!", "!*", "*" ],
:list_subprojects => [ "*", "!*", "=" ],
:date => [ "=", ">=", "<=", "><", "<t+", ">t+", "t+", "t", "w", ">t-", "<t-", "t-", "!*", "*" ],
:date_past => [ "=", ">=", "<=", "><", ">t-", "<t-", "t-", "t", "w", "!*", "*" ],
:date => [ "=", ">=", "<=", "><", "<t+", ">t+", "><t+", "t+", "t", "w", ">t-", "<t-", "><t-", "t-", "!*", "*" ],
:date_past => [ "=", ">=", "<=", "><", ">t-", "<t-", "><t-", "t-", "t", "w", "!*", "*" ],
:string => [ "=", "~", "!", "!~", "!*", "*" ],
:text => [ "~", "!~", "!*", "*" ],
:integer => [ "=", ">=", "<=", "><", "!*", "*" ],
:float => [ "=", ">=", "<=", "><", "!*", "*" ] }
:float => [ "=", ">=", "<=", "><", "!*", "*" ],
:relation => ["=", "=p", "=!p", "!p", "!*", "*"]}
cattr_reader :operators_by_filter_type
@@ -147,6 +159,8 @@ class Query < ActiveRecord::Base
QueryColumn.new(:estimated_hours, :sortable => "#{Issue.table_name}.estimated_hours"),
QueryColumn.new(:done_ratio, :sortable => "#{Issue.table_name}.done_ratio", :groupable => true),
QueryColumn.new(:created_on, :sortable => "#{Issue.table_name}.created_on", :default_order => 'desc'),
QueryColumn.new(:relations, :caption => :label_related_issues),
QueryColumn.new(:description, :inline => false)
]
cattr_reader :available_columns
@@ -178,7 +192,7 @@ class Query < ActiveRecord::Base
case operator_for(field)
when "=", ">=", "<=", "><"
add_filter_error(field, :invalid) if values_for(field).detect {|v| v.present? && (!v.match(/^\d{4}-\d{2}-\d{2}$/) || (Date.parse(v) rescue nil).nil?) }
when ">t-", "<t-", "t-"
when ">t-", "<t-", "t-", ">t+", "<t+", "t+", "><t+", "><t-"
add_filter_error(field, :invalid) if values_for(field).detect {|v| v.present? && !v.match(/^\d+$/) }
end
end
@@ -221,44 +235,57 @@ class Query < ActiveRecord::Base
def available_filters
return @available_filters if @available_filters
@available_filters = { "status_id" => { :type => :list_status, :order => 1, :values => IssueStatus.find(:all, :order => 'position').collect{|s| [s.name, s.id.to_s] } },
"tracker_id" => { :type => :list, :order => 2, :values => trackers.collect{|s| [s.name, s.id.to_s] } },
"priority_id" => { :type => :list, :order => 3, :values => IssuePriority.all.collect{|s| [s.name, s.id.to_s] } },
"subject" => { :type => :text, :order => 8 },
"created_on" => { :type => :date_past, :order => 9 },
"updated_on" => { :type => :date_past, :order => 10 },
"start_date" => { :type => :date, :order => 11 },
"due_date" => { :type => :date, :order => 12 },
"estimated_hours" => { :type => :float, :order => 13 },
"done_ratio" => { :type => :integer, :order => 14 }}
@available_filters = {
"status_id" => {
:type => :list_status, :order => 0,
:values => IssueStatus.find(:all, :order => 'position').collect{|s| [s.name, s.id.to_s] }
},
"tracker_id" => {
:type => :list, :order => 2, :values => trackers.collect{|s| [s.name, s.id.to_s] }
},
"priority_id" => {
:type => :list, :order => 3, :values => IssuePriority.all.collect{|s| [s.name, s.id.to_s] }
},
"subject" => { :type => :text, :order => 8 },
"created_on" => { :type => :date_past, :order => 9 },
"updated_on" => { :type => :date_past, :order => 10 },
"start_date" => { :type => :date, :order => 11 },
"due_date" => { :type => :date, :order => 12 },
"estimated_hours" => { :type => :float, :order => 13 },
"done_ratio" => { :type => :integer, :order => 14 }
}
IssueRelation::TYPES.each do |relation_type, options|
@available_filters[relation_type] = {
:type => :relation, :order => @available_filters.size + 100,
:label => options[:name]
}
end
principals = []
if project
principals += project.principals.sort
unless project.leaf?
subprojects = project.descendants.visible.all
if subprojects.any?
@available_filters["subproject_id"] = { :type => :list_subprojects, :order => 13, :values => subprojects.collect{|s| [s.name, s.id.to_s] } }
@available_filters["subproject_id"] = {
:type => :list_subprojects, :order => 13,
:values => subprojects.collect{|s| [s.name, s.id.to_s] }
}
principals += Principal.member_of(subprojects)
end
end
else
all_projects = Project.visible.all
if all_projects.any?
# members of visible projects
principals += Principal.member_of(all_projects)
# project filter
project_values = []
if User.current.logged? && User.current.memberships.any?
project_values << ["<< #{l(:label_my_projects).downcase} >>", "mine"]
end
Project.project_tree(all_projects) do |p, level|
prefix = (level > 0 ? ('--' * level + ' ') : '')
project_values << ["#{prefix}#{p.name}", p.id.to_s]
end
@available_filters["project_id"] = { :type => :list, :order => 1, :values => project_values} unless project_values.empty?
project_values += all_projects_values
@available_filters["project_id"] = {
:type => :list, :order => 1, :values => project_values
} unless project_values.empty?
end
end
principals.uniq!
@@ -267,63 +294,88 @@ class Query < ActiveRecord::Base
assigned_to_values = []
assigned_to_values << ["<< #{l(:label_me)} >>", "me"] if User.current.logged?
assigned_to_values += (Setting.issue_group_assignment? ? principals : users).collect{|s| [s.name, s.id.to_s] }
@available_filters["assigned_to_id"] = { :type => :list_optional, :order => 4, :values => assigned_to_values } unless assigned_to_values.empty?
assigned_to_values += (Setting.issue_group_assignment? ?
principals : users).collect{|s| [s.name, s.id.to_s] }
@available_filters["assigned_to_id"] = {
:type => :list_optional, :order => 4, :values => assigned_to_values
} unless assigned_to_values.empty?
author_values = []
author_values << ["<< #{l(:label_me)} >>", "me"] if User.current.logged?
author_values += users.collect{|s| [s.name, s.id.to_s] }
@available_filters["author_id"] = { :type => :list, :order => 5, :values => author_values } unless author_values.empty?
@available_filters["author_id"] = {
:type => :list, :order => 5, :values => author_values
} unless author_values.empty?
group_values = Group.all.collect {|g| [g.name, g.id.to_s] }
@available_filters["member_of_group"] = { :type => :list_optional, :order => 6, :values => group_values } unless group_values.empty?
@available_filters["member_of_group"] = {
:type => :list_optional, :order => 6, :values => group_values
} unless group_values.empty?
role_values = Role.givable.collect {|r| [r.name, r.id.to_s] }
@available_filters["assigned_to_role"] = { :type => :list_optional, :order => 7, :values => role_values } unless role_values.empty?
@available_filters["assigned_to_role"] = {
:type => :list_optional, :order => 7, :values => role_values
} unless role_values.empty?
if User.current.logged?
@available_filters["watcher_id"] = { :type => :list, :order => 15, :values => [["<< #{l(:label_me)} >>", "me"]] }
@available_filters["watcher_id"] = {
:type => :list, :order => 15, :values => [["<< #{l(:label_me)} >>", "me"]]
}
end
if project
# project specific filters
categories = project.issue_categories.all
unless categories.empty?
@available_filters["category_id"] = { :type => :list_optional, :order => 6, :values => categories.collect{|s| [s.name, s.id.to_s] } }
@available_filters["category_id"] = {
:type => :list_optional, :order => 6,
:values => categories.collect{|s| [s.name, s.id.to_s] }
}
end
versions = project.shared_versions.all
unless versions.empty?
@available_filters["fixed_version_id"] = { :type => :list_optional, :order => 7, :values => versions.sort.collect{|s| ["#{s.project.name} - #{s.name}", s.id.to_s] } }
@available_filters["fixed_version_id"] = {
:type => :list_optional, :order => 7,
:values => versions.sort.collect{|s| ["#{s.project.name} - #{s.name}", s.id.to_s] }
}
end
add_custom_fields_filters(project.all_issue_custom_fields)
else
# global filters for cross project issue list
system_shared_versions = Version.visible.find_all_by_sharing('system')
unless system_shared_versions.empty?
@available_filters["fixed_version_id"] = { :type => :list_optional, :order => 7, :values => system_shared_versions.sort.collect{|s| ["#{s.project.name} - #{s.name}", s.id.to_s] } }
@available_filters["fixed_version_id"] = {
:type => :list_optional, :order => 7,
:values => system_shared_versions.sort.collect{|s|
["#{s.project.name} - #{s.name}", s.id.to_s]
}
}
end
add_custom_fields_filters(IssueCustomField.find(:all, :conditions => {:is_filter => true, :is_for_all => true}))
add_custom_fields_filters(
IssueCustomField.find(:all,
:conditions => {
:is_filter => true,
:is_for_all => true
}))
end
add_associations_custom_fields_filters :project, :author, :assigned_to, :fixed_version
if User.current.allowed_to?(:set_issues_private, nil, :global => true) ||
User.current.allowed_to?(:set_own_issues_private, nil, :global => true)
@available_filters["is_private"] = { :type => :list, :order => 15, :values => [[l(:general_text_yes), "1"], [l(:general_text_no), "0"]] }
@available_filters["is_private"] = {
:type => :list, :order => 16,
:values => [[l(:general_text_yes), "1"], [l(:general_text_no), "0"]]
}
end
Tracker.disabled_core_fields(trackers).each {|field|
@available_filters.delete field
}
@available_filters.each do |field, options|
options[:name] ||= l("field_#{field}".gsub(/_id$/, ''))
options[:name] ||= l(options[:label] || "field_#{field}".gsub(/_id$/, ''))
end
@available_filters
end
# Returns a representation of the available filters for JSON serialization
# Returns a representation of the available filters for JSON serialization
def available_filters_as_json
json = {}
available_filters.each do |field, options|
@@ -332,6 +384,21 @@ class Query < ActiveRecord::Base
json
end
def all_projects
@all_projects ||= Project.visible.all
end
def all_projects_values
return @all_projects_values if @all_projects_values
values = []
Project.project_tree(all_projects) do |p, level|
prefix = (level > 0 ? ('--' * level + ' ') : '')
values << ["#{prefix}#{p.name}", p.id.to_s]
end
@all_projects_values = values
end
def add_filter(field, operator, values)
# values must be an array
return unless values.nil? || values.is_a?(Array)
@@ -451,6 +518,22 @@ class Query < ActiveRecord::Base
end.compact
end
def inline_columns
columns.select(&:inline?)
end
def block_columns
columns.reject(&:inline?)
end
def available_inline_columns
available_columns.select(&:inline?)
end
def available_block_columns
available_columns.reject(&:inline?)
end
def default_columns_names
@default_columns_names ||= begin
default_columns = Setting.issue_list_default_columns.map(&:to_sym)
@@ -484,7 +567,7 @@ class Query < ActiveRecord::Base
if arg.is_a?(Hash)
arg = arg.keys.sort.collect {|k| arg[k]}
end
c = arg.select {|k,o| !k.to_s.blank?}.slice(0,3).collect {|k,o| [k.to_s, o == 'desc' ? o : 'asc']}
c = arg.select {|k,o| !k.to_s.blank?}.slice(0,3).collect {|k,o| [k.to_s, (o == 'desc' || o == false) ? 'desc' : 'asc']}
write_attribute(:sort_criteria, c)
end
@@ -500,12 +583,17 @@ class Query < ActiveRecord::Base
sort_criteria && sort_criteria[arg] && sort_criteria[arg].last
end
def sort_criteria_order_for(key)
sort_criteria.detect {|k, order| key.to_s == k}.try(:last)
end
# Returns the SQL sort order that should be prepended for grouping
def group_by_sort_order
if grouped? && (column = group_by_column)
order = sort_criteria_order_for(column.name) || column.default_order
column.sortable.is_a?(Array) ?
column.sortable.collect {|s| "#{s} #{column.default_order}"}.join(',') :
"#{column.sortable} #{column.default_order}"
column.sortable.collect {|s| "#{s} #{order}"}.join(',') :
"#{column.sortable} #{order}"
end
end
@@ -635,6 +723,9 @@ class Query < ActiveRecord::Base
if has_column?(:spent_hours)
Issue.load_visible_spent_hours(issues)
end
if has_column?(:relations)
Issue.load_visible_relations(issues)
end
issues
rescue ::ActiveRecord::StatementInvalid => e
raise StatementInvalid.new(e.message)
@@ -711,10 +802,10 @@ class Query < ActiveRecord::Base
"(#{nl} #{Issue.table_name}.assigned_to_id #{sw} IN (SELECT DISTINCT #{Member.table_name}.user_id FROM #{Member.table_name}" +
" WHERE #{Member.table_name}.project_id = #{Issue.table_name}.project_id))"
when "=", "!"
role_cond = value.any? ?
role_cond = value.any? ?
"#{MemberRole.table_name}.role_id IN (" + value.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + ")" :
"1=0"
sw = operator == "!" ? 'NOT' : ''
nl = operator == "!" ? "#{Issue.table_name}.assigned_to_id IS NULL OR" : ''
"(#{nl} #{Issue.table_name}.assigned_to_id #{sw} IN (SELECT DISTINCT #{Member.table_name}.user_id FROM #{Member.table_name}, #{MemberRole.table_name}" +
@@ -729,6 +820,42 @@ class Query < ActiveRecord::Base
"#{Issue.table_name}.is_private #{op} (#{va})"
end
def sql_for_relations(field, operator, value, options={})
relation_options = IssueRelation::TYPES[field]
return relation_options unless relation_options
relation_type = field
join_column, target_join_column = "issue_from_id", "issue_to_id"
if relation_options[:reverse] || options[:reverse]
relation_type = relation_options[:reverse] || relation_type
join_column, target_join_column = target_join_column, join_column
end
sql = case operator
when "*", "!*"
op = (operator == "*" ? 'IN' : 'NOT IN')
"#{Issue.table_name}.id #{op} (SELECT DISTINCT #{IssueRelation.table_name}.#{join_column} FROM #{IssueRelation.table_name} WHERE #{IssueRelation.table_name}.relation_type = '#{connection.quote_string(relation_type)}')"
when "=", "!"
op = (operator == "=" ? 'IN' : 'NOT IN')
"#{Issue.table_name}.id #{op} (SELECT DISTINCT #{IssueRelation.table_name}.#{join_column} FROM #{IssueRelation.table_name} WHERE #{IssueRelation.table_name}.relation_type = '#{connection.quote_string(relation_type)}' AND #{IssueRelation.table_name}.#{target_join_column} = #{value.first.to_i})"
when "=p", "=!p", "!p"
op = (operator == "!p" ? 'NOT IN' : 'IN')
comp = (operator == "=!p" ? '<>' : '=')
"#{Issue.table_name}.id #{op} (SELECT DISTINCT #{IssueRelation.table_name}.#{join_column} FROM #{IssueRelation.table_name}, #{Issue.table_name} relissues WHERE #{IssueRelation.table_name}.relation_type = '#{connection.quote_string(relation_type)}' AND #{IssueRelation.table_name}.#{target_join_column} = relissues.id AND relissues.project_id #{comp} #{value.first.to_i})"
end
if relation_options[:sym] == field && !options[:reverse]
sqls = [sql, sql_for_relations(field, operator, value, :reverse => true)]
sqls.join(["!", "!*", "!p"].include?(operator) ? " AND " : " OR ")
else
sql
end
end
IssueRelation::TYPES.keys.each do |relation_type|
alias_method "sql_for_#{relation_type}_field".to_sym, :sql_for_relations
end
private
def sql_for_custom_field(field, operator, value, custom_field_id)
@@ -834,21 +961,35 @@ class Query < ActiveRecord::Base
sql = "#{Issue.table_name}.status_id IN (SELECT id FROM #{IssueStatus.table_name} WHERE is_closed=#{connection.quoted_false})" if field == "status_id"
when "c"
sql = "#{Issue.table_name}.status_id IN (SELECT id FROM #{IssueStatus.table_name} WHERE is_closed=#{connection.quoted_true})" if field == "status_id"
when ">t-"
when "><t-"
# between today - n days and today
sql = relative_date_clause(db_table, db_field, - value.first.to_i, 0)
when ">t-"
# >= today - n days
sql = relative_date_clause(db_table, db_field, - value.first.to_i, nil)
when "<t-"
# <= today - n days
sql = relative_date_clause(db_table, db_field, nil, - value.first.to_i)
when "t-"
# = n days in past
sql = relative_date_clause(db_table, db_field, - value.first.to_i, - value.first.to_i)
when "><t+"
# between today and today + n days
sql = relative_date_clause(db_table, db_field, 0, value.first.to_i)
when ">t+"
# >= today + n days
sql = relative_date_clause(db_table, db_field, value.first.to_i, nil)
when "<t+"
sql = relative_date_clause(db_table, db_field, 0, value.first.to_i)
# <= today + n days
sql = relative_date_clause(db_table, db_field, nil, value.first.to_i)
when "t+"
# = today + n days
sql = relative_date_clause(db_table, db_field, value.first.to_i, value.first.to_i)
when "t"
# = today
sql = relative_date_clause(db_table, db_field, 0, 0)
when "w"
# = this week
first_day_of_week = l(:general_first_day_of_week).to_i
day_of_week = Date.today.cwday
days_ago = (day_of_week >= first_day_of_week ? day_of_week - first_day_of_week : day_of_week + 7 - first_day_of_week)
@@ -898,7 +1039,11 @@ class Query < ActiveRecord::Base
filter_id = "#{assoc}.#{filter_id}"
filter_name = l("label_attribute_of_#{assoc}", :name => filter_name)
end
@available_filters[filter_id] = options.merge({ :name => filter_name, :format => field.field_format })
@available_filters[filter_id] = options.merge({
:name => filter_name,
:format => field.field_format,
:field => field
})
end
end

View File

@@ -20,7 +20,7 @@ class ScmFetchError < Exception; end
class Repository < ActiveRecord::Base
include Redmine::Ciphering
include Redmine::SafeAttributes
# Maximum length for repository identifiers
IDENTIFIER_MAX_LENGTH = 255
@@ -418,7 +418,7 @@ class Repository < ActiveRecord::Base
# Deletes repository data
def clear_changesets
cs = Changeset.table_name
cs = Changeset.table_name
ch = Change.table_name
ci = "#{table_name_prefix}changesets_issues#{table_name_suffix}"
cp = "#{table_name_prefix}changeset_parents#{table_name_suffix}"

View File

@@ -37,7 +37,28 @@ class Repository::Bazaar < Repository
'Bazaar'
end
def entry(path=nil, identifier=nil)
scm.bzr_path_encodig = log_encoding
scm.entry(path, identifier)
end
def cat(path, identifier=nil)
scm.bzr_path_encodig = log_encoding
scm.cat(path, identifier)
end
def annotate(path, identifier=nil)
scm.bzr_path_encodig = log_encoding
scm.annotate(path, identifier)
end
def diff(path, rev, rev_to)
scm.bzr_path_encodig = log_encoding
scm.diff(path, rev, rev_to)
end
def entries(path=nil, identifier=nil)
scm.bzr_path_encodig = log_encoding
entries = scm.entries(path, identifier)
if entries
entries.each do |e|
@@ -68,6 +89,7 @@ class Repository::Bazaar < Repository
end
def fetch_changesets
scm.bzr_path_encodig = log_encoding
scm_info = scm.info
if scm_info
# latest revision found in database
@@ -80,7 +102,7 @@ class Repository::Bazaar < Repository
while (identifier_from <= scm_revision)
# loads changesets by batches of 200
identifier_to = [identifier_from + 199, scm_revision].min
revisions = scm.revisions('', identifier_to, identifier_from, :with_paths => true)
revisions = scm.revisions('', identifier_to, identifier_from)
transaction do
revisions.reverse_each do |revision|
changeset = Changeset.create(:repository => self,

View File

@@ -28,11 +28,41 @@ class User < Principal
# Different ways of displaying/sorting users
USER_FORMATS = {
:firstname_lastname => {:string => '#{firstname} #{lastname}', :order => %w(firstname lastname id)},
:firstname => {:string => '#{firstname}', :order => %w(firstname id)},
:lastname_firstname => {:string => '#{lastname} #{firstname}', :order => %w(lastname firstname id)},
:lastname_coma_firstname => {:string => '#{lastname}, #{firstname}', :order => %w(lastname firstname id)},
:username => {:string => '#{login}', :order => %w(login id)},
:firstname_lastname => {
:string => '#{firstname} #{lastname}',
:order => %w(firstname lastname id),
:setting_order => 1
},
:firstname_lastinitial => {
:string => '#{firstname} #{lastname.to_s.chars.first}.',
:order => %w(firstname lastname id),
:setting_order => 2
},
:firstname => {
:string => '#{firstname}',
:order => %w(firstname id),
:setting_order => 3
},
:lastname_firstname => {
:string => '#{lastname} #{firstname}',
:order => %w(lastname firstname id),
:setting_order => 4
},
:lastname_coma_firstname => {
:string => '#{lastname}, #{firstname}',
:order => %w(lastname firstname id),
:setting_order => 5
},
:lastname => {
:string => '#{lastname}',
:order => %w(lastname id),
:setting_order => 6
},
:username => {
:string => '#{login}',
:order => %w(login id),
:setting_order => 7
},
}
MAIL_NOTIFICATION_OPTIONS = [
@@ -67,7 +97,7 @@ class User < Principal
validates_presence_of :login, :firstname, :lastname, :mail, :if => Proc.new { |user| !user.is_a?(AnonymousUser) }
validates_uniqueness_of :login, :if => Proc.new { |user| user.login_changed? && user.login.present? }, :case_sensitive => false
validates_uniqueness_of :mail, :if => Proc.new { |user| !user.mail.blank? }, :case_sensitive => false
validates_uniqueness_of :mail, :if => Proc.new { |user| user.mail_changed? && user.mail.present? }, :case_sensitive => false
# Login must contain lettres, numbers, underscores only
validates_format_of :login, :with => /^[a-z0-9_\-@\.]*$/i
validates_length_of :login, :maximum => LOGIN_LENGTH_LIMIT
@@ -84,11 +114,11 @@ class User < Principal
scope :in_group, lambda {|group|
group_id = group.is_a?(Group) ? group.id : group.to_i
{ :conditions => ["#{User.table_name}.id IN (SELECT gu.user_id FROM #{table_name_prefix}groups_users#{table_name_suffix} gu WHERE gu.group_id = ?)", group_id] }
where("#{User.table_name}.id IN (SELECT gu.user_id FROM #{table_name_prefix}groups_users#{table_name_suffix} gu WHERE gu.group_id = ?)", group_id)
}
scope :not_in_group, lambda {|group|
group_id = group.is_a?(Group) ? group.id : group.to_i
{ :conditions => ["#{User.table_name}.id NOT IN (SELECT gu.user_id FROM #{table_name_prefix}groups_users#{table_name_suffix} gu WHERE gu.group_id = ?)", group_id] }
where("#{User.table_name}.id NOT IN (SELECT gu.user_id FROM #{table_name_prefix}groups_users#{table_name_suffix} gu WHERE gu.group_id = ?)", group_id)
}
def set_mail_notification
@@ -330,10 +360,10 @@ class User < Principal
# version. Exact matches will be given priority.
def self.find_by_login(login)
# First look for an exact match
user = all(:conditions => {:login => login}).detect {|u| u.login == login}
user = where(:login => login).all.detect {|u| u.login == login}
unless user
# Fail over to case-insensitive if none was found
user = first(:conditions => ["LOWER(login) = ?", login.to_s.downcase])
user = where("LOWER(login) = ?", login.to_s.downcase).first
end
user
end
@@ -350,7 +380,7 @@ class User < Principal
# Makes find_by_mail case-insensitive
def self.find_by_mail(mail)
find(:first, :conditions => ["LOWER(mail) = ?", mail.to_s.downcase])
where("LOWER(mail) = ?", mail.to_s.downcase).first
end
# Returns true if the default admin account can no longer be used
@@ -362,6 +392,17 @@ class User < Principal
name
end
CSS_CLASS_BY_STATUS = {
STATUS_ANONYMOUS => 'anon',
STATUS_ACTIVE => 'active',
STATUS_REGISTERED => 'registered',
STATUS_LOCKED => 'locked'
}
def css_classes
"user #{CSS_CLASS_BY_STATUS[status]}"
end
# Returns the current day according to user's time zone
def today
if time_zone.nil?
@@ -462,17 +503,17 @@ class User < Principal
roles = roles_for_project(context)
return false unless roles
roles.detect {|role|
roles.any? {|role|
(context.is_public? || role.member?) &&
role.allowed_to?(action) &&
(block_given? ? yield(role, self) : true)
}
elsif context && context.is_a?(Array)
# Authorize if user is authorized on every element of the array
context.map do |project|
allowed_to?(action, project, options, &block)
end.inject do |memo,allowed|
memo && allowed
if context.empty?
false
else
# Authorize if user is authorized on every element of the array
context.map {|project| allowed_to?(action, project, options, &block)}.reduce(:&)
end
elsif options[:global]
# Admin users are always authorized
@@ -481,7 +522,7 @@ class User < Principal
# authorize if user has at least one role that has this permission
roles = memberships.collect {|m| m.roles}.flatten.uniq
roles << (self.logged? ? Role.non_member : Role.anonymous)
roles.detect {|role|
roles.any? {|role|
role.allowed_to?(action) &&
(block_given? ? yield(role, self) : true)
}
@@ -499,7 +540,7 @@ class User < Principal
# Returns true if the user is allowed to delete his own account
def own_account_deletable?
Setting.unsubscribe? &&
(!admin? || User.active.first(:conditions => ["admin = ? AND id <> ?", true, id]).present?)
(!admin? || User.active.where("admin = ? AND id <> ?", true, id).exists?)
end
safe_attributes 'login',
@@ -570,7 +611,7 @@ class User < Principal
# Returns the anonymous user. If the anonymous user does not exist, it is created. There can be only
# one anonymous user per database.
def self.anonymous
anonymous_user = AnonymousUser.find(:first)
anonymous_user = AnonymousUser.first
if anonymous_user.nil?
anonymous_user = AnonymousUser.create(:lastname => 'Anonymous', :firstname => '', :mail => '', :login => '', :status => 0)
raise 'Unable to create the anonymous user.' if anonymous_user.new_record?
@@ -583,11 +624,11 @@ class User < Principal
# This method is used in the SaltPasswords migration and is to be kept as is
def self.salt_unsalted_passwords!
transaction do
User.find_each(:conditions => "salt IS NULL OR salt = ''") do |user|
User.where("salt IS NULL OR salt = ''").find_each do |user|
next if user.hashed_password.blank?
salt = User.generate_salt
hashed_password = User.hash_password("#{salt}#{user.hashed_password}")
User.update_all("salt = '#{salt}', hashed_password = '#{hashed_password}'", ["id = ?", user.id] )
User.where(:id => user.id).update_all(:salt => salt, :hashed_password => hashed_password)
end
end
end

View File

@@ -35,10 +35,11 @@ class Version < ActiveRecord::Base
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'}
scope :visible, lambda {|*args| { :include => :project,
:conditions => Project.allowed_to_condition(args.first || User.current, :view_issues) } }
scope :named, lambda {|arg| where("LOWER(#{table_name}.name) = LOWER(?)", arg.to_s.strip)}
scope :open, where(:status => 'open')
scope :visible, lambda {|*args|
includes(:project).where(Project.allowed_to_condition(args.first || User.current, :view_issues))
}
safe_attributes 'name',
'description',
@@ -79,7 +80,7 @@ class Version < ActiveRecord::Base
# Returns the total reported time for this version
def spent_hours
@spent_hours ||= TimeEntry.sum(:hours, :joins => :issue, :conditions => ["#{Issue.table_name}.fixed_version_id = ?", id]).to_f
@spent_hours ||= TimeEntry.joins(:issue).where("#{Issue.table_name}.fixed_version_id = ?", id).sum(:hours).to_f
end
def closed?
@@ -92,7 +93,7 @@ class Version < ActiveRecord::Base
# Returns true if the version is completed: due date reached and no open issues
def completed?
effective_date && (effective_date <= Date.today) && (open_issues_count == 0)
effective_date && (effective_date < Date.today) && (open_issues_count == 0)
end
def behind_schedule?
@@ -268,9 +269,7 @@ class Version < ActiveRecord::Base
if issues_count > 0
ratio = open ? 'done_ratio' : 100
done = fixed_issues.sum("COALESCE(estimated_hours, #{estimated_average}) * #{ratio}",
:joins => :status,
:conditions => ["#{IssueStatus.table_name}.is_closed = ?", !open]).to_f
done = fixed_issues.open(open).sum("COALESCE(estimated_hours, #{estimated_average}) * #{ratio}").to_f
progress = done / (estimated_average * issues_count)
end
progress

View File

@@ -73,6 +73,8 @@ class WikiContent < ActiveRecord::Base
"LEFT JOIN #{Wiki.table_name} ON #{Wiki.table_name}.id = #{WikiPage.table_name}.wiki_id " +
"LEFT JOIN #{Project.table_name} ON #{Project.table_name}.id = #{Wiki.table_name}.project_id"}
after_destroy :page_update_after_destroy
def text=(plain)
case Setting.wiki_compression
when 'gzip'
@@ -115,10 +117,31 @@ class WikiContent < ActiveRecord::Base
# Returns the previous version or nil
def previous
@previous ||= WikiContent::Version.find(:first,
:order => 'version DESC',
:include => :author,
:conditions => ["wiki_content_id = ? AND version < ?", wiki_content_id, version])
@previous ||= WikiContent::Version.
reorder('version DESC').
includes(:author).
where("wiki_content_id = ? AND version < ?", wiki_content_id, version).first
end
# Returns the next version or nil
def next
@next ||= WikiContent::Version.
reorder('version ASC').
includes(:author).
where("wiki_content_id = ? AND version > ?", wiki_content_id, version).first
end
private
# Updates page's content if the latest version is removed
# or destroys the page if it was the only version
def page_update_after_destroy
latest = page.content.versions.reorder("#{self.class.table_name}.version DESC").first
if latest && page.content.version != latest.version
raise ActiveRecord::Rollback unless page.content.revert_to!(latest)
elsif latest.nil?
raise ActiveRecord::Rollback unless page.destroy
end
end
end
end

View File

@@ -50,14 +50,14 @@ class WikiPage < ActiveRecord::Base
# eager load information about last updates, without loading text
scope :with_updated_on, {
:select => "#{WikiPage.table_name}.*, #{WikiContent.table_name}.updated_on",
:select => "#{WikiPage.table_name}.*, #{WikiContent.table_name}.updated_on, #{WikiContent.table_name}.version",
:joins => "LEFT JOIN #{WikiContent.table_name} ON #{WikiContent.table_name}.page_id = #{WikiPage.table_name}.id"
}
# Wiki pages that are protected by default
DEFAULT_PROTECTED_PAGES = %w(sidebar)
safe_attributes 'parent_id',
safe_attributes 'parent_id', 'parent_title',
:if => lambda {|page, user| page.new_record? || user.allowed_to?(:rename_wiki_pages, page.project)}
def initialize(attributes=nil, *args)
@@ -111,11 +111,13 @@ class WikiPage < ActiveRecord::Base
def diff(version_to=nil, version_from=nil)
version_to = version_to ? version_to.to_i : self.content.version
version_from = version_from ? version_from.to_i : version_to - 1
version_to, version_from = version_from, version_to unless version_from < version_to
content_to = content.versions.find_by_version(version_to)
content_from = content.versions.find_by_version(version_from)
content_from = version_from ? content.versions.find_by_version(version_from.to_i) : content_to.try(:previous)
return nil unless content_to && content_from
if content_from.version > content_to.version
content_to, content_from = content_from, content_to
end
(content_to && content_from) ? WikiDiff.new(content_to, content_from) : nil
end
@@ -172,6 +174,21 @@ class WikiPage < ActiveRecord::Base
self.parent = parent_page
end
# Saves the page and its content if text was changed
def save_with_content
ret = nil
transaction do
if new_record?
# Rails automatically saves associated content
ret = save
else
ret = save && (content.text_changed? ? content.save : true)
end
raise ActiveRecord::Rollback unless ret
end
ret
end
protected
def validate_parent_title

View File

@@ -5,7 +5,7 @@
<table>
<tr>
<td align="right"><label for="username"><%=l(:field_login)%>:</label></td>
<td align="left"><%= text_field_tag 'username', nil, :tabindex => '1' %></td>
<td align="left"><%= text_field_tag 'username', params[:username], :tabindex => '1' %></td>
</tr>
<tr>
<td align="right"><label for="password"><%=l(:field_password)%>:</label></td>
@@ -36,7 +36,12 @@
</td>
</tr>
</table>
<%= javascript_tag "$('#username').focus();" %>
<% end %>
</div>
<%= call_hook :view_account_login_bottom %>
<% if params[:username].present? %>
<%= javascript_tag "$('#password').focus();" %>
<% else %>
<%= javascript_tag "$('#username').focus();" %>
<% end %>

View File

@@ -6,16 +6,14 @@
<p><%= link_to_attachment @attachment, :text => l(:button_download), :download => true -%>
<span class="size">(<%= number_to_human_size @attachment.filesize %>)</span></p>
</div>
<p>
<%= form_tag({}, :method => 'get') do %>
<label><%= l(:label_view_diff) %></label>
<%= select_tag 'type',
options_for_select(
[[l(:label_diff_inline), "inline"], [l(:label_diff_side_by_side), "sbs"]], @diff_type),
:onchange => "if (this.value != '') {this.form.submit()}" %>
<p>
<%= l(:label_view_diff) %>:
<label><%= radio_button_tag 'type', 'inline', @diff_type != 'sbs', :onchange => "this.form.submit()" %> <%= l(:label_diff_inline) %></label>
<label><%= radio_button_tag 'type', 'sbs', @diff_type == 'sbs', :onchange => "this.form.submit()" %> <%= l(:label_diff_side_by_side) %></label>
</p>
<% end %>
</p>
<%= render :partial => 'common/diff', :locals => {:diff => @diff, :diff_type => @diff_type} %>
<%= render :partial => 'common/diff', :locals => {:diff => @diff, :diff_type => @diff_type, :diff_style => nil} %>
<% html_title @attachment.filename %>

View File

@@ -1,6 +1,7 @@
<% diff = Redmine::UnifiedDiff.new(
diff, :type => diff_type,
:max_lines => Setting.diff_max_lines_displayed.to_i) -%>
:max_lines => Setting.diff_max_lines_displayed.to_i,
:style => diff_style) -%>
<% diff.each do |table_file| -%>
<div class="autoscroll">

View File

@@ -111,7 +111,7 @@
<li><%= bulk_update_custom_field_context_menu_link(field, text, value || text) %></li>
<% end %>
<% unless field.is_required? %>
<li><%= bulk_update_custom_field_context_menu_link(field, l(:label_none), '') %></li>
<li><%= bulk_update_custom_field_context_menu_link(field, l(:label_none), '__none__') %></li>
<% end %>
</ul>
</li>

View File

@@ -0,0 +1,9 @@
api.array @klass.name.underscore.pluralize do
@enumerations.each do |enumeration|
api.__send__ @klass.name.underscore do
api.id enumeration.id
api.name enumeration.name
api.is_default enumeration.is_default
end
end
end

View File

@@ -201,9 +201,10 @@
style += "width: #{width}px;"
style += "height: #{height}px;"
style += "font-size:0.7em;"
style += 'background:#f1f1f1;' if wday > 5
clss = "gantt_hdr"
clss << " nwday" if @gantt.non_working_week_days.include?(wday)
%>
<%= content_tag(:div, :style => style, :class => "gantt_hdr") do %>
<%= content_tag(:div, :style => style, :class => clss) do %>
<%= day_letter(wday) %>
<% end %>
<%

View File

@@ -1,5 +1,5 @@
<div class="contextual">
<%= link_to_if_authorized(l(:button_update), {:controller => 'issues', :action => 'edit', :id => @issue }, :onclick => 'showAndScrollTo("update", "notes"); return false;', :class => 'icon icon-edit', :accesskey => accesskey(:edit)) %>
<%= link_to_if_authorized(l(:button_update), {:controller => 'issues', :action => 'edit', :id => @issue }, :onclick => 'showAndScrollTo("update", "issue_notes"); return false;', :class => 'icon icon-edit', :accesskey => accesskey(:edit)) %>
<%= link_to l(:button_log_time), new_issue_time_entry_path(@issue), :class => 'icon icon-time-add' if User.current.allowed_to?(:log_time, @project) %>
<%= watcher_tag(@issue, User.current) %>
<%= link_to_if_authorized l(:button_copy), {:controller => 'issues', :action => 'new', :project_id => @project, :copy_from => @issue}, :class => 'icon icon-copy' %>

View File

@@ -2,7 +2,7 @@
<div class="splitcontent">
<div class="splitcontentleft">
<% if @issue.safe_attribute? 'status_id' %>
<% if @issue.safe_attribute?('status_id') && @allowed_statuses.present? %>
<p><%= f.select :status_id, (@allowed_statuses.collect {|p| [p.name, p.id]}), {:required => true},
:onchange => "updateIssueFrom('#{escape_javascript project_issue_form_path(@project, :id => @issue, :format => 'js')}')" %></p>
@@ -43,7 +43,7 @@
<div class="splitcontentright">
<% if @issue.safe_attribute? 'parent_issue_id' %>
<p id="parent_issue"><%= f.text_field :parent_issue_id, :size => 10, :required => @issue.required_attribute?('parent_issue_id') %></p>
<%= javascript_tag "observeAutocompleteField('issue_parent_issue_id', '#{escape_javascript auto_complete_issues_path(:project_id => @issue.project)}')" %>
<%= javascript_tag "observeAutocompleteField('issue_parent_issue_id', '#{escape_javascript auto_complete_issues_path}')" %>
<% end %>
<% if @issue.safe_attribute? 'start_date' %>

View File

@@ -18,7 +18,7 @@
</div>
<p>
<label><%= radio_button_tag 'conflict_resolution', 'overwrite' %> <%= l(:text_issue_conflict_resolution_overwrite) %></label><br />
<% if @notes.present? %>
<% if @issue.notes.present? %>
<label><%= radio_button_tag 'conflict_resolution', 'add_notes' %> <%= l(:text_issue_conflict_resolution_add_notes) %></label><br />
<% end %>
<label><%= radio_button_tag 'conflict_resolution', 'cancel' %> <%= l(:text_issue_conflict_resolution_cancel, :link => link_to_issue(@issue, :subject => false)).html_safe %></label>

View File

@@ -27,11 +27,18 @@
<% end %>
<fieldset><legend><%= l(:field_notes) %></legend>
<%= text_area_tag 'notes', @notes, :cols => 60, :rows => 10, :class => 'wiki-edit' %>
<%= wikitoolbar_for 'notes' %>
<%= call_hook(:view_issues_edit_notes_bottom, { :issue => @issue, :notes => @notes, :form => f }) %>
<%= f.text_area :notes, :cols => 60, :rows => 10, :class => 'wiki-edit', :no_label => true %>
<%= wikitoolbar_for 'issue_notes' %>
<p><%=l(:label_attachment_plural)%><br /><%= render :partial => 'attachments/form', :locals => {:container => @issue} %></p>
<% if @issue.safe_attribute? 'private_notes' %>
<label for="issue_private_notes"><%= f.check_box :private_notes, :no_label => true %> <%= l(:field_private_notes) %></label>
<% end %>
<%= call_hook(:view_issues_edit_notes_bottom, { :issue => @issue, :notes => @notes, :form => f }) %>
</fieldset>
<fieldset><legend><%= l(:label_attachment_plural) %></legend>
<p><%= render :partial => 'attachments/form', :locals => {:container => @issue} %></p>
</fieldset>
</div>

View File

@@ -18,7 +18,7 @@
<% end %>
<% if @issue.safe_attribute? 'subject' %>
<p><%= f.text_field :subject, :size => 80, :required => true %></p>
<p><%= f.text_field :subject, :size => 80, :maxlength => 255, :required => true %></p>
<% end %>
<% if @issue.safe_attribute? 'description' %>

View File

@@ -2,25 +2,30 @@
<%= hidden_field_tag 'back_url', url_for(params), :id => nil %>
<div class="autoscroll">
<table class="list issues">
<thead><tr>
<th class="checkbox hide-when-print"><%= link_to image_tag('toggle_check.png'), {}, :onclick => 'toggleIssuesSelection(this); return false;',
:title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}" %>
</th>
<%= sort_header_tag('id', :caption => '#', :default_order => 'desc') %>
<% query.columns.each do |column| %>
<%= column_header(column) %>
<% end %>
</tr></thead>
<thead>
<tr>
<th class="checkbox hide-when-print">
<%= link_to image_tag('toggle_check.png'), {},
:onclick => 'toggleIssuesSelection(this); return false;',
:title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}" %>
</th>
<%= sort_header_tag('id', :caption => '#', :default_order => 'desc') %>
<% query.inline_columns.each do |column| %>
<%= column_header(column) %>
<% end %>
</tr>
</thead>
<% previous_group = false %>
<tbody>
<% issue_list(issues) do |issue, level| -%>
<% if @query.grouped? && (group = @query.group_by_column.value(issue)) != previous_group %>
<% reset_cycle %>
<tr class="group open">
<td colspan="<%= query.columns.size + 2 %>">
<td colspan="<%= query.inline_columns.size + 2 %>">
<span class="expander" onclick="toggleRowGroup(this);">&nbsp;</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') %>
<%= 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>
<% previous_group = group %>
@@ -28,8 +33,15 @@
<tr id="issue-<%= issue.id %>" class="hascontextmenu <%= cycle('odd', 'even') %> <%= issue.css_classes %> <%= level > 0 ? "idnt idnt-#{level}" : nil %>">
<td class="checkbox hide-when-print"><%= check_box_tag("ids[]", issue.id, false, :id => nil) %></td>
<td class="id"><%= link_to issue.id, issue_path(issue) %></td>
<%= raw query.columns.map {|column| "<td class=\"#{column.css_classes}\">#{column_content(column, issue)}</td>"}.join %>
<%= raw query.inline_columns.map {|column| "<td class=\"#{column.css_classes}\">#{column_content(column, issue)}</td>"}.join %>
</tr>
<% @query.block_columns.each do |column|
if (text = column_content(column, issue)) && text.present? -%>
<tr class="<%= current_cycle %>">
<td colspan="<%= @query.inline_columns.size + 2 %>" class="<%= column.css_classes %>"><%= text %></td>
</tr>
<% end -%>
<% end -%>
<% end -%>
</tbody>
</table>

View File

@@ -1 +1 @@
$('#content').html('<%= escape_javascript(render :template => 'issues/bulk_edit.html') %>');
$('#content').html('<%= escape_javascript(render :template => 'issues/bulk_edit', :formats => [:html]) %>');

View File

@@ -34,6 +34,10 @@
@query.group_by)
) %></td>
</tr>
<tr>
<td><%= l(:button_show) %></td>
<td><%= available_block_columns_tags(@query) %></td>
</tr>
</table>
</div>
</fieldset>
@@ -73,7 +77,7 @@
<label><%= radio_button_tag 'columns', 'all' %> <%= l(:description_all_columns) %></label>
</p>
<p>
<label><%= check_box_tag 'description', '1' %> <%= l(:field_description) %></label>
<label><%= check_box_tag 'description', '1', @query.has_column?(:description) %> <%= l(:field_description) %></label>
</p>
<p class="buttons">
<%= submit_tag l(:button_export), :name => nil, :onclick => "hideModal(this);" %>

View File

@@ -48,7 +48,7 @@ api.issue do
end if include_in_api_response?('changesets') && User.current.allowed_to?(:view_changesets, @project)
api.array :journals do
@issue.journals.each do |journal|
@journals.each do |journal|
api.journal :id => journal.id do
api.user(:id => journal.user_id, :name => journal.user.name) unless journal.user.nil?
api.notes journal.notes

View File

@@ -71,6 +71,7 @@ end %>
<% if @issue.description? || @issue.attachments.any? -%>
<hr />
<% if @issue.description? %>
<div class="description">
<div class="contextual">
<%= link_to l(:button_quote),
{:controller => 'journals', :action => 'new', :id => @issue},
@@ -83,6 +84,7 @@ end %>
<div class="wiki">
<%= textilizable @issue, :description, :attachments => @issue.attachments %>
</div>
</div>
<% end %>
<%= link_to_attachments @issue, :thumbnails => true %>
<% end -%>
@@ -93,7 +95,7 @@ end %>
<hr />
<div id="issue_tree">
<div class="contextual">
<%= link_to(l(:button_add), {:controller => 'issues', :action => 'new', :project_id => @project, :issue => {:parent_issue_id => @issue}}) if User.current.allowed_to?(:manage_subtasks, @project) %>
<%= link_to_new_subtask(@issue) if User.current.allowed_to?(:manage_subtasks, @project) %>
</div>
<p><strong><%=l(:label_subtask_plural)%></strong></p>
<%= render_descendants_tree(@issue) unless @issue.leaf? %>

View File

@@ -1,3 +1,10 @@
$('#notes').val("<%= raw escape_javascript(@content) %>");
$('#issue_notes').val("<%= raw escape_javascript(@content) %>");
<%
# when quoting a private journal, check the private checkbox
if @journal && @journal.private_notes?
%>
$('#issue_private_notes').attr('checked', true);
<% end %>
showAndScrollTo("update", "notes");
$('#notes').scrollTop = $('#notes').scrollHeight - $('#notes').clientHeight;

View File

@@ -18,6 +18,7 @@
<body class="<%=h body_css_classes %>">
<div id="wrapper">
<div id="wrapper2">
<div id="wrapper3">
<div id="top-menu">
<div id="account">
<%= render_menu :account_menu -%>
@@ -62,6 +63,7 @@
<div style="clear:both;"></div>
</div>
</div>
</div>
<div id="ajax-indicator" style="display:none;"><span><%= l(:label_loading) %></span></div>
<div id="ajax-modal" style="display:none;"></div>

View File

@@ -3,7 +3,7 @@
<%= labelled_form_for @news, :html => { :id => 'news-form', :multipart => true, :method => :put } do |f| %>
<%= render :partial => 'form', :locals => { :f => f } %>
<%= submit_tag l(:button_save) %>
<%= preview_link preview_news_path(:project_id => @project), 'news-form' %>
<%= preview_link preview_news_path(:project_id => @project, :id => @news), 'news-form' %>
<% end %>
<div id="preview" class="wiki"></div>

View File

@@ -16,7 +16,7 @@
:html => { :id => 'news-form', :multipart => true, :method => :put } do |f| %>
<%= render :partial => 'form', :locals => { :f => f } %>
<%= submit_tag l(:button_save) %>
<%= preview_link preview_news_path(:project_id => @project), 'news-form' %> |
<%= preview_link preview_news_path(:project_id => @project, :id => @news), 'news-form' %> |
<%= link_to l(:button_cancel), "#", :onclick => '$("#edit-news").hide(); return false;' %>
<% end %>
<div id="preview" class="wiki"></div>

View File

@@ -4,7 +4,7 @@
<%= label_tag "available_columns", l(:description_available_columns) %>
<br />
<%= select_tag 'available_columns',
options_for_select((query.available_columns - query.columns).collect {|column| [column.caption, column.name]}),
options_for_select((query.available_inline_columns - query.columns).collect {|column| [column.caption, column.name]}),
:multiple => true, :size => 10, :style => "width:150px",
:ondblclick => "moveOptions(this.form.available_columns, this.form.selected_columns);" %>
</td>
@@ -18,7 +18,7 @@
<%= label_tag "selected_columns", l(:description_selected_columns) %>
<br />
<%= select_tag((defined?(tag_name) ? tag_name : 'c[]'),
options_for_select(query.columns.collect {|column| [column.caption, column.name]}),
options_for_select(query.inline_columns.collect {|column| [column.caption, column.name]}),
:id => 'selected_columns', :multiple => true, :size => 10, :style => "width:150px",
:ondblclick => "moveOptions(this.form.selected_columns, this.form.available_columns);") %>
</td>

View File

@@ -3,6 +3,7 @@ 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) %>;
var allProjects = <%= raw query.all_projects_values.to_json %>;
$(document).ready(function(){
initFilters();
<% query.filters.each do |field, options| %>

View File

@@ -21,6 +21,9 @@
<p><label for="query_group_by"><%= l(:field_group_by) %></label>
<%= select 'query', 'group_by', @query.groupable_columns.collect {|c| [c.caption, c.name.to_s]}, :include_blank => true %></p>
<p><label><%= l(:button_show) %></label>
<%= available_block_columns_tags(@query) %></p>
</div>
<fieldset id="filters"><legend><%= l(:label_filter_plural) %></legend>

View File

@@ -6,16 +6,14 @@
: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>
<%= select_tag 'type',
options_for_select(
[[l(:label_diff_inline), "inline"], [l(:label_diff_side_by_side), "sbs"]], @diff_type),
:onchange => "if (this.value != '') {this.form.submit()}" %>
<%= l(:label_view_diff) %>:
<label><%= radio_button_tag 'type', 'inline', @diff_type != 'sbs', :onchange => "this.form.submit()" %> <%= l(:label_diff_inline) %></label>
<label><%= radio_button_tag 'type', 'sbs', @diff_type == 'sbs', :onchange => "this.form.submit()" %> <%= l(:label_diff_side_by_side) %></label>
</p>
<% end %>
<% cache(@cache_key) do -%>
<%= render :partial => 'common/diff', :locals => {:diff => @diff, :diff_type => @diff_type} %>
<%= render :partial => 'common/diff', :locals => {:diff => @diff, :diff_type => @diff_type, :diff_style => @repository.class.scm_name} %>
<% end -%>
<% other_formats_links do |f| %>

View File

@@ -1 +1 @@
$('#content').html('<%= escape_javascript(render :template => 'repositories/new.html') %>');
$('#content').html('<%= escape_javascript(render :template => 'repositories/new', :formats => [:html]) %>');

View File

@@ -4,7 +4,7 @@
:repository_id => @repository.identifier_param},
:method => :get
) do %>
<%= l(:label_revision) %>: <%= text_field_tag 'rev', @rev, :size => 8 %>
<%= l(:label_revision) %>: <%= text_field_tag 'rev', nil, :size => 8 %>
<%= submit_tag 'OK' %>
<% end %>
</div>

View File

@@ -0,0 +1,9 @@
api.role do
api.id @role.id
api.name @role.name
api.array :permissions do
@role.permissions.each do |perm|
api.permission(perm.to_s)
end
end
end

View File

@@ -3,6 +3,8 @@
<div class="box tabular settings">
<p><%= setting_check_box :cross_project_issue_relations %></p>
<p><%= setting_select :cross_project_subtasks, cross_project_subtasks_options %></p>
<p><%= setting_check_box :issue_group_assignment %></p>
<p><%= setting_check_box :default_issue_start_date_to_creation_date %></p>
@@ -11,6 +13,8 @@
<p><%= setting_select :issue_done_ratio, Issue::DONE_RATIO_OPTIONS.collect {|i| [l("setting_issue_done_ratio_#{i}"), i]} %></p>
<p><%= setting_multiselect :non_working_week_days, (1..7).map {|d| [day_name(d), d.to_s]}, :inline => true %></p>
<p><%= setting_text_field :issues_export_limit, :size => 6 %></p>
<p><%= setting_text_field :gantt_items_limit, :size => 6 %></p>

View File

@@ -12,7 +12,7 @@
<p><%= f.text_field :issue_id, :size => 6 %> <em><%= h("#{@time_entry.issue.tracker.name} ##{@time_entry.issue.id}: #{@time_entry.issue.subject}") if @time_entry.issue %></em></p>
<p><%= f.text_field :spent_on, :size => 10, :required => true %><%= calendar_for('time_entry_spent_on') %></p>
<p><%= f.text_field :hours, :size => 6, :required => true %></p>
<p><%= f.text_field :comments, :size => 100 %></p>
<p><%= f.text_field :comments, :size => 100, :maxlength => 255 %></p>
<p><%= f.select :activity_id, activity_collection_for_select_options(@time_entry), :required => true %></p>
<% @time_entry.custom_field_values.each do |value| %>
<p><%= custom_field_tag_with_label :time_entry, value %></p>

View File

@@ -36,7 +36,7 @@
</tr></thead>
<tbody>
<% for user in @users -%>
<tr class="user <%= cycle("odd", "even") %> <%= %w(anon active registered locked)[user.status] %>">
<tr class="<%= user.css_classes %> <%= cycle("odd", "even") %>">
<td class="username"><%= avatar(user, :size => "14") %><%= link_to h(user.login), edit_user_path(user) %></td>
<td class="firstname"><%= h(user.firstname) %></td>
<td class="lastname"><%= h(user.lastname) %></td>

View File

@@ -14,12 +14,11 @@
<% counts.each do |count| %>
<tr>
<td width="130px" align="right" >
<%= link_to h(count[:group]), {:controller => 'issues',
:action => 'index',
:project_id => version.project,
:set_filter => 1,
:status_id => '*',
:fixed_version_id => version}.merge("#{criteria}_id".to_sym => count[:group]) %>
<% if count[:group] -%>
<%= link_to(h(count[:group]), project_issues_path(version.project, :set_filter => 1, :status_id => '*', :fixed_version_id => version, "#{criteria}_id" => count[:group])) %>
<% else -%>
<%= link_to(l(:label_none), project_issues_path(version.project, :set_filter => 1, :status_id => '*', :fixed_version_id => version, "#{criteria}_id" => "!*")) %>
<% end %>
</td>
<td width="240px">
<%= progress_bar((count[:closed].to_f / count[:total])*100,

View File

@@ -28,12 +28,15 @@
<td class="updated_on"><%= format_time(ver.updated_on) %></td>
<td class="author"><%= link_to_user ver.author %></td>
<td class="comments"><%=h ver.comments %></td>
<td class="buttons"><%= link_to l(:button_annotate), :action => 'annotate', :id => @page.title, :version => ver.version %></td>
<td class="buttons">
<%= link_to l(:button_annotate), :action => 'annotate', :id => @page.title, :version => ver.version %>
<%= delete_link wiki_page_path(@page, :version => ver.version) if User.current.allowed_to?(:delete_wiki_pages, @page.project) && @version_count > 1 %>
</td>
</tr>
<% line_num += 1 %>
<% end %>
</tbody>
</table>
<%= submit_tag l(:label_view_diff), :class => 'small' if show_diff %>
<span class="pagination"><%= pagination_links_full @version_pages, @version_count, :page_param => :p %></span>
<span class="pagination"><%= pagination_links_full @version_pages, @version_count %></span>
<% end %>

View File

@@ -0,0 +1,13 @@
api.array :wiki_pages do
@pages.each do |page|
api.wiki_page do
api.title page.title
if page.parent
api.parent :title => page.parent.title
end
api.version page.version
api.created_on page.created_on
api.updated_on page.updated_on
end
end
end

View File

@@ -0,0 +1,18 @@
api.wiki_page do
api.title @page.title
if @page.parent
api.parent :title => @page.parent.title
end
api.text @content.text
api.version @content.version
api.author(:id => @content.author_id, :name => @content.author.name)
api.comments @page.content.comments
api.created_on @page.created_on
api.updated_on @content.updated_on
api.array :attachments do
@page.attachments.each do |attachment|
render_api_attachment(attachment, api)
end
end if include_in_api_response?('attachments')
end

View File

@@ -1,12 +1,15 @@
<div class="contextual">
<% if @editable %>
<%= link_to_if_authorized(l(:button_edit), {:action => 'edit', :id => @page.title}, :class => 'icon icon-edit', :accesskey => accesskey(:edit)) if @content.current_version? %>
<%= watcher_tag(@page, User.current) %>
<%= link_to_if_authorized(l(:button_lock), {:action => 'protect', :id => @page.title, :protected => 1}, :method => :post, :class => 'icon icon-lock') if !@page.protected? %>
<%= link_to_if_authorized(l(:button_unlock), {:action => 'protect', :id => @page.title, :protected => 0}, :method => :post, :class => 'icon icon-unlock') if @page.protected? %>
<%= link_to_if_authorized(l(:button_rename), {:action => 'rename', :id => @page.title}, :class => 'icon icon-move') if @content.current_version? %>
<%= link_to_if_authorized(l(:button_delete), {:action => 'destroy', :id => @page.title}, :method => :delete, :data => {:confirm => l(:text_are_you_sure)}, :class => 'icon icon-del') %>
<%= link_to_if_authorized(l(:button_rollback), {:action => 'edit', :id => @page.title, :version => @content.version }, :class => 'icon icon-cancel') unless @content.current_version? %>
<% if @content.current_version? %>
<%= link_to_if_authorized(l(:button_edit), {:action => 'edit', :id => @page.title}, :class => 'icon icon-edit', :accesskey => accesskey(:edit)) %>
<%= watcher_tag(@page, User.current) %>
<%= link_to_if_authorized(l(:button_lock), {:action => 'protect', :id => @page.title, :protected => 1}, :method => :post, :class => 'icon icon-lock') if !@page.protected? %>
<%= link_to_if_authorized(l(:button_unlock), {:action => 'protect', :id => @page.title, :protected => 0}, :method => :post, :class => 'icon icon-unlock') if @page.protected? %>
<%= link_to_if_authorized(l(:button_rename), {:action => 'rename', :id => @page.title}, :class => 'icon icon-move') %>
<%= link_to_if_authorized(l(:button_delete), {:action => 'destroy', :id => @page.title}, :method => :delete, :data => {:confirm => l(:text_are_you_sure)}, :class => 'icon icon-del') %>
<% else %>
<%= link_to_if_authorized(l(:button_rollback), {:action => 'edit', :id => @page.title, :version => @content.version }, :class => 'icon icon-cancel') %>
<% end %>
<% end %>
<%= link_to_if_authorized(l(:label_history), {:action => 'history', :id => @page.title}, :class => 'icon icon-history') %>
</div>
@@ -17,15 +20,15 @@
<p>
<%= link_to(("\xc2\xab " + l(:label_previous)),
:action => 'show', :id => @page.title, :project_id => @page.project,
:version => (@content.version - 1)) + " - " if @content.version > 1 %>
:version => @content.previous.version) + " - " if @content.previous %>
<%= "#{l(:label_version)} #{@content.version}/#{@page.content.version}" %>
<%= '('.html_safe + link_to(l(:label_diff), :controller => 'wiki', :action => 'diff',
:id => @page.title, :project_id => @page.project,
:version => @content.version) + ')'.html_safe if @content.version > 1 %> -
:version => @content.version) + ')'.html_safe if @content.previous %> -
<%= link_to((l(:label_next) + " \xc2\xbb"), :action => 'show',
:id => @page.title, :project_id => @page.project,
:version => (@content.version + 1)) + " - " if @content.version < @page.content.version %>
<%= link_to(l(:label_current_version), :action => 'show', :id => @page.title, :project_id => @page.project) %>
:version => @content.next.version) + " - " if @content.next %>
<%= link_to(l(:label_current_version), :action => 'show', :id => @page.title, :project_id => @page.project, :version => nil) %>
<br />
<em><%= @content.author ? link_to_user(@content.author) : l(:label_user_anonymous)
%>, <%= format_time(@content.updated_on) %> </em><br />

View File

@@ -50,6 +50,9 @@ module RedmineApp
config.action_mailer.perform_deliveries = false
# Do not include all helpers
config.action_controller.include_all_helpers = false
config.session_store :cookie_store, :key => '_redmine_session'
if File.exists?(File.join(File.dirname(__FILE__), 'additional_environment.rb'))

View File

@@ -166,6 +166,28 @@ default:
# the ImageMagick's `convert` binary. Used to generate attachment thumbnails.
#imagemagick_convert_command:
# Configuration of RMagcik font.
#
# Redmine uses RMagcik in order to export gantt png.
# You don't need this setting if you don't install RMagcik.
#
# In CJK (Chinese, Japanese and Korean),
# in order to show CJK characters correctly,
# you need to set this configuration.
#
# Because there is no standard font across platforms in CJK,
# you need to set a font installed in your server.
#
# This setting is not necessary in non CJK.
#
# Examples for Japanese:
# Windows:
# rmagick_font_path: C:\windows\fonts\msgothic.ttc
# Linux:
# rmagick_font_path: /usr/share/fonts/ipa-mincho/ipam.ttf
#
rmagick_font_path:
# specific configuration options for production environment
# that overrides the default ones
production:

View File

@@ -7,7 +7,7 @@ production:
database: redmine
host: localhost
username: root
password:
password: ""
encoding: utf8
development:
@@ -15,7 +15,7 @@ development:
database: redmine_development
host: localhost
username: root
password:
password: ""
encoding: utf8
# Warning: The database defined as "test" will be erased and
@@ -26,7 +26,7 @@ test:
database: redmine_test
host: localhost
username: root
password:
password: ""
encoding: utf8
test_pgsql:

View File

@@ -125,6 +125,24 @@ ActionMailer::Base.add_delivery_method :async_smtp, DeliveryMethods::AsyncSMTP
ActionMailer::Base.add_delivery_method :async_sendmail, DeliveryMethods::AsyncSendmail
ActionMailer::Base.add_delivery_method :tmp_file, DeliveryMethods::TmpFile
# Changes how sent emails are logged
# Rails doesn't log cc and bcc which is misleading when using bcc only (#12090)
module ActionMailer
class LogSubscriber < ActiveSupport::LogSubscriber
def deliver(event)
recipients = [:to, :cc, :bcc].inject("") do |s, header|
r = Array.wrap(event.payload[header])
if r.any?
s << "\n #{header}: #{r.join(', ')}"
end
s
end
info("\nSent email \"#{event.payload[:subject]}\" (%1.fms)#{recipients}" % event.duration)
debug(event.payload[:mail])
end
end
end
module ActionController
module MimeResponds
class Collector

View File

@@ -1,6 +1,5 @@
I18n.default_locale = 'en'
# Adds fallback to default locale for untranslated strings
I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks)
I18n.backend = Redmine::I18n::Backend.new
require 'redmine'

View File

@@ -899,7 +899,6 @@ ar:
text_subprojects_destroy_warning: "subproject(s): سيتم حذف أيضا."
text_workflow_edit: حدد دوراً وتعقب لتحرير سير العمل
text_are_you_sure: هل أنت متأكد؟
text_are_you_sure_with_children: "حذف الموضوع وجميع المسائل المتعلقة بالطفل؟"
text_journal_changed: "%{label} تغير %{old} الى %{new}"
text_journal_changed_no_detail: "%{label} تم التحديث"
text_journal_set_to: "%{label} تغير الى %{value}"
@@ -1063,3 +1062,22 @@ ar:
label_attribute_of_assigned_to: Assignee's %{name}
label_attribute_of_fixed_version: Target version's %{name}
label_copy_subtasks: Copy subtasks
label_copied_to: copied to
label_copied_from: copied from
label_any_issues_in_project: any issues in project
label_any_issues_not_in_project: any issues not in project
field_private_notes: Private notes
permission_view_private_notes: View private notes
permission_set_notes_private: Set notes as private
label_no_issues_in_project: no issues in project
label_any: جميع
label_last_n_weeks: last %{count} weeks
setting_cross_project_subtasks: Allow cross-project subtasks
label_cross_project_descendants: يشارك
label_cross_project_tree: مع شجرة المشروع
label_cross_project_hierarchy: مع التسلسل الهرمي للمشروع
label_cross_project_system: مع جميع المشاريع
button_hide: Hide
setting_non_working_week_days: Non-working days
label_in_the_next_days: in the next
label_in_the_past_days: in the past

View File

@@ -332,6 +332,7 @@ bg:
field_core_fields: Стандартни полета
field_timeout: Таймаут (в секунди)
field_board_parent: Родителски форум
field_private_notes: Лични бележки
setting_app_title: Заглавие
setting_app_subtitle: Описание
@@ -357,6 +358,7 @@ bg:
setting_date_format: Формат на датата
setting_time_format: Формат на часа
setting_cross_project_issue_relations: Релации на задачи между проекти
setting_cross_project_subtasks: Подзадачи от други проекти
setting_issue_list_default_columns: Показвани колони по подразбиране
setting_repositories_encodings: Кодова таблица на прикачените файлове и хранилищата
setting_emails_header: Emails header
@@ -398,6 +400,7 @@ bg:
setting_session_timeout: Таймаут за неактивност преди прекратяване на сесиите
setting_thumbnails_enabled: Показване на миниатюри на прикачените изображения
setting_thumbnails_size: Размер на миниатюрите (в пиксели)
setting_non_working_week_days: Не работни дни
permission_add_project: Създаване на проект
permission_add_subprojects: Създаване на подпроекти
@@ -417,6 +420,8 @@ bg:
permission_add_issue_notes: Добавяне на бележки
permission_edit_issue_notes: Редактиране на бележки
permission_edit_own_issue_notes: Редактиране на собствени бележки
permission_view_private_notes: Разглеждане на лични бележки
permission_set_notes_private: Установяване на бележките лични
permission_move_issues: Преместване на задачи
permission_delete_issues: Изтриване на задачи
permission_manage_public_queries: Управление на публичните заявки
@@ -617,6 +622,7 @@ bg:
label_current_status: Текущо състояние
label_new_statuses_allowed: Позволени състояния
label_all: всички
label_any: която и да е
label_none: никакви
label_nobody: никой
label_next: Следващ
@@ -651,6 +657,8 @@ bg:
label_not_equals: не е
label_in_less_than: след по-малко от
label_in_more_than: след повече от
label_in_the_next_days: в следващите
label_in_the_past_days: в предишните
label_greater_or_equal: ">="
label_less_or_equal: <=
label_between: между
@@ -660,6 +668,7 @@ bg:
label_yesterday: вчера
label_this_week: тази седмица
label_last_week: последната седмица
label_last_n_weeks: последните %{count} седмици
label_last_n_days: "последните %{count} дни"
label_this_month: текущия месец
label_last_month: последния месец
@@ -670,6 +679,9 @@ bg:
label_ago: преди
label_contains: съдържа
label_not_contains: не съдържа
label_any_issues_in_project: задачи от проект
label_any_issues_not_in_project: задачи, които не са в проект
label_no_issues_in_project: никакви задачи в проект
label_day_plural: дни
label_repository: Хранилище
label_repository_new: Ново хранилище
@@ -745,6 +757,8 @@ bg:
label_blocked_by: блокирана от
label_precedes: предшества
label_follows: изпълнява се след
label_copied_to: копирана в
label_copied_from: копирана от
label_end_to_start: край към начало
label_end_to_end: край към край
label_start_to_start: начало към начало
@@ -819,7 +833,7 @@ bg:
label_generate_key: Генериране на ключ
label_issue_watchers: Наблюдатели
label_example: Пример
label_display: Display
label_display: Показване
label_sort: Сортиране
label_ascending: Нарастващ
label_descending: Намаляващ
@@ -872,9 +886,13 @@ bg:
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_cross_project_descendants: С подпроекти
label_cross_project_tree: С дърво на проектите
label_cross_project_hierarchy: С проектна йерархия
label_cross_project_system: С всички проекти
button_login: Вход
button_submit: Прикачване
button_submit: Изпращане
button_save: Запис
button_check_all: Избор на всички
button_uncheck_all: Изчистване на всички
@@ -919,6 +937,7 @@ bg:
button_quote: Цитат
button_duplicate: Дублиране
button_show: Показване
button_hide: Скриване
button_edit_section: Редактиране на тази секция
button_export: Експорт
button_delete_my_account: Премахване на моя профил
@@ -946,7 +965,6 @@ bg:
text_subprojects_destroy_warning: "Неговите подпроекти: %{value} също ще бъдат изтрити."
text_workflow_edit: Изберете роля и тракер за да редактирате работния процес
text_are_you_sure: Сигурни ли сте?
text_are_you_sure_with_children: Изтриване на задачата и нейните подзадачи?
text_journal_changed: "%{label} променен от %{old} на %{new}"
text_journal_changed_no_detail: "%{label} променен"
text_journal_set_to: "%{label} установен на %{value}"

View File

@@ -933,7 +933,6 @@ bs:
project_module_gantt: Gantt
project_module_calendar: Calendar
button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}"
text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field
label_user_mail_option_only_owner: Only for things I am the owner of
setting_default_notification_option: Default notification option
@@ -1076,3 +1075,22 @@ bs:
label_attribute_of_assigned_to: Assignee's %{name}
label_attribute_of_fixed_version: Target version's %{name}
label_copy_subtasks: Copy subtasks
label_copied_to: copied to
label_copied_from: copied from
label_any_issues_in_project: any issues in project
label_any_issues_not_in_project: any issues not in project
field_private_notes: Private notes
permission_view_private_notes: View private notes
permission_set_notes_private: Set notes as private
label_no_issues_in_project: no issues in project
label_any: sve
label_last_n_weeks: last %{count} weeks
setting_cross_project_subtasks: Allow cross-project subtasks
label_cross_project_descendants: With subprojects
label_cross_project_tree: With project tree
label_cross_project_hierarchy: With project hierarchy
label_cross_project_system: With all projects
button_hide: Hide
setting_non_working_week_days: Non-working days
label_in_the_next_days: in the next
label_in_the_past_days: in the past

View File

@@ -922,7 +922,6 @@ ca:
enumeration_system_activity: Activitat del sistema
button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}"
text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field
label_user_mail_option_only_owner: Only for things I am the owner of
setting_default_notification_option: Default notification option
@@ -1065,3 +1064,22 @@ ca:
label_attribute_of_assigned_to: Assignee's %{name}
label_attribute_of_fixed_version: Target version's %{name}
label_copy_subtasks: Copy subtasks
label_copied_to: copied to
label_copied_from: copied from
label_any_issues_in_project: any issues in project
label_any_issues_not_in_project: any issues not in project
field_private_notes: Private notes
permission_view_private_notes: View private notes
permission_set_notes_private: Set notes as private
label_no_issues_in_project: no issues in project
label_any: tots
label_last_n_weeks: last %{count} weeks
setting_cross_project_subtasks: Allow cross-project subtasks
label_cross_project_descendants: "Amb tots els subprojectes"
label_cross_project_tree: "Amb l'arbre del projecte"
label_cross_project_hierarchy: "Amb la jerarquia del projecte"
label_cross_project_system: "Amb tots els projectes"
button_hide: Hide
setting_non_working_week_days: Non-working days
label_in_the_next_days: in the next
label_in_the_past_days: in the past

View File

@@ -1,3 +1,4 @@
# Update to 2.2 by Karel Picman <karel.picman@kontron.com>
# Update to 1.1 by Michal Gebauer <mishak@mishak.net>
# Updated by Josef Liška <jl@chl.cz>
# CZ translation by Maxim Krušina | Massimo Filippi, s.r.o. | maxim@mxm.cz
@@ -140,7 +141,7 @@ cs:
general_text_Yes: 'Ano'
general_text_no: 'ne'
general_text_yes: 'ano'
general_lang_name: 'Čeština'
general_lang_name: 'Czech (Čeština)'
general_csv_separator: ','
general_csv_decimal_separator: '.'
general_csv_encoding: UTF-8
@@ -863,7 +864,6 @@ cs:
text_subprojects_destroy_warning: "Jeho podprojek(y): %{value} budou také smazány."
text_workflow_edit: Vyberte roli a frontu k editaci průběhu práce
text_are_you_sure: Jste si jisti?
text_are_you_sure_with_children: Smazat úkol včetně všech podúkolů?
text_journal_changed: "%{label} změněn z %{old} na %{new}"
text_journal_set_to: "%{label} nastaven na %{value}"
text_journal_deleted: "%{label} smazán (%{old})"
@@ -942,127 +942,146 @@ cs:
enumeration_activities: Aktivity (sledování času)
enumeration_system_activity: Systémová aktivita
field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
label_my_queries: My custom queries
text_journal_changed_no_detail: "%{label} updated"
label_news_comment_added: Comment added to a news
button_expand_all: Expand all
button_collapse_all: Collapse all
label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee
label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author
label_bulk_edit_selected_time_entries: Bulk edit selected time entries
text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)?
label_role_anonymous: Anonymous
label_role_non_member: Non member
label_issue_note_added: Note added
label_issue_status_updated: Status updated
label_issue_priority_updated: Priority updated
label_issues_visibility_own: Issues created by or assigned to the user
field_issues_visibility: Issues visibility
label_issues_visibility_all: All issues
permission_set_own_issues_private: Set own issues public or private
field_is_private: Private
permission_set_issues_private: Set issues public or private
label_issues_visibility_public: All non private issues
text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s).
field_warn_on_leaving_unsaved: Varuj mě před opuštěním stránky s neuloženým textem
text_warn_on_leaving_unsaved: Aktuální stránka obsahuje neuložený text, který bude ztracen, když opustíte stránku.
label_my_queries: Moje vlastní dotazy
text_journal_changed_no_detail: "%{label} aktualizován"
label_news_comment_added: K novince byl přidán komentář
button_expand_all: Rozbal vše
button_collapse_all: Sbal vše
label_additional_workflow_transitions_for_assignee: Další změna stavu povolena, jestliže je uživatel přiřazen
label_additional_workflow_transitions_for_author: Další změna stavu povolena, jestliže je uživatel autorem
label_bulk_edit_selected_time_entries: Hromadná změna záznamů času
text_time_entries_destroy_confirmation: Jste si jistí, že chcete smazat vybraný záznam(y) času?
label_role_anonymous: Anonym
label_role_non_member: Není členem
label_issue_note_added: Přidána poznámka
label_issue_status_updated: Aktualizován stav
label_issue_priority_updated: Aktualizována priorita
label_issues_visibility_own: Úkol vytvořen nebo přiřazen uživatel(i/em)
field_issues_visibility: Viditelnost úkolů
label_issues_visibility_all: Všechny úkoly
permission_set_own_issues_private: Nastavit vlastní úkoly jako veřejné nebo soukromé
field_is_private: Soukromý
permission_set_issues_private: Nastavit úkoly jako veřejné nebo soukromé
label_issues_visibility_public: Všechny úkoly, které nejsou soukromé
text_issues_destroy_descendants_confirmation: "%{count} podúkol(ů) bude rovněž smazán(o)."
field_commit_logs_encoding: Kódování zpráv při commitu
field_scm_path_encoding: Path encoding
text_scm_path_encoding_note: "Default: UTF-8"
field_path_to_repository: Path to repository
field_root_directory: Root directory
field_cvs_module: Module
field_scm_path_encoding: Kódování cesty SCM
text_scm_path_encoding_note: "Výchozí: UTF-8"
field_path_to_repository: Cesta k repositáři
field_root_directory: Kořenový adresář
field_cvs_module: Modul
field_cvsroot: CVSROOT
text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo)
text_scm_command: Command
text_scm_command_version: Version
label_git_report_last_commit: Report last commit for files and directories
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 command is not available. Please check settings on the administration panel.
notice_issue_successful_create: Issue %{id} created.
label_between: between
setting_issue_group_assignment: Allow issue assignment to groups
label_diff: diff
text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo)
description_query_sort_criteria_direction: Sort direction
description_project_scope: Search scope
description_filter: Filter
description_user_mail_notification: Mail notification settings
description_date_from: Enter start date
description_message_content: Message content
description_available_columns: Available Columns
description_date_range_interval: Choose range by selecting start and end date
description_issue_category_reassign: Choose issue category
description_search: Searchfield
description_notes: Notes
description_date_range_list: Choose range from list
description_choose_project: Projects
description_date_to: Enter end date
description_query_sort_criteria_attribute: Sort attribute
description_wiki_subpages_reassign: Choose new parent page
description_selected_columns: Selected Columns
label_parent_revision: Parent
label_child_revision: Child
error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size.
setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues
button_edit_section: Edit this section
setting_repositories_encodings: Attachments and repositories encodings
description_all_columns: All Columns
text_mercurial_repository_note: Lokální repositář (např. /hgrepo, c:\hgrepo)
text_scm_command: Příkaz
text_scm_command_version: Verze
label_git_report_last_commit: Reportovat poslední commit pro soubory a adresáře
text_scm_config: Můžete si nastavit vaše SCM příkazy v config/configuration.yml. Restartujte, prosím, aplikaci po jejich úpravě.
text_scm_command_not_available: SCM příkaz není k dispozici. Zkontrolujte, prosím, nastavení v panelu Administrace.
notice_issue_successful_create: Úkol %{id} vytvořen.
label_between: mezi
setting_issue_group_assignment: Povolit přiřazení úkolu skupině
label_diff: rozdíl
text_git_repository_note: Repositář je "bare and local" (např. /gitrepo, c:\gitrepo)
description_query_sort_criteria_direction: Směr třídění
description_project_scope: Rozsah vyhledávání
description_filter: Filtr
description_user_mail_notification: Nastavení emailových notifikací
description_date_from: Zadejte počáteční datum
description_message_content: Obsah zprávy
description_available_columns: Dostupné sloupce
description_date_range_interval: Zvolte rozsah výběrem počátečního a koncového data
description_issue_category_reassign: Zvolte kategorii úkolu
description_search: Vyhledávací pole
description_notes: Poznámky
description_date_range_list: Zvolte rozsah ze seznamu
description_choose_project: Projekty
description_date_to: Zadejte datum
description_query_sort_criteria_attribute: Třídící atribut
description_wiki_subpages_reassign: Zvolte novou rodičovskou stránku
description_selected_columns: Vybraný sloupec
label_parent_revision: Rodič
label_child_revision: Potomek
error_scm_annotate_big_text_file: Vstup nemůže být anotován, protože překračuje povolenou velikost textového souboru
setting_default_issue_start_date_to_creation_date: Použij aktuální datum jako počáteční datum pro nové úkoly
button_edit_section: Uprav tuto sekci
setting_repositories_encodings: Kódování příloh a repositářů
description_all_columns: Všechny sloupce
button_export: Export
label_export_options: "%{export_format} export options"
error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size})
notice_failed_to_save_time_entries: "Failed to save %{count} time entrie(s) on %{total} selected: %{ids}."
label_export_options: "nastavení exportu %{export_format}"
error_attachment_too_big: Soubor nemůže být nahrán, protože jeho velikost je větší než maximum (%{max_size})
notice_failed_to_save_time_entries: "Chyba při ukládání %{count} časov(ých/ého) záznam(ů) z %{total} vybraného: %{ids}."
label_x_issues:
zero: 0 Úkol
one: 1 Úkol
other: "%{count} Úkoly"
label_repository_new: New repository
field_repository_is_default: Main repository
label_copy_attachments: Copy attachments
label_repository_new: Nový repositář
field_repository_is_default: Hlavní repositář
label_copy_attachments: Kopírovat přílohy
label_item_position: "%{position}/%{count}"
label_completed_versions: Completed versions
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: Multiple values
setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed
text_issue_conflict_resolution_add_notes: Add my notes and discard my other changes
text_issue_conflict_resolution_overwrite: Apply my changes anyway (previous notes will be kept but some changes may be overwritten)
notice_issue_update_conflict: The issue has been updated by an other user while you were editing it.
text_issue_conflict_resolution_cancel: Discard all my changes and redisplay %{link}
permission_manage_related_issues: Manage related issues
field_auth_source_ldap_filter: LDAP filter
label_search_for_watchers: Search for watchers to add
notice_account_deleted: Your account has been permanently deleted.
setting_unsubscribe: Allow users to delete their own account
button_delete_my_account: Delete my account
label_completed_versions: Dokončené verze
text_project_identifier_info: Jsou povolena pouze malá písmena (a-z), číslice, pomlčky a podtržítka.<br />Po uložení již nelze identifikátor měnit.
field_multiple: Více hodnot
setting_commit_cross_project_ref: Povolit reference a opravy úklů ze všech ostatních projektů
text_issue_conflict_resolution_add_notes: Přidat moje poznámky a zahodit ostatní změny
text_issue_conflict_resolution_overwrite: Přesto přijmout moje úpravy (předchozí poznámky budou zachovány, ale některé změny mohou být přepsány)
notice_issue_update_conflict: Během vašich úprav byl úkol aktualizován jiným uživatelem.
text_issue_conflict_resolution_cancel: Zahoď všechny moje změny a znovu zobraz %{link}
permission_manage_related_issues: Spravuj související úkoly
field_auth_source_ldap_filter: LDAP filtr
label_search_for_watchers: Hledej sledující pro přidání
notice_account_deleted: Váš účet byl trvale smazán.
setting_unsubscribe: Povolit uživatelům smazání jejich vlastního účtu
button_delete_my_account: Smazat můj účet
text_account_destroy_confirmation: |-
Are you sure you want to proceed?
Your account will be permanently deleted, with no way to reactivate it.
error_session_expired: Your session has expired. Please login again.
text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
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
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
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
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
Skutečně chcete pokračovat?
Váš účet bude nenávratně smazán.
error_session_expired: Vaše sezení vypršelo. Znovu se přihlaste, prosím.
text_session_expiration_settings: "Varování: změnou tohoto nastavení mohou vypršet aktuální sezení včetně toho vašeho."
setting_session_lifetime: Maximální čas sezení
setting_session_timeout: Vypršení sezení bez aktivity
label_session_expiration: Vypršení sezení
permission_close_project: Zavřít / Otevřít projekt
label_show_closed_projects: Zobrazit zavřené projekty
button_close: Zavřít
button_reopen: Znovu otevřít
project_status_active: aktiv
project_status_closed: zavřený
project_status_archived: archivovaný
text_project_closed: Tento projekt je uzevřený a je pouze pro čtení.
notice_user_successful_create: Uživatel %{id} vytvořen.
field_core_fields: Standardní pole
field_timeout: Vypršení (v sekundách)
setting_thumbnails_enabled: Zobrazit náhled přílohy
setting_thumbnails_size: Velikost náhledu (v pixelech)
label_status_transitions: Změna stavu
label_fields_permissions: Práva k polím
label_readonly: Pouze pro čtení
label_required: Vyžadováno
text_repository_identifier_info: Jou povoleny pouze malá písmena (a-z), číslice, pomlčky a podtržítka.<br />Po uložení již nelze identifikátor změnit.
field_board_parent: Rodičovské fórum
label_attribute_of_project: Projektové %{name}
label_attribute_of_author: Autorovo %{name}
label_attribute_of_assigned_to: "%{name} přiřazené(ho)"
label_attribute_of_fixed_version: Cílová verze %{name}
label_copy_subtasks: Kopírovat podúkoly
label_copied_to: zkopírováno do
label_copied_from: zkopírováno z
label_any_issues_in_project: jakékoli úkoly v projektu
label_any_issues_not_in_project: jakékoli úkoly mimo projektu
field_private_notes: Soukromé poznámky
permission_view_private_notes: Zobrazit soukromé poznámky
permission_set_notes_private: Nastavit poznámky jako soukromé
label_no_issues_in_project: žádné úkoly v projektu
label_any: vše
label_last_n_weeks: poslední %{count} týdny
setting_cross_project_subtasks: Povolit podúkoly napříč projekty
label_cross_project_descendants: S podprojekty
label_cross_project_tree: Se stromem projektu
label_cross_project_hierarchy: S hierarchií projektu
label_cross_project_system: Se všemi projekty
button_hide: Skrýt
setting_non_working_week_days: Dny pracovního volna/klidu
label_in_the_next_days: v přístích
label_in_the_past_days: v minulých

View File

@@ -936,7 +936,6 @@ da:
project_module_gantt: Gantt
project_module_calendar: Kalender
button_edit_associated_wikipage: "Redigér tilknyttet Wiki side: %{page_title}"
text_are_you_sure_with_children: Slet sag og alle undersager?
field_text: Tekstfelt
label_user_mail_option_only_owner: Kun for ting jeg er ejer af
setting_default_notification_option: Standardpåmindelsesmulighed
@@ -1080,3 +1079,22 @@ da:
label_attribute_of_assigned_to: Assignee's %{name}
label_attribute_of_fixed_version: Target version's %{name}
label_copy_subtasks: Copy subtasks
label_copied_to: copied to
label_copied_from: copied from
label_any_issues_in_project: any issues in project
label_any_issues_not_in_project: any issues not in project
field_private_notes: Private notes
permission_view_private_notes: View private notes
permission_set_notes_private: Set notes as private
label_no_issues_in_project: no issues in project
label_any: alle
label_last_n_weeks: last %{count} weeks
setting_cross_project_subtasks: Allow cross-project subtasks
label_cross_project_descendants: Med underprojekter
label_cross_project_tree: Med projekttræ
label_cross_project_hierarchy: Med projekthierarki
label_cross_project_system: Med alle projekter
button_hide: Hide
setting_non_working_week_days: Non-working days
label_in_the_next_days: in the next
label_in_the_past_days: in the past

View File

@@ -322,7 +322,7 @@ de:
setting_app_title: Applikations-Titel
setting_app_subtitle: Applikations-Untertitel
setting_welcome_text: Willkommenstext
setting_default_language: Default-Sprache
setting_default_language: Standardsprache
setting_login_required: Authentifizierung erforderlich
setting_self_registration: Anmeldung ermöglicht
setting_attachment_max_size: Max. Dateigröße
@@ -343,7 +343,7 @@ de:
setting_date_format: Datumsformat
setting_time_format: Zeitformat
setting_cross_project_issue_relations: Ticket-Beziehungen zwischen Projekten erlauben
setting_issue_list_default_columns: Default-Spalten in der Ticket-Auflistung
setting_issue_list_default_columns: Standard-Spalten in der Ticket-Auflistung
setting_emails_footer: E-Mail-Fußzeile
setting_protocol: Protokoll
setting_per_page_options: Objekte pro Seite
@@ -698,7 +698,7 @@ de:
label_blocks: Blockiert
label_blocked_by: Blockiert durch
label_precedes: Vorgänger von
label_follows: folgt
label_follows: Folgt
label_end_to_start: Ende - Anfang
label_end_to_end: Ende - Ende
label_start_to_start: Anfang - Anfang
@@ -860,7 +860,6 @@ de:
text_subprojects_destroy_warning: "Dessen Unterprojekte (%{value}) werden ebenfalls gelöscht."
text_workflow_edit: Workflow zum Bearbeiten auswählen
text_are_you_sure: Sind Sie sicher?
text_are_you_sure_with_children: "Lösche Aufgabe und alle Unteraufgaben?"
text_journal_changed: "%{label} wurde von %{old} zu %{new} geändert"
text_journal_set_to: "%{label} wurde auf %{value} gesetzt"
text_journal_deleted: "%{label} %{old} wurde gelöscht"
@@ -995,7 +994,7 @@ de:
notice_issue_successful_create: Ticket %{id} erstellt.
label_between: zwischen
setting_issue_group_assignment: Erlaubt die Ticket-Zuweisung an Gruppen
setting_issue_group_assignment: Ticketzuweisung an Gruppen erlauben
label_diff: diff
text_git_repository_note: Repository steht für sich alleine (bare) und liegt lokal (z.B. /gitrepo, c:\gitrepo)
@@ -1079,3 +1078,22 @@ de:
label_attribute_of_assigned_to: "%{name} des Bearbeiters"
label_attribute_of_fixed_version: "%{name} der Zielversion"
label_copy_subtasks: Unteraufgaben kopieren
label_copied_to: Kopiert nach
label_copied_from: Kopiert von
label_any_issues_in_project: irgendein Ticket im Projekt
label_any_issues_not_in_project: irgendein Ticket nicht im Projekt
field_private_notes: Privater Kommentar
permission_view_private_notes: Private Kommentare sehen
permission_set_notes_private: Kommentar als privat markieren
label_no_issues_in_project: keine Tickets im Projekt
label_any: alle
label_last_n_weeks: letzte %{count} Wochen
setting_cross_project_subtasks: Projektübergreifende Unteraufgaben erlauben
label_cross_project_descendants: Mit Unterprojekten
label_cross_project_tree: Mit Projektbaum
label_cross_project_hierarchy: Mit Projekthierarchie
label_cross_project_system: Mit allen Projekten
button_hide: Verstecken
setting_non_working_week_days: Arbeitsfreie Tage
label_in_the_next_days: in den nächsten
label_in_the_past_days: in den letzten

View File

@@ -137,7 +137,7 @@ el:
general_text_Yes: 'Ναι'
general_text_no: 'όχι'
general_text_yes: 'ναι'
general_lang_name: 'Ελληνικά'
general_lang_name: 'Greek (Ελληνικά)'
general_csv_separator: ','
general_csv_decimal_separator: '.'
general_csv_encoding: UTF-8
@@ -920,7 +920,6 @@ el:
project_module_gantt: Gantt
project_module_calendar: Calendar
button_edit_associated_wikipage: "Edit associated Wiki page: %{page_title}"
text_are_you_sure_with_children: Delete issue and all child issues?
field_text: Text field
label_user_mail_option_only_owner: Only for things I am the owner of
setting_default_notification_option: Default notification option
@@ -1063,3 +1062,22 @@ el:
label_attribute_of_assigned_to: Assignee's %{name}
label_attribute_of_fixed_version: Target version's %{name}
label_copy_subtasks: Copy subtasks
label_copied_to: copied to
label_copied_from: copied from
label_any_issues_in_project: any issues in project
label_any_issues_not_in_project: any issues not in project
field_private_notes: Private notes
permission_view_private_notes: View private notes
permission_set_notes_private: Set notes as private
label_no_issues_in_project: no issues in project
label_any: όλα
label_last_n_weeks: last %{count} weeks
setting_cross_project_subtasks: Allow cross-project subtasks
label_cross_project_descendants: With subprojects
label_cross_project_tree: With project tree
label_cross_project_hierarchy: With project hierarchy
label_cross_project_system: With all projects
button_hide: Hide
setting_non_working_week_days: Non-working days
label_in_the_next_days: in the next
label_in_the_past_days: in the past

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