Compare commits

..

83 Commits

Author SHA1 Message Date
Jean-Philippe Lang
a84920ca70 Merged r3865 and r3866 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3868 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 09:34:13 +00:00
Eric Davis
21d2de48b7 Merged r3836 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3838 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-08 03:54:53 +00:00
Eric Davis
a19a37b600 Merged r3835 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3837 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-08 03:54:48 +00:00
Eric Davis
29e7b8d9ea Merged r3832 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3834 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-08 03:48:40 +00:00
Eric Davis
f3b9c0027f Merged r3831 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3833 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-08 03:48:35 +00:00
Eric Davis
a146c2d03f Merged r3815 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3817 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-28 02:48:12 +00:00
Eric Davis
a62ff0841f Merged r3814 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3816 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-28 02:48:06 +00:00
Eric Davis
d7ec02691f Merged r3811 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3812 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-24 02:39:21 +00:00
Eric Davis
e7790bb6b5 Fix nil method error when no issue params are submitted. #5123
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3796 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-20 03:24:38 +00:00
Eric Davis
34f73b005b Merged r3785 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3795 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-19 23:03:12 +00:00
Eric Davis
ba42e1e2ff Merged r3786 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3794 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-19 23:03:07 +00:00
Eric Davis
14074da8b1 Merged r3784 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3793 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-19 23:03:01 +00:00
Eric Davis
44851d079f Merged r3787 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3792 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-19 23:02:55 +00:00
Eric Davis
e6d053c3fd Merged r3783 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3791 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-19 23:02:50 +00:00
Eric Davis
f17924c60d Merged r3775 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3781 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-19 18:47:18 +00:00
Eric Davis
90e23e4d5d Merged r3777 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3780 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-19 18:47:13 +00:00
Eric Davis
88a2792778 Merged r3776 from trunk
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3779 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-19 18:47:08 +00:00
Eric Davis
4c881d54a7 Merged r3659 from trunk
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3778 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-19 18:47:03 +00:00
Jean-Philippe Lang
a6d45cc68f Merged r3740 and r3741 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3742 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-22 08:55:56 +00:00
Jean-Philippe Lang
f58f7e0e41 Merged r3727 from trunk for 0.9.4 release.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3728 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-01 12:38:44 +00:00
Jean-Philippe Lang
473366f887 Merged r3725 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3726 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-01 12:33:27 +00:00
Jean-Philippe Lang
f6d2a4c29f Backported r3683 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3717 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-30 17:32:42 +00:00
Jean-Philippe Lang
b26d0fe041 Merged r3705 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3715 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-30 17:20:59 +00:00
Jean-Philippe Lang
98f3e98d82 Merged r3702 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3714 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-30 17:19:40 +00:00
Jean-Philippe Lang
7b27280c9b Backported r3692 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3713 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-30 14:22:52 +00:00
Jean-Philippe Lang
d287436627 Merged r3678 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3712 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-30 14:06:45 +00:00
Jean-Philippe Lang
666d3d6472 Merged r3682 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3711 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-30 14:05:37 +00:00
Eric Davis
36063f16ee Merged r3698 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3699 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-29 23:30:21 +00:00
Jean-Philippe Lang
4a295e723e Merged r3668 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3697 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-29 22:05:49 +00:00
Jean-Philippe Lang
6e67d76194 Merged r3613 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3662 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 15:24:49 +00:00
Jean-Philippe Lang
eb55efd604 Merged r3612 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3661 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 15:23:30 +00:00
Jean-Philippe Lang
390eb7849c Merged r3611 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3660 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 15:21:08 +00:00
Jean-Philippe Lang
1588f3f6dc Merged r3397 from trunk to fix sqlite3 and pgsql test environments.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3658 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 15:06:43 +00:00
Jean-Philippe Lang
5ef8e8d45f Merged r3635 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3657 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 14:53:54 +00:00
Jean-Philippe Lang
cd15eb77d9 Merged r3625 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3656 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 14:44:18 +00:00
Jean-Philippe Lang
3b699806d9 Merged r3614 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3655 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 14:43:29 +00:00
Jean-Philippe Lang
d2367ccf53 Merged r3517 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3654 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 14:42:44 +00:00
Jean-Philippe Lang
9c00b8aa21 Merged r3530 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3653 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 14:41:59 +00:00
Jean-Philippe Lang
bbb00b0bc4 Merged r3616 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3652 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 14:41:15 +00:00
Jean-Philippe Lang
feac751318 Merged r3615 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3651 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 14:39:14 +00:00
Jean-Philippe Lang
eb4a7f9f2e Merged r3566 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3650 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 14:37:59 +00:00
Jean-Philippe Lang
7ce9ba9e28 Merged r3562 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3649 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 14:34:05 +00:00
Jean-Philippe Lang
53880a4e08 Merged r3571 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3648 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 14:32:29 +00:00
Jean-Philippe Lang
f92aa00705 Merged r3550 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3647 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 14:31:40 +00:00
Jean-Philippe Lang
b240da3833 Merged r3532 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3646 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 14:30:50 +00:00
Jean-Philippe Lang
da8624f7c7 Merged r3524 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3645 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 14:29:59 +00:00
Jean-Philippe Lang
46be83cd5e Merged r3537 and r3572 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3644 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 14:29:02 +00:00
Jean-Philippe Lang
667f7927a7 Merged r3494 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3643 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 14:21:47 +00:00
Jean-Philippe Lang
3e6f42e46d Backported r3608 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3642 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 14:20:40 +00:00
Jean-Philippe Lang
30c45a6187 Merged r3529 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3641 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 14:10:01 +00:00
Jean-Philippe Lang
32288ed5d7 Merged r3514 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3640 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 14:09:11 +00:00
Jean-Philippe Lang
beb89eb8bb Merged r3558 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3639 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 14:08:03 +00:00
Jean-Philippe Lang
62d8016c4f Merged r3513 and r3531 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3638 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 14:06:10 +00:00
Jean-Philippe Lang
5a7a3b2392 Merged r3603 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3637 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 14:04:37 +00:00
Jean-Philippe Lang
a2ad66a5c0 Merged r3539 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3636 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 14:03:28 +00:00
Jean-Philippe Lang
bfd9164c0a Merged r3506 for 0.9.3 release.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3507 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-28 10:21:33 +00:00
Jean-Philippe Lang
d80fb751fd Merged r3469, r3472 and r3473 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3505 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-28 10:10:55 +00:00
Jean-Philippe Lang
aacabbe645 Merged r3498 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3504 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-28 09:59:31 +00:00
Jean-Philippe Lang
8eafcbede9 Merged r3481 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3503 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-28 09:58:33 +00:00
Jean-Philippe Lang
43c1481998 Merged r3446 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3502 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-28 09:56:55 +00:00
Jean-Philippe Lang
17f60af490 Merged r3394, r3466, r3467, r3468 and r3471 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3501 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-28 09:51:10 +00:00
Jean-Philippe Lang
e5e5ad6b7a Merged r3398 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3465 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-20 10:40:02 +00:00
Jean-Philippe Lang
13fb739b56 Merged r3409 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3464 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-20 10:26:49 +00:00
Jean-Philippe Lang
73e849be58 Merged r3451 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3463 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-20 10:22:06 +00:00
Jean-Philippe Lang
0b7d4e818a Merged r3452 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3462 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-20 10:20:52 +00:00
Jean-Philippe Lang
40a4b111fa Merged r3447 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3461 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-20 10:19:02 +00:00
Jean-Philippe Lang
7d913f93c3 Merged r3448 and r3455 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3460 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-20 10:16:08 +00:00
Jean-Philippe Lang
864fd9c6a1 Merged bug fixes r3423 and r3427.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3433 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-14 15:57:56 +00:00
Jean-Philippe Lang
57dcbd7376 Merged bug fixes r3412 to r3414.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3432 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-14 15:55:00 +00:00
Jean-Philippe Lang
0ef11ef4fe Merged bug fixes r3402, r3405 to r3408 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3431 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-14 15:48:28 +00:00
Jean-Philippe Lang
b5ee8c08ca Merged r3392 from trunk (0.9.2 update).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3393 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-07 12:48:56 +00:00
Jean-Philippe Lang
9487d8dd80 Merged r3389 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3391 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-07 12:37:12 +00:00
Jean-Philippe Lang
f3bf588c82 Translations updated to trunk r3388.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3390 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-07 12:36:12 +00:00
Jean-Philippe Lang
bd38623cca Merged r3379 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3387 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-07 11:58:42 +00:00
Jean-Philippe Lang
bae86dc558 Merged r3377 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3386 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-07 11:57:49 +00:00
Jean-Philippe Lang
884c5be200 Backported r3368 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3385 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-07 11:56:49 +00:00
Jean-Philippe Lang
ad24563b1e Merged r3378 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3384 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-07 11:53:17 +00:00
Jean-Philippe Lang
cb8933ae55 Merged r3376 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3383 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-07 11:52:09 +00:00
Jean-Philippe Lang
5d75879046 Merged r3375 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3382 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-07 11:50:56 +00:00
Jean-Philippe Lang
69e5d91a2d Backported r3354 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3381 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-07 11:49:40 +00:00
Jean-Philippe Lang
7c1e877209 Merged r3357 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3380 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-07 11:45:31 +00:00
Eric Davis
76d9d01db0 Merged the Object Daddy exemplars from trunk. r3337, r3340, r3342
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3359 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-02 16:03:05 +00:00
Jean-Philippe Lang
27fa40d283 Merged r3351 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3352 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-30 11:24:10 +00:00
164 changed files with 1590 additions and 370 deletions

View File

@@ -25,8 +25,7 @@ class AccountController < ApplicationController
# Login request and validation
def login
if request.get?
# Logout user
self.logged_user = nil
logout_user
else
# Authenticate user
if Setting.openid? && using_open_id?
@@ -39,9 +38,7 @@ class AccountController < ApplicationController
# Log out current user and redirect to welcome page
def logout
cookies.delete :autologin
Token.delete_all(["user_id = ? AND action = ?", User.current.id, 'autologin']) if User.current.logged?
self.logged_user = nil
logout_user
redirect_to home_url
end
@@ -134,7 +131,15 @@ class AccountController < ApplicationController
end
private
def logout_user
if User.current.logged?
cookies.delete :autologin
Token.delete_all(["user_id = ? AND action = ?", User.current.id, 'autologin'])
self.logged_user = nil
end
end
def password_authentication
user = User.try_to_login(params[:username], params[:password])

View File

@@ -107,8 +107,9 @@ class ApplicationController < ActionController::Base
lang = find_language(User.current.language)
end
if lang.nil? && request.env['HTTP_ACCEPT_LANGUAGE']
accept_lang = parse_qvalues(request.env['HTTP_ACCEPT_LANGUAGE']).first.downcase
accept_lang = parse_qvalues(request.env['HTTP_ACCEPT_LANGUAGE']).first
if !accept_lang.blank?
accept_lang = accept_lang.downcase
lang = find_language(accept_lang) || find_language(accept_lang.split('-').first)
end
end

View File

@@ -76,12 +76,12 @@ class EnumerationsController < ApplicationController
@enumeration.destroy
redirect_to :action => 'index'
elsif params[:reassign_to_id]
if reassign_to = Enumeration.find_by_type_and_id(@enumeration.type, params[:reassign_to_id])
if reassign_to = @enumeration.class.find_by_id(params[:reassign_to_id])
@enumeration.destroy(reassign_to)
redirect_to :action => 'index'
end
end
@enumerations = Enumeration.find(:all, :conditions => ['type = (?)', @enumeration.type]) - [@enumeration]
@enumerations = @enumeration.class.find(:all) - [@enumeration]
#rescue
# flash[:error] = 'Unable to delete enumeration'
# redirect_to :action => 'index'

View File

@@ -21,8 +21,8 @@ class IssueRelationsController < ApplicationController
def new
@relation = IssueRelation.new(params[:relation])
@relation.issue_from = @issue
if params[:relation] && !params[:relation][:issue_to_id].blank?
@relation.issue_to = Issue.visible.find_by_id(params[:relation][:issue_to_id])
if params[:relation] && m = params[:relation][:issue_to_id].to_s.match(/^#?(\d+)$/)
@relation.issue_to = Issue.visible.find_by_id(m[1].to_i)
end
@relation.save if request.post?
respond_to do |format|

View File

@@ -57,12 +57,13 @@ class IssuesController < ApplicationController
sort_update({'id' => "#{Issue.table_name}.id"}.merge(@query.available_columns.inject({}) {|h, c| h[c.name.to_s] = c.sortable; h}))
if @query.valid?
limit = per_page_option
respond_to do |format|
format.html { }
format.atom { limit = Setting.feeds_limit.to_i }
format.csv { limit = Setting.issues_export_limit.to_i }
format.pdf { limit = Setting.issues_export_limit.to_i }
limit = case params[:format]
when 'csv', 'pdf'
Setting.issues_export_limit.to_i
when 'atom'
Setting.feeds_limit.to_i
else
per_page_option
end
@issue_count = @query.issue_count
@@ -106,7 +107,7 @@ class IssuesController < ApplicationController
@journals = @issue.journals.find(:all, :include => [:user, :details], :order => "#{Journal.table_name}.created_on ASC")
@journals.each_with_index {|j,i| j.indice = i+1}
@journals.reverse! if User.current.wants_comments_in_reverse_order?
@changesets = @issue.changesets
@changesets = @issue.changesets.visible.all
@changesets.reverse! if User.current.wants_comments_in_reverse_order?
@allowed_statuses = @issue.new_statuses_allowed_to(User.current)
@edit_allowed = User.current.allowed_to?(:edit_issues, @project)
@@ -148,7 +149,7 @@ class IssuesController < ApplicationController
if request.get? || request.xhr?
@issue.start_date ||= Date.today
else
requested_status = IssueStatus.find_by_id(params[:issue][:status_id])
requested_status = IssueStatus.find_by_id(params[:issue][:status_id]) if params[:issue]
# Check that the user is allowed to apply the requested status
@issue.status = (@allowed_statuses.include? requested_status) ? requested_status : default_status
call_hook(:controller_issues_new_before_save, { :params => params, :issue => @issue })
@@ -222,10 +223,13 @@ class IssuesController < ApplicationController
user = @issue.author
text = @issue.description
end
content = "#{ll(Setting.default_language, :text_user_wrote, user)}\\n> "
content << text.to_s.strip.gsub(%r{<pre>((.|\s)*?)</pre>}m, '[...]').gsub('"', '\"').gsub(/(\r?\n|\r\n?)/, "\\n> ") + "\\n\\n"
# Replaces pre blocks with [...]
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"
render(:update) { |page|
page.<< "$('notes').value = \"#{content}\";"
page.<< "$('notes').value = \"#{escape_javascript content}\";"
page.show 'update'
page << "Form.Element.focus('notes');"
page << "Element.scrollTo('update');"
@@ -279,14 +283,7 @@ class IssuesController < ApplicationController
def move
@copy = params[:copy_options] && params[:copy_options][:copy]
@allowed_projects = []
# find projects to which the user is allowed to move the issue
if User.current.admin?
# admin is allowed to move issues to any active (visible) project
@allowed_projects = Project.find(:all, :conditions => Project.visible_by(User.current))
else
User.current.memberships.each {|m| @allowed_projects << m.project if m.roles.detect {|r| r.allowed_to?(:move_issues)}}
end
@allowed_projects = Issue.allowed_target_projects_on_move
@target_project = @allowed_projects.detect {|p| p.id.to_s == params[:new_project_id]} if params[:new_project_id]
@target_project ||= @project
@trackers = @target_project.trackers
@@ -358,6 +355,7 @@ class IssuesController < ApplicationController
def gantt
@gantt = Redmine::Helpers::Gantt.new(params)
retrieve_query
@query.group_by = nil
if @query.valid?
events = []
# Issues that have start and due dates
@@ -397,6 +395,7 @@ class IssuesController < ApplicationController
@calendar = Redmine::Helpers::Calendar.new(Date.civil(@year, @month, 1), current_language, :month)
retrieve_query
@query.group_by = nil
if @query.valid?
events = []
events += @query.issues(:include => [:tracker, :assigned_to, :priority],

View File

@@ -38,6 +38,7 @@ class MembersController < ApplicationController
format.js {
render(:update) {|page|
page.replace_html "tab-content-members", :partial => 'projects/settings/members'
page << 'hideOnLoad()'
members.each {|member| page.visual_effect(:highlight, "member-#{member.id}") }
}
}
@@ -51,6 +52,7 @@ class MembersController < ApplicationController
format.js {
render(:update) {|page|
page.replace_html "tab-content-members", :partial => 'projects/settings/members'
page << 'hideOnLoad()'
page.visual_effect(:highlight, "member-#{@member.id}")
}
}
@@ -64,7 +66,11 @@ class MembersController < ApplicationController
end
respond_to do |format|
format.html { redirect_to :controller => 'projects', :action => 'settings', :tab => 'members', :id => @project }
format.js { render(:update) {|page| page.replace_html "tab-content-members", :partial => 'projects/settings/members'} }
format.js { render(:update) {|page|
page.replace_html "tab-content-members", :partial => 'projects/settings/members'
page << 'hideOnLoad()'
}
}
end
end

View File

@@ -27,7 +27,7 @@ class ProjectsController < ApplicationController
before_filter :authorize, :except => [ :index, :list, :add, :copy, :archive, :unarchive, :destroy, :activity ]
before_filter :authorize_global, :only => :add
before_filter :require_admin, :only => [ :copy, :archive, :unarchive, :destroy ]
accept_key_auth :activity
accept_key_auth :activity, :index
after_filter :only => [:add, :edit, :archive, :unarchive, :destroy] do |controller|
if controller.request.post?
@@ -102,18 +102,20 @@ class ProjectsController < ApplicationController
redirect_to :controller => 'admin', :action => 'projects'
end
else
@project = Project.new(params[:project])
@project.enabled_module_names = params[:enabled_modules]
if validate_parent_id && @project.copy(@source_project, :only => params[:only])
@project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
flash[:notice] = l(:notice_successful_create)
redirect_to :controller => 'admin', :action => 'projects'
elsif !@project.new_record?
# Project was created
# But some objects were not copied due to validation failures
# (eg. issues from disabled trackers)
# TODO: inform about that
redirect_to :controller => 'admin', :action => 'projects'
Mailer.with_deliveries(params[:notifications] == '1') do
@project = Project.new(params[:project])
@project.enabled_module_names = params[:enabled_modules]
if validate_parent_id && @project.copy(@source_project, :only => params[:only])
@project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
flash[:notice] = l(:notice_successful_create)
redirect_to :controller => 'admin', :action => 'projects'
elsif !@project.new_record?
# Project was created
# But some objects were not copied due to validation failures
# (eg. issues from disabled trackers)
# TODO: inform about that
redirect_to :controller => 'admin', :action => 'projects'
end
end
end
rescue ActiveRecord::RecordNotFound
@@ -320,13 +322,9 @@ class ProjectsController < ApplicationController
@issues_by_version = {}
unless @selected_tracker_ids.empty?
@versions.each do |version|
conditions = {:tracker_id => @selected_tracker_ids}
if !@project.versions.include?(version)
conditions.merge!(:project_id => project_ids)
end
issues = version.fixed_issues.visible.find(:all,
:include => [:project, :status, :tracker, :priority],
:conditions => conditions,
:conditions => {:tracker_id => @selected_tracker_ids, :project_id => project_ids},
:order => "#{Project.table_name}.lft, #{Tracker.table_name}.position, #{Issue.table_name}.id")
@issues_by_version[version] = issues
end

View File

@@ -74,7 +74,7 @@ private
def find_optional_project
@project = Project.find(params[:project_id]) if params[:project_id]
User.current.allowed_to?(:save_queries, @project, :global => true)
render_403 unless User.current.allowed_to?(:save_queries, @project, :global => true)
rescue ActiveRecord::RecordNotFound
render_404
end

View File

@@ -61,7 +61,7 @@ class ReportsController < ApplicationController
render :template => "reports/issue_report_details"
when "subproject"
@field = "project_id"
@rows = @project.descendants.active
@rows = @project.descendants.visible
@data = issues_by_subproject
@report_title = l(:field_subproject)
render :template => "reports/issue_report_details"
@@ -72,7 +72,7 @@ class ReportsController < ApplicationController
@categories = @project.issue_categories
@assignees = @project.members.collect { |m| m.user }.sort
@authors = @project.members.collect { |m| m.user }.sort
@subprojects = @project.descendants.active
@subprojects = @project.descendants.visible
issues_by_tracker
issues_by_version
issues_by_priority

View File

@@ -25,6 +25,9 @@ class VersionsController < ApplicationController
helper :projects
def show
@issues = @version.fixed_issues.visible.find(:all,
:include => [:status, :tracker, :priority],
:order => "#{Tracker.table_name}.position, #{Issue.table_name}.id")
end
def edit
@@ -46,11 +49,13 @@ class VersionsController < ApplicationController
end
def destroy
@version.destroy
redirect_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project
rescue
flash[:error] = l(:notice_unable_delete_version)
redirect_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project
if @version.fixed_issues.empty?
@version.destroy
redirect_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project
else
flash[:error] = l(:notice_unable_delete_version)
redirect_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project
end
end
def status_by

View File

@@ -506,17 +506,17 @@ module ApplicationHelper
# Forum messages:
# message#1218 -> Link to message with id 1218
text = text.gsub(%r{([\s\(,\-\>]|^)(!)?(attachment|document|version|commit|source|export|message)?((#|r)(\d+)|(:)([^"\s<>][^\s<>]*?|"[^"]+?"))(?=(?=[[:punct:]]\W)|,|\s|<|$)}) do |m|
leading, esc, prefix, sep, oid = $1, $2, $3, $5 || $7, $6 || $8
leading, esc, prefix, sep, identifier = $1, $2, $3, $5 || $7, $6 || $8
link = nil
if esc.nil?
if prefix.nil? && sep == 'r'
if project && (changeset = project.changesets.find_by_revision(oid))
link = link_to("r#{oid}", {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => project, :rev => oid},
if project && (changeset = project.changesets.find_by_revision(identifier))
link = link_to("r#{identifier}", {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => project, :rev => changeset.revision},
:class => 'changeset',
:title => truncate_single_line(changeset.comments, :length => 100))
end
elsif sep == '#'
oid = oid.to_i
oid = identifier.to_i
case prefix
when nil
if issue = Issue.visible.find_by_id(oid, :include => :status)
@@ -547,7 +547,7 @@ module ApplicationHelper
end
elsif sep == ':'
# removes the double quotes if any
name = oid.gsub(%r{^"(.*)"$}, "\\1")
name = identifier.gsub(%r{^"(.*)"$}, "\\1")
case prefix
when 'document'
if project && document = project.documents.find_by_title(name)
@@ -584,7 +584,7 @@ module ApplicationHelper
end
end
end
leading + (link || "#{prefix}#{sep}#{oid}")
leading + (link || "#{prefix}#{sep}#{identifier}")
end
text

View File

@@ -52,17 +52,19 @@ module RepositoriesHelper
else
change
end
end.compact
end.compact
tree = { }
changes.each do |change|
p = tree
dirs = change.path.to_s.split('/').select {|d| !d.blank?}
path = ''
dirs.each do |dir|
path += '/' + dir
p[:s] ||= {}
p = p[:s]
p[dir] ||= {}
p = p[dir]
p[path] ||= {}
p = p[path]
end
p[:c] = change
end
@@ -76,21 +78,26 @@ module RepositoriesHelper
output = ''
output << '<ul>'
tree.keys.sort.each do |file|
s = !tree[file][:s].nil?
c = tree[file][:c]
style = 'change'
style << ' folder' if s
style << " change-#{c.action}" if c
text = h(file)
unless c.nil?
text = File.basename(h(file))
if s = tree[file][:s]
style << ' folder'
path_param = to_path_param(@repository.relative_path(file))
text = link_to(text, :controller => 'repositories',
:action => 'show',
:id => @project,
:path => path_param,
:rev => @changeset.revision)
output << "<li class='#{style}'>#{text}</li>"
output << render_changes_tree(s)
elsif c = tree[file][:c]
style << " change-#{c.action}"
path_param = to_path_param(@repository.relative_path(c.path))
text = link_to(text, :controller => 'repositories',
:action => 'entry',
:id => @project,
:path => path_param,
:rev => @changeset.revision) unless s || c.action == 'D'
:rev => @changeset.revision) unless c.action == 'D'
text << " - #{c.revision}" unless c.revision.blank?
text << ' (' + link_to('diff', :controller => 'repositories',
:action => 'diff',
@@ -98,9 +105,8 @@ module RepositoriesHelper
:path => path_param,
:rev => @changeset.revision) + ') ' if c.action == 'M'
text << ' ' + content_tag('span', c.from_path, :class => 'copied-from') unless c.from_path.blank?
output << "<li class='#{style}'>#{text}</li>"
end
output << "<li class='#{style}'>#{text}</li>"
output << render_changes_tree(tree[file][:s]) if s
end
output << '</ul>'
output

View File

@@ -1,5 +1,5 @@
# Redmine - project management software
# Copyright (C) 2006-2008 Jean-Philippe Lang
# Copyright (C) 2006-2010 Jean-Philippe Lang
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -41,6 +41,9 @@ class Changeset < ActiveRecord::Base
validates_uniqueness_of :revision, :scope => :repository_id
validates_uniqueness_of :scmid, :scope => :repository_id, :allow_nil => true
named_scope :visible, lambda {|*args| { :include => {:repository => :project},
:conditions => Project.allowed_to_condition(args.first || User.current, :view_changesets) } }
def revision=(r)
write_attribute :revision, (r.nil? ? nil : r.to_s)
end
@@ -54,6 +57,10 @@ class Changeset < ActiveRecord::Base
super
end
def committer=(arg)
write_attribute(:committer, self.class.to_utf8(arg.to_s))
end
def project
repository.project
end
@@ -77,9 +84,6 @@ class Changeset < ActiveRecord::Base
ref_keywords = Setting.commit_ref_keywords.downcase.split(",").collect(&:strip)
# keywords used to fix issues
fix_keywords = Setting.commit_fix_keywords.downcase.split(",").collect(&:strip)
# status and optional done ratio applied
fix_status = IssueStatus.find_by_id(Setting.commit_fix_status_id)
done_ratio = Setting.commit_fix_done_ratio.blank? ? nil : Setting.commit_fix_done_ratio.to_i
kw_regexp = (ref_keywords + fix_keywords).collect{|kw| Regexp.escape(kw)}.join("|")
return if kw_regexp.blank?
@@ -90,14 +94,14 @@ class Changeset < ActiveRecord::Base
# find any issue ID in the comments
target_issue_ids = []
comments.scan(%r{([\s\(\[,-]|^)#(\d+)(?=[[:punct:]]|\s|<|$)}).each { |m| target_issue_ids << m[1] }
referenced_issues += repository.project.issues.find_all_by_id(target_issue_ids)
referenced_issues += find_referenced_issues_by_id(target_issue_ids)
end
comments.scan(Regexp.new("(#{kw_regexp})[\s:]+(([\s,;&]*#?\\d+)+)", Regexp::IGNORECASE)).each do |match|
action = match[0]
target_issue_ids = match[1].scan(/\d+/)
target_issues = repository.project.issues.find_all_by_id(target_issue_ids)
if fix_status && fix_keywords.include?(action.downcase)
target_issues = find_referenced_issues_by_id(target_issue_ids)
if fix_keywords.include?(action.downcase) && fix_status = IssueStatus.find_by_id(Setting.commit_fix_status_id)
# update status of issues
logger.debug "Issues fixed by changeset #{self.revision}: #{issue_ids.join(', ')}." if logger && logger.debug?
target_issues.each do |issue|
@@ -111,7 +115,9 @@ class Changeset < ActiveRecord::Base
end
journal = issue.init_journal(user || User.anonymous, ll(Setting.default_language, :text_status_changed_by_changeset, csettext))
issue.status = fix_status
issue.done_ratio = done_ratio if done_ratio
unless Setting.commit_fix_done_ratio.blank?
issue.done_ratio = Setting.commit_fix_done_ratio.to_i
end
Redmine::Hook.call_hook(:model_changeset_scan_commit_for_issue_ids_pre_issue_update,
{ :changeset => self, :issue => issue })
issue.save
@@ -120,7 +126,8 @@ class Changeset < ActiveRecord::Base
referenced_issues += target_issues
end
self.issues = referenced_issues.uniq
referenced_issues.uniq!
self.issues = referenced_issues unless referenced_issues.empty?
end
def short_comments
@@ -148,6 +155,15 @@ class Changeset < ActiveRecord::Base
private
# Finds issues that can be referenced by the commit message
# i.e. issues that belong to the repository project, a subproject or a parent project
def find_referenced_issues_by_id(ids)
return [] if ids.compact.empty?
Issue.find_all_by_id(ids, :include => :project).select {|issue|
project == issue.project || project.is_ancestor_of?(issue.project) || project.is_descendant_of?(issue.project)
}
end
def split_comments
comments =~ /\A(.+?)\r?\n(.*)$/m
@short_comments = $1 || comments
@@ -160,11 +176,17 @@ class Changeset < ActiveRecord::Base
encoding = Setting.commit_logs_encoding.to_s.strip
unless encoding.blank? || encoding == 'UTF-8'
begin
return Iconv.conv('UTF-8', encoding, str)
str = Iconv.conv('UTF-8', encoding, str)
rescue Iconv::Failure
# do nothing here
end
end
str
# removes invalid UTF8 sequences
begin
Iconv.conv('UTF-8//IGNORE', 'UTF-8', str + ' ')[0..-3]
rescue Iconv::InvalidEncoding
# "UTF-8//IGNORE" is not supported on some OS
str
end
end
end

View File

@@ -80,7 +80,7 @@ class Issue < ActiveRecord::Base
end
def copy_from(arg)
issue = arg.is_a?(Issue) ? arg : Issue.find(arg)
issue = arg.is_a?(Issue) ? arg : Issue.visible.find(arg)
self.attributes = issue.attributes.dup.except("id", "created_on", "updated_on")
self.custom_values = issue.custom_values.collect {|v| v.clone}
self.status = issue.status
@@ -92,7 +92,7 @@ class Issue < ActiveRecord::Base
def move_to(new_project, new_tracker = nil, options = {})
options ||= {}
issue = options[:copy] ? self.clone : self
transaction do
ret = Issue.transaction do
if new_project && issue.project_id != new_project.id
# delete issue relations
unless Setting.cross_project_issue_relations?
@@ -129,12 +129,12 @@ class Issue < ActiveRecord::Base
# Manually update project_id on related time entries
TimeEntry.update_all("project_id = #{new_project.id}", {:issue_id => id})
end
true
else
Issue.connection.rollback_db_transaction
return false
raise ActiveRecord::Rollback
end
end
return issue
ret ? issue : false
end
def priority_id=(pid)
@@ -159,7 +159,8 @@ class Issue < ActiveRecord::Base
end
send :attributes_without_tracker_first=, new_attributes, *args
end
alias_method_chain :attributes=, :tracker_first
# Do not redefine alias chain on reload (see #4838)
alias_method_chain(:attributes=, :tracker_first) unless method_defined?(:attributes_without_tracker_first=)
def estimated_hours=(h)
write_attribute :estimated_hours, (h.is_a?(String) ? h.to_hours : h)
@@ -388,6 +389,22 @@ class Issue < ActiveRecord::Base
Issue.update_versions(["#{Version.table_name}.project_id IN (?) OR #{Issue.table_name}.project_id IN (?)", moved_project_ids, moved_project_ids])
end
# Returns an array of projects that current user can move issues to
def self.allowed_target_projects_on_move
projects = []
if User.current.admin?
# admin is allowed to move issues to any active (visible) project
projects = Project.visible.all
elsif User.current.logged?
if Role.non_member.allowed_to?(:move_issues)
projects = Project.visible.all
else
User.current.memberships.each {|m| projects << m.project if m.roles.detect {|r| r.allowed_to?(:move_issues)}}
end
end
projects
end
private
# Update issues so their versions are not pointing to a

View File

@@ -49,7 +49,7 @@ class MailHandler < ActionMailer::Base
logger.info "MailHandler: ignoring email from Redmine emission address [#{sender_email}]" if logger && logger.info
return false
end
@user = User.find_by_mail(sender_email)
@user = User.find_by_mail(sender_email) if sender_email.present?
if @user && !@user.active?
logger.info "MailHandler: ignoring email from non-active user [#{@user.login}]" if logger && logger.info
return false

View File

@@ -114,11 +114,11 @@ class Mailer < ActionMailer::Base
when 'Project'
added_to_url = url_for(:controller => 'projects', :action => 'list_files', :id => container)
added_to = "#{l(:label_project)}: #{container}"
recipients container.project.notified_users.select {|user| user.allowed_to?(:view_files, container.project)}
recipients container.project.notified_users.select {|user| user.allowed_to?(:view_files, container.project)}.collect {|u| u.mail}
when 'Version'
added_to_url = url_for(:controller => 'projects', :action => 'list_files', :id => container.project_id)
added_to = "#{l(:label_version)}: #{container.name}"
recipients container.project.notified_users.select {|user| user.allowed_to?(:view_files, container.project)}
recipients container.project.notified_users.select {|user| user.allowed_to?(:view_files, container.project)}.collect {|u| u.mail}
when 'Document'
added_to_url = url_for(:controller => 'documents', :action => 'show', :id => container.id)
added_to = "#{l(:label_document)}: #{container.title}"
@@ -310,6 +310,15 @@ class Mailer < ActionMailer::Base
deliver_reminder(assignee, issues, days) unless assignee.nil?
end
end
# Activates/desactivates email deliveries during +block+
def self.with_deliveries(enabled = true, &block)
was_enabled = ActionMailer::Base.perform_deliveries
ActionMailer::Base.perform_deliveries = !!enabled
yield
ensure
ActionMailer::Base.perform_deliveries = was_enabled
end
private
def initialize_defaults(method_name)

View File

@@ -16,7 +16,7 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class Principal < ActiveRecord::Base
set_table_name 'users'
set_table_name "#{table_name_prefix}users#{table_name_suffix}"
has_many :members, :foreign_key => 'user_id', :dependent => :destroy
has_many :memberships, :class_name => 'Member', :foreign_key => 'user_id', :include => [ :project, :roles ], :conditions => "#{Project.table_name}.status=#{Project::STATUS_ACTIVE}", :order => "#{Project.table_name}.name"

View File

@@ -51,12 +51,12 @@ class Project < ActiveRecord::Base
:join_table => "#{table_name_prefix}custom_fields_projects#{table_name_suffix}",
:association_foreign_key => 'custom_field_id'
acts_as_nested_set :order => 'name', :dependent => :destroy
acts_as_nested_set :order => 'name'
acts_as_attachable :view_permission => :view_files,
:delete_permission => :manage_files
acts_as_customizable
acts_as_searchable :columns => ['name', 'description'], :project_key => 'id', :permission => nil
acts_as_searchable :columns => ['name', 'identifier', 'description'], :project_key => 'id', :permission => nil
acts_as_event :title => Proc.new {|o| "#{l(:label_project)}: #{o.name}"},
:url => Proc.new {|o| {:controller => 'projects', :action => 'show', :id => o.id}},
:author => nil
@@ -74,7 +74,7 @@ class Project < ActiveRecord::Base
# reserved words
validates_exclusion_of :identifier, :in => %w( new )
before_destroy :delete_all_members
before_destroy :delete_all_members, :destroy_children
named_scope :has_module, lambda { |mod| { :conditions => ["#{Project.table_name}.id IN (SELECT em.project_id FROM #{EnabledModule.table_name} em WHERE em.name=?)", mod.to_s] } }
named_scope :active, { :conditions => "#{Project.table_name}.status = #{STATUS_ACTIVE}"}
@@ -249,7 +249,7 @@ class Project < ActiveRecord::Base
return @allowed_parents if @allowed_parents
@allowed_parents = Project.find(:all, :conditions => Project.allowed_to_condition(User.current, :add_subprojects))
@allowed_parents = @allowed_parents - self_and_descendants
if User.current.allowed_to?(:add_project, nil, :global => true)
if User.current.allowed_to?(:add_project, nil, :global => true) || (!new_record? && parent.nil?)
@allowed_parents << nil
end
unless parent.nil? || @allowed_parents.empty? || @allowed_parents.include?(parent)
@@ -499,17 +499,36 @@ class Project < ActiveRecord::Base
private
# Destroys children before destroying self
def destroy_children
children.each do |child|
child.destroy
end
end
# Copies wiki from +project+
def copy_wiki(project)
# Check that the source project has a wiki first
unless project.wiki.nil?
self.wiki ||= Wiki.new
wiki.attributes = project.wiki.attributes.dup.except("id", "project_id")
wiki_pages_map = {}
project.wiki.pages.each do |page|
# Skip pages without content
next if page.content.nil?
new_wiki_content = WikiContent.new(page.content.attributes.dup.except("id", "page_id", "updated_on"))
new_wiki_page = WikiPage.new(page.attributes.dup.except("id", "wiki_id", "created_on", "parent_id"))
new_wiki_page.content = new_wiki_content
wiki.pages << new_wiki_page
wiki_pages_map[page.id] = new_wiki_page
end
wiki.save
# Reproduce page hierarchy
project.wiki.pages.each do |page|
if page.parent_id && wiki_pages_map[page.id]
wiki_pages_map[page.id].parent = wiki_pages_map[page.parent_id]
wiki_pages_map[page.id].save
end
end
end
end

View File

@@ -210,6 +210,10 @@ class Query < ActiveRecord::Base
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] } }
end
add_custom_fields_filters(IssueCustomField.find(:all, :conditions => {:is_filter => true, :is_for_all => true}))
end
@available_filters

View File

@@ -136,6 +136,7 @@ class Repository < ActiveRecord::Base
end
end
@committers = nil
@found_committer_users = nil
true
else
false
@@ -146,24 +147,34 @@ class Repository < ActiveRecord::Base
# It will return nil if the committer is not yet mapped and if no User
# with the same username or email was found
def find_committer_user(committer)
if committer
unless committer.blank?
@found_committer_users ||= {}
return @found_committer_users[committer] if @found_committer_users.has_key?(committer)
user = nil
c = changesets.find(:first, :conditions => {:committer => committer}, :include => :user)
if c && c.user
c.user
user = c.user
elsif committer.strip =~ /^([^<]+)(<(.*)>)?$/
username, email = $1.strip, $3
u = User.find_by_login(username)
u ||= User.find_by_mail(email) unless email.blank?
u
user = u
end
@found_committer_users[committer] = user
user
end
end
# fetch new changesets for all repositories
# can be called periodically by an external script
# Fetches new changesets for all repositories of active projects
# Can be called periodically by an external script
# eg. ruby script/runner "Repository.fetch_changesets"
def self.fetch_changesets
find(:all).each(&:fetch_changesets)
Project.active.has_module(:repository).find(:all, :include => :repository).each do |project|
if project.repository
project.repository.fetch_changesets
end
end
end
# scan changeset comments to find related and fixed issues for all repositories

View File

@@ -40,23 +40,26 @@ class Repository::Git < Repository
# With SCM's that have a sequential commit numbering, redmine is able to be
# clever and only fetch changesets going forward from the most recent one
# it knows about. However, with git, you never know if people have merged
# commits into the middle of the repository history, so we always have to
# parse the entire log.
# commits into the middle of the repository history, so we should parse
# the entire log. Since it's way too slow for large repositories, we only
# parse 1 week before the last known commit.
# The repository can still be fully reloaded by calling #clear_changesets
# before fetching changesets (eg. for offline resync)
def fetch_changesets
# Save ourselves an expensive operation if we're already up to date
return if scm.num_revisions == changesets.count
c = changesets.find(:first, :order => 'committed_on DESC')
since = (c ? c.committed_on - 7.days : nil)
revisions = scm.revisions('', nil, nil, :all => true)
revisions = scm.revisions('', nil, nil, :all => true, :since => since)
return if revisions.nil? || revisions.empty?
# Find revisions that redmine knows about already
existing_revisions = changesets.find(:all).map!{|c| c.scmid}
recent_changesets = changesets.find(:all, :conditions => ['committed_on >= ?', since])
# Clean out revisions that are no longer in git
Changeset.delete_all(["scmid NOT IN (?) AND repository_id = (?)", revisions.map{|r| r.scmid}, self.id])
recent_changesets.each {|c| c.destroy unless revisions.detect {|r| r.scmid.to_s == c.scmid.to_s }}
# Subtract revisions that redmine already knows about
revisions.reject!{|r| existing_revisions.include?(r.scmid)}
recent_revisions = recent_changesets.map{|c| c.scmid}
revisions.reject!{|r| recent_revisions.include?(r.scmid)}
# Save the remaining ones to the database
revisions.each{|r| r.save(self)} unless revisions.nil?

View File

@@ -1,5 +1,5 @@
# redMine - project management software
# Copyright (C) 2006 Jean-Philippe Lang
# Redmine - project management software
# Copyright (C) 2006-2010 Jean-Philippe Lang
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -16,10 +16,9 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class Version < ActiveRecord::Base
before_destroy :check_integrity
after_update :update_issues_from_sharing_change
belongs_to :project
has_many :fixed_issues, :class_name => 'Issue', :foreign_key => 'fixed_version_id'
has_many :fixed_issues, :class_name => 'Issue', :foreign_key => 'fixed_version_id', :dependent => :nullify
acts_as_customizable
acts_as_attachable :view_permission => :view_files,
:delete_permission => :manage_files
@@ -155,10 +154,7 @@ class Version < ActiveRecord::Base
end
end
private
def check_integrity
raise "Can't delete version" if self.fixed_issues.find(:first)
end
private
# Update the issue's fixed versions. Used if a version's sharing changes.
def update_issues_from_sharing_change

View File

@@ -1,3 +1,4 @@
<%= call_hook :view_account_login_top %>
<div id="login-form">
<% form_tag({:action=> "login"}) do %>
<%= back_url_hidden_field_tag %>
@@ -38,3 +39,4 @@
<%= javascript_tag "Form.Element.focus('username');" %>
<% end %>
</div>
<%= call_hook :view_account_login_bottom %>

View File

@@ -15,6 +15,7 @@
<% end %>
&nbsp;
<div class="autoscroll">
<table class="list">
<thead><tr>
<th><%=l(:label_project)%></th>
@@ -40,5 +41,6 @@
<% end %>
</tbody>
</table>
</div>
<% html_title(l(:label_project_plural)) -%>

View File

@@ -26,3 +26,7 @@
<% end %>
<% html_title @document.title -%>
<% content_for :header_tags do %>
<%= stylesheet_link_tag 'scm' %>
<% end %>

View File

@@ -29,7 +29,7 @@
<% remote_form_for(:group, @group, :url => {:controller => 'groups', :action => 'add_users', :id => @group}, :method => :post) do |f| %>
<fieldset><legend><%=l(:label_user_new)%></legend>
<p><%= text_field_tag 'user_search', nil, :size => "40" %></p>
<p><%= text_field_tag 'user_search', nil %></p>
<%= observe_field(:user_search,
:frequency => 0.5,
:update => :users,

View File

@@ -1,7 +1,5 @@
<h2><%= link_to l(:label_group_plural), groups_path %> &#187; <%= l(:label_group_new) %></h2>
<%= error_messages_for :group %>
<% form_for(@group, :builder => TabularFormBuilder, :lang => current_language) do |f| %>
<%= render :partial => 'form', :locals => { :f => f } %>
<p><%= f.submit l(:button_create) %></p>

View File

@@ -1,5 +1,6 @@
<% form_tag({}) do -%>
<%= hidden_field_tag 'back_url', url_for(params) %>
<div class="autoscroll">
<table class="list issues">
<thead><tr>
<th><%= link_to image_tag('toggle_check.png'), {}, :onclick => 'toggleIssuesSelection(Element.up(this, "form")); return false;',
@@ -25,10 +26,11 @@
<% end %>
<tr id="issue-<%= issue.id %>" class="hascontextmenu <%= cycle('odd', 'even') %> <%= issue.css_classes %>">
<td class="checkbox"><%= check_box_tag("ids[]", issue.id, false, :id => nil) %></td>
<td><%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %></td>
<td class="id"><%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %></td>
<% query.columns.each do |column| %><%= content_tag 'td', column_content(column, issue), :class => column.name %><% end %>
</tr>
<% end -%>
</tbody>
</table>
</div>
<% end -%>

View File

@@ -86,7 +86,6 @@ top = headers_height + 8
<%= link_to_issue i %>
<% else %>
<span class="icon icon-package">
<%= h("#{i.project} -") unless @project && @project == i.project %>
<%= link_to_version i %>
</span>
<% end %>
@@ -211,8 +210,7 @@ top = headers_height + 10
%>
<div style="top:<%= top %>px;left:<%= i_left %>px;width:15px;" class="task milestone">&nbsp;</div>
<div style="top:<%= top %>px;left:<%= i_left + 12 %>px;background:#fff;" class="task">
<%= h("#{i.project} -") unless @project && @project == i.project %>
<strong><%=h i %></strong>
<strong><%= format_version_name i %></strong>
</div>
<% end %>
<% top = top + 20

View File

@@ -10,10 +10,10 @@
<% form_tag({ :controller => 'queries', :action => 'new' }, :id => 'query_form') do %>
<%= hidden_field_tag('project_id', @project.to_param) if @project %>
<div id="query_form_content">
<fieldset id="filters" class="collapsible">
<div id="query_form_content" class="hide-when-print">
<fieldset id="filters" class="collapsible <%= @query.new_record? ? "" : "collapsed" %>">
<legend onclick="toggleFieldset(this);"><%= l(:label_filter_plural) %></legend>
<div>
<div style="<%= @query.new_record? ? "" : "display: none;" %>">
<%= render :partial => 'queries/filters', :locals => {:query => @query} %>
</div>
</fieldset>
@@ -33,7 +33,7 @@
</div>
</fieldset>
</div>
<p class="buttons">
<p class="buttons hide-when-print">
<%= link_to_remote l(:button_apply),
{ :url => { :set_filter => 1 },

View File

@@ -73,7 +73,7 @@
</div>
<% if @changesets.any? && User.current.allowed_to?(:view_changesets, @project) %>
<% if @changesets.any? %>
<div id="issue-changesets">
<h3><%=l(:label_associated_revisions)%></h3>
<%= render :partial => 'changesets', :locals => { :changesets => @changesets} %>

View File

@@ -40,9 +40,11 @@
<h1><%= page_header_title %></h1>
<% if display_main_menu?(@project) %>
<div id="main-menu">
<%= render_main_menu(@project) %>
</div>
<% end %>
</div>
<%= tag('div', {:id => 'main', :class => (has_content?(:sidebar) ? '' : 'nosidebar')}, true) %>

View File

@@ -1,14 +1,14 @@
<h1><%= link_to "#{issue.tracker.name} ##{issue.id}: #{issue.subject}", issue_url %></h1>
<h1><%= link_to(h("#{issue.tracker.name} ##{issue.id}: #{issue.subject}"), issue_url) %></h1>
<ul>
<li><%=l(:field_author)%>: <%= issue.author %></li>
<li><%=l(:field_status)%>: <%= issue.status %></li>
<li><%=l(:field_priority)%>: <%= issue.priority %></li>
<li><%=l(:field_assigned_to)%>: <%= issue.assigned_to %></li>
<li><%=l(:field_category)%>: <%= issue.category %></li>
<li><%=l(:field_fixed_version)%>: <%= issue.fixed_version %></li>
<li><%=l(:field_author)%>: <%=h issue.author %></li>
<li><%=l(:field_status)%>: <%=h issue.status %></li>
<li><%=l(:field_priority)%>: <%=h issue.priority %></li>
<li><%=l(:field_assigned_to)%>: <%=h issue.assigned_to %></li>
<li><%=l(:field_category)%>: <%=h issue.category %></li>
<li><%=l(:field_fixed_version)%>: <%=h issue.fixed_version %></li>
<% issue.custom_values.each do |c| %>
<li><%= c.custom_field.name %>: <%= show_value(c) %></li>
<li><%=h c.custom_field.name %>: <%=h show_value(c) %></li>
<% end %>
</ul>

View File

@@ -1,2 +1,2 @@
<p><%= l(:mail_body_account_activation_request, @user.login) %></p>
<p><%= l(:mail_body_account_activation_request, h(@user.login)) %></p>
<p><%= link_to @url, @url %></p>

View File

@@ -1,10 +1,10 @@
<% if @user.auth_source %>
<p><%= l(:mail_body_account_information_external, @user.auth_source.name) %></p>
<p><%= l(:mail_body_account_information_external, h(@user.auth_source.name)) %></p>
<% else %>
<p><%= l(:mail_body_account_information) %>:</p>
<ul>
<li><%= l(:field_login) %>: <%= @user.login %></li>
<li><%= l(:field_password) %>: <%= @password %></li>
<li><%= l(:field_login) %>: <%=h @user.login %></li>
<li><%= l(:field_password) %>: <%=h @password %></li>
</ul>
<% end %>

View File

@@ -1,5 +1,5 @@
<%= link_to @added_to, @added_to_url %><br />
<ul><% @attachments.each do |attachment | %>
<li><%= attachment.filename %></li>
<li><%=h attachment.filename %></li>
<% end %></ul>

View File

@@ -1,3 +1,3 @@
<%= link_to @document.title, @document_url %> (<%= @document.category.name %>)<br />
<%= link_to(h(@document.title), @document_url) %> (<%=h @document.category.name %>)<br />
<br />
<%= textilizable(@document, :description, :only_path => false) %>

View File

@@ -1,3 +1,3 @@
<%= l(:text_issue_added, :id => "##{@issue.id}", :author => @issue.author) %>
<%= l(:text_issue_added, :id => "##{@issue.id}", :author => h(@issue.author)) %>
<hr />
<%= render :partial => "issue_text_html", :locals => { :issue => @issue, :issue_url => @issue_url } %>

View File

@@ -1,4 +1,4 @@
<%= l(:text_issue_updated, :id => "##{@issue.id}", :author => @journal.user) %>
<%= l(:text_issue_updated, :id => "##{@issue.id}", :author => h(@journal.user)) %>
<ul>
<% for detail in @journal.details %>

View File

@@ -1,4 +1,4 @@
<p><%= l(:mail_body_lost_password) %><br />
<%= auto_link(@url) %></p>
<p><%= l(:field_login) %>: <b><%= @token.user.login %></b></p>
<p><%= l(:field_login) %>: <b><%=h @token.user.login %></b></p>

View File

@@ -1,4 +1,4 @@
<h1><%=h @message.board.project.name %> - <%=h @message.board.name %>: <%= link_to @message.subject, @message_url %></h1>
<em><%= @message.author %></em>
<h1><%=h @message.board.project.name %> - <%=h @message.board.name %>: <%= link_to(h(@message.subject), @message_url) %></h1>
<em><%=h @message.author %></em>
<%= textilizable(@message, :content, :only_path => false) %>

View File

@@ -1,4 +1,4 @@
<h1><%= link_to @news.title, @news_url %></h1>
<em><%= @news.author.name %></em>
<h1><%= link_to(h(@news.title), @news_url) %></h1>
<em><%=h @news.author.name %></em>
<%= textilizable(@news, :description, :only_path => false) %>

View File

@@ -3,7 +3,7 @@
<div class="contextual">
<%= watcher_tag(@topic, User.current) %>
<%= link_to_remote_if_authorized l(:button_quote), { :url => {:action => 'quote', :id => @topic} }, :class => 'icon icon-comment' %>
<%= link_to_remote_if_authorized(l(:button_quote), { :url => {:action => 'quote', :id => @topic} }, :class => 'icon icon-comment') unless @topic.locked? %>
<%= link_to(l(:button_edit), {:action => 'edit', :id => @topic}, :class => 'icon icon-edit') if @message.editable_by?(User.current) %>
<%= link_to(l(:button_delete), {:action => 'destroy', :id => @topic}, :method => :post, :confirm => l(:text_are_you_sure), :class => 'icon icon-del') if @message.destroyable_by?(User.current) %>
</div>
@@ -24,7 +24,7 @@
<% @replies.each do |message| %>
<div class="message reply" id="<%= "message-#{message.id}" %>">
<div class="contextual">
<%= link_to_remote_if_authorized image_tag('comment.png'), { :url => {:action => 'quote', :id => message} }, :title => l(:button_quote) %>
<%= link_to_remote_if_authorized(image_tag('comment.png'), { :url => {:action => 'quote', :id => message} }, :title => l(:button_quote)) unless @topic.locked? %>
<%= link_to(image_tag('edit.png'), {:action => 'edit', :id => message}, :title => l(:button_edit)) if message.editable_by?(User.current) %>
<%= link_to(image_tag('delete.png'), {:action => 'destroy', :id => message}, :method => :post, :confirm => l(:text_are_you_sure), :title => l(:button_delete)) if message.destroyable_by?(User.current) %>
</div>

View File

@@ -17,10 +17,10 @@
<% if Setting.rest_api_enabled? %>
<h4><%= l(:label_api_access_key) %></h4>
<p>
<div>
<%= link_to_function(l(:button_show), "$('api-access-key').toggle();")%>
<pre id='api-access-key' class='autoscroll'><%= @user.api_key %></pre>
</p>
</div>
<%= javascript_tag("$('api-access-key').hide();") %>
<p>
<% if @user.api_token %>

View File

@@ -1,7 +1,7 @@
<h3><%= l(:label_calendar) %></h3>
<% calendar = Redmine::Helpers::Calendar.new(Date.today, current_language, :week)
calendar.events = Issue.find :all,
calendar.events = Issue.visible.find :all,
:conditions => ["#{Issue.table_name}.project_id in (#{@user.projects.collect{|m| m.id}.join(',')}) AND ((start_date>=? and start_date<=?) or (due_date>=? and due_date<=?))", calendar.startdt, calendar.enddt, calendar.startdt, calendar.enddt],
:include => [:project, :tracker, :priority, :assigned_to] unless @user.projects.empty? %>

View File

@@ -21,6 +21,8 @@
<label class="block"><%= check_box_tag 'only[]', 'boards', true %> <%= l(:label_board_plural) %> (<%= @source_project.boards.count %>)</label>
<label class="block"><%= check_box_tag 'only[]', 'wiki', true %> <%= l(:label_wiki_page_plural) %> (<%= @source_project.wiki.nil? ? 0 : @source_project.wiki.pages.count %>)</label>
<%= hidden_field_tag 'only[]', '' %>
<br />
<label class="block"><%= check_box_tag 'notifications', 1, params[:notifications] %> <%= l(:label_project_copy_notifications) %></label>
</fieldset>
<%= submit_tag l(:button_copy) %>

View File

@@ -1,3 +1,7 @@
<% content_for :header_tags do %>
<%= auto_discovery_link_tag(:atom, {:action => 'index', :format => 'atom', :key => User.current.rss_key}) %>
<% end %>
<div class="contextual">
<%= link_to(l(:label_project_new), {:controller => 'projects', :action => 'add'}, :class => 'icon icon-add') + ' |' if User.current.allowed_to?(:add_project, nil, :global => true) %>
<%= link_to(l(:label_issue_view_all), { :controller => 'issues' }) + ' |' if User.current.allowed_to?(:view_issues, nil, :global => true) %>

View File

@@ -58,7 +58,7 @@
<% remote_form_for(:member, @member, :url => {:controller => 'members', :action => 'new', :id => @project}, :method => :post) do |f| %>
<fieldset><legend><%=l(:label_member_new)%></legend>
<p><%= text_field_tag 'principal_search', nil, :size => "40" %></p>
<p><%= text_field_tag 'principal_search', nil %></p>
<%= observe_field(:principal_search,
:frequency => 0.5,
:update => :principals,

View File

@@ -7,9 +7,11 @@
<h2><%=l(:label_overview)%></h2>
<div class="splitcontentleft">
<%= textilizable @project.description %>
<div class="wiki">
<%= textilizable @project.description %>
</div>
<ul>
<% unless @project.homepage.blank? %><li><%=l(:field_homepage)%>: <%= link_to(h(@project.homepage), @project.homepage) %></li><% end %>
<% unless @project.homepage.blank? %><li><%=l(:field_homepage)%>: <%= auto_link(h(@project.homepage)) %></li><% end %>
<% if @subprojects.any? %>
<li><%=l(:label_subproject_plural)%>:
<%= @subprojects.collect{|p| link_to(h(p), :action => 'show', :id => p)}.join(", ") %></li>

View File

@@ -16,6 +16,6 @@ dirs.each do |dir|
/ <%= link_to h(filename), :action => 'changes', :id => @project, :path => to_path_param("#{link_path}/#{filename}"), :rev => @rev %>
<% end %>
<%= "@ #{revision}" if revision %>
<%= "@ #{h revision}" if revision %>
<% html_title(with_leading_slash(path)) -%>

View File

@@ -15,6 +15,7 @@
<% end %>
&nbsp;
<div class="autoscroll">
<table class="list">
<thead><tr>
<%= sort_header_tag('login', :caption => l(:field_login)) %>
@@ -41,7 +42,7 @@
<% end -%>
</tbody>
</table>
</div>
<p class="pagination"><%= pagination_links_full @user_pages, @user_count %></p>
<% html_title(l(:label_user_plural)) -%>

View File

@@ -32,13 +32,10 @@
<%= render :partial => 'versions/overview', :locals => {:version => @version} %>
<%= render(:partial => "wiki/content", :locals => {:content => @version.wiki_page.content}) if @version.wiki_page %>
<% issues = @version.fixed_issues.find(:all,
:include => [:status, :tracker, :priority],
:order => "#{Tracker.table_name}.position, #{Issue.table_name}.id") %>
<% if issues.size > 0 %>
<% if @issues.present? %>
<fieldset class="related-issues"><legend><%= l(:label_related_issues) %></legend>
<ul>
<% issues.each do |issue| -%>
<% @issues.each do |issue| -%>
<li><%= link_to_issue(issue) %></li>
<% end -%>
</ul>

View File

@@ -25,6 +25,7 @@
<% form_tag({}, :id => 'workflow_form' ) do %>
<%= hidden_field_tag 'tracker_id', @tracker.id %>
<%= hidden_field_tag 'role_id', @role.id %>
<div class="autoscroll">
<table class="list">
<thead>
<tr>
@@ -52,6 +53,7 @@
<% end %>
</tbody>
</table>
</div>
<p><%= check_all_links 'workflow_form' %></p>
<%= submit_tag l(:button_save) %>

View File

@@ -1,4 +1,70 @@
# Outgoing email settings
# = Outgoing email settings
#
# Each environment has it's own configuration options. If you are only
# running in production, only the production block needs to be configured.
#
# == Common configurations
#
# === Sendmail command
#
# production:
# delivery_method: :sendmail
#
# === Simple SMTP server at localhost
#
# production:
# delivery_method: :smtp
# smtp_settings:
# address: "localhost"
# port: 25
#
# === SMTP server at example.com using LOGIN authentication and checking HELO for foo.com
#
# production:
# delivery_method: :smtp
# smtp_settings:
# address: "example.com"
# port: 25
# authentication: :login
# domain: 'foo.com'
# user_name: 'myaccount'
# password: 'password'
#
# === SMTP server at example.com using PLAIN authentication
#
# production:
# delivery_method: :smtp
# smtp_settings:
# address: "example.com"
# port: 25
# authentication: :plain
# domain: 'example.com'
# user_name: 'myaccount'
# password: 'password'
#
# === SMTP server at using TLS (GMail)
#
# This requires some additional configuration. See the article at:
# http://redmineblog.com/articles/setup-redmine-to-send-email-using-gmail/
#
# production:
# delivery_method: :smtp
# smtp_settings:
# tls: true
# address: "smtp.gmail.com"
# port: 587
# domain: "smtp.gmail.com" # 'your.domain.com' for GoogleApps
# authentication: :plain
# user_name: "your_email@gmail.com"
# password: "your_password"
#
#
# == More configuration options
#
# See the "Configuration options" at the following website for a list of the
# full options allowed:
#
# http://wiki.rubyonrails.org/rails/pages/HowToSendEmailsWithActionMailer
production:
delivery_method: :smtp

View File

@@ -25,5 +25,5 @@ config.action_controller.session = {
config.action_controller.allow_forgery_protection = false
config.gem "thoughtbot-shoulda", :lib => "shoulda", :source => "http://gems.github.com"
config.gem "nofxx-object_daddy", :lib => "object_daddy", :source => "http://gems.github.com"
config.gem "edavis10-object_daddy", :lib => "object_daddy"
config.gem "mocha"

View File

@@ -1,29 +1 @@
# Settings specified here will take precedence over those in config/environment.rb
# The test environment is used exclusively to run your application's
# test suite. You never need to work with it otherwise. Remember that
# your test database is "scratch space" for the test suite and is wiped
# and recreated between test runs. Don't rely on the data there!
config.cache_classes = true
# Log error messages when you accidentally call methods on nil.
config.whiny_nils = true
# Show full error reports and disable caching
config.action_controller.consider_all_requests_local = true
config.action_controller.perform_caching = false
config.action_mailer.perform_deliveries = true
config.action_mailer.delivery_method = :test
config.action_controller.session = {
:session_key => "_test_session",
:secret => "some secret phrase for the tests."
}
# Skip protect_from_forgery in requests http://m.onkey.org/2007/9/28/csrf-protection-for-your-existing-rails-application
config.action_controller.allow_forgery_protection = false
config.gem "thoughtbot-shoulda", :lib => "shoulda", :source => "http://gems.github.com"
config.gem "nofxx-object_daddy", :lib => "object_daddy", :source => "http://gems.github.com"
config.gem "mocha"
instance_eval File.read(File.join(File.dirname(__FILE__), 'test.rb'))

View File

@@ -1,29 +1 @@
# Settings specified here will take precedence over those in config/environment.rb
# The test environment is used exclusively to run your application's
# test suite. You never need to work with it otherwise. Remember that
# your test database is "scratch space" for the test suite and is wiped
# and recreated between test runs. Don't rely on the data there!
config.cache_classes = true
# Log error messages when you accidentally call methods on nil.
config.whiny_nils = true
# Show full error reports and disable caching
config.action_controller.consider_all_requests_local = true
config.action_controller.perform_caching = false
config.action_mailer.perform_deliveries = true
config.action_mailer.delivery_method = :test
config.action_controller.session = {
:session_key => "_test_session",
:secret => "some secret phrase for the tests."
}
# Skip protect_from_forgery in requests http://m.onkey.org/2007/9/28/csrf-protection-for-your-existing-rails-application
config.action_controller.allow_forgery_protection = false
config.gem "thoughtbot-shoulda", :lib => "shoulda", :source => "http://gems.github.com"
config.gem "nofxx-object_daddy", :lib => "object_daddy", :source => "http://gems.github.com"
config.gem "mocha"
instance_eval File.read(File.join(File.dirname(__FILE__), 'test.rb'))

View File

@@ -876,3 +876,9 @@ bg:
You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
Are you sure you want to continue?
label_close_versions: Close completed versions
label_board_sticky: Sticky
label_board_locked: Locked
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
label_project_copy_notifications: Send email notifications during the project copy

View File

@@ -900,3 +900,9 @@ bs:
You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
Are you sure you want to continue?
label_close_versions: Close completed versions
label_board_sticky: Sticky
label_board_locked: Locked
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
label_project_copy_notifications: Send email notifications during the project copy

View File

@@ -879,3 +879,9 @@ ca:
You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
Are you sure you want to continue?
label_close_versions: Close completed versions
label_board_sticky: Sticky
label_board_locked: Locked
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
label_project_copy_notifications: Send email notifications during the project copy

View File

@@ -882,3 +882,9 @@ cs:
You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
Are you sure you want to continue?
label_close_versions: Close completed versions
label_board_sticky: Sticky
label_board_locked: Locked
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
label_project_copy_notifications: Send email notifications during the project copy

View File

@@ -902,3 +902,9 @@ da:
You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
Are you sure you want to continue?
label_close_versions: Close completed versions
label_board_sticky: Sticky
label_board_locked: Locked
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
label_project_copy_notifications: Send email notifications during the project copy

View File

@@ -902,3 +902,9 @@ de:
Sie sind dabei, einige oder alle ihre Berechtigungen zu entfernen. Es ist möglich, dass Sie danach das Projekt nicht mehr sehen oder editieren dürfen.
Sind Sie wirklich sicher, dass Sie dies tun möchten?
label_close_versions: Vollständige Versionen schließen
label_board_sticky: Sticky
label_board_locked: Locked
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
label_project_copy_notifications: Send email notifications during the project copy

View File

@@ -882,3 +882,9 @@ el:
You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
Are you sure you want to continue?
label_close_versions: Close completed versions
label_board_sticky: Sticky
label_board_locked: Locked
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
label_project_copy_notifications: Send email notifications during the project copy

View File

@@ -329,12 +329,14 @@ en:
setting_issue_done_ratio_issue_status: Use the issue status
setting_start_of_week: Start calendars on
setting_rest_api_enabled: Enable REST web service
setting_cache_formatted_text: Cache formatted text
permission_add_project: Create project
permission_add_subprojects: Create subprojects
permission_edit_project: Edit project
permission_select_project_modules: Select project modules
permission_manage_members: Manage members
permission_manage_project_activities: Manage project activities
permission_manage_versions: Manage versions
permission_manage_categories: Manage issue categories
permission_view_issues: View Issues
@@ -382,6 +384,7 @@ en:
permission_edit_own_messages: Edit own messages
permission_delete_messages: Delete messages
permission_delete_own_messages: Delete own messages
permission_export_wiki_pages: Export wiki pages
project_module_issue_tracking: Issue tracking
project_module_time_tracking: Time tracking
@@ -662,6 +665,8 @@ en:
label_board: Forum
label_board_new: New forum
label_board_plural: Forums
label_board_locked: Locked
label_board_sticky: Sticky
label_topic_plural: Topics
label_message_plural: Messages
label_message_last: Last message
@@ -743,6 +748,7 @@ en:
label_api_access_key: API access key
label_missing_api_access_key: Missing an API access key
label_api_access_key_created_on: "API access key created {{value}} ago"
label_project_copy_notifications: Send email notifications during the project copy
button_login: Login
button_submit: Submit
@@ -880,3 +886,4 @@ en:
enumeration_doc_categories: Document categories
enumeration_activities: Activities (time tracking)
enumeration_system_activity: System Activity

View File

@@ -926,3 +926,9 @@ es:
Está a punto de eliminar algún o todos sus permisos y podría perder la posibilidad de modificar este proyecto tras hacerlo.
¿Está seguro de querer continuar?
label_close_versions: Cerrar versiones completadas
label_board_sticky: Sticky
label_board_locked: Locked
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
label_project_copy_notifications: Send email notifications during the project copy

View File

@@ -912,3 +912,9 @@ fi:
You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
Are you sure you want to continue?
label_close_versions: Close completed versions
label_board_sticky: Sticky
label_board_locked: Locked
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
label_project_copy_notifications: Send email notifications during the project copy

View File

@@ -352,6 +352,7 @@ fr:
setting_rest_api_enabled: Activer l'API REST
setting_gravatar_default: Image Gravatar par défaut
setting_start_of_week: Jour de début des calendriers
setting_cache_formatted_text: Mettre en cache le texte formaté
permission_add_project: Créer un projet
permission_add_subprojects: Créer des sous-projets
@@ -405,6 +406,8 @@ fr:
permission_edit_own_messages: Modifier ses propres messages
permission_delete_messages: Supprimer les messages
permission_delete_own_messages: Supprimer ses propres messages
permission_export_wiki_pages: Exporter les pages
permission_manage_project_activities: Gérer les activités
project_module_issue_tracking: Suivi des demandes
project_module_time_tracking: Suivi du temps passé
@@ -761,6 +764,7 @@ fr:
label_missing_feeds_access_key: Clé d'accès RSS manquante
label_close_versions: Fermer les versions terminées
label_revision_id: Revision {{value}}
label_project_copy_notifications: Envoyer les notifications durant la copie du projet
button_login: Connexion
button_submit: Soumettre
@@ -808,10 +812,10 @@ fr:
status_active: actif
status_registered: enregistré
status_locked: vérouillé
status_locked: verrouillé
version_status_open: ouvert
version_status_locked: vérouillé
version_status_locked: verrouillé
version_status_closed: fermé
text_select_mail_notifications: Actions pour lesquelles une notification par e-mail est envoyée
@@ -903,3 +907,5 @@ fr:
text_journal_deleted: "{{label}} {{old}} supprimé"
text_journal_added: "{{label}} {{value}} ajouté"
enumeration_system_activity: Activité système
label_board_sticky: Sticky
label_board_locked: Verrouillé

View File

@@ -902,3 +902,9 @@ gl:
You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
Are you sure you want to continue?
label_close_versions: Close completed versions
label_board_sticky: Sticky
label_board_locked: Locked
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
label_project_copy_notifications: Send email notifications during the project copy

View File

@@ -886,3 +886,9 @@ he:
You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
Are you sure you want to continue?
label_close_versions: Close completed versions
label_board_sticky: Sticky
label_board_locked: Locked
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
label_project_copy_notifications: Send email notifications during the project copy

View File

@@ -889,3 +889,9 @@ hr:
text_own_membership_delete_confirmation: |-
You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
Are you sure you want to continue?
label_board_sticky: Sticky
label_board_locked: Locked
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
label_project_copy_notifications: Send email notifications during the project copy

View File

@@ -907,3 +907,9 @@
You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
Are you sure you want to continue?
label_close_versions: Close completed versions
label_board_sticky: Sticky
label_board_locked: Locked
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
label_project_copy_notifications: Send email notifications during the project copy

View File

@@ -894,3 +894,9 @@ id:
You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
Are you sure you want to continue?
label_close_versions: Close completed versions
label_board_sticky: Sticky
label_board_locked: Locked
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
label_project_copy_notifications: Send email notifications during the project copy

View File

@@ -889,3 +889,9 @@ it:
You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
Are you sure you want to continue?
label_close_versions: Close completed versions
label_board_sticky: Sticky
label_board_locked: Locked
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
label_project_copy_notifications: Send email notifications during the project copy

View File

@@ -64,8 +64,8 @@ ja:
one: "1年以上"
other: "{{count}}年以上"
almost_x_years:
one: "almost 1 year"
other: "almost {{count}} years"
one: "ほぼ1年"
other: "ほぼ{{count}}"
number:
format:
@@ -321,6 +321,7 @@ ja:
setting_plain_text_mail: プレインテキストのみ(HTMLなし)
setting_host_name: ホスト名
setting_text_formatting: テキストの書式
setting_cache_formatted_text: 書式化されたテキストをキャッシュする
setting_wiki_compression: Wiki履歴を圧縮する
setting_feeds_limit: フィード内容の上限
setting_default_projects_public: デフォルトで新しいプロジェクトは公開にする
@@ -398,6 +399,7 @@ ja:
permission_rename_wiki_pages: Wikiページ名の変更
permission_delete_wiki_pages: Wikiページの削除
permission_view_wiki_pages: Wikiの閲覧
permission_export_wiki_pages: Wikiページを他の形式に出力
permission_view_wiki_edits: Wiki履歴の閲覧
permission_edit_wiki_pages: Wikiページの編集
permission_delete_wiki_pages_attachments: 添付ファイルの削除
@@ -534,6 +536,7 @@ ja:
label_version_new: 新しいバージョン
label_version_plural: バージョン
label_confirmation: 確認
label_close_versions: 完了したバージョンを終了にする
label_export_to: '他の形式に出力:'
label_read: 読む...
label_public_projects: 公開プロジェクト
@@ -587,8 +590,8 @@ ja:
label_query_new: 新しいクエリ
label_filter_add: フィルタ追加
label_filter_plural: フィルタ
label_equals: 含む
label_not_equals: 含まない
label_equals: 等しい
label_not_equals: 等しくない
label_in_less_than: が今日から○日後以前
label_in_more_than: が今日から○日後以降
label_greater_or_equal: 以上
@@ -692,6 +695,8 @@ ja:
label_board: フォーラム
label_board_new: 新しいフォーラム
label_board_plural: フォーラム
label_board_sticky: スティッキー
label_board_locked: ロック
label_topic_plural: トピック
label_message_plural: メッセージ
label_message_last: 最新のメッセージ
@@ -910,4 +915,5 @@ ja:
enumeration_doc_categories: 文書カテゴリ
enumeration_activities: 作業分類 (時間トラッキング)
enumeration_system_activity: システム作業分類
label_close_versions: Close completed versions
permission_manage_project_activities: Manage project activities
label_project_copy_notifications: Send email notifications during the project copy

View File

@@ -2,7 +2,7 @@
# by Kihyun Yoon(ddumbugie@gmail.com),http://plenum.textcube.com/
# by John Hwang (jhwang@tavon.org),http://github.com/tavon
# by Yonghwan SO(please insert your email), last update at 2009-09-11
# last update at 2009-09-11 by Kihyun Yoon
# last update at 2010-01-23 by Kihyun Yoon
ko:
date:
formats:
@@ -65,8 +65,8 @@ ko:
one: "일년 이상"
other: "{{count}}년 이상"
almost_x_years:
one: "almost 1 year"
other: "almost {{count}} years"
one: "약 1년"
other: " {{count}}"
prompts:
year: "년"
month: "월"
@@ -182,8 +182,8 @@ ko:
general_lang_name: '한국어(Korean)'
general_csv_separator: ','
general_csv_decimal_separator: '.'
general_csv_encoding: UTF-8
general_pdf_encoding: UTF-8
general_csv_encoding: CP949
general_pdf_encoding: CP949
general_first_day_of_week: '7'
notice_account_updated: 계정이 성공적으로 변경되었습니다.
@@ -709,7 +709,7 @@ ko:
label_language_based: 언어설정에 따름
label_sort_by: "{{value}}(으)로 정렬"
label_send_test_email: 테스트 메일 보내기
label_feeds_access_key_created_on: "피드 접근 키가 {{value}} 이전에 생성"
label_feeds_access_key_created_on: "피드 접근 키가 {{value}} 이전에 생성되었습니다."
label_module_plural: 모듈
label_added_time_by: "{{author}}이(가) {{age}} 전에 추가함"
label_updated_time_by: "{{author}}이(가) {{age}} 전에 변경"
@@ -925,20 +925,26 @@ ko:
setting_start_of_week: 달력 시작 요일
permission_view_issues: 일감 보기
label_display_used_statuses_only: 이 일감유형에서 사용되는 상태만 보여주기
label_revision_id: Revision {{value}}
label_api_access_key: API access key
label_api_access_key_created_on: API access key created {{value}} ago
label_feeds_access_key: RSS access key
notice_api_access_key_reseted: Your API access key was reset.
setting_rest_api_enabled: Enable REST web service
label_missing_api_access_key: Missing an API access key
label_missing_feeds_access_key: Missing a RSS access key
button_show: Show
text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject
label_revision_id: 개정판 {{value}}
label_api_access_key: API 접근키
label_api_access_key_created_on: API 접근키가 {{value}} 전에 생성되었습니다.
label_feeds_access_key: RSS 접근키
notice_api_access_key_reseted: API 접근키가 초기화되었습니다.
setting_rest_api_enabled: REST 웹서비스 활성화
label_missing_api_access_key: API 접근키가 없습니다.
label_missing_feeds_access_key: RSS 접근키가 없습니다.
button_show: 보기
text_line_separated: 여러 값이 허용됨(값 마다 한 줄씩)
setting_mail_handler_body_delimiters: 메일 본문 구분자
permission_add_subprojects: 하위 프로젝트 만들기
label_subproject_new: 새 하위 프로젝트
text_own_membership_delete_confirmation: |-
You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
Are you sure you want to continue?
label_close_versions: Close completed versions
권한들 일부 또는 전부를 막 삭제하려고 하고 있습니다. 그렇게 되면 이 프로젝트를 더이상 수정할 수 없게 됩니다.
계속하시겠습니까?
label_close_versions: 완료된 버전 닫기
label_board_sticky: Sticky
label_board_locked: Locked
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
label_project_copy_notifications: Send email notifications during the project copy

View File

@@ -950,3 +950,9 @@ lt:
You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
Are you sure you want to continue?
label_close_versions: Close completed versions
label_board_sticky: Sticky
label_board_locked: Locked
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
label_project_copy_notifications: Send email notifications during the project copy

View File

@@ -864,3 +864,9 @@ nl:
You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
Are you sure you want to continue?
label_close_versions: Close completed versions
label_board_sticky: Sticky
label_board_locked: Locked
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
label_project_copy_notifications: Send email notifications during the project copy

View File

@@ -877,3 +877,9 @@
You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
Are you sure you want to continue?
label_close_versions: Close completed versions
label_board_sticky: Sticky
label_board_locked: Locked
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
label_project_copy_notifications: Send email notifications during the project copy

View File

@@ -907,3 +907,9 @@ pl:
version_status_locked: zablokowana
version_status_open: otwarta
label_board_sticky: Przyklejona
label_board_locked: Zamknięta
permission_export_wiki_pages: Eksport stron wiki
permission_manage_project_activities: Zarządzanie aktywnościami projektu
setting_cache_formatted_text: Cache formatted text
label_project_copy_notifications: Send email notifications during the project copy

View File

@@ -901,11 +901,18 @@ pt-BR:
setting_rest_api_enabled: Habilitdar REST web service
label_missing_api_access_key: Chave de acesso a API faltando
label_missing_feeds_access_key: Chave de acesso ao RSS faltando
text_line_separated: Multiple values allowed (one line for each value).
setting_mail_handler_body_delimiters: Truncate emails after one of these lines
permission_add_subprojects: Create subprojects
label_subproject_new: New subproject
text_line_separated: Múltiplos valores permitidos (uma linha para cada valor).
setting_mail_handler_body_delimiters: Truncar e-mails após uma destas linhas
permission_add_subprojects: Criar subprojetos
label_subproject_new: Novo subprojeto
text_own_membership_delete_confirmation: |-
You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
Are you sure you want to continue?
label_close_versions: Close completed versions
Você está para remover algumas de suas próprias permissões e pode não mais estar apto a editar este projeto após esta operação.
Você tem certeza que deseja continuar?
label_close_versions: Fechar versões concluídas
label_board_sticky: Marcado
label_board_locked: Travado
label_change_log: Registro de alterações
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
label_project_copy_notifications: Send email notifications during the project copy

View File

@@ -894,3 +894,9 @@ pt:
You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
Are you sure you want to continue?
label_close_versions: Close completed versions
label_board_sticky: Sticky
label_board_locked: Locked
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
label_project_copy_notifications: Send email notifications during the project copy

View File

@@ -879,3 +879,9 @@ ro:
You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
Are you sure you want to continue?
label_close_versions: Close completed versions
label_board_sticky: Sticky
label_board_locked: Locked
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
label_project_copy_notifications: Send email notifications during the project copy

View File

@@ -650,7 +650,7 @@ ru:
label_send_information: Отправить пользователю информацию по учетной записи
label_send_test_email: Послать email для проверки
label_settings: Настройки
label_show_completed_versions: Показать завершенную версию
label_show_completed_versions: Показывать завершенные версии
label_sort: Сортировать
label_sort_by: "Сортировать по {{value}}"
label_sort_higher: Вверх
@@ -941,7 +941,7 @@ ru:
text_journal_added: "{{label}} {{value}} добавлен"
field_active: Активно
enumeration_system_activity: Системная активность
permission_delete_issue_watchers: Удалить наблюдателей
permission_delete_issue_watchers: Удаление наблюдателей
version_status_closed: закрыт
version_status_locked: заблокирован
version_status_open: открыт
@@ -974,7 +974,7 @@ ru:
label_api_access_key: Ключ доступа к API
text_line_separated: Разрешено несколько значений (по одному значению в строку).
label_revision_id: Ревизия {{value}}
permission_view_issues: Показать проблемы
permission_view_issues: Просмотр задач
label_display_used_statuses_only: Отображать только те статусы, которые используются в этом трекере
label_api_access_key_created_on: Ключ доступ к API был создан {{value}} назад
label_feeds_access_key: Ключ доступа к RSS
@@ -984,9 +984,15 @@ ru:
label_missing_api_access_key: Отсутствует ключ доступа к API
label_missing_feeds_access_key: Отсутствует ключ доступа к RSS
setting_mail_handler_body_delimiters: Урезать письмо после одной из этих строк
permission_add_subprojects: Создать подпроекты
permission_add_subprojects: Создание подпроектов
label_subproject_new: Новый подпроект
text_own_membership_delete_confirmation: |-
Вы собираетесь удалить некоторые или все права, из-за чего могут пропасть права на редактирование этого проекта.
Продолжить?
label_close_versions: Закрыть завершенные версии
label_board_sticky: Прикреплена
label_board_locked: Заблокирована
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
label_project_copy_notifications: Send email notifications during the project copy

View File

@@ -881,3 +881,9 @@ sk:
You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
Are you sure you want to continue?
label_close_versions: Close completed versions
label_board_sticky: Sticky
label_board_locked: Locked
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
label_project_copy_notifications: Send email notifications during the project copy

View File

@@ -878,3 +878,9 @@ sl:
You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
Are you sure you want to continue?
label_close_versions: Close completed versions
label_board_sticky: Sticky
label_board_locked: Locked
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
label_project_copy_notifications: Send email notifications during the project copy

View File

@@ -897,3 +897,9 @@
You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
Are you sure you want to continue?
label_close_versions: Close completed versions
label_board_sticky: Sticky
label_board_locked: Locked
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
label_project_copy_notifications: Send email notifications during the project copy

View File

@@ -713,6 +713,8 @@ sv:
label_board: Forum
label_board_new: Nytt forum
label_board_plural: Forum
label_board_locked: Låst
label_board_sticky: Sticky
label_topic_plural: Ämnen
label_message_plural: Meddelanden
label_message_last: Senaste meddelande
@@ -931,3 +933,7 @@ sv:
enumeration_doc_categories: Dokumentkategorier
enumeration_activities: Aktiviteter (tidsuppföljning)
enumeration_system_activity: Systemaktivitet
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
label_project_copy_notifications: Send email notifications during the project copy

View File

@@ -879,3 +879,9 @@ th:
You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
Are you sure you want to continue?
label_close_versions: Close completed versions
label_board_sticky: Sticky
label_board_locked: Locked
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
label_project_copy_notifications: Send email notifications during the project copy

View File

@@ -909,3 +909,9 @@ tr:
You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
Are you sure you want to continue?
label_close_versions: Close completed versions
label_board_sticky: Sticky
label_board_locked: Locked
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
label_project_copy_notifications: Send email notifications during the project copy

View File

@@ -878,3 +878,9 @@ uk:
You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
Are you sure you want to continue?
label_close_versions: Close completed versions
label_board_sticky: Sticky
label_board_locked: Locked
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
label_project_copy_notifications: Send email notifications during the project copy

View File

@@ -941,3 +941,9 @@ vi:
You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
Are you sure you want to continue?
label_close_versions: Close completed versions
label_board_sticky: Sticky
label_board_locked: Locked
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
label_project_copy_notifications: Send email notifications during the project copy

View File

@@ -755,6 +755,8 @@
label_board: 論壇
label_board_new: 建立新論壇
label_board_plural: 論壇
label_board_locked: 鎖定
label_board_sticky: 置頂
label_topic_plural: 討論主題
label_message_plural: 訊息
label_message_last: 上一封訊息
@@ -973,3 +975,7 @@
enumeration_doc_categories: 文件分類
enumeration_activities: 活動 (時間追蹤)
enumeration_system_activity: 系統活動
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
label_project_copy_notifications: Send email notifications during the project copy

View File

@@ -904,3 +904,9 @@ zh:
enumeration_doc_categories: 文档类别
enumeration_activities: 活动(时间跟踪)
enumeration_system_activity: 系统活动
label_board_sticky: Sticky
label_board_locked: Locked
permission_export_wiki_pages: Export wiki pages
setting_cache_formatted_text: Cache formatted text
permission_manage_project_activities: Manage project activities
label_project_copy_notifications: Send email notifications during the project copy

View File

@@ -0,0 +1,9 @@
class AddIndexOnChangesetsScmid < ActiveRecord::Migration
def self.up
add_index :changesets, [:repository_id, :scmid], :name => :changesets_repos_scmid
end
def self.down
remove_index :changesets, :name => :changesets_repos_scmid
end
end

View File

@@ -4,7 +4,97 @@ Redmine - project management software
Copyright (C) 2006-2010 Jean-Philippe Lang
http://www.redmine.org/
== 0.9.1
== v1.0.0
Adds context menu to the roadmap issue lists
== 2010-07-07 v0.9.6
Fixed: Redmine.pm access by unauthorized users
== 2010-06-24 v0.9.5
Linkify folder names on revision view
"fiters" and "options" should be hidden in print view via css
Fixed: NoMethodError when no issue params are submitted
Fixed: projects.atom with required authentication
Fixed: External links not correctly displayed in Wiki TOC
Fixed: Member role forms in project settings are not hidden after member added
Fixed: pre can't be inside p
Fixed: session cookie path does not respect RAILS_RELATIVE_URL_ROOT
Fixed: mail handler fails when the from address is empty
== 2010-05-01 v0.9.4
Filters collapsed by default on issues index page for a saved query
Fixed: When categories list is too big the popup menu doesn't adjust (ex. in the issue list)
Fixed: remove "main-menu" div when the menu is empty
Fixed: Code syntax highlighting not working in Document page
Fixed: Git blame/annotate fails on moved files
Fixed: Failing test in test_show_atom
Fixed: Migrate from trac - not displayed Wikis
Fixed: Email notifications on file upload sent to empty recipient list
Fixed: Migrating from trac is not possible, fails to allocate memory
Fixed: Lost password no longer flashes a confirmation message
Fixed: Crash while deleting in-use enumeration
Fixed: Hard coded English string at the selection of issue watchers
Fixed: Bazaar v2.1.0 changed behaviour
Fixed: Roadmap display can raise an exception if no trackers are selected
Fixed: Gravatar breaks layout of "logged in" page
Fixed: Reposman.rb on Windows
Fixed: Possible error 500 while moving an issue to another project with SQLite
Fixed: backslashes in issue description/note should be escaped when quoted
Fixed: Long text in <pre> disrupts Associated revisions
Fixed: Links to missing wiki pages not red on project overview page
Fixed: Cannot delete a project with subprojects that shares versions
Fixed: Update of Subversion changesets broken under Solaris
Fixed: "Move issues" permission not working for Non member
Fixed: Sidebar overlap on Users tab of Group editor
Fixed: Error on db:migrate with table prefix set (hardcoded name in principal.rb)
Fixed: Report shows sub-projects for non-members
Fixed: 500 internal error when browsing any Redmine page in epiphany
Fixed: Watchers selection lost when issue creation fails
Fixed: When copying projects, redmine should not generate an email to people who created issues
Fixed: Issue "#" table cells should have a class attribute to enable fine-grained CSS theme
Fixed: Plugin generators should display help if no parameter is given
== 2010-02-28 v0.9.3
Adds filter for system shared versions on the cross project issue list
Makes project identifiers searchable
Remove invalid utf8 sequences from commit comments and author name
Fixed: Wrong link when "http" not included in project "Homepage" link
Fixed: Escaping in html email templates
Fixed: Pound (#) followed by number with leading zero (0) removes leading zero when rendered in wiki
Fixed: Deselecting textile text formatting causes interning empty string errors
Fixed: error with postgres when entering a non-numeric id for an issue relation
Fixed: div.task incorrectly wrapping on Gantt Chart
Fixed: Project copy loses wiki pages hierarchy
Fixed: parent project field doesn't include blank value when a member with 'add subproject' permission edits a child project
Fixed: Repository.fetch_changesets tries to fetch changesets for archived projects
Fixed: Duplicated project name for subproject version on gantt chart
Fixed: roadmap shows subprojects issues even if subprojects is unchecked
Fixed: IndexError if all the :last menu items are deleted from a menu
Fixed: Very high CPU usage for a long time when fetching commits from a large Git repository
== 2010-02-07 v0.9.2
* Fixed: Sub-project repository commits not displayed on parent project issues
* Fixed: Potential security leak on my page calendar
* Fixed: Project tree structure is broken by deleting the project with the subproject
* Fixed: Error message shown duplicated when creating a new group
* Fixed: Firefox cuts off large pages
* Fixed: Invalid format parameter returns a DoubleRenderError on issues index
* Fixed: Unnecessary Quote button on locked forum message
* Fixed: Error raised when trying to view the gantt or calendar with a grouped query
* Fixed: PDF support for Korean locale
* Fixed: Deprecation warning in extra/svn/reposman.rb
== 2010-01-30 v0.9.1
* Vertical alignment for inline images in formatted text set to 'middle'
* Fixed: Redmine.pm error "closing dbh with active statement handles at /usr/lib/perl5/Apache/Redmine.pm"

View File

@@ -7,7 +7,11 @@ http://www.redmine.org/
== Requirements
* Ruby on Rails 2.3.5
* Ruby 1.8.6 or 1.8.7
* Ruby on Rails 2.3.5 (official downloadable Redmine releases are packaged with
the appropriate Rails version)
* A database:
* MySQL (tested with MySQL 5)
* PostgreSQL (tested with PostgreSQL 8.1)
@@ -26,15 +30,15 @@ Optional:
3. Configure database parameters in config/database.yml
for "production" environment (default database is MySQL)
4. Create the database structure. Under the application main directory:
4. Generate a session store secret
Redmine stores session data in cookies by default, which requires
a secret to be generated. Run:
rake generate_session_store
5. Create the database structure. Under the application main directory:
rake db:migrate RAILS_ENV="production"
It will create tables and an administrator account.
5. Generate a session store secret
Redmine stores session data in cookies by default, which requires
a secret to be generated. Run:
rake config/initializers/session_store.rb
6. Setting up permissions
The user who runs Redmine must have write permission on the following
subdirectories: files, log, tmp (create the last one if not present).

View File

@@ -12,18 +12,18 @@ http://www.redmine.org/
2. Copy your database settings (RAILS_ROOT/config/database.yml)
and SMTP settings (RAILS_ROOT/config/email.yml)
into the new config directory
DO NOT REPLACE ANY OTHERS FILES.
3. Migrate your database (please make a backup before doing this):
rake db:migrate RAILS_ENV="production"
DO NOT REPLACE OR EDIT ANY OTHER FILES.
4. Copy the RAILS_ROOT/files directory content into your new installation
This directory contains all the attached files
5. Generate a session store secret
3. Generate a session store secret
Redmine stores session data in cookies by default, which requires
a secret to be generated. Run:
rake config/initializers/session_store.rb
rake generate_session_store
4. Migrate your database (please make a backup before doing this):
rake db:migrate RAILS_ENV="production"
5. Copy the RAILS_ROOT/files directory content into your new installation
This directory contains all the attached files
== Notes

View File

@@ -227,9 +227,38 @@ sub authen_handler {
}
}
# check if authentication is forced
sub is_authentication_forced {
my $r = shift;
my $dbh = connect_database($r);
my $sth = $dbh->prepare(
"SELECT value FROM settings where settings.name = 'login_required';"
);
$sth->execute();
my $ret = 0;
if (my @row = $sth->fetchrow_array) {
if ($row[0] eq "1" || $row[0] eq "t") {
$ret = 1;
}
}
$sth->finish();
undef $sth;
$dbh->disconnect();
undef $dbh;
$ret;
}
sub is_public_project {
my $project_id = shift;
my $r = shift;
if (is_authentication_forced($r)) {
return 0;
}
my $dbh = connect_database($r);
my $sth = $dbh->prepare(
@@ -309,7 +338,9 @@ sub is_member {
bindpw => $rowldap[4] ? $rowldap[4] : "",
filter => "(".$rowldap[6]."=%s)"
);
$ret = 1 if ($ldap->authenticate($redmine_user, $redmine_pass));
my $method = $r->method;
$ret = 1 if ($ldap->authenticate($redmine_user, $redmine_pass) && ((defined $read_only_methods{$method} && $permissions =~ /:browse_repository/) || $permissions =~ /:commit_access/));
}
$sthldap->finish();
undef $sthldap;

View File

@@ -175,7 +175,7 @@ unless File.directory?($repos_base)
end
begin
require 'activeresource'
require 'active_resource'
rescue LoadError
log("This script requires activeresource.\nRun 'gem install activeresource' to install it.", :exit => true)
end
@@ -221,10 +221,14 @@ def other_read_right?(file)
end
def owner_name(file)
RUBY_PLATFORM =~ /mswin/ ?
mswin? ?
$svn_owner :
Etc.getpwuid( File.stat(file).uid ).name
end
def mswin?
(RUBY_PLATFORM =~ /(:?mswin|mingw)/) || (RUBY_PLATFORM == 'java' && (ENV['OS'] || ENV['os']) =~ /windows/i)
end
projects.each do |project|
log("treating project #{project.name}", :level => 1)
@@ -303,4 +307,4 @@ projects.each do |project|
end
end

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