Compare commits

...

2613 Commits

Author SHA1 Message Date
Toshi MARUYAMA
bc79904e4e Merged r4806 from trunk.
scm: change gunzip to tar -z option for scm repository setup in lib/tasks/testing.rake.

Pipe does not work on Mingw Ruby.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@6271 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-07-15 00:48:46 +00:00
Toshi MARUYAMA
ffc111bd23 Merged r6127 from trunk.
Escape AuthSources in the list.

Contributed by MAEDA, Go

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@6129 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-06-27 23:21:45 +00:00
Toshi MARUYAMA
2a2e705e9e Merged r5743 from trunk.
Russian "default_issue_status_rejected" and "default_tracker_feature" changed.

Contributed by Dmitry Babenko.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5744 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-05-11 23:03:23 +00:00
Toshi MARUYAMA
31cd20f2b6 Merged r5740 from trunk.
Hungarian translation for 1.1.3 updated by Gábor Takács.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5742 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-05-11 22:31:54 +00:00
Toshi MARUYAMA
4fc2e757f6 Merged r5644 from trunk.
scm: git: add comments of revision order in fetch_changesets().

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5646 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-05-04 23:43:40 +00:00
Toshi MARUYAMA
240254b1a3 Merged r5643 from trunk.
scm: git: rearrange fetch_changesets() comment.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5645 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-05-04 23:42:58 +00:00
Toshi MARUYAMA
95f3c336d5 Merged r5621 from trunk.
Fix a typo in Czech localization.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5623 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-05-04 00:43:17 +00:00
Toshi MARUYAMA
d63e3a781f Merged r5620 from trunk.
Simplified Chinese translation updated by Sam Qiu.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5622 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-05-04 00:42:54 +00:00
Toshi MARUYAMA
0aab60943c Merged r5614 from trunk.
Fix a typo in public/help/wiki_syntax_detailed.html.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5616 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-05-02 23:17:02 +00:00
Toshi MARUYAMA
935306af80 Merged r5611 from trunk.
Fix potential Execution After Redirect bugs.

Execution After Redirect (EAR) happens when redirect in a controller is
triggered but there still is code that is executed in the action.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5613 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-05-01 23:20:46 +00:00
Toshi MARUYAMA
6fce2170c4 Merged r5610 from trunk.
Add missing fixture when running tests from scratch in functional RolesControllerTest.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5612 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-05-01 23:20:04 +00:00
Jean-Philippe Lang
3f302b66ce Updates for 1.1.3 release.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5592 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-29 09:23:34 +00:00
Jean-Philippe Lang
32022267af Merged r5285 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5591 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-29 09:07:40 +00:00
Jean-Philippe Lang
f078f7127c Merged r5283 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5590 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-29 09:06:32 +00:00
Jean-Philippe Lang
c2cd4b7f48 Merged r5176 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5589 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-29 09:02:29 +00:00
Jean-Philippe Lang
0b5b8bebd1 Merged r5171 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5588 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-29 09:01:37 +00:00
Jean-Philippe Lang
9f36f18b39 Merged r4735 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5587 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-29 08:59:30 +00:00
Jean-Philippe Lang
fab0774c4b Fixes Prototypejs Form.serialize() for multiple selects (#7954).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5586 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-29 07:38:24 +00:00
Jean-Philippe Lang
93c0b120de Merged r5469 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5585 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-29 07:37:03 +00:00
Jean-Philippe Lang
e20191e666 Backported r5581 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5584 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-29 07:34:09 +00:00
Jean-Philippe Lang
8d3b32644b Merged r5330 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5583 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-29 07:31:21 +00:00
Jean-Philippe Lang
6153d5ab83 Merged r5265 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5582 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-29 07:29:23 +00:00
Jean-Philippe Lang
f49904569d Merged r5215 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5580 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-29 07:16:39 +00:00
Jean-Philippe Lang
f48460da4f Merged r5300 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5579 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-29 07:15:46 +00:00
Jean-Philippe Lang
bd55d7f815 Merged r5232 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5578 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-29 07:14:52 +00:00
Jean-Philippe Lang
4402e7e232 Merged r5214 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5577 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-29 07:13:59 +00:00
Jean-Philippe Lang
b43ebcbdc4 Merged r5186 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5576 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-29 07:12:52 +00:00
Jean-Philippe Lang
55fd2f5562 Merged r5185 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5575 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-29 07:11:56 +00:00
Jean-Philippe Lang
8a734f9997 Merged r5157 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5574 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-29 07:10:27 +00:00
Jean-Philippe Lang
d60949ca87 Merged r5181 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5573 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-29 07:09:19 +00:00
Jean-Philippe Lang
aef8228b0e Merged r5100 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5572 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-29 07:08:39 +00:00
Jean-Philippe Lang
20e6652109 Merged r5236 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5571 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-29 07:07:28 +00:00
Jean-Philippe Lang
d2bc5a9473 Merged r5105 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5570 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-29 07:05:41 +00:00
Jean-Philippe Lang
23e75d87d3 Merged r5097 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5569 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-29 07:04:23 +00:00
Jean-Philippe Lang
8a13595c64 Merged r5230 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5568 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-29 07:02:26 +00:00
Jean-Philippe Lang
7845843596 Merged r5225 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5567 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-29 07:00:16 +00:00
Toshi MARUYAMA
f26a504045 Merged r5557 from trunk.
Delete doc/git.rdoc.

http://www.redmine.org/projects/redmine/wiki/Contribute?version=27 has the github mirror link.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5558 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-27 22:43:42 +00:00
Toshi MARUYAMA
f274193893 Merged r5555 from trunk.
Remove obsolete github descriptions from doc/git.rdoc.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5556 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-27 14:08:01 +00:00
Toshi MARUYAMA
0ba400834c Merged r5553 from trunk.
Fix notice_failed_to_save_issues format in es, gl and ca locales.

Contributed by Jose M. Prieto.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5554 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-27 10:51:10 +00:00
Toshi MARUYAMA
e6148cfdd4 Merged r5502 from trunk.
Simplified Chinese translation updated by Peng Wang.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5503 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-18 04:29:28 +00:00
Toshi MARUYAMA
99b1b95222 Merged r5500 from trunk.
Czech translation updated by Lubor Nosek.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5501 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-17 23:42:31 +00:00
Toshi MARUYAMA
a9a5870d25 Merged r4901 from trunk.
Updated basque and czech translations. Contributed by Ales Zabala Alava and Michal Gebauer.

#7390 depends on this commit.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5497 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-17 16:26:53 +00:00
Toshi MARUYAMA
f09f2e8e63 scm: git: backout r5336 (#8081, #8083).
Git on Redmine CI Server does not support "--no-decorate" option of "git log".

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5347 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-06 06:59:50 +00:00
Toshi MARUYAMA
2a1203bfef scm: git: backout r5340 (#8081, #8083).
Git on Redmine CI Server does not support "--no-decorate" option of "git log".

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5346 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-06 06:58:47 +00:00
Toshi MARUYAMA
f6918d0242 Merged r5338 from trunk.
scm: git: add "decorate = short" in config log section of test repository.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5340 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-06 02:52:59 +00:00
Toshi MARUYAMA
e338f522dd Merged r5334 from trunk.
scm: git: add "--no-decorate" option in "git log".

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5336 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-05 23:18:29 +00:00
Jean-Philippe Lang
ab10e187a6 Merged r5322 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5323 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-05 12:17:43 +00:00
Toshi MARUYAMA
12801275a8 Merged r5281 from trunk.
r5256 in trunk and r5271 in 1.1-stable fixed #7794 completely.
r5253 (r5183) in trunk and r5184 effect the width of the ASCII character of Japanese PDF.

Contributed by Jun NAITOH.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5282 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-01 15:54:05 +00:00
Toshi MARUYAMA
e35e04de8e PDF: fix the width of the ASCII character of Japanese PDF (#7794).
r5256 in trunk has this change.
So, there is no need to commit in trunk.

Contributed by Jun NAITOH.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5271 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-04-01 01:26:38 +00:00
Toshi MARUYAMA
3ca48e1ecf Merged r5233 from trunk.
i18n: fix typo general_pdf_encoding "UFT-8" in sl.yml.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5234 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-03-28 01:14:15 +00:00
Toshi MARUYAMA
f49bbf48e7 Merged r5183 from trunk.
Fix an internal server error on formatting an issue as a PDF in Japanese.

Contributed by Yuki Sonoda.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5184 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-03-21 06:17:06 +00:00
Toshi MARUYAMA
891ed84fe3 Merged r5091 from trunk.
scm: mercurial: add :order => 'id DESC' explicitly for MySQL test fails.

Because :order => 'id DESC' is defined at 'has_many',
there is no need to set 'order'.
But, MySQL test fails.
Sqlite3 and PostgreSQL pass.
Is this MySQL bug?

MySQL svn trunk test on Redmine CI server fails.
But, svn 1.1-stable passes.
If this is MySQL bug, this effects 1.1-stable, too.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5092 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-03-11 07:46:23 +00:00
Jean-Philippe Lang
78a4a995e6 Merged r5030 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5031 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-03-07 19:27:14 +00:00
Jean-Philippe Lang
465534a298 Merged r5021 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5022 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-03-06 16:12:27 +00:00
Jean-Philippe Lang
d5f1bd07b2 Updates for 1.1.2 release.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5020 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-03-06 13:19:48 +00:00
Jean-Philippe Lang
50863117b8 Translations updates.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5018 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-03-06 13:12:50 +00:00
Jean-Philippe Lang
c6693fc78b Merged r4937 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5017 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-03-06 13:08:02 +00:00
Jean-Philippe Lang
1e01711e3d Merged r4946 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5015 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-03-06 12:57:03 +00:00
Jean-Philippe Lang
1ab7f6f930 Merged r4820 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5014 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-03-06 12:54:59 +00:00
Jean-Philippe Lang
f6f7467cdd Merged r4913, r4914, r4916 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5013 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-03-06 12:51:10 +00:00
Jean-Philippe Lang
4d0a955d3c Merged r5004 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5012 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-03-06 12:48:40 +00:00
Jean-Philippe Lang
c45044f13c Merged r4888 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5011 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-03-06 12:47:05 +00:00
Jean-Philippe Lang
4761e55691 Merged r4951 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@5010 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-03-06 12:45:56 +00:00
Jean-Philippe Lang
af7fb657f4 Merged r4889 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4973 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-02-28 20:36:06 +00:00
Jean-Philippe Lang
0805ab943e Merged r4890 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4972 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-02-28 20:34:31 +00:00
Jean-Philippe Lang
9589c0bcad Merged r4811 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4971 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-02-28 20:33:31 +00:00
Jean-Philippe Lang
91295ea6cd Merged r4935 and r4947 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4970 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-02-28 20:32:25 +00:00
Jean-Philippe Lang
d0f4b5aa50 Merged r4968 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4969 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-02-28 20:27:44 +00:00
Jean-Philippe Lang
008e8d4fbf Merged r4965 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4966 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-02-28 16:45:02 +00:00
Toshi MARUYAMA
1e50fea55a Merged r4860 from trunk.
scm: fix diff revision param validation.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4877 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-02-18 13:48:29 +00:00
Toshi MARUYAMA
008d38d6b4 Merged r4816 from trunk.
scm: fix non ASCII filename downloaded from repo is broken on Internet Explorer.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4819 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-02-12 09:51:43 +00:00
Toshi MARUYAMA
c61c9e6471 Merged r4815 from trunk.
scm: cvs: fix most binary files become corrupted on Windows.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4818 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-02-12 09:51:21 +00:00
Jean-Baptiste Barth
e5b5b61d6e Merged r4813 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4814 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-02-12 09:03:36 +00:00
Jean-Baptiste Barth
6a8cdf54b3 Removed .project file and added it to svn:ignore'd files. #7497
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4812 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-02-12 08:56:19 +00:00
Jean-Baptiste Barth
e43d98a6f5 Merged r4799 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4800 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-02-06 00:34:21 +00:00
Jean-Philippe Lang
11b774d39d Merged r4784 from trunk (update for 1.1.1 release).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4785 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-30 14:38:25 +00:00
Jean-Philippe Lang
77c4667dbc Merged r4782 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4783 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-30 09:13:36 +00:00
Jean-Philippe Lang
f05fdd5cfa Merged r4780 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4781 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-30 06:54:51 +00:00
Jean-Philippe Lang
a0bb70ed2d Merged r4765 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4779 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-30 06:45:15 +00:00
Jean-Philippe Lang
1d5c3f7fba Translations updates.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4778 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-30 06:43:27 +00:00
Jean-Philippe Lang
8b83aa1470 Merged r4775 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4776 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-30 06:32:10 +00:00
Jean-Philippe Lang
3a92721af4 Merged r4739 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4774 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-30 06:22:38 +00:00
Jean-Philippe Lang
b3218ba4d4 Merged r4700 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4773 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-30 06:16:06 +00:00
Jean-Philippe Lang
975ee2b522 Merged r4701 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4772 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-30 06:11:51 +00:00
Jean-Philippe Lang
27a319e66d Merged r4727 and r4730 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4771 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-30 06:10:36 +00:00
Jean-Philippe Lang
7be5bf6e4d Merged r4741 and r4764 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4770 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-30 06:08:01 +00:00
Jean-Philippe Lang
c73d4042d1 Merged r4677 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4769 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-30 06:05:54 +00:00
Jean-Philippe Lang
8270ad1e64 Merged r4736 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4768 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-30 06:04:40 +00:00
Jean-Philippe Lang
26016fbf43 Merged r4761 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4767 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-30 06:02:16 +00:00
Jean-Philippe Lang
307e4ceaa2 Merged r4708 and r4709 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4766 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-30 06:00:56 +00:00
Jean-Philippe Lang
03085e85f9 Merged r4720, r4724, r4738 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4763 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-27 17:51:01 +00:00
Jean-Philippe Lang
1f4e0dc10c Merged r4719 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4762 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-27 17:44:40 +00:00
Toshi MARUYAMA
f69c95306d Merged r4749 from trunk.
scm: darcs: fix Darcs adapter recognizes new files as modified files above Darcs 2.4.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4751 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-23 04:21:57 +00:00
Toshi MARUYAMA
634ede3e8b Merged r4748 from trunk.
scm: darcs: add compatible test of Darcs 2.3 and 2.4.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4750 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-23 04:21:34 +00:00
Toshi MARUYAMA
c2a2979189 Merged r4744 from trunk.
scm: darcs: switch '.' or @url at entries() in darcs version.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4747 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-23 04:03:04 +00:00
Toshi MARUYAMA
9800469943 Merged r4743 from trunk.
scm: darcs: change io.gets to io.read and add darcs version unit test.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4746 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-23 04:02:41 +00:00
Toshi MARUYAMA
e47f1d5595 Merged r4742 from trunk.
scm: darcs: add unit lib test.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4745 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-23 04:02:15 +00:00
Jean-Philippe Lang
135fe04d02 Merged r4681 from trunk (missing fixtures breaking tests).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4732 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-16 16:39:19 +00:00
Jean-Philippe Lang
794d7c0959 Merged r4680 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4728 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-16 14:44:38 +00:00
Toshi MARUYAMA
b8f365f2a1 Merged r4713 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4717 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-14 23:37:50 +00:00
Toshi MARUYAMA
6188b9eddb Merged r4710 and r4714 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4716 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-14 23:37:30 +00:00
Toshi MARUYAMA
96c4dc3f1e Merged r4712 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4715 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-14 23:37:10 +00:00
Toshi MARUYAMA
b877215261 Merged r4703 from trunk (scm: fix error on revision page for empty revision).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4707 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-13 12:10:52 +00:00
Toshi MARUYAMA
788b143596 Merged r4665 from trunk.
scm: add compatible functional test fof changing diff revisions label at SCM adapter level.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4706 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-13 12:10:30 +00:00
Toshi MARUYAMA
6a261eb5a0 Merged r4691 from trunk (fix assert_equal parameter order in subversion and git unit test).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4693 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-11 15:28:23 +00:00
Toshi MARUYAMA
007fbc00cf Merged r4687 from trunk (fix setup mercurial test repository).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4689 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-11 08:46:27 +00:00
Toshi MARUYAMA
9b8b4b3bfc Merged r4683 from trunk (test:scm:setup:mercurial task can be simpler).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4685 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-11 04:22:52 +00:00
Toshi MARUYAMA
6734f91a72 Merged r4676 from trunk (change mercurial test repository from tar.gz to bundle).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4684 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-11 04:22:31 +00:00
Jean-Philippe Lang
5266346315 Set the version to stable (#7259).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4678 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-10 18:13:09 +00:00
Toshi MARUYAMA
d426e4452b Merged r4644 and r4674 from trunk (mercurial unit app test).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4675 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-09 23:39:46 +00:00
Jean-Philippe Lang
f8af1bebd7 Merged r4670 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4671 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-09 15:58:15 +00:00
Jean-Philippe Lang
6e695a4d1a Merged r4645 to r4651 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4660 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-08 10:14:00 +00:00
Jean-Philippe Lang
e5b7c94cb4 Merged r4643 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4659 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-08 10:09:04 +00:00
Jean-Philippe Lang
9028e664c4 Merged r4656 and r4657 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4658 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-08 10:04:38 +00:00
Toshi MARUYAMA
6318affd31 Merged r4652 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4653 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-08 00:24:43 +00:00
Jean-Philippe Lang
8794cd3344 Merged r4610 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4649 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-06 21:04:24 +00:00
Toshi MARUYAMA
2fcd4e5271 Merged r4636 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4642 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-05 15:12:08 +00:00
Toshi MARUYAMA
ea60705ca7 Merged r4635 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4641 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-05 15:11:47 +00:00
Toshi MARUYAMA
90bce4e366 Merged r4634 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4640 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-05 15:11:21 +00:00
Toshi MARUYAMA
9f7cc355ad Merged r4633 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4639 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-05 15:10:58 +00:00
Toshi MARUYAMA
6ee4c0bac7 Merged r4632 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4638 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-05 15:10:38 +00:00
Toshi MARUYAMA
b0f0bd1848 Merged r4631 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4637 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-05 15:10:17 +00:00
Toshi MARUYAMA
fe563a8802 Merged r4629 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4630 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-04 16:39:45 +00:00
Toshi MARUYAMA
8ebab00767 Merged r4625 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4628 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-03 10:55:07 +00:00
Toshi MARUYAMA
d97297e45d Merged r4624 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4627 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-03 10:54:29 +00:00
Toshi MARUYAMA
f06500dcce Merged r4623 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4626 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-03 10:53:47 +00:00
Jean-Philippe Lang
b098e2b63f Merged r4621 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4622 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-02 14:37:55 +00:00
Jean-Philippe Lang
151a49b319 Merged r4618 and r4619 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4620 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-02 12:17:39 +00:00
Jean-Philippe Lang
ded234794e Merged r4615 and r4616 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4617 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-02 11:44:19 +00:00
Toshi MARUYAMA
119732c3ee Merged r4613 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4614 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-02 09:52:29 +00:00
Toshi MARUYAMA
730fcef844 Merged r4611 from trunk (Mercurial sorting).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4612 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-02 06:14:59 +00:00
Toshi MARUYAMA
1cb33f3a95 Merged r4608 from trunk (repository: switch darcs cat test if cat supports).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4609 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-01 22:05:48 +00:00
Toshi MARUYAMA
69edd3c53f Merged r4606 from trunk (.hgignore).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4607 e93f8b46-1217-0410-a6f0-8f06a7374b81
2011-01-01 21:20:25 +00:00
Jean-Philippe Lang
ad784e2146 Merged locales updates (r4592 to 4595) from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4596 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-30 15:54:47 +00:00
Jean-Philippe Lang
c783ae4b3d 1.1-stable branch added
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.1-stable@4585 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-30 15:09:18 +00:00
Jean-Philippe Lang
dd87ebef58 Makes the png looks more like the html gantt.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4584 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-30 15:04:08 +00:00
Jean-Philippe Lang
82f528ddc8 Makes issue move form similar to bulk edit form.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4583 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-29 20:48:51 +00:00
Jean-Philippe Lang
ad62060753 Disable project completion display on the gantt (#7127).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4582 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-29 20:29:42 +00:00
Jean-Philippe Lang
f2ae2e9239 Simple issue sort method to make sure subtasks appear under their parent on the gantt (#7128).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4581 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-29 20:21:39 +00:00
Jean-Philippe Lang
d2cc2861de Find visible issues only in ContextMenusController#issues.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4580 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-29 19:55:52 +00:00
Jean-Philippe Lang
e9a0e6dbc8 Takes more parameters into account to determine activity freshness (#7188).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4579 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-29 19:37:42 +00:00
Jean-Philippe Lang
af7006dff6 Fixed: partial toc when text contains pre tags (#7172).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4578 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-29 18:21:22 +00:00
Jean-Philippe Lang
0025a66200 Fixed: cvs diff broken by r4539 (#7176).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4577 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-29 17:46:47 +00:00
Jean-Philippe Lang
03d4ecbbff Fixed: CLI-supplied defaults should not be applied when replying to an issue (#7195).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4576 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-29 17:38:57 +00:00
Jean-Philippe Lang
21c0b868ae Fixed: Tracker reset to default when replying to an issue email (#7197).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4575 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-29 17:36:01 +00:00
Jean-Philippe Lang
df9ea24136 Makes Version#start_date return the minimum start_date of its issues.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4574 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-23 14:58:52 +00:00
Jean-Philippe Lang
07fe46e9df Makes the API accepts the X-Redmine-API-Key header to hold the API key.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4573 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-23 14:49:14 +00:00
Jean-Philippe Lang
283d25d823 Makes /projects API accept same pagination parameters as other API collection resources.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4572 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-23 13:34:44 +00:00
Jean-Philippe Lang
d076c19822 Makes API accept offset/limit or page/limit parameters for retrieving collections.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4571 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-23 13:33:01 +00:00
Jean-Philippe Lang
1ee7f31f4d Set VERSION to 1.0.5.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4568 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-23 10:04:08 +00:00
Jean-Philippe Lang
d78a510642 Updated INSTALL for 1.0.5
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4567 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-23 10:03:32 +00:00
Jean-Philippe Lang
3ef41c3131 Updated CHANGELOG for 1.0.5
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4566 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-23 10:02:08 +00:00
Jean-Philippe Lang
759048e73a Fixes: Mercurial adapter loses seconds of commit times (#6656).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4561 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-23 09:56:30 +00:00
Jean-Philippe Lang
3b53ec20e6 Adds themes test for when Redmine is in a sub-uri.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4560 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-23 09:42:33 +00:00
Jean-Philippe Lang
c8dc7fff08 Avoid theme rescan when no theme is selected.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4559 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-22 21:41:08 +00:00
Jean-Philippe Lang
523febf9c1 Support for Javascript in Themes (#2803).
If javascripts/theme.js is found in the theme directory, it will be automatically loaded on each page.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4558 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-22 21:37:07 +00:00
Jean-Philippe Lang
72f58c4c40 Adds missing not_a_date translation in fr locale (#7160).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4556 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-22 20:52:48 +00:00
Jean-Philippe Lang
0661cf6d87 Restores non english field_start_date translations (#6629, #7016).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4554 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-22 20:40:56 +00:00
Jean-Philippe Lang
703b0ec422 Fixed: 500 error on issue query grouped by a custom field that was deleted (#7144).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4553 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-21 21:46:54 +00:00
Jean-Philippe Lang
3d76a67a2e Force vertical scroll bar to avoid layout jump.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4552 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-21 17:59:38 +00:00
Jean-Philippe Lang
ef288fbff7 Broken links on wiki diff view.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4551 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-20 22:33:44 +00:00
Jean-Philippe Lang
8a8ca40364 Prevents n SQL queries (n = project count) on cross-project issues list.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4550 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-20 20:03:22 +00:00
Jean-Philippe Lang
03397f605c Fixes valid revision regexp.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4549 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-20 18:47:54 +00:00
Jean-Philippe Lang
c42b0ad6b7 Adds missing fixtures when running tests from scratch.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4548 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-20 18:30:36 +00:00
Jean-Philippe Lang
4695754d2a Fixes task description.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4547 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-20 18:24:49 +00:00
Jean-Philippe Lang
339bcc97e0 Adds tasks to run scm tests: test:scm:units, test:scm:functionals and test:scm.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4546 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-20 18:24:24 +00:00
Jean-Philippe Lang
6d4126f17e Adds routing tests for users and xml format.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4545 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-20 18:06:14 +00:00
Jean-Philippe Lang
599bc45073 Adds support for requesting information about current user using /users/current (#7141).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4544 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-20 17:45:09 +00:00
Jean-Philippe Lang
84dd413f22 Restore rev param validation that was removed in r2840.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4542 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-18 18:37:49 +00:00
Jean-Philippe Lang
f7529c94f6 Fixes mercurial adapter.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4541 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-18 18:35:37 +00:00
Jean-Philippe Lang
7d7c67daba Fixed that some arguments where not properly escaped in scm adapters.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4539 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-18 18:12:12 +00:00
Jean-Philippe Lang
a7595ec191 Adds tests for class attribute parsing on pre/code tags.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4537 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-18 17:21:57 +00:00
Jean-Philippe Lang
93847ae337 Fixes a data disclosure issue introduced in r3941.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4535 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-18 17:11:41 +00:00
Jean-Philippe Lang
525656a490 Ported subtasks display with indentation to the new gantt (#7128) and fixed markers alignment.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4534 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-18 16:06:20 +00:00
Jean-Philippe Lang
86e17ce74f Sort versions drop down on the bulk edit form.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4533 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-18 14:14:04 +00:00
Jean-Philippe Lang
0c24f88ce1 Fixed: issue description Quote button lost by r3941 (#7122).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4530 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-18 13:40:50 +00:00
Jean-Philippe Lang
df88dc117f Fixed: r4492 breaks the ability to select issue custom fields available for projects issues (#7121).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4529 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-17 16:10:46 +00:00
Jean-Philippe Lang
620c1e2789 Adds a css class for gantt subjects.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4528 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-17 15:25:07 +00:00
Jean-Philippe Lang
8a86b2d2bc Gantt code cleaning.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4527 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-17 15:21:38 +00:00
Jean-Philippe Lang
084e9e2e57 Gantt code cleanup.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4526 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-17 14:59:32 +00:00
Jean-Philippe Lang
74a94ed4ad Gantt: make the png looks more like html.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4525 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-17 14:53:30 +00:00
Jean-Philippe Lang
88a802b25e Gantt: make the pdf looks more like html.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4524 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-17 14:37:51 +00:00
Jean-Philippe Lang
edc35d4d5b Gantt code cleanup.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4523 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-17 14:05:43 +00:00
Jean-Philippe Lang
98c7c179ca Gantt code cleanup.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4522 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-17 13:40:25 +00:00
Jean-Philippe Lang
8f7da03419 Gantt code cleanup.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4521 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-17 12:41:54 +00:00
Jean-Philippe Lang
27f76d20ce Gantt: fixes progress width in some cases and start code cleaning.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4520 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-17 12:24:11 +00:00
Jean-Philippe Lang
1c3823cbb0 Adds missing strings in locales.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4519 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-17 09:14:54 +00:00
Jean-Philippe Lang
bc1703d7b6 Converts translations to the new i18n interpolation format (#6495).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4518 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-17 08:50:13 +00:00
Jean-Philippe Lang
4f4a62c6d0 Locales update before changing interpolation format.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4517 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-17 08:40:15 +00:00
Jean-Philippe Lang
3c1576e364 Manually require i18n 0.4.2 before Rails tries to load the most recent gem (#7013).
This workaround makes Redmine work even if i18n 0.5.0 gem is installed.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4516 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-17 08:34:29 +00:00
Jean-Philippe Lang
9f18426ca7 Skip a few SQL queries for cross project gantt.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4515 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-15 21:26:51 +00:00
Jean-Philippe Lang
252dcad3f6 Locales update.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4514 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-15 21:18:28 +00:00
Jean-Philippe Lang
b48291ec63 Adds an application setting to limit the number of items that can be displayed on the gantt chart (#6276).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4513 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-15 21:18:06 +00:00
Jean-Philippe Lang
6a586c39e9 Adds journal created_on attribute to issue API (#7111).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4512 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-14 19:03:17 +00:00
Jean-Philippe Lang
335f8da5e8 Fixed: 404 when entering time with blank issue id (#7099).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4511 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-14 18:29:24 +00:00
Jean-Baptiste Barth
9ac043a096 Set encoding to utf-8 for ruby 1.9 compatibility. #4050
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4510 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-12 23:24:45 +00:00
Jean-Baptiste Barth
17f86d964f Use absolute paths in test/**/* requires for Ruby 1.9.2 compatibility. #4050
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4509 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-12 23:24:34 +00:00
Jean-Baptiste Barth
f9f1bd58d6 Fixed bad html generated in users/memberships partial (multiple </tbody> tags)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4508 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-12 21:21:57 +00:00
Jean-Philippe Lang
e120f2aab4 Fixes tests after fixtures changes.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4507 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-12 19:43:15 +00:00
Jean-Philippe Lang
a8cf13e8c8 Restores the issue description label (#6677).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4506 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-12 17:12:05 +00:00
Jean-Philippe Lang
ac60fc9c1c Refactor and add tests for News #index API (#7072).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4505 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-12 17:00:52 +00:00
Jean-Philippe Lang
aaee26ae22 Use GET instead of POST to retrieve context menu (#6762).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4504 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-12 16:26:24 +00:00
Jean-Philippe Lang
29e0bca43a Make sure there's no nil result in auto_complete.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4503 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-12 16:06:43 +00:00
Jean-Philippe Lang
a8b12bcb52 Autocomplete issue relations on subject (#3170).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4502 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-12 16:04:28 +00:00
Jean-Philippe Lang
758f2f0a4e UsersController tests cleanup.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4501 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-12 15:34:35 +00:00
Jean-Philippe Lang
a49c7f95e2 Fixes password sending when creating user.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4500 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-12 15:26:55 +00:00
Jean-Philippe Lang
0a2ec6ef04 Extracts user groups assignment from controller.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4499 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-12 15:13:34 +00:00
Jean-Philippe Lang
87ae744dce Fixes test according to r4493.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4498 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-12 14:43:55 +00:00
Jean-Philippe Lang
2066b2f666 Code cleanup.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4497 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-12 14:25:23 +00:00
Jean-Philippe Lang
9e2d401f43 Moves mail_notification param to user hash param so that it can be set using the User API.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4496 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-12 14:19:24 +00:00
Jean-Philippe Lang
1d4f28a54d Removed no longer needed to_sym.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4495 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-12 14:05:19 +00:00
Jean-Philippe Lang
e4f319fe61 Validates user's mail_notification and turn options into strings (the attribute type).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4494 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-12 14:02:39 +00:00
Jean-Philippe Lang
cde02954c8 Moves password param to user hash param so that it can be set using the User API.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4493 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-12 13:39:55 +00:00
Jean-Philippe Lang
a4d7a99c22 Declare safe attributes for User and Projects models.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4492 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-12 13:19:07 +00:00
Jean-Philippe Lang
3409333522 Makes issue safe_attributes extensible (#6000).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4491 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-12 13:11:53 +00:00
Jean-Philippe Lang
8407db9854 Fixes Changeset#text_tag for numeric scmid (#6681).
Contributed by Toshi MARUYAMA.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4490 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-11 14:20:04 +00:00
Jean-Philippe Lang
00d50157d3 Restores object count and adds offset/limit attributes to API responses for paginated collections (#6140).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4489 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-11 13:13:49 +00:00
Jean-Philippe Lang
67f1131a20 Fixes duplicate custom_values fixture that caused failure with Postgresql.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4488 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-11 10:47:00 +00:00
Jean-Philippe Lang
f2b42237d0 Fixes indentation.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4487 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-11 10:24:58 +00:00
Jean-Philippe Lang
5f57bceabb Makes some attributes optional in API response to get faster/lightweight responses.
These attributes are not required for common uses case (eg. updating an object). They can be requested in the reponse using the 'include' parameter. Example GET /issues/1.xml?include=journals. The list of attributes that can be included in responses will be documented in the wiki.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4486 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-11 10:19:11 +00:00
Jean-Philippe Lang
10ba08ce13 Fixes unsafe assertion that may cause failures.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4485 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-10 17:40:33 +00:00
Jean-Philippe Lang
cd71c1cc0a Do not try to copy relations for issues that could not be copied.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4484 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-10 17:37:24 +00:00
Jean-Philippe Lang
ab6a93b029 Changes the representation of journal details in issue API.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4483 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-10 12:22:37 +00:00
Jean-Philippe Lang
252e4983fb Fixes a fixture with valid attributes (start_date < due_date).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4482 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-10 11:06:21 +00:00
Jean-Philippe Lang
3e3315c103 Support for updating custom fields using the received custom_fields array (#6345, #6403).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4481 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-10 10:48:16 +00:00
Jean-Philippe Lang
0e19aa4362 Fixed: error when serializing back objects with custom fields using ActiveResource (#6403).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4480 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-10 10:12:19 +00:00
Jean-Philippe Lang
8524d505c5 Add tests for wiki edit notifications (#7024).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4479 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-07 22:07:55 +00:00
Jean-Philippe Lang
b898200803 Select projects with issue_tracking module for gantt display and remove the nil start/due dates trick.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4477 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-07 19:42:36 +00:00
Jean-Philippe Lang
4715a37937 Gantt: Avoid unnecessary queries before rendering.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4476 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-07 19:29:47 +00:00
Jean-Philippe Lang
318bd10c7f Gantt: fixes position of line in pdf (#6348).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4475 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-07 18:57:46 +00:00
Jean-Philippe Lang
9c6377964c Fixes gantt PDF pagination problem (#6348).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4474 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-07 18:53:15 +00:00
Jean-Philippe Lang
b17e145d75 Gantt: view cleanup.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4473 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-07 18:41:50 +00:00
Jean-Philippe Lang
b0a1a04008 Gantt: iterate over all objects only once for html and pdf rendering (#6348).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4472 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-07 18:40:34 +00:00
Jean-Philippe Lang
bfa61c1ec4 Updated locales.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4471 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-05 11:45:39 +00:00
Jean-Philippe Lang
d7c607fd8b Automatic spent time logging from commit messages (#4155).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4470 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-05 11:45:09 +00:00
Jean-Philippe Lang
80e0e1c544 Changes russian CSV separator to ; (#7035).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4469 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-05 10:15:55 +00:00
Jean-Philippe Lang
8841ba97c6 Fixed: class attribute with spaces on pre tags truncated (#7033).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4468 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-05 10:09:18 +00:00
Jean-Philippe Lang
7fb0fe2e91 Safer code in IssueRelation (#7018).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4467 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-04 18:10:02 +00:00
Jean-Philippe Lang
224921460a Adds a pseudo format to api template names and overrides ActionController#default_template so that api templates are chosen automatically.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4466 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-04 17:43:39 +00:00
Jean-Philippe Lang
9157482049 Adds subtasks to GET /issues/:id API (#5338).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4465 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-04 13:02:14 +00:00
Jean-Philippe Lang
88e593ee02 Fixes unhandled case in json builder.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4464 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-04 11:20:20 +00:00
Jean-Philippe Lang
558a951ed6 Fixes unhandled case in json builder.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4463 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-04 10:41:31 +00:00
Jean-Philippe Lang
37ed02553a Fixes test failure in r4461.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4462 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-04 10:40:44 +00:00
Jean-Philippe Lang
f7cf8aa878 Adds REST API for TimeEntries (#6823).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4461 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-04 10:13:15 +00:00
Jean-Philippe Lang
9284a32c9a Moves project attributes default assignments from ProjectsController#new to the model (#6064).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4460 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-03 16:15:16 +00:00
Jean-Philippe Lang
f6c633212a Prevents random failure in XmlTest.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4459 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-03 14:09:33 +00:00
Jean-Philippe Lang
735a83c596 Converts IssuesController to use the new API template system and makes xml/json responses consistent (#6136).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4458 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-03 13:52:07 +00:00
Jean-Philippe Lang
eaf6bb1e9b Projects API tests rewriting.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4457 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-03 12:49:07 +00:00
Jean-Philippe Lang
a1f12e3ade Converts ProjectsController to use the new API template system.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4456 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-03 12:06:14 +00:00
Jean-Philippe Lang
d0a3aab2e7 Adds a reusable method to render API response on validation failure.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4455 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-03 11:51:06 +00:00
Jean-Philippe Lang
ea59d93dc8 Dry Users API responders.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4454 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-03 11:45:55 +00:00
Jean-Philippe Lang
e9775097ec Adds xml/json REST API for Users (#6260).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4453 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-03 11:28:44 +00:00
Jean-Philippe Lang
96ce0f017c Adds a builder-like template system for rendering xml and json API responses.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4452 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-03 11:25:21 +00:00
Jean-Philippe Lang
483133285e Add responders to UsersController.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4451 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-12-03 09:39:56 +00:00
Jean-Philippe Lang
a52417eca9 Escapes attachment ids in TracMigrate (#6996).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4449 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-29 19:34:19 +00:00
Jean-Philippe Lang
c78f442095 Updates for 1.0.4 release.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4446 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-28 12:46:54 +00:00
Jean-Philippe Lang
ae3fd4cb59 Accept key auth for ProjectsController#show (#6841).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4444 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-27 16:41:52 +00:00
Jean-Philippe Lang
3d6cb1435c Accept key auth for ProjectsController#destroy (#6841).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4443 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-27 16:37:15 +00:00
Jean-Philippe Lang
054b7d28f1 Accept key auth for ProjectsController#update (#6841).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4442 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-27 16:32:48 +00:00
Jean-Philippe Lang
8458faed11 Accept key auth for ProjectsController#create (#6841).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4441 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-27 16:26:13 +00:00
Jean-Philippe Lang
d24e66370b Prevents validation error when adding a user to a group (#6457).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4437 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-27 14:46:51 +00:00
Jean-Philippe Lang
620c48fbbb Reload themes so that new themes can be used without restarting Redmine (#5712).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4432 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-27 14:06:11 +00:00
Jean-Philippe Lang
4faca3cd4a Fixed: messages attachments/watchers are not deleted when deleting a project or forum (#6966).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4431 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-27 12:42:11 +00:00
Jean-Philippe Lang
97140f6a78 Fixed: Wiki#find_page should not be case sensitive because page title uniqueness is not (#6987).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4430 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-27 11:14:28 +00:00
Jean-Philippe Lang
4a6a551d07 Fixed: Missing template wiki/update.erb error introduced in r4272 (#6987).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4429 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-27 10:34:44 +00:00
Jean-Philippe Lang
d180c833b9 Fixed: Layout problem in workflow overview (#6990).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4428 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-27 09:54:16 +00:00
Azamat Hackimov
6608cda084 Translation update
* es (#6973)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4427 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-25 20:43:22 +00:00
Azamat Hackimov
ec3975ef5b Replaced hardcoded strings (KB) with i18n equivalent (number.human.storage_units.units.kb)
Fixes #6740 finally


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4426 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-25 20:27:44 +00:00
Jean-Philippe Lang
dfc76ce642 Fixed: new gantt chart discloses all private projects names (#6276).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4425 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-21 14:57:53 +00:00
Azamat Hackimov
7087a53f27 Translation update
* bg (#6948)
* da (#6804)
* ja (#6814)
* ru
* sv (#6783)
* zh-TW (#6782)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4424 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-21 14:55:11 +00:00
Jean-Philippe Lang
cfc3ee4f5a Fixed: r4417 breaks MercurialAdapter with ruby 1.8.6 (#5117).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4422 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-21 14:25:26 +00:00
Jean-Philippe Lang
77c6188ec2 Fixed: gantt displays issues by date of creation.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4421 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-21 13:54:26 +00:00
Jean-Philippe Lang
1158716f46 Fixed: Broken pipe error when browsing subversion repository (#6860).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4419 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-20 14:11:56 +00:00
Jean-Philippe Lang
6b72c66893 Fixed: MercurialAdapter.client_version depends on LANG environment variable (#5117).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4417 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-20 14:04:22 +00:00
Jean-Philippe Lang
1f237388bd Add assertions for #6929 in MailHandler tests.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4416 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-20 10:35:05 +00:00
Jean-Philippe Lang
06b0176a3e Fixed: submitting a non numerical parent task input creates a 500 error (#6932).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4414 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-20 10:20:53 +00:00
Jean-Philippe Lang
427ec05c8b Fixed: Migration from boolean to varchar fails on PostgreSQL 8.1 (#6943).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4413 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-20 09:55:06 +00:00
Jean-Philippe Lang
0f55adf31a Fixed: links to edit/delete a news broken by r4214 (#6944).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4412 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-20 09:38:54 +00:00
Jean-Philippe Lang
8bb75da1ac Initialize TimeEntry attributes with params when editing an issue (#5441).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4411 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-17 18:27:38 +00:00
Jean-Philippe Lang
3ba3c540fb Prevents NoMethodError when requesting /time_entries/edit without an id (#6904).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4410 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-16 20:27:45 +00:00
Jean-Philippe Lang
3e95d12b75 Fixed: Log Time link broken in issue context menu (#6904).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4409 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-16 19:49:08 +00:00
Jean-Philippe Lang
ee91e34096 Fixes a NoMethodError in tests with ruby 1.8.6.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4408 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-14 16:51:10 +00:00
Jean-Philippe Lang
2fab7bd9b1 Adds leading slash to all assert_redirected_to arguments (#6887).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4407 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-14 16:45:32 +00:00
Jean-Philippe Lang
2ee45e8cac Use Object#tap instead of #returning (#6887).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4406 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-14 16:24:21 +00:00
Jean-Philippe Lang
c4a218358f Replaced SessionStore :session_key with :key (#6887).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4405 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-14 15:14:19 +00:00
Jean-Philippe Lang
d7cdd58db6 MailHandler: ignore assignee if invalid.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4404 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-14 13:48:01 +00:00
Jean-Philippe Lang
97a9210483 Updates mantis importer for new project name/identifier max lengths (#6446).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4403 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-14 13:16:39 +00:00
Jean-Philippe Lang
8ef06826c3 Raised maximum length of project names and identifiers to 255 and 100 respectively (#6446).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4402 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-14 12:33:14 +00:00
Jean-Philippe Lang
eaab2ede76 Makes projects API return XML description when creating a project (#6874).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4397 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-13 10:05:43 +00:00
Jean-Philippe Lang
abf988ad69 Makes MailHandler ignore invalid keyword values to avoid validation failures.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4396 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-12 13:08:32 +00:00
Jean-Philippe Lang
d4ab2ab4b9 Makes MailHandler accept localized keywords for default or user language (#6112).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4395 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-12 12:29:35 +00:00
Jean-Philippe Lang
e0e8c14c2a Makes MailHandler accept all issue attributes and custom fields that can be set/updated (#4071, #4807, #5622, #6110).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4394 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-12 11:34:53 +00:00
Jean-Philippe Lang
0eb7d8f614 Moved some permission checks for issue update from controller to model.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4393 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-11 16:37:16 +00:00
Jean-Philippe Lang
aa84e6c179 Removes duplicate issue subject on gantt (#6763).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4392 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-11 13:44:23 +00:00
Jean-Philippe Lang
fa3d71bed9 Allow non-unique names for projects (#630).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4391 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-11 13:39:14 +00:00
Jean-Philippe Lang
7482d2f5f4 Fixed: Trunk not working with i18n gem 0.4.2 (#6784).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4389 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-09 19:44:37 +00:00
Jean-Philippe Lang
44c9ad687f Reverted r4381.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4388 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-07 22:38:10 +00:00
Jean-Philippe Lang
63866407f1 Fixed: unchecking status filter on the issue list has no effect (#6844).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4387 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-07 15:38:51 +00:00
Jean-Baptiste Barth
2ca9bb3cca Added missing --no-color option in some git shell-outs. #5324
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4386 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-07 15:19:05 +00:00
Jean-Philippe Lang
635c177eea Fixed: User list not sorted on category form (#6760).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4385 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-07 14:56:12 +00:00
Jean-Philippe Lang
d9e960873c Updated locales.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4384 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-07 14:18:13 +00:00
Jean-Philippe Lang
f8ca6e58aa Make sure existing custom fields visibility is set to true.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4383 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-07 14:17:35 +00:00
Jean-Philippe Lang
475530e59f Adds a "visible" option on User and Project custom fields (#1738).
If set to false, the custom field won't be display on user profile/project overview.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4382 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-07 14:15:01 +00:00
Jean-Philippe Lang
3b01ea9fa4 Removed gantt and calendar menu items that do not fit into the core project menu (#6271).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4381 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-07 12:53:45 +00:00
Jean-Philippe Lang
ae498a06e2 Removed hardcoded links in my/page_layout (#6839).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4380 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-07 12:36:19 +00:00
Jean-Philippe Lang
dca6fb92f9 Render level 4 headings in TOC (#5494).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4379 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-07 12:22:22 +00:00
Jean-Philippe Lang
1c047dfeb8 Fixed: start date being filled with current date even when blank value is submitted (#6575).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4378 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-06 23:23:02 +00:00
Jean-Philippe Lang
7f9d2b0804 Render TOC as nested lists (#1857).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4377 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-06 18:52:07 +00:00
Jean-Philippe Lang
024ff96ee2 Extract headings and TOC parsing from the textile formatter.
Fixes #2038 and #3707 and will allow to support TOC with other text formatters.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4376 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-06 17:47:27 +00:00
Jean-Philippe Lang
666c54e86c Adds a combo to select parent on wiki page rename (#5136).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4375 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-06 14:30:32 +00:00
Jean-Philippe Lang
f79a6f701a Makes textile formatter accept 2 letters acronym (#6591).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4374 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-06 13:29:23 +00:00
Jean-Philippe Lang
338e407a91 Fixed: URLs broken in wiki notifications (#6838).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4373 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-06 13:23:23 +00:00
Jean-Philippe Lang
6f841b7f43 Fixed: 'View difference' broken on wiki page history (#6747).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4372 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-06 13:22:23 +00:00
Jean-Philippe Lang
8a2aa5d217 Disable button to prevent accidental double click on project members (#6826).
Contributed by Andrew Vit.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4371 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-06 12:04:24 +00:00
Jean-Philippe Lang
b67e4a87e4 Clean up member_roles if needed.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4370 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-06 11:49:45 +00:00
Jean-Philippe Lang
c50b611f85 Adds a unique index on members (#6826).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4369 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-06 11:44:38 +00:00
Jean-Philippe Lang
73167fb4f2 Rewrites UpdateMailNotificationValues migration to avoid model validations and failures.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4368 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-06 10:57:56 +00:00
Eric Davis
c55e060bab Allow key authentication when deleting issues (with tests) #6447
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4367 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-05 17:49:25 +00:00
Eric Davis
7d934c984a Allow key authentication when updating issues (with tests) #6447
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4366 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-05 17:49:20 +00:00
Eric Davis
4b1dd334a5 Allow key authentication when creating issues (with tests) #6447
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4365 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-05 16:29:56 +00:00
Eric Davis
c967899b14 Refactor: Convert the tests for Issues#index and #show APIs to shoulda. #6447
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4364 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-04 16:22:47 +00:00
Eric Davis
30dc4fec99 Refactor: convert API key tests using HTTP Basic to a shoulda macro
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4363 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-03 16:48:23 +00:00
Eric Davis
7e359d3d7e Add a Email Header setting. Useful for adding delimiters to every email.
#2852 #6628

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4362 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-02 19:00:36 +00:00
Eric Davis
0395eb99de Remove email quotes (>) when searching for incoming email delimiters. #2852 #6628
Changes the email truncation so a delimiter can be prefixed by email
quotes or spaces ("> Eric said...").  This will let it be combined with
a "--- Reply above ---" delimiter to match "> --- Reply above ---"

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4361 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-02 19:00:31 +00:00
Eric Davis
a04d64881c Refactor: convert username/password http basic auth api tests to shoulda macros #6447
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4360 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-02 15:52:06 +00:00
Jean-Baptiste Barth
27049b848d Use File#expand_path for require's in script/* for Ruby 1.9.2 compatibility. #4050
Since Ruby 1.9.2, LOAD_PATH does not include "." directory anymore, so
we should use absolute paths instead to ensure both 1.8.x and 1.9.x
compatibility. It has been included in railties 2.3.x branch since
july 2009, see 7a427a83ca

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4359 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-02 00:20:21 +00:00
Eric Davis
bed79f523b Refactor: convert api key tests to shoulda macros for reuse. #6447
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4358 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-01 15:45:03 +00:00
Eric Davis
d5fde17bf5 Move all API tests into the ApiTest module to make management easier
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4357 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-01 15:26:05 +00:00
Jean-Philippe Lang
db2ecd3010 Fixed: "Template is missing" error when validation fails on version edit (#6766).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4354 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-01 13:13:32 +00:00
Jean-Philippe Lang
ba56b3f763 Provides a default string for untranslated search types.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4353 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-01 12:55:15 +00:00
Eric Davis
b2eeeb6fa0 Bump version to 1.0.3
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4349 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-01 00:37:19 +00:00
Eric Davis
147a16cbf8 Update changelog for v1.0.3
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4348 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-11-01 00:37:14 +00:00
Jean-Baptiste Barth
7c5497db65 Add a label for user and group search fields. #6521
Contributed by Felix Schäfer

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4312 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-30 16:47:33 +00:00
Jean-Baptiste Barth
abb83f4c4f Added ability to create issue directly as a subtask of another one. #5484
Contributed by Felix Schäfer

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4311 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-30 16:15:31 +00:00
Jean-Baptiste Barth
f8b79c52cb Force color to be disabled on git shell-outs. #5324
Contributed by Felix Schäfer

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4310 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-29 23:21:57 +00:00
Jean-Baptiste Barth
55cf64393d Fixed Redmine.pm not working with LDAPS on a non-standard port. #4065
Contributed by Fabian Schlenz

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4309 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-29 22:55:50 +00:00
Jean-Baptiste Barth
31b9868fc1 Updated wiki-syntax help page to reflect new link options and last coderay upgrade. #5948
Contributed by Holger Just and Mischa The Evil

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4308 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-29 22:48:59 +00:00
Jean-Baptiste Barth
c91ca4fcd9 Fix wikilinks in project > settings > versions and version view. #6435 #4416
Contributed by Mischa The Evil and Felix Schäfer.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4307 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-29 22:40:02 +00:00
Jean-Baptiste Barth
1cf67b3a1d Fixed: disabling autologin not persisted. #6438
Contributed by Felix Schäfer

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4306 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-29 22:28:24 +00:00
Azamat Hackimov
5d6245b059 Translation update (zh-TW, #6765)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4305 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-28 21:58:58 +00:00
Azamat Hackimov
8dc0d4b916 Translation update (he, #6569)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4304 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-28 21:56:52 +00:00
Eric Davis
c514dd6885 Refactor: convert WikiController to a REST resource
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4303 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-28 21:25:38 +00:00
Jean-Baptiste Barth
e7e7a91b85 Fixed potential nil method errors when trying to access /issues/context_menu with GET. #6750
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4302 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-27 21:01:26 +00:00
Azamat Hackimov
6ffcbaa7b3 Translation update (ru)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4301 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-27 18:58:36 +00:00
Azamat Hackimov
1b1a059d90 Fixing "Kilobyte" prefix to kB (#6740)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4300 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-27 18:46:20 +00:00
Azamat Hackimov
d41391e87a Readding string field_start_date (#6629)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4299 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-27 18:40:45 +00:00
Azamat Hackimov
8ebe03ef86 Translation update (de, #6607)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4298 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-27 18:29:30 +00:00
Azamat Hackimov
cc9d356a55 Translation updates
* bg (#6669)
* ja (#6732)
* mk (#6731)
* sv (#6739)
* zh-TW (#6736)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4297 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-27 18:20:55 +00:00
Eric Davis
e9efa5b981 Refactor: use :id instead of :page when linking to Wiki Pages
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4296 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-27 16:27:06 +00:00
Eric Davis
70bf0706b2 Refactor: convert WikiController#destroy to use HTTP DELETE
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4295 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-26 15:59:20 +00:00
Eric Davis
17eab0f5f9 Fix wiki links on the activity page. #6746
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4294 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-26 15:44:30 +00:00
Eric Davis
c399e76324 Add Redmine::Plugin.installed?(:name) method to check if a plugin is installed
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4293 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-25 23:32:01 +00:00
Eric Davis
397222f198 Allow adding notes when moving issues
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4292 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-25 18:44:46 +00:00
Eric Davis
22e3cba0b7 Allow changing the Priority when moving issues.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4291 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-25 18:44:41 +00:00
Eric Davis
4b045badcf Refactor: Rename WikiController#page_index to #index
index is the action that should list a collection of records, which is
what #page_index does.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4290 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-25 16:16:46 +00:00
Eric Davis
0e951c0716 Fix the tests that were broken by r4286:
"Refactor: merged error rendering methods."

http://ci.finn.de/builds/1-8-7_redmine-trunk_mysql/4286

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4289 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-25 15:42:41 +00:00
Jean-Philippe Lang
d9f2bccf70 Adds a user-agent to reposman (#6735).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4288 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-24 21:00:05 +00:00
Jean-Baptiste Barth
d642964035 Fixed: auto links ending with right angle bracket shouldn't include the bracket in the URL. #5652
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4287 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-23 22:35:02 +00:00
Jean-Philippe Lang
7824eca775 Refactor: merged error rendering methods.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4286 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-23 11:07:04 +00:00
Jean-Philippe Lang
eea456ed84 Improved error message when trying to access an archived project (#2995).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4285 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-23 09:48:01 +00:00
Jean-Philippe Lang
1e4776fa64 Updated french translation.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4284 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-23 09:22:28 +00:00
Jean-Philippe Lang
a29c35e08f Makes zoom buttons on gantt looks like the others.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4283 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-23 09:08:55 +00:00
Eric Davis
0ca74df604 Refactor: move method to model with compatibility wrapper
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4282 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-22 22:38:45 +00:00
Jean-Philippe Lang
a6f891d1b1 Moves a method to the appropriate helper.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4281 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-22 22:29:32 +00:00
Jean-Philippe Lang
ed608cb7d3 Fixed: error on gantt when no issue have a due date (#6350).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4280 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-22 22:13:39 +00:00
Eric Davis
b7e3f80e14 Translation update for en: field_member_of_group and field_assigned_to_role
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4279 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-22 22:10:41 +00:00
Eric Davis
b1921830de Mark the failed test in r4276 as pending. Tests should never fail when committed.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4278 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-22 21:29:02 +00:00
Jean-Philippe Lang
d8ef4b6f4d Fixed: timelog link in the activity broken by recent refactoring (#6702).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4277 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-22 20:40:11 +00:00
Jean-Philippe Lang
d0bbe830ad Adds a failing test for #6350.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4276 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-22 20:32:05 +00:00
Eric Davis
dc26fd215b Add ids to some sections of the issue form
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4275 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-22 18:20:00 +00:00
Jean-Philippe Lang
d9652183f6 Fixed: file upload on wiki page broken by recent refactoring (#6724).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4274 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-22 17:38:05 +00:00
Eric Davis
432b00df40 Add documentation about contributing to Redmine with git
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4273 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-22 17:18:11 +00:00
Eric Davis
cac3b1e538 Refactor: split WikiController#edit into #update
update will handle the saving and should be accessed via POST only.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4272 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-22 16:20:20 +00:00
Jean-Philippe Lang
2fbf7bbcf1 Fixes display of archived child projects on the admin project list.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4271 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-22 15:11:04 +00:00
Jean-Philippe Lang
128c92779c Removes description column from the admin project list to get a better looking project tree.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4270 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-22 14:57:20 +00:00
Jean-Philippe Lang
2589bec48b Removes duplicate helper introduced in r4072.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4269 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-22 14:49:46 +00:00
Jean-Philippe Lang
f17c990a77 Fixed: "Add file" link broken by recent refactoring (#6627).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4268 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-22 14:45:02 +00:00
Jean-Philippe Lang
b26ba17184 Fixed: "Add news" link broken by recent refactoring (#6650).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4267 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-22 14:42:38 +00:00
Eric Davis
c259ada6e1 Refactor: rename WikiController#index to #show, it's a single resource action
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4266 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-21 16:07:28 +00:00
Eric Davis
d3381fb518 Refactor: change :id on WikiController to use :project_id
Using :id to track projects on non-project controllers is confusing and
makes routing with resources difficult.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4265 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-20 21:26:30 +00:00
Jean-Philippe Lang
c058bc2245 Remove the Description label from the issue view and omit the block if empty (#6677).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4264 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-19 19:26:07 +00:00
Jean-Philippe Lang
f3baa5bfee Fixed: precedes/follows relations no longer update start/due dates (#5803).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4263 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-19 19:16:50 +00:00
Eric Davis
297eb6f81b Refactor: remove WikiController#special
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4262 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-19 15:24:16 +00:00
Eric Davis
c06c22cf2e Refactor: extract method from WikiController#special
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4261 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-18 15:27:49 +00:00
Eric Davis
fef21d5aa2 Remember the selected "Member of Role" and "Member of Group" options. #6467
Contributed by Yuki Kita

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4260 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-16 00:00:23 +00:00
Eric Davis
ce99f3247f Use HTTP DELETE when deleting a time entry. #6674
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4259 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-15 23:37:01 +00:00
Eric Davis
c8177b99ed Revert part of r3936.
link_to_if_authorized no longer supports paths for the link options.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4258 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-15 23:11:05 +00:00
Eric Davis
5823a71c18 Revert part of r4064.
Having link_to_if_authorized support urls has too many edge cases and isn't
working with sub-uris.  #6195 #6513

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4257 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-15 23:11:00 +00:00
Eric Davis
06c0e5ad1c Add rake task to send test email. (#6511)
Contributed by Holger Just

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4256 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-15 22:50:33 +00:00
Eric Davis
c20308c7ba Remove the translated string. It's definition changed in en
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4255 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-15 22:41:52 +00:00
Eric Davis
1bfbc012f5 Add rake tasks to add and remove keys in the locales. #6548
Contributed by Felix Schäfer

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4254 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-15 22:41:47 +00:00
Eric Davis
0271105794 Refactor: extract #page_index from WikiController#special
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4253 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-15 15:36:10 +00:00
Eric Davis
bbbfd4ee4c Refactor: extract finder to a utility method
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4252 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-14 18:01:46 +00:00
Eric Davis
e8468b51cc Refactor: extract method in WikiController#special to create a new #export method
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4251 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-13 17:13:50 +00:00
Eric Davis
718816c5d4 Refactor: convert timelogs to a REST resource (:time_entries)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4250 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-12 15:55:21 +00:00
Jean-Baptiste Barth
71dd4b8a7d Fixed bad markup in users/general partial
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4249 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-11 20:34:33 +00:00
Eric Davis
435c90eb47 Refactor: extract TimelogController#edit to #update
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4248 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-11 15:31:42 +00:00
Eric Davis
700c302fca Change Project#notified_users to check for the 'all' notification option. #6541
The previous mail_notification? check would always pass since the
notifications where converted to strings and strings are always true.

Also changed Project#recipients to use #notified_users instead of duplicated
code.

Based on contribution by Felix Schäfer.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4247 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-10 21:42:24 +00:00
Eric Davis
d2986eb98f Correctly update all mail_notification options. #6549
* Need to check for 't' values to support sqlite
* Need to check the membership count for the 'selected' option

Based on patch contributed by Felix Schäfer

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4246 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-10 21:17:15 +00:00
Eric Davis
eabf1ff3e7 Add SortHelper so custom queries will run on the Calendar. #6612
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4245 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-10 21:17:10 +00:00
Eric Davis
4acd990ee2 Refactor: extract TimelogController#create from TimelogController#edit
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4244 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-08 15:39:39 +00:00
Eric Davis
84ebd786d6 Fix the Log Time link on an issue page
Contributed by Philippe Lafoucrière (gravis)

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4243 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-08 15:01:20 +00:00
Jean-Baptiste Barth
156eca4d22 Added ability to edit issues from different project through contextual menu (#5332)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4242 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-08 03:09:51 +00:00
Eric Davis
73f12765a9 Don't duplicate users in Issue#assignable_users. From r4240
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4241 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-07 17:46:37 +00:00
Eric Davis
7798e1b1f7 Allow assigning issues back to the author. #4199
This allows an issue to be reassigned to the author even if they are not
a project member.  Useful when passing back an issue to get more
information from the author.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4240 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-07 17:28:29 +00:00
Eric Davis
068771ea07 Refactor: extract TimelogController#new from #edit
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4239 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-07 15:51:09 +00:00
Azamat Hackimov
e59156b446 Rename task to issue in calendar (#6563)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4238 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-07 15:26:53 +00:00
Azamat Hackimov
5592e77fc6 Translation updates
* de (#6598)
* ja (#6508, #6570)
* he (#6569)
* ru
* pt (#6509)
* pt-BR (#6494, #6596)
* sv (#6536)
* zh-TW (#6525)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4237 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-07 15:19:28 +00:00
Jean-Baptiste Barth
b255b7760a Added ability to delete issues from different projects through contextual menu (#5332)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4236 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-07 05:11:28 +00:00
Eric Davis
2ecca7e4df Refactor: rename TimelogController#details to #index
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4235 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-06 18:23:45 +00:00
Jean-Baptiste Barth
c43ef6e769 Code cleanup: renamed variables in User#allowed_to? with explicit names
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4234 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-06 05:08:38 +00:00
Jean-Baptiste Barth
e59c927ee5 Fixed: User#allowed_to? returning true in any case if array of projects had only one item (#5332)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4233 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-06 05:08:31 +00:00
Eric Davis
e13790c62c Refactor: extract TimelogController#report to a new controller class
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4232 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-05 16:07:17 +00:00
Eric Davis
a034172b24 Refactor: convert UsersController to resource
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4231 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-10-04 15:36:16 +00:00
Eric Davis
86ba692bf5 Refactor: split UsersController#edit into #edit and #update
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4230 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-30 18:22:46 +00:00
Eric Davis
d06a1a7fa4 Refactor: rename UsersController#add to #new
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4229 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-29 16:00:45 +00:00
Jean-Baptiste Barth
4853dd97fd Splitted #find_issues filter in ApplicationController to #find_issues and #check_project_uniqueness (#5332)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4228 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-29 05:22:53 +00:00
Jean-Baptiste Barth
e8f3dd07dd Added ability to specify multiple projects in User#allowed_to? (#5332)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4227 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-29 05:22:45 +00:00
Eric Davis
fda1a0cb3b Fix test failure from Setting changes in other tests
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4226 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-29 03:02:23 +00:00
Eric Davis
a04e1bd582 Locale update
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4225 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-28 22:15:56 +00:00
Eric Davis
747b9ec568 Refactor: move method to model
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4224 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-28 22:13:11 +00:00
Eric Davis
437690119b Allow admins to edit user's email notifications and preferences. #3503
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4223 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-28 22:13:06 +00:00
Eric Davis
26ef9da02b Changed the notifications to use a hierarchy UI
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4222 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-28 21:09:06 +00:00
Eric Davis
4c9f261a24 Added three new notifiable events based on issue attributes
* issue_note_added
* issue_status_updated
* issue_priority_updated

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4221 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-28 20:20:00 +00:00
Eric Davis
244e94de80 Refactor the hardcoded event actions (notifiables) to use a class
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4220 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-28 20:19:55 +00:00
Eric Davis
582ed86d82 Add a default mail notification setting for new users
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4219 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-28 18:36:50 +00:00
Eric Davis
c059300d99 Added User#notify_about? to check when a user should be notified about an event
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4218 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-28 18:22:10 +00:00
Eric Davis
a61ee73e69 Added tests for Issue#recipients
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4217 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-28 18:22:05 +00:00
Eric Davis
0316af7f6b Converted User#mail_notification from a boolean to a string.
The string will now store which type of notification option to use.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4216 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-28 18:22:00 +00:00
Eric Davis
3a3263102a Refactor: split UsersController#add into #add and #create
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4215 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-28 15:28:50 +00:00
Eric Davis
79e30e7087 Refactor: convert News to a REST resource
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4214 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-27 16:51:12 +00:00
Eric Davis
0a224e8bb1 Bump version to 1.0.2
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4210 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:39:50 +00:00
Eric Davis
d3517e87e5 Update changelog for the 1.0.2 release
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4209 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 22:39:44 +00:00
Eric Davis
ffb3d9260a Support leading and trailing spaces in filenames or directories in the git adapter. #6499
Contributed by Felix Schäfer

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4189 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 21:54:52 +00:00
Eric Davis
bd51119460 Support spaces in the files or directories in the git adapter. #6054
Contributed by Felix Schäfer

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4188 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 19:07:46 +00:00
Eric Davis
319849caf8 Parse the timezone in #last_rev for git to correct display the Age diplay. #6346
Contributed by Felix Schäfer

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4187 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 18:41:06 +00:00
Eric Davis
83e0be5d07 Fixes reverting an issue to a status with a done_ratio of 0%. #5170
Contributed by Felix Schäfer

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4186 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 18:13:31 +00:00
Eric Davis
76fcf136d0 Redirect to project settings after copying a project. #6443
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4185 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 18:04:54 +00:00
Eric Davis
83bfb8cd2b Revert "Fixed: gantt broken when no due date on project issues and versions."
It broke the tests for overdue projects and isn't a good way to fix #6350
because it makes an assumption that a project is due Today and will still
error if issue tracking is disabled.

This reverts commit a7fd592db4. (r4178)

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4184 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 17:35:18 +00:00
Eric Davis
768d67f27b Workaround for i18n 0.4.x with the old style syntax. #6428 #5608
This will also silance the whole trace with the deprecation warning.

Contributed by Felix Schäfer

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4183 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 17:13:52 +00:00
Eric Davis
1781d87477 Add documentation about setting the log level. #6135
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4182 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 16:54:38 +00:00
Jean-Baptiste Barth
2f380a7985 Fixed: don't reset watchers when changing tracker. #6479
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4181 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 13:52:25 +00:00
Azamat Hackimov
b3c5bf3f2e Translation updates
* pt-BR (#6490)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4180 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 13:47:56 +00:00
Jean-Philippe Lang
7a952136e0 Project tests updated.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4179 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 08:24:51 +00:00
Jean-Philippe Lang
a7fd592db4 Fixed: gantt broken when no due date on project issues and versions.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4178 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 08:16:05 +00:00
Jean-Philippe Lang
e9686cbbe5 Fixed: error on mail notification when adding an invalid file (#6452).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4177 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 08:07:41 +00:00
Jean-Philippe Lang
53b131ba2a Fixes broken filter clearing links on gantt and calendar (#6473).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4176 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-26 07:51:10 +00:00
Azamat Hackimov
02b7423b73 Translation updates
* cs (#6471)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4175 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-24 18:04:32 +00:00
Eric Davis
deed1b949d Refactor: move NewsController#preview to PreviewsController#news
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4174 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-24 16:26:46 +00:00
Azamat Hackimov
20305418f4 Translation updates
* cs (#6471)
* ja (#6465)
* zh-TW (#6466)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4173 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-23 16:23:39 +00:00
Eric Davis
401197a895 Refactor: move #destroy_comment method to CommentsController#destroy
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4172 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-23 15:20:19 +00:00
Azamat Hackimov
4948121af0 Translation update
* ru


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4171 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-22 19:45:30 +00:00
Eric Davis
1f2f953687 Refactor: move NewsController#add_comment to CommentsController#create
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4170 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-22 16:25:09 +00:00
Azamat Hackimov
3b20774c54 New string to translate - field_text. It appear when you trying save empty wiki-page. See #6448 for reference.
Translation updates
* ja (#6441)
* ru
* zh-TW (#6451)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4169 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-22 16:06:29 +00:00
Eric Davis
01d1a02df4 Refactor: split NewsController#edit into #edit and #update
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4168 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-21 15:20:37 +00:00
Eric Davis
51359704a0 Added a users options to the reminders email
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4167 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 23:17:51 +00:00
Eric Davis
55fbf6836b Document render_issue_tooltip
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4166 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 18:50:14 +00:00
Eric Davis
a09a39402e Add view_issues_form_details_top hook
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4165 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 18:50:09 +00:00
Eric Davis
6a76aef375 Add User#allowed_to_globally? which wraps User#allowed_to?
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4164 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 16:38:00 +00:00
Eric Davis
3bc29e29e0 Refactor: split NewsController#new into #new and #create methods.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4163 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 15:13:48 +00:00
Eric Davis
1a4f5e87f2 Add scm.css to news pages to allow proper syntax highlighting. #6270
Contributed by Holger Just.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4107 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 02:55:37 +00:00
Eric Davis
e58513c976 Fix failing test.
See http://ci.finn.de/builds/1-8-7_redmine-trunk_postgres/4100

Contributed by Holger Just

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4106 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 02:55:32 +00:00
Eric Davis
f62a1827f3 Updated issue delete confirmation when it has child issues. #6191
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4105 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 02:55:26 +00:00
Eric Davis
1809eefe4c Use the correct local variables in the PDF export. #6382
Contributed by Felix Schäfer

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4104 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 02:55:20 +00:00
Eric Davis
09331ec432 Turn on ssl Gravatars for all SSL requests. #5929
Contributed by Felix Schäfer

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4103 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-20 02:55:14 +00:00
Azamat Hackimov
944d1a68bd Translations update
* ru
* zh-TW (#6365)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4102 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-19 12:00:23 +00:00
Jean-Baptiste Barth
81a28e9ffa Adds a link to edit the associated wiki page on the version view. #4416
Contributed by Felix Schäfer

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4101 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-18 17:30:22 +00:00
Jean-Baptiste Barth
099761d8fb Fixes switching between inline and side-by-side in diff view with path. #6242
Contributed by Felix Schäfer

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4100 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-18 16:50:08 +00:00
Jean-Baptiste Barth
ffdaead5b7 Removed file mistakenly added in r4092. #6392
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4099 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-17 23:13:26 +00:00
Eric Davis
5fdfe02b3a Refactor: add VersionsController#status_by to the resource.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4098 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-17 16:11:43 +00:00
Eric Davis
bd193a026d Refactor: convert VersionsController to a REST resource.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4097 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-17 15:55:08 +00:00
Eric Davis
eb1f58f962 Added some documentation about the Rails Logger. #6135
Contributed by Felix Schäfer

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4096 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-17 04:31:17 +00:00
Eric Davis
b8ea556616 Fix the new subproject link on project overview. #6388
Contributed by Felix Schäfer.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4095 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-17 04:22:46 +00:00
Eric Davis
ebb445c364 Use the relative_url_root when generating asset_paths. #3935
Contributed by Daniel S from Redmine.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4094 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-17 04:06:40 +00:00
Jean-Baptiste Barth
35dba0f412 Fixed: pressing enter in filters should result to an 'apply', not a 'save'. #2285
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4093 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-16 21:33:49 +00:00
Jean-Baptiste Barth
0d967c0572 Fix links to activity pages broken with r4047. #6392
Contributed by Felix Schafer

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4092 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-16 21:26:30 +00:00
Jean-Baptiste Barth
c4d44af54c Fixed non standard SQL syntax. #6413
Contributed by Juan G

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4091 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-16 19:28:04 +00:00
Eric Davis
969bf2107b Refactor: split VersionsController#new into #new and #create
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4090 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-16 18:27:33 +00:00
Eric Davis
bde8ab84f2 Use the full path to the partials
When trying to use the issue form in a plugin, it would try to use the
relative path to the partials which were incorrect.

  Example: would render 'my_plugin_views/attributes'

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4089 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-15 22:43:30 +00:00
Eric Davis
be6e0927f3 Refactor: Split VersionsController#edit into #edit and #update
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4088 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-15 16:50:25 +00:00
Eric Davis
cdfc57d544 Change the TimelogController's to/from dates based on the project time entries
Instead of looking for the earliest and latest time entry system wide for the
dates in the form, now TimelogController will only look at the time entries
for the current project (and parent/sub projects).

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4087 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-14 19:02:25 +00:00
Eric Davis
8900797ada Refactor: move method to Model.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4086 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-14 19:02:20 +00:00
Eric Davis
1b90703157 Refactor: convert FilesController to a restful resource.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4085 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-14 16:24:07 +00:00
Eric Davis
41c055363e Refactor: split FilesController#new into #new and #create.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4084 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-13 20:35:03 +00:00
Jean-Baptiste Barth
12e10f6956 Fixed "Create and continue" redirection broken by recent changes. #6333
IssuesController#create is no more scoped under project, but
IssuesController#new is, so we need to precise project_id
when redirecting to "New issue" form.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4083 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-11 20:21:27 +00:00
Jean-Baptiste Barth
4b69a895df Fixed broken context_menu on roadmap. #6351
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4082 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-11 14:00:23 +00:00
Azamat Hackimov
f2a8057d63 Translations update
* ja (#6363)
 * ko (#6307)
 * po (#6458)
 * pt-BR (#6316)
 * ru
 * sr and sr-YU (#6339)
 * zh-TW (#6306)
New strings to translate
 * field_member_of_group (r4077)
 * field_assigned_to_role (r4078)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4081 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-11 11:16:56 +00:00
Eric Davis
878bb55522 Refactor: move method to Project#css_classes
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4080 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-10 23:07:10 +00:00
Eric Davis
d36700eeee Refactor: replace chained finders with an inject. Should handle edge cases better.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4079 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-10 19:53:57 +00:00
Eric Davis
41f8d043eb Added a "Member of Role" to the issues filters. #5869
This filter will check an issue's assigned to field for users who have
(or don't have) a specific Role(s).

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4078 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-10 19:44:45 +00:00
Eric Davis
109b42f482 Added a "Member of Group" to the issues filter. #5869
This filter will check an issue's assigned to field for users in (or not in)
specific groups.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4077 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-10 18:46:29 +00:00
Eric Davis
4c656fcffc Define Principal#name so all subclasses will have some sort of name when printed.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4076 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-10 18:46:23 +00:00
Eric Davis
3a2efb4757 Refactor: convert ProjectEnumerations to a resource on a project.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4075 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-10 16:00:49 +00:00
Eric Davis
5e1c295230 Fixed the zoom, previous, and next links on the Gantt chart.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4074 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-10 03:09:18 +00:00
Eric Davis
abf3ee4999 Add project names to the Versions in the Gantt export. #5904
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4073 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-10 03:09:11 +00:00
Eric Davis
bdb3937e0f Rewrite the Gantt chart. #6276
This version of the Gantt chart supports nested charts. So Projects,
Versions, and Issues will be nested underneath their parents correctly.

Additional features:

* Move all Gantt code to Redmine::Helpers::Gantt class instead of having it in
  the Gantt class, controller, and view
* Recursive and nest sub-projects
* Recursive and nest versions
* Recursive and nest issues
* Draw a line showing when a Project is active and it's progress
* Draw a line showing when a Version is active and it's progress
* Show a version's % complete
* Change the color of Projects, Versions, and Issues if they are late or
  behind schedule
* Added Project#start_date and #due_date
* Added Project#completed_percent
* Use a mini-gravatar on the Gantt chart
* Added tests for the Gantt rendering

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4072 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-10 03:09:02 +00:00
Eric Davis
8d52608dba Refactor: convert the Projects routes to resources.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4071 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-09 18:57:21 +00:00
Eric Davis
bf7476af5b Refactor: split method ProjectsController#edit to ProjectsController#update.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4070 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-08 16:01:51 +00:00
Eric Davis
2295b61cb6 Refactor: rename method ProjectsController#add to ProjectsController#new
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4069 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-07 15:00:27 +00:00
Eric Davis
06878e5004 Change project add form to use #create. (From r4067)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4068 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-06 15:09:52 +00:00
Eric Davis
763ab07942 Refactor: split ProjectsController#add into #add (GET) and #create (POST).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4067 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-06 14:53:08 +00:00
Eric Davis
9da4ee5fcc Allow user password changes when changing to Internal authentication. #6267
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4066 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-06 01:02:52 +00:00
Eric Davis
270b559d36 Refocus the related issue field after submitting an issue. #6275
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4065 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-06 00:48:44 +00:00
Eric Davis
d771fa9289 Change link_to_if_authorized to allow url paths. (Fixes #6195)
Both url paths (/issues/1234) and params hashes (:controller => 'issues')
are now supported by link_to_if_authorized.  The authorize_for method
requires a controller/action pair so urls need to be parsed against the
routes to find their controller/action.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4064 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-06 00:26:08 +00:00
Eric Davis
563c879e44 Use the built in Rails ActionView::TestCase for testing helpers.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4063 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-06 00:26:02 +00:00
Eric Davis
db11030410 Refactor: move method to model. (references r4057)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4062 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-05 22:57:20 +00:00
Azamat Hackimov
cbe266079e Added string "cant_link_an_issue_with_a_descendant" to translations missed in #443
Solves #6278


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4061 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-05 13:01:38 +00:00
Azamat Hackimov
c5071cd091 Translation updates:
* ca (#6263)
* nl (#6248)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4060 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-05 11:33:08 +00:00
Jean-Baptiste Barth
a9f5a17c67 Do not display items without valid selection in context menu when on different projects. #4998
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4059 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-03 21:43:07 +00:00
Jean-Baptiste Barth
c799d03ece Added missing tests for User#allowed_to? #6291
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4058 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-03 20:16:00 +00:00
Jean-Baptiste Barth
b6d9f2bddf Add css classes to journals display to facilitate theming
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4057 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-03 20:05:51 +00:00
Jean-Baptiste Barth
4776a5a427 Hide checkboxes in issues list when printing
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4056 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-03 19:59:49 +00:00
Jean-Baptiste Barth
a2ce6e236c Allow mass status update through context menu. #3411
NB: it cannot be done with issues from different projects, same as
other fields. This will be addressed separately, see #5332.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4055 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-03 19:54:24 +00:00
Eric Davis
c1068bf0cd Refactor: move method, ProjectsController#reset_activities to ProjectEnumerationsController#destroy.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4054 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-03 15:04:03 +00:00
Eric Davis
83b4343d2d Refactor: move method, ProjectsController#save_activities to ProjectEnumerationsController#save
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4053 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-02 17:39:56 +00:00
Eric Davis
b5e90972d8 Refactor: move method, ProjectsController#add_file to FilesController#new.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4052 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-09-01 15:17:45 +00:00
Eric Davis
daa8eaa9ae Refactor: move method, ProjectsController#list_files to FilesController#index.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4051 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-31 15:12:58 +00:00
Eric Davis
a188abbe28 Refactor: move method, ProjectsController#roadmap to VersionsController#index.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4050 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-30 15:30:28 +00:00
Azamat Hackimov
1ebb0d9cae Translation updates
* mk (#6208)
* sv (#6210)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4049 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-29 12:54:04 +00:00
Eric Davis
f92dcdf50a Allow setting an issue's notes via params[:issue][:notes]. (XML API)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4048 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-27 20:08:59 +00:00
Eric Davis
b925325ddb Refactor: extract ProjectsController#activity to a new Activities controller.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4047 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-27 14:05:54 +00:00
Eric Davis
5b08b2f33d Refactor: extract common code to link_to_month.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4046 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-26 16:37:26 +00:00
Eric Davis
30821586cb Add the project_id to the Calendar link to month.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4045 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-26 16:37:21 +00:00
Eric Davis
ab1e74d16c Refactor: extract target link generation.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4044 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-26 16:37:16 +00:00
Eric Davis
91380eeaab Refactor: extract ternary operators to temps.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4043 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-26 16:37:11 +00:00
Eric Davis
3eea03d70e Refactor: extract link to previous and next month into helpers.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4042 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-26 16:37:05 +00:00
Eric Davis
56e984b5e7 Refactor: convert many of the custom Issue routes to REST resources.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4041 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-26 16:36:59 +00:00
Eric Davis
daa4272c0e Refactor: extract method in bulk_update.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4040 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-25 14:59:16 +00:00
Azamat Hackimov
bc951a9d4f remove BOM from zh-TW
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4039 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-24 16:15:14 +00:00
Azamat Hackimov
2e2241cf84 Translation updates
* de (#6198)
* ja (#6189)
* zh-TW (#6197)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4038 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-24 15:32:11 +00:00
Eric Davis
80256cf298 Refactor: extract #bulk_update method from IssuesController#bulk_edit.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4037 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-24 15:27:12 +00:00
Azamat Hackimov
95673a9ee4 Adding missed new strings for #6153:
*  project_module_gantt: Gantt
*  project_module_calendar: Calendar


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4036 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-23 19:39:35 +00:00
Eric Davis
dfcb5a666f Updated permissions for r4034
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4035 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-23 15:32:57 +00:00
Eric Davis
b67b3820a1 Refactor: move IssuesController#changes to JournalsController#index.
Since #changes is only an Atom feed of journals of a query, it makes
more sense to have it on the JournalsController resource.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4034 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-23 15:04:36 +00:00
Eric Davis
5b4bd8a59a Sure hope 1.0.1 wasn't released in 201,008 AD...
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4029 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 21:17:44 +00:00
Eric Davis
22fa8d9b31 Bump version to 1.0.1
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4028 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 21:15:38 +00:00
Eric Davis
dcd2204786 Updated changelog for 1.0.1
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4027 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 21:15:33 +00:00
Eric Davis
05527be943 Add RTL support to the context menu. #6012
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4014 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 19:12:21 +00:00
Eric Davis
fc9b984cc1 Treat Calendar and Gantt pages as separate modules. #6153
This will let the Issue Tracking, Gantt, and Calendar modules be enabled
or disabled as needed.  A database migration will enable the Gantt and
Calendar for all existing projects that have Issue Tracking enabled.

Contributed by Adam Soltys

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4013 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 18:42:00 +00:00
Eric Davis
7e565eed34 Fix the calendar link in the Issues sidebar. #5591
Contributed by Andrew Rudenko

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4012 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-22 18:30:26 +00:00
Eric Davis
dfd1d0c7fe Refactor: merge IssuesController#update_form into IssuesController#new
The #update_form action was only refreshing the issue attributes form,
so it's just a specialized JavaScript version of #new.  This also removed
old code that was extracted in other places (@issue.new_statuses_allowed_to).

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4011 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-20 15:22:19 +00:00
Eric Davis
9696557897 Fix the mock_file test helper.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4010 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 22:24:42 +00:00
Eric Davis
e4c5a91d0e Refactor: extract Members Box to partial.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4009 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 22:24:37 +00:00
Azamat Hackimov
1c53668bc9 Remove dublicate string
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4008 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 19:47:55 +00:00
Azamat Hackimov
af58531482 Localisation updates: New string to fix #5162
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4007 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 18:50:18 +00:00
Eric Davis
1fcc1bdc89 Refactor: move IssuesController#context_menu to a new controller.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4006 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 18:16:54 +00:00
Azamat Hackimov
57372d9d8e Real RTL-theme support in locales (#6012)
Now each locale-file have direction string (ltr - left-to-right - by default).


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4005 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 16:57:44 +00:00
Azamat Hackimov
eefb36177d Fixing #6009
Added to all locales required strings.


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4004 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 16:35:51 +00:00
Azamat Hackimov
01788e83e7 Translation updates for upcoming release
* de (#6079)
* es (#6021)
* it (#6093)
* nl (#6025)
* ru
* sr and sr-YU (sr is now serbian cyrillic, #6078)
* sv (#6142)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4003 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 15:41:09 +00:00
Eric Davis
782a5f1218 Add Issue Status to the tooltip. #6169
Contributed by Nick Peelman

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3952 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 03:43:33 +00:00
Eric Davis
fc6e7f12b7 Small test refactoring, extract method.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3951 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 01:28:33 +00:00
Eric Davis
a256e4b1dc Scope the calendar popup CSS so it doesn't conflict with the Calendar menu. #6163
Contributed by Adam Soltys

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3950 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 01:13:50 +00:00
Eric Davis
73ba49a715 Use the base layout for all 403, 404, and 500 pages. #6172
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3949 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-19 01:01:35 +00:00
Eric Davis
c090d115e2 Added a rake task to display permissions.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3948 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-18 17:23:23 +00:00
Eric Davis
e6e21046c0 No more IssuesController#preview action.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3947 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-18 15:03:42 +00:00
Eric Davis
1f8d396e3f Refactor: move IssuesController#preview to a new controller.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3946 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-18 15:01:35 +00:00
Eric Davis
3eff27344b Refactor: move IssuesController#auto_complete to a new controller. #4382
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3945 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-17 15:03:58 +00:00
Eric Davis
e63acb70ca Add the Calendar as a project menu item.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3944 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-16 23:56:42 +00:00
Eric Davis
a24f448dc0 Add the Gantt chart as a project menu item
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3943 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-16 23:56:37 +00:00
Eric Davis
d2b0a51848 Allow key authentication for Boards. #6132
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3942 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-16 23:39:27 +00:00
Eric Davis
22c978ad94 Refactor: move IssuesController#reply to JournalsController
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3941 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-16 16:25:04 +00:00
Eric Davis
13fe01a185 Refactor: pull up method to ApplicationController.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3940 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-13 14:59:04 +00:00
Jean-Baptiste Barth
32f6fa5b00 Fixed: changing view style in repository/diff doesn't keep previously selected file. #6045
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3939 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-13 06:09:38 +00:00
Eric Davis
f18b126fba Refactor: Pull up method to ApplicationController.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3938 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-12 13:57:51 +00:00
Eric Davis
a6112ef40d Fix path to test_helper
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3937 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-12 13:57:46 +00:00
Eric Davis
ff43bb1a74 Refactor: Extract a new IssueMovesController from IssuesController.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3936 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-11 14:42:10 +00:00
Jean-Baptiste Barth
e43f9fc21e Show projects depending on their visibility in user's profile. #6100
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3935 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-10 23:07:44 +00:00
Jean-Baptiste Barth
0cfa757db0 Added a warning when a new user or group membership is invalid. #3834
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3934 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-10 22:37:00 +00:00
Jean-Baptiste Barth
83e4cf3dd4 Prevent 500 error on login when there's a typo in OpenID URI scheme, such as http;// or http.//
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3933 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-10 21:12:32 +00:00
Eric Davis
52c624aabd Refactor: extract method from #move and #perform_move.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3932 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-10 15:11:11 +00:00
Eric Davis
424b482579 Refactor TimelogController#report's joins and provide a hook to add more.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3931 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-09 23:15:32 +00:00
Eric Davis
a1b89a53eb Refactor: extract POST version of IssuesController#move to #perform_move.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3930 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-09 14:53:23 +00:00
Jean-Baptiste Barth
e00884bcca Removed hard-coded english error message on failed Member creation
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3929 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-09 05:10:00 +00:00
Jean-Baptiste Barth
56e3953a71 Removed useless debug code. #5978
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3928 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-08 20:26:33 +00:00
Jean-Baptiste Barth
56a6d86af5 Added project filter when viewing all issues. #5084
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3927 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-08 09:01:25 +00:00
Jean-Baptiste Barth
bc5d32d6de Replace Test::Unit::TestCase with ActiveSupport::TestCase. #5477
Contributed by Alexey Palazhchenko

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3926 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-08 07:07:38 +00:00
Jean-Baptiste Barth
780bdccc42 Fixed wrong commit range in git log command. #5628
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3925 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-08 07:07:30 +00:00
Jean-Baptiste Barth
a1b607480a Refactor: added link_to_project helper to handle links to projects
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3924 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-08 07:07:20 +00:00
Eric Davis
5b64f0ff96 Updated changelog format to use lists.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3923 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-07 15:11:31 +00:00
Eric Davis
2e14ba95a0 Add static docs to YARD.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3922 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-07 15:11:26 +00:00
Eric Davis
2c79572e4b Save yard doc to the doc/app directory.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3921 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-07 15:11:21 +00:00
Eric Davis
7a3dcdc67f Exclude test files from YARD.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3920 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-07 15:11:15 +00:00
Eric Davis
ab546a14cb Add a rake task to run CI.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3919 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-06 20:46:44 +00:00
Eric Davis
041bca6ac9 Refactor: start to split IssuesController#move into two separate actions.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3918 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-06 15:47:27 +00:00
Eric Davis
e4af6e77a7 Refactor: extract method in IssuesController#move.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3917 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-05 17:43:07 +00:00
Jean-Baptiste Barth
0bcde4ab28 Fixed: assigned_to and author filters in cross project issues view should be based on user's project visibility. #5760
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3916 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-04 21:01:56 +00:00
Jean-Baptiste Barth
8a2bc5772e Focus on the input when adding a related issue on issues/show page. #4656
Contributed by Edouard Briere

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3915 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-04 20:52:31 +00:00
Jean-Baptiste Barth
491c9d2b55 Display projects as links in users/memberships partial. #5898
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3914 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-04 20:41:32 +00:00
Eric Davis
70973fda64 Fix a few requires for metric_fu's rcov.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3913 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-04 15:04:30 +00:00
Eric Davis
8c79385261 Refactor: extract back_url method to ApplicationController.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3912 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-04 13:37:44 +00:00
Eric Davis
a544a1e57c Added css classes to the HTML body based on the theme, controller, and action. #819
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3911 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-04 01:17:45 +00:00
Eric Davis
07cd12978e Add maxlength attributes to some Project fields. #4896
Contributed by Felix Schäfer

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3910 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-04 00:59:15 +00:00
Eric Davis
6f3ae29522 Use the MenuManager for the Administration menu. #6008
Contributed by Jean-Baptiste Barth.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3909 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-04 00:38:22 +00:00
Eric Davis
6e14b8a6af Remove extra css like the border on revision links in Associated Revisions. #5971
Contributed by Holger Just.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3908 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-04 00:27:41 +00:00
Eric Davis
16969fdbbb Show the number of days in the subject line of Reminder emails.
i18n check needed.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3907 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-03 16:01:53 +00:00
Eric Davis
13234f8552 Refactor: Add methods to User to edit the encapsulate the status field.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3906 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-03 15:26:50 +00:00
Eric Davis
25037b841b Refactor: extract method to shoulda macro.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3905 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-02 15:43:04 +00:00
Eric Davis
d3158e37b9 Added tests for AccountController#register POST with automatic registration.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3904 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-02 15:42:59 +00:00
Eric Davis
5c525f0b41 Added tests for AccountController#register GET.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3903 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-08-02 15:42:54 +00:00
Eric Davis
ca663fcd10 Use image_path for the favicon instead to pick up asset hosts. #3301
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3899 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-30 19:18:33 +00:00
Azamat Hackimov
dbb8645353 RTL theme for reference (thanks to Orgad Shaneh, #5972)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3898 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-29 15:48:53 +00:00
Azamat Hackimov
702b7296a0 Translation updates
* de (#5982)
* zh (#5910) - revert last commit & new string


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3897 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-29 15:47:38 +00:00
Eric Davis
5f20bc240e Add a favicon link with support for suburi. #3301
Contributed by Yuki Kita and Christian Boenning

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3894 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-29 14:58:33 +00:00
Azamat Hackimov
2a85a1cebf Translation updates
* de (#5982)
* he (#5972)
* hu (#5962)
* zh (#5910)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3893 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-28 20:05:06 +00:00
Jean-Philippe Lang
4f2d1b7424 Fixed: Vertical scrollbar always visible in Wiki "code" blocks in Chrome (#5861).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3891 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 12:56:57 +00:00
Jean-Philippe Lang
db55ea8cb3 Moves LDAP entry in admin menu.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3889 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 12:48:28 +00:00
Jean-Philippe Lang
e1c3415795 Fixes context menu broken by r3869 (#5925).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3887 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 11:55:57 +00:00
Jean-Philippe Lang
701d2eaeac Display project names in cross-project gantt PNG (#5904).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3885 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 11:43:19 +00:00
Jean-Philippe Lang
bdad35a736 Display project names for versions too on PDF (#5904).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3884 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 11:19:44 +00:00
Jean-Philippe Lang
cb5e63d846 Display project names in cross-project gantt PDF (#5904).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3883 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 11:10:08 +00:00
Jean-Philippe Lang
c47d23a87b Fixed: Deleting statuses doesn't delete all workflow entries (#5811).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3881 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 10:48:27 +00:00
Jean-Philippe Lang
73d9368039 Fixed: Add Another file to ticket doesn't work in IE (broken by r3750).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3879 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 10:34:55 +00:00
Jean-Philippe Lang
91f7cbb79d Fixed: Forum message permalinks don't take pagination into account (#5945).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3877 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 10:02:12 +00:00
Jean-Philippe Lang
72ce4f3ab9 Harmonize french locale "zero" translation with other locales (#5937).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3875 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 09:54:59 +00:00
Jean-Philippe Lang
66820dbed3 Strips user email (#5834).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3873 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 09:50:41 +00:00
Jean-Philippe Lang
fd0623bf69 Fixes broken status change in context menu (#5892).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3871 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 09:47:37 +00:00
Jean-Philippe Lang
379c0a1dd4 Disable priority (#5925) and progress in context menu for parent issues.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3869 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 09:38:54 +00:00
Jean-Philippe Lang
fe63eefc1f Adds missing visibility scope.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3866 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 09:29:46 +00:00
Jean-Philippe Lang
a9a4e0d6b8 Moves code to controller.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3865 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-25 09:29:17 +00:00
Azamat Hackimov
7f49f07e9a Try to resolve bug #3922
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3864 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-24 10:26:53 +00:00
Azamat Hackimov
90490c92a0 Translation updates
* fr (#5912)
* ru
* zh (#5910)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3863 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-24 09:47:31 +00:00
Eric Davis
a628b0f186 Force-clear the default value for migration from :string to :text. #5846 #5771
This is a special case for MySQL in Win32.

Contributed by Holger Just.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3860 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-24 00:19:32 +00:00
Eric Davis
4fef8b601d Added icon for the LDAP authentication menu item. #5775
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3859 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-20 23:50:15 +00:00
Eric Davis
fa8d0c5c6f Bump version to 1.0.0
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3854 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-18 16:35:43 +00:00
Eric Davis
854ba2a8d2 Adding 1.0.0's release date.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3853 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-18 16:35:37 +00:00
Eric Davis
c087e6f895 Readme update.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3849 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-18 15:49:24 +00:00
Eric Davis
6807d070da Updated the INSTALL and UPGRADING documents for the 1.0 release.
Contributed by Mischa The Evil

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3848 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-18 15:19:04 +00:00
Azamat Hackimov
09a681db8b Translation updates
* ru 
* sv (#5740)
* pt-BR (#5785)
* zh (#5158, #5883)
* zh-TW (#5735)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3847 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-16 16:47:00 +00:00
Eric Davis
9cfa15917d Added an official favicon.ico
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3845 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-16 03:45:50 +00:00
Eric Davis
d064f27271 Updating CHANGELOG for 1.0
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3843 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-16 03:25:03 +00:00
Eric Davis
c6223864d0 Add :view_issues_index_bottom hook. #5169
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3842 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-16 03:16:29 +00:00
Eric Davis
5e259d41e2 Fix typos in the examples. #5823
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3841 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-16 03:11:35 +00:00
Eric Davis
cd54efa0c9 Force the test RAILS_ENV to help prevent purging data when mistyping. #4572
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3840 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-09 13:46:20 +00:00
Eric Davis
a84ea6866d Version 0.9.6
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3836 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-08 03:53:07 +00:00
Eric Davis
83f1ecb980 Update the CHANGELOG for 0.9.6
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3835 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-08 03:53:01 +00:00
Eric Davis
69af1515d1 Check the browse repository or commit access permissions in Redmine.pm with LDAP. #5797
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3832 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-08 03:46:19 +00:00
Eric Davis
ef5bca0fef Have Redmine.pm respect the Authentication Required setting. #5797
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3831 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-08 03:46:14 +00:00
Eric Davis
0d5fca9ba5 Force the default value of path to be set on the Change model class. #5771
This is needed because MySQL does not support default values on text columns
(Error introduced in r3828)

Contributed by Holger Just

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3830 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-06 21:06:09 +00:00
Eric Davis
ad73f12a6b Include visible subprojects when checking for available Activity event types. #5589
Contributed by Felix Schäfer

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3829 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-06 02:22:03 +00:00
Eric Davis
56af944afa Extend changes.path and changes.from_path to support longer paths. #5771
Long paths to SCM files would be truncated or wouldn't insert into some
databases.  This extends those fields to support arbitrary length filenames.

Contributed by Holger Just

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3828 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-06 02:07:46 +00:00
Eric Davis
48a5460da4 Allow js formatted responses.
Otherwise they return the invalid format error (406) instead of 403, 404, or 500

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3827 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-05 18:00:50 +00:00
Eric Davis
bd1384db7d Added hook :controller_timelog_available_criterias
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3826 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-01 18:49:25 +00:00
Eric Davis
11ff334cd8 Refactor: extract @available_criterias to utility method.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3825 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-07-01 18:47:25 +00:00
Eric Davis
64d2221db5 Set @project so macros will work on the welcome and project list. #5781
Contributed by Holger Just

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3824 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-30 03:32:18 +00:00
Eric Davis
43bbda1966 Don't style lists in a project description as a sub-project. #5752
Contributed by Holger Just

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3823 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-30 03:14:30 +00:00
Eric Davis
5a17b5ba39 Fix Chrome JavaScript bug in the pop up calendar. #5769
Contributed by Holger Just

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3822 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-30 02:54:15 +00:00
Eric Davis
c6201ae15b Recalculate inherited attributes on parents when a child is moved under a new parent. #5524
Contributed by Jean-Baptiste Barth.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3821 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-30 02:45:34 +00:00
Eric Davis
305cab100f Rename code and locale typo: Developper. #5751
Contributed by Holger Just

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3820 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-30 01:55:44 +00:00
Eric Davis
6ef240841c Add some tests for User#try_to_login with LDAP. #5592
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3819 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-30 01:47:47 +00:00
Eric Davis
bc3ad9af38 Bump release to 0.9.5
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3815 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-28 02:46:25 +00:00
Eric Davis
c7d075fb68 Updating documentation for the 0.9.5 release.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3814 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-28 02:46:20 +00:00
Eric Davis
672852baaf Force string comparison for login search to be case sensitive on MySQL. #2473
Contributed by Holger Just.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3813 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-24 03:08:20 +00:00
Eric Davis
6eea3300f8 Sanitize image links and handle nils in the toc formatter. #5445
Based on contribution by Yuki Kita.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3811 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-24 02:35:24 +00:00
Azamat Hackimov
68bdbbac7d Refresh locales
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3810 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-21 19:58:17 +00:00
Azamat Hackimov
e21b91485e New language en-GB (#5648 thank to Tom Knight for work)
Updates:
* ja (#5715)
* sv (#5671)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3809 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-21 19:54:55 +00:00
Eric Davis
6cb4ff7d89 Refactor and documentation for User#find_by_login.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3808 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-20 21:40:55 +00:00
Eric Davis
de17640489 Change User#login to be case-insensitive. #2473
This change also overrides User#find_by_login to give priority to exact
matches in the login.

Contributed by Greg Mefford

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3807 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-20 21:40:50 +00:00
Eric Davis
7376ef2ad7 Typecast issue ids when searched for.
Older Postgres versions don't allow searching over the id field's max size.

Contributed by Holger Just

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3806 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-20 20:01:32 +00:00
Eric Davis
c98f46d691 Handle unsuccessful destroys in TimelogController. #5700
Contributed by Jan

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3805 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-20 19:30:51 +00:00
Eric Davis
acef1d5352 Exclude fields_for in the TabularFormBuilder, it has a different method
signature. #5416

Contributed by Jean-Baptiste Barth

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3804 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-20 19:03:09 +00:00
Eric Davis
d2f8feb7c5 Optimize the N+1 query in watcher_recipients. #5415
Contributed by Holger Just

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3803 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-20 18:41:30 +00:00
Eric Davis
116c7a7964 Add a link to the cross project time entries page to /projects. #4935
Contributed by Jan.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3802 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-20 16:29:12 +00:00
Eric Davis
4083e7e622 Truncate incoming email subject lines to 255 characters. #5698
Contributed by Jan

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3801 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-20 16:22:36 +00:00
Eric Davis
c5863c0ad0 Support listing directories in svn which include square brackets. #5548
Contributed by Gregor Schmidt

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3800 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-20 16:08:26 +00:00
Eric Davis
70da33fc29 Add some assertions on the default data loading test to debug a Ruby 1.9 failure.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3799 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-20 16:08:20 +00:00
Eric Davis
95c3c63cfe Fix for Ruby 1.9 strings.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3798 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-20 16:08:15 +00:00
Eric Davis
5db9a982cc Added two hooks to the issues report. #5233
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3797 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-20 03:37:42 +00:00
Eric Davis
41ff1b9cb2 Display the correct ISO week number on the project calendar.
http://en.wikipedia.org/wiki/ISO_week

Contributed by Holger Just

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3790 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-19 22:52:15 +00:00
Eric Davis
b2e903ff7c Calculate the correct week number for weeks starting at any date. #4857
http://en.wikipedia.org/wiki/ISO_week

Contributed by Holger Just

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3789 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-19 22:52:09 +00:00
Eric Davis
093853b56a Added tests for #5533's behavior.
Contributed by Gregor Schmidt.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3788 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-19 22:17:34 +00:00
Eric Davis
b10818f4a1 Add a css class to hide content when printing. #5508
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3787 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-19 21:53:58 +00:00
Eric Davis
b53de502ab Display the link name when external links are used in the toc macro. #5445
Contributed by Yuki Kita and Jean-Baptiste Barth

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3786 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-19 21:39:21 +00:00
Eric Davis
69d9600f48 Added documentation about the session_path. #3968
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3785 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-19 20:04:47 +00:00
Eric Davis
2562bc5bcd Hide the role forms when editing or adding Project members. #5452
Contributed by Yuki Kita

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3784 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-19 19:51:43 +00:00
Eric Davis
d48eb2de47 Accept email from anonymous users with an empty from address. #5604
Contributed by Andrew Fenn

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3783 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-19 19:24:17 +00:00
Eric Davis
5f93750c80 Pin shoulda, 2.11.x changes it's API and deprecates a lot of macros.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3782 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-19 19:01:53 +00:00
Eric Davis
921b425b8e Accept key authentication to ProjectsController#index (for feeds). #5317
Contributed by Greg Mefford

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3777 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-19 17:45:04 +00:00
Eric Davis
d635fff3f5 Add ATOM auto discovery link to the Projects list. #5317
Contributed by Greg Mefford

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3776 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-19 17:44:59 +00:00
Eric Davis
43fabab950 Fixed HTML validation errors
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3775 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-19 16:50:13 +00:00
Eric Davis
f08b2a394d Unused variable
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3774 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-19 03:54:28 +00:00
Eric Davis
cf334cee31 Refactor: extract test method
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3773 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-19 03:54:23 +00:00
Eric Davis
c56c0f411c Fix a nil error when a Project cannot save attachments.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3772 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-19 03:54:17 +00:00
Eric Davis
759858d11d Add example url and author url to the plugin generator.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3771 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-17 19:02:13 +00:00
Eric Davis
1a145dca25 Plugin models and controllers must be unloadable.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3770 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-17 19:02:07 +00:00
Eric Davis
28519714e0 Updated the project calendar for greater accessibility.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3769 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-15 23:20:32 +00:00
Eric Davis
f18c0c790b Ignore rubinius .rbc files
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3768 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-09 22:01:21 +00:00
Azamat Hackimov
3096166f09 fr update (#5617)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3767 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-05 07:20:30 +00:00
Eric Davis
345301284a Added JSON support to the issues API. #1214
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3766 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-05 03:52:59 +00:00
Eric Davis
f484fe8556 Convert tests to shoulda
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3765 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-06-05 03:52:53 +00:00
Eric Davis
e94c45d548 Add an "Assigned To" keyword to receiving email. #5594
Will take a user's email address, login, or full name.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3764 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-29 00:05:24 +00:00
Eric Davis
080dc2212e Add 'Start date' and 'End date' keywords for incoming email. #5595
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3763 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-28 23:45:45 +00:00
Azamat Hackimov
af726ea8f0 Locales update
* ja (#5607)
* ru (#5606)
* pt-BR (#5611)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3762 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-28 15:32:01 +00:00
Eric Davis
1a4b23731f Include the Project name when sorting versions.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3761 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-27 17:16:15 +00:00
Eric Davis
f3cc84b343 Show subproject versions on the Roadmap.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3760 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-27 17:16:10 +00:00
Eric Davis
e5ac73b7dc Somehow ran out of unique identifiers.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3759 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-27 17:16:05 +00:00
Azamat Hackimov
b88b15183b Translation updates, Locales sync (rake locales:update)
* ru
* zh-TW (#5602)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3758 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-27 15:34:22 +00:00
Eric Davis
6e529f82a7 Make the Gantt zoom images more accessible
* Correct the alt text
* Add text links next to the images
* Size the images in em to support browser scaling

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3757 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-26 22:48:35 +00:00
Eric Davis
ab4bdc379e Refactor: extract gantt zoom links to a helper.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3756 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-26 22:48:17 +00:00
Eric Davis
c3c3460e0d Add the page title when editing /my/page.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3755 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-26 21:52:03 +00:00
Azamat Hackimov
2b203fe5ab Translation update: Japanese (#5600 get haha, congratulations!)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3754 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-26 20:59:51 +00:00
Azamat Hackimov
ef1c63efbf Translation updates
* de (#5558)
* sv (#5570)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3753 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-26 17:43:50 +00:00
Azamat Hackimov
8c02e4c723 zh-TW update (#5597)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3752 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-26 17:36:25 +00:00
Azamat Hackimov
513c18d2d3 Translation sync
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3751 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-26 17:33:01 +00:00
Eric Davis
e320017cf0 Convert the file attachment's description to a label.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3750 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-25 00:11:58 +00:00
Eric Davis
0d34c3731b Add error messages to MembersController#new so a user is informed of missing data.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3749 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-24 20:21:16 +00:00
Eric Davis
f97ff28628 Invalid HTML
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3748 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-24 20:21:08 +00:00
Eric Davis
52a92b1822 Added a missing label to my/page_layout.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3747 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-24 18:23:42 +00:00
Eric Davis
51d3f51159 Added missing labels to the Issue Calendar.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3746 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-24 18:07:43 +00:00
Eric Davis
908d44519c Allow AuthSources to control if they allow password changes.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3745 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-23 03:16:37 +00:00
Eric Davis
715c9d16ef Refactor AuthSourcesController to support non-LDAP sources. #1131
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3744 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-23 03:16:31 +00:00
Eric Davis
a1f73c8b20 Remove hard coded LDAP log message.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3743 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-23 03:16:25 +00:00
Jean-Philippe Lang
3601c291d0 Typo in french locale.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3741 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-22 08:54:43 +00:00
Jean-Philippe Lang
1933f9ddb2 Typo in french locale.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3740 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-22 08:54:17 +00:00
Azamat Hackimov
e474a6095b Updates (#5409)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3739 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-15 13:12:52 +00:00
Azamat Hackimov
8c93cc4381 sr and sr-CY languages (#5409)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3738 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-15 13:11:26 +00:00
Azamat Hackimov
cd097a5758 New translation (Latvian, #5446, thanks to Dzintars Bergs), translation updates
* ja (#5368)
* he (#5370)
* hu (#5364)
* no (#5471)
* ru (#5476)
* sk (#5432)
* sr (#5409)
* sv (#5467)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3737 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-14 18:15:41 +00:00
Eric Davis
a7b80fcc06 Use present? instead of any?. Handles nil case.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3736 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-14 17:15:09 +00:00
Jean-Philippe Lang
e417d755e9 Eager load group projects to avoid N SQL queries.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3735 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-09 11:31:39 +00:00
Jean-Philippe Lang
0fa124a92c Adds missing thead tags (#5440).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3734 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-09 11:19:15 +00:00
Eric Davis
36c82ecc1f Refactor: move Project Calendar to it's own controller.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3732 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-03 16:02:37 +00:00
Jean-Philippe Lang
469ff0fb4e Fixing indentation.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3731 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-01 14:21:59 +00:00
Jean-Philippe Lang
2fda2c1826 Adds trackers to individual project XML (#5342).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3730 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-01 14:21:41 +00:00
Jean-Philippe Lang
cbd4af236c Adds issue relations to individual issue XML (#5305).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3729 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-01 14:07:36 +00:00
Jean-Philippe Lang
a499efd328 Updates for 0.9.4 release.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3727 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-01 12:37:20 +00:00
Jean-Philippe Lang
faeae788be Adds auto scroll to context submenus (#2863).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3725 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-01 11:54:40 +00:00
Jean-Philippe Lang
edeb84a070 Fixes strange random test failures with Mysql.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3724 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-01 10:09:20 +00:00
Jean-Philippe Lang
6a8dc735d3 Fixes Bazaar adapter for JRuby/Win32 (#5404).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3723 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-01 09:56:59 +00:00
Jean-Philippe Lang
b897089729 Fixes Mercurial adapter for JRuby (#4494, #5404).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3722 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-01 09:55:40 +00:00
Jean-Philippe Lang
4a4bc93278 Adds jdbc rake tasks (#5404).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3721 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-01 09:37:46 +00:00
Jean-Philippe Lang
1be15816dd Adds test helpers for test repositories.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3720 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-05-01 08:32:21 +00:00
Jean-Philippe Lang
80f7faf10a Fixes EOL style related test failures.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3719 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-30 18:08:40 +00:00
Jean-Philippe Lang
0a47389a65 Fixes some textile issues with JRuby (#5404).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3718 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-30 17:50:34 +00:00
Eric Davis
306ca5e714 Refactor: Pull up #find_optional_project to ApplicationController.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3716 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-30 17:24:11 +00:00
Jean-Philippe Lang
f65c47e3a7 Fixes theme discovery under JRuby on Rails war structure (#632, #5404).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3710 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-30 12:44:19 +00:00
Jean-Philippe Lang
da7c89bfd0 Fixes workflow edit with JRuby (#5404).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3709 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-30 12:19:51 +00:00
Jean-Philippe Lang
663f0c83b2 Fixes time report with JRuby (#5404).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3708 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-30 12:18:11 +00:00
Jean-Philippe Lang
554c047d80 Fixes random test failure.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3707 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-30 11:27:08 +00:00
Jean-Philippe Lang
a4e411c643 Removes broken code in ProjectsController (#5412).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3706 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-30 11:14:57 +00:00
Jean-Philippe Lang
a00d1eabd7 Fixed: watchers selection lost when issue creation fails (#5406). #watched_by? was fixed in order to work with #watcher_user_ids= used in controllers on unsaved objects.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3705 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-30 11:02:27 +00:00
Jean-Philippe Lang
e5180884c1 Fixes selected menu tab when issue creation fails.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3704 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-30 10:48:19 +00:00
Jean-Philippe Lang
51c8f3143c Fixes URLs in atom feeds broken by r3681 (#5403).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3703 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-30 10:45:21 +00:00
Jean-Philippe Lang
0d938dff59 Fixed: 500 internal error when browsing any Redmine page in Epiphany (#5401).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3702 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-30 10:33:25 +00:00
Jean-Philippe Lang
3db77a86a9 Fixes some parameters in functional tests.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3701 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-30 10:06:51 +00:00
Jean-Philippe Lang
b6cd076441 Fixes an object instantiation in tests.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3700 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-30 09:57:58 +00:00
Eric Davis
7ccdaee110 Only copy visible issues.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3698 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-29 23:26:52 +00:00
Eric Davis
488879d9cf Refactor: pull #query_statement_invalid up to ApplicationController.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3696 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-29 15:19:19 +00:00
Eric Davis
e65c3cfc7d Refactor: Move gantts to a separate controller.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3695 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-28 15:54:46 +00:00
Jean-Philippe Lang
a925435b29 Add "Check/Unckeck all" buttons to rows and columns on workflow edit screen (#3201).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3694 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-27 17:54:27 +00:00
Jean-Philippe Lang
eabe8c51cd Adds an assertion on issues deletion when deleting a project (#5381).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3693 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-27 16:52:41 +00:00
Jean-Philippe Lang
c18cb9451d Fixed: private subprojects names may be revealed on issue summary report (#5360).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3692 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-27 16:43:52 +00:00
Eric Davis
df7edb843b Refactor: move method to helper.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3691 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-27 15:28:52 +00:00
Eric Davis
dfc448030d Refactor: extract error to new method with before_filter.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3690 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-26 15:08:06 +00:00
Eric Davis
23f097e344 Refactor: Extract duplicated code to a new method.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3689 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-23 15:05:13 +00:00
Eric Davis
2c898d8a81 Refactor: Split IssuesController#new to #new and #create to match REST pattern.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3688 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-22 15:43:57 +00:00
Eric Davis
9b595c689d Refactor: Move the rest of the routing tests to RoutingTest.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3687 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-21 16:02:55 +00:00
Eric Davis
0fc884cf42 Move more routing tests into the routing integration test.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3686 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-20 15:42:57 +00:00
Eric Davis
657aa624a4 Adding missing setter for Query#available_columns
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3685 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-20 15:42:52 +00:00
Eric Davis
bf33b57aa4 Refactor: Move method to Query model
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3684 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-19 15:08:28 +00:00
Jean-Philippe Lang
0004b52646 Fixes behaviour of move_issues permission for non member role (#5309).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3683 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-18 12:47:41 +00:00
Jean-Philippe Lang
de51e16d2b Removes hard-coded size on user search fields (#5319).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3682 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-18 10:17:27 +00:00
Jean-Philippe Lang
760c933bd7 Fixes acts_as_event with a String as url option (#5343).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3681 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-18 10:00:11 +00:00
Jean-Philippe Lang
3bf6790826 Add "Repository" menu item after repository creation (#5328).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3680 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-17 12:51:46 +00:00
Jean-Philippe Lang
aa4d1fe816 Fixed: API 401 response does not include WWW-Authenticate header (#5322).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3679 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-17 12:45:23 +00:00
Jean-Philippe Lang
2c0ce104e7 Fixed: Error on db:migrate with table prefix set (#5335).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3678 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-17 12:14:52 +00:00
Jean-Philippe Lang
e4e4b0f4b8 Fixes error on subtask XML format (#5336).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3677 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-17 11:49:56 +00:00
Azamat Hackimov
7e9d4811ec Translation updates
* eu (#5291)
* ru (#5296)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3676 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-17 10:37:23 +00:00
Eric Davis
538642c5c4 Let custom field formats control how they are edited.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3675 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-16 15:34:05 +00:00
Eric Davis
4cb943571a Change the case statement into a method call based on the name
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3674 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-16 15:34:00 +00:00
Eric Davis
d22723ed04 Refactor: Move method
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3673 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-16 15:33:55 +00:00
Eric Davis
88db9d0bdc Replace the hardcoded CustomField::FIELD_FORMATS with a class.
Custom Field Formats are now full objects and can be registered with
Redmine::CustomFieldFormat to add new formats.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3672 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-16 15:33:49 +00:00
Jean-Philippe Lang
0e1595ad56 Adds parent issue id in issue REST API (#5304).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3671 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-13 17:51:06 +00:00
Eric Davis
6a6f403978 Added missing Enumeration STI exemplars.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3670 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-13 05:57:27 +00:00
Jean-Philippe Lang
f23aceba86 Fixes a test failure with SQLite3 due to transaction fixtures (#5290).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3669 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-12 17:43:01 +00:00
Jean-Philippe Lang
9ccccb9984 Do not raise an error when destroying a Version with assigned issues.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3668 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 17:47:29 +00:00
Jean-Philippe Lang
c76b9edf6c Adds bottom margin to issue watchers avatars (#5264).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3667 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 17:14:18 +00:00
Jean-Philippe Lang
734f8324ea Fixed: empty ul tag for issue updates with notes only (#5281).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3666 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 17:10:26 +00:00
Jean-Philippe Lang
f77e5d093a Merge issue and time entry validation error messages.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3665 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 17:00:13 +00:00
Jean-Philippe Lang
f35921d308 Fixes Issue#save_issue_with_child_records so that time entry do not get saved if issue save fails.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3664 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 16:48:46 +00:00
Jean-Philippe Lang
43e5bb75d2 Fixed: issue optimistic locking broken by r3308 (#5280).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3663 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 16:27:37 +00:00
Jean-Philippe Lang
2674c6116c Linkify folder names on revision view (#5164).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3659 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 15:18:49 +00:00
Jean-Philippe Lang
5163904a3a Fixed: Update of Subversion changesets broken by r3466 under Solaris (#5255).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3635 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 13:55:30 +00:00
Jean-Philippe Lang
9306f3ea6c Check that admin LDAP user is untouched after authentication (#5263).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3634 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 13:54:42 +00:00
Jean-Philippe Lang
71a4158fd0 Fixes calculation of version estimated hours with subtasks (#5265).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3633 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 13:20:02 +00:00
Jean-Philippe Lang
5879273739 Makes the wiki sidebar editable (#5208).
The content of the wiki page named 'Sidebar' is rendered in the sidebar if it exists. Permission to edit protected pages is required to create this page.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3632 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-11 12:56:18 +00:00
Eric Davis
3979224693 Removed count from issues.xml. It causes a typecast error in ActiveResource. (#4745)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3631 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-10 07:30:06 +00:00
Eric Davis
f3e3752759 Added rake task to generate the yardoc (rake yard)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3630 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-09 23:42:41 +00:00
Azamat Hackimov
77795d41ba Translation updates:
* ko (#5245)
* fr (#5247)
* pt-BR (#5244)
* zh


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3629 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-06 16:57:51 +00:00
Azamat Hackimov
db453db497 Translation updates
* ja (#5240)
* zn-TW (#5241)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3628 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-03 18:02:51 +00:00
Azamat Hackimov
eb80b79c26 New strings to localization (#5225)
* error_can_not_delete_custom_field: Unable to delete custom field
* error_unable_to_connect: Unable to connect ({{value}})
* error_can_not_remove_role: This role is in use and can not be deleted.
* error_can_not_delete_tracker: This tracker contains issues and can't be deleted.


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3627 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-03 11:54:24 +00:00
Azamat Hackimov
f2993f6ed0 Translation updates and new Mongolian language (#5237)
* da (#5197)
* pt-BR (#5205 and #5210)
* zh (#5227)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3626 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-04-03 10:49:16 +00:00
Jean-Philippe Lang
8df189ff86 Adds a css class to issue id tds (#5204).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3625 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-29 19:50:00 +00:00
Jean-Philippe Lang
c88a467ddf Fixes an error when running tests coverage.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3624 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-28 15:18:09 +00:00
Jean-Philippe Lang
2bbc948e06 Preview description if it was edited while updating an issue (#741).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3623 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-28 15:17:46 +00:00
Jean-Philippe Lang
c499d2d150 Fixes broken test.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3622 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-28 14:52:33 +00:00
Jean-Philippe Lang
ce549933c8 Applies the same style to the admin project tree than issues.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3621 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-28 13:30:44 +00:00
Jean-Philippe Lang
e8729feba7 Slight optimization in issue tree rendering.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3620 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-28 12:57:39 +00:00
Jean-Philippe Lang
4a51f10074 Fixes diff highlighting (#5199).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3619 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-28 11:30:48 +00:00
Jean-Philippe Lang
4524bc04e9 Issue list improvements for subtasking (#5196):
* makes the parent task column available
* display the issue hierarchy when list is sorted by parent

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3618 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-27 16:55:20 +00:00
Jean-Philippe Lang
06d2c3fd4e Adds parent issue id to the issues CSV export.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3617 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-27 13:38:29 +00:00
Jean-Philippe Lang
b93cf03483 Fixes backslashes escaping when quoting issue description/note (#5129).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3616 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-27 13:33:19 +00:00
Jean-Philippe Lang
883e7b1b94 Width of pre blocks in descriptions changed to auto (#5160).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3615 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-27 13:10:22 +00:00
Jean-Philippe Lang
43a5febf61 Fixed: Links to missing wiki pages not red on project overview page (#5177).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3614 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-27 12:54:13 +00:00
Jean-Philippe Lang
89aa60cbbd Escape revision on repository view (#5153).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3613 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-27 12:46:45 +00:00
Jean-Philippe Lang
8cdcf308be Escape href attribute in auto links (#5179).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3612 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-24 20:26:22 +00:00
Jean-Philippe Lang
84dfff5957 Fixes permission check in QueriesController (#5181).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3611 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-24 20:25:09 +00:00
Azamat Hackimov
d29adc9bb7 Translation updates and fixes
* ja.yml (#5097)
* pt-BR.yml (#5120)
* sl.yml (#5063)
* sv.yml (#5144)
* zh-TW (#5075)



git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3610 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-24 16:55:01 +00:00
Azamat Hackimov
0de66f7f1c Translation ru, fix for #5157
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3609 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-24 02:48:09 +00:00
Jean-Philippe Lang
79b4f68176 Adds an option to enable/disable email notifications during a project copy (#4672).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3608 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-21 11:17:29 +00:00
Jean-Philippe Lang
5225fb70f5 Optimize retrieval of user's projects members.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3607 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-21 09:28:24 +00:00
Jean-Philippe Lang
e584ae220d Cleans up status assignment in IssuesController#new handled by Issue#safe_attributes= now.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3606 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-20 17:37:04 +00:00
Jean-Philippe Lang
533590c29c Fixed: Double-dash results in strikethrough text (#5122).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3605 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-20 12:54:23 +00:00
Eric Davis
6e6e260cea Refactor: Extract Query#sortable_columns from the controller.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3604 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-19 15:42:03 +00:00
Jean-Philippe Lang
5e4eef1a4e Fixed: code syntax highlighting not working in Document page (#3740).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3603 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-18 20:06:16 +00:00
Jean-Philippe Lang
4dd4300147 Adds text formatting to documents index (#202).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3602 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-18 20:02:17 +00:00
Eric Davis
b5d9a1dfbd Refactor: Extract method to the Member model
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3601 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-18 15:49:11 +00:00
Jean-Philippe Lang
f741ca7269 Adds an helper for displaying the 'checked' image.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3600 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-17 20:46:22 +00:00
Jean-Philippe Lang
388805ad58 Do not query the database for project level on projects list.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3599 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-17 20:06:52 +00:00
Jean-Philippe Lang
0e0b8e0799 Accept issue links inside brackets (#4418).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3598 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-17 19:57:32 +00:00
Eric Davis
194dab8e96 Refactor: Change the different find_object filters to share a common method.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3597 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-17 15:41:58 +00:00
Eric Davis
0f999ef0e0 Fixes undefined method 'notes' error from r3594
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3596 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-17 04:13:05 +00:00
Jean-Philippe Lang
2ada68ae62 Removes broken links in wiki syntax help page (#5081).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3595 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-16 21:48:21 +00:00
Jean-Philippe Lang
f4be4d101b Inlines some code to speed up large ticket history rendering.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3594 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-16 21:37:05 +00:00
Jean-Philippe Lang
2f0fbef858 Fixed: Wrong label in issue-journal for subtask-changes (#5090).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3593 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-16 20:37:29 +00:00
Jean-Philippe Lang
0097770626 Upgrade CodeRay to 0.9.2 (#3359).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3592 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-16 20:29:12 +00:00
Eric Davis
e6c8760ad7 Refactor: Split the find_object methods to prep for a larger refactoring.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3591 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-16 15:17:47 +00:00
Jean-Philippe Lang
6b88de1234 Close unclosed pre/code tags (#4265).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3590 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-15 19:57:35 +00:00
Jean-Philippe Lang
7203196212 Do not parse redmine links inside pre/code tags (#1288).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3589 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-15 19:54:50 +00:00
Jean-Philippe Lang
a179f261cd Extract parsing of inline attachments, wiki links and redmine links.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3588 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-15 19:37:01 +00:00
Jean-Philippe Lang
838f3195e7 Fixed closing tags in syntax highlighting tests.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3587 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-15 19:33:05 +00:00
Jean-Philippe Lang
6a1920915c Add background color to line numbers of highlighted code.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3586 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-14 14:53:25 +00:00
Jean-Philippe Lang
ad487bf7cc Replace the hardcoded "CodeRay" css class name for highlighted elements.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3585 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-14 13:22:50 +00:00
Jean-Philippe Lang
c03b4c2e1e Extract CodeRay calls to Redmine::SyntaxHighlighting (#2985).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3584 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-14 12:57:08 +00:00
Jean-Philippe Lang
51d790b2f3 Reverts r1476 that is no longer needed after r3582.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3583 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-14 09:07:21 +00:00
Jean-Philippe Lang
7621463acb Do not html escape code that is going to be highlighted (#2985, #3359).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3582 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-14 09:05:58 +00:00
Jean-Philippe Lang
2f5c17a0f6 Optimization: load attachments when needed.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3581 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-14 08:33:53 +00:00
Jean-Philippe Lang
c3e8d1d512 Enlarges the sidebar.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3580 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-13 17:50:10 +00:00
Jean-Philippe Lang
e605973ec4 Move issue watchers to the sidebar.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3579 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-13 17:45:41 +00:00
Jean-Philippe Lang
8cc519e763 Adds index on issues nested set columns.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3578 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-13 17:17:10 +00:00
Jean-Philippe Lang
508df4a33a Slight UI changes to the subtasks tree.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3577 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-13 15:47:06 +00:00
Jean-Philippe Lang
e016f3ef13 Add subtasking strings to locales.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3576 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-13 15:45:22 +00:00
Jean-Philippe Lang
54eea93def Translations updates.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3575 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-13 15:42:57 +00:00
Jean-Philippe Lang
d550c46160 Makes subtasks rescheduled when a 'precedes' relation is set on a parent task.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3574 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-13 15:29:34 +00:00
Jean-Philippe Lang
8e3d1b694a Adds subtasking (#443) including:
* priority, start/due dates, progress, estimate, spent time roll-up to parent issues
* descendant issues tree displayed on the issue view with context menu support
* issue tree display on the gantt chart
* issue tree copy on project copy
* unlimited nesting

Defining subtasks requires the new permission 'Manage subtasks'.
Subtasks can not belong to a different project than the parent task.

Implementation is based on scoped nested sets for fast reads and updates.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3573 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-13 14:56:49 +00:00
Jean-Philippe Lang
e109c9b6b6 Do not reset session when a non logged in user request the login form (#4958).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3572 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-12 19:22:11 +00:00
Jean-Philippe Lang
7e4aa9ca92 Fixed windows platform detection in reposman.rb (#5039).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3571 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-12 18:15:19 +00:00
Jean-Philippe Lang
c312b8b058 More detailed failures message.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3570 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-12 15:22:05 +00:00
Jean-Philippe Lang
4d19007fd1 Fixes a test failure.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3569 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-12 15:19:49 +00:00
Jean-Philippe Lang
7adf05810a Refactors textile formatting tests.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3568 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-12 15:17:53 +00:00
Jean-Philippe Lang
054ff0db8e Fixed: inline code with less-then/greater-than produces @lt; and @gt; (#1416).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3567 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-12 15:12:23 +00:00
Jean-Philippe Lang
3dc4dbe302 Fixed: error while moving an issue to a project with disabled tracker with SQLite3 (#5049).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3566 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-12 14:51:33 +00:00
Jean-Philippe Lang
63ed494f21 Adds missing flash messages on project settings (#5043).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3565 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-12 13:51:00 +00:00
Jean-Philippe Lang
b028a48c53 Cleanup and warning added in database.yml.database about the test database.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3564 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-12 13:48:14 +00:00
Jean-Philippe Lang
24b4c5f48d Fixed: text formatting breaks when using parenthesis inside bold tags (#1334).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3563 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-12 13:43:11 +00:00
Jean-Philippe Lang
6ea1ef77e5 Fixed: avatar display breaks user profile page layout (#5008).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3562 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-12 13:35:36 +00:00
Jean-Philippe Lang
4e5078ebb0 Fixed: some textile modifiers combinations don't work, eg. bold inside underline (#5045).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3561 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-11 19:55:31 +00:00
Eric Davis
c7c3c0cc7c Refactor: Extract method for setting the flash on bulk issue saves.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3560 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-11 16:34:08 +00:00
Jean-Philippe Lang
3e2e5a0a0c Removes broken javascript on wiki history.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3559 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-10 19:16:03 +00:00
Eric Davis
ddaa95523a Use assert_select to check the download link. (#4204)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3558 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-10 05:38:58 +00:00
Eric Davis
22c1e2b8cf Adds named scopes to replace custom finders.
* Adds watched_by class method in ActsAsWatchable
* Adds Issue#recently_updated, Issue#with_limit and Issue#on_active_project

  #2482

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3557 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-10 05:10:43 +00:00
Azamat Hackimov
cfa1f0c231 Translation updates
* ja (#4946)
* zh-TW (#4947)
* ru



git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3556 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-09 21:02:11 +00:00
Jean-Philippe Lang
b99d4189b7 Fixed: NoMethodError error on roadmap if no trackers are selected and a shared version is available (#5006).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3555 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-08 20:17:09 +00:00
Eric Davis
c07696b578 Refactor: Remove duplicated case statements.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3554 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-08 16:47:57 +00:00
Eric Davis
43e3c43cbd Refactor: Extract similar logic in IssuesHelper#show_detail to a new method.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3553 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-08 16:47:52 +00:00
Eric Davis
1a73f8fa0f Added unit tests for IssuesHelper#show_detail
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3552 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-08 16:47:47 +00:00
Jean-Philippe Lang
fe066e793d Moves scm adapters unit tests to a dedicated folder.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3551 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-06 20:35:38 +00:00
Jean-Philippe Lang
332d88cd67 Makes test pass with Bazaar 2.1.0 (#5002).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3550 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-06 20:14:09 +00:00
Jean-Philippe Lang
6511e94233 Moves ProjectsController#add_issue_category to IssueCategoriesController#new.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3549 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-06 18:43:00 +00:00
Jean-Philippe Lang
729bea1cf3 Moves ProjectsController#add_version to VersionsController#new.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3548 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-06 18:25:01 +00:00
Jean-Philippe Lang
2af97616f7 Adds context menu to the roadmap issue lists.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3547 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-06 18:03:25 +00:00
Eric Davis
d65922afde Remove double negative condition
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3546 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-05 17:25:51 +00:00
Eric Davis
3f3e30c2aa Refactor: Moved the contents of #issue_update into Issue.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3545 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-05 17:11:50 +00:00
Jean-Philippe Lang
69769e1dfd Unselect issues when clicking outside of the list.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3544 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-04 19:09:14 +00:00
Jean-Philippe Lang
e8bc0b2980 Do not disable text selection in the issue list.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3543 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-04 19:06:33 +00:00
Jean-Philippe Lang
bd5fe10c13 Adds an helper for creating the context menu.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3542 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-04 19:02:57 +00:00
Jean-Philippe Lang
12759fd416 Fixed: hard coded English string at the selection of issue watchers (#4982).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3541 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-04 18:49:03 +00:00
Eric Davis
c58dc83e74 Refactor: Replace @journal with @issue.current_journal
This removes an instance variable in #issue_update which will let it be moved
to the Issue model.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3540 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-04 16:18:51 +00:00
Eric Davis
7514e12d33 Hide the main menu div if there isn't any items for it. #3259
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3539 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-04 06:01:05 +00:00
Eric Davis
afdcd770dc Refactor: Extract method
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3538 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-04 05:33:54 +00:00
Eric Davis
bc79caaf69 Refactor: Extract method
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3537 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-04 05:33:49 +00:00
Eric Davis
be20d98040 Refactor: Extract methods to before_filters
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3536 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-04 05:33:45 +00:00
Eric Davis
3a99f18913 Refactor: Split method
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3535 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-04 05:33:40 +00:00
Eric Davis
ca6df3d78d Refactor: Extract method
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3534 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-04 05:33:35 +00:00
Eric Davis
976cba0c5d Refactor: use the existing Issue#new_statuses_allowed_to method.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3533 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-04 00:58:52 +00:00
Jean-Philippe Lang
cdb86d5ef7 Fixed: no email notification on new project/version file added (#4966).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3532 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-03 21:32:41 +00:00
Jean-Philippe Lang
3355ffe029 Fixes git annotate (#3832).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3531 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-03 21:15:46 +00:00
Jean-Philippe Lang
6817a45e7f Adds hooks on login view (#4978).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3530 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-03 20:21:05 +00:00
Jean-Philippe Lang
f2b227547e Filters collapsed by default for saved queries (#4623).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3529 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-03 20:09:39 +00:00
Eric Davis
fe1e3ccd18 Refactor: Decouple failed attachments and the flash messages
Attachment#attach_files will no longer need to return a flash message,
instead it will put unsaved attachments into object#unsaved_attachments
where the calling object can access them.

A utility method #render_attachment_warning_if_needed is included for setting
the standard flash warning.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3528 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-03 17:05:00 +00:00
Eric Davis
44955a519c Added test for when an attachment fails to save.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3527 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-03 17:04:55 +00:00
Eric Davis
f6d8752e44 Fixes destroying attachments if the update fails. (r2875 r3523)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3526 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-03 17:04:50 +00:00
Eric Davis
3c0c0a7677 Allow multiple selected projects in #project_tree_options_for_select
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3525 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-03 03:37:40 +00:00
Jean-Philippe Lang
b09a483aa9 Fixed: error while deleting an in-use enumeration (#4970).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3524 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-02 20:03:09 +00:00
Eric Davis
0fd7e2d696 Refactor: Moved ApplicationController#attach_files to the Attachment model
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3523 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-02 19:26:03 +00:00
Eric Davis
81d617cd5b Fixes failing tests from r3521
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3522 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-02 19:25:58 +00:00
Jean-Philippe Lang
b52e75aad9 Fixes some context menu links broken by r3478.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3521 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-01 20:54:55 +00:00
Eric Davis
f5f5a5f64f Verify issues are updated by HTTP PUT only. Regression from r3486.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3520 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-01 18:29:18 +00:00
Eric Davis
8699e5bbcd Refactor: Decouple building Issue and TimeEntry objects in #issue_update.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3519 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-03-01 17:40:54 +00:00
Jean-Philippe Lang
ae55978515 Adds a test for not sending email without recipient (#4920).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3518 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-28 17:18:21 +00:00
Jean-Philippe Lang
8e57b1f6cd Fixed: Trac importer creates duplicate wiki records (#4743).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3517 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-28 16:51:36 +00:00
Jean-Philippe Lang
c9197769fb Fixes bottom links placement in issue with associated changesets (#4883).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3516 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-28 16:42:31 +00:00
Jean-Philippe Lang
da84474391 Fixed: Plugin generators should display help if no parameter is given (#4609).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3514 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-28 12:15:47 +00:00
Jean-Philippe Lang
9a85d4d063 Fixed: Git blame/annotate fails on moved files (#3832).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3513 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-28 12:09:09 +00:00
Jean-Philippe Lang
d6c299f57d Adds 'Blocked by' (#1755) and 'Duplicated by' relation types to the dropdown menu for new relations.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3512 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-28 11:28:32 +00:00
Jean-Philippe Lang
241f79ac06 Fixed: attachments with the same name at the same time overwrite (#3691).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3511 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-28 11:12:40 +00:00
Jean-Philippe Lang
82310d3162 Allow project custom fields to be searchable (#4945).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3510 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-28 10:55:24 +00:00
Jean-Philippe Lang
1ab77ee015 Fixes a test failure due to a default custom field value.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3509 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-28 10:48:35 +00:00
Jean-Philippe Lang
551993d3c2 Adds missing fixtures.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3508 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-28 10:42:13 +00:00
Jean-Philippe Lang
049f47eaf0 Update for 0.9.3 release.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3506 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-28 10:20:40 +00:00
Jean-Philippe Lang
c174540a0e Adds attachments upload on wiki edit form (#1223).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3500 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-28 09:43:13 +00:00
Jean-Philippe Lang
02cc0efdd7 Fixed: journal details duplicated when an issue is saved twice (#3690).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3499 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-28 09:21:12 +00:00
Jean-Philippe Lang
26e9a0d919 Fixed: Wrong link when "http" not included in project "Homepage" link (#4944).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3498 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-28 09:10:33 +00:00
Eric Davis
ddec53b9a2 Refactor: Extracted saving logic out of #update and into a utility method
Now #issue_update can be refactored and push to the Model(s) while keeping
the public interface (#update) clean.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3497 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-26 16:16:18 +00:00
Jean-Philippe Lang
113049412b Link to the user from the wiki history view.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3496 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-26 16:03:05 +00:00
Jean-Philippe Lang
bda2aa474c Adds a link to the user profile from the administration user edit screen (#4480).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3495 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-26 16:01:04 +00:00
Jean-Philippe Lang
c7c43d38ce Removes a useless assignment in Trac importer (#4931).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3494 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-26 15:55:02 +00:00
Jean-Philippe Lang
bfed36ac84 Let administrators see locked user profiles.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3493 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-26 15:50:16 +00:00
Jean-Philippe Lang
d6f9e576e8 Makes AuthSource.authenticate return a hash instead of an array.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3492 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-26 09:13:12 +00:00
Jean-Philippe Lang
f1d16bc007 Test that AuthSourceLdap#authenticate returns valid User attributes only.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3491 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-26 08:50:37 +00:00
Jean-Philippe Lang
899f06612a Moves the LDAP test server to a fixture.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3490 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-26 08:42:40 +00:00
Jean-Philippe Lang
7ae53845ac Adds a sample test LDAP configuration file.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3489 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-26 08:31:36 +00:00
Jean-Philippe Lang
aa521c5a5a User model should not have to clean up LDAP attributes.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3488 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-26 08:29:20 +00:00
Eric Davis
3de1f2e157 Refactor: Extracted the duplication from the last commit into a new method
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3487 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-25 17:01:10 +00:00
Eric Davis
c68d853bf4 Refactor: Move the updating of an Issue to the #update method.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3486 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-25 17:01:05 +00:00
Eric Davis
19d4ddf2f2 Fix LDAP on the fly creation. The User object doesn't have a :dn attribute.
Fixes #4918 and adds a test for the behavior.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3485 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-25 16:19:55 +00:00
Eric Davis
39c97279ca Optimize: Only select the name when getting the module names.
This has speed up TimelogController#details by 100% with larger databases
(demo.redmine went from 4077ms down to 2085ms).

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3484 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-25 04:55:33 +00:00
Jean-Philippe Lang
f7bd0801f6 Fixed: changing user/roles of project member not possible without javascript (#4852)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3483 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-24 21:23:20 +00:00
Jean-Philippe Lang
46ecc488a9 Fixed: projects are referenced by id in search results.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3482 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-24 21:08:08 +00:00
Jean-Philippe Lang
b2dee55e72 Makes project identifiers searchable (#4897).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3481 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-24 21:05:14 +00:00
Eric Davis
d581510af6 Refactor: Start to extract IssuesController#edit into #update (REST).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3480 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-24 17:21:41 +00:00
Jean-Philippe Lang
6ed9734cb9 Reduces spacing on the bulk edit form.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3479 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-23 21:44:28 +00:00
Jean-Philippe Lang
e24d6cc223 Bulk edit refactoring.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3478 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-23 21:26:29 +00:00
Jean-Philippe Lang
01dbba72ab Move hardcoded calendar images to css classes.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3477 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-23 21:10:15 +00:00
Jean-Philippe Lang
a2537b3969 Fixed view_issues_move_bottom hook arguments (#4893).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3476 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-23 21:04:12 +00:00
Eric Davis
f838904a7e Refactor: Extract Issue#bulk_edit from the IssuesController
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3475 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-23 17:06:08 +00:00
Eric Davis
89cf2d256d Moved the IssuesController routing tests to an integration test.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3474 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-22 18:15:07 +00:00
Jean-Philippe Lang
0341ac80eb Avoid unnecessary SQL queries when loading changesets.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3473 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-21 14:43:45 +00:00
Jean-Philippe Lang
3d393a5711 Memorize commit authors to speed up changesets loading.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3472 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-21 14:42:45 +00:00
Jean-Philippe Lang
93bcc68017 Adds a missing index (speeds up changesets loading).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3471 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-21 14:40:00 +00:00
Azamat Hackimov
24ec3bb7a9 Translation updates
* sv (#4846)
* ru (#4861)
* de (#4870)



git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3470 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-21 14:38:38 +00:00
Jean-Philippe Lang
103698b371 Wraps changeset creation inside a single transation.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3469 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-21 14:38:34 +00:00
Jean-Philippe Lang
87bc092d7c Removes --find-copies-harder git option to retrieve commits which was way to slow (#4547).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3468 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-21 14:37:09 +00:00
Jean-Philippe Lang
4878d749f4 Do not query git for tags and branches multiple times per request.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3467 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-20 13:35:22 +00:00
Jean-Philippe Lang
46aa855572 Remove invalid utf8 sequences from commit comments and author name (#4773).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3466 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-20 11:24:41 +00:00
Jean-Philippe Lang
6e68921590 Cleanup.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3459 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-20 10:11:19 +00:00
Jean-Philippe Lang
dab0c07fba Fixed: Links in Forum mails should redirect to message, not topic (#4884).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3458 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-20 10:07:53 +00:00
Jean-Philippe Lang
08d7c5bfb4 Adds a controller hook before issue move (#4850).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3457 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-19 19:10:50 +00:00
Jean-Philippe Lang
77459f9ae4 Adds a hook on issue move form (#4850).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3456 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-19 19:10:21 +00:00
Jean-Philippe Lang
d46609f4bb Fixes INSTALL and UPGRADING steps order (#4848).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3455 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-19 18:52:34 +00:00
Eric Davis
c6b2f1d606 Refactor: Extract #get_user_dn from AuthSourceLdap.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3454 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-19 17:00:49 +00:00
Eric Davis
d828122009 Refactor: extract AuthSourceLdap#search_attributes
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3453 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-19 16:33:01 +00:00
Jean-Philippe Lang
026fbb99a6 Escaping in html email templates (#4874).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3452 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-18 19:13:38 +00:00
Jean-Philippe Lang
d18fba4ffe Fixed: Pound (#) followed by number with leading zero (0) removes leading zero when rendered in wiki (#4872).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3451 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-18 18:53:30 +00:00
Eric Davis
6f930e9be6 Refactor: Rewrite authenticate_dn to use an implicit return.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3450 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-18 16:55:10 +00:00
Eric Davis
82dd1b2bf2 Refactor: Moved the check for an empty DN to authenticate_dn
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3449 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-18 16:55:05 +00:00
Eric Davis
899fb1079f Added some common example email configs to email.yml.example (#3120)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3448 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-18 05:20:52 +00:00
Eric Davis
28e9bc5d82 Fix an IndexError if all the :last menu items are deleted from a menu. #4718
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3447 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-18 05:01:39 +00:00
Jean-Philippe Lang
0fcc436f22 Fixed: Deselecting textile text formatting causes interning empty string errors (#4867).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3446 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-17 20:47:50 +00:00
Jean-Philippe Lang
74e85953f0 Move SQL LIKE tokens to acts_as_searchable.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3445 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-17 20:20:51 +00:00
Jean-Philippe Lang
c11d30ebc9 Makes search providers extensible (#3936).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3444 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-17 20:05:51 +00:00
Jean-Philippe Lang
b733accfe3 Adds a test for emission address with phrase (#4855).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3443 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-17 19:08:04 +00:00
Jean-Philippe Lang
3dd9687d41 Fixed: unit tests broken by r3438 (#4860).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3442 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-17 18:08:15 +00:00
Eric Davis
4f268c5606 Refactor: extract an #authenticate_dn method in AuthSourceLdap
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3441 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-17 16:35:35 +00:00
Eric Davis
9e22faa640 Converted the REDMINE_SUPPORTED_SCM constant to a class
Now SCMs can be added or removed using a simple API, instead of being
hardcoded:

  Redmine::Scm::Base.add('ScmName')
  Redmine::Scm::Base.delete('ScmName')

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3440 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-16 22:41:59 +00:00
Eric Davis
b3330d3995 Refactor: Extract method from AuthSourceLdap#authenticate
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3439 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-16 17:03:54 +00:00
Eric Davis
7b6b147761 Added some tests for the LDAP authentication.
Includes an export of an LDAP database to use in testing.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3438 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-16 16:40:50 +00:00
Eric Davis
49bfee0535 Refactor: Merged TrackersController#list and #index
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3437 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-15 16:41:27 +00:00
Eric Davis
c5f30fde28 Refactor: Merged AuthSourcesController#list and #index
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3436 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-15 16:41:21 +00:00
Eric Davis
038a88e970 Refactor: Merged RolesController#list and #index
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3435 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-15 16:41:16 +00:00
Azamat Hackimov
cec2b20793 Translation updates
* ja (#4783)
* ru (also fixes #4771)
* sv (#4818)
* zh-TW (#4837)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3434 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-14 19:46:52 +00:00
Jean-Philippe Lang
0772391fe0 Changes 2 png images.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3430 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-14 13:13:16 +00:00
Jean-Philippe Lang
d16c2d4cd3 Adds a few divs to the base layout (#871).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3429 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-14 13:07:51 +00:00
Jean-Philippe Lang
2f8cf7f762 Removes duplicated LOC.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3428 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-14 12:45:48 +00:00
Jean-Philippe Lang
a811f67748 Fixed: SystemStackError (stack level too deep) on Issue#attributes= after model reload (#4838).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3427 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-14 12:43:48 +00:00
Jean-Philippe Lang
0ee17b132c Slight forum styles changes.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3426 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-14 11:52:12 +00:00
Jean-Philippe Lang
00cec500c6 Do not include news author in emphasis tag.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3425 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-14 11:49:29 +00:00
Jean-Philippe Lang
ea3e2b1121 Changes SubversionAdapter to use ActiveSupport::XmlMini API for XML parsing.
This allows easy switching to one of the faster XML parsers supported by XmlMini (eg. libxml-ruby).

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3424 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-13 13:58:05 +00:00
Jean-Philippe Lang
7059d0b500 Adds requirement for ruby version and tells that Rails is included in downloadable releases (#4836).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3423 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-13 13:35:39 +00:00
Jean-Philippe Lang
3168ee3d47 Adds projects links (#4812).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3422 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-13 10:32:06 +00:00
Jean-Philippe Lang
89b9700074 Removes a GIF image.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3420 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-13 09:09:57 +00:00
Jean-Philippe Lang
4fbffd7716 Minifies PNG images (#4819).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3419 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-13 09:08:12 +00:00
Eric Davis
997e8bb0dd Fixing locales, rake locales:update added extra whitespace to the line.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3418 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-12 22:08:08 +00:00
Eric Davis
4a67c211ca Fixed a nil method error in Setting#value=
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3417 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-12 22:08:02 +00:00
Eric Davis
8d086cb7d4 Removed hard coded English string.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3416 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-12 19:15:39 +00:00
Eric Davis
c18f8d34fb Refactor: Merged IssueStatusesController#list and #index.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3415 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-12 19:15:33 +00:00
Jean-Philippe Lang
6ed690eacc Fixed: div.task incorrectly wrapping on Gantt Chart (#4813).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3414 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-12 18:43:39 +00:00
Jean-Philippe Lang
55a3ac764f Issue relation: fixes error with postgres when entering a non-numeric id (#4820) + accept hash (#) before id.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3413 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-12 18:35:31 +00:00
Jean-Philippe Lang
541d830d2a Fixed: Project copy loses wiki pages hierarchy (#4797).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3412 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-11 19:30:53 +00:00
Eric Davis
d2baf5f2a7 Log failed user logins to the Rails logger
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3411 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-11 18:25:38 +00:00
Eric Davis
937d0c70f7 Refactored IssueStatus finder to a before_filter
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3410 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-11 16:42:52 +00:00
Jean-Philippe Lang
2c8a24092b Adds filter for system shared versions on the cross project issue list (#4792).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3409 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-10 21:42:32 +00:00
Jean-Philippe Lang
1fec53cc25 Fixed: roadmap show subprojects issues even if subprojects is unchecked (#4761).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3408 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-10 21:29:31 +00:00
Jean-Philippe Lang
00d7bc3766 Makes use of format_version_name.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3407 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-10 21:21:53 +00:00
Jean-Philippe Lang
0b17e735ea Fixed: Duplicated project name for subproject version on gantt chart (#4775).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3406 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-10 21:13:34 +00:00
Jean-Philippe Lang
d02ddefff4 Fixed: parent project field doesn't include blank value when a member with 'add subproject' permission edits a child project (#4790).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3405 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-10 20:38:23 +00:00
Eric Davis
a8a49a26a1 Refactor: inline the utility methods in ReportsController.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3404 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-10 16:59:58 +00:00
Eric Davis
ed9eb2d684 Switch to using the shoulda gem from gemcutter. #4573
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3403 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-10 00:56:14 +00:00
Jean-Philippe Lang
d04d3f181a Fixed: Repository.fetch_changesets tries to fetch changesets for archived projects (#4782).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3402 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-09 18:42:42 +00:00
Eric Davis
f50feca730 Extracted the rendering from each case statement in issue_reports_details
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3401 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-09 16:47:27 +00:00
Eric Davis
57a4cefd97 Fixed the link to the Issue Details report, broken in r3396
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3400 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-09 16:47:22 +00:00
Azamat Hackimov
349a5d3b55 Translation updates
* de (#4760)
* pt-BR (#4762)
* ru


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3399 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-08 20:59:50 +00:00
Eric Davis
81ee2ff884 Updated object_daddy to a newer version (bugfixes)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3398 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-08 18:53:12 +00:00
Eric Davis
9482831313 Removed the duplicated configuration in the different test environments.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3397 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-08 18:53:07 +00:00
Eric Davis
597725d77c Separated ReportsController#issue_report into two separate actions.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3396 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-08 17:53:58 +00:00
Eric Davis
23c46c68ab Moved a routing test from a functional to an integration test.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3395 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-08 17:53:52 +00:00
Jean-Philippe Lang
3c20a9b0ac Do not parse the entire git log to fetch new commits (takes several minutes for a few thousands commits), but only 1 week before the last known commit (#4547, #4716).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3394 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-07 15:17:21 +00:00
Jean-Philippe Lang
be2004e398 Update for 0.9.2 release.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3392 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-07 12:47:53 +00:00
Jean-Philippe Lang
446ef61680 Korean support for PDF export (#4639).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3389 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-07 12:30:44 +00:00
Jean-Philippe Lang
f5dfe8b2f5 Translation updates.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3388 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-07 12:23:37 +00:00
Jean-Philippe Lang
eac7fcff6e Fixed: error raised when trying to view the gantt or calendar with a grouped query (#4751).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3379 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-06 18:07:25 +00:00
Jean-Philippe Lang
fece6aa4d0 Fixed: deprecation warning in reposman.rb (#4736).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3378 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-06 14:20:39 +00:00
Jean-Philippe Lang
88339fd98b Do not show 'Quote' links on locked topics (#4749).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3377 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-06 14:15:52 +00:00
Jean-Philippe Lang
5a5d02dfb5 Removes overflow:auto on #content which broke the fix in r2118 (#4724).
Autoscroll divs are added around large tables.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3376 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-06 14:05:13 +00:00
Jean-Philippe Lang
695bffe684 Fixed: error messages displayed twice when creating a group (#4715).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3375 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-06 13:26:29 +00:00
Jean-Philippe Lang
34ee5eccda Renames WikiFormatting.cache to .cache_store
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3374 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-06 13:13:40 +00:00
Jean-Philippe Lang
8fb29d4d21 Adds pagination to forum messages (#4664).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3373 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-06 12:54:13 +00:00
Jean-Philippe Lang
2ad8242ae7 Adds a setting to cache textile rendering (off by default).
* it uses ActionController cache store which is MemoryStore by default and can be configured with config.action_controller.cache_store
* macro processing was moved out of textile rendering so that it doesn't get cached
* no noticeable improvement is expected for small portions of text, so only texts larger than 2KB are cached

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3372 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-06 10:40:21 +00:00
Jean-Philippe Lang
6c8b87fbc8 Adds a permission for exporting wiki pages.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3371 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-06 09:30:53 +00:00
Eric Davis
e5d300af0a Refactor: Pull up several #find_project methods to ApplicationController
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3370 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-05 16:57:02 +00:00
Azamat Hackimov
d7725ecc06 Translations updates
* ja (#4738)
* ru (#4739)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3369 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-04 21:55:15 +00:00
Jean-Philippe Lang
626b71622d Fixed: invalid format parameter returns a DoubleRenderError on issues index (#4737).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3368 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-04 19:58:42 +00:00
Jean-Philippe Lang
ea51dcf911 Reverts r3366.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3367 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-04 19:57:45 +00:00
Jean-Philippe Lang
cfe4d0e7db Fixed: invalid format parameter returns a DoubleRenderError on issues index (#4737).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3366 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-04 19:52:51 +00:00
Eric Davis
5bd912e9a2 Refactor: Extracted the select_all calls to a new private method.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3365 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-04 17:24:33 +00:00
Eric Davis
112fc99311 Added tests for Issue#by_X finders
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3364 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-04 17:24:28 +00:00
Eric Davis
155083ec97 Change Role#anonymous and #non_member so they generate the record as needed.
While creating tests, it was a common occurrence to lost the builtin roles
because they are only created in the migrations.  This makes them behave like
User#anonymous.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3363 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-03 17:47:47 +00:00
Eric Davis
b86b9b898e Refactor: Moved the raw SQL finders from ReportsController to Issue.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3362 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-03 16:49:21 +00:00
Eric Davis
778117fead Converted a test to shoulda and added more checks for it's assignments.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3361 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-03 16:49:16 +00:00
Eric Davis
39c585740d Refactor: Extract method to create a Change from a Changeset.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3360 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-02 17:02:32 +00:00
Eric Davis
358e3194d7 Refactor: Move recipients method into acts_as_event
acts_as_event should be the standard interface to Redmine events, like mail
notifications, so having a standard recipients implementation there makes sense.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3358 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-02-01 18:57:12 +00:00
Jean-Philippe Lang
d43c860448 Allow commits to reference issues of parent projects and subprojects (#4674).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3357 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-31 16:25:06 +00:00
Jean-Philippe Lang
df46d704e8 Log email delivery errors.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3356 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-31 11:41:58 +00:00
Jean-Philippe Lang
a0364deb6a Log info when sending an email notification.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3355 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-31 11:00:40 +00:00
Jean-Philippe Lang
a1a24483b5 Fixed: deleting a project with subprojects breaks the project tree (#4701).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3354 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-31 10:39:42 +00:00
Azamat Hackimov
a5698b3745 Translation updates
* pt-BR (#4692)
* sv (#4666)
* zh-TW (#4654)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3353 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-31 00:54:27 +00:00
Jean-Philippe Lang
7ef20cc169 Fixed: potential security leak on my page calendar (#4691).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3351 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-30 11:23:17 +00:00
Jean-Philippe Lang
2261ec7b95 Updates for 0.9.1 release.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3348 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-30 10:53:35 +00:00
Jean-Philippe Lang
080ad6a16c Fixed: tests with ruby1.9 broken by r3322 (#4607).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3346 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-30 10:36:20 +00:00
Jean-Philippe Lang
12ea682b66 Fixed: NOT NULL constraint error when adding a group (#4632).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3343 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-30 10:24:23 +00:00
Eric Davis
8420f25109 Added and updated some more object daddy exemplars.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3342 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-28 19:05:21 +00:00
Eric Davis
675f28f895 Use the minimum password length setting when reseting a password. (#4683)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3341 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-28 18:54:51 +00:00
Eric Davis
9044305b93 Added some exemplars for object daddy to generate test data.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3340 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-27 18:29:03 +00:00
Azamat Hackimov
d1c90d9abf New strings to translate (#4647):
* label_board_sticky: Sticky
* label_board_locked: Locked


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3339 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-25 17:26:02 +00:00
Azamat Hackimov
56268d146d New language - Basque/ Euskara (#4650).
Thank Ales Zabala Alava for translation.


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3338 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-25 15:25:46 +00:00
Eric Davis
a8f56aad2c Added User.spawn_with_protected to generate an unsaved User record.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3337 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-23 16:50:41 +00:00
Eric Davis
d4525828b9 Fixed some labels to be more accessible.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3336 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-21 18:21:56 +00:00
Jean-Philippe Lang
1bc00ac022 Accept filters from API calls without set_filter parameter.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3335 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-18 19:53:06 +00:00
Jean-Philippe Lang
320c191f04 Fixed: PDF export of a issue list grouped by a custom field raises an error (#4600).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3333 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-18 18:00:27 +00:00
Jean-Philippe Lang
0ef9bc039d Adds a log message when an API call raises an InvalidAuthenticityToken error.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3332 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-17 20:23:06 +00:00
Jean-Philippe Lang
002f440bcd Move ids in XML views.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3331 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-17 19:45:18 +00:00
Jean-Philippe Lang
3eb815fddd Adds a rake task to receive emails from a POP3 server (#2420).
See:

  rake -D redmine:email:receive_pop3

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3330 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-17 13:53:13 +00:00
Jean-Philippe Lang
b4cf8ea525 Adds a few STDOUT.flush to migration scripts (#3675).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3328 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-17 12:00:45 +00:00
Jean-Philippe Lang
d55e1ec5b0 Adds unit test for #3645.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3327 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-17 11:48:46 +00:00
Jean-Philippe Lang
ed2c98fcae Fixed: Tab's 'border-bottom' not absent when selected (#4495).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3325 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-17 11:15:58 +00:00
Jean-Philippe Lang
f8b52b13a0 Fixed: Issue Summary tables that list by user are not sorted (#4552).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3323 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-17 11:07:53 +00:00
Jean-Philippe Lang
bddf3b5c2c Adds a test with Japanese keywords in a ISO-2002-JP encoded email (#4576).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3322 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-17 11:00:54 +00:00
Jean-Philippe Lang
9c7438aac6 Set native eol svn property on new lang files (#4526).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3320 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-17 10:33:30 +00:00
Eric Davis
1827d609a1 Cleaned up the IssueController redirects to use the back_url like the other actions.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3315 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-14 23:24:55 +00:00
Jean-Philippe Lang
dfe447f841 Fixes project editing route broken by r3313.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3314 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-14 22:19:53 +00:00
Jean-Philippe Lang
68a4cd38f5 XML REST API for Projects (#296).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3313 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-14 20:00:17 +00:00
Azamat Hackimov
64f4b50139 New Croatian language in Redmine! Thanks to Igor P. for translation (#4526)
Also, updates for:
* es.yml (#4578)
* zh.yml (#4545)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3312 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-14 16:10:56 +00:00
Jean-Philippe Lang
da55be4e9a Fixed: error when exporting an issue with target version to PDF (#4556).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3311 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-13 20:17:56 +00:00
Jean-Philippe Lang
3873388f9b XML REST API for issues that provides CRUD operations for Issues (#1214).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3310 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-13 19:29:19 +00:00
Eric Davis
667a7256a7 Escape the parent id parameter.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3309 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-13 17:27:37 +00:00
Jean-Philippe Lang
0a05cc2a37 Set a white list of issue attributes that can be mass-assigned from controllers.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3308 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-12 20:17:20 +00:00
Jean-Philippe Lang
ff77fb6aa9 Fixed: email notifications may affect language of notices on the UI (#4086).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3307 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-10 14:54:02 +00:00
Jean-Philippe Lang
fe7d65922b Fixed: can not search for 2 letters word (#4381).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3306 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-10 14:15:12 +00:00
Jean-Philippe Lang
d7c9886b8c Fixed: attachments get saved on issue update even if validation fails (#4401).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3305 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-10 14:05:42 +00:00
Jean-Philippe Lang
ee64310df4 CHANGELOG updated.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3302 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-10 10:20:46 +00:00
Jean-Philippe Lang
7b99adb3d6 CHANGELOG updated.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3301 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-10 10:19:41 +00:00
Jean-Philippe Lang
1b65a44cfc Fixes Redmine.pm error "closing dbh with active statement handles at /usr/lib/perl5/Apache/Redmine.pm" (#4205).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3300 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-10 10:17:27 +00:00
Jean-Philippe Lang
23508f4f98 Copyright updated (#4542).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3299 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-09 15:01:39 +00:00
Jean-Philippe Lang
a5ceb2f244 Set alignment for inline images in formatted text.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3298 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-09 14:57:33 +00:00
Jean-Philippe Lang
90c0e99d2a CHANGELOG update.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3295 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-09 11:49:45 +00:00
Jean-Philippe Lang
486f705494 Updated doc.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3293 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-09 11:46:53 +00:00
Jean-Philippe Lang
602aa1d7ae Translation updates.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3291 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-09 10:36:32 +00:00
Jean-Philippe Lang
f6ac12ad9d Fixed: undefined method `stringify_keys!' error in Issue#attributes_with_tracker_first= with ruby1.9 (#4540).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3289 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-09 10:27:05 +00:00
Jean-Philippe Lang
75ac722ebc Translation update.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3288 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-09 10:06:18 +00:00
Jean-Philippe Lang
1e30e67043 Adds new Rails strings.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3285 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-07 21:47:51 +00:00
Jean-Philippe Lang
99956ec248 Avatars added in news (#3941) and forums (#4468) + cleanup.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3284 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-07 21:28:45 +00:00
Jean-Philippe Lang
518779d96d Fixed: issue summary counts should link to the issue list without subprojects (#4525).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3283 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-07 21:12:16 +00:00
Jean-Philippe Lang
eecc6864a9 Fixed: 'Delete' link on LDAP list has no effect (#4530).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3282 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-07 20:56:41 +00:00
Jean-Philippe Lang
eb3b7d055a Fixed: error when downloading a file with no matching mime type (#3782).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3281 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-05 18:16:03 +00:00
Jean-Philippe Lang
f05b778065 Bulk edit view cleanup.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3279 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-03 11:37:04 +00:00
Jean-Philippe Lang
cab99aa5ad Allow bulk edit custom fields of any type (#461).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3278 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-03 11:18:09 +00:00
Jean-Philippe Lang
e9810b5de6 Fixed: bulk edit doesn't include global custom fields (#4505).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3277 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-03 10:50:40 +00:00
Jean-Philippe Lang
4ac99328ff Translation update.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3275 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-03 10:28:22 +00:00
Jean-Philippe Lang
c71cb84a91 Translation update.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3274 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-03 10:26:39 +00:00
Azamat Hackimov
f69a4107f8 Fixed untranslated string (:label_close_versions => Close completed versions)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3273 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-01 16:49:43 +00:00
Azamat Hackimov
357a4eb7b9 de.yml update (#4426)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3272 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-01 16:42:29 +00:00
Azamat Hackimov
88587b5916 Translation updates
* ru
* zh (#4481)
* zh-TW (#4484)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3271 e93f8b46-1217-0410-a6f0-8f06a7374b81
2010-01-01 16:38:58 +00:00
Azamat Hackimov
4702a05ebb Japanese translation update (Patch #4508)
(HNY! :))


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3270 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-31 13:19:13 +00:00
Eric Davis
9ffee0a5a4 Added some shoulda macros for testing.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3269 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-30 19:42:19 +00:00
Eric Davis
4cf2e7c216 Added a second rake task to generate the session store file.
`rake generate_session_store`

A lot of people think `rake config/initializers/session_store.rb` needs to
have an existing session_store.rb file in order to generate it.  This task
will make it easier to explain and document.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3267 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-30 00:46:48 +00:00
Eric Davis
4b3d4553e4 Create and assign the api token so the current instance can access it. (#4497)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3265 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-30 00:25:53 +00:00
Eric Davis
c67cc7c285 Added :controller_issues_new_before_save hook. (#4465)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3263 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-29 23:31:24 +00:00
Eric Davis
857c7d16ff Fixed the caption on the Files module. (#4406)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3261 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-29 17:56:59 +00:00
Jean-Philippe Lang
ac5cfe7a62 Set status of existing versions to 'open' (#4504).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3259 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-29 14:53:29 +00:00
Jean-Philippe Lang
ff7eb7b23a Auto-detect attachment content type when blank (#3782).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3258 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-29 13:28:30 +00:00
Eric Davis
b7b4e27833 Added :view_settings_general_form plugin hook
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3256 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-29 00:43:06 +00:00
Jean-Philippe Lang
44a079fcd7 Enlarge wiki content for MySQL databases (#1071).
Limit changed from 64KB to 16MB.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3254 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-27 11:57:13 +00:00
Jean-Philippe Lang
b718d5dec2 Moves attachments parsing after textile parsing so that:
* attachments parsing does not rely on textile syntax
* textile output can be cached (#4482)

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3253 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-27 10:52:02 +00:00
Jean-Philippe Lang
a359ffb397 Fixed: Calendar appears on wrong place in IE8 (#3818).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3252 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-26 17:17:16 +00:00
Jean-Philippe Lang
b1a92b9b2e Fixed: Subversion password visible in development logs (#4448).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3251 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-26 16:20:22 +00:00
Jean-Philippe Lang
04455783a7 Fixed: project copy doesn't copy group memberships (#3975).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3250 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-26 16:14:55 +00:00
Jean-Philippe Lang
c36c924714 Ask for confirmation when a non-admin users tries to remove himself from a project (#4402).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3249 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-26 15:46:12 +00:00
Jean-Philippe Lang
a4c64ff84b Fixed: subject of incoming emails gets mangled (#3717).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3247 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-26 12:15:12 +00:00
Jean-Philippe Lang
de2bef606d Fixes Redmine.pm for SQLite (#4205).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3246 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-26 12:02:24 +00:00
Jean-Philippe Lang
1052658df2 Merged 0.8.x changelog.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3243 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-26 10:21:05 +00:00
Jean-Philippe Lang
9c1efcfa48 Do not display the copy form when project copy is created.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3242 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-26 10:18:28 +00:00
Jean-Philippe Lang
45f3199aa9 View cleanup.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3241 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-25 17:39:06 +00:00
Jean-Philippe Lang
8db9ecef08 Removes column opt in enumerations table.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3240 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-25 17:13:58 +00:00
Eric Davis
9fb40b1a2f Project#activities should check all overridden activities, not just active ones.
Fixes #4084

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3239 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-24 18:25:49 +00:00
Jean-Philippe Lang
62c83bdd2e Adds a 'Add subprojects' permission.
* 'Add project' permission will let user create a root project
* 'Add subprojects' permission will let project members create subprojects

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3238 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-24 16:18:15 +00:00
Jean-Philippe Lang
24fde6f109 Hide "Groups" tab on user form if no group exist.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3237 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-24 16:14:15 +00:00
Jean-Philippe Lang
6ea202f808 Translation updates.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3236 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-24 13:58:15 +00:00
Jean-Philippe Lang
2a19efaf05 Rails 2.3.5 deprecation.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3235 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-23 20:55:42 +00:00
Jean-Philippe Lang
962827c793 Upgrade to Rails 2.3.5
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3234 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-23 20:54:32 +00:00
Jean-Philippe Lang
e4d06246cd Set version to 0.9.0.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3233 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-23 20:47:10 +00:00
Jean-Philippe Lang
d63784569f Force TimeEntry#hours default to nil (#3075, #4449).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3232 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-23 20:05:46 +00:00
Jean-Philippe Lang
5e1dc78d75 Fixed: wiki pages in search results are referenced by project number, not by project identifier (#4456).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3231 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-23 20:01:28 +00:00
Jean-Philippe Lang
32bb0226e7 Remove invalid escaping in version field (#4460).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3230 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-23 19:58:41 +00:00
Jean-Philippe Lang
0704ac9444 Fixes delimiters regexp.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3229 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-23 19:52:48 +00:00
Jean-Philippe Lang
569d13b7f5 Translation updates.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3228 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-23 19:35:24 +00:00
Jean-Philippe Lang
c4b01e5c13 Adds Indonesian translation by Raden Prabowo (#4399).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3227 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-23 18:56:03 +00:00
Jean-Philippe Lang
a54fa93b2e Adds a setting to remove incoming emails body after a delimiter (#4409).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3226 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-23 18:35:19 +00:00
Jean-Philippe Lang
e26eeef837 Display API key in the sidebar, just below the API key heading.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3225 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-23 18:13:24 +00:00
Jean-Philippe Lang
d404d2f586 Do not display API key if API is disabled.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3224 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-23 18:08:39 +00:00
Jean-Philippe Lang
682829a904 Fills translations.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3223 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-23 18:03:40 +00:00
Jean-Philippe Lang
ff36245f3e Move API setting to Authentication tab and add translations strings.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3222 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-23 17:56:39 +00:00
Jean-Philippe Lang
edab0f0cbb Do not mass create API keys for existing users.
They will be created on the fly if needed, just like for new users.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3221 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-23 17:49:32 +00:00
Eric Davis
bfcd5039f2 Added an Admin setting to enable/disable the REST web service. (#3920)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3220 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-23 06:27:44 +00:00
Eric Davis
e07e9d8bfe Added support for HTTP Basic access to the API. (#3920)
A user can authenticate using either their:

* username/password
* api-key/random

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3219 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-23 06:27:38 +00:00
Eric Davis
baa1ad4256 Allow authenticating with an API token via XML or JSON. (#3920)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3218 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-23 06:27:33 +00:00
Eric Davis
aa9951b38b Added an API token for each User to use when making API requests. (#3920)
The API key will be displayed on My Account page with a link to reset or
generate a new one.  All existing users will have a token generated by the
migration.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3217 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-23 06:27:28 +00:00
Eric Davis
9f59cd64ab Added the revision title to any revision links.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3216 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-22 23:23:54 +00:00
Jean-Philippe Lang
ffe8222257 Redmine.pm: deny access if user doesn't have browse_repository permission (#4338).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3215 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-22 18:08:19 +00:00
Jean-Philippe Lang
18c7c0d3ee Fixes a test failure.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3214 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-21 21:19:01 +00:00
Jean-Philippe Lang
fce25d4488 Fixes test failure.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3213 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-21 21:03:29 +00:00
Jean-Philippe Lang
3b7e7be72a Fixes odd test failures.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3212 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-21 20:02:51 +00:00
Eric Davis
87e83c7285 Fixed the view_hook_helper test, it was reading all of the log files into
memory and would throw a NoMemoryError (2GB+ used).

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3211 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-21 02:24:56 +00:00
Eric Davis
e1013c44a3 Make sure the RSS token is getting destroyed and created.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3210 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-21 02:24:49 +00:00
Eric Davis
c478fa7f90 Extract method
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3209 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-21 02:24:44 +00:00
Eric Davis
0844a22b02 Refactor: Use the existing method for failing onthefly creations.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3208 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-20 20:13:50 +00:00
Eric Davis
6be0e335fb Added an optimization note for later.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3207 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-20 19:13:27 +00:00
Eric Davis
1ebb78e412 Added some database indexes to commonly queried fields.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3206 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-20 19:13:22 +00:00
Eric Davis
7955e1eb9f Change the cursor for context menus. (#2924)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3205 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-20 18:05:53 +00:00
Jean-Philippe Lang
c5976333c2 Adds a 'Create and continue' button on new user form.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3204 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-20 10:51:33 +00:00
Jean-Philippe Lang
1099d704b5 Removes unused css classes (closes #4452).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3203 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-20 09:47:16 +00:00
Jean-Philippe Lang
e92802508e Change MailHandler 403 error message.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3202 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-20 09:45:04 +00:00
Jean-Philippe Lang
cf9bb2699f Adds on optional API key to repositories management controller and reposman.rb.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3201 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-20 09:44:28 +00:00
Jean-Philippe Lang
4398386c48 Admin info cleanup.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3200 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-19 20:33:24 +00:00
Jean-Philippe Lang
503d613403 Changes errors style.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3199 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-19 20:17:40 +00:00
Jean-Philippe Lang
6ccbcfb589 Adds helpers for setting field tags.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3198 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-19 20:07:09 +00:00
Jean-Philippe Lang
b5b6a5e971 Speeds up very slow tests.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3197 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-19 20:06:32 +00:00
Jean-Philippe Lang
3285230708 Translation update (#4352).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3196 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-19 14:17:20 +00:00
Jean-Philippe Lang
06ca18b042 Adds a 'no_permission_check' option to the MailHandler.
Used with the 'project' option, it allows anyone to submit emails to a private inbox project (#4407).

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3195 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-19 14:08:48 +00:00
Jean-Philippe Lang
9d120c872c Fixes block reordering on my page (#2971).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3194 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-19 13:32:21 +00:00
Jean-Philippe Lang
008ad85d10 Fixes an error with postgres.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3193 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-19 12:40:43 +00:00
Jean-Philippe Lang
03b57415d6 Avoid a ruby warning.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3192 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-19 12:16:45 +00:00
Jean-Philippe Lang
77aeca5d55 Fixes 'follows' relation validation.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3191 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-18 20:59:30 +00:00
Jean-Philippe Lang
beb20e7c6e Adds 'follows' relation (#1432).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3190 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-18 20:35:16 +00:00
Jean-Philippe Lang
111950108a Issue sidebar cleanup.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3189 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-18 20:15:49 +00:00
Jean-Philippe Lang
6bf0723d06 By default, only show statuses that are used by the tracker on the workflow edit view.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3188 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-18 15:41:32 +00:00
Jean-Philippe Lang
6a369f28dd Display shared versions on the issue summary view (#4425).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3187 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-18 14:59:19 +00:00
Jean-Philippe Lang
1ba5779f94 Fixed: rubytree gem breaks db:migrate:plugins (#4394).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3186 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-18 14:41:37 +00:00
Jean-Philippe Lang
488c192286 Removes "xxx and return" calls (#4446).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3185 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-18 14:22:18 +00:00
Jean-Philippe Lang
0e4525d76c Fixes test broken by r3176 (#4439).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3184 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-18 14:15:26 +00:00
Jean-Philippe Lang
8e3def7129 Icons updates and cleaning.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3183 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-18 14:10:26 +00:00
Jean-Philippe Lang
6b94614c36 Added missing translation for permission_view_issues (#4415).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3182 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-17 20:18:43 +00:00
Jean-Philippe Lang
a011e9a9bf Group icon changed on project members list.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3181 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-17 19:58:31 +00:00
Jean-Philippe Lang
46d27f16d5 IE8 fix.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3180 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-17 19:00:31 +00:00
Jean-Philippe Lang
91a493e2c7 Removes large icons.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3179 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-17 18:52:28 +00:00
Jean-Philippe Lang
b8cd280bec Do not hide scroll buttons if some tabs are still hidden.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3178 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-17 18:23:00 +00:00
Jean-Philippe Lang
7eb9cca660 Adds auto overflow to content div.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3177 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-17 18:21:50 +00:00
Jean-Philippe Lang
dfabadf4f7 Adds an admin layout that displays the admin menu in the sidebar.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3176 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-17 18:21:02 +00:00
Eric Davis
39b44b1cb9 Adds a Plugin API to allow one plugin to depend on another.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3175 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-16 02:07:46 +00:00
Jean-Philippe Lang
1c11d3403e Adds buttons to scroll the tabs when they overflow.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3174 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-14 20:13:29 +00:00
Azamat Hackimov
09e47a3b63 One missing string (#4380)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3173 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-14 17:44:18 +00:00
Azamat Hackimov
7e0ed924da Translation updates
* lt (#4384)
* pt-BR (#4380)
* ru
* zh-TW (#4352)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3172 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-14 17:38:05 +00:00
Jean-Philippe Lang
0b34755eb0 Moved charset meta tag before title (#4320).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3171 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-13 14:55:17 +00:00
Jean-Philippe Lang
9a452a5c35 Make sure user can not watch what he is not allowed to view.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3170 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-13 14:48:28 +00:00
Jean-Philippe Lang
bb477a3a0f Make sure users don't get notified for thing they can not view (#3589).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3169 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-13 14:26:54 +00:00
Jean-Philippe Lang
6610bb6b6c Moves watchers filtering logic to ActsAsWatchable.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3168 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-13 13:06:57 +00:00
Jean-Philippe Lang
f33231181f Makes user unwatch what he can no longer view after its permissions have changed (#3589).
A rake task (redmine:watchers:prune) is also added to prune existing watchers.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3167 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-13 12:39:22 +00:00
Eric Davis
c31a671973 Added a setting to configure the day that week start on (Monday or Sunday). (#4363)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3166 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-13 04:06:55 +00:00
Eric Davis
4fb554e95d Project custom fields are already copied via the Copy form. (#3367)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3165 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-13 03:37:26 +00:00
Eric Davis
17512e7efd Copy issue relations when copying a project. (#3367)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3164 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-13 03:37:21 +00:00
Jean-Philippe Lang
d58762a52d Roadmap: sort issues by project and prepend project name if different (#4373).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3163 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-12 15:33:31 +00:00
Jean-Philippe Lang
c66943c9b8 Removes changelog view.
All trackers can now be displayed on the roadmap. By default, only those marked as displayed on the roadmap are displayed.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3162 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-12 15:23:22 +00:00
Jean-Philippe Lang
21b52d2fd9 Display users then groups on project memberships view (#4389).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3161 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-12 11:20:26 +00:00
Jean-Philippe Lang
72ceefd36e Sort groups on user groups setting (#4389).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3160 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-12 11:05:06 +00:00
Jean-Philippe Lang
1f47d5856e Issue#done_ratio should not break if status is nil.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3159 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-12 11:02:53 +00:00
Jean-Philippe Lang
008f35277e Retrieve root_url if needed (#4377).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3158 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-12 10:35:16 +00:00
Jean-Philippe Lang
d905f2ce7e Allow blank value for IssueStatus#default_done_ratio.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3157 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-12 10:33:12 +00:00
Jean-Philippe Lang
d72778619f Fixes fr locale.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3156 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-12 10:18:26 +00:00
Jean-Philippe Lang
b63b5e5928 Locales update.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3155 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-12 10:15:13 +00:00
Jean-Philippe Lang
5c6ce51ec9 Adds workflow copy functionality (#1727).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3154 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-12 10:06:07 +00:00
Eric Davis
ddeaf9da96 Refactor conditions.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3153 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-12 06:18:45 +00:00
Eric Davis
7959101288 Search mail addresses in Principal#like
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3152 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-12 06:18:40 +00:00
Eric Davis
4fe14e71c2 Adds a Setting to control how an Issue's done_ratio is calculated:
* Issue field (default) - the done_ratio field for the Issue
* Issue status - uses the Issue Status's value

  #4274

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3151 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-11 18:48:34 +00:00
Jean-Philippe Lang
a83501364d Makes target version field on update form use the grouped combo.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3150 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-10 20:15:03 +00:00
Jean-Philippe Lang
272869c654 Fix target version field on issue update form.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3149 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-10 19:55:20 +00:00
Jean-Philippe Lang
7537e86fd2 Fixes that issue copy/move throws an error when status is not changed (#4369).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3148 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-09 16:04:45 +00:00
Jean-Philippe Lang
9f6612651c Cleaning workflow edit view.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3147 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-09 13:30:54 +00:00
Jean-Philippe Lang
1c3722b5cb Moves submit button to tracker form.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3146 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-09 11:03:55 +00:00
Jean-Philippe Lang
34d14be556 Adds custom field selection on tracker form.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3145 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-09 10:58:51 +00:00
Jean-Philippe Lang
8f9f56502d Slight change to the breadcrumb on custom field admin views.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3144 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-09 10:49:58 +00:00
Jean-Philippe Lang
84abeac304 Improve rdm-mailhandler exit status (#4368).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3143 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-09 10:44:15 +00:00
Jean-Philippe Lang
3918374d5c Add test for #4354.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3142 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-09 10:31:17 +00:00
Jean-Philippe Lang
96fe47ea19 Disabled broken textile references (#4354).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3141 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-09 10:30:23 +00:00
Jean-Philippe Lang
b090098952 Fixed: Bulk edit of issues throws 500 if no versions are defined on the project (#4366).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3140 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-09 09:22:16 +00:00
Jean-Philippe Lang
f2520385e4 Fixes tracker_id and custom_field_values assignment order for issues (#4353).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3139 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-09 09:12:29 +00:00
Jean-Philippe Lang
1de2a0b7c7 Ignore subversion root_url case when extracting relative url.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3138 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-09 08:39:51 +00:00
Jean-Philippe Lang
0fe389b841 Optimize updates of issue's shared versions.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3137 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-08 20:47:52 +00:00
Jean-Philippe Lang
8f85ba79bc No need to update issues from the version's project.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3136 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-08 16:25:27 +00:00
Jean-Philippe Lang
40e2af7ab9 Optimize issue updates when a version sharing changes.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3135 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-08 16:22:21 +00:00
Jean-Philippe Lang
517a87f8c5 Fixed: Subversion#latest_changesets ignores revision argument (#4360).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3134 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-08 16:06:22 +00:00
Jean-Philippe Lang
efeebd4278 Display shared versions in project settings (#4357).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3133 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-08 14:19:38 +00:00
Jean-Philippe Lang
e823efc41f Fixes a test broken by r3127.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3132 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-08 13:27:06 +00:00
Jean-Philippe Lang
174f014564 Fixes broken admin menu extension (#4351).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3131 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-07 20:16:30 +00:00
Jean-Philippe Lang
5266e328c0 Fixes Project#shared_versions for descendants sharing (#465).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3130 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-07 19:28:47 +00:00
Azamat Hackimov
84bf891bb5 Translation updates
* es (#4286)
* sv (#4310)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3129 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-06 19:37:39 +00:00
Jean-Philippe Lang
aab6e68865 Remove edit link on wiki page diff (#4346).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3128 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-06 17:04:33 +00:00
Jean-Philippe Lang
f2113e735d Removes the 'Copy' checkbox on the copy/move form.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3127 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-06 12:52:03 +00:00
Jean-Philippe Lang
a2b4bb0dfb Ability to add a new version from the issue form (#4315).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3126 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-06 11:09:12 +00:00
Jean-Philippe Lang
8f33c6589d Fixed: error when changing tracker on the new issue form (#4345).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3125 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-06 10:37:08 +00:00
Jean-Philippe Lang
719cd7cfce Adds translation strings for r3123.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3124 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-06 10:28:58 +00:00
Jean-Philippe Lang
5f8e9d7118 Version sharing (#465) + optional inclusion of subprojects in the roadmap view (#2666).
Each version of a project can be shared with:
* subprojects
* projects in the project hierarchy: ancestors + descendants (needs versions management permission on the root project)
* projects in the project tree: root project + all its descendants (same as above)
* all projects (can be set by admin users only)

Notes:
* when sharing a version of a private project with others projects, its name will be visible within the other projects
* a project with versions used by non descendant projects can not be archived

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3123 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-06 10:28:20 +00:00
Eric Davis
e178123569 Enhanced the Issue Bulk Copy feature:
* Add a Copy option to the Context menu for multiple issues.
* Added assigned to, status, start and due date options to the move/copy form.
* Allow Issue#move_to to change attributes on the moved/copied issue.

  #4117

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3122 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-04 22:46:12 +00:00
Jean-Philippe Lang
c870a7b9ef Do not notify users that are no longer allowed to view an issue (#3589, #4263).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3121 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-03 21:28:14 +00:00
Jean-Philippe Lang
8bc0f7888b Fixed: News from a project with 'news' module disabled, are still diplayed in the cross-project news list (#4333).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3120 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-03 21:16:08 +00:00
Eric Davis
e02da72947 Add a second action menu to IssuesController#show. (#4331)
Will have the update, log time, watch, copy, etc buttons.  Had to rework
how the watchers button works since it requires a unique DOM id for the
Ajax response.  Also modified the WatchersController to be able to replace
multiple sections of the page, e.g. two Watch links.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3119 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-03 18:41:00 +00:00
Jean-Philippe Lang
97c5362cfe Fixed: no error message when creating a category from the issue form fails (#1477).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3118 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-02 21:18:05 +00:00
Jean-Philippe Lang
f5f26a44c1 Removes useless class.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3117 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-02 21:13:03 +00:00
Jean-Philippe Lang
184aae5bf2 Replaces 'New category' link on the issue form with an icon.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3116 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-02 21:05:43 +00:00
Jean-Philippe Lang
c051947161 Add assertion about email notification on issue creation via email (#4228).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3115 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-02 19:52:56 +00:00
Jean-Philippe Lang
e5dc94fe82 Make use of #watched_by? in issue form.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3114 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-02 19:17:42 +00:00
Jean-Philippe Lang
7592a955fb Fixes tracker update on context menu (#2405).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3113 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-02 19:07:27 +00:00
Jean-Philippe Lang
346c569f98 Fixed: "None" category issue count is empty while grouping by category (#4308).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3112 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-12-02 18:57:17 +00:00
Jean-Philippe Lang
8b8c24e61f Fixes context menu broken by r3109 (#2405).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3111 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-30 19:18:09 +00:00
Jean-Philippe Lang
25e131f176 Remove duplicate validation.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3110 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-29 20:05:15 +00:00
Jean-Philippe Lang
f134e72fec Adds tracker update to context menu and bulk edit form (#2405).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3109 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-29 20:00:21 +00:00
Jean-Philippe Lang
88fcf484d4 Enable tracker update on issue edit form (#2405).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3108 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-29 19:46:40 +00:00
Jean-Philippe Lang
3d317a435b Adds an action to SysController to fetch changesets of one or all projects (#2925).
Exemples:
* /sys/fetch_changesets (=> fetches changesets for all active projects)
* /sys/fetch_changeseys?id=foo (=> fetches changesets for project foo only)

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3107 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-28 16:50:26 +00:00
Jean-Philippe Lang
4c2264ee42 Adds 2 buttons to easily reorder selected columns (#4272).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3106 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-28 11:59:45 +00:00
Jean-Philippe Lang
66540afc08 Adds dynamic columns selection on the issue list (#4272).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3105 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-28 11:34:12 +00:00
Jean-Philippe Lang
99b52c8796 Rescue invalid query statement error with an error message.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3104 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-28 10:29:48 +00:00
Jean-Philippe Lang
915bbcfaff Move issues, journals, versions queries from IssuesController to Query model.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3103 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-28 10:08:29 +00:00
Jean-Philippe Lang
724141a39a Cleaning edit/delete links style.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3102 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-27 20:57:35 +00:00
Jean-Philippe Lang
c2e2040fc0 Fixes fixtures loading.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3101 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-27 20:49:33 +00:00
Jean-Philippe Lang
f9732b02a2 Fixes a test failure.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3100 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-27 20:49:08 +00:00
Jean-Philippe Lang
b9151cb3e8 Fixes a test failure.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3099 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-27 20:32:28 +00:00
Jean-Philippe Lang
2416260af2 Add tabindex to login screen (#4299).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3098 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-27 20:30:15 +00:00
Jean-Philippe Lang
4af8765f15 Reverts r3072 (#4302: error raised when sorting on an association not included as column).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3097 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-27 19:59:10 +00:00
Jean-Philippe Lang
ae082205e2 Add failing test for #4302.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3096 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-27 19:56:09 +00:00
Jean-Philippe Lang
43fd27fd0c Show last update datetime (last attachment added) on document list (#4232).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3095 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-26 20:12:20 +00:00
Jean-Philippe Lang
f3bcb705f7 Display an error when authenticity token is invalid.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3094 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-25 20:45:16 +00:00
Jean-Philippe Lang
ebab5a0074 Remove broken cookies after upgrade from 0.8.x to prevent an error from Rails (#4292).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3093 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-25 20:28:56 +00:00
Eric Davis
b75e038255 Updated menus from JPL's feedback.
* Updated Mapper#push documentation
* Renamed :parent_menu to :parent
* Renamed the external API for :child_menus to :children.  Internally it needs
  to stay :child_menus because Tree::TreeNode already defines a children
  method for another purpose

  #4250

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3092 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-25 05:36:56 +00:00
Eric Davis
b0999e3764 Add support for unattached menus (generated dynamically)
A MenuItem can define a :child_menus option with a Proc.  When the menus
are rendered, the Proc will be run and the resulting MenuItems will be
added to the page as child menus

  #4250

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3091 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-25 05:36:50 +00:00
Eric Davis
1f06cf8899 Converted Menus to a Tree structure to allow submenus.
* Bundle the rubytree gem
* Patched RubyTree's TreeNode to add some additional methods.
* Converted the menu rendering to walk the Tree of MenuItems to render
  each item
* Added a menu option for :parent_menu to make this menu a child of the parent
* Added a bunch of tests
* Made MenuItem a subclass of Tree::TreeNode in order to use it's methods
  directly
* Changed the exceptions in MenuItem#new to be ArgumentErrors instead of the
  generic RuntimeError

  #4250

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3090 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-25 05:36:44 +00:00
Eric Davis
5a9528cf3d Added :view_my_account_contextual hook.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3089 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-25 01:14:19 +00:00
Jean-Philippe Lang
9b0acce9c9 Fixed: error raised when rendering text that contains an email address with textile disabled (#4268).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3088 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-24 22:02:14 +00:00
Jean-Philippe Lang
2398565193 Fixed: Editing issue notes removes quote link (#4279).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3087 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-24 18:00:57 +00:00
Jean-Philippe Lang
14e88ec420 Fixes revision form when browsing a subdirectory (#4281).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3086 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-24 17:55:45 +00:00
Jean-Philippe Lang
654ccddd76 Fixes css classes in table in admin/info (#4261).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3085 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-23 21:00:32 +00:00
Azamat Hackimov
58faed438d Translation updates
* pt-BR (#4229)
* ru
* zh-TW (#4236)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3084 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-22 16:14:10 +00:00
Jean-Philippe Lang
d8c5549168 Changes misleading scopes on Enumeration.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3083 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-21 12:00:49 +00:00
Jean-Philippe Lang
4bdfef4dc4 Fixed roadmap progress display error (#4255).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3082 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-21 10:50:36 +00:00
Jean-Philippe Lang
0485d3a524 Reset session on login/logout (#4248).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3080 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-21 10:02:39 +00:00
Jean-Philippe Lang
4e3202d2a2 Reverts r3014 (CodeRay back to 0.7.6).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3079 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-20 15:50:06 +00:00
Jean-Philippe Lang
d73fb1fab8 Load roles when loading project members.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3078 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-20 13:08:17 +00:00
Jean-Philippe Lang
c9bfdc009b Avoid useless database queries.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3077 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-20 12:57:52 +00:00
Eric Davis
ec4ba23248 Add a setting to pick alternative Gravatar images. #2734
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3076 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-17 03:10:49 +00:00
Jean-Philippe Lang
3fc655904f Copy issue status on project copy (#3877).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3075 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-16 20:06:37 +00:00
Jean-Philippe Lang
e24358bc43 Use /raw/ for url instead of ?format=raw for getting raw repository files (#1901, #4119).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3074 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-16 19:39:16 +00:00
Jean-Philippe Lang
dfd0b8bcdf Adds style for acronyms (#4224).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3073 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-16 18:33:09 +00:00
Jean-Philippe Lang
d84bd8edd8 Optimize associations loading on the issue list.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3072 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-16 18:28:44 +00:00
Jean-Philippe Lang
71bc44a89d Allow issue grouping by custom field (#2679).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3071 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-16 18:07:30 +00:00
Azamat Hackimov
2a3a6da45a Translation updates:
*pt-BR (#4223)
*ru


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3070 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-16 15:32:20 +00:00
Jean-Philippe Lang
0176430f5c Fixed: Alternate theme lacking right border if no sidebar present (#4069).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3069 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-15 21:15:31 +00:00
Jean-Philippe Lang
b2018dfa8a Adds a setting for new projects default modules (#1797).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3068 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-15 16:20:33 +00:00
Jean-Philippe Lang
1f1135e867 Adds links to versions on changelog.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3067 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-15 15:44:48 +00:00
Jean-Philippe Lang
c309210654 Eager load priorities on roadmap and changelog.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3066 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-15 15:42:44 +00:00
Jean-Philippe Lang
bccf6496f8 Fixes css classes on issue detail view (#4180).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3065 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-15 15:27:40 +00:00
Jean-Philippe Lang
ba7cf9c3ce Adds custom fields for versions (#4219).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3064 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-15 15:22:55 +00:00
Jean-Philippe Lang
7d57833740 Adds a 'Move and follow' button on Move/Copy view to be redirected to the created issue(s) rather than the source project issue list (#1847).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3063 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-15 14:31:19 +00:00
Jean-Philippe Lang
63c8675887 Make use of link_to_issue.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3062 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-15 14:07:37 +00:00
Jean-Philippe Lang
6838677e30 Remove dead code.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3061 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-15 13:43:44 +00:00
Jean-Philippe Lang
ded602c89f Run all tests for coverage.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3060 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-15 13:43:31 +00:00
Jean-Philippe Lang
534ce51154 Allow non admin users to add subprojects (#2963).
Subprojects can be added to the projects for which the user has add_project permission.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3059 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-15 13:22:08 +00:00
Jean-Philippe Lang
ea9a7c20e6 Set trunk version to 0.8.7.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3058 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-15 10:43:32 +00:00
Eric Davis
ea0bc56a65 Protect controllers from potential CSRF attacks. #4216
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3051 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-14 19:41:07 +00:00
Eric Davis
93bf1df5d4 Fix 500 errors with a POST request that requires a login. #4216
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3050 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-14 19:41:02 +00:00
Eric Davis
b2e4d8ad3f Fixed some tests that where looking for specific issue urls but weren't matching
the css classes for the link.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3049 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-14 19:40:56 +00:00
Jean-Philippe Lang
1a65eb8b08 Don't reveal issue subjects if user is only allowed to view spent time (#3187).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3043 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-14 14:10:09 +00:00
Azamat Hackimov
ed15b2aa14 Locales update
* pt-BR (#4214)
* ru
* zh (#4207)
* zh-TW (#4201)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3042 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-14 13:43:55 +00:00
Jean-Philippe Lang
bc37fcee74 Clean up ticket auto links.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3041 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-14 12:59:32 +00:00
Jean-Philippe Lang
cbeeaa4d4d Refactoring ApplicationHelper#link_to_issue.
Now displays issue subject by default.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3040 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-14 12:53:50 +00:00
Jean-Philippe Lang
dfd0204052 Add view_issues permission (#3187).
A migration adds this permission to all existing roles to preserve current behaviour.
This permission controls access to issues, roadmap and changelog.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3039 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-14 12:08:47 +00:00
Jean-Philippe Lang
326ed79b43 Fixed that "RE:" prefix is added to the subject each time the message is quoted (#4215).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3038 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-13 19:14:18 +00:00
Jean-Philippe Lang
8c769c546f Move checkbox for "Send account information to the user" to be clicked before the "Create" button (#4193).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3037 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-13 18:11:10 +00:00
Jean-Philippe Lang
28f0b5ce4a Fixed: Project#enabled_module_names= does not test if a module is already enabled (#4200).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3036 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-13 17:50:21 +00:00
Jean-Philippe Lang
0241003590 Fixed: Quoting in forums does not take the subject from the message being quoted (#4215).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3035 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-13 17:46:38 +00:00
Jean-Philippe Lang
d82738ad00 Add test for i18n number_to_human_size (#4208).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3034 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-12 22:00:29 +00:00
Eric Davis
cd110535a3 Adding the body of the feed to the failure message. #4204
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3033 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-12 04:59:54 +00:00
Eric Davis
bb8a397a13 Style the password field the same as the login field. #3845
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3032 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-12 04:44:28 +00:00
Jean-Philippe Lang
8267ded518 Allow [#id] as subject to reply by email (#3653).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3031 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-11 22:30:02 +00:00
Jean-Philippe Lang
1d8b4ee778 Fixed pre tags containing "<pre*" (#4125).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3030 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-11 16:23:11 +00:00
Jean-Philippe Lang
22d12032e7 Reject empty Mercurial entries (#4098).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3029 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-11 15:33:30 +00:00
Jean-Philippe Lang
4b83a0d848 Fixes diff parser for when lines starting with multiple dashes are removed (#4186).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3028 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-11 13:25:53 +00:00
Jean-Philippe Lang
58103680bd Redirect to the current page when using context menu on the issue list (#4184).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3027 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-11 11:35:27 +00:00
Jean-Philippe Lang
858f5cbf07 Hide paragraph terminator at the end of headings on html export (#4194).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3026 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-11 11:10:03 +00:00
Jean-Philippe Lang
b8b8cea288 Fixes jstoolbar lang files case (#4190).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3025 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-11 10:55:19 +00:00
Jean-Philippe Lang
c31411ec00 Fixes ApplicationHelper#link_to_user
* No link to a locked user page (closes #4182)
* Translate Anonymous string

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3024 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-11 10:48:54 +00:00
Jean-Philippe Lang
8f40750ad7 Adds a link to automatically close completed versions in project settings (#1245).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3023 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-09 18:53:12 +00:00
Jean-Philippe Lang
cc684803ba Ignore emails received from the application emission address to avoid hell cycles (#4139).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3022 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-08 13:51:53 +00:00
Jean-Philippe Lang
d4ccce3c72 Development database required for running rake test (closes #4153).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3021 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-08 13:15:59 +00:00
Jean-Philippe Lang
d201c54455 Adds version status to limit issue assignments (#1245).
Available version statuses are:
* open: no restriction
* locked: can not assign new issues to the version
* closed: can not assign new issues and can not reopen assigned issues

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3020 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-08 13:03:41 +00:00
Eric Davis
7c14c6d42e Added README.rdoc in the project root to display on Github
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3019 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-08 04:10:37 +00:00
Eric Davis
e02caeab0f Allow a config/additional_environment.rb file to customize the Rails::Initializer.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3018 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-08 02:16:42 +00:00
Jean-Philippe Lang
87d14dea10 Fixes SVG lib for ruby1.9.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3017 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-07 10:40:54 +00:00
Jean-Philippe Lang
86a9d90f07 Fixes distance of date in words calculation.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3016 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-07 09:50:16 +00:00
Jean-Philippe Lang
668ec7f694 Fixes a regexp for ruby1.9.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3015 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-07 09:43:02 +00:00
Jean-Philippe Lang
be41f7f473 Upgrade Coderay to 0.9.0.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3014 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-07 09:08:13 +00:00
Jean-Philippe Lang
3b9d8c2a72 Adds a few functional tests.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3013 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-07 08:44:56 +00:00
Jean-Philippe Lang
6245f49934 Fixed: Pre-filled time tracking date ignores timezone (#4160).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3012 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-06 19:41:03 +00:00
Jean-Philippe Lang
54e37b12fd Add test:coverage task.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3011 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-06 19:39:51 +00:00
Eric Davis
5f48256c20 Fixed a typo in Object daddy
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3010 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-05 21:32:26 +00:00
Jean-Philippe Lang
7b77301eab Fixed: first day of date range is not included in time report with SQLite (#3112).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3009 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-04 17:35:20 +00:00
Jean-Philippe Lang
c201581c05 Fixes test environments.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3008 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-04 17:15:20 +00:00
Jean-Philippe Lang
27e3fa2bed Use FasterCSV or ruby1.9 CSV instead of ruby1.8 builtin CSV.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3007 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-04 13:22:26 +00:00
Jean-Philippe Lang
4ea714fb91 Fixed: child_pages macro fails on wiki page history (#4152).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3006 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-04 12:36:45 +00:00
Jean-Philippe Lang
6994a81209 Fixed: Feed content limit ignored on issues list.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3005 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-04 12:31:37 +00:00
Jean-Philippe Lang
b2a55bda0c Sort the list of users to add to a group or project (#4150).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3004 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-04 11:17:55 +00:00
Jean-Philippe Lang
962535255c Set trunk version to 0.8.6
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3003 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-04 11:15:02 +00:00
Jean-Philippe Lang
9943f64ff0 Fixed: inline images in wiki headings (#4112).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2999 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-04 10:22:57 +00:00
Azamat Hackimov
03548f2d63 Locales update
* Swedish (#4161)
* Traditional Chinese (#4145)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2994 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-11-03 15:09:18 +00:00
Jean-Philippe Lang
5667b2b7d1 Translation updates (closes #4102, #4108, #4118).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2993 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-31 10:09:43 +00:00
Jean-Philippe Lang
279e81eb92 Fixed a test failure.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2992 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-29 18:51:10 +00:00
Jean-Philippe Lang
92ec35e657 Unified UsersController#list and #index.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2991 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-29 18:48:19 +00:00
Jean-Philippe Lang
e64fb6a728 Fixes users links.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2990 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-29 18:44:16 +00:00
Jean-Philippe Lang
e117dc8c9c Include missing fixtures.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2989 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-29 18:40:00 +00:00
Jean-Philippe Lang
a842769c3f AccountController#show (/account/show/:id) moved to UsersController#show (/users/:id).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2988 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-29 18:37:00 +00:00
Jean-Philippe Lang
ac56d1d5e5 Do not show user profile if no visible project or activity (#4129, #3720).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2986 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-29 18:09:40 +00:00
Jean-Philippe Lang
72d208cb35 Typo fixed (#4134).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2985 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-29 17:59:09 +00:00
Jean-Philippe Lang
86874785b7 Fixed error on repository when there are no comments in a changeset (#4126).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2983 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-29 17:55:59 +00:00
Jean-Philippe Lang
a658679d29 Add etag check on the activity view to avoid rendering when not modified.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2982 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-25 17:27:24 +00:00
Jean-Philippe Lang
06fff6295c Add indexes on various timestamps to speed up the activity view.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2981 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-25 16:56:46 +00:00
Jean-Philippe Lang
9aa2b6b9a4 IssuesController#destroy accepts POST only (#4107).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2980 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-25 13:38:48 +00:00
Jean-Philippe Lang
821f9eb390 HTML escaping (#4106).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2979 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-25 13:28:36 +00:00
Jean-Philippe Lang
a3fcdfe391 Add translations for new permission.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2978 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-25 12:13:51 +00:00
Jean-Philippe Lang
97b4e75478 Add a permission to remove issue watchers (#2450).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2977 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-25 12:11:53 +00:00
Jean-Philippe Lang
6fedbf60d5 Allow project forums copy.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2976 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-25 11:23:46 +00:00
Jean-Philippe Lang
6dfe0395a5 Display stats about objects that can be copied.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2975 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-25 11:10:35 +00:00
Jean-Philippe Lang
1a1bfbfb07 Do not ignore parent project setting on project copy (#3386).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2974 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-25 10:56:32 +00:00
Jean-Philippe Lang
a18676b669 Prevent mass-assignment warnings.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2973 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-25 10:51:21 +00:00
Jean-Philippe Lang
4e73685af7 Reset timestamps and wiki page hierarchy on project copy.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2972 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-25 10:44:03 +00:00
Jean-Philippe Lang
875eb47ad1 Prevent mass-assignment warnings.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2971 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-25 10:35:59 +00:00
Jean-Philippe Lang
2e675342cb Removes debug message.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2970 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-25 10:31:01 +00:00
Jean-Philippe Lang
a9fb11c0f5 Fixes project wiki copy.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2969 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-25 10:30:39 +00:00
Jean-Philippe Lang
eecec44ed2 Add a test that breaks before r2967 (broken project wiki copy).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2968 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-25 10:11:06 +00:00
Jean-Philippe Lang
9f12a14382 Wiki auto creation temporary disabled until project wiki copy is fixed (2 wikis created).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2967 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-24 16:12:13 +00:00
Jean-Philippe Lang
5b787785b4 Project copy: let the user choose what to copy from the source project (everything by default).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2966 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-24 13:30:23 +00:00
Jean-Philippe Lang
6842941adc Removes debug code.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2965 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-24 12:33:34 +00:00
Jean-Philippe Lang
383b2bd903 Small fix to HTML title.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2964 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-24 12:33:08 +00:00
Jean-Philippe Lang
83717a9b75 Add mail field to admin user search filter (#3882).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2963 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-24 12:21:09 +00:00
Jean-Philippe Lang
9233a07a23 Adds a test for attached image inside a link (#4033).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2962 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-24 12:19:22 +00:00
Jean-Philippe Lang
de8dcc5b26 Sets proper content type for plain text mails (#3970).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2961 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-24 11:57:01 +00:00
Jean-Philippe Lang
f206dfe9b5 Reverts r2770 (#3391).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2960 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-24 11:35:35 +00:00
Jean-Philippe Lang
a68d8a7b32 Sets the current project as the default value of project jump box (#4053).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2959 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-24 11:29:49 +00:00
Jean-Philippe Lang
2cec9f87ab Translation updates (closes #4054, #4060, #4075).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2958 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-24 11:22:06 +00:00
Jean-Philippe Lang
cabf052127 Prevent undefined method `<=>' for nil:NilClass in AbstractAdapter (#4098).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2957 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-24 11:08:09 +00:00
Jean-Philippe Lang
2445250960 Fixes form buttons on projects/settings/activities (closes #4083).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2956 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-22 17:51:23 +00:00
Jean-Philippe Lang
6ffe1926ab Remove hard coded string in a view (closes #4076).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2955 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-22 17:46:54 +00:00
Jean-Philippe Lang
04ae25f6b0 Do not render hidden news edit form if user is not allowed to edit (closes #4068).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2954 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-22 17:42:17 +00:00
Jean-Philippe Lang
e5c4cfc688 Add missing strings (rake locales:update).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2953 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-22 17:39:12 +00:00
Eric Davis
ff3d0fe4db Fixed some merge bugs. #4077
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2952 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-21 22:35:03 +00:00
Eric Davis
2e0cbd2840 Added all list and boolean custom data fields to the Time Report. #4077
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2951 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-21 22:34:57 +00:00
Eric Davis
37d401ac58 When a specific TimeEntryActivity are change, associated TimeEntries will be
re-assigned to the correct record.

* Renamed build to create since the methods now create objects.
* Removed call to Project#save that isn't needed since objects are saved directly now.
* Wrapped the activity creation and updates in a SQL transaction so TimeEntries
  will remain in a consistent state if there is an error.
* When a Project's TimeEntryActivities are destroyed, they are now
  reassigned to the parent TimeEntryActivity.

  #4077

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2950 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-21 22:34:52 +00:00
Eric Davis
5833ba9f81 Added a Activities tab to Project Settings
* Changed Project#activities to allow getting inactive Activities also:
  * Changed the Enumeration#all named_scope to exclude project specific Activities
  * Changed the Project has_many time_entry_activities to include all by default
    and provided an #active method to filter them to active ones only
  * Split Project#activities to two methods and gave it a parameter that is used
    to determine if inactive activities are included (default is no)
* Added a reset button to delete all project specific activities.
* Added ProjectsController#reset_activities to remove the project
  specific activities
* Added a HTTP DELETE route for reset_activities
* Changed the permissions for managing project activities to have access to the
  ProjectsController#reset_activities action
* Added a way to bulk save Project specific Activities in ProjectsController
  * #save_activities will save all the changed activities, including update the
    existing records
  * Added helper methods to the controller which will be refactored later
  * Allow the same TimeEntryActivity names on different projects

  #4077

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2949 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-21 22:34:45 +00:00
Eric Davis
e615266e9a Changed the Timelogs to use both the Systemwide and Project specific TimeEntryActivities
* Added Project#activities to return all the Systemwide and Project specific
  activities, excluding Systemwide ones that are overridden.
* Added some tests for TimelogHelper.

  #4077

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2948 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-21 22:34:39 +00:00
Eric Davis
29301c8a38 Added project specific Enumeration overrides.
These will be used to track if Enumeration's custom data or active state
is overridden on a project.  An overridden Enumeration is one that is associated
with a parent Enumeration.

  #4077

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2947 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-21 22:34:34 +00:00
Eric Davis
e76d4c5c4c Added an active field track if an Enumeration is active on the frontend view.
* Changed TimelogHelper#activity_collection_for_select_options to only use
  active TimeEntryActivities.
* Changed TimelogHelper#activity_collection_for_select_options to return a blank
  option if the time_entry's current activity is inactive.

  #4077

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2946 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-21 22:34:28 +00:00
Eric Davis
ac4937a767 Enumerations can now have custom fields defined on them. #4077
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2945 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-21 22:34:22 +00:00
Eric Davis
29ab7b4108 Updated the unit test so Enumerations are tested separately from the subclasses.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2944 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-21 22:34:17 +00:00
Jean-Philippe Lang
07aa3c55bd Contextual quick search (#3263).
Eg. when viewing issues, the quick search will search issues only.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2943 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-21 17:07:18 +00:00
Eric Davis
739e11702a Change the order of checkboxes for boolean custom fields.
Broken in r2887 for the Rails 2.3.4 upgrade.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2942 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-21 03:31:20 +00:00
Eric Davis
d40756d611 Renamed Project#public named_scope so it will not override Ruby's public method
#4056

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2941 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-21 03:21:31 +00:00
Eric Davis
50bab8b429 Mocha is needed for tests.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2940 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-21 03:13:24 +00:00
Eric Davis
a41ba2aed7 Renamed the default "Assigned" status to "In Progress". #3605
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2939 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-20 05:06:14 +00:00
Eric Davis
b887cef7af Moved object daddy helpers to their own module.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2938 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-20 00:36:55 +00:00
Eric Davis
6456f7c4a4 Updated some object_daddy exemplars for the Models.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2937 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-20 00:36:51 +00:00
Eric Davis
61c09b6442 Added shoulda macros to test Project's associations
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2936 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-19 00:27:13 +00:00
Eric Davis
257c92f8f9 Replaced a custom test with a shoulda macro.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2935 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-19 00:27:08 +00:00
Eric Davis
a150689be9 Improved Project#copy to copy more data from the source Project. #3367
* Versions
* Associate the copied issues with the new versions
* Wiki
* WikiPages
* WikiContents
* IssueCategories

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2934 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-19 00:07:37 +00:00
Eric Davis
6531c3f887 Preselect the issue custom fields from the source project when copying. #4045
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2933 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-19 00:07:32 +00:00
Eric Davis
945ea9b01c Refactored duplicated test code to a setup.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2932 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-19 00:07:27 +00:00
Eric Davis
548d5a21f6 Converted Project#copy test to use shoulda
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2931 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-19 00:07:23 +00:00
Eric Davis
35333367df Configured object_daddy to help generate test data instead of fixtures. #4004
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2930 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-18 22:25:00 +00:00
Azamat Hackimov
ee9c2d3d88 pt-BR update (#4040)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2929 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-18 21:27:26 +00:00
Eric Davis
70118fb136 Adding missing database indexes for foreign keys and STI fields.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2928 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-17 22:23:29 +00:00
Eric Davis
07ffad4a7e Rename the wiki toolbar's JavaScript variable, 'toolbar' conflicts with
the browser's variable.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2927 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-17 21:17:46 +00:00
Eric Davis
5e539c31b0 Fixed the generated test in the redmine_plugin_model. (#3927)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2926 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-17 21:08:33 +00:00
Eric Davis
4425acafff Setup shoulda for testing. (#4005)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2925 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-17 20:37:23 +00:00
Jean-Philippe Lang
afd2d4afc6 Fixed: HTML entities displayed when editing an issue note (#3996).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2924 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-11 10:36:11 +00:00
Jean-Philippe Lang
0b3e3471b0 Makes migration scripts load tickets in batches (#4011).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2923 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-11 10:12:07 +00:00
Jean-Philippe Lang
0ac07afc67 Fixes migration scripts broken by r2726.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2922 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-11 10:08:22 +00:00
Jean-Philippe Lang
6224f7caca da locale updated (closes #3919).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2921 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-11 09:24:45 +00:00
Jean-Philippe Lang
1088c7360b el locale updated (closes #3932).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2920 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-11 09:20:57 +00:00
Jean-Philippe Lang
c5d8bbeb8c translation updates (closes #4016, #4017).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2919 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-11 09:17:32 +00:00
Jean-Philippe Lang
4c42e1a08f ko locale updated (closes #3954).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2918 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-11 09:15:33 +00:00
Jean-Philippe Lang
ca250c1f2e ro locale updated (closes #2900).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2917 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-11 08:33:46 +00:00
Jean-Philippe Lang
f65133093a Fixes project shortcut combo.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2916 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-11 08:20:39 +00:00
Jean-Philippe Lang
d8ba5c2a06 Fixes MailHandler for ruby1.9.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2915 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-10 15:25:34 +00:00
Jean-Philippe Lang
4450e6f24b String#each removed in ruby1.9.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2914 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-10 15:19:27 +00:00
Jean-Philippe Lang
9cd662f8dc Fixes some test failures due to Array#to_s behaviour in ruby1.9.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2913 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-10 15:14:08 +00:00
Jean-Philippe Lang
22d3d5a3b0 Defines String#to_a (Object#to_a removed in ruby1.9).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2912 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-10 15:09:19 +00:00
Jean-Philippe Lang
531eb65557 Fixes a wrong number of arguments error with ruby1.9.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2911 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-10 15:04:08 +00:00
Jean-Philippe Lang
38dc4d1cf9 Sets file encoding to utf-8 for ruby 1.9.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2910 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-10 15:00:28 +00:00
Jean-Philippe Lang
ac8a67191f Renames uploaded_test_file helper.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2909 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-10 14:56:29 +00:00
Jean-Philippe Lang
94d34887cc Change deprecated dbfile parameter.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2908 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-10 14:37:47 +00:00
Jean-Philippe Lang
8ffc61f66c Completes r2856 (#3979).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2907 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-10 11:11:01 +00:00
Jean-Philippe Lang
480ccbf045 French locale update.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2906 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-10 10:30:21 +00:00
Jean-Philippe Lang
6656d41a41 Fixes User/CustomValue association broken by r2869 (#3978).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2905 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-10 10:16:00 +00:00
Eric Davis
bcbf08017a Upgrade the Engines plugin to get the bugfix for Rails::Plugin::GemLocator
This update will allow Rails Engines to be installed as gems.  For example:

    # config/environment.rb
    Rails::Initializer.run do |config|
      ...
      config.gem 'timesheet_plugin'
    end

Will load the timesheet_plugins's RubyGem and allow it to work as if it was
installed to vendor/plugins.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2904 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-07 16:43:50 +00:00
Jean-Philippe Lang
4e811bebd1 Fixes Repository#find_changeset_by_name with PostgreSQL (#3937).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2903 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-10-02 14:49:38 +00:00
Eric Davis
19df1b636c Fixed a bug where the form would POST causing a routing error. (#3918)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2902 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-25 00:39:02 +00:00
Azamat Hackimov
e6ac92487a Translation updates
* Japanese (#3865)
* Portuguese Brazilian (#3864)
* Russian
* Spanish (#3871)
* Traditional Chinese (#3863)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2901 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-24 15:03:23 +00:00
Jean-Philippe Lang
30ad78e57d Fixed: RepositoriesController#revision may show wrong revision (#3779).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2898 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-20 15:20:22 +00:00
Jean-Philippe Lang
e89d4825dd Set mime-type property (#3885).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2897 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-20 14:25:48 +00:00
Jean-Philippe Lang
dd633322f9 Unexpected closing tag removed.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2896 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-20 14:08:52 +00:00
Jean-Philippe Lang
21e18c1eb4 Adds missing native eol properties.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2895 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-20 14:06:57 +00:00
Jean-Philippe Lang
52a6b0a21e Fixed: Custom values with a nil value cause error on (project|account)/show (#3705).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2894 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-20 09:56:06 +00:00
Jean-Philippe Lang
41cbd239c4 Makes timelog report work at issue level (#2935).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2893 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-20 09:30:41 +00:00
Jean-Philippe Lang
b4c55ea4de Makes saved query filters visible (#2883).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2892 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-20 07:39:53 +00:00
Jean-Philippe Lang
3477ded32a Makes tickets and timelogs filters collapsible (UI).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2891 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-20 07:24:16 +00:00
Jean-Philippe Lang
cc3c8a717c Update version to 0.8.5.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2889 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-17 17:49:29 +00:00
Azamat Hackimov
d3691239fa Russian update (#3859)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2888 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-13 17:41:36 +00:00
Eric Davis
7b0cb6aba8 Upgraded to Rails 2.3.4 (#3597)
* Ran the Rails upgrade
* Upgraded to Rails Engines 2.3.2
* Added a plugin to let Engines override application views.
* Converted tests to use the new classes:
** ActionController::TestCase for functional
** ActiveSupport::TestCase for units
* Converted ActiveRecord::Error message to a string.
* ActiveRecord grouping returns an ordered hash which doesn't have #sort!
* Updated the I18n storage_units format.
* Added some default initializers from a fresh rails app
* Changed the order of check_box_tags and hidden_field_tags.  The hidden tag
  needs to appear first in Rails 2.3, otherwise it will override any value in
  the check_box_tag.
* Removed the custom handler for when the cookie store is tampered with.
  Rails 2.3 removed the TamperedWithCookie exception and instead Rails will not
  load the data from it when it's been tampered with (e.g. no user login).
* Fixed mail layouts, 2.3 has problems with implicit multipart emails that
  use layouts.  Also removed some custom Redmine mailer code.
* Fixed a bug that occurred in tests where the "required" span tag would be
  added to the :field_status translation.  This resulted in an email string of:

    <li>Status<span class="required"> *</span><span class="required"> *</span>

  Instead of:

    <li>Status: New</li>

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2887 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-13 17:14:35 +00:00
Azamat Hackimov
fb349dc4ab Translation updates
* Korean (#3855)
* Russian
* Traditional Chinese (#3853)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2880 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-12 17:26:06 +00:00
Jean-Philippe Lang
9ec5c32861 Fixes group update form url (#3854).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2879 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-12 16:12:42 +00:00
Jean-Philippe Lang
041277235b Slight change to the visibility SQL statement.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2878 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-12 11:22:42 +00:00
Jean-Philippe Lang
8faa66f68f Adds spent time to the activity view (#3809).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2877 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-12 10:37:49 +00:00
Jean-Philippe Lang
563c927e13 Fixes Textile reference link (#3812).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2876 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-12 10:06:17 +00:00
Jean-Philippe Lang
aca6ed13fc Fixed: issue attachments are saved even if the issue has been updated by another user (#3846).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2875 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-12 09:59:38 +00:00
Jean-Philippe Lang
8e3222195b Korean translation update (#3847).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2874 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-12 09:37:26 +00:00
Jean-Philippe Lang
275b555b09 Email handler: set a default issue subject if the email subject is blank (#3850).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2873 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-12 09:33:22 +00:00
Jean-Philippe Lang
7f4635022f Makes 'delete links' the same on admin views.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2872 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-12 09:25:39 +00:00
Jean-Philippe Lang
ede9960444 Refactoring of tabs rendering.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2871 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-12 09:13:13 +00:00
Jean-Philippe Lang
d4ed5ec30b Adds strings for user groups.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2870 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-12 08:38:02 +00:00
Jean-Philippe Lang
7707457145 User groups branch merged.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2869 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-12 08:36:46 +00:00
Eric Davis
847c7367b4 Added plugin hook, :view_projects_show_sidebar_bottom
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2866 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-12 00:08:38 +00:00
Azamat Hackimov
02d07d8a43 Translation update: pt-BR (#3839)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2860 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-10 14:22:44 +00:00
Azamat Hackimov
d41544402c Translation updates
* Traditional Chinese (#3828)
* Swedish (#3829)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2859 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-07 11:09:43 +00:00
Azamat Hackimov
edbfd09990 Changing l10n messages (fixes #3807)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2856 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-04 22:28:35 +00:00
Eric Davis
677d1769d6 Reset the default language for the test, autotest was caught it staying at :no
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2855 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-04 03:24:20 +00:00
Eric Davis
609faba6a3 Allow referencing issue numbers in brackets. This style is used by other
bug trackers.

Examples:

* "[#nnn] Worked on this issue"
* "[#nnn, #mmm] Worked on these"
* "[#nnn #mmm] Working some more"

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2854 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-03 01:21:11 +00:00
Eric Davis
cd1e094ce8 Missing 'test_' prefix on a helper test caused it to not run.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2853 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-03 01:03:10 +00:00
Azamat Hackimov
925104288a Romanian translation update, adding missed diacritics (#3797)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2852 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-02 18:01:03 +00:00
Azamat Hackimov
ec670f56ac Greek translation support, thanks to Vaggelis Typaldos for work (#3795)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2851 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-01 18:16:31 +00:00
Azamat Hackimov
f9fe92dcb3 Translation updates:
* Swedish (#3774)
* Traditional Chinese (#3772)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2850 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-01 18:13:49 +00:00
Jean-Philippe Lang
5b97570693 SCM:
* add latest changesets for the current directory when browsing the repository and a link to the full log
* ability to diff a directory (#3575)

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2849 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-01 12:13:17 +00:00
Eric Davis
71abeb5898 Add some margin to journal notes if Gravatars are enabled. (#3771)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2848 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-09-01 04:09:32 +00:00
Azamat Hackimov
f1f65794e4 New strings for translation (fixes #2872), thanks for Enderson Maia for pointing and translation
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2847 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-08-21 19:43:33 +00:00
Azamat Hackimov
f5517cd834 Translations updates:
* pt-BR.yml (#3752)
* ru.yml
* zh-TW.yml (#2750)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2846 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-08-21 19:27:20 +00:00
Jean-Philippe Lang
aae5c7d359 Small CSS fix.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2845 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-08-17 16:37:31 +00:00
Jean-Philippe Lang
e10577e9ed SCM:
* Fixes file log for non-Git repositories (Repository#latest_changesets ignores path argument)
* No longer used Repository#changesets_for_path method removed

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2844 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-08-17 16:32:24 +00:00
Jean-Philippe Lang
a4d7a03b14 SCM browser:
* don't show repository commits when showing a subfolder
* remove obsolete view browse.rhtml

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2843 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-08-17 14:26:13 +00:00
Jean-Philippe Lang
6fb80efdae Fixes argument in Repository#latest_changesets.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2842 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-08-17 14:12:51 +00:00
Jean-Philippe Lang
a49506ce5f Use selected columns in the issues PDF export (#1190).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2841 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-08-17 14:08:42 +00:00
Eric Davis
c28b044d68 Added branch and tag support to the git repository viewer. (#1406)
Many thanks to Adam Soltys and everyone else who tested this patch.

* Updated git test repository so it has a branch with some differences from the master branch
* Moved redmine diff class into a module so as not to clash with diff-lcs gem which is required by grit
* Find changesets from all branches, not just master
* Got revision browsing working
* Got file actions working properly
* Allow browsing by short form of commit identifier
* Added a method to retrieve repository branches
* Allow browsing by branch names as well as commit numbers
* Handle the case where a git repository has no master branch
* Expand revision box and handle finding revisions by first 8 characters
* Added branches dropdown to repository show page
* Combined repository browse and show into a single action.  Moved branch/revision navigation into a partial.
* Renamed partial navigation -> breadcrumbs
* Made it so latest revisions list uses branch and path context
* Preserve current path when changing branch or revision
* Perform slightly more graceful error handling in the case of invalid repository URLs
* Allow branch names to contain periods
* Allow dashes in branch names
* Sort branches by name
* Adding tags dropdown
* Need to disable both branches and tags dropdowns before submitting revision form
* Support underscores in revision (branch/tag) names
* Making file history sensitive to current branch/tag/revision, adding common navigation to changes page
* Updated translation files to include labels for 'branch', 'tag', and 'view all revisions'
* Reenable fields after submit so they don't look disabled and don't stay disabled on browser back button
* Instead of dashes just use empty string for default dropdown value
* Individual entry views now sport the upgraded revision navigation
* Don't display dropdowns with no entries
* Consider all revisions when doing initial load
* Fixed bug grabbing changesets.  Thanks to Bernhard Furtmueller for catching.
* Always check the entire log to find new revisions, rather than trying to go forward from the latest known one
* Added some cleverness to avoid selecting the whole changesets table any time someone views the repository root
* File copies and renames being detected properly
* Return gracefully if no revisions are found in the git log
* Applied patch from Babar Le Lapin to improve Windows compatibility

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2840 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-08-15 22:41:40 +00:00
Eric Davis
a39bc8f1f4 Adding .gitignore based on the svn-ignores.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2839 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-08-15 19:27:49 +00:00
Eric Davis
30526d55c3 Added missing fixture file from r2837 (#3731)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2838 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-08-13 16:57:36 +00:00
Eric Davis
9886827a66 Allow spaces between the keyword and colon in incoming mail. (#3731)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2837 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-08-12 23:26:32 +00:00
Azamat Hackimov
d7d72c43c8 Translation updates
* Korean (#3650)
* Spanish (#3664)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2836 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-08-11 16:06:16 +00:00
Eric Davis
ff0e5b019c Fixed missing translation for 'field_issue_to', the translation files ended in _id.
#3678

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2835 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-08-02 04:55:16 +00:00
Eric Davis
9ed048dc42 Include the issue status in search results and the Activity page. (#3700)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2834 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-08-02 04:36:06 +00:00
Eric Davis
06ff26f092 Enable SSL gravatars when Redmine is using https. (#2718)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2833 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-08-02 04:19:49 +00:00
Eric Davis
560e915c50 Upgraded the gravatar plugin from http://github.com/woods/gravatar-plugin
This will update the gravatar.com url (#2921) and provide support for SSL
gravatars (#2718).

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2832 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-08-02 04:19:44 +00:00
Eric Davis
bb61c9a0ec Added two new plugin hooks to Administration > Users > Memberships
* view_users_memberships_table_header
* view_users_memberships_table_row

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2829 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-08-01 18:14:39 +00:00
Jean-Philippe Lang
6da352dc47 Display all custom fields on issue PDF.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2828 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-07-29 19:05:03 +00:00
Jean-Philippe Lang
cfd7d07b69 Fixed: custom fields are not displayed in the same order on issue form and view.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2827 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-07-29 19:04:27 +00:00
Jean-Philippe Lang
9e07fb5e04 Remove hard-coded styles from ticket attributes table.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2826 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-07-29 18:35:29 +00:00
Eric Davis
26bbad5f23 Switch from a custom rcov task to the metric_fu gem.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2825 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-07-27 00:55:43 +00:00
Jean-Philippe Lang
dcba9f18e6 Allow line breaks in wiki table cells (#2346).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2824 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-07-19 14:23:15 +00:00
Jean-Philippe Lang
5ec4d4cdab Adds a link to the file history on repository file views.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2823 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-07-18 09:59:55 +00:00
Jean-Philippe Lang
bf0ddc2886 Fixes artefacts in truncated search results (#3622).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2822 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-07-18 09:46:20 +00:00
Jean-Philippe Lang
36d8f35192 Prevent creation of project with identifier 'new' (#3602).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2821 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-07-18 08:06:51 +00:00
Jean-Philippe Lang
d41bd93acb Fixed: error raised when trying to add an empty comment to a news (#3615).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2820 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-07-18 07:51:17 +00:00
Eric Davis
1a9942ba99 Change subversion adapter to not cache authentication and run non interactively
#3424

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2819 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-07-10 03:24:46 +00:00
Eric Davis
a9ee946053 Change links to closed issues to be a grey color. (#3495)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2818 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-07-10 03:03:13 +00:00
Azamat Hackimov
6404945683 Russian update
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2817 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-07-08 19:52:14 +00:00
Azamat Hackimov
03d1edaef1 Translation updates:
* Italian (#3501)
* Korean (#3552)


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2816 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-07-08 18:42:31 +00:00
Jean-Philippe Lang
9c8daee045 Adds permalinks to message replies (#3587).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2815 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-07-05 19:52:09 +00:00
Jean-Philippe Lang
6151e95e37 Adds links to issues in reminder HTML template (#3541).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2814 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-07-05 14:14:44 +00:00
Jean-Philippe Lang
e54d183d20 Ability to send an email with password when changing a user's password (#3566).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2813 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-07-05 14:06:14 +00:00
Jean-Philippe Lang
ad90811e40 Administration panel breadcrumbs (#3314).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2810 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-07-05 12:22:02 +00:00
Jean-Philippe Lang
937823a0d8 Keep status filter on the projects list when un/archiving a project (#3530).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2806 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-07-04 13:14:28 +00:00
Jean-Philippe Lang
ef8ef596de Fixes notice_failed_to_save_issues string in various locales (#3574).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2805 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-07-04 12:55:56 +00:00
Jean-Philippe Lang
da22a9c8d6 Do not require a non-word character after a comma in Redmine links (#3561).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2804 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-07-04 12:48:25 +00:00
Jean-Philippe Lang
5afa190a9a Adds issue last update timestamp (#3565).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2803 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-07-04 12:36:26 +00:00
Jean-Philippe Lang
00f7a02959 Set trunk version to latest stable release (#3233).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2802 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-07-04 12:17:02 +00:00
Jean-Philippe Lang
9c287a0f98 DE locale update.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2801 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-07-04 12:13:11 +00:00
Jean-Philippe Lang
6994d1c23b Actually block issues from closing when a blocking issue isn't closed (#1740).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2800 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-07-04 12:07:03 +00:00
Jean-Philippe Lang
85f634481e Fixed: login form fields have different width with IE (#3582).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2799 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-07-04 07:57:04 +00:00
Jean-Philippe Lang
202d01664a Do not use settings/settings partial name in sample plugin (#3557).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2798 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-07-02 18:40:06 +00:00
Jean-Philippe Lang
6ff5891100 Fixes links to wiki atom feed (#3581).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2797 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-07-02 18:21:45 +00:00
Jean-Philippe Lang
a7bb63a182 Fixed: case sensitivity in issue subject filtering (#3536).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2796 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-06-28 12:12:27 +00:00
Jean-Philippe Lang
aa07e8505e Fixes wiki diff escaping.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2794 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-06-28 11:55:49 +00:00
Jean-Philippe Lang
14c7a887ee Fixes broken --unknown-user option in mailhandler script (#3514).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2793 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-06-25 16:16:59 +00:00
Jean-Philippe Lang
72a396227a Fixes default data loader broken by r2777 (#3507).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2792 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-06-23 20:17:47 +00:00
Eric Davis
2221d68c4d Added workaround for a Ruby BigDecimal bug, CVE-2009-1904. (#3475)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2790 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-06-14 16:22:23 +00:00
Jean-Philippe Lang
b3afde14fa Ability to accept incoming emails from unknown users (#2230, #3003).
An option lets you specify how to handle emails from unknown users:
* ignore: the email is ignored (previous and default behaviour)
* accept: the sender is considered as an anonymous user
* create: a user account is created (username/password are sent back to the user)

Permissions have to be consistent with the chosen option. Eg. if you choose 'create', the 'Non member' role must have the 'Add issues' permission so that an issue can be created by an unknown user via email. If you choose 'accept', the 'Anonymous' role must have this permission.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2789 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-06-14 14:48:34 +00:00
Jean-Philippe Lang
c48193f8c1 Ignores test repositories.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2788 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-06-14 10:07:38 +00:00
Jean-Philippe Lang
7642b5a9ab Fixed: editing a message may cause sticky attribute to be NULL (#3356).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2787 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-06-14 09:19:20 +00:00
Jean-Philippe Lang
5e76040256 Fixes drop-down list selected value (#3472).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2786 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-06-13 09:32:23 +00:00
Eric Davis
724cf47605 Added the Rails i18n language file to the plugin generator.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2785 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-06-10 03:39:02 +00:00
Eric Davis
97383f78d0 Added an empty tmp/test directory so rake test will run out of the box.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2784 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-06-08 02:07:30 +00:00
Eric Davis
199b213bbb Converted script/about to use Unix line ending. It has DOS line endings and would fail.
(#3387)

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2783 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-06-07 18:22:27 +00:00
Jean-Philippe Lang
ddd14fe86b Fixes locales broken by r2781 (#3456).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2782 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-06-07 12:36:46 +00:00
Azamat Hackimov
43995a43a5 Translation updates (#3401, #3409, #3434, #3446)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2781 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-06-06 17:20:01 +00:00
Jean-Philippe Lang
6a54a0c94c Fixed: Bazaar "[merge]" tags parsing fails (#3445).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2780 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-06-06 10:49:36 +00:00
Jean-Philippe Lang
9c282842a9 Do not start user session when accessing atom feed with token-based authentication.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2779 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-06-06 10:20:27 +00:00
Jean-Philippe Lang
6da0542af4 Delete previous tokens when creating a new one.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2778 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-06-02 17:24:50 +00:00
Eric Davis
62e58f26b0 Changed Enumerations to use a Single Table Inheritance
* Added migrations to change Enumerations to an STI relationship
* Added TimeEntryActivity model (STI)
* Added DocumentCategory model (STI)
* Added IssuePriority model (STI)
* Added Enumeration#get_subclasses to get a list of the subclasses of Enumeration
* Changed Enumeration to use the STI type field instead of the opt field
* Changed Enumeration#opt to return the old opt values but with a deprecation warning.
* Removed Enumeration::OPTIONS
* Removed the dynamic named_scopes in favor of specific named_scopes.  Kept for
  compatibility reasons.
* Added Enumeration#default so each subclass can easily find it's default record.
* Fixed Enumeration#default to use the STI scoping with a fake default scope for finding Enumeration's default.
* Added a 'all' named scope for getting all records in order by position.
* Added Deprecation warnings to the old named_scopes in Enumerations.
* Moved various methods off of Enumeration and onto the concrete classes
* Changed the EnumerationsController to use types
* Updated the Enumeration list template
* Added has_many relationships to the Enumeration STI classes.
* Fixes for tests.

  #3007

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2777 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-30 23:30:36 +00:00
Eric Davis
fbfb349496 Added Redmine::Info.issue to get links to specific issue numbers.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2776 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-30 23:00:22 +00:00
Eric Davis
211b13c9ec Added plugin hook, :controller_timelog_edit_before_save. (#3341)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2775 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-30 22:49:39 +00:00
Eric Davis
4ba8308507 Added more plugin hooks:
* :controller_messages_new_after_save
* :controller_messages_reply_after_save
* :controller_wiki_edit_after_save

  #3306

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2774 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-30 22:43:01 +00:00
Eric Davis
ea7ff8dd76 Added hook, :model_changeset_scan_commit_for_issue_ids_pre_issue_update. #3279
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2773 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-30 22:34:27 +00:00
Eric Davis
3224773ada Added two plugin hooks to the account page:
* :view_account_left_bottom
* :view_account_right_bottom

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2772 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-30 22:09:49 +00:00
Eric Davis
964245e30a Added :view_versions_show_contextual hook. (#3036)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2771 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-30 21:57:47 +00:00
Eric Davis
68c7af6c91 Fixed failing test in #3391. Quotes (") are html escaped.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2770 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-30 21:47:10 +00:00
Jean-Philippe Lang
c082cfc90e FIxed: inline images not displayed in atom feeds (#3391).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2768 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-26 08:28:36 +00:00
Jean-Philippe Lang
5db407ca59 Render new message form if needed.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2767 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-25 20:38:59 +00:00
Jean-Philippe Lang
53b002b497 Add plugins information to script/about (#3387).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2766 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-25 19:10:26 +00:00
Jean-Philippe Lang
85ce903cfa Ability to watch a wiki or a single wiki page (#413).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2765 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-25 19:02:28 +00:00
Jean-Philippe Lang
9c630cc2b7 Fixed: Atom feeds leak email address (#3408).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2763 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-25 18:11:32 +00:00
Jean-Philippe Lang
bd42b7cd9e Validate project identifier only when changed (#3352).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2762 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-25 18:01:27 +00:00
Jean-Philippe Lang
70340910de Link to the appropriate repository (#3376).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2760 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-18 17:45:45 +00:00
Azamat Hackimov
2a5369e37d ru.yml translation, adding to zh.yml missed string
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2759 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-18 14:34:47 +00:00
Azamat Hackimov
d1ee28758f Translation updates (#3374, #3375, # 3378, #3380, #3381)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2758 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-18 14:11:02 +00:00
Eric Davis
6bdd07275b Fixed an interpolation argument error in nl.yml
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2757 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-17 18:10:28 +00:00
Jean-Philippe Lang
fe8f4e5b87 Fixes code comments.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2756 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-17 15:32:48 +00:00
Jean-Philippe Lang
1d5479c1af Translations updates.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2755 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-17 14:37:26 +00:00
Jean-Philippe Lang
52b5b29203 Adds a setting to choose which role is given to a non-admin user who creates a project (#1007).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2754 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-17 14:35:00 +00:00
Jean-Philippe Lang
ce8bd16020 Translations updates.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2752 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-17 14:04:08 +00:00
Jean-Philippe Lang
7f94e3446f Translations updates.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2751 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-17 13:56:53 +00:00
Jean-Philippe Lang
8141110eb2 Ability to allow non-admin users to create projects (#1007).
This can be enabled in permissions settings. A non-admin user who creates a project is automatically added as a project member (the first role is given, TODO: make this given role configurable).
Projects can be added from the public projects list.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2750 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-17 12:59:14 +00:00
Jean-Philippe Lang
9c9dc6e814 Adds email notification on wiki changes (#413). It's disabled by default and can be enabled in application settings.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2749 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-17 09:55:13 +00:00
Jean-Philippe Lang
6e0a818caf Makes issues/show accept rss key (#3362).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2745 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-17 08:35:57 +00:00
Jean-Philippe Lang
f7d7186c13 Fixed: issue status bulk edit broken by r2726 (#3347).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2744 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-14 18:18:29 +00:00
Jean-Philippe Lang
e9a6730f4a Ability to use any custom field as a cross-project custom query column (#3321).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2743 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-13 17:32:15 +00:00
Jean-Philippe Lang
b87753c90d Do not autologin if more that one token is found (#3351).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2742 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-13 16:56:31 +00:00
Jean-Philippe Lang
f5eb1be268 Add token value uniqueness validation (#3351).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2741 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-13 16:55:15 +00:00
Jean-Philippe Lang
3e52383988 Use ActiveSupport::SecureRandom to generate tokens (#3351).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2740 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-13 16:54:32 +00:00
Jean-Philippe Lang
e5ed2b0f73 Fixed: issue bulk edit view broken by r2726 (#3347).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2739 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-13 16:06:14 +00:00
Jean-Philippe Lang
566d0a6ceb Fixed: issue move by non-admin broken by r2726 (#3354).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2738 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-13 15:58:54 +00:00
Jean-Philippe Lang
09a613b035 Escape custom field name.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2737 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-12 19:08:04 +00:00
Jean-Philippe Lang
5ab33bca8e Sort roles on account view.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2736 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-12 19:06:45 +00:00
Jean-Philippe Lang
a09f0e0e74 Escape role name.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2735 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-12 19:06:22 +00:00
Jean-Philippe Lang
da2854cf75 Display all users roles on project overview (#3339).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2734 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-12 19:04:52 +00:00
Jean-Philippe Lang
3df4df3438 script/about updated (#3333).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2733 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-12 17:22:06 +00:00
Jean-Philippe Lang
bae7579a72 Fixes Redmine.pm broken by r2726 (#3330).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2732 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-12 16:56:23 +00:00
Jean-Philippe Lang
c6efc90041 Cleaning projects administration list.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2731 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-10 11:36:12 +00:00
Jean-Philippe Lang
fba02769f3 Removes untranslated string.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2730 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-10 11:33:02 +00:00
Jean-Philippe Lang
bbb5a47b2a Clear member_roles table before populating it.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2729 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-10 11:18:09 +00:00
Jean-Philippe Lang
88532b6817 Fixes project members copy with multiple roles.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2728 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-10 11:17:23 +00:00
Jean-Philippe Lang
682c5d1113 Follows r2720 (#3308).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2727 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-10 11:06:29 +00:00
Jean-Philippe Lang
7dccf9fda6 Allows multiple roles on the same project (#706). Prerequisite for user groups feature.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2726 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-10 10:54:31 +00:00
Jean-Philippe Lang
814e138c2a Slight change to the permissions report view, with folding support.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2725 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-10 10:43:19 +00:00
Jean-Philippe Lang
9f59538241 Fixes consistency of custom fields display on the issue detail view (#3190).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2724 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-10 10:36:40 +00:00
Jean-Philippe Lang
752e263d3a Accept any svn tunnel scheme in repository URL (#3278).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2723 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-10 10:08:02 +00:00
Jean-Philippe Lang
a7ea14f5af Prevent nil error when retrieving svn version (#3268).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2722 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-10 09:49:39 +00:00
Jean-Philippe Lang
7319e8e235 Adds wiki comments length validation (#3308).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2720 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-10 08:49:45 +00:00
Jean-Philippe Lang
7e1ac0e602 Same as fix as r2705 from Trac wiki pages attachments (#3291).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2718 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-10 08:39:23 +00:00
Jean-Philippe Lang
3704653c7a Removes hardcoded table names in Repository#clear_changesets.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2715 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-08 08:05:45 +00:00
Eric Davis
0985d4219c Link projects and users in the issue list.
#3086

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2713 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-06 04:47:20 +00:00
Eric Davis
f90b85f8be Link the project name in simple issue lists.
#3085

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2712 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-06 04:47:13 +00:00
Jean-Philippe Lang
1930cf3d46 Adds group folding on issue list (#2679).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2711 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-04 18:04:09 +00:00
Jean-Philippe Lang
19f44cd1cb Disable email notifications before importing data.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2710 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-04 17:41:52 +00:00
Jean-Philippe Lang
0a0d14d5a7 Fixes r2707.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2708 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-04 16:55:47 +00:00
Jean-Philippe Lang
476ea76efb Fixes Mantis importer broken by 2670.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2707 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-04 16:53:05 +00:00
Jean-Philippe Lang
ad1ffa06a0 Fixed Trac importer broken by r2670 (#3254).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2705 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-04 16:48:27 +00:00
Eric Davis
fa7bd1c71d Added the ability to copy a project in the Project Administration panel.
* Added Copy project button.
* Added Project#copy_from to duplicate a project to be modified and saved by the user
* Added a ProjectsController#copy based off the add method
** Used Project#copy_from to create a duplicate project in memory
* Implemented Project#copy to copy data for a project from another and save it.
** Members
** Project level queries
** Project custom fields
* Added a plugin hook for Project#copy.

  #1125  #1556  #886  #309

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2704 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-03 21:25:37 +00:00
Jean-Philippe Lang
29c0dae151 Adds hostname to Redmine links in atom feeds (#3275).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2699 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-01 11:39:22 +00:00
Jean-Philippe Lang
9fd14713c5 Fixes user edit urls (#3281).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2698 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-05-01 11:25:41 +00:00
Jean-Philippe Lang
d984422a1f Fixes self and alternate atom links (#3161).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2697 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-26 20:12:58 +00:00
Jean-Philippe Lang
b557393252 Ticket grouping (#2679).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2696 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-26 13:09:14 +00:00
Jean-Philippe Lang
24875be705 Adds .erb mime type.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2695 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-25 11:40:50 +00:00
Jean-Philippe Lang
32c09fd5cf Adds more css classes to the roadmap issues (#3214).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2694 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-25 11:28:48 +00:00
Jean-Philippe Lang
8887b6f3d3 Adds the filename to the html title of attachment view.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2693 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-25 09:35:14 +00:00
Jean-Philippe Lang
15a14e55cd Returns a 404 error when trying to view/download an attachment that can't be read from disk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2692 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-25 09:31:36 +00:00
Jean-Philippe Lang
914ef1cb25 Slight gantt export refactoring (#3229).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2690 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-25 09:05:31 +00:00
Jean-Philippe Lang
73ca9d9161 Fixes a javascript comment (#3238).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2689 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-25 08:53:14 +00:00
Eric Davis
5ab582387e Added some new view hooks to the welcome page.
* :view_welcome_index_left
* :view_welcome_index_right

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2687 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-24 21:25:10 +00:00
Eric Davis
1be0b8f0cb Added two new plugin hooks to the Project Overview page
* :view_projects_show_left
* :view_projects_show_right

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2686 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-24 21:25:03 +00:00
Jean-Philippe Lang
070c18746e Fixed: %0.2f is rendered as plain text in issues/destroy view (#3167).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2685 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-24 17:18:36 +00:00
Jean-Philippe Lang
5d77f92ae6 Fixes a translation key (#3167).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2684 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-24 17:03:22 +00:00
Jean-Philippe Lang
7a5fe1c875 Fixed: Calendar popup broken by i18n refactoring (#3168).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2683 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-24 17:00:25 +00:00
Jean-Philippe Lang
a7e32302a6 Adds single forum atom feed (#3181).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2682 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-24 16:51:07 +00:00
Jean-Philippe Lang
6385217be0 Prevent recursive calls to RepositoriesHelper#repository_field_tags (#3226).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2680 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-24 15:54:48 +00:00
Jean-Philippe Lang
ac6ecdb360 Fixed: Mercurial integration doesn't work if redmine is installed in folder path containing space (#3159).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2679 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-21 16:05:04 +00:00
Jean-Philippe Lang
31cf9be7ab Makes minimum password length configurable.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2678 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-21 13:43:57 +00:00
Jean-Philippe Lang
6bb5508387 Less aggressive textile image tag parsing (#3209).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2677 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-21 12:49:16 +00:00
Jean-Philippe Lang
bb44430b63 Ask user what to do with child pages when deleting a parent wiki page (#3202).
3 options are available:
* move child pages as root pages
* move child pages to another parent page
* delete all descendants

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2676 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-21 12:19:56 +00:00
Azamat Hackimov
65cbd94e42 fix for he.yml (#3204), thank Orgad Shaneh for patch
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2675 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-19 21:43:46 +00:00
Jean-Philippe Lang
32ed656789 Fixed: an error is raised when no tab is available on project settings (#3179).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2674 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-19 08:45:00 +00:00
Jean-Philippe Lang
2a3fe1604a Fixed: Issue status in the notify email's subject is the issue's old status, should be its new status (#3194).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2673 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-19 08:33:56 +00:00
Jean-Philippe Lang
43200e2122 Adds mime type specific css classes to the SCM browser.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2672 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-19 08:25:25 +00:00
Azamat Hackimov
df2e0dbcd7 Translation updates: ru #3067, pl #3076, sv #3124, sk #3164, cs #3166, nl #3198
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2671 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-17 18:00:27 +00:00
Jean-Philippe Lang
a59854ef9d Fixes memory consumption on file upload (#3116).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2670 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-10 16:37:42 +00:00
Jean-Philippe Lang
10cbdf5d96 Create the journal after issue save (#3140).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2669 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-08 19:11:30 +00:00
Jean-Philippe Lang
c90878c817 Slight change to french locale.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2668 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-08 18:53:58 +00:00
Jean-Philippe Lang
1c03b98e5d Fixes that custom values length and attachment size validation error raises an error.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2667 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-08 16:56:01 +00:00
Jean-Philippe Lang
a4a41e05a8 Inform about minimum/maximum field lengths in error messages (#3128).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2666 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-07 17:50:17 +00:00
Jean-Philippe Lang
a6acc77904 Add test for r2664 (#3127).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2665 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-07 17:38:52 +00:00
Jean-Philippe Lang
bab9b0d6ff Allow textile mailto links (#3127).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2664 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-07 17:35:52 +00:00
Jean-Philippe Lang
81b84f641d Fixed: links to changesets in activity and atom feeds uses project id instead project identifier (#3137).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2663 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-07 17:30:56 +00:00
Jean-Philippe Lang
dea072f506 Set a default scope for 'My page' block names translations (#3057).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2659 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-05 13:33:54 +00:00
Jean-Philippe Lang
66839c12dd Replaces List-Id header with Precedence and Auto-Submitted headers (#2984, #2879).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2655 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-05 12:33:45 +00:00
Jean-Philippe Lang
ca166b30e1 Adds the ability to move threads between project forums (#2452). 'Edit message' permission is required.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2649 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-05 10:08:11 +00:00
Jean-Philippe Lang
3d65ed7aa0 Follows r2647.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2648 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-04 10:01:31 +00:00
Jean-Philippe Lang
b7127e3c14 Fixed: Sorting a query on a value that isn't in the displayed columns fails (#3078).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2647 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-04 10:00:22 +00:00
Jean-Philippe Lang
e40241761a Set minimum identifier lenght to 1 (#3073).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2646 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-04 09:55:17 +00:00
Jean-Philippe Lang
8c9fd662f0 Email footer signature convention (#3084).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2645 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-02 17:37:43 +00:00
Jean-Philippe Lang
5fbbdf7cb6 Make sure that lock_version changes are not stored in journals table (#3004).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2644 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-04-02 17:28:48 +00:00
Jean-Philippe Lang
801ad70cb7 Show timelog reports for non-versioned issues (#3051).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2643 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-30 20:09:57 +00:00
Jean-Philippe Lang
c9c269abf7 Update SVG library to latest stable (0.6.1) (#3056).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2642 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-30 19:58:17 +00:00
Jean-Philippe Lang
8d6d9a80d2 Fixed: News summary field is not searchable (#2998).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2641 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-28 12:43:21 +00:00
Jean-Philippe Lang
3d78a1b3f3 Test failure (#3041).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2640 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-28 12:30:48 +00:00
Jean-Philippe Lang
f1b5127cbb Fixes content vertical overflow (#3053).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2639 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-28 12:13:58 +00:00
Jean-Philippe Lang
04e181b8b0 Adds a user search field with autocompleter on project members screen.
User selection with checkboxes is disabled if there are more than 300 users available (#2993).

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2638 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-28 12:07:05 +00:00
Eric Davis
b4be8849c0 Added observers to watch model objects for mail delivery instead of calling Mailer.
* Added an IssueObserver to watch when Issues are created
* Added a JournalObserver to watch when Journals are created (Issue updates)
* Added a NewsObserver for News items.
* Added a DocumentObserver for Document notifications.
* Setup IssuesController#new to use the IssueObserver.
* Setup IssuesController#edit to use the IssueObserver.
* Setup IssuesController#bulk_edit to use the JournalObserver.
* Removed the Mailer call in Changeset#scan_commit_for_issue_ids, the
  JournalObserver will handle it.
* Removed Mailer calls in MailHandler in favor of the Observers.

  #2659

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2637 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-28 00:38:57 +00:00
Jean-Philippe Lang
3557e767e0 Escape member name.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2636 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-27 18:27:06 +00:00
Jean-Philippe Lang
90810c0741 Ability to add multiple project members in a single action (#1556).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2635 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-27 18:10:36 +00:00
Jean-Philippe Lang
c77806738a Fixes that "My Page" personalization was not storing reordered blocks (#2971).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2634 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-26 18:11:56 +00:00
Jean-Philippe Lang
b2a6176828 Slight change to fr locale.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2633 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-25 17:44:59 +00:00
Azamat Hackimov
064ba5d8cd Romanian update (#2900)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2630 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-24 19:20:53 +00:00
Azamat Hackimov
17cc0ba44a Bosnian (Bosanski), initial commit from Ernad Husremovic (#2976)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2629 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-24 19:16:02 +00:00
Azamat Hackimov
899aee4011 Translation updates: sv, zh, zh-TW (#3022, #3025, #3028)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2627 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-24 18:58:03 +00:00
Azamat Hackimov
53a8264436 fix #3038, thanks to Konstantin Kuznetsov for reporting
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2626 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-24 18:45:24 +00:00
Jean-Philippe Lang
72f3c7f921 Fixes Journal#save signature (#3014).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2615 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-23 17:18:04 +00:00
Azamat Hackimov
80acb00454 Fixing bug #3009, trivial updates of locales
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2614 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-22 20:33:21 +00:00
Azamat Hackimov
ad34778cb1 fast translation update (#2969, #2978, #2989, #2994, #2999, #3006)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2613 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-22 20:15:10 +00:00
Eric Davis
c2dfffd7f2 Added some RDoc documentation for some models.
Submitted by austenito on Github.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2612 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-21 00:39:53 +00:00
Eric Davis
451ef7f21f Added several more plugin hooks:
* :controller_custom_fields_new_after_save
* :controller_custom_fields_edit_after_save
* :view_custom_fields_form_upper_box
* :view_custom_fields_form_* (type of custom field)
* :view_issue_statuses_form
* :view_issues_show_description_bottom
* :view_my_account
* :view_users_form

  #2599

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2611 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-21 00:22:59 +00:00
Eric Davis
b67d624754 Added plugin hooks to the context menu
* :view_issues_context_menu_start
* :view_issues_context_menu_end

  #3013

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2610 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-21 00:01:48 +00:00
Eric Davis
e48cc150ec Added a plugin hook for :controller_account_success_authentication_after
#3019

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2609 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-20 23:52:42 +00:00
Eric Davis
40a039ce1c Updated INSTALL doc for Rails 2.2.2
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2600 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-19 03:34:45 +00:00
Eric Davis
7774642b03 Extend the settings.name column so it can fit longer plugin names.
#3010

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2599 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-19 00:01:24 +00:00
Jean-Philippe Lang
d516d9d9e5 Set sort orders on 'View all issues' links on my page.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2598 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-17 17:34:49 +00:00
Jean-Philippe Lang
ec378bb446 Makes the 'View all' link on 'Reported issues' list open and closed issues.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2597 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-17 17:31:02 +00:00
Jean-Philippe Lang
f0c676d3df Adds missing scope for r2595.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2596 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-17 17:30:14 +00:00
Jean-Philippe Lang
b44317b762 Adds issue count on assigned and reported 'My page' modules (#2986).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2595 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-17 17:27:30 +00:00
Jean-Philippe Lang
4181f85962 Fixes that user's last_login_on was not set when using registration with automatic activation.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2594 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-15 10:49:18 +00:00
Jean-Philippe Lang
175ac71b2c Rescue Redmine::DefaultData::DataAlreadyLoaded in redmine:load_default_data task.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2592 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-15 10:03:56 +00:00
Jean-Philippe Lang
47f264b15c Ability to set language for redmine:load_default_data task using REDMINE_LANG environment variable (#2847).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2591 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-15 10:01:04 +00:00
Jean-Philippe Lang
5fc7d097fe Fixing routes broken by r2581 (#2967, #2970).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2590 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-15 09:35:02 +00:00
Jean-Philippe Lang
9f45499936 Adds controller to urls in case the side bar is called from another controller (#2960).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2589 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-13 19:25:11 +00:00
Jean-Philippe Lang
7a3822448b pl update.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2588 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-13 19:08:44 +00:00
Jean-Philippe Lang
6a9fcb23d0 Adds a lang string with arguments for date ranges (#2305).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2587 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-13 19:03:34 +00:00
Jean-Philippe Lang
3f52a0d3e8 sv update.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2586 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-13 18:36:55 +00:00
Jean-Philippe Lang
57eadea091 Translations updates.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2585 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-13 18:35:19 +00:00
Jean-Philippe Lang
5eae20f3d4 zh-TW update.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2584 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-13 18:32:36 +00:00
Jean-Philippe Lang
48e7b11065 pt-BR update.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2583 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-13 18:27:51 +00:00
Jean-Philippe Lang
1e7962bfe9 Fixes broken CSV link on cross-project timelog report (#2941).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2582 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-13 18:06:47 +00:00
Jean-Philippe Lang
0100011e5c Fixing repository routes (#2967).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2581 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-13 17:45:47 +00:00
Jean-Philippe Lang
74d8739936 Adds a unique index on projects_trackers table (#2882).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2580 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-12 19:49:39 +00:00
Jean-Philippe Lang
eb7903c0ec Only retrieve query name for display.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2579 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-12 19:35:36 +00:00
Jean-Philippe Lang
a42e56f65d Fixes commit logs alignment in the repo browser (#2961).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2578 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-12 18:50:52 +00:00
Jean-Philippe Lang
adbe164246 Fixing tests (sort refactoring).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2577 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-12 18:43:19 +00:00
Jean-Philippe Lang
1852d907ba Fixes SortHelper examples (#2950).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2576 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-12 18:24:32 +00:00
Jean-Philippe Lang
73eb1580ae Fixed: zh-TW PDF export broken by new locales (#2940).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2575 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-12 18:22:54 +00:00
Jean-Philippe Lang
eb224378db Hide 'New file' link and form for printing (#2949).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2574 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-12 18:17:35 +00:00
Jean-Philippe Lang
b622e0f8ce Flush buffer when asking for language (#2948).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2573 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-12 18:11:44 +00:00
Jean-Philippe Lang
c7c8dc71f2 Ability to save "sort order" in custom queries (#2899).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2572 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-12 18:06:54 +00:00
Jean-Philippe Lang
2b585407cb SortHelper refactoring:
* multiple columns sort feature (#2871)
* CSS classes instead of an image tag to reflect the state of the column
* examples fixed (#2945)

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2571 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-10 21:11:36 +00:00
Jean-Philippe Lang
4f4d447224 Fixed: Files without Version aren't visible in the Activity page (#2930).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2569 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-08 14:31:15 +00:00
Jean-Philippe Lang
9701c33562 Adds css classes to the issues in the calendar (#2651).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2568 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-07 16:32:30 +00:00
Jean-Philippe Lang
89719e205e Adds 2 css classes (created-by-me and assigned-to-me) to issues created by or assigned to the current user (#2651).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2567 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-07 16:30:55 +00:00
Jean-Philippe Lang
03572ec569 Adds a sortable "Project" column to the issue list.
It's displayed by default on the cross-project issue list (#2889). It's also available for saved queries.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2566 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-07 15:58:39 +00:00
Jean-Philippe Lang
554e569de1 Adds a List-Id header to all emails (#2879).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2565 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-07 15:14:10 +00:00
Jean-Philippe Lang
04abeda1d7 Add doube quotes to user_name and password in email.yml.example (#2927).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2564 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-07 13:41:24 +00:00
Jean-Philippe Lang
7bd4590cd6 Transaction for each imported subversion changeset.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2563 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-07 13:32:33 +00:00
Jean-Philippe Lang
8375e98ade Fixes that Redmine::WikiFormatting.register did not raise ArgumentError when giving name as a string (#2856).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2562 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-07 12:57:16 +00:00
Jean-Philippe Lang
e67fbdc315 Test that account activation email contains the appropriate link (#2825).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2561 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-07 12:45:46 +00:00
Jean-Philippe Lang
36a55a0925 Change to line #'s links in file/repo viewer (#2835).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2555 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-07 11:02:40 +00:00
Jean-Philippe Lang
dc8b804eba Fixed: export links on the issue list lose project param after applying a filter (#2908).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2554 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-06 22:46:49 +00:00
Jean-Philippe Lang
009b685b1d Fixed: MailHandler raises an error when processing an email without From header (#2916).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2553 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-06 18:25:19 +00:00
Jean-Philippe Lang
02ecc8aa15 Fixes typo in locales (#2805).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2552 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-04 18:09:15 +00:00
Jean-Philippe Lang
608d6683da Fixed broken OpenID authentication after migration to Rails 2.2 (#2894).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2551 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-04 17:37:28 +00:00
Jean-Philippe Lang
0d86bbf3ad Added missing field_content translation (#2896).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2550 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-04 17:29:02 +00:00
Jean-Philippe Lang
bd8ae3547e Removes double % in locales (#2891).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2549 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-04 17:13:05 +00:00
Jean-Philippe Lang
3227b32763 Adds some functional tests.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2547 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-01 12:58:30 +00:00
Jean-Philippe Lang
47f5713b1e Reorder links refactoring (follows r2526).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2546 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-01 12:03:48 +00:00
Jean-Philippe Lang
56bdcf407f Adds some functional tests.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2545 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-01 11:39:01 +00:00
Jean-Philippe Lang
df6e29f766 Removes unused code.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2544 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-01 10:56:20 +00:00
Jean-Philippe Lang
59dec17ddf Fixes a failure when running rake test:coverage.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2543 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-01 10:55:01 +00:00
Jean-Philippe Lang
38db62f1e7 Fixed that some error messages were not displayed (#2866).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2542 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-01 10:15:38 +00:00
Jean-Philippe Lang
b78349d2ca Fixed: Undefined Method (l_YesNo) Being Called (#2867).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2541 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-01 10:00:52 +00:00
Azamat Hackimov
700df9da8e small update
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2540 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-01 07:04:26 +00:00
Azamat Hackimov
71b55e54bf localization updates
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2539 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-03-01 07:03:07 +00:00
Jean-Philippe Lang
a95a8aa40b Fixes tests broken by r2532 (#2853).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2535 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-28 09:21:49 +00:00
Jean-Philippe Lang
e63ccffd59 Add links for one-click activity filtering (#2857).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2534 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-27 18:34:08 +00:00
Jean-Philippe Lang
9fe6bcac74 Fixes user's activity link (#2853).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2532 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-27 12:08:52 +00:00
Jean-Philippe Lang
4d892fd6d0 Fixes #2851.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2531 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-27 11:32:43 +00:00
Jean-Philippe Lang
0aebb69c45 Updates sample plugin README.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2530 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-26 16:37:48 +00:00
Jean-Philippe Lang
d40bf20131 Allow My Page blocks to be added to from a plugin (#2840).
Partials must be placed under the app/views/my/blocks directory of the plugin.
An example can be found in the sample plugin.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2529 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-26 16:36:56 +00:00
Jean-Philippe Lang
5b96d1b083 Allow underscore in block partial name (#2840).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2528 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-26 16:15:07 +00:00
Jean-Philippe Lang
4c28291a19 Clickable/linkable line #'s while browsing the repo or viewing a text file (#2835).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2527 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-26 09:28:33 +00:00
Jean-Philippe Lang
589320337d Trackers controller refactoring.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2526 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-26 09:21:41 +00:00
Jean-Philippe Lang
46f52d306d Applies r1723 on Engines update to allow view override (#2841).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2525 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-26 08:59:30 +00:00
Jean-Philippe Lang
21eb3c089d Fixed: When logging in via an autologin cookie the user's last_login_on should be updated (#2820).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2524 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-25 14:59:33 +00:00
Jean-Philippe Lang
94cc23f103 Adds missing time format in locales (#2831).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2523 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-25 09:41:58 +00:00
Eric Davis
4baf32b166 Fixing Plugin and Mailer default_url_options.
Both the plugin hooks and Mailer were setting default_url_options incorrectly
and causing ActionContoller::UrlWritter to cache the settings on the module
(mattr_accessor) causing several url generators to fail in either the plugin
hooks or the Mailer.

* Replaced Mailer's use of the default_url_options accessor with the proper class method
* Replaced Hook's use of the default_url_options accessor with the proper class method on the ViewListener class
* Added a test to reproduce the bugs in the Mailer when a hook is registered (thanks Chaoqun Zou)

  #2542

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2522 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-25 07:25:01 +00:00
Jean-Philippe Lang
0f68334f0b Fixed that MailHandler#plain_text_body was returning nil if there was nothing to strip (#2814).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2520 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-23 17:35:16 +00:00
Jean-Philippe Lang
0101e609f7 Sort changesets in the same order as comments on the issue details view (#1546).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2519 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-22 15:16:18 +00:00
Jean-Philippe Lang
a64b8695c8 Patch ActiveRecord::Errors#full_messages so that it contains custom values error messages.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2518 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-22 14:46:32 +00:00
Jean-Philippe Lang
67fd5f3dc9 Fixed: visited links to closed tickets are not striked through with IE6 (#2615).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2516 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-22 11:22:23 +00:00
Jean-Philippe Lang
7342a00e0a Slight changes to the files list (#2658, #2806).
* Adds a link to the version
* Moves styles to the stylesheet
* Indent the files

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2515 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-22 11:04:17 +00:00
Azamat Hackimov
0123f7cde0 New shiny locale config update - pt-BR (thank to Alexandre da Silva, #2802)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2511 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-21 19:20:49 +00:00
Jean-Philippe Lang
4596a35c0e Changes default english date/time formats.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2510 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-21 16:44:56 +00:00
Jean-Philippe Lang
82ea6c001d Translation update (#2798).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2509 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-21 16:41:31 +00:00
Jean-Philippe Lang
8cc8f5164d Adding more missing strings.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2508 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-21 16:25:38 +00:00
Jean-Philippe Lang
84de5fa3b0 Makes the default issue list columns selection look like other multi-checkbox fieldsets.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2507 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-21 16:15:44 +00:00
Jean-Philippe Lang
0624bdb6c9 Adds missing strings.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2506 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-21 16:10:51 +00:00
Jean-Philippe Lang
1c5a2ddfb0 Limit the size of repository files displayed inline too.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2505 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-21 16:04:51 +00:00
Jean-Philippe Lang
79c074dbe5 Fixes new setting name.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2504 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-21 15:44:00 +00:00
Jean-Philippe Lang
66afc8c054 Adds a setting to limit the size of text attachments that can be displayed by the file viewer (default set to 512KB). Larger files are sent for download.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2503 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-21 15:34:11 +00:00
Jean-Philippe Lang
2bd419f23b Process all translations files.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2502 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-21 15:21:31 +00:00
Jean-Philippe Lang
1770fe54be Adds locales:update task as a replacement for gloc:update.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2501 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-21 15:11:09 +00:00
Jean-Philippe Lang
1511b31377 Add missing 'support' section to he and it locales.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2500 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-21 14:10:46 +00:00
Jean-Philippe Lang
79fd564b61 Do not show the changed files list on the revision page if the user is not allowed to browse the repository (#2762).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2499 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-21 12:58:18 +00:00
Jean-Philippe Lang
9c4a86d96c Moves project menu tests to a dedicated integration test.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2498 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-21 12:28:19 +00:00
Jean-Philippe Lang
9819a6bfd1 Fixes menu translation.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2497 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-21 11:31:22 +00:00
Jean-Philippe Lang
95ba220b79 Adds rake config/initializers/session_store.rb to the install doc.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2496 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-21 11:13:37 +00:00
Jean-Philippe Lang
6b770fa70c Deprecated truncate call.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2495 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-21 11:10:34 +00:00
Jean-Philippe Lang
cf70f187dd Fixes UsersControllerTest.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2494 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-21 11:07:22 +00:00
Jean-Philippe Lang
fe28193e4e Merged Rails 2.2 branch. Redmine now requires Rails 2.2.2.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2493 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-21 11:04:50 +00:00
Eric Davis
9a986ac0a5 Refactored the mess known as Hook default_url_options in favor of the simpler
:only_path as suggested by splatteal on GitHub.

  #2542

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2491 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-21 00:23:28 +00:00
Eric Davis
00b568c194 Implementing the missing tests now that HookTest has a cleaner setup.
Controller and Views are now tested through the Redmine::Hook::Helper module.

  #2542

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2490 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-21 00:23:22 +00:00
Eric Davis
b6c4b21b47 Refactored the HookTest methods to use Redmine::Hook::Helper instead
of the Redmine::Hook class directly.  Redmine::Hook::Helper is the
public API so it should be one that is tested.

  #2542

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2489 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-21 00:23:16 +00:00
Eric Davis
3fa9535670 List the Default Columns displayed on the issue list vertically
instead of horizontally so it's easier to read.

  #2745

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2488 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-20 22:59:59 +00:00
Eric Davis
befe278fa9 Allow the other format links to appear on the issue list (ATOM, PDF, CSV).
#2779

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2487 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-20 22:45:16 +00:00
Jean-Philippe Lang
b9e95e7a70 Fixes "too few arguments" error on activerecord error translation (#2626).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2486 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-20 18:55:56 +00:00
Jean-Philippe Lang
33e7ae96ad Adds (a maximum of 3) links to project ancestors in the page title (#2788).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2485 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-20 18:34:57 +00:00
Jean-Philippe Lang
04c428e059 Send an email to the user when an administrator activates a registered user (#2656).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2484 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-20 17:04:47 +00:00
Eric Davis
24ee6b9a1b Fixed the bug in the OpenID registration where the form wouldn't take a login
AccountController#open_id_authenticate was adding an auth_source_registration
to the session which caused AccountController#register to use the wrong codepath.

  #2757

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2483 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-20 00:31:50 +00:00
Eric Davis
aed1787d51 Fixed a bug in the OpenID login when a user signed up with OpenID but hasn't
been activated yet.

When logging in the user would come back to the login page with the back_url
of My Page.  This was caused by open_id_authenticate sending the user to My Page
and My Page redirecting the user back to the login page because they haven't
been activated.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2482 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-20 00:16:45 +00:00
Jean-Philippe Lang
9525e5f147 Fixes Setting.openid? (#2764).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2481 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-19 21:03:08 +00:00
Azamat Hackimov
5966f71c73 translation updates: hu (#2737), sv (#2740), pl (#2741), pt-br (#2781)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2480 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-18 19:20:56 +00:00
Azamat Hackimov
ee4a754475 translation updates: zh, zh-tw (#2743, #2758), ru
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2479 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-18 19:15:10 +00:00
Nicolas Chuche
6359e51477 Fixed: add group option to set the repository gid. Default is root (#2747)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2478 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-16 19:33:43 +00:00
Jean-Philippe Lang
d643d9a94c Fixed: User#identity_url raises an error when invalid url is supplied (#2742).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2476 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-15 18:46:50 +00:00
Jean-Philippe Lang
3183445aea Makes the "type" field disabled when updating a custom field (#2744).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2475 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-15 16:55:48 +00:00
Jean-Philippe Lang
9e4a118528 Create a wiki with a default start page named 'Wiki' when enabling wiki module (#2657).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2474 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-15 16:43:06 +00:00
Jean-Philippe Lang
b05ed594a0 Do not DELETE/INSERT enabled_modules when updating project modules.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2473 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-15 16:26:48 +00:00
Jean-Philippe Lang
4601ed2f3a Replaces Enumeration.get_values and Enumeration.default with named scopes.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2472 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-15 13:33:09 +00:00
Jean-Philippe Lang
13e2c727cf Updates 0.8.1 CHANGELOG.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2468 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-15 09:02:41 +00:00
Jean-Philippe Lang
d77be4e908 Removes invalid css class on issue details (#2753).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2467 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-15 08:33:48 +00:00
Jean-Philippe Lang
d3038eee92 Adds an index on watchers table to speed up watched issue filtering.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2466 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-14 19:06:44 +00:00
Jean-Philippe Lang
1c2cdedf19 Fixes headings style in html emails (#2739).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2465 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-14 18:32:11 +00:00
Jean-Philippe Lang
f9c9b054ba Timelog is ignored when updating an issue if user is admin but not a project member (#2717).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2463 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-13 17:59:45 +00:00
Jean-Philippe Lang
bbc8d3d768 Removes invalid css class on issue details (#2733).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2461 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-13 17:29:49 +00:00
Jean-Philippe Lang
b8eddf2014 Adds watch/unwatch link on the issue context menu (#2730).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2460 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-12 22:14:22 +00:00
Jean-Philippe Lang
9586269a06 Issues pagination loses project param after applying or clearing filter (#2726).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2459 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-12 22:01:20 +00:00
Jean-Philippe Lang
ff9da0bab0 Removes the fat ruby-openid gem. Simply use 'gem install ruby-openid' to enable openid support.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2458 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-12 21:25:50 +00:00
Jean-Philippe Lang
5bdd429162 Link to watched issues list on my page.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2457 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-12 17:38:36 +00:00
Jean-Philippe Lang
e1b828de95 Adds ability to filter watched issues (#846).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2456 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-12 17:35:57 +00:00
Jean-Philippe Lang
571494a028 Adds missing strings (#699).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2455 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-12 17:30:56 +00:00
Jean-Philippe Lang
2807b9c927 Hide openid stuff on my account if disabled (#699).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2454 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-12 17:19:32 +00:00
Eric Davis
60dc357271 Normalize the identity_url when it's set.
OpenId uses a specific format for the url it uses which requires the protocol
and trailing slash.  This change will normalize the value to when a user sets it.

  #699

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2453 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-12 04:31:28 +00:00
Eric Davis
14e445c600 Fixed the bundled ruby-openid gem
* The open_id_authentication plugin will require the gem automatically so
  it doesn't need to be added to environment.rb
* Changed the version requirement on the open_id_authentication to match
  the latest stable version.  Rails config.gem looks for a directory named
  after that specific version and will not load newer versions.

  #699

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2452 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-12 01:32:50 +00:00
Jean-Philippe Lang
4500b606ce Slight changes to the issue lists displayed on My page.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2451 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-11 20:25:05 +00:00
Eric Davis
f1b8bf22a2 Added a space so words don't runtogeatherlikethis. #699
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2450 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-11 19:45:53 +00:00
Eric Davis
8d53e433c5 Added a system setting for allowing OpenID logins and registrations
* Defaults to off
* Is set in the Administration panel under Authentication

  #699

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2449 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-11 19:24:28 +00:00
Eric Davis
85ad791d81 Prevent registration via OpenID if self registration is off. #699
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2448 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-11 19:07:41 +00:00
Eric Davis
720f928cd2 Refactored common methods out of register and open_id_authenticate
* Extracted register_by_email_activation
* Extracted register_automatically
* Extracted register_manually_by_administrator

  #699

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2447 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-11 19:07:34 +00:00
Eric Davis
8194cfaf86 Added user setup needed based on the system's registration settings
* Copied the register action's chunk of code used to setup the account
  based on Setting.self_registration
* Extracted method for when onthefly_creation_failed
* Added tests to confirm the behavior

  #699

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2446 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-11 19:07:28 +00:00
Eric Davis
876fb69271 Added tests for the other OpenID authentication cases. #699
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2445 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-11 19:07:23 +00:00
Eric Davis
48e26aa75b Adding OpenID mock and test. #699
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2444 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-11 19:07:18 +00:00
Eric Davis
0310f43126 Hooked up on the fly OpenID user creation.
* Use OpenID registration fields for the user.
* Generate a random password when a user is created.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2443 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-11 19:07:12 +00:00
Eric Davis
896e64b759 Added the ability to login via OpenID.
* Refactored AccountController#login to use either
  password or openid based authentication
* Extracted AccountController#successful_authentication
  to setup a user's session cookies and redirect
* Implemented the start of AccountController#open_id_authentication
  which will check with the OpenID server and perform authentication.
* Added text field for the OpenID url to /login
* Added identity_url for OpenID to the user forms.
* Added option to login with OpenID to the register form.
* Added a root url route, which is used by the OpenID plugin

  #699

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2442 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-11 19:07:07 +00:00
Eric Davis
a4e6e13b70 Fixed a bug in open_id_authentication, where relative_url_root is defined
on ActionController:AbstractRequest not Base

  #699

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2441 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-11 19:07:00 +00:00
Eric Davis
dbf02e2654 Added identity_url to User. #699
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2440 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-11 19:06:55 +00:00
Eric Davis
ca3960dee5 Added OpenID tables. #699
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2439 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-11 19:06:50 +00:00
Eric Davis
30171f3ab6 Added open_id_authentication plugin
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2438 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-11 19:06:45 +00:00
Eric Davis
f70be197e0 Unpacked OpenID gem. #699
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2437 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-11 19:06:37 +00:00
Jean-Philippe Lang
70efee1bc5 Leave wiki links untouched if target project doesn't exist or have no wiki.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2436 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-10 22:54:22 +00:00
Jean-Philippe Lang
8cf3d7a492 Replaces the repositories management SOAP API with a simple REST API.
reposman usage is unchanged but the script now requires activeresource.
actionwebservice is now longer used and thus removed from plugins.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2435 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-10 22:03:25 +00:00
Jean-Philippe Lang
cf5658d7fe Fixes broken action url on time edit form (#2707).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2434 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-10 17:18:19 +00:00
Azamat Hackimov
99fefbef52 New language - Macedonian (mk). Thank to Ilin Tatabitovski for work.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2433 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-10 16:05:31 +00:00
Azamat Hackimov
2ce37783ea Translation updates (#2643, #2645, #2668)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2432 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-10 15:57:52 +00:00
Azamat Hackimov
73f52af6e3 Updated translations (#2577, #2640, #2644, #2652)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2431 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-10 15:41:05 +00:00
Eric Davis
b75a30a21a Renamed variables to be more descriptive. #2542
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2430 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-10 03:12:45 +00:00
Eric Davis
5b7a5c39a7 Added request and controller objects to the hooks by default.
The request and controller objects are now added to all hook contexts by
default.  This will also make url_for work better in hooks by setting up
the default_url_options :host, :port, and :protocol.

Finally a new helper method @render_or@ has been added to ViewListener.  This
will let a hook easily render a partial without a full method definition.

Thanks to Thomas Löber for the original patch.  #2542

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2429 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-10 03:12:40 +00:00
Eric Davis
a3fa56d988 Added two new plugin hooks:
* :view_layouts_base_sidebar
* :view_layouts_base_content

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2428 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-10 01:24:32 +00:00
Eric Davis
0d01e07430 Added plugin hook :view_projects_roadmap_version_bottom. #2543
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2427 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-10 01:18:49 +00:00
Jean-Philippe Lang
2d3b3cee15 Strip keywords from received email body (#2436).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2426 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-09 20:17:58 +00:00
Jean-Philippe Lang
c687219113 Removes hardcoded table names (#2701).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2424 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-09 17:24:06 +00:00
Jean-Philippe Lang
27e3b31c1e Fixed: TypeError (can't modify frozen string) on settings view (#2700).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2423 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-09 17:18:41 +00:00
Jean-Philippe Lang
fc6d6b1e3b Fixed: migration 98 breaks when using table name prefix.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2415 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-08 17:24:39 +00:00
Jean-Philippe Lang
b998572def Fixed: path parameter is not an array when changing diff style (#2695), broken by r2317.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2399 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-07 20:11:03 +00:00
Jean-Philippe Lang
ff0c96011f Fixed: inline attached image should not match partial filename (#2683).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2363 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-05 20:25:01 +00:00
Jean-Philippe Lang
4aa90cc072 Typo in wiki link example (#2673).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2362 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-05 17:43:49 +00:00
Jean-Philippe Lang
b11a1d852c Closed issue are not overdue, fixes r2140 (#2337).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2361 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-03 17:32:07 +00:00
Jean-Philippe Lang
c9ca635fa7 Typos/fixes in views (#2654).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2360 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-03 17:15:59 +00:00
Jean-Philippe Lang
33bd7f45e1 Fixes message search eager loading (#2654).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2359 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-03 17:13:37 +00:00
Jean-Philippe Lang
bf107f000d Adds a 'box' div around news comment form (#2632).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2353 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-02 17:34:12 +00:00
Jean-Philippe Lang
299f1b87aa Include both version date and name when sorting issues by target version (#1502).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2352 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-01 20:57:44 +00:00
Jean-Philippe Lang
2a220a9e42 Include both last and first name when sorting issues by assignee (#1841).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2351 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-01 20:56:10 +00:00
Jean-Philippe Lang
ab5e07e83e Adds a setting to limit the number of revisions displayed on a repository file log (default=100).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2350 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-01 19:54:50 +00:00
Jean-Philippe Lang
d3b2049851 Use estimated hours to weight issues in version completion calculation (#2182).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2349 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-01 18:54:05 +00:00
Jean-Philippe Lang
d08ac5628a Changes color of activity events/search results summary.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2348 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-01 16:00:20 +00:00
Jean-Philippe Lang
4c312f3d6b Show line breaks in activity events summary.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2347 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-01 15:57:01 +00:00
Jean-Philippe Lang
cbdf900629 Do not repeat one-line commit logs on the activity view.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2346 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-01 15:48:56 +00:00
Jean-Philippe Lang
c83b41611a Fixed: Contextual divs after attachments are placed incorrectly in FireFox (#2633).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2345 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-02-01 14:36:38 +00:00
Jean-Philippe Lang
2ca4eea244 Less strict textile links parsing (#2582).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2344 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-31 14:50:56 +00:00
Jean-Philippe Lang
f021c856c1 Fixed: issue details view discloses relations to issues that the user is not allowed to view (#2589).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2343 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-31 13:22:29 +00:00
Jean-Philippe Lang
2679150ed4 Removes Issue.visible_by
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2342 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-31 12:48:09 +00:00
Jean-Philippe Lang
bbe8326477 Updates footer year.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2341 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-31 12:42:02 +00:00
winterheart
f794ae582c New translation - Slovenian, thank to Nejc Vidmar for work (#2577), translation updates (#2129, #2586)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2340 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-31 12:02:37 +00:00
Jean-Philippe Lang
ef903ba70e Adds :async_smtp and :async_sendmail delivery methods to perform email deliveries asynchronously.
Code from http://www.datanoise.com/articles/2006/7/14/asynchronous-email-delivery.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2339 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-31 11:43:54 +00:00
Jean-Philippe Lang
da941734d7 Changes time related icons.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2338 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-30 17:50:28 +00:00
Jean-Philippe Lang
0f494a53c9 Cleaning test.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2337 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-29 16:34:00 +00:00
Jean-Philippe Lang
cf566a0c72 Fixed: TOC does not parse wiki page reference links with description (#2601).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2336 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-29 16:33:45 +00:00
Jean-Philippe Lang
945ec8942a Adds projects association on tracker form (#2578).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2335 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-29 14:22:56 +00:00
Jean-Philippe Lang
32d4378198 Adds rel='nofollow' attribute to other formats download links (#2491).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2334 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-29 13:54:44 +00:00
Jean-Philippe Lang
f1aa0df326 Adds an helper to render other formats download links.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2333 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-29 13:53:17 +00:00
Jean-Philippe Lang
bf76988ebc Fixed an error when downloading gantt png at global level.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2332 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-29 12:26:32 +00:00
Jean-Philippe Lang
d590317856 Fixes other formats download links on the project issue list (project_id lost) broken r2317.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2331 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-29 11:09:46 +00:00
Jean-Philippe Lang
1e1b34b567 Sort target versions list on bulk edit form (#2616).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2330 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-29 09:05:36 +00:00
Jean-Philippe Lang
01d6ef2e57 Fixed project news atom link broken by r2317.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2329 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-28 21:25:35 +00:00
Jean-Philippe Lang
c4af6efd25 Fixing calendar and gantt links broken by r2317.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2328 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-28 21:20:39 +00:00
Jean-Philippe Lang
d1d1c9bfd0 Fixed calendar navigation links broken by r2317.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2327 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-28 21:11:13 +00:00
Jean-Philippe Lang
83fe973c75 Fixed user's activity atom feed broken by r2317.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2326 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-28 20:52:39 +00:00
Eric Davis
0bbebedada Fixed clearing the Issue filters in the issue list, broken by #2317
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2325 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-27 20:59:02 +00:00
Eric Davis
2fc7897044 Fixes Issue sorting in a project, broken by #2317
Issues were sorting but the project id wasn't being added so the
IssuesController would return all issues (cross-project).


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2324 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-27 20:42:19 +00:00
Jean-Philippe Lang
10994e9027 Fixed: users should not be able to add relations with issues they're not allowed to view (#2589).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2323 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-27 19:33:03 +00:00
Jean-Philippe Lang
cd55529eaa Fixed that 'My page' blocks may display issues that the user is no longer allowed to view (#2590).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2322 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-27 18:19:27 +00:00
Jean-Philippe Lang
837f074346 Explicitly require 'rfpdf/fpdf' (#2584).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2321 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-27 17:58:56 +00:00
Jean-Philippe Lang
a4544b0b26 Fixed actions on issues (gantt, calendar, move, bulk_edit...) at global level broken by r2317.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2320 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-27 17:40:55 +00:00
Jean-Philippe Lang
e1f96ca4db Replaces the obsolete robots.txt with a cached action (#2491).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2319 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-27 17:27:50 +00:00
Jean-Philippe Lang
6c93b8d599 Fixes activity pagination broken by r2317.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2318 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-26 17:43:58 +00:00
Eric Davis
765f7abc60 Converted routing and urls to follow the Rails REST convention.
Patch supplied by commits from Gerrit Kaiser on Github.  Existing routes will
still work (backwards compatible) but any new urls will be generated using the
new routing rules.

Changes listed below:

* made the URLs for some project tabs and project settings follow the new rails RESTful conventions of /collection/:id/subcollection/:sub_id
* prettier URL for project roadmap
* more nice project URLs
* use GET for filtering form
* prettified URLs used on issues tab
* custom route for activity atom feeds
* prettier repository urls
* fixed broken route definition
* fixed failing tests for issuecontroller that were hardcoding the url string
* more RESTful routes for boards and messages
* RESTful routes for wiki pages
* RESTful routes for documents
* moved old routes that are retained for compatibility to the bottom and grouped them together
* added RESTful URIs for issues
* RESTfulness for the news section
* fixed route order
* changed hardcoded URLs in tests
* fixed badly written tests
* fixed forgotten parameter in routes
* changed hardcoded URLS to new scheme
* changed project add url to the standard POST to collection
* create new issue by POSTing to collection
* changed hardcoded URLs in integrations tests
* made project add form work again
* restful routes for project deletion
* prettier routes for project (un)archival
* made routes table more readable
* fixed note quoting
* user routing
* fixed bug
* always sort by GET
* Fixed: cross-project issue list should not show issues of projects for which the issue tracking module was disabled.
* prettified URLs used on issues tab
* urls for time log
* fixed reply routing
* eliminate revision query paremeter for diff and entry actions
* fixed test failures with hard-coded urls
* ensure ajax links always use get
* refactored ajax link generation into separate method

  #1901


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2317 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-26 01:47:51 +00:00
Jean-Philippe Lang
bcc9007196 Ability to bulk edit custom fields of type 'list' (#461).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2316 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-25 16:04:28 +00:00
Jean-Philippe Lang
e944fc74df Render the project list as a tree on Move form.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2315 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-25 13:52:40 +00:00
Jean-Philippe Lang
ad059f9637 Removes spaces before colons.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2314 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-25 13:18:44 +00:00
Jean-Philippe Lang
1ad2551559 Adds ability to bulk copy issues (#1847).
This can be done by checking the 'Copy' checkbox on the 'Move' form.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2313 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-25 13:12:56 +00:00
Jean-Philippe Lang
41f3bae917 Fixed that the project jump box does not preserve current tab after r2304.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2312 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-25 12:13:27 +00:00
Jean-Philippe Lang
90c742e4f1 Ignore archived subprojects in Project#rolled_up_trackers (#2550).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2311 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-25 11:15:28 +00:00
Jean-Philippe Lang
97e31c4026 Removes unused projects_count column from projects table.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2305 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-24 11:48:38 +00:00
Jean-Philippe Lang
c9906480d3 Merged nested projects branch. Removes limit on subproject nesting (#594).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2304 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-24 11:31:15 +00:00
Jean-Philippe Lang
51b745470c Fixes a test that was broken by r2294.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2303 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-24 09:02:55 +00:00
Jean-Philippe Lang
11346455a1 Fixed: Details time log report CSV export doesn't honour date format from settings (patch #2466 by Russell Hind).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2302 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-24 08:58:03 +00:00
winterheart
86adcdf8bb ru.yml update
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2300 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-23 16:30:04 +00:00
winterheart
80eb3b85e4 removing \r\n
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2299 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-23 15:58:58 +00:00
winterheart
a2cca9ee87 Translation updates (#2453, #2463, #2551)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2298 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-23 15:46:22 +00:00
winterheart
1176f892d7 #2562, update for zh.yml
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2297 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-23 15:40:38 +00:00
winterheart
805b0c2a4e New Galician Translation (#2547), thanks to Martín Vázquez for intial translation
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2296 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-23 15:37:59 +00:00
Jean-Philippe Lang
4972084345 Automatically focus several form fields.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2295 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-22 16:34:54 +00:00
Jean-Philippe Lang
dfab202cde Accept replies to forum messages by subject recognition (#1616).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2294 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-21 18:22:30 +00:00
winterheart
b80caf762a #2540, pt-br update
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2293 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-20 16:13:14 +00:00
winterheart
8594206538 #2463, partially solved
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2292 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-20 16:09:07 +00:00
winterheart
c155b07ecb #2445, nl.yml update
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2291 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-20 15:53:09 +00:00
winterheart
1d70916064 #2453, sv.yml patch, some errors still exist (see ticket)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2290 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-20 15:45:34 +00:00
Jean-Philippe Lang
b9e3fbcd83 Allow email to reply to a forum message (#1616).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2289 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-19 19:03:53 +00:00
Jean-Philippe Lang
0c4e40b89c Use In-Reply-To and References headers to handle replies by email.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2288 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-19 18:29:07 +00:00
winterheart
254e224bd7 translation updates (#2535, #2505, #2524, #2434)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2287 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-19 16:43:28 +00:00
winterheart
5014b63611 #2442, small fix
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2286 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-19 16:06:39 +00:00
winterheart
2cd718862b #2429, translation update
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2285 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-19 16:02:57 +00:00
winterheart
b5915d3906 #2442, translation update
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2284 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-19 15:57:19 +00:00
winterheart
38d1b6e1bb #2439, translation update
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2283 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-19 15:55:54 +00:00
Jean-Philippe Lang
dacddd9897 Fix in AttachmentsController#show.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2282 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-18 20:00:03 +00:00
Jean-Philippe Lang
1d783106a3 Adds Message-Id and References headers to email notifications so that issues and messages threads can be displayed by email clients (#1401).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2281 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-18 15:16:31 +00:00
Jean-Philippe Lang
a4882467cb Fixed that Trac importer was creating duplicate custom values (#2506).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2280 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-18 11:54:56 +00:00
Jean-Philippe Lang
08304afe54 Fixes 103_set_custom_fields_editable migration from r2276 (#2526).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2279 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-18 10:54:08 +00:00
Jean-Philippe Lang
12792d8068 User custom fields can now be set as editable so that users can edit them on 'My account'.
For existing user custom fields, this new attribute is set to false by default to preserve the prior behaviour (it can turned on by editing the custom field in admin area).

Note: on the registration form, *required* custom fields will be displayed even if they are not defined as editable so that the account can be created.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2276 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-17 11:18:04 +00:00
Jean-Philippe Lang
99c2e98975 Moves a few settings to a "Display" panel.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2275 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-17 09:04:10 +00:00
Jean-Philippe Lang
ee1bb54ab6 CustomFieldsController#list moved to #index.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2274 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-17 08:46:23 +00:00
Jean-Philippe Lang
48295a6c4b CustomFieldsController refactoring.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2273 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-17 08:41:30 +00:00
Jean-Philippe Lang
5ed2e78ae2 Make use of tracker_ids association in issue custom field form.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2272 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-17 08:25:55 +00:00
Jean-Philippe Lang
d1a1e25bb8 Project jump box fix.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2271 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-17 08:08:33 +00:00
Jean-Philippe Lang
27fd8a2436 Do not show Category field when categories are not defined.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2270 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-17 08:03:53 +00:00
Jean-Philippe Lang
00ce28f8d7 Slight visual changes on the issue form.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2269 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-17 07:53:32 +00:00
Jean-Philippe Lang
b4640a0904 Adds custom fields functional tests.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2268 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-16 21:02:56 +00:00
Jean-Philippe Lang
a276926f42 Use a textarea for custom fields possible values (#2472).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2267 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-16 21:02:03 +00:00
Jean-Philippe Lang
f6282f9600 Makes subject field get focus on 'New issue' form (#2522).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2266 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-16 20:57:18 +00:00
Jean-Philippe Lang
ffa6c5fe3e Adds a 'Create and continue' button on the new issue form, that will create the issue and display the form again (#2523).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2265 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-16 17:20:41 +00:00
Jean-Philippe Lang
d28d2d5ab8 Typo (#2489).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2263 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-12 17:46:53 +00:00
Jean-Philippe Lang
31b3ebf071 Fixes r2226: exporting an issue with attachments to PDF raises an error (#2492).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2262 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-12 17:45:23 +00:00
Eric Davis
75c10a1cac Added two new plugin hooks to IssuesController:
* :controller_issues_new_after_save
* :controller_issues_edit_after_save

  #2475


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2261 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-12 04:52:56 +00:00
Eric Davis
17d455c72f Codified instructions from RUNNING_TESTS as rake tasks for convenience
Rake tasks are in testing.rake and can be run by `rake test:scm:setup:<scm>`
Updated RUNNING_TESTS

Contributed by Gerrit Kaiser


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2260 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-12 04:44:01 +00:00
Jean-Philippe Lang
38b2c5a317 Use margin-right instead of padding-right on top menu links.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2259 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-11 19:48:16 +00:00
Jean-Philippe Lang
da01ee7c37 Ability to sort the issue list by text, int and float custom fields (#1139).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2258 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-11 18:38:07 +00:00
Jean-Philippe Lang
3a28848ca0 Ability to sort the issue list by text, list, date and boolean custom fields (#1139).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2257 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-11 16:33:51 +00:00
Jean-Philippe Lang
1ca69f2af1 Different icon for closed issues in search result (#992).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2256 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-11 11:01:35 +00:00
Jean-Philippe Lang
212bf1e2bb Makes email adress uniqueness case-insensitive (#2473).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2253 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-10 11:29:35 +00:00
Jean-Philippe Lang
6768bec456 Fixed: no error is raised when entering invalid hours on the issue update form (#2465).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2251 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-09 17:32:46 +00:00
Jean-Philippe Lang
c0f44db4f7 Adds 'closed' css class to closed issues in the issue list (#2458).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2250 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-07 20:30:02 +00:00
Jean-Philippe Lang
15996c348d Fixes a test failure with svn < 1.5 (#2455).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2249 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-07 20:22:06 +00:00
Jean-Philippe Lang
a64928fa6b Fixes functional test broken by r2246.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2248 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-07 20:21:27 +00:00
Jean-Philippe Lang
09620eef76 Refactor TabularFormBuilder field helpers (#2461).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2247 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-07 20:03:33 +00:00
Jean-Philippe Lang
bc270b31c3 Makes issue description a non-required field (#2456).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2246 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-07 19:47:24 +00:00
Jean-Philippe Lang
cd83f72da4 Slight changes in functional tests.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2235 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-04 18:14:51 +00:00
Jean-Philippe Lang
260373aed7 Slight changes to ease Rails 2.2 support.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2234 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-04 17:09:25 +00:00
Jean-Philippe Lang
4a5d3e0353 Scramble PDF title (#1204).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2233 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-04 14:54:19 +00:00
Jean-Philippe Lang
8590165238 Merged r2231 from 0.8-stable (#2402).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2232 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-04 13:27:48 +00:00
Jean-Philippe Lang
748fb30f58 Do not use compute_public_path.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2228 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-04 12:50:45 +00:00
Jean-Philippe Lang
2644141a36 Makes the app boot with Rails 2.2.2
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2227 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-04 12:14:05 +00:00
Jean-Philippe Lang
ceb2320ef0 Move PDF stuff to a single helper.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2226 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-04 12:03:39 +00:00
Jean-Philippe Lang
dfc937340d Fixed: email notification for changes I make still occurs when running Repository.fetch_changesets (#1957).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2225 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-03 16:03:12 +00:00
Jean-Philippe Lang
e0bda97b6f Display a warning if some attachments were not saved (#2008).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2224 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-03 14:44:12 +00:00
Jean-Philippe Lang
d25b6d4686 Moves flash messages rendering to a helper method.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2223 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-03 14:11:44 +00:00
Jean-Philippe Lang
a66b1e77da Fixed: syntax highlight doesn't appear in new ticket preview (#1976).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2222 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-03 13:14:28 +00:00
Jean-Philippe Lang
7a5ce28921 Lower the project identifier limit to a minimum of two characters (#2003).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2221 e93f8b46-1217-0410-a6f0-8f06a7374b81
2009-01-03 13:09:36 +00:00
Jean-Philippe Lang
16eb0421e5 IMAP: add options to move received emails.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2220 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-31 14:56:30 +00:00
Jean-Philippe Lang
538bd7cd7f Fix sv lang file
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2219 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-31 13:59:30 +00:00
Jean-Philippe Lang
a22f3d6aa7 Admin Info Screen: Display if plugin assets directory is writable (#2425).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2218 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-31 11:48:56 +00:00
Jean-Philippe Lang
e6aaa03cf0 Do not escape back_url twice when login fails.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2214 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-31 10:39:33 +00:00
Jean-Philippe Lang
24f3ee777d Changes pt-br decimal separator (#1372).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2213 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-30 16:43:26 +00:00
Jean-Philippe Lang
8b7fb7213f Stricter textile links parsing (#2417).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2212 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-30 16:23:05 +00:00
Jean-Philippe Lang
421539e3be Import custom fields values from emails (#2413).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2211 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-30 14:57:33 +00:00
Jean-Philippe Lang
2355324d73 Jump to the current tab when using the project quick-jump combo (#2364).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2210 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-30 14:24:51 +00:00
Jean-Philippe Lang
6eee9dbf88 Increment project files downloads.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2209 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-30 13:32:51 +00:00
Jean-Philippe Lang
0819f00380 CHANGELOG updated.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2208 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-30 13:32:14 +00:00
winterheart
7bb9dd75db #2373, fixing encoding
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2202 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-29 18:27:27 +00:00
Jean-Philippe Lang
2e8a0bd562 CHANGELOG updated.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2201 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-29 16:08:31 +00:00
Jean-Philippe Lang
102c551b5a Translations updates.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2199 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-29 15:43:42 +00:00
Jean-Philippe Lang
45db63c207 Renumbers projects_trackers fixtures (#2411).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2196 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-29 12:40:56 +00:00
Jean-Philippe Lang
94b04383f9 Mail handler: add watchers before sending notification (#2245).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2195 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-28 14:48:23 +00:00
Jean-Philippe Lang
35f5e36838 Disable textile inline styles to prevent XSS attacks (#2377).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2192 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-28 13:38:34 +00:00
Jean-Philippe Lang
a140c9bd74 Fixed bold syntax around single character in series (#2351).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2191 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-28 10:12:09 +00:00
Jean-Philippe Lang
bde72a5f40 Fixes functional tests fixtures (#2398).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2190 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-28 09:46:16 +00:00
Jean-Philippe Lang
a7a4c9f848 Fixed: deleted files should not be shown when browsing a Darcs repository (#2385).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2189 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-27 18:33:35 +00:00
Jean-Philippe Lang
76a9101998 Do not show a link to the current annotate or view page (#2367).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2188 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-27 18:10:36 +00:00
Jean-Philippe Lang
caf6b4b3f1 Fixes functional test failures.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2187 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-27 18:07:46 +00:00
Jean-Philippe Lang
9a0814253c Fixtures update.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2186 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-27 17:49:01 +00:00
Jean-Philippe Lang
fb1f72a09c Prevent SQL error with old sessions after r2171.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2183 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-27 14:05:03 +00:00
winterheart
03fd86034d #2386, korean translation update
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2182 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-24 15:48:59 +00:00
winterheart
e42e09cf8b #2368, pt.yml update
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2181 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-24 15:47:24 +00:00
winterheart
3c462ab9c2 #2329, swedish lang update
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2180 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-24 15:44:43 +00:00
Jean-Philippe Lang
d775aee26d Fixes a JS error on context_menu with IE (#2390).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2178 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-24 13:29:43 +00:00
Jean-Philippe Lang
5c97a83a70 Validates sort_key and sort_order params (#2378).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2171 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-24 10:03:13 +00:00
Jean-Philippe Lang
7776b5b665 Escape textile titles and styles (#2377).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2170 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-23 17:05:38 +00:00
Jean-Philippe Lang
e48f0f04e7 Escape query names (#2379).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2169 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-23 00:19:15 +00:00
Jean-Philippe Lang
fee8ada214 Escape wiki annotate lines content (#2380).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2168 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-23 00:16:26 +00:00
Jean-Philippe Lang
3f80a89a69 Show view/annotate/download links on repositories/entries and repositories/annotate views (#2367).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2167 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-22 20:33:01 +00:00
Jean-Philippe Lang
4fd2e4aa90 Sligth change to fr.yml.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2166 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-22 19:25:07 +00:00
Jean-Philippe Lang
67f82e32b4 Do not hardcode Watcher string in r2164.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2165 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-22 19:24:17 +00:00
Jean-Philippe Lang
1f89dad23a Adds watchers selection on new issue form (#398). Permission 'add issue watchers' required.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2164 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-22 19:21:02 +00:00
Jean-Philippe Lang
3de4a1d788 CHANGELOG updated.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2147 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-19 14:13:24 +00:00
Jean-Philippe Lang
ede011243b Check that wiki page exists before processing (#2360).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2145 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-19 10:43:06 +00:00
Jean-Philippe Lang
4ec5b1600a Escape double-quotes in image titles.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2144 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-19 10:16:15 +00:00
Jean-Philippe Lang
3ce1be14f7 Escape textarea content when editing a issue note.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2143 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-19 08:10:35 +00:00
winterheart
22b4005fd3 Typo on translation, #2352
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2142 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-18 22:27:32 +00:00
Eric Davis
ce64a42250 Fixed a failing test caused by comparing a Time object (n.day.ago) with a Date object
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2141 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-18 07:10:23 +00:00
Jean-Philippe Lang
2564f05037 Adds a css class (overdue) to overdue issues on issue lists and detail views (#2337).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2140 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-16 21:13:35 +00:00
Jean-Philippe Lang
02c2a83494 Adds a helper that returns issues css classes.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2139 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-16 21:11:37 +00:00
Jean-Philippe Lang
7cea286c23 Fixes repository user mapping submission when a repository username is blank (#2339, Conflicting types for parameter containers).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2137 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-15 18:02:25 +00:00
Jean-Philippe Lang
3bb2fccaf1 Mail handler: strip tags when receiving a html-only email (#2312).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2136 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-14 17:10:16 +00:00
Jean-Philippe Lang
840bb53f5b Fixed: CVS browser should not show dead revisions (deleted files) (#2319).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2135 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-14 15:57:13 +00:00
Jean-Philippe Lang
e2952d3e5f Rails 2.1.2 deprecations (#2332).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2134 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-14 15:36:59 +00:00
winterheart
040d0a32d2 Fixing quotes
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2131 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-12 19:41:12 +00:00
winterheart
83c9fcb13e translation updates
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2130 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-12 19:34:31 +00:00
Jean-Philippe Lang
dcf5ba1ea6 Make use of User.find_by_mail
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2129 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-12 19:11:16 +00:00
Jean-Philippe Lang
a37f4b9cf6 Capture scm CLI stderr to log/scm.stderr.log when running in dev environment
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2128 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-12 16:07:14 +00:00
Jean-Philippe Lang
740ec7656f Undo unwanted change.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2127 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-12 16:04:54 +00:00
Jean-Philippe Lang
1bfbecbcab Rescue back_url param parsing on redirect.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2126 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-12 16:03:57 +00:00
Jean-Philippe Lang
29f364f63c Escape back_url field value (#2320).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2125 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-12 16:01:35 +00:00
Jean-Philippe Lang
b21b6c365c Fixed: default category ignored when adding a document (#2328).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2124 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-12 13:49:14 +00:00
Jean-Philippe Lang
c651184998 Fixed: default flag removed when editing a default enumeration (#2327).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2123 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-12 13:32:39 +00:00
Jean-Philippe Lang
72d0843c1f Makes User.find_by_mail case-insensitive (password reminder #2322, repo users mapping).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2122 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-12 12:07:09 +00:00
Eric Davis
da98386bf7 Added plugin hooks around Journal editing
* :controller_journals_edit_post
* :view_journals_notes_form_after_notes
* :view_journals_update_rjs_bottom


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2121 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-10 23:44:22 +00:00
winterheart
f02717ab94 russian update
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2120 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-10 17:13:04 +00:00
winterheart
63faea0c42 Translation updates (#2310, #2309, #2306, #2304, #2302, #2300, #2299)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2119 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-10 17:01:39 +00:00
Jean-Philippe Lang
2aceccf285 Fixed: Firefox cuts off large diffs (#2234).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2118 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-09 18:30:22 +00:00
Jean-Philippe Lang
66ff4cb7de Files module: makes version field non required (#1053).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2117 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-09 18:00:27 +00:00
Jean-Philippe Lang
5d2899ee1b AttachmentsController now handles attachments deletion.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2116 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-09 16:54:46 +00:00
Jean-Philippe Lang
2b6e332318 Fixed: project activity truncated after viewing user's activity.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2114 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-08 18:20:26 +00:00
Jean-Philippe Lang
fec86a9ce1 Adds a setting to limit the number of diff lines that should be displayed (default to 1500).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2112 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-07 15:21:40 +00:00
Jean-Philippe Lang
02acc7fc28 Follows r2110.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2111 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-07 14:44:08 +00:00
Jean-Philippe Lang
ea603e4ea5 Use options hash in UnifiedDiff.new
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2110 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-07 14:40:33 +00:00
Jean-Philippe Lang
0ea3d150e1 Makes logged-in username in topbar linking to (#2291).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2109 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-07 13:12:19 +00:00
Jean-Philippe Lang
e93d02d228 UPGRADING updated
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2105 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-07 09:59:19 +00:00
Jean-Philippe Lang
d9714bff32 Update changelog for 0.8 rc1
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2104 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-07 09:56:28 +00:00
Jean-Philippe Lang
70393f491d Set version to 0.8
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2103 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-07 09:54:37 +00:00
Jean-Philippe Lang
657fa55118 Upgrade to Rails 2.1.2
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2102 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-07 09:53:27 +00:00
Jean-Philippe Lang
a02ee73181 Show project name in front of related issues if cross-project issue relations are enabled (#2282).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2101 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-07 08:48:29 +00:00
Jean-Philippe Lang
70fa891d48 Changelog updated.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2100 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-07 08:41:54 +00:00
Jean-Philippe Lang
e2050d61fd Translations updates.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2098 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-06 22:40:50 +00:00
Jean-Philippe Lang
1dfe63093b Slight change to css so that gravatar is vertically centered on user's page.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2097 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-06 18:01:20 +00:00
Jean-Philippe Lang
472ec31662 Fixed: CVS connexion string may not contain @.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2096 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-06 17:40:54 +00:00
Jean-Philippe Lang
e66945cbd8 Fixes Darcs#cat with Postgresql.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2095 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-06 17:20:37 +00:00
Jean-Philippe Lang
8a0a25fceb Changes issue history headings.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2094 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-06 11:21:10 +00:00
Eric Davis
cf77c93cb4 Added several useful hooks to the Issue sidebar
* :view_issues_sidebar_issues_bottom
* :view_issues_sidebar_planning_bottom
* :view_issues_sidebar_queries_bottom


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2093 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-06 00:51:03 +00:00
Eric Davis
956437b7fe Final refactoring on Query#sql_for_field to rename v to value
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2092 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-05 22:56:13 +00:00
Eric Davis
a464d26e73 Bit more refactoring on Query#sql_for_field to remove multiple returns
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2091 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-05 22:56:08 +00:00
Eric Davis
ea77929d62 Refactor: Extracted new method Query#sql_for_field from Query#statement in
order to clean up Query#statement.


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2090 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-05 22:56:03 +00:00
Eric Davis
996b2a5c1d Added :view_issues_history_journal_bottom hook
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2089 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-05 21:03:55 +00:00
Jean-Philippe Lang
50794b08a9 Cross-project gantt and calendar (#1157).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2088 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-05 15:41:32 +00:00
Eric Davis
1b4f0c38ce Added :view_issues_edit_notes_bottom hook
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2087 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-03 23:18:12 +00:00
Eric Davis
5f9b1b0e0b Added :controller_issues_edit_before_save hook
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2086 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-03 23:18:07 +00:00
Jean-Philippe Lang
93c04f2666 Fixed: wrong digest for text files under Windows (#2264).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2085 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-02 17:57:13 +00:00
Jean-Philippe Lang
218e1bb267 Use style attribute for setting width of table cells in progress bars (#2267).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2084 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-02 17:29:52 +00:00
Jean-Philippe Lang
1ce2ed065a Fixed: activity broken by r2066 with postgresql (#2266).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2083 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-02 17:16:06 +00:00
Jean-Philippe Lang
d3386a5af7 Fixed: 404 when "Apply" clicked on activity page (#2251).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2082 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-01 17:27:44 +00:00
winterheart
5330ca9b8c ru.yml update
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2081 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-01 16:11:05 +00:00
winterheart
84247e7272 Translation updates (#2249, #2250, #2252, #2254)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2080 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-12-01 16:00:54 +00:00
Jean-Philippe Lang
e7b6a56a97 Replaces User.find_active with a named scope.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2079 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-30 16:57:56 +00:00
Jean-Philippe Lang
9572699301 Changes Portuguese decimal separator (#1372).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2078 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-30 16:34:39 +00:00
Jean-Philippe Lang
84e70634fb Adds To and Cc as watchers when submitting an issue by email (#2245).
Only works if the sender has the 'Add issue watchers' permission.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2077 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-30 16:00:45 +00:00
Jean-Philippe Lang
94899e0339 Adds --status option to rdm-mailhandler.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2076 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-30 15:51:44 +00:00
Jean-Philippe Lang
abacc2754e Adds status option to email integration rake tasks.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2075 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-30 14:57:46 +00:00
Jean-Philippe Lang
2fa8030afc Mail handler: check workflow for status set/change.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2074 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-30 14:55:45 +00:00
Jean-Philippe Lang
0b2299c7d1 Adds link to user's account on issue history.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2073 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-30 14:31:01 +00:00
Jean-Philippe Lang
5f3f2e756b Obfuscates email address on user's account page using javascript.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2072 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-30 14:23:57 +00:00
Jean-Philippe Lang
dfc7a94578 Slight changes to profile on account page and last connexion date added.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2071 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-30 13:42:15 +00:00
Jean-Philippe Lang
0399b85ab6 Adds links between account and user's activity pages.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2070 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-30 13:38:07 +00:00
Jean-Philippe Lang
9e5edfb728 Adds atom feed on user's account page.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2069 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-30 12:18:59 +00:00
Jean-Philippe Lang
b8b473244c Fixes activity atom link params (when not on first page).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2068 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-30 12:14:12 +00:00
Jean-Philippe Lang
6e777b7453 Makes activity view accept a user_id param to show user's activity (#1002).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2067 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-30 12:12:06 +00:00
Jean-Philippe Lang
fce4615f10 Display latest user's activity on account/show view.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2066 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-30 11:18:22 +00:00
winterheart
b5fcea9e74 Italian update (#2239)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2063 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-28 15:44:59 +00:00
Jean-Philippe Lang
5014b23c2a Fixed: inappropriate redirection to login or register page may occur (#2206). Eg. user clicks login link twice before logging in.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2062 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-27 20:15:45 +00:00
Jean-Philippe Lang
a6b6dc60f4 Typo in gloc:update task description (#2243).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2061 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-27 18:43:18 +00:00
Jean-Philippe Lang
9b1efcfaab Typo in lang files (#2241).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2060 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-27 18:41:40 +00:00
Jean-Philippe Lang
546b98a118 Adds a css class on menu items in order to apply item specific styles (eg. icons).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2059 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-27 18:04:48 +00:00
winterheart
7a441c1bc4 rake gloc:update, update for Serbian (#2232)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2057 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-26 17:32:56 +00:00
Jean-Philippe Lang
c54f15e35f Do not request blank LDAP attributes.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2056 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-25 19:33:41 +00:00
Jean-Philippe Lang
db37e578f2 Slight tests fixes.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2055 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-25 17:37:41 +00:00
Jean-Philippe Lang
9e1192a54d Fixed date filters accuracy with SQLite (#2221).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2054 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-23 16:40:35 +00:00
Jean-Philippe Lang
06266c8fec Extends child_pages macro to display child pages based on page parameter (#1975).
It can also be called from anywhere now (not only from wiki pages).

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2053 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-22 11:44:07 +00:00
winterheart
af7e586b06 removing BOM, sorting, #2169
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2052 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-21 16:40:11 +00:00
winterheart
0b94f4afa9 fix for Polish, #2215
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2051 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-21 16:35:00 +00:00
Jean-Philippe Lang
5a51412e6a Remove eclipse files
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2048 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-19 19:38:19 +00:00
winterheart
752d574b49 Typo in sv, #2213
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2047 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-19 15:52:09 +00:00
Jean-Philippe Lang
a303b5e2d5 Fixed: Printing long roadmap doesn't split across pages (#2203).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2046 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-18 21:11:25 +00:00
Jean-Philippe Lang
e61916ea91 SubversionAdapter#entries performance improvement.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2045 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-18 18:36:47 +00:00
Jean-Philippe Lang
86504acb4c Vietnamese language updated (#2125).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2044 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-18 17:22:28 +00:00
Jean-Philippe Lang
3fdc273252 Do not query multiple times git for branch (#1435).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2043 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-17 17:27:08 +00:00
Jean-Philippe Lang
9882217847 Adds Plugin#requires_redmine method so that plugin compatibility can be checked against current Redmine version (#2162).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2042 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-16 20:00:20 +00:00
Jean-Philippe Lang
5362a85f2b Adds url and author_url plugin attributes (#2162).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2041 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-16 17:12:02 +00:00
Jean-Philippe Lang
f9ce4ff559 Adds a few Plugin tests.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2040 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-16 16:08:25 +00:00
Jean-Philippe Lang
fefc6e6bec Adds .find and .all Plugin class methods.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2039 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-16 15:38:37 +00:00
Jean-Philippe Lang
97252c26ee Adds plugin id attribute.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2038 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-16 15:22:48 +00:00
Jean-Philippe Lang
94b5bbcb5d Moves plugin list to its own administration menu item.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2037 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-16 11:58:41 +00:00
Jean-Philippe Lang
9c09fd20fb Changes version naming rule (#2162).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2036 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-16 11:49:37 +00:00
winterheart
79b1347ba5 Translation updates (#2189, #2193)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2035 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-15 08:35:17 +00:00
winterheart
0cef17ce44 Polish update, #2188
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2034 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-14 15:33:27 +00:00
winterheart
d1b1f5977a Translation updates (#2168, #2172, #2176, #2178)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2033 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-14 15:18:13 +00:00
winterheart
33274b8d48 Missed %s in label, thank Martin Bächtold for reporting (#2186)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2032 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-14 15:00:23 +00:00
Jean-Philippe Lang
7c1d8ac00b Fixes #2170: user display format in application settings broken by r2010.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2031 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-13 16:43:39 +00:00
Jean-Philippe Lang
243027e63a Fixes #2171: issue pdf export broken by r2006.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2030 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-13 16:39:50 +00:00
Eric Davis
9d810f0059 Changed the CSS clear on journals so they will wrap around the revisions. #2165
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2029 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-13 01:07:58 +00:00
winterheart
eaedf9ed52 update for ru
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2028 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-12 15:34:11 +00:00
winterheart
c894f74c5e Populating new strings for sk.yml
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2027 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-12 15:23:52 +00:00
winterheart
8d8315d8f6 New file for sk (#2126)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2026 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-12 15:22:57 +00:00
winterheart
7f63f9a931 Populating new strings for zh.yml
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2025 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-12 15:18:55 +00:00
winterheart
27af58ef1a update for zh (#2151)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2024 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-12 15:17:47 +00:00
winterheart
fb4bab748f update for pt-br (#2164)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2023 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-12 15:13:49 +00:00
Jean-Philippe Lang
d771847078 Pluggable admin menu (patch #2031 by Yuki Sonoda with slight changes).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2022 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-11 18:10:21 +00:00
Jean-Philippe Lang
3f4defe482 Hungarian language file updated.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2021 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-11 16:49:20 +00:00
Jean-Philippe Lang
737bbb3d3d Less agressive Redcloth lang attribute parsing (#2091).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2020 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-11 16:26:05 +00:00
Jean-Philippe Lang
7a05f8ed66 Adds permissions to let users edit and/or delete their messages (#854, patch by Markus Knittig with slight changes).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2019 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-11 15:07:55 +00:00
Jean-Philippe Lang
cbacc71dff Turn ftps and sftp proto into links (#1514).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2018 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-11 14:24:06 +00:00
Jean-Philippe Lang
ad97165f1b Changes ruby bang path to #!/usr/bin/env ruby (#1876).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2017 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-11 13:54:10 +00:00
Jean-Philippe Lang
8be1597ad0 Updated pt-br and zh-tw lang files.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2016 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-11 13:49:07 +00:00
Jean-Philippe Lang
1169ff05af Documents Wiki page anchors (#1647).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2015 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-11 13:37:10 +00:00
Jean-Philippe Lang
876a9b6ffb Fixed: Trac milestone links not correctly converted (#2052).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2014 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-11 13:32:22 +00:00
Jean-Philippe Lang
d545ca7360 Fixed: Trac migration of ticket:123 or [ticket:34] do not work (#2053).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2013 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-11 13:28:48 +00:00
Jean-Philippe Lang
1802fa9348 Fixed: Trac migration of ticket:123 or [ticket:34] do not work (#2053).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2012 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-11 13:28:13 +00:00
Jean-Philippe Lang
29bad1dc95 Trac importer improvements (patch #2050 by Karl Heinz Marbaise).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2011 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-11 13:22:05 +00:00
Jean-Philippe Lang
6a8be88ad6 Sort users by their display names so that user dropdown lists are sorted alphabetically (#2015).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2010 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-11 12:59:28 +00:00
Jean-Philippe Lang
e8d0c26e43 Eager-load users.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2009 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-11 12:50:11 +00:00
Jean-Philippe Lang
4ed95ffff6 Fixes a typo in en.yml.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2008 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-11 12:07:03 +00:00
Jean-Philippe Lang
6f68a36679 Eager-load users.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2007 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-10 19:09:00 +00:00
Jean-Philippe Lang
79c33bbc83 Maps repository users to Redmine users (#1383).
Users with same username or email are automatically mapped. Mapping can be manually adjusted in repository settings. Multiple usernames can be mapped to the same Redmine user.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2006 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-10 18:59:06 +00:00
Jean-Philippe Lang
f6b2be81b9 Include GLoc in hook listener base class (#2112).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2005 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-10 12:23:54 +00:00
Jean-Philippe Lang
486ecc6661 Fixed: non-ASCII subversion path can't be displayed (patch #1993 by Chaoqun Zou).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2004 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-10 11:33:04 +00:00
Jean-Philippe Lang
5166213fd3 Hide Redmine version in atom feeds and pdf properties (#794).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2003 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-09 20:39:49 +00:00
Jean-Philippe Lang
57a4ee318a Link to activity view when displaying dates.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2002 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-09 17:56:20 +00:00
Jean-Philippe Lang
d63746ab3e Fixes activity date param.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2001 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-09 17:53:30 +00:00
Jean-Philippe Lang
7619c286cc Changes ApplicationHelper#gravatar_for_mail to #avatar that takes a User or a String (less code in views).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2000 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-09 14:52:16 +00:00
Jean-Philippe Lang
6157d20ec0 Git adapter: use commit time instead of author time (#2108).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1999 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-09 12:07:35 +00:00
winterheart
858eba2f1c populating new string, updates for ru.yml and sv.yml (#2126)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1998 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-09 00:29:20 +00:00
winterheart
365d92ebf4 #2126, initial support of Slovak, thank to Stanislav Pach for translation
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1997 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-08 22:34:41 +00:00
Jean-Philippe Lang
11b9ceb054 git path reverted.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1996 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-08 17:15:18 +00:00
Jean-Philippe Lang
9352bb527b Tells git to output dates in ISO format.
Fixes: Git Adapter date parsing ignores timezone (#2149).

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1995 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-08 15:50:51 +00:00
Jean-Philippe Lang
47475acdaf Fixed Bazaar shared repository browsing (#2101, patch #1685 by Dmitry Shaposhnik).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1994 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-08 15:28:00 +00:00
Jean-Philippe Lang
9ae6e60c26 Fixes syntax highlighting broken by r1930 (#2143).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1993 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-08 15:18:02 +00:00
Jean-Philippe Lang
077723c90a Do not use @:skip_relative_url_root@ to generate urls in Mailer (#2122).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1992 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-08 13:25:45 +00:00
Eric Davis
81eee10d5b Removing the custom Redmine hook in routes in favor of Engine's hook.
* Plugins' routes.rb are now added automatically to Redmine's routing,
  including the ability to override Redmine's default routing.

  Thank you to Jean-Baptiste Barth for the suggestion.  #2142


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1991 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-08 00:12:43 +00:00
Jean-Philippe Lang
63c72fe87f Fixed: broken subject when submitting issue via email written in japanese (Patch #2059 by Go MAEDA).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1990 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-07 17:27:56 +00:00
Jean-Philippe Lang
006337fb0e Host setting should contain the path prefix (Redmine base URL) to properly generate links in emails that are sent offline (#2122).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1989 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-07 15:37:17 +00:00
Jean-Philippe Lang
4581baa5c0 Email address should be lowercased for gravatar (#2145).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1988 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-07 14:35:18 +00:00
Jean-Philippe Lang
203cf6333e French translation update.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1987 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-07 13:08:01 +00:00
winterheart
b7c1a5c0d5 Update for pl.yml, #1299
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1986 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-07 11:28:29 +00:00
winterheart
0ecca9d8f1 D'oh...
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1985 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-07 11:22:26 +00:00
winterheart
c58298835d refreshing vn.yml (#2125)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1984 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-07 11:20:25 +00:00
winterheart
42452a535f Intial support Vietnamese language (#2125), thanks to Kỳ Anh Huỳnh for work (now - really)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1983 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-07 11:12:12 +00:00
winterheart
d32b9b92cf Ooops, wrong.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1982 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-07 11:07:25 +00:00
winterheart
de31cd9ef6 Intial support Vietnamese language (#2125), thanks to Kỳ Anh Huỳnh for work
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1981 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-07 10:53:09 +00:00
winterheart
a9295a7740 #2127, #2129, #2130, #2135, translation updates. Thanks to all participants :)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1980 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-07 10:41:10 +00:00
Eric Davis
8b3a8ac1b4 Included Redmine::Hook::Helper to ActionController::Base so call_hook
is available in all controllers. #2111


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1979 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-06 05:37:29 +00:00
Eric Davis
b1cb9cd3bd Added :view_projects_form plugin hook
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1978 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-04 18:27:13 +00:00
winterheart
76d33e1fb7 #2121, pt-br update
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1977 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-11-01 16:42:49 +00:00
winterheart
0dc6a41832 update ru.yml
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1976 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-31 14:58:05 +00:00
winterheart
34b86628a0 Update zh-tw, #2116
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1975 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-31 14:49:33 +00:00
winterheart
66b9a76c7e Update pt-rb, #2105
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1974 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-31 14:48:07 +00:00
winterheart
bbc43e71ee Populating new string with rake gloc:update
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1973 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-31 14:38:09 +00:00
Eric Davis
ba20a67873 Added an option to turn user Gravatars on or off
* Option can be found in Administration > General, called
  "Use Gravatar user icons"
* Defaulting Gravatars to off
* Added a helper gravatar_for_mail to check the setting before rendering
  the Gravatar.

  #1776


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1972 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-31 00:41:28 +00:00
Eric Davis
048fa5bd77 Tighened up the gravator CSS in the issue div
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1971 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-31 00:19:48 +00:00
Eric Davis
3bc2a5cf2f Tweaking of the CSS for the gravatars. #1776
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1970 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-31 00:09:36 +00:00
Eric Davis
41dba2db86 Link the version name to VersionsController#show in the issue list.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1969 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-30 03:49:04 +00:00
Eric Davis
e85a9f8609 Fixed typo in an English string, 'View calender'
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1968 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-30 03:29:30 +00:00
Eric Davis
b84dd8ec83 Added gravatar image to the user's public account page
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1967 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-30 02:58:34 +00:00
Eric Davis
01fd8e685b Fixed a bug with using gravatar on a nil value.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1966 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-30 02:58:28 +00:00
Eric Davis
1a6595aa17 Reduced the size of the gravatar on the issue history
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1965 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-30 02:58:23 +00:00
Eric Davis
9373f429d0 styling tweaks for gravatars
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1964 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-30 02:58:16 +00:00
Eric Davis
b3442a7d39 styling tweaks for gravatars
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1963 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-30 02:58:10 +00:00
Eric Davis
ed314caf7d Gravatar support for issue detai, user grid, and activity stream
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1962 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-30 02:58:04 +00:00
winterheart
1399f3dd12 Update for ru.yml
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1961 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-28 23:31:14 +00:00
Eric Davis
7c99f8ad11 Added :view_timelog_edit_form_bottom hook to the timelog/edit form.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1960 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-28 20:29:38 +00:00
winterheart
67159c12c5 #2080, #2097, #2100 - ja, zh-tw, zh updates
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1959 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-28 16:08:19 +00:00
Jean-Philippe Lang
0f1787ea0d Fixed: Inline images don't work if file name has upper case letters or if image is in BMP format (#2102).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1958 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-28 10:43:34 +00:00
Jean-Philippe Lang
6cd4f0c07e Makes GLoc language global.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1957 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-27 12:34:01 +00:00
Jean-Philippe Lang
d143019dbb Adds back textile acronyms support (#2077).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1956 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-27 11:50:23 +00:00
Jean-Philippe Lang
a3b9a5aa5f Makes wiki text formatter pluggable.
Original patch #2025 by Yuki Sonoda slightly edited.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1955 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-27 11:08:29 +00:00
Jean-Philippe Lang
9b624fd1d6 Slight change to english string (#2088).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1954 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-26 15:17:26 +00:00
Jean-Philippe Lang
8236563d6b Check that git changeset is not in the database before creating it (#1419).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1953 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-25 10:23:29 +00:00
Jean-Philippe Lang
5f9f6ea2e1 Adds #delete_menu_item to the plugin API (#2087).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1952 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-25 09:55:31 +00:00
Jean-Philippe Lang
738fc579f0 Renames template ruby files to erb.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1951 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-25 09:35:51 +00:00
Eric Davis
0316fde06b Added the board's description below the board's name.
Thanks to Go MAEDA for the patch.  #2079


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1950 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-25 04:46:21 +00:00
Eric Davis
bcde2f4dce Renamed the .rb files in the plugin_generator to end in .erb. The .rb was
causing rdoc to try to document them and fail.

* Updated the generator's manifest to use the new files
* Renamed template README to README.rdoc

  #2011


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1949 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-25 04:37:31 +00:00
Eric Davis
48ae6f38e1 Added hook :view_repositories_show_contextual to allow adding items to the
repository's contextual menu.

  #2073


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1948 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-25 04:21:57 +00:00
Jean-Philippe Lang
16eda4c5c9 Adds the ability to search for a project name or identifier on the administration projects list.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1947 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-24 17:12:39 +00:00
Jean-Philippe Lang
b4101c8b65 Adds functional test for user search.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1946 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-24 17:01:42 +00:00
Jean-Philippe Lang
d967507dcb Adds the ability to search for a user on the administration users list.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1945 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-24 16:59:15 +00:00
Jean-Philippe Lang
d1b5bc1e82 AuthSource list: display associated users count and disable 'Delete' buton if any (#2041).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1944 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-24 15:39:40 +00:00
Jean-Philippe Lang
6c54b0ba3b Makes permission screens localized (#2070).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1943 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-24 15:24:35 +00:00
winterheart
bdbc7b337f #1928 it.yml update
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1942 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-23 15:24:16 +00:00
Jean-Philippe Lang
ff449b197f Fixed: textile footnotes no longer work after r1113 (#974).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1941 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-18 11:25:27 +00:00
Jean-Philippe Lang
a0c29d8f99 link_to project homepage instead of auto_link (#1937).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1940 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-18 10:42:29 +00:00
Jean-Philippe Lang
58fbf5e66f Show the most recent file when displaying an inline image.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1939 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-18 10:18:21 +00:00
Jean-Philippe Lang
ccbe48d779 Adds 'Delete wiki pages attachments' permission.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1938 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-18 10:07:49 +00:00
winterheart
64e67f754d #2043, #2044, #2046, translation updates
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1937 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-18 10:03:50 +00:00
Eric Davis
6810972762 Added a plugin hook :routes that plugins can use to add and even override routes
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1936 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-17 23:30:37 +00:00
winterheart
e160a3eec1 Update for ru.yml
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1935 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-16 20:51:27 +00:00
winterheart
f16aae74dc #2036 update for hu.yml
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1934 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-16 20:50:50 +00:00
Jean-Philippe Lang
bc77cc2c5c Makes email address case-insensitive in MailHandler (#2032).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1933 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-16 19:13:43 +00:00
Nicolas Chuche
a4b07a36ed add plain text option for mail #2029
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1932 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-15 23:50:33 +00:00
Nicolas Chuche
1894bef48a bugfix to two failed tests
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1931 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-15 22:30:57 +00:00
Jean-Philippe Lang
2ed9aa13f3 Remove pre tag attributes.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1930 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-12 19:13:36 +00:00
winterheart
52e422da61 Patch #2005, nl.yml update
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1929 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-11 11:32:30 +00:00
winterheart
8b0016d71b Patch #2001, update for Polish language
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1928 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-07 17:41:16 +00:00
winterheart
df761e01fa #1992 update pt.yml, thanks to Pedro Araújo
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1927 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-06 15:00:56 +00:00
winterheart
07962e2840 Patch #1987, ca.yml update, thanks to Joan Duran for file
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1926 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-05 20:40:25 +00:00
winterheart
7fe7677cde #1988, update for ko.yml
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1925 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-05 19:30:58 +00:00
Jean-Philippe Lang
c4419e268f Escape image filename regexp (#1971).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1924 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-04 17:38:31 +00:00
Eric Davis
cf1ad65cd2 Added tests to cover IssueStatus.destroy and IssueStatus.check_integrity
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1923 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-02 03:23:35 +00:00
Eric Davis
193ed689fb Fixed a failing assertion in test_post_edit_with_attachment_only that would
occur when running the full test suite but not the functional test suite.


git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1922 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-10-02 02:40:29 +00:00
Eric Davis
f2f54a711d Adds :view_layouts_base_body_bottom hook
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1921 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-30 05:18:50 +00:00
Eric Davis
0092a54e3b Slight non-code change to test git sync
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1920 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-30 00:02:46 +00:00
Eric Davis
1ffa468240 Reverting slight non-code change
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1919 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-29 23:56:35 +00:00
Eric Davis
ae0ed7fd05 Slight non-code change
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@1918 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-29 23:55:11 +00:00
Jean-Philippe Lang
b0e62e37ae Fixes Workflow.count_by_tracker_and_role.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1917 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-28 13:10:00 +00:00
Jean-Philippe Lang
3544d6398a Slight changes to the workflow setup screen.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1916 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-28 12:36:30 +00:00
Jean-Philippe Lang
5083e92772 Fixes workflow setup link on trackers list (follows r1914).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1915 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-28 12:20:47 +00:00
Jean-Philippe Lang
a37af7a226 Adds a workflow overview screen.
Workflow setup moved to a dedicated controller.

git-svn-id: http://redmine.rubyforge.org/svn/trunk@1914 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-28 12:03:17 +00:00
Jean-Philippe Lang
85711f1d54 Fixed: Status list on bulk edit form does not follow normal sequence (#1956).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1913 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-28 08:41:17 +00:00
Jean-Philippe Lang
050d0d046a Wrap 'Assigned to' column on the issue list (#1960).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1912 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-28 08:19:25 +00:00
Jean-Philippe Lang
925ef8f4f0 Fixed: the default status is lost when reordering issue statuses (#1955).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1911 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-28 08:05:55 +00:00
Jean-Philippe Lang
ad06bec6b6 Fixed: Latest news appear on the homepage for projects with the News module disabled (#1941).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1910 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-28 07:54:41 +00:00
winterheart
433f2a043e Fixed #1961, pt-br update
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1909 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-27 19:06:48 +00:00
Jean-Philippe Lang
394fc9c109 Fixed: cross-project issue list should not show issues of projects for which the issue tracking module was disabled.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1907 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-25 18:51:03 +00:00
Jean-Philippe Lang
21979cf68a Fixes back_url in login filter (#1900).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1905 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-24 17:33:02 +00:00
Jean-Philippe Lang
0177f732a2 Reverts r1903.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1904 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-24 17:32:49 +00:00
Jean-Philippe Lang
a3cf5dcded Fixes back_url in login filter (#1900).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1903 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-24 17:30:36 +00:00
winterheart
8bc89b6e73 Patch #1938, update for nl.yml
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1902 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-24 14:45:20 +00:00
Jean-Philippe Lang
2e7e26fbb4 Fixes html escaping.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1901 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-23 17:03:51 +00:00
Jean-Philippe Lang
9131cdf6b9 Truncate comments on changeset list.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1900 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-22 19:50:10 +00:00
winterheart
fbf2646426 #1921, pt translation
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1897 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-22 14:49:18 +00:00
Jean-Philippe Lang
edf6757a75 Typo in migration 97 name (#1929).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1896 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-21 20:38:36 +00:00
Jean-Philippe Lang
8cb75be0db Switch order of current and previous revisions in side-by-side diff (#1903).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1895 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-21 18:45:30 +00:00
Jean-Philippe Lang
b09a18972d Strip LDAP attribute names before saving (#1890).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1894 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-21 13:28:12 +00:00
Jean-Philippe Lang
8a356baf3e Unescape back_url param before calling redirect_to.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1893 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-21 12:45:22 +00:00
winterheart
e1c4659752 #1928, update for Italian language
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1892 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-21 12:32:16 +00:00
winterheart
72c9884dfc de.yml from #1745, thank to Sven Schuchmann and Thomas Löber for contribution
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1891 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-21 12:31:34 +00:00
Jean-Philippe Lang
7afdb01f00 Fixed: login filter providing incorrect back_url for Redmine installed in sub-directory (#1900).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1890 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-21 12:07:44 +00:00
Jean-Philippe Lang
1d542a5113 Fixes VersionTest class.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1889 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-21 08:54:50 +00:00
Jean-Philippe Lang
199428804f Fixed: invalid effective date (eg. 99999-01-01) causes an error on version edition screen.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1888 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-21 08:54:02 +00:00
Jean-Philippe Lang
6854827f1a Fixed: Roadmap crashes when a version has a due date > 2037.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1887 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-20 14:07:52 +00:00
winterheart
5452fd2f5a #1925, patch for lt.yml
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1885 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-19 16:33:08 +00:00
winterheart
701e00d865 #1924, update for da.yml
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1884 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-19 16:30:39 +00:00
winterheart
4e36bd2ce1 #1923, updated zh.yml
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1883 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-19 16:26:19 +00:00
winterheart
124ea898d5 patch #1922, update for nl.yml
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1882 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-19 16:23:04 +00:00
winterheart
07b69fd7fc fixed #1920, patch for Hungarian language
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1881 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-19 16:20:45 +00:00
winterheart
952ff4184e #1918, translation for zh-tw
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1880 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-19 16:17:35 +00:00
winterheart
5c449f844e update of ru.yml
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1879 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-19 16:15:49 +00:00
Jean-Philippe Lang
16e09bfd77 Adds watch/unwatch functionality at forum topic level (#1912).
Users who create/reply a topic are automatically added as watchers but are now able to unwatch the topic.

git-svn-id: http://redmine.rubyforge.org/svn/trunk@1878 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-19 15:32:52 +00:00
Jean-Philippe Lang
9e7bce6a94 Make --command option usable on Windows.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1877 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-17 19:47:36 +00:00
Jean-Philippe Lang
710ac5344d Slight change on git repository creation command.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1876 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-17 19:38:20 +00:00
Jean-Philippe Lang
36aeeb99d9 reposman: change #log arguments.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1875 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-17 19:18:31 +00:00
Jean-Philippe Lang
713ce06e40 Fixed custom query sidebar links broken by r1797 (#1899).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1873 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-17 17:23:08 +00:00
Jean-Philippe Lang
fcbd2b5228 Removes unused image references in stylesheets (#1914).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1872 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-17 17:18:05 +00:00
Jean-Philippe Lang
14b4afeec9 Fixed: http links containing parentheses fail to reder correctly (#1591). Patch by Paul Rivier.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1871 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-17 16:48:04 +00:00
Jean-Philippe Lang
3520961eae Render the commit changes list as a tree (#1896).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1870 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-17 16:39:23 +00:00
winterheart
0961cdab31 Patch #1909, updates for ru.yml
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1869 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-17 15:31:35 +00:00
Jean-Philippe Lang
a987649b1a mailhandler: fixes exit status and adds an explicit message if response code is 403.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1868 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-16 21:56:02 +00:00
Jean-Philippe Lang
9afaf26d66 Use RDoc.usage
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1867 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-16 21:54:53 +00:00
Nicolas Chuche
a07a6d4aa4 * reposman can create git repository with "--scm git" option
* light refactoring

git-svn-id: http://redmine.rubyforge.org/svn/trunk@1866 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-15 19:37:43 +00:00
winterheart
25ed19cb35 Catalan translation (#1822), thanks to Joan Duran for contribuition. Some strings has wrong quoting, I fixed that.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1865 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-15 16:07:30 +00:00
winterheart
1f862dbadb Minor typo, fixed #1897, thank Denis Tomashenko for reporting.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1864 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-15 15:22:53 +00:00
winterheart
3ef92341fd fixed #1905, patch for Hungarian language
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1863 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-15 15:19:51 +00:00
winterheart
225b6f4dc9 #1907, translation for zh
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1862 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-15 15:16:53 +00:00
winterheart
094520ab20 #1902, translation for zh-tw
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1861 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-15 15:14:34 +00:00
Nicolas Chuche
90dc93b81c bugfix
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1860 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-14 19:03:46 +00:00
winterheart
323a26030b sorting new string...
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1830 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-14 13:08:02 +00:00
winterheart
653d2aacbb fixed #1216, thank Antti Perkiömäki for reporting
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1829 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-14 12:59:12 +00:00
Jean-Philippe Lang
f6b05ea3fb Functional tests fail when run on their own (#1895).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1828 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-14 12:41:24 +00:00
Jean-Philippe Lang
3041041a62 Adds :view_wiki_edits permission to default roles.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1827 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-14 10:54:19 +00:00
winterheart
691b09fd72 Fixed #1810, one string left
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1826 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-13 19:43:27 +00:00
winterheart
f30a369d35 fixed #1839, #1814, #1747 and #1698
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1825 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-13 19:12:50 +00:00
winterheart
487ba400fc fixed #1597, thank to Alexandre da Silva for patience :)
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1824 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-13 19:05:14 +00:00
winterheart
2e0cd9f196 oops, we have newest #1849, sorry
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1823 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-13 18:55:54 +00:00
winterheart
59c961425e fixed #1832
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1822 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-13 18:52:27 +00:00
Jean-Philippe Lang
570d7e494e Fixed: unable to revert to a previous wiki page version.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1821 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-13 18:45:56 +00:00
Jean-Philippe Lang
1f1fd9e034 Expand RAILS_ROOT path on startup (#1892).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1820 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-13 18:32:37 +00:00
winterheart
35bb9307dc fixed #1818, some strings untranslated
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1819 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-13 18:12:19 +00:00
winterheart
47679629f4 patch #1639, some new strings untranslated
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1818 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-13 17:54:55 +00:00
Jean-Philippe Lang
06f4b371ee Adds Turkish translation by Ismail Sezen (#1866).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1817 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-13 17:25:01 +00:00
winterheart
c3040104ff fixed #1632, patch from Станислав Герман-Евтушенко
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1816 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-13 17:06:37 +00:00
Jean-Philippe Lang
455abea320 Adds a permission 'view wiki edits' so that wiki history can be hidden to certain users (#1154).
A migration automatically adds this permission to roles that were allowed to view wiki pages.

git-svn-id: http://redmine.rubyforge.org/svn/trunk@1815 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-13 16:45:01 +00:00
Jean-Philippe Lang
cc643ce932 Merged nbc branch @ r1812 (commit access permission and reposman improvements).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1814 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-13 16:31:11 +00:00
winterheart
6ef6459630 fixed #1635, merged changes to trunk, sorting all strings
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1813 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-13 16:30:03 +00:00
Jean-Philippe Lang
827e14eafe Mailer compatibility with Rails 2.1.1.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1811 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-13 15:33:46 +00:00
Jean-Philippe Lang
8fac9233de Engines compatibility with Rails 2.1.1 (#1886).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1810 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-13 15:33:12 +00:00
Jean-Philippe Lang
7385722441 Removes double quotes in commit link syntax (#1872).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1803 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-13 09:45:07 +00:00
Jean-Philippe Lang
b73141a153 Adds links to changesets atom feed on repository browser (#1873).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1802 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-12 17:17:25 +00:00
Jean-Philippe Lang
8d6b32645c Template error when user's timezone isn't set and UTC timestamps are used (#1889).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1801 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-11 17:45:21 +00:00
Jean-Philippe Lang
a592d6c40d Renames bundled RedCloth to RedCloth3 to avoid RedCloth 4 to be loaded instead (#1754).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1800 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-11 17:19:26 +00:00
Jean-Philippe Lang
fb151463eb Changes versions retrieval on gantt chart.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1799 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-11 17:08:00 +00:00
Jean-Philippe Lang
586f4e3831 Adds support for free ticket filtering and custom queries on Calendar.
ProjectsController#calendar moved to IssuesController.

git-svn-id: http://redmine.rubyforge.org/svn/trunk@1798 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-11 17:03:26 +00:00
Jean-Philippe Lang
2986afc05e Adds support for free ticket filtering and custom queries on Gantt chart.
ProjectsController#gantt moved to IssuesController.

git-svn-id: http://redmine.rubyforge.org/svn/trunk@1797 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-10 18:26:13 +00:00
Eric Davis
a8e3ddf382 Added context fields to the :view_projects_settings_members_table hooks
* :view_projects_settings_members_table_header now has :project
* :view_projects_settings_members_table_row now has :project
* :view_projects_settings_members_table_row has a fixed :member field


git-svn-id: http://redmine.rubyforge.org/svn/trunk@1796 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-10 01:49:51 +00:00
Eric Davis
de7d367820 Reverting commit r1748 again. r1786 pulled in in again
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1795 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-10 00:14:38 +00:00
Jean-Philippe Lang
f7acdd1afd Merged hooks branch @ r1785 into trunk.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1786 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-05 10:31:06 +00:00
Jean-Philippe Lang
4b9df2eac7 Fixes Repository#clear_changesets.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1783 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-09-04 19:35:08 +00:00
Jean-Philippe Lang
696d21f8c8 Adds cross-project time reports support (#994).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1778 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-31 16:34:54 +00:00
Jean-Philippe Lang
dbad26c87d Adds an option to generate sequential project identifiers.
Disabled by default, it can be enabled on the 'Projects' tab in application settings.

git-svn-id: http://redmine.rubyforge.org/svn/trunk@1777 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-31 12:59:57 +00:00
Nicolas Chuche
25b4139028 bug in read only access handling
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1776 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-31 12:11:49 +00:00
Jean-Philippe Lang
ed349ca942 Sligth changes to issue comments quoting links.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1773 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-28 19:04:04 +00:00
Jean-Philippe Lang
bfd0fb067a Adds posts quoting functionality (#1825).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1772 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-28 18:56:47 +00:00
Eric Davis
8f3a04ce69 Reverting commit r1748. Some environments are not allowing the cached file to
write to public, causing all JavaScript to fail.

Javascripts are now cached into a single file for downloads in production mode.

  #1186


git-svn-id: http://redmine.rubyforge.org/svn/trunk@1771 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-28 16:32:14 +00:00
Jean-Philippe Lang
6ad989f828 Adds checkboxes toggle links on permissions report.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1770 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-26 16:05:02 +00:00
Jean-Philippe Lang
5c6bee7f85 Simplified Chinese lang file update (#1809 by Chaoqun Zou).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1769 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-26 15:19:28 +00:00
Jean-Philippe Lang
d611339baa Fixes error with CVS+Postgresql and non-UTF8 commit logs (#917, #1659).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1768 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-26 12:28:15 +00:00
Jean-Philippe Lang
0cf15476a3 Adds support for commit logs reencoding to UTF-8 before insertion in the database (#834, #917, #1663).
Source encoding of commit logs can be selected in Application settings -> Repositories.

git-svn-id: http://redmine.rubyforge.org/svn/trunk@1767 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-26 12:13:15 +00:00
Jean-Philippe Lang
09eba46ec1 Fixed: document listing shows on "my page" when viewing documents is disabled for the role (#1772).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1766 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-26 11:08:45 +00:00
Jean-Philippe Lang
ea627ca98d One-click bulk edition using the issue list context menu within the same project (#1770).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1765 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-26 10:34:26 +00:00
Jean-Philippe Lang
999d47f986 Use example.net as domain in default configuration (#1762).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1764 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-25 16:35:20 +00:00
Jean-Philippe Lang
66a079f430 Changes help message about project identifiers (#1478).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1763 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-25 16:14:07 +00:00
Jean-Philippe Lang
e395d3e46d Fixes context menu with Opera (#1655).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1762 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-25 15:24:23 +00:00
Jean-Philippe Lang
954bddbadf Make the issue list context menu work under Mac OSX Leopard (#1485). Tested with FF3.0.1 and Safari 3.0.4 under OSX 10.5.2.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1761 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-25 15:09:31 +00:00
Jean-Philippe Lang
2042e3bbd9 Dots allowed in custom field name (#1723).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1760 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-25 14:37:44 +00:00
Jean-Philippe Lang
d93f96765b Adds support for file viewing with Darcs 2.0+ (patch #1799 by Ralph Lange slightly edited).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1759 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-25 14:33:30 +00:00
Jean-Philippe Lang
e339d0bcc0 Fixed: Issue updated_on is not updated when a user adds a note with no edit privilege.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1758 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-25 12:51:29 +00:00
Jean-Philippe Lang
dbf4438dda More detailed error message in log when scm command fails (#1682).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1757 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-25 12:31:53 +00:00
Jean-Philippe Lang
0d55652552 Fixes method name in AbstractAdapter.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1756 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-25 12:27:15 +00:00
Jean-Philippe Lang
6fc62d393c Fixed: invalid SQL query on User#destroy (#1781).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1755 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-25 11:55:40 +00:00
Jean-Philippe Lang
5ef0af6710 Fixed: Estimated time in issue's journal should be rounded to two decimals (#1793).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1754 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-25 11:43:48 +00:00
Jean-Philippe Lang
116091a1d2 Fixes platform determination under JRuby (#1804).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1753 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-25 11:01:37 +00:00
Eric Davis
2f3f2d8b12 Added the "Status:" keyword to the MailHandler for setting and changing an Issue status via email.
#1669


git-svn-id: http://redmine.rubyforge.org/svn/trunk@1751 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-20 06:21:06 +00:00
Eric Davis
6db8fa8ef7 Messages on a Board can now be sorted by the number of replies.
#1761


git-svn-id: http://redmine.rubyforge.org/svn/trunk@1750 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-20 06:14:44 +00:00
Eric Davis
af6b01f55d Hiding the View Differences button when a wiki page's history only has one version.
Patch contributed by Chaoqun Zou (#1743)


git-svn-id: http://redmine.rubyforge.org/svn/trunk@1749 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-20 05:09:13 +00:00
Eric Davis
a899904f63 Javascripts are now cached into a single file for downloads in production mode.
Thanks to Philippe Lafoucrière for the patch.  (#1186)


git-svn-id: http://redmine.rubyforge.org/svn/trunk@1748 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-20 04:26:46 +00:00
Jean-Philippe Lang
53078ca949 No warning about rcov each time a rake task is ran.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1747 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-15 18:44:46 +00:00
Eric Davis
910988133d Extracted rcov options and removed gems from the rcov report.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1745 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-13 04:20:23 +00:00
Eric Davis
fab5c1fdef Added rake tasks to generate rcov code coverage reports. rake -T test:coverage to see them all
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1744 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-13 04:20:16 +00:00
Eric Davis
ca2449d9cf Added missing documentation for setting up the Darcs test repository.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1743 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-13 03:54:54 +00:00
Jean-Philippe Lang
41d44c5285 Adds user count in status drop down on admin user list.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1735 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-11 21:10:24 +00:00
Jean-Philippe Lang
d47400aa8d Adds Lock/Unlock/Activate link on user edit screen.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1734 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-11 21:02:36 +00:00
Jean-Philippe Lang
988f8d65fa Adds 'Edit' link on account/show for admin users.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1733 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-11 20:55:17 +00:00
Eric Davis
a3e729a263 Added doc/README_FOR_APP so RDoc can be built. (#1769)
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1732 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-11 20:49:52 +00:00
Jean-Philippe Lang
237a3f52a2 Fixes custom fields display order at several places (#1768).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1731 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-11 18:24:39 +00:00
Jean-Philippe Lang
1631019026 Allow same name for custom fields on different object types.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1730 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-11 18:09:54 +00:00
Jean-Philippe Lang
1650920339 Adds links to forum messages using message#id syntax (#1756).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1729 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-10 22:18:23 +00:00
Jean-Philippe Lang
ab4873b83d Quote ids for attachment association since Trac's attachment.id is varchar (#1759).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1728 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-10 21:35:03 +00:00
Jean-Philippe Lang
2fdf4426cd Moves @layout 'base'@ to ApplicationController.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1727 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-10 15:22:54 +00:00
Jean-Philippe Lang
361138e16d Slight change to engines to let plugins override views.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1723 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-07 19:59:02 +00:00
Jean-Philippe Lang
2e4e9b88d2 Fixes rdm-mailhandler SSL support (#1724).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1715 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-03 11:07:16 +00:00
Jean-Philippe Lang
91a5fa32d7 Fixes non-matching html tag (#1734).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1714 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-03 09:30:56 +00:00
Jean-Philippe Lang
d1a504f768 Fixed: logtime entry duplicated when edited from parent project (#1728).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1713 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-03 09:27:27 +00:00
Jean-Philippe Lang
a332e0a4fe Adds permissions for viewing the watcher list and adding new watchers on the issue detail view (#398).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1712 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-08-03 09:14:43 +00:00
Jean-Philippe Lang
6034067d86 Fixed: activity atom feed broken by r1701 (#1703).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1711 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-30 18:33:35 +00:00
Jean-Philippe Lang
3197814c62 Fixed: RedCloth#block_markdown_rule freezes when parsing many hyphen marks (#1704).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1710 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-30 18:28:01 +00:00
Jean-Philippe Lang
b91bdf8798 Fixed: tokens not escaped in highlight_tokens regexp (#1702).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1709 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-28 21:11:49 +00:00
Jean-Philippe Lang
b26e4932a2 Smaller font in context menu.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1708 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-28 18:01:05 +00:00
Jean-Philippe Lang
c3f9575eaf Adds category to the issue context menu (#1684).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1707 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-28 18:00:30 +00:00
Jean-Philippe Lang
198a8c602d Adds support for wiki links with anchor (#1647).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1706 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-28 17:20:31 +00:00
Jean-Philippe Lang
2dbc3d2943 Adds Trac-Like anchors on wiki headings (#1647).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1705 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-28 17:08:16 +00:00
Jean-Philippe Lang
b20281f151 Follows r1703.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1704 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-27 19:18:35 +00:00
Jean-Philippe Lang
3a4855d070 Activity provider example in sample plugin.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1703 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-27 19:10:56 +00:00
Jean-Philippe Lang
d05bcda2ba Adds #activity_provider shortcut method to the plugin API.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1702 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-27 18:38:31 +00:00
Jean-Philippe Lang
a774c5c48b Activity refactoring.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1701 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-27 17:54:09 +00:00
Jean-Philippe Lang
1721376542 Fixes tests (r1693).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1700 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-27 10:23:07 +00:00
Jean-Philippe Lang
ec7d135930 Adds child_pages macro for wiki pages (#528).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1699 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-26 12:54:54 +00:00
Jean-Philippe Lang
60d066f943 Wiki page hierarchy (#528). Parent page can be assigned on Rename screen.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1698 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-26 11:46:24 +00:00
Jean-Philippe Lang
b68fd4c04b When moving an issue to another project, reassign it to the category with same name if any (#1653).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1697 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-26 09:27:07 +00:00
Jean-Philippe Lang
6ddea3396b Adds estimated hours to issue filters (#1678).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1696 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-26 09:05:26 +00:00
Jean-Philippe Lang
9f92554319 Redirect user to the previous page after logging in (#1679).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1695 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-26 08:46:33 +00:00
Jean-Philippe Lang
5564dfbbd5 TOC rendered as an unordered list.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1693 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-22 19:40:47 +00:00
Jean-Philippe Lang
a17b62b455 Fixes hard-coded table names in queries.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1692 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-22 19:07:43 +00:00
Jean-Philippe Lang
d84d38983a Adds boolean and list custom fields for time entries as criteria on timelog report.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1691 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-22 19:06:13 +00:00
Jean-Philippe Lang
f54c2d812d Adds custom fields to the time entries csv export.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1690 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-22 19:02:40 +00:00
Jean-Philippe Lang
898fac293b Adds custom fields on time entries (#772).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1689 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-22 18:52:00 +00:00
Jean-Philippe Lang
590a829a06 Removed unused exception definition (r1678).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1688 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-22 18:24:40 +00:00
Jean-Philippe Lang
a9932e3dbd Adds mailto link on the user administration list (#1670).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1687 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-22 17:59:45 +00:00
Jean-Philippe Lang
9b579de9e2 Appends the filename to the attachment url so that clients that ignore content-disposition http header get the real filename (#1649).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1686 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-22 17:55:19 +00:00
Jean-Philippe Lang
8a7bfc72b2 Move VersionsController#download to AttachmentsController.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1685 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-22 17:20:02 +00:00
Jean-Philippe Lang
aaca2c50e5 Fixed: 'search titles only' box ignored after one search is done on titles only.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1684 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-21 19:19:06 +00:00
Jean-Philippe Lang
9d3dfea1ac Adds username to the password reminder email (#1668).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1683 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-21 19:13:46 +00:00
Jean-Philippe Lang
c39161a6fc Fixed: searchable model can't be loaded if table is not yet created (#1421).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1682 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-20 17:31:11 +00:00
Jean-Philippe Lang
be2b8a62f4 Search engine: display total results count (#906) and count by result type.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1681 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-20 17:26:07 +00:00
Jean-Philippe Lang
83baccb71a Strikethru closed issue links (#1127).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1680 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-20 09:50:33 +00:00
Jean-Philippe Lang
1ddd9bb55b Fixed: dependency on ruby 1.8.7 introduced in r1660 (#1643).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1679 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-20 09:25:30 +00:00
Jean-Philippe Lang
eb1d969237 Improved on-the-fly account creation. If some attributes are missing (eg. not present in the LDAP) or are invalid, the registration form is displayed so that the user is able to fill or fix these attributes.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1678 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-19 10:47:19 +00:00
Jean-Philippe Lang
93201e7386 Fixed: Wiki Linking Fails on News Item Preview (#1661).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1677 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-19 07:29:05 +00:00
Jean-Philippe Lang
324495643b Small fix to gloc error messages translation.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1676 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-19 07:19:55 +00:00
Jean-Philippe Lang
1701e0bd79 Fixed: default configuration can not be loaded for :it, :pt and :ro languages (#1660).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1675 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-17 16:27:29 +00:00
Jean-Philippe Lang
795220a1e6 Adds links to the user page on various views.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1674 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-16 19:33:15 +00:00
Jean-Philippe Lang
aef25a5e32 Fixes r1672.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1673 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-16 19:22:09 +00:00
Jean-Philippe Lang
83385cbca8 Adds timelog link to the issue context menu (#1645).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1672 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-16 19:10:29 +00:00
Jean-Philippe Lang
7c6f191cf5 Fixed: Context menu overwritten by calendar on My Page (#1644).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1671 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-16 18:48:50 +00:00
Jean-Philippe Lang
025581bb28 Fixes boolean custom fields tags (broken by r1592) (#1640).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1668 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-14 17:29:06 +00:00
Jean-Philippe Lang
6d3c0dab01 Javascript fix (#1636).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1667 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-14 15:46:02 +00:00
Jean-Philippe Lang
fc07ba2a99 Clear changesets and changes with raw sql when deleting a repository (#1627).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1666 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-13 21:55:13 +00:00
Jean-Philippe Lang
0eba42423a Set order on wiki pages association.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1665 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-13 21:44:38 +00:00
Jean-Philippe Lang
9ba4075c88 Fixes search tests for Postgresql.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1664 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-13 21:01:38 +00:00
Jean-Philippe Lang
937cee7269 Prevent blank menu caption.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1663 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-13 13:25:37 +00:00
Jean-Philippe Lang
ad497bdcba Admin and Help links at the end of top menu.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1661 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-13 12:25:01 +00:00
Jean-Philippe Lang
7b8a4fc28b Menu mapper: add support for :before, :after and :last options to #push method and add #delete method.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1660 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-13 12:12:58 +00:00
Jean-Philippe Lang
c4eef6314e Menu item caption can be a Proc.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1659 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-13 11:02:42 +00:00
Jean-Philippe Lang
591407c5c8 Adds auto links tests.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1658 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-12 11:12:33 +00:00
Jean-Philippe Lang
4e7336dac9 Fixes engines assets mirroring.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1657 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-12 11:04:41 +00:00
Jean-Philippe Lang
a01a562261 Fixed: Plugin's setting page is broken after upgrading to rails 2.1.0 (#1620).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1656 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-12 10:31:41 +00:00
Jean-Philippe Lang
0b1343834d Translations updates.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1655 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-12 10:28:09 +00:00
Jean-Philippe Lang
c28cbd5790 Adds engines 2.1.0 plugin.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1654 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-12 10:17:14 +00:00
Jean-Philippe Lang
b5444b5fcd Fixed: no :author method error on projects atom feed (#1623).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1653 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-12 09:42:18 +00:00
Jean-Philippe Lang
622b6121f4 Fixes nil error when svn binary version is unknown (#1607).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1652 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-12 09:06:19 +00:00
Jean-Philippe Lang
9ff53f97ee Do not use partial in PDF templates (not supported when using rfpdf with Rails 2.1) (#1619).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1651 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-10 16:23:42 +00:00
Jean-Philippe Lang
d7eb689c74 Fixed: trailing period should not be included in redmine links of type class:id (#1612).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1650 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-10 13:36:28 +00:00
Jean-Philippe Lang
be4cc2f99e Fixed: search engine may reveal private projects (#1613).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1649 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-10 12:31:49 +00:00
Jean-Philippe Lang
de3d5a88e4 Fixes links to entries on the revision view (Rails 2.1 compatibility) (#1600).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1648 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-09 17:25:19 +00:00
Jean-Philippe Lang
bb76561ca6 Fixes Gantt chart with ruby 1.8.7 (#1606).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1647 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-09 17:16:37 +00:00
Jean-Philippe Lang
40efaae6d5 Mail handler: more control over issue attributes (#1110).
Tracker, category and priority attributes can be specified in command line arguments and/or individually specified as overridable by email body keywords.

git-svn-id: http://redmine.rubyforge.org/svn/trunk@1643 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-06 16:26:25 +00:00
Jean-Philippe Lang
bfba84d526 Better naming of activity feed if only one kind of event is displayed (#1323).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1642 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-06 13:57:10 +00:00
Jean-Philippe Lang
d4f55a86fd Adds project name to issues feed title (#1323).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1641 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-06 13:47:59 +00:00
Jean-Philippe Lang
8c6c3eab5c Fixes "source:" links URLs (r1617).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1640 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-06 12:43:51 +00:00
Jean-Philippe Lang
bc9a8494d2 Merged CHANGELOG from 0.7 stable.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1639 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-06 12:24:14 +00:00
Jean-Philippe Lang
29fb8db936 Adds MercurialAdapter.client_version and prevent @hg --version@ to be called on each request.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1628 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-05 09:39:00 +00:00
Jean-Philippe Lang
12fbd06c02 Display svn properties in the browser, svn >= 1.5.0 only (#1581).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1627 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-05 08:59:04 +00:00
Jean-Philippe Lang
1e6b8a482a Removes calls to TimeZone#adjust (#1584).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1626 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-05 07:39:07 +00:00
Jean-Philippe Lang
fc42dd2cef Email delivery configuration moved to an unversioned YAML file (config/email.yml, see the sample file) (#1412).
Email delivery is disabled. It's automatically turned on when configuration is found.

git-svn-id: http://redmine.rubyforge.org/svn/trunk@1625 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-04 18:55:45 +00:00
Jean-Philippe Lang
5d0b53544c Updated INSTALL doc.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1624 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-04 18:03:43 +00:00
Jean-Philippe Lang
7cdd88a6ce Merged Rails 2.1 compatibility branch.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1623 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-04 17:58:14 +00:00
Jean-Philippe Lang
22558f7709 Fixes test broken by r1610.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1616 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-03 16:22:51 +00:00
Jean-Philippe Lang
9703f576d9 Escapes HTML tags.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1612 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-07-02 17:27:16 +00:00
Jean-Philippe Lang
be57c20cd8 Fixes quick jump to a revision.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1611 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-30 21:52:29 +00:00
Jean-Philippe Lang
72076d391e Fixed: issues always created with default tracker (#1553).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1610 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-30 17:57:53 +00:00
Jean-Philippe Lang
87a16f395a Fixes relative paths to images in wiki_syntax.html (#1218).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1609 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-30 17:35:40 +00:00
Jean-Philippe Lang
ee608f24f4 Fixed: Comment too long message when updating issue (#1550).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1608 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-30 17:31:50 +00:00
Jean-Philippe Lang
b29b39290a Redirects back after clicking watch/unwatch links without javascript (#1337).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1607 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-29 19:56:20 +00:00
Jean-Philippe Lang
0f5a34b7ab Removes no longer needed helper method (r1605).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1606 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-29 19:51:14 +00:00
Jean-Philippe Lang
47064c02f1 Makes issue update link work without javascript (#1337).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1605 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-29 19:50:07 +00:00
Jean-Philippe Lang
5d6e9494ad Translations updates:
* Traditional Chinese (ChunChang Luo)
* Finnish (Jani Tiainen)
* Lithuanian (Sergej Jegorov)

git-svn-id: http://redmine.rubyforge.org/svn/trunk@1604 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-29 12:23:07 +00:00
Jean-Philippe Lang
32fa1a4e90 Do not silently ignore timelog validation failure on issue edit.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1603 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-29 12:16:58 +00:00
Jean-Philippe Lang
1424b0f215 Addq "please select" to activity select box if no activity is set as default (#937).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1602 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-29 12:01:20 +00:00
Jean-Philippe Lang
94cf4f258f Wider SVG graphs in repository stats.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1601 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-29 11:13:10 +00:00
Jean-Philippe Lang
a0f707e54b Fixed: Entourage (and some old client) fails to correctly render notification styles (#1425).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1600 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-29 09:50:42 +00:00
Jean-Philippe Lang
00593f2f34 Reduces memory usage when importing large git repositories (#1482).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1599 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-29 09:41:42 +00:00
Jean-Philippe Lang
a40add57de Adds HTML titles to forums related views.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1598 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-29 09:08:58 +00:00
Jean-Philippe Lang
0344719482 Makes importer work with Trac 0.8.x (#1540).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1597 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-29 09:03:03 +00:00
Jean-Philippe Lang
22c9a43899 Fixed: associated revisions are displayed in wrong order on issue view (#1546).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1596 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-29 08:55:37 +00:00
Jean-Philippe Lang
fa88a592fd Fixed #1545: migration on fresh install fails (broken by r1592).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1595 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-29 08:14:13 +00:00
Jean-Philippe Lang
75a5dbd01d Upgraded to Prototype 1.6.0.1.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1594 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-28 11:34:53 +00:00
Jean-Philippe Lang
bd3191f80d New rake task name in comments for creating sessions migration (#1520).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1593 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-27 20:18:23 +00:00
Jean-Philippe Lang
ce6cf66f6c Custom fields refactoring: most of code moved from controllers to models (using new module ActsAsCustomizable).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1592 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-27 20:13:56 +00:00
Jean-Philippe Lang
a4a8b6381e Adds a key in lang files (general_csv_decimal_separator) to set the decimal separator (point or comma) in csv exports (#1372).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1591 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-26 19:46:57 +00:00
Jean-Philippe Lang
864ac367e8 Translations updates:
* Simplified Chinese (chaoqun zou)
* Hungarian (Gábor Takács)
* Russian (Denis Tomashenko)

git-svn-id: http://redmine.rubyforge.org/svn/trunk@1590 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-26 19:29:05 +00:00
Jean-Philippe Lang
f79f19f84c Fixed: timelog redirects inappropriately when :back_url is blank (#1524).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1589 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-26 19:11:07 +00:00
Jean-Philippe Lang
0fd9b102be Adds anchor to atom feed messages links.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1588 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-26 19:04:58 +00:00
Jean-Philippe Lang
b3939fb134 Link to view specific file on revision view fails with Subversion repository subdirectory (#1525).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1587 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-26 17:02:09 +00:00
Jean-Philippe Lang
ad7816cea4 Tests: create tmp/test if it doesn't exist.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1586 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-26 14:59:03 +00:00
Jean-Philippe Lang
31e3d180c0 Add project name to cross-project Atom feeds (#1527).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1585 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-26 14:54:45 +00:00
Jean-Philippe Lang
25bba80c9e Adds a simple API and a standalone script that can be used to forward emails from a local or remote email server to Redmine (#1110).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1584 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-25 19:25:28 +00:00
Jean-Philippe Lang
4d6f50d3fe Encoding set to utf8 in example database.yml (#1506).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1583 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-24 18:39:49 +00:00
Jean-Philippe Lang
c97a5efde9 Fixed: private method 'gsub' called for nil:NilClass on activity (#1519).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1582 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-24 16:52:41 +00:00
Jean-Philippe Lang
8474d05e99 Fixes test broken by r1578.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1581 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-24 16:49:51 +00:00
Jean-Philippe Lang
3121e0b5d0 Smaller font size for activity events and search results descriptions.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1580 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-23 17:12:12 +00:00
Jean-Philippe Lang
810ec643f8 Strip pre/code tags content from activity view events.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1579 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-23 17:06:58 +00:00
Jean-Philippe Lang
dc57b06b6c Adds a class ('me') to events of the activity view created by current user.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1578 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-23 17:01:21 +00:00
Jean-Philippe Lang
28c094f50e Turn ftp urls into links (#1514).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1577 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-23 16:51:13 +00:00
Jean-Philippe Lang
0d5b03bab7 Add filters on cross-project issue list for custom fields marked as 'For all projects'.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1576 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-22 15:35:11 +00:00
Jean-Philippe Lang
b025b63111 Hide 'Target version' filter if no version is defined.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1575 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-22 15:20:59 +00:00
Jean-Philippe Lang
b14aa23c8c Revision view: do not display links for deleted files.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1574 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-22 14:40:45 +00:00
Jean-Philippe Lang
c107fee54e Use new image instead of expand.png
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1573 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-22 14:35:56 +00:00
Jean-Philippe Lang
8b6dd3fdcd IMAP: fetch unseen messages only.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1572 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-22 13:14:45 +00:00
Jean-Philippe Lang
8b33565b3e IMAP: Mark emails as Seen.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1571 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-22 12:56:10 +00:00
Jean-Philippe Lang
268165a013 Fixes reply attachments handling.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1570 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-22 12:37:24 +00:00
Jean-Philippe Lang
3d8d4fa0d6 Adds a rake task (redmine:email:receive_imap) to read emails from an IMAP server (#1110).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1569 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-22 12:27:00 +00:00
Jean-Philippe Lang
a01f976b4c Adds basic support for issue creation via email (#1110).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1568 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-22 10:45:03 +00:00
Jean-Philippe Lang
bb1edda6e8 Display issue notes in the activity view (#1509).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1567 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-21 12:32:47 +00:00
Jean-Philippe Lang
ba8a36a39b Removes spaces before colons on issue detail view (#1512).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1566 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-21 10:15:07 +00:00
Jean-Philippe Lang
9cfa233001 Track project and tracker changes in issue history.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1565 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-19 18:52:20 +00:00
Jean-Philippe Lang
0870f6267f Add target version to the issue list context menu.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1564 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-18 20:15:51 +00:00
Jean-Philippe Lang
fda7bcdfb6 Mercurial adapter tests fix (#1469).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1563 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-18 17:02:39 +00:00
Jean-Philippe Lang
af734b1b38 Enable syntax highlight on issues, messages and news (#1473, #1466).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1562 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-18 16:49:40 +00:00
Jean-Philippe Lang
7d143bc3f7 Allow dot in firstnames and lastnames (closes #1426).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1561 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-17 20:14:31 +00:00
Jean-Philippe Lang
062a2d6f5d Adds atom feed on time entries details (#1479).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1560 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-17 20:01:15 +00:00
Jean-Philippe Lang
d991e46f12 Fixed: urls containing @ are parsed as email adress by the wiki formatter (#1456).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1559 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-17 19:27:03 +00:00
Jean-Philippe Lang
3c95f761e6 Ability to remove enumerations (activities, priorities, document categories) that are in use. Associated objects can be reassigned to another value (#1467).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1558 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-17 19:10:54 +00:00
Jean-Philippe Lang
f4e0c77c83 Prevent unwanted textile link parsing at end of line.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1557 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-16 19:37:09 +00:00
Jean-Philippe Lang
0223b87612 RepositoriesController cleanup with rescue_from.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1555 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-15 16:11:07 +00:00
Jean-Philippe Lang
9737beecc4 Adds a field on the repository view to browse at specific revision (#1443).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1554 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-15 15:56:47 +00:00
Jean-Philippe Lang
ca6e69ec24 Fixed: view file at given revision with CVS.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1553 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-15 15:47:28 +00:00
Jean-Philippe Lang
93b3dba926 Makes changes link to entries on the revision view.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1552 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-15 14:40:05 +00:00
Jean-Philippe Lang
7c1c2e1ba2 Fixes test broken by r1549.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1551 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-15 14:39:52 +00:00
Jean-Philippe Lang
8a54c455b8 Fixes test broken by r1549.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1550 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-15 14:34:23 +00:00
Jean-Philippe Lang
5051566e51 Prettier url for changesets (#1443).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1549 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-15 14:19:06 +00:00
Jean-Philippe Lang
576130f363 Doc update for 0.7.2 release.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1546 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-15 12:25:48 +00:00
Jean-Philippe Lang
597c1e6c09 Adds links to repository directories in the browser (#1094).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1544 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-15 11:40:13 +00:00
Jean-Philippe Lang
11e9891425 Fixed: TOC does not remove colorization markups (#1423).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1542 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-15 11:00:40 +00:00
Jean-Philippe Lang
8b2105e20a Translation updates.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1540 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-15 09:49:16 +00:00
Jean-Philippe Lang
622798a5ed Close statement handler in Redmine.pm (#1433).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1539 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-15 09:43:53 +00:00
Jean-Philippe Lang
2b3009d91d Hungarian translation update (closes #1408).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1538 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-15 09:38:02 +00:00
Jean-Philippe Lang
b1a8790a36 File size display with Bazaar repositories (#1149).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1537 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-14 15:44:36 +00:00
Jean-Philippe Lang
34bcd5b80b Fixed: Logtime info lost when there's an error updating an issue (#1400).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1535 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-14 14:10:47 +00:00
Jean-Philippe Lang
846045fd05 Fixed: time entries created with the default activity even if a different one is specified (#1302).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1533 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-14 12:31:32 +00:00
Jean-Philippe Lang
40a9bbe946 CVS: add support for modules names with spaces (#1434).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1527 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-14 11:42:50 +00:00
Jean-Philippe Lang
d2ad4edc86 Fixed: page has no title when adding a project (#1436).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1526 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-14 11:15:57 +00:00
Jean-Philippe Lang
b42b697ffb Fixed: unexpected nil when viewing differences on CVS (#1444).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1525 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-14 10:51:15 +00:00
Jean-Philippe Lang
cc9b8f7878 Fixed: SVG::Graph raises an error when using external stylesheet (#1402).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1524 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-09 20:05:32 +00:00
Jean-Philippe Lang
53b5703981 Slight changes to diff view and style.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1523 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-09 19:15:40 +00:00
Jean-Philippe Lang
efe790a8d3 Removed inconsistent revision numbers on diff view.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1522 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-09 19:02:22 +00:00
Jean-Philippe Lang
19cb6f96f4 Log the user in after registration if account activation is not needed.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1521 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-09 18:59:15 +00:00
Jean-Philippe Lang
80a7486f95 File viewer for attached text files.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1520 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-09 18:40:59 +00:00
Jean-Philippe Lang
aa0beecad0 Move the file viewer to a partial.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1519 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-09 17:02:55 +00:00
Jean-Philippe Lang
e46b56d7fc "New Project" link on Projects page for admin users (#1082).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1518 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-08 22:45:22 +00:00
Jean-Philippe Lang
0389c60129 Fixed: notextile tag has no effect.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1517 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-08 20:31:36 +00:00
Jean-Philippe Lang
d77c1d2829 Unified diff viewer for attached files with .patch or .diff extension (#1403).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1516 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-08 18:26:39 +00:00
Jean-Philippe Lang
e833cab30e Move diff viewer to a partial.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1515 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-08 18:10:49 +00:00
Jean-Philippe Lang
b78b62df8d SCM browser: ability to download raw unified diffs.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1514 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-08 16:48:21 +00:00
Jean-Philippe Lang
ec0525d497 Move unified diff parser out of the scm abstract adapter so it can be reused for viewing attached diffs (#1403).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1513 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-08 16:28:42 +00:00
Jean-Philippe Lang
731d15fe9b Don't search for the changeset if revision identifier is nil.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1512 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-08 15:47:55 +00:00
Jean-Philippe Lang
0aba4255f5 Don't display the table headers if there is no changeset to display.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1511 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-08 15:46:15 +00:00
Jean-Philippe Lang
a0d1414606 Filesystem adapter: read files in binary mode.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1510 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-08 15:44:23 +00:00
Jean-Philippe Lang
5dea200774 Filesystem adapter: negative size is displayed for large files under win32.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1509 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-08 15:43:32 +00:00
Jean-Philippe Lang
e69b4647f2 Adds Filesystem adapter (patch #1393 by Paul R).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1508 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-08 15:40:24 +00:00
Jean-Philippe Lang
dfe62d7f51 Ability to disable unused SCM adapters in application settings.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1507 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-08 14:59:26 +00:00
Jean-Philippe Lang
05cd95987f Fixes tabulation with Firefox 2 on tabular forms.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1506 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-08 10:10:54 +00:00
Jean-Philippe Lang
2e8b2d5e13 Display status change before subject of issue on the activity view otherwise it may be truncated.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1505 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-07 20:06:44 +00:00
Jean-Philippe Lang
383da1e6d6 Fixes functional tests broken by r1501.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1504 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-07 15:14:42 +00:00
Jean-Philippe Lang
d446469f5d Removes constraint on enumerations name (#1384).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1503 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-07 15:08:59 +00:00
Jean-Philippe Lang
042da97f54 Trac importer: read session_attribute table to find user's email and real name (#1340).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1502 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-07 14:55:32 +00:00
Jean-Philippe Lang
956ad0a3f9 Fixed: Reply/Quote Function Newline Issue in Internet Explorer (#1362).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1501 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-07 11:42:37 +00:00
Jean-Philippe Lang
6d5db302ee Subversion adapter: ignore directories with no commit date (#1370).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1500 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-07 10:08:11 +00:00
Jean-Philippe Lang
aa9d04a4a7 Mercurial adapter improvements (patch #1199 by Pierre Paysant-Le Roux).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1499 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-07 09:19:50 +00:00
Jean-Philippe Lang
a6da479a63 Translations updates.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1498 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-07 09:03:20 +00:00
Jean-Philippe Lang
f4aa04b96e Fixes Chinese pdf export when the issue description is too long (#1170).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1497 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-07 08:39:06 +00:00
Jean-Philippe Lang
9f901a0ba2 Fixed: Atom link on saved query does not include query_id (#1390).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1496 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-06 15:20:08 +00:00
Jean-Philippe Lang
a0f83e42e4 Hides the "Replies" heading below a message if there is no reply (#1350).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1495 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-06 15:14:09 +00:00
Jean-Philippe Lang
8aa57058cf Trac importer: improves wiki link conversion (#1287).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1494 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-06 15:02:47 +00:00
Jean-Philippe Lang
a5ee8f8986 Fixed: SVN errors lead to svn username/password being displayed to end users (#1368).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1493 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-06 14:37:49 +00:00
Jean-Philippe Lang
cd824c6ecf Redmine links regexp fix (#1369, url hash turned into a ticket link).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1492 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-04 21:30:12 +00:00
Jean-Philippe Lang
4db45b8ced Fixed: changesets titles should not be multiline in atom feeds (#1356).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1491 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-04 18:13:14 +00:00
Jean-Philippe Lang
735db3dae5 Allow empty cells in wiki tables.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1490 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-04 17:12:59 +00:00
Jean-Philippe Lang
a77fb3b591 Missing strings (r1488).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1489 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-03 18:41:36 +00:00
Jean-Philippe Lang
7042879811 Make the 'duplicates of' relation asymmetric:
* closing a issue will close its duplicates
* closing a duplicate won't close the main issue

git-svn-id: http://redmine.rubyforge.org/svn/trunk@1488 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-03 18:30:29 +00:00
Jean-Philippe Lang
891a71ad47 Fixed: new line at the end of a file is not displayed in diff.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1487 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-02 20:14:06 +00:00
Jean-Philippe Lang
36162c6cf2 Diff: adds some space between 2 changes in the same file and reduces html size.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1486 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-02 19:18:17 +00:00
Jean-Philippe Lang
870e8654b4 Fixed: Atom feeds don't provide author section for repository revisions (#1348).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1485 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-02 18:16:56 +00:00
Jean-Philippe Lang
4cc3ba88a8 Fixed: Link to PDF doesn't work after creating new issue (#1346).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1484 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-02 17:01:02 +00:00
Jean-Philippe Lang
a06d2c41d5 Fixed: Reminder emails shouldn't include archived projects (#1351).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1483 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-06-02 16:59:15 +00:00
Jean-Philippe Lang
50c338b229 Additional test for r1481.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1482 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-30 18:42:56 +00:00
Jean-Philippe Lang
9894a3781e Fixed: browser's accept-language subcodes ignored (#1320).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1481 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-30 18:40:02 +00:00
Jean-Philippe Lang
5d2abb84bd Adds a Reply link to each issue note (#739). Reply is pre-filled with the quoted note.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1480 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-30 17:42:25 +00:00
Jean-Philippe Lang
88dea1a06d Adds multi-levels blockquotes support by using > at the beginning of lines.
Textile is preserved inside quoted text.

git-svn-id: http://redmine.rubyforge.org/svn/trunk@1479 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-30 16:35:36 +00:00
Jean-Philippe Lang
4311ecbc04 Fixed: Incorrect weekend definition in Hebrew calendar locale (#1328).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1478 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-30 15:34:53 +00:00
Jean-Philippe Lang
ffea044699 Trac importer: migrate attachments descriptions (#1326).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1477 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-29 19:31:21 +00:00
Jean-Philippe Lang
6ebdf848a5 Fixed: Unable to use angular braces after include word in c code highlighting (#1230).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1476 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-29 19:12:17 +00:00
Jean-Philippe Lang
e1a86106d0 Fixed: GitAdapter#get_rev should use current branch instead of hardwiring @master@ (#1319).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1475 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-29 18:48:00 +00:00
Jean-Philippe Lang
39216f327c Fixed: can not access old projects created with a numeric identifier (#1322).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1473 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-29 17:42:10 +00:00
Jean-Philippe Lang
eb0e218603 Adds new projects atom feed (#1290).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1465 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-27 16:49:18 +00:00
Jean-Philippe Lang
744d866926 Moved ProjectsController#list to ProjectsController#index.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1464 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-26 20:10:32 +00:00
Jean-Philippe Lang
aa87a73e41 No multiline text for textile links.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1463 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-26 19:39:51 +00:00
Jean-Philippe Lang
54138d2b17 Fixed roadmap links to versions (#1297).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1462 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-26 19:12:29 +00:00
Jean-Philippe Lang
d6daeca40a Fixed: IssueController#edit doesn't set default Activity as default (#1302).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1461 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-26 17:12:11 +00:00
Jean-Philippe Lang
b3e5f1a1c3 Fixed zh lang file.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1460 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-25 20:49:07 +00:00
Jean-Philippe Lang
0c81052770 Adds a rake task to send reminders. An email is sent to each user with a list of the issues due in the next days, if any.
See @rake -D redmine:send_reminders@ for options.

git-svn-id: http://redmine.rubyforge.org/svn/trunk@1459 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-25 17:31:50 +00:00
Jean-Philippe Lang
d99dc4070a Remove edit step from Status context menu (#1197).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1458 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-25 15:09:42 +00:00
Jean-Philippe Lang
dfcc8e1492 Change projects homepage limit to 255 chars (#663, #1095).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1457 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-25 13:37:29 +00:00
Jean-Philippe Lang
c7d83be613 Test for striked through wiki link (#199).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1456 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-25 13:30:54 +00:00
Jean-Philippe Lang
a92749ef93 Gantt chart: display issues that don't have a due date if they are assigned to a version with a date (#184).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1455 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-25 13:26:21 +00:00
Jean-Philippe Lang
03f0236a6e Prevents NoMethodError on @available_filters.has_key? in query.rb (#1178).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1454 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-25 12:50:33 +00:00
Jean-Philippe Lang
02757f5892 Translations updates.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1453 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-25 12:42:56 +00:00
Jean-Philippe Lang
fbafff8363 Hungarian translation added (#1198 by Gábor Takács).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1452 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-25 12:18:49 +00:00
Jean-Philippe Lang
e8d092e46a Fixed: using '*' as keyword for repository referencing keywords doesn't work when issue id is at the beginning of a line (#1253).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1451 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-25 11:43:20 +00:00
Jean-Philippe Lang
39fc8f38b8 Prevent admin users from making themselves non-administrator (#1276).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1449 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-25 11:22:53 +00:00
Jean-Philippe Lang
7f134a8c67 Prevent admin users from locking their own account (#1276).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1448 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-24 18:42:53 +00:00
Jean-Philippe Lang
0e5edccaf2 Fixed: Issue number display clipped on 'my issues' (#1291).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1447 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-24 18:37:06 +00:00
Jean-Philippe Lang
193b2450f4 Fixed: View differences for individual file of a changeset fails if the subversion repository URL doesn't point to the repository root (#1209, #1262, #1275).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1446 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-24 17:58:34 +00:00
Jean-Philippe Lang
9d4e71adf3 Fixed: error when previewing a new wiki page (#1292) introduced in r1415.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1445 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-23 16:29:40 +00:00
Jean-Philippe Lang
e02e047dd4 Fixed: TypeError in WikiController#destroy_attachment (#1281).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1444 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-22 18:26:43 +00:00
Jean-Philippe Lang
82c12d09e9 Fixed: non member or anonymous permissions change is effective only after an application restart (#1280).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1443 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-22 18:08:54 +00:00
Jean-Philippe Lang
62125cad33 Fixed: encoding problem when adding non-ASCII issue category in the new issue page (#1286).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1442 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-22 17:02:29 +00:00
Jean-Philippe Lang
e5bc1d370a Use display: block; for activity item descriptions.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1441 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-20 20:49:06 +00:00
Jean-Philippe Lang
03308028c9 Slight changes to the search results.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1440 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-20 20:45:53 +00:00
Jean-Philippe Lang
b0be3b95aa Ability to search a project and its subprojects (#1264).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1439 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-20 20:31:04 +00:00
Liwiusz Ociepa
94dbf641ff Memory leak (postgres -> zlib + ssl) has been fixed by apache developers.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1438 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-19 12:41:40 +00:00
Jean-Philippe Lang
82f204d8ac Adds icons on search results.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1436 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-18 16:33:50 +00:00
Jean-Philippe Lang
073818f8bc Ability to search all projects or the projects the user belongs to (#791).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1435 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-18 16:15:22 +00:00
Jean-Philippe Lang
1907c31138 Fixed: bold, italics, underline not working within parentheses (#1225).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1434 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-18 08:24:31 +00:00
Jean-Philippe Lang
439c697237 Fixed: possible error when attachment's filename is non-ASCII (#747, #1243, #1089).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1433 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-17 11:03:43 +00:00
Jean-Philippe Lang
9e225cc63f Fixed: private subprojects are listed on the issues view (#1217).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1432 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-14 18:19:37 +00:00
Jean-Philippe Lang
7ee38a95a0 Fixed: Calendar and Gantt show private subprojects even if current user is not a member of them (#1217).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1431 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-14 18:01:13 +00:00
Jean-Philippe Lang
06e44b8e64 Do not toggle assignable check box when using un/check all permissions links on role form.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1430 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-14 17:26:13 +00:00
Jean-Philippe Lang
4c6b9d9ce5 Fixed: Check All / Uncheck All in Email Settings doesn't work (#1180).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1429 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-14 17:23:40 +00:00
Jean-Philippe Lang
835cc7ed7c Fixed: Redmine::Scm::Adapters::GitAdapter#get_rev ignored GIT_BIN constant (#1207).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1428 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-13 17:54:51 +00:00
Jean-Philippe Lang
75d25b7e61 Fixed: Update issue form: comment field from log time end out of screen (#1227).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1427 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-13 17:51:55 +00:00
Jean-Philippe Lang
77e87eb0ba Fixed: some labels overflow the form box (#1228).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1426 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-13 16:56:34 +00:00
Liwiusz Ociepa
c4560c4f3b Merge changes from branch swistak.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1425 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-13 09:41:19 +00:00
Jean-Philippe Lang
0476669735 Wiki page protection (#851, patch #1146 by Mateo Murphy with slight changes).
New permission added: protect wiki pages. Once a page is protected, it can be edited/renamed/deleted only by users who have this permission.

git-svn-id: http://redmine.rubyforge.org/svn/trunk@1415 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-04 15:05:38 +00:00
Jean-Philippe Lang
556df99456 Doc update for 0.7.1 release.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1412 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-04 10:20:16 +00:00
Jean-Philippe Lang
9e5624c362 Prevent "can't convert nil into String" error when :sort_order param is not present.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1410 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-03 15:09:06 +00:00
Jean-Philippe Lang
35321d938b Translations updates (closes #1128, #1129, #1135, #1148, #1163).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1409 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-03 10:41:28 +00:00
Jean-Philippe Lang
251b1f75e9 Fixed: error on Trac import when :due attribute is nil (#1164).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1406 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-02 16:48:09 +00:00
Jean-Philippe Lang
c65d696f41 Fixed: error when using upcase language name in coderay (#1162) (Windows specific).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1405 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-02 15:35:41 +00:00
Jean-Philippe Lang
63951812a1 Split user edit screen into tabs.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1404 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-02 15:21:21 +00:00
Jean-Philippe Lang
7a969dafac Escape HTML comment tags (#1160).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1403 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-02 15:16:17 +00:00
Jean-Philippe Lang
7f8d959171 Show the project hierarchy in the drop down list for new membership on user administration screen.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1401 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-01 13:50:39 +00:00
Jean-Philippe Lang
f705b889d9 Hide the 'Latest projects' box on the welcome screen if there are no projects (#1156).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1400 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-01 13:01:23 +00:00
Jean-Philippe Lang
2d11265ec5 Fixed: private subprojects names are revealed on the project overview (#1152).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1399 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-01 12:56:59 +00:00
Jean-Philippe Lang
6d637ad982 Add Redcloth's :block_markdown_rule to allow horizontal rules in wiki (#967).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1389 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-05-01 08:44:40 +00:00
Jean-Philippe Lang
b2abe48592 Use GET instead of POST on roadmap (#718), gantt and calendar forms.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1388 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-30 12:14:15 +00:00
Jean-Philippe Lang
f1ae453688 Fixed: Updating tickets add a time log with zero hours (#1147).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1385 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-30 09:09:28 +00:00
Jean-Philippe Lang
4525a7429a Fixed: Home, Logout, Login links are absolute (#1122, #1145).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1384 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-30 08:51:12 +00:00
Jean-Philippe Lang
4403e300ff Thai translation added (Gampol Thitinilnithi, #1136).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1383 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-30 08:47:14 +00:00
Jean-Philippe Lang
5f58e2ced2 Fixed: Search for target version of "none" fails with postgres 8.3 (#1134).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1379 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-29 09:57:47 +00:00
Jean-Philippe Lang
05d39eeb35 Changelog update.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1369 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-28 10:26:05 +00:00
Jean-Philippe Lang
e55c1d82e6 Notify project members when a message is posted if they want to receive notifications for everything on the project (#1079).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1368 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-28 09:25:51 +00:00
Jean-Philippe Lang
67e7758185 Translation updates (closes #1123, #1124):
* Spanish (Gumer Coronel)
* Norvegian (Kai Olav Fredriksen)

git-svn-id: http://redmine.rubyforge.org/svn/trunk@1367 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-28 08:52:35 +00:00
Jean-Philippe Lang
c72b53a8fa Forces Redmine to use rails 2.0.2 gem when vendor/rails is not present.
If you don't want to upgrade rails gem, freeze Redmine by running the following command in your Redmine directory:

  rake rails:freeze:edge TAG=rel_2-0-2

git-svn-id: http://redmine.rubyforge.org/svn/trunk@1366 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-27 16:34:42 +00:00
Jean-Philippe Lang
a73f68a185 Fixed: Links to repository directories don't work (#1119).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1365 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-27 10:12:15 +00:00
Jean-Philippe Lang
6a3236daea Include subprojects versions on calendar and gantt (#1116).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1364 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-27 08:20:53 +00:00
Jean-Philippe Lang
ffbdc6b25b Postgresql 8.3 compatibility fix (#834).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1363 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-26 17:56:26 +00:00
Jean-Philippe Lang
64474802f9 Fixes custom field filters behaviour (#1078).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1362 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-26 16:55:24 +00:00
Jean-Philippe Lang
a6311a9603 Estimated time recognizes improved time formats (#1092).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1361 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-26 11:59:51 +00:00
Jean-Philippe Lang
1d570a40ff Fixed: ActiveRecord::StaleObjectError exception on closing a set of circular duplicate issues (#1105).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1360 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-26 10:54:46 +00:00
Jean-Philippe Lang
76b92fb999 Warn user that subprojects are also deleted when deleting a project (#1111) and add a checkbox to confirm the deletion.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1359 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-26 10:20:48 +00:00
Jean-Philippe Lang
a9f86444fc Fixed: Modules selection not remembered when new project creation fails (#1109).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1358 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-26 09:49:16 +00:00
Jean-Philippe Lang
596de073f9 Commits per author graph: remove email adress in usernames (#1066).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1357 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-24 18:35:56 +00:00
Jean-Philippe Lang
2b412e9e07 Fixed: trying to preview a new issue raises an exception (closes #984).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1356 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-24 17:35:04 +00:00
Jean-Philippe Lang
76b8d3eff2 CVS duplicate key violation fix (#996, #1098).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1355 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-24 17:28:55 +00:00
Jean-Philippe Lang
1a4f81163d Redirected user to where he is coming from after logging hours (#1062).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1354 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-16 17:27:53 +00:00
Jean-Philippe Lang
7061f73708 ApplicationHelperTest fix.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1353 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-15 20:27:10 +00:00
Jean-Philippe Lang
277bee62eb Issue list shows all tickets when going back to a global query inside a project (closes #1055).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1352 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-14 19:21:58 +00:00
Jean-Philippe Lang
741ddfb50b Hide export links in print media css.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1351 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-14 19:13:22 +00:00
Jean-Philippe Lang
0329094f01 Include macro can include a page of another project wiki using !{{include(projectname:Foo)}} (#1052).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1350 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-13 16:22:55 +00:00
Jean-Philippe Lang
e644435715 Add css class for ticket changes (#1032).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1349 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-13 13:24:03 +00:00
Jean-Philippe Lang
97fe797ad3 Replace closing html tags with html entity (#910).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1348 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-13 12:45:17 +00:00
Jean-Philippe Lang
8b9fb29d95 Translation updates (closes #1010, #1017, #1047):
* Finnish (Antti Perkiömäki)
* Spanish (Gumer Coronel)
* Czech (Maxim Krušina)

git-svn-id: http://redmine.rubyforge.org/svn/trunk@1347 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-13 12:25:22 +00:00
Jean-Philippe Lang
56683967da Left align filter buttons (closes #872) and reduce filters spacing.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1346 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-13 11:18:09 +00:00
Jean-Philippe Lang
a340d8c957 Better error message and AR errors in log for failed LDAP on-the-fly user creation (closes #932, #1042).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1345 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-13 09:12:43 +00:00
Jean-Philippe Lang
8eb86396e1 Fixed: Double dot displayed on ticket view when ticket not updated (closes #813).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1344 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-12 17:25:06 +00:00
Jean-Philippe Lang
7aaa538fd9 Fixed: error when browsing an empty Mercurial repository (#1046).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1343 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-12 17:13:17 +00:00
Jean-Philippe Lang
6d2a89142a Add an icon to each event on the activity view.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1342 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-12 16:54:14 +00:00
Jean-Philippe Lang
85f040c536 Fixed: preview fails when updating an issue (broken by r1322). Patch #1027.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1341 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-09 17:52:41 +00:00
Jean-Philippe Lang
a3c89d4f69 Custom fields (list and boolean) can be used as criteria in time report (#1012).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1340 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-09 17:45:39 +00:00
Jean-Philippe Lang
f025b16be7 Fix date range filter js behaviour and css fix for IE.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1339 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-07 17:56:32 +00:00
Jean-Philippe Lang
5d34548539 CSV export added to timelog report (#1009).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1338 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-07 17:18:09 +00:00
Jean-Philippe Lang
fc1a295d8a Redmine.pm doc update
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1337 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-07 17:03:02 +00:00
Jean-Philippe Lang
2bcb782087 Redmine.pm for webdav authentication:
* make Authen::Simple::LDAP module optional
* handle TLS flag set in Redmine

git-svn-id: http://redmine.rubyforge.org/svn/trunk@1336 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-06 17:36:26 +00:00
Jean-Philippe Lang
246e8f67c5 Redmine.pm support for LDAP authentication (patch by Liwiusz Ociepa). Closes #879, #918.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1335 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-06 17:29:09 +00:00
Jean-Philippe Lang
0249ae5f50 Preserve status filter and page number when using lock/unlock/activate links on the users list (closes #998).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1334 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-06 13:15:09 +00:00
Jean-Philippe Lang
beff2c54bc Mercurial: display working directory files sizes unless browsing a specific revision (#999).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1333 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-06 12:22:59 +00:00
Jean-Philippe Lang
db7f890030 Mercurial: Get proper file action on revision (#983).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1332 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-06 12:00:11 +00:00
Jean-Philippe Lang
a7ca01a8de Translation updates:
* Norwegian (Kai Olav Fredriksen)
* German (Thomas Löber)
* Bulgarian (Nikolay Solakov)
* Hebrew (Ficoos Bangaly)
* Russian (Michael Pirogov)

git-svn-id: http://redmine.rubyforge.org/svn/trunk@1331 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-06 11:07:16 +00:00
Jean-Philippe Lang
fe74ab8c06 Make the project files list sortable (#997).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1330 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-06 10:53:18 +00:00
Jean-Philippe Lang
154f60edd3 Fix repository browsing at given revision for various scm and add tests for this.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1329 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-06 10:35:55 +00:00
Jean-Philippe Lang
c37abb6415 Inline images alt attribute set to the attachment description.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1328 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-05 18:56:08 +00:00
Jean-Philippe Lang
c6271d8361 Fixed: inline image not displayed when including a wiki page (closes #1001).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1327 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-05 17:39:19 +00:00
Jean-Philippe Lang
4e961f44ef Various timelog report enhancements:
* report can be done using days as columns (#993)
* add a total column to the time report
* replace upper-right links by tabs to switch between details and report
* preserve date range filter when switching between details and report


git-svn-id: http://redmine.rubyforge.org/svn/trunk@1326 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-05 16:40:26 +00:00
Jean-Philippe Lang
8d4aa6f9ad Fixed: single file 'View difference' links do not work because of duplicate slashes in url.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1325 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-03 22:29:58 +00:00
Jean-Philippe Lang
14a2b7e9b5 Verify rev and rev_to params format in RepositoriesController. And turn revision arguments into integers in SubversionAdapter.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1324 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-03 16:50:53 +00:00
Jean-Philippe Lang
f6ce427a00 Display the context menu above and/or to the left of the click if needed (patch by Mike Duchene, closes #960).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1323 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-03 16:38:06 +00:00
Jean-Philippe Lang
7f0aa56119 Fixed: trying to preview a new issue raises an exception with postgresql (close #984).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1322 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-03 13:16:51 +00:00
Jean-Philippe Lang
6348eeaf8a Attachment model clean up: fixed some inconsistent indentation and an inaccurate comment (closes patch #903 by Rocco Stanzione).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1321 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-02 21:30:32 +00:00
Jean-Philippe Lang
4cbe6b626e Accept the following formats for the timelog "hours" field: 1h, 1 h, 1 hour, 2 hours, 30m, 30min, 1h30, 1h30m, 1:30.
Also accept 1,5 for 1.5 hour (closes #975). Note that 1.5 is still equal to 1h30 and not 1h50 (#947).

git-svn-id: http://redmine.rubyforge.org/svn/trunk@1320 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-02 19:52:12 +00:00
Jean-Philippe Lang
467f74510e Time report can be done at issue level (closes #970) + timelog views xhtml validation.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1319 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-01 22:42:10 +00:00
Jean-Philippe Lang
043cb37b16 Add predefined date ranges to the time report in the same way as the details view (closes #972). It nows defaults to 'All time'.
This patch also fixes time report periods (columns) computation.

git-svn-id: http://redmine.rubyforge.org/svn/trunk@1318 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-01 19:40:40 +00:00
Jean-Philippe Lang
e4da9d6f10 Prevent NoMethodError on nil class if custom_fields params is not present in IssuesController#new (#969).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1317 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-01 17:48:11 +00:00
Jean-Philippe Lang
80a5ad7ff3 Fixed: Boards are not deleted when project is deleted (closes #963).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1316 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-04-01 17:43:20 +00:00
Jean-Philippe Lang
68fe7856c9 Move repetitive calendar include code from views into helper (patch #966 by Peter Suschlik).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1315 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-03-31 21:48:01 +00:00
Jean-Philippe Lang
0d9e419646 Add overflow:auto to the content div (closes #676, #748, #961).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1314 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-03-31 20:51:56 +00:00
Jean-Philippe Lang
da641f4122 Global queries can be saved from the global issue list (follows r1311 and closes #897).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1312 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-03-30 14:20:07 +00:00
Jean-Philippe Lang
287d86e363 Queries can be marked as 'For all projects'. Such queries will be available on all projects and on the global issue list (#897, closes #671).
Only admin users can create/edit queries that are public and for all projects.
Note: this change does not allow to save a query from the global issue list. You have to be inside a project but then you can mark the query as 'For all projects'.

git-svn-id: http://redmine.rubyforge.org/svn/trunk@1311 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-03-30 12:29:07 +00:00
Jean-Philippe Lang
faf1f1e812 Fixed: Feed content limit setting has no effect (closes #954).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1310 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-03-30 08:33:04 +00:00
Jean-Philippe Lang
cd64338a7f Fixed: Priorities not ordered when displayed as a filter in issue list (#956).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1309 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-03-30 08:19:56 +00:00
Jean-Philippe Lang
1b8c5d4058 Fixed: can not display attached images inline in message replies.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1308 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-03-29 22:35:04 +00:00
Jean-Philippe Lang
5ccbeba5c2 Use #blank? instead of #empty? in news/show view.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1307 e93f8b46-1217-0410-a6f0-8f06a7374b81
2008-03-29 20:03:20 +00:00
1632 changed files with 130802 additions and 48521 deletions

22
.gitignore vendored Normal file
View File

@@ -0,0 +1,22 @@
/.project
/.loadpath
/config/additional_environment.rb
/config/database.yml
/config/email.yml
/config/initializers/session_store.rb
/coverage
/db/*.db
/db/*.sqlite3
/db/schema.rb
/files/*
/log/*.log*
/log/mongrel_debug
/public/dispatch.*
/public/plugin_assets
/tmp/*
/tmp/cache/*
/tmp/sessions/*
/tmp/sockets/*
/tmp/test/*
/vendor/rails
*.rbc

24
.hgignore Normal file
View File

@@ -0,0 +1,24 @@
syntax: glob
.project
.loadpath
config/additional_environment.rb
config/database.yml
config/email.yml
config/initializers/session_store.rb
coverage
db/*.db
db/*.sqlite3
db/schema.rb
files/*
log/*.log*
log/mongrel_debug
public/dispatch.*
public/plugin_assets
tmp/*
tmp/cache/*
tmp/sessions/*
tmp/sockets/*
tmp/test/*
vendor/rails
*.rbc

5
README.rdoc Normal file
View File

@@ -0,0 +1,5 @@
= Redmine
Redmine is a flexible project management web application written using Ruby on Rails framework.
More details can be found at in the doc directory or on the official website http://www.redmine.org

View File

@@ -1,5 +1,5 @@
# redMine - project management software
# Copyright (C) 2006-2007 Jean-Philippe Lang
# Redmine - project management software
# Copyright (C) 2006-2009 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,53 +16,24 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class AccountController < ApplicationController
layout 'base'
helper :custom_fields
include CustomFieldsHelper
# prevents login action to be filtered by check_if_login_required application scope filter
skip_before_filter :check_if_login_required, :only => [:login, :lost_password, :register, :activate]
# Show user's account
def show
@user = User.find_active(params[:id])
@custom_values = @user.custom_values.find(:all, :include => :custom_field)
# show only public projects and private projects that the logged in user is also a member of
@memberships = @user.memberships.select do |membership|
membership.project.is_public? || (User.current.member_of?(membership.project))
end
rescue ActiveRecord::RecordNotFound
render_404
end
skip_before_filter :check_if_login_required
# Login request and validation
def login
if request.get?
# Logout user
self.logged_user = nil
logout_user
else
# Authenticate user
user = User.try_to_login(params[:username], params[:password])
if user
self.logged_user = user
# generate a key and set cookie if autologin
if params[:autologin] && Setting.autologin?
token = Token.create(:user => user, :action => 'autologin')
cookies[:autologin] = { :value => token.value, :expires => 1.year.from_now }
end
redirect_back_or_default :controller => 'my', :action => 'page'
else
flash.now[:error] = l(:notice_account_invalid_creditentials)
end
authenticate_user
end
end
# 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
@@ -88,9 +59,9 @@ class AccountController < ApplicationController
if request.post?
user = User.find_by_mail(params[:mail])
# user not found in db
flash.now[:error] = l(:notice_account_unknown_email) and return unless user
(flash.now[:error] = l(:notice_account_unknown_email); return) unless user
# user uses an external authentification
flash.now[:error] = l(:notice_can_t_change_password) and return if user.auth_source_id
(flash.now[:error] = l(:notice_can_t_change_password); return) if user.auth_source_id
# create a new token for password recovery
token = Token.new(:user => user, :action => "recovery")
if token.save
@@ -105,43 +76,35 @@ class AccountController < ApplicationController
# User self-registration
def register
redirect_to(home_url) && return unless Setting.self_registration?
redirect_to(home_url) && return unless Setting.self_registration? || session[:auth_source_registration]
if request.get?
session[:auth_source_registration] = nil
@user = User.new(:language => Setting.default_language)
@custom_values = UserCustomField.find(:all).collect { |x| CustomValue.new(:custom_field => x, :customized => @user) }
else
@user = User.new(params[:user])
@user.admin = false
@user.login = params[:user][:login]
@user.status = User::STATUS_REGISTERED
@user.password, @user.password_confirmation = params[:password], params[:password_confirmation]
@custom_values = UserCustomField.find(:all).collect { |x| CustomValue.new(:custom_field => x,
:customized => @user,
:value => (params["custom_fields"] ? params["custom_fields"][x.id.to_s] : nil)) }
@user.custom_values = @custom_values
case Setting.self_registration
when '1'
# Email activation
token = Token.new(:user => @user, :action => "register")
if @user.save and token.save
Mailer.deliver_register(token)
flash[:notice] = l(:notice_account_register_done)
redirect_to :action => 'login'
end
when '3'
# Automatic activation
@user.status = User::STATUS_ACTIVE
@user.register
if session[:auth_source_registration]
@user.activate
@user.login = session[:auth_source_registration][:login]
@user.auth_source_id = session[:auth_source_registration][:auth_source_id]
if @user.save
session[:auth_source_registration] = nil
self.logged_user = @user
flash[:notice] = l(:notice_account_activated)
redirect_to :action => 'login'
redirect_to :controller => 'my', :action => 'account'
end
else
# Manual activation by the administrator
if @user.save
# Sends an email to the administrators
Mailer.deliver_account_activation_request(@user)
flash[:notice] = l(:notice_account_pending)
redirect_to :action => 'login'
@user.login = params[:user][:login]
@user.password, @user.password_confirmation = params[:password], params[:password_confirmation]
case Setting.self_registration
when '1'
register_by_email_activation(@user)
when '3'
register_automatically(@user)
else
register_manually_by_administrator(@user)
end
end
end
@@ -153,8 +116,8 @@ class AccountController < ApplicationController
token = Token.find_by_action_and_value('register', params[:token])
redirect_to(home_url) && return unless token and !token.expired?
user = token.user
redirect_to(home_url) && return unless user.status == User::STATUS_REGISTERED
user.status = User::STATUS_ACTIVE
redirect_to(home_url) && return unless user.registered?
user.activate
if user.save
token.destroy
flash[:notice] = l(:notice_account_activated)
@@ -162,14 +125,148 @@ class AccountController < ApplicationController
redirect_to :action => 'login'
end
private
def logged_user=(user)
if user && user.is_a?(User)
User.current = user
session[:user_id] = user.id
else
User.current = User.anonymous
session[:user_id] = nil
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 authenticate_user
if Setting.openid? && using_open_id?
open_id_authenticate(params[:openid_url])
else
password_authentication
end
end
def password_authentication
user = User.try_to_login(params[:username], params[:password])
if user.nil?
invalid_credentials
elsif user.new_record?
onthefly_creation_failed(user, {:login => user.login, :auth_source_id => user.auth_source_id })
else
# Valid user
successful_authentication(user)
end
end
def open_id_authenticate(openid_url)
authenticate_with_open_id(openid_url, :required => [:nickname, :fullname, :email], :return_to => signin_url) do |result, identity_url, registration|
if result.successful?
user = User.find_or_initialize_by_identity_url(identity_url)
if user.new_record?
# Self-registration off
redirect_to(home_url) && return unless Setting.self_registration?
# Create on the fly
user.login = registration['nickname'] unless registration['nickname'].nil?
user.mail = registration['email'] unless registration['email'].nil?
user.firstname, user.lastname = registration['fullname'].split(' ') unless registration['fullname'].nil?
user.random_password
user.register
case Setting.self_registration
when '1'
register_by_email_activation(user) do
onthefly_creation_failed(user)
end
when '3'
register_automatically(user) do
onthefly_creation_failed(user)
end
else
register_manually_by_administrator(user) do
onthefly_creation_failed(user)
end
end
else
# Existing record
if user.active?
successful_authentication(user)
else
account_pending
end
end
end
end
end
def successful_authentication(user)
# Valid user
self.logged_user = user
# generate a key and set cookie if autologin
if params[:autologin] && Setting.autologin?
token = Token.create(:user => user, :action => 'autologin')
cookies[:autologin] = { :value => token.value, :expires => 1.year.from_now }
end
call_hook(:controller_account_success_authentication_after, {:user => user })
redirect_back_or_default :controller => 'my', :action => 'page'
end
# Onthefly creation failed, display the registration form to fill/fix attributes
def onthefly_creation_failed(user, auth_source_options = { })
@user = user
session[:auth_source_registration] = auth_source_options unless auth_source_options.empty?
render :action => 'register'
end
def invalid_credentials
logger.warn "Failed login for '#{params[:username]}' from #{request.remote_ip} at #{Time.now.utc}"
flash.now[:error] = l(:notice_account_invalid_creditentials)
end
# Register a user for email activation.
#
# Pass a block for behavior when a user fails to save
def register_by_email_activation(user, &block)
token = Token.new(:user => user, :action => "register")
if user.save and token.save
Mailer.deliver_register(token)
flash[:notice] = l(:notice_account_register_done)
redirect_to :action => 'login'
else
yield if block_given?
end
end
# Automatically register a user
#
# Pass a block for behavior when a user fails to save
def register_automatically(user, &block)
# Automatic activation
user.activate
user.last_login_on = Time.now
if user.save
self.logged_user = user
flash[:notice] = l(:notice_account_activated)
redirect_to :controller => 'my', :action => 'account'
else
yield if block_given?
end
end
# Manual activation by the administrator
#
# Pass a block for behavior when a user fails to save
def register_manually_by_administrator(user, &block)
if user.save
# Sends an email to the administrators
Mailer.deliver_account_activation_request(user)
account_pending
else
yield if block_given?
end
end
def account_pending
flash[:notice] = l(:notice_account_pending)
redirect_to :action => 'login'
end
end

View File

@@ -0,0 +1,59 @@
class ActivitiesController < ApplicationController
menu_item :activity
before_filter :find_optional_project
accept_key_auth :index
def index
@days = Setting.activity_days_default.to_i
if params[:from]
begin; @date_to = params[:from].to_date + 1; rescue; end
end
@date_to ||= Date.today + 1
@date_from = @date_to - @days
@with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1')
@author = (params[:user_id].blank? ? nil : User.active.find(params[:user_id]))
@activity = Redmine::Activity::Fetcher.new(User.current, :project => @project,
:with_subprojects => @with_subprojects,
:author => @author)
@activity.scope_select {|t| !params["show_#{t}"].nil?}
@activity.scope = (@author.nil? ? :default : :all) if @activity.scope.empty?
events = @activity.events(@date_from, @date_to)
if events.empty? || stale?(:etag => [@activity.scope, @date_to, @date_from, @with_subprojects, @author, events.first, User.current, current_language])
respond_to do |format|
format.html {
@events_by_day = events.group_by(&:event_date)
render :layout => false if request.xhr?
}
format.atom {
title = l(:label_activity)
if @author
title = @author.name
elsif @activity.scope.size == 1
title = l("label_#{@activity.scope.first.singularize}_plural")
end
render_feed(events, :title => "#{@project || Setting.app_title}: #{title}")
}
end
end
rescue ActiveRecord::RecordNotFound
render_404
end
private
# TODO: refactor, duplicated in projects_controller
def find_optional_project
return true unless params[:id]
@project = Project.find(params[:id])
authorize
rescue ActiveRecord::RecordNotFound
render_404
end
end

View File

@@ -16,7 +16,8 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class AdminController < ApplicationController
layout 'base'
layout 'admin'
before_filter :require_admin
helper :sort
@@ -27,25 +28,24 @@ class AdminController < ApplicationController
end
def projects
sort_init 'name', 'asc'
sort_update
@status = params[:status] ? params[:status].to_i : 1
c = ARCondition.new(@status == 0 ? "status <> 0" : ["status = ?", @status])
@status = params[:status] ? params[:status].to_i : 0
conditions = nil
conditions = ["status=?", @status] unless @status == 0
unless params[:name].blank?
name = "%#{params[:name].strip.downcase}%"
c << ["LOWER(identifier) LIKE ? OR LOWER(name) LIKE ?", name, name]
end
@project_count = Project.count(:conditions => conditions)
@project_pages = Paginator.new self, @project_count,
per_page_option,
params['page']
@projects = Project.find :all, :order => sort_clause,
:conditions => conditions,
:limit => @project_pages.items_per_page,
:offset => @project_pages.current.offset
@projects = Project.find :all, :order => 'lft',
:conditions => c.conditions
render :action => "projects", :layout => false if request.xhr?
end
def plugins
@plugins = Redmine::Plugin.all
end
# Loads the default configuration
# (roles, trackers, statuses, workflow, enumerations)
def default_configuration
@@ -76,11 +76,11 @@ class AdminController < ApplicationController
def info
@db_adapter_name = ActiveRecord::Base.connection.adapter_name
@flags = {
:default_admin_changed => User.find(:first, :conditions => ["login=? and hashed_password=?", 'admin', User.hash_password('admin')]).nil?,
:file_repository_writable => File.writable?(Attachment.storage_path),
:rmagick_available => Object.const_defined?(:Magick)
}
@plugins = Redmine::Plugin.registered_plugins
@checklist = [
[:text_default_administrator_account_changed, User.find(:first, :conditions => ["login=? and hashed_password=?", 'admin', User.hash_password('admin')]).nil?],
[:text_file_repository_writable, File.writable?(Attachment.storage_path)],
[:text_plugin_assets_writable, File.writable?(Engines.public_directory)],
[:text_rmagick_available, Object.const_defined?(:Magick)]
]
end
end

View File

@@ -1,221 +0,0 @@
# redMine - project management software
# Copyright (C) 2006-2007 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
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class ApplicationController < ActionController::Base
before_filter :user_setup, :check_if_login_required, :set_localization
filter_parameter_logging :password
include Redmine::MenuManager::MenuController
helper Redmine::MenuManager::MenuHelper
REDMINE_SUPPORTED_SCM.each do |scm|
require_dependency "repository/#{scm.underscore}"
end
def current_role
@current_role ||= User.current.role_for_project(@project)
end
def user_setup
# Check the settings cache for each request
Setting.check_cache
# Find the current user
User.current = find_current_user
end
# Returns the current user or nil if no user is logged in
def find_current_user
if session[:user_id]
# existing session
(User.find_active(session[:user_id]) rescue nil)
elsif cookies[:autologin] && Setting.autologin?
# auto-login feature
User.find_by_autologin_key(cookies[:autologin])
elsif params[:key] && accept_key_auth_actions.include?(params[:action])
# RSS key authentication
User.find_by_rss_key(params[:key])
end
end
# check if login is globally required to access the application
def check_if_login_required
# no check needed if user is already logged in
return true if User.current.logged?
require_login if Setting.login_required?
end
def set_localization
User.current.language = nil unless User.current.logged?
lang = begin
if !User.current.language.blank? and GLoc.valid_languages.include? User.current.language.to_sym
User.current.language
elsif request.env['HTTP_ACCEPT_LANGUAGE']
accept_lang = parse_qvalues(request.env['HTTP_ACCEPT_LANGUAGE']).first.split('-').first
if accept_lang and !accept_lang.empty? and GLoc.valid_languages.include? accept_lang.to_sym
User.current.language = accept_lang
end
end
rescue
nil
end || Setting.default_language
set_language_if_valid(lang)
end
def require_login
if !User.current.logged?
store_location
redirect_to :controller => "account", :action => "login"
return false
end
true
end
def require_admin
return unless require_login
if !User.current.admin?
render_403
return false
end
true
end
# Authorize the user for the requested action
def authorize(ctrl = params[:controller], action = params[:action])
allowed = User.current.allowed_to?({:controller => ctrl, :action => action}, @project)
allowed ? true : (User.current.logged? ? render_403 : require_login)
end
# make sure that the user is a member of the project (or admin) if project is private
# used as a before_filter for actions that do not require any particular permission on the project
def check_project_privacy
if @project && @project.active?
if @project.is_public? || User.current.member_of?(@project) || User.current.admin?
true
else
User.current.logged? ? render_403 : require_login
end
else
@project = nil
render_404
false
end
end
# store current uri in session.
# return to this location by calling redirect_back_or_default
def store_location
session[:return_to_params] = params
end
# move to the last store_location call or to the passed default one
def redirect_back_or_default(default)
if session[:return_to_params].nil?
redirect_to default
else
redirect_to session[:return_to_params]
session[:return_to_params] = nil
end
end
def render_403
@project = nil
render :template => "common/403", :layout => !request.xhr?, :status => 403
return false
end
def render_404
render :template => "common/404", :layout => !request.xhr?, :status => 404
return false
end
def render_error(msg)
flash.now[:error] = msg
render :nothing => true, :layout => !request.xhr?, :status => 500
end
def render_feed(items, options={})
@items = items || []
@items.sort! {|x,y| y.event_datetime <=> x.event_datetime }
@title = options[:title] || Setting.app_title
render :template => "common/feed.atom.rxml", :layout => false, :content_type => 'application/atom+xml'
end
def self.accept_key_auth(*actions)
actions = actions.flatten.map(&:to_s)
write_inheritable_attribute('accept_key_auth_actions', actions)
end
def accept_key_auth_actions
self.class.read_inheritable_attribute('accept_key_auth_actions') || []
end
# TODO: move to model
def attach_files(obj, attachments)
attached = []
if attachments && attachments.is_a?(Hash)
attachments.each_value do |attachment|
file = attachment['file']
next unless file && file.size > 0
a = Attachment.create(:container => obj,
:file => file,
:description => attachment['description'].to_s.strip,
:author => User.current)
attached << a unless a.new_record?
end
end
attached
end
# Returns the number of objects that should be displayed
# on the paginated list
def per_page_option
per_page = nil
if params[:per_page] && Setting.per_page_options_array.include?(params[:per_page].to_s.to_i)
per_page = params[:per_page].to_s.to_i
session[:per_page] = per_page
elsif session[:per_page]
per_page = session[:per_page]
else
per_page = Setting.per_page_options_array.first || 25
end
per_page
end
# qvalues http header parser
# code taken from webrick
def parse_qvalues(value)
tmp = []
if value
parts = value.split(/,\s*/)
parts.each {|part|
if m = %r{^([^\s,]+?)(?:;\s*q=(\d+(?:\.\d+)?))?$}.match(part)
val = m[1]
q = (m[2] or 1).to_f
tmp.push([val, q])
end
}
tmp = tmp.sort_by{|val, q| -q}
tmp.collect!{|val, q| val}
end
return tmp
end
# Returns a string that can be used as filename value in Content-Disposition header
def filename_for_content_disposition(name)
request.env['HTTP_USER_AGENT'] =~ %r{MSIE} ? ERB::Util.url_encode(name) : name
end
end

View File

@@ -0,0 +1,483 @@
# redMine - project management software
# Copyright (C) 2006-2007 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
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
require 'uri'
require 'cgi'
class ApplicationController < ActionController::Base
include Redmine::I18n
layout 'base'
exempt_from_layout 'builder', 'rsb'
# Remove broken cookie after upgrade from 0.8.x (#4292)
# See https://rails.lighthouseapp.com/projects/8994/tickets/3360
# TODO: remove it when Rails is fixed
before_filter :delete_broken_cookies
def delete_broken_cookies
if cookies['_redmine_session'] && cookies['_redmine_session'] !~ /--/
cookies.delete '_redmine_session'
redirect_to home_path
return false
end
end
before_filter :user_setup, :check_if_login_required, :set_localization
filter_parameter_logging :password
protect_from_forgery
rescue_from ActionController::InvalidAuthenticityToken, :with => :invalid_authenticity_token
include Redmine::Search::Controller
include Redmine::MenuManager::MenuController
helper Redmine::MenuManager::MenuHelper
Redmine::Scm::Base.all.each do |scm|
require_dependency "repository/#{scm.underscore}"
end
def user_setup
# Check the settings cache for each request
Setting.check_cache
# Find the current user
User.current = find_current_user
end
# Returns the current user or nil if no user is logged in
# and starts a session if needed
def find_current_user
if session[:user_id]
# existing session
(User.active.find(session[:user_id]) rescue nil)
elsif cookies[:autologin] && Setting.autologin?
# auto-login feature starts a new session
user = User.try_to_autologin(cookies[:autologin])
session[:user_id] = user.id if user
user
elsif params[:format] == 'atom' && params[:key] && accept_key_auth_actions.include?(params[:action])
# RSS key authentication does not start a session
User.find_by_rss_key(params[:key])
elsif Setting.rest_api_enabled? && api_request?
if (key = api_key_from_request) && accept_key_auth_actions.include?(params[:action])
# Use API key
User.find_by_api_key(key)
else
# HTTP Basic, either username/password or API key/random
authenticate_with_http_basic do |username, password|
User.try_to_login(username, password) || User.find_by_api_key(username)
end
end
end
end
# Sets the logged in user
def logged_user=(user)
reset_session
if user && user.is_a?(User)
User.current = user
session[:user_id] = user.id
else
User.current = User.anonymous
end
end
# check if login is globally required to access the application
def check_if_login_required
# no check needed if user is already logged in
return true if User.current.logged?
require_login if Setting.login_required?
end
def set_localization
lang = nil
if User.current.logged?
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
if !accept_lang.blank?
accept_lang = accept_lang.downcase
lang = find_language(accept_lang) || find_language(accept_lang.split('-').first)
end
end
lang ||= Setting.default_language
set_language_if_valid(lang)
end
def require_login
if !User.current.logged?
# Extract only the basic url parameters on non-GET requests
if request.get?
url = url_for(params)
else
url = url_for(:controller => params[:controller], :action => params[:action], :id => params[:id], :project_id => params[:project_id])
end
respond_to do |format|
format.html { redirect_to :controller => "account", :action => "login", :back_url => url }
format.atom { redirect_to :controller => "account", :action => "login", :back_url => url }
format.xml { head :unauthorized, 'WWW-Authenticate' => 'Basic realm="Redmine API"' }
format.js { head :unauthorized, 'WWW-Authenticate' => 'Basic realm="Redmine API"' }
format.json { head :unauthorized, 'WWW-Authenticate' => 'Basic realm="Redmine API"' }
end
return false
end
true
end
def require_admin
return unless require_login
if !User.current.admin?
render_403
return false
end
true
end
def deny_access
User.current.logged? ? render_403 : require_login
end
# Authorize the user for the requested action
def authorize(ctrl = params[:controller], action = params[:action], global = false)
allowed = User.current.allowed_to?({:controller => ctrl, :action => action}, @project || @projects, :global => global)
if allowed
true
else
if @project && @project.archived?
render_403 :message => :notice_not_authorized_archived_project
else
deny_access
end
end
end
# Authorize the user for the requested action outside a project
def authorize_global(ctrl = params[:controller], action = params[:action], global = true)
authorize(ctrl, action, global)
end
# Find project of id params[:id]
def find_project
@project = Project.find(params[:id])
rescue ActiveRecord::RecordNotFound
render_404
end
# Find project of id params[:project_id]
def find_project_by_project_id
@project = Project.find(params[:project_id])
rescue ActiveRecord::RecordNotFound
render_404
end
# Find a project based on params[:project_id]
# TODO: some subclasses override this, see about merging their logic
def find_optional_project
@project = Project.find(params[:project_id]) unless params[:project_id].blank?
allowed = User.current.allowed_to?({:controller => params[:controller], :action => params[:action]}, @project, :global => true)
allowed ? true : deny_access
rescue ActiveRecord::RecordNotFound
render_404
end
# Finds and sets @project based on @object.project
def find_project_from_association
render_404 unless @object.present?
@project = @object.project
rescue ActiveRecord::RecordNotFound
render_404
end
def find_model_object
model = self.class.read_inheritable_attribute('model_object')
if model
@object = model.find(params[:id])
self.instance_variable_set('@' + controller_name.singularize, @object) if @object
end
rescue ActiveRecord::RecordNotFound
render_404
end
def self.model_object(model)
write_inheritable_attribute('model_object', model)
end
# Filter for bulk issue operations
def find_issues
@issues = Issue.find_all_by_id(params[:id] || params[:ids])
raise ActiveRecord::RecordNotFound if @issues.empty?
@projects = @issues.collect(&:project).compact.uniq
@project = @projects.first if @projects.size == 1
rescue ActiveRecord::RecordNotFound
render_404
end
# Check if project is unique before bulk operations
def check_project_uniqueness
unless @project
# TODO: let users bulk edit/move/destroy issues from different projects
render_error 'Can not bulk edit/move/destroy issues from different projects'
return false
end
end
# make sure that the user is a member of the project (or admin) if project is private
# used as a before_filter for actions that do not require any particular permission on the project
def check_project_privacy
if @project && @project.active?
if @project.is_public? || User.current.member_of?(@project) || User.current.admin?
true
else
User.current.logged? ? render_403 : require_login
end
else
@project = nil
render_404
false
end
end
def back_url
params[:back_url] || request.env['HTTP_REFERER']
end
def redirect_back_or_default(default)
back_url = CGI.unescape(params[:back_url].to_s)
if !back_url.blank?
begin
uri = URI.parse(back_url)
# do not redirect user to another host or to the login or register page
if (uri.relative? || (uri.host == request.host)) && !uri.path.match(%r{/(login|account/register)})
redirect_to(back_url)
return
end
rescue URI::InvalidURIError
# redirect to default
end
end
redirect_to default
false
end
def render_403(options={})
@project = nil
render_error({:message => :notice_not_authorized, :status => 403}.merge(options))
return false
end
def render_404(options={})
render_error({:message => :notice_file_not_found, :status => 404}.merge(options))
return false
end
# Renders an error response
def render_error(arg)
arg = {:message => arg} unless arg.is_a?(Hash)
@message = arg[:message]
@message = l(@message) if @message.is_a?(Symbol)
@status = arg[:status] || 500
respond_to do |format|
format.html {
render :template => 'common/error', :layout => use_layout, :status => @status
}
format.atom { head @status }
format.xml { head @status }
format.js { head @status }
format.json { head @status }
end
end
# Picks which layout to use based on the request
#
# @return [boolean, string] name of the layout to use or false for no layout
def use_layout
request.xhr? ? false : 'base'
end
def invalid_authenticity_token
if api_request?
logger.error "Form authenticity token is missing or is invalid. API calls must include a proper Content-type header (text/xml or text/json)."
end
render_error "Invalid form authenticity token."
end
def render_feed(items, options={})
@items = items || []
@items.sort! {|x,y| y.event_datetime <=> x.event_datetime }
@items = @items.slice(0, Setting.feeds_limit.to_i)
@title = options[:title] || Setting.app_title
render :template => "common/feed.atom.rxml", :layout => false, :content_type => 'application/atom+xml'
end
def self.accept_key_auth(*actions)
actions = actions.flatten.map(&:to_s)
write_inheritable_attribute('accept_key_auth_actions', actions)
end
def accept_key_auth_actions
self.class.read_inheritable_attribute('accept_key_auth_actions') || []
end
# Returns the number of objects that should be displayed
# on the paginated list
def per_page_option
per_page = nil
if params[:per_page] && Setting.per_page_options_array.include?(params[:per_page].to_s.to_i)
per_page = params[:per_page].to_s.to_i
session[:per_page] = per_page
elsif session[:per_page]
per_page = session[:per_page]
else
per_page = Setting.per_page_options_array.first || 25
end
per_page
end
# Returns offset and limit used to retrieve objects
# for an API response based on offset, limit and page parameters
def api_offset_and_limit(options=params)
if options[:offset].present?
offset = options[:offset].to_i
if offset < 0
offset = 0
end
end
limit = options[:limit].to_i
if limit < 1
limit = 25
elsif limit > 100
limit = 100
end
if offset.nil? && options[:page].present?
offset = (options[:page].to_i - 1) * limit
offset = 0 if offset < 0
end
offset ||= 0
[offset, limit]
end
# qvalues http header parser
# code taken from webrick
def parse_qvalues(value)
tmp = []
if value
parts = value.split(/,\s*/)
parts.each {|part|
if m = %r{^([^\s,]+?)(?:;\s*q=(\d+(?:\.\d+)?))?$}.match(part)
val = m[1]
q = (m[2] or 1).to_f
tmp.push([val, q])
end
}
tmp = tmp.sort_by{|val, q| -q}
tmp.collect!{|val, q| val}
end
return tmp
rescue
nil
end
# Returns a string that can be used as filename value in Content-Disposition header
def filename_for_content_disposition(name)
request.env['HTTP_USER_AGENT'] =~ %r{MSIE} ? ERB::Util.url_encode(name) : name
end
def api_request?
%w(xml json).include? params[:format]
end
# Returns the API key present in the request
def api_key_from_request
if params[:key].present?
params[:key]
elsif request.headers["X-Redmine-API-Key"].present?
request.headers["X-Redmine-API-Key"]
end
end
# Renders a warning flash if obj has unsaved attachments
def render_attachment_warning_if_needed(obj)
flash[:warning] = l(:warning_attachments_not_saved, obj.unsaved_attachments.size) if obj.unsaved_attachments.present?
end
# Sets the `flash` notice or error based the number of issues that did not save
#
# @param [Array, Issue] issues all of the saved and unsaved Issues
# @param [Array, Integer] unsaved_issue_ids the issue ids that were not saved
def set_flash_from_bulk_issue_save(issues, unsaved_issue_ids)
if unsaved_issue_ids.empty?
flash[:notice] = l(:notice_successful_update) unless issues.empty?
else
flash[:error] = l(:notice_failed_to_save_issues,
:count => unsaved_issue_ids.size,
:total => issues.size,
:ids => '#' + unsaved_issue_ids.join(', #'))
end
end
# Rescues an invalid query statement. Just in case...
def query_statement_invalid(exception)
logger.error "Query::StatementInvalid: #{exception.message}" if logger
session.delete(:query)
sort_clear if respond_to?(:sort_clear)
render_error "An error occurred while executing the query and has been logged. Please report this error to your Redmine administrator."
end
# Converts the errors on an ActiveRecord object into a common JSON format
def object_errors_to_json(object)
object.errors.collect do |attribute, error|
{ attribute => error }
end.to_json
end
# Renders API response on validation failure
def render_validation_errors(object)
options = { :status => :unprocessable_entity, :layout => false }
options.merge!(case params[:format]
when 'xml'; { :xml => object.errors }
when 'json'; { :json => {'errors' => object.errors} } # ActiveResource client compliance
else
raise "Unknown format #{params[:format]} in #render_validation_errors"
end
)
render options
end
# Overrides #default_template so that the api template
# is used automatically if it exists
def default_template(action_name = self.action_name)
if api_request?
begin
return self.view_paths.find_template(default_template_name(action_name), 'api')
rescue ::ActionView::MissingTemplate
# the api template was not found
# fallback to the default behaviour
end
end
super
end
# Overrides #pick_layout so that #render with no arguments
# doesn't use the layout for api requests
def pick_layout(*args)
api_request? ? nil : super
end
end

View File

@@ -1,5 +1,5 @@
# redMine - project management software
# Copyright (C) 2006-2007 Jean-Philippe Lang
# Redmine - project management software
# Copyright (C) 2006-2008 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,24 +16,72 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class AttachmentsController < ApplicationController
layout 'base'
before_filter :find_project, :check_project_privacy
before_filter :find_project
before_filter :file_readable, :read_authorize, :except => :destroy
before_filter :delete_authorize, :only => :destroy
verify :method => :post, :only => :destroy
def show
if @attachment.is_diff?
@diff = File.new(@attachment.diskfile, "rb").read
render :action => 'diff'
elsif @attachment.is_text? && @attachment.filesize <= Setting.file_max_size_displayed.to_i.kilobyte
@content = File.new(@attachment.diskfile, "rb").read
render :action => 'file'
else
download
end
end
def download
if @attachment.container.is_a?(Version) || @attachment.container.is_a?(Project)
@attachment.increment_download
end
# images are sent inline
send_file @attachment.diskfile, :filename => filename_for_content_disposition(@attachment.filename),
:type => @attachment.content_type,
:type => detect_content_type(@attachment),
:disposition => (@attachment.image? ? 'inline' : 'attachment')
rescue
# in case the disk file was deleted
render_404
end
def destroy
# Make sure association callbacks are called
@attachment.container.attachments.delete(@attachment)
redirect_to :back
rescue ::ActionController::RedirectBackError
redirect_to :controller => 'projects', :action => 'show', :id => @project
end
private
def find_project
@attachment = Attachment.find(params[:id])
# Show 404 if the filename in the url is wrong
raise ActiveRecord::RecordNotFound if params[:filename] && params[:filename] != @attachment.filename
@project = @attachment.project
rescue
rescue ActiveRecord::RecordNotFound
render_404
end
# Checks that the file exists and is readable
def file_readable
@attachment.readable? ? true : render_404
end
def read_authorize
@attachment.visible? ? true : deny_access
end
def delete_authorize
@attachment.deletable? ? true : deny_access
end
def detect_content_type(attachment)
content_type = attachment.content_type
if content_type.blank?
content_type = Redmine::MimeType.of(attachment.filename)
end
content_type.to_s
end
end

View File

@@ -16,48 +16,46 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class AuthSourcesController < ApplicationController
layout 'base'
layout 'admin'
before_filter :require_admin
def index
list
render :action => 'list' unless request.xhr?
end
# GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html)
verify :method => :post, :only => [ :destroy, :create, :update ],
:redirect_to => { :action => :list }
:redirect_to => { :template => :index }
def list
@auth_source_pages, @auth_sources = paginate :auth_sources, :per_page => 10
render :action => "list", :layout => false if request.xhr?
def index
@auth_source_pages, @auth_sources = paginate auth_source_class.name.tableize, :per_page => 10
render "auth_sources/index"
end
def new
@auth_source = AuthSourceLdap.new
@auth_source = auth_source_class.new
render 'auth_sources/new'
end
def create
@auth_source = AuthSourceLdap.new(params[:auth_source])
@auth_source = auth_source_class.new(params[:auth_source])
if @auth_source.save
flash[:notice] = l(:notice_successful_create)
redirect_to :action => 'list'
redirect_to :action => 'index'
else
render :action => 'new'
render 'auth_sources/new'
end
end
def edit
@auth_source = AuthSource.find(params[:id])
render 'auth_sources/edit'
end
def update
@auth_source = AuthSource.find(params[:id])
if @auth_source.update_attributes(params[:auth_source])
flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'list'
redirect_to :action => 'index'
else
render :action => 'edit'
render 'auth_sources/edit'
end
end
@@ -67,9 +65,9 @@ class AuthSourcesController < ApplicationController
@auth_method.test_connection
flash[:notice] = l(:notice_successful_connection)
rescue => text
flash[:error] = "Unable to connect (#{text})"
flash[:error] = l(:error_unable_to_connect, text.message)
end
redirect_to :action => 'list'
redirect_to :action => 'index'
end
def destroy
@@ -78,6 +76,12 @@ class AuthSourcesController < ApplicationController
@auth_source.destroy
flash[:notice] = l(:notice_successful_delete)
end
redirect_to :action => 'list'
redirect_to :action => 'index'
end
protected
def auth_source_class
AuthSource
end
end

View File

@@ -0,0 +1,27 @@
class AutoCompletesController < ApplicationController
before_filter :find_project
def issues
@issues = []
q = params[:q].to_s
query = (params[:scope] == "all" && Setting.cross_project_issue_relations?) ? Issue : @project.issues
if q.match(/^\d+$/)
@issues << query.visible.find_by_id(q.to_i)
end
unless q.blank?
@issues += query.visible.find(:all, :conditions => ["LOWER(#{Issue.table_name}.subject) LIKE ?", "%#{q.downcase}%"], :limit => 10)
end
@issues.compact!
render :layout => false
end
private
def find_project
project_id = (params[:issue] && params[:issue][:project_id]) || params[:project_id]
@project = Project.find(project_id)
rescue ActiveRecord::RecordNotFound
render_404
end
end

View File

@@ -16,8 +16,9 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class BoardsController < ApplicationController
layout 'base'
before_filter :find_project, :authorize
default_search_scope :messages
before_filter :find_project, :find_board_if_available, :authorize
accept_key_auth :index, :show
helper :messages
include MessagesHelper
@@ -36,16 +37,29 @@ class BoardsController < ApplicationController
end
def show
sort_init "#{Message.table_name}.updated_on", "desc"
sort_update
@topic_count = @board.topics.count
@topic_pages = Paginator.new self, @topic_count, per_page_option, params['page']
@topics = @board.topics.find :all, :order => "#{Message.table_name}.sticky DESC, #{sort_clause}",
:include => [:author, {:last_reply => :author}],
:limit => @topic_pages.items_per_page,
:offset => @topic_pages.current.offset
render :action => 'show', :layout => !request.xhr?
respond_to do |format|
format.html {
sort_init 'updated_on', 'desc'
sort_update 'created_on' => "#{Message.table_name}.created_on",
'replies' => "#{Message.table_name}.replies_count",
'updated_on' => "#{Message.table_name}.updated_on"
@topic_count = @board.topics.count
@topic_pages = Paginator.new self, @topic_count, per_page_option, params['page']
@topics = @board.topics.find :all, :order => ["#{Message.table_name}.sticky DESC", sort_clause].compact.join(', '),
:include => [:author, {:last_reply => :author}],
:limit => @topic_pages.items_per_page,
:offset => @topic_pages.current.offset
@message = Message.new
render :action => 'show', :layout => !request.xhr?
}
format.atom {
@messages = @board.messages.find :all, :order => 'created_on DESC',
:include => [:author, :board],
:limit => Setting.feeds_limit.to_i
render_feed(@messages, :title => "#{@project}: #{@board}")
}
end
end
verify :method => :post, :only => [ :destroy ], :redirect_to => { :action => :index }
@@ -55,30 +69,33 @@ class BoardsController < ApplicationController
@board.project = @project
if request.post? && @board.save
flash[:notice] = l(:notice_successful_create)
redirect_to :controller => 'projects', :action => 'settings', :id => @project, :tab => 'boards'
redirect_to_settings_in_projects
end
end
def edit
if request.post? && @board.update_attributes(params[:board])
case params[:position]
when 'highest'; @board.move_to_top
when 'higher'; @board.move_higher
when 'lower'; @board.move_lower
when 'lowest'; @board.move_to_bottom
end if params[:position]
redirect_to :controller => 'projects', :action => 'settings', :id => @project, :tab => 'boards'
redirect_to_settings_in_projects
end
end
def destroy
@board.destroy
redirect_to :controller => 'projects', :action => 'settings', :id => @project, :tab => 'boards'
redirect_to_settings_in_projects
end
private
def redirect_to_settings_in_projects
redirect_to :controller => 'projects', :action => 'settings', :id => @project, :tab => 'boards'
end
def find_project
@project = Project.find(params[:project_id])
rescue ActiveRecord::RecordNotFound
render_404
end
def find_board_if_available
@board = @project.boards.find(params[:id]) if params[:id]
rescue ActiveRecord::RecordNotFound
render_404

View File

@@ -0,0 +1,44 @@
class CalendarsController < ApplicationController
menu_item :calendar
before_filter :find_optional_project
rescue_from Query::StatementInvalid, :with => :query_statement_invalid
helper :issues
helper :projects
helper :queries
include QueriesHelper
helper :sort
include SortHelper
def show
if params[:year] and params[:year].to_i > 1900
@year = params[:year].to_i
if params[:month] and params[:month].to_i > 0 and params[:month].to_i < 13
@month = params[:month].to_i
end
end
@year ||= Date.today.year
@month ||= Date.today.month
@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],
:conditions => ["((start_date BETWEEN ? AND ?) OR (due_date BETWEEN ? AND ?))", @calendar.startdt, @calendar.enddt, @calendar.startdt, @calendar.enddt]
)
events += @query.versions(:conditions => ["effective_date BETWEEN ? AND ?", @calendar.startdt, @calendar.enddt])
@calendar.events = events
end
render :action => 'show', :layout => false if request.xhr?
end
def update
show
end
end

View File

@@ -0,0 +1,36 @@
class CommentsController < ApplicationController
default_search_scope :news
model_object News
before_filter :find_model_object
before_filter :find_project_from_association
before_filter :authorize
verify :method => :post, :only => :create, :render => {:nothing => true, :status => :method_not_allowed }
def create
@comment = Comment.new(params[:comment])
@comment.author = User.current
if @news.comments << @comment
flash[:notice] = l(:label_comment_added)
end
redirect_to :controller => 'news', :action => 'show', :id => @news
end
verify :method => :delete, :only => :destroy, :render => {:nothing => true, :status => :method_not_allowed }
def destroy
@news.comments.find(params[:comment_id]).destroy
redirect_to :controller => 'news', :action => 'show', :id => @news
end
private
# ApplicationController's find_model_object sets it based on the controller
# name so it needs to be overriden and set to @news instead
def find_model_object
super
@news = @object
@comment = nil
@news
end
end

View File

@@ -0,0 +1,44 @@
class ContextMenusController < ApplicationController
helper :watchers
def issues
@issues = Issue.visible.all(:conditions => {:id => params[:ids]}, :include => :project)
if (@issues.size == 1)
@issue = @issues.first
@allowed_statuses = @issue.new_statuses_allowed_to(User.current)
else
@allowed_statuses = @issues.map do |i|
i.new_statuses_allowed_to(User.current)
end.inject do |memo,s|
memo & s
end
end
@projects = @issues.collect(&:project).compact.uniq
@project = @projects.first if @projects.size == 1
@can = {:edit => User.current.allowed_to?(:edit_issues, @projects),
:log_time => (@project && User.current.allowed_to?(:log_time, @project)),
:update => (User.current.allowed_to?(:edit_issues, @projects) || (User.current.allowed_to?(:change_status, @projects) && !@allowed_statuses.blank?)),
:move => (@project && User.current.allowed_to?(:move_issues, @project)),
:copy => (@issue && @project.trackers.include?(@issue.tracker) && User.current.allowed_to?(:add_issues, @project)),
:delete => User.current.allowed_to?(:delete_issues, @projects)
}
if @project
@assignables = @project.assignable_users
@assignables << @issue.assigned_to if @issue && @issue.assigned_to && !@assignables.include?(@issue.assigned_to)
@trackers = @project.trackers
else
#when multiple projects, we only keep the intersection of each set
@assignables = @projects.map(&:assignable_users).inject{|memo,a| memo & a}
@trackers = @projects.map(&:trackers).inject{|memo,t| memo & t}
end
@priorities = IssuePriority.all.reverse
@statuses = IssueStatus.find(:all, :order => 'position')
@back = back_url
render :layout => false
end
end

View File

@@ -1,5 +1,5 @@
# redMine - project management software
# Copyright (C) 2006 Jean-Philippe Lang
# Redmine - project management software
# Copyright (C) 2006-2009 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,72 +16,49 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class CustomFieldsController < ApplicationController
layout 'base'
layout 'admin'
before_filter :require_admin
def index
list
render :action => 'list' unless request.xhr?
end
def list
@custom_fields_by_type = CustomField.find(:all).group_by {|f| f.class.name }
@tab = params[:tab] || 'IssueCustomField'
render :action => "list", :layout => false if request.xhr?
end
def new
case params[:type]
when "IssueCustomField"
@custom_field = IssueCustomField.new(params[:custom_field])
@custom_field.trackers = Tracker.find(params[:tracker_ids]) if params[:tracker_ids]
when "UserCustomField"
@custom_field = UserCustomField.new(params[:custom_field])
when "ProjectCustomField"
@custom_field = ProjectCustomField.new(params[:custom_field])
else
redirect_to :action => 'list'
return
end
@custom_field = begin
if params[:type].to_s.match(/.+CustomField$/)
params[:type].to_s.constantize.new(params[:custom_field])
end
rescue
end
(redirect_to(:action => 'index'); return) unless @custom_field.is_a?(CustomField)
if request.post? and @custom_field.save
flash[:notice] = l(:notice_successful_create)
redirect_to :action => 'list', :tab => @custom_field.class.name
call_hook(:controller_custom_fields_new_after_save, :params => params, :custom_field => @custom_field)
redirect_to :action => 'index', :tab => @custom_field.class.name
else
@trackers = Tracker.find(:all, :order => 'position')
end
@trackers = Tracker.find(:all, :order => 'position')
end
def edit
@custom_field = CustomField.find(params[:id])
if request.post? and @custom_field.update_attributes(params[:custom_field])
if @custom_field.is_a? IssueCustomField
@custom_field.trackers = params[:tracker_ids] ? Tracker.find(params[:tracker_ids]) : []
end
flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'list', :tab => @custom_field.class.name
call_hook(:controller_custom_fields_edit_after_save, :params => params, :custom_field => @custom_field)
redirect_to :action => 'index', :tab => @custom_field.class.name
else
@trackers = Tracker.find(:all, :order => 'position')
end
@trackers = Tracker.find(:all, :order => 'position')
end
def move
@custom_field = CustomField.find(params[:id])
case params[:position]
when 'highest'
@custom_field.move_to_top
when 'higher'
@custom_field.move_higher
when 'lower'
@custom_field.move_lower
when 'lowest'
@custom_field.move_to_bottom
end if params[:position]
redirect_to :action => 'list', :tab => @custom_field.class.name
end
def destroy
@custom_field = CustomField.find(params[:id]).destroy
redirect_to :action => 'list', :tab => @custom_field.class.name
redirect_to :action => 'index', :tab => @custom_field.class.name
rescue
flash[:error] = "Unable to delete custom field"
redirect_to :action => 'list'
flash[:error] = l(:error_can_not_delete_custom_field)
redirect_to :action => 'index'
end
end

View File

@@ -16,9 +16,11 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class DocumentsController < ApplicationController
layout 'base'
default_search_scope :documents
model_object Document
before_filter :find_project, :only => [:index, :new]
before_filter :find_document, :except => [:index, :new]
before_filter :find_model_object, :except => [:index, :new]
before_filter :find_project_from_association, :except => [:index, :new]
before_filter :authorize
helper :attachments
@@ -28,7 +30,7 @@ class DocumentsController < ApplicationController
documents = @project.documents.find :all, :include => [:attachments, :category]
case @sort_by
when 'date'
@grouped = documents.group_by {|d| d.created_on.to_date }
@grouped = documents.group_by {|d| d.updated_on.to_date }
when 'title'
@grouped = documents.group_by {|d| d.title.first.upcase}
when 'author'
@@ -36,6 +38,7 @@ class DocumentsController < ApplicationController
else
@grouped = documents.group_by(&:category)
end
@document = @project.documents.build
render :layout => false if request.xhr?
end
@@ -46,15 +49,15 @@ class DocumentsController < ApplicationController
def new
@document = @project.documents.build(params[:document])
if request.post? and @document.save
attach_files(@document, params[:attachments])
attachments = Attachment.attach_files(@document, params[:attachments])
render_attachment_warning_if_needed(@document)
flash[:notice] = l(:notice_successful_create)
Mailer.deliver_document_added(@document) if Setting.notified_events.include?('document_added')
redirect_to :action => 'index', :project_id => @project
end
end
def edit
@categories = Enumeration::get_values('DCAT')
@categories = DocumentCategory.all
if request.post? and @document.update_attributes(params[:document])
flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'show', :id => @document
@@ -65,24 +68,12 @@ class DocumentsController < ApplicationController
@document.destroy
redirect_to :controller => 'documents', :action => 'index', :project_id => @project
end
def download
@attachment = @document.attachments.find(params[:attachment_id])
@attachment.increment_download
send_file @attachment.diskfile, :filename => filename_for_content_disposition(@attachment.filename),
:type => @attachment.content_type
rescue
render_404
end
def add_attachment
attachments = attach_files(@document, params[:attachments])
Mailer.deliver_attachments_added(attachments) if !attachments.empty? && Setting.notified_events.include?('document_added')
redirect_to :action => 'show', :id => @document
end
def destroy_attachment
@document.attachments.find(params[:attachment_id]).destroy
attachments = Attachment.attach_files(@document, params[:attachments])
render_attachment_warning_if_needed(@document)
Mailer.deliver_attachments_added(attachments[:files]) if attachments.present? && attachments[:files].present? && Setting.notified_events.include?('document_added')
redirect_to :action => 'show', :id => @document
end
@@ -92,11 +83,4 @@ private
rescue ActiveRecord::RecordNotFound
render_404
end
def find_document
@document = Document.find(params[:id])
@project = @document.project
rescue ActiveRecord::RecordNotFound
render_404
end
end

View File

@@ -16,8 +16,12 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class EnumerationsController < ApplicationController
layout 'base'
layout 'admin'
before_filter :require_admin
helper :custom_fields
include CustomFieldsHelper
def index
list
@@ -32,14 +36,19 @@ class EnumerationsController < ApplicationController
end
def new
@enumeration = Enumeration.new(:opt => params[:opt])
begin
@enumeration = params[:type].constantize.new
rescue NameError
@enumeration = Enumeration.new
end
end
def create
@enumeration = Enumeration.new(params[:enumeration])
@enumeration.type = params[:enumeration][:type]
if @enumeration.save
flash[:notice] = l(:notice_successful_create)
redirect_to :action => 'list', :opt => @enumeration.opt
redirect_to :action => 'list', :type => @enumeration.type
else
render :action => 'new'
end
@@ -51,35 +60,32 @@ class EnumerationsController < ApplicationController
def update
@enumeration = Enumeration.find(params[:id])
@enumeration.type = params[:enumeration][:type] if params[:enumeration][:type]
if @enumeration.update_attributes(params[:enumeration])
flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'list', :opt => @enumeration.opt
redirect_to :action => 'list', :type => @enumeration.type
else
render :action => 'edit'
end
end
def move
@enumeration = Enumeration.find(params[:id])
case params[:position]
when 'highest'
@enumeration.move_to_top
when 'higher'
@enumeration.move_higher
when 'lower'
@enumeration.move_lower
when 'lowest'
@enumeration.move_to_bottom
end if params[:position]
redirect_to :action => 'index'
end
def destroy
Enumeration.find(params[:id]).destroy
flash[:notice] = l(:notice_successful_delete)
redirect_to :action => 'list'
rescue
flash[:error] = "Unable to delete enumeration"
redirect_to :action => 'list'
@enumeration = Enumeration.find(params[:id])
if !@enumeration.in_use?
# No associated objects
@enumeration.destroy
redirect_to :action => 'index'
return
elsif params[:reassign_to_id]
if reassign_to = @enumeration.class.find_by_id(params[:reassign_to_id])
@enumeration.destroy(reassign_to)
redirect_to :action => 'index'
return
end
end
@enumerations = @enumeration.class.find(:all) - [@enumeration]
#rescue
# flash[:error] = 'Unable to delete enumeration'
# redirect_to :action => 'index'
end
end

View File

@@ -0,0 +1,36 @@
class FilesController < ApplicationController
menu_item :files
before_filter :find_project_by_project_id
before_filter :authorize
helper :sort
include SortHelper
def index
sort_init 'filename', 'asc'
sort_update 'filename' => "#{Attachment.table_name}.filename",
'created_on' => "#{Attachment.table_name}.created_on",
'size' => "#{Attachment.table_name}.filesize",
'downloads' => "#{Attachment.table_name}.downloads"
@containers = [ Project.find(@project.id, :include => :attachments, :order => sort_clause)]
@containers += @project.versions.find(:all, :include => :attachments, :order => sort_clause).sort.reverse
render :layout => !request.xhr?
end
def new
@versions = @project.versions.sort
end
def create
container = (params[:version_id].blank? ? @project : @project.versions.find_by_id(params[:version_id]))
attachments = Attachment.attach_files(container, params[:attachments])
render_attachment_warning_if_needed(container)
if !attachments.empty? && !attachments[:files].blank? && Setting.notified_events.include?('file_added')
Mailer.deliver_attachments_added(attachments[:files])
end
redirect_to project_files_path(@project)
end
end

View File

@@ -0,0 +1,36 @@
class GanttsController < ApplicationController
menu_item :gantt
before_filter :find_optional_project
rescue_from Query::StatementInvalid, :with => :query_statement_invalid
helper :gantt
helper :issues
helper :projects
helper :queries
include QueriesHelper
helper :sort
include SortHelper
include Redmine::Export::PDF
def show
@gantt = Redmine::Helpers::Gantt.new(params)
@gantt.project = @project
retrieve_query
@query.group_by = nil
@gantt.query = @query if @query.valid?
basename = (@project ? "#{@project.identifier}-" : '') + 'gantt'
respond_to do |format|
format.html { render :action => "show", :layout => !request.xhr? }
format.png { send_data(@gantt.to_image, :disposition => 'inline', :type => 'image/png', :filename => "#{basename}.png") } if @gantt.respond_to?('to_image')
format.pdf { send_data(@gantt.to_pdf, :type => 'application/pdf', :filename => "#{basename}.pdf") }
end
end
def update
show
end
end

View File

@@ -0,0 +1,170 @@
# Redmine - project management software
# Copyright (C) 2006-2009 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
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class GroupsController < ApplicationController
layout 'admin'
before_filter :require_admin
helper :custom_fields
# GET /groups
# GET /groups.xml
def index
@groups = Group.find(:all, :order => 'lastname')
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @groups }
end
end
# GET /groups/1
# GET /groups/1.xml
def show
@group = Group.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.xml { render :xml => @group }
end
end
# GET /groups/new
# GET /groups/new.xml
def new
@group = Group.new
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @group }
end
end
# GET /groups/1/edit
def edit
@group = Group.find(params[:id], :include => :projects)
end
# POST /groups
# POST /groups.xml
def create
@group = Group.new(params[:group])
respond_to do |format|
if @group.save
flash[:notice] = l(:notice_successful_create)
format.html { redirect_to(groups_path) }
format.xml { render :xml => @group, :status => :created, :location => @group }
else
format.html { render :action => "new" }
format.xml { render :xml => @group.errors, :status => :unprocessable_entity }
end
end
end
# PUT /groups/1
# PUT /groups/1.xml
def update
@group = Group.find(params[:id])
respond_to do |format|
if @group.update_attributes(params[:group])
flash[:notice] = l(:notice_successful_update)
format.html { redirect_to(groups_path) }
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @group.errors, :status => :unprocessable_entity }
end
end
end
# DELETE /groups/1
# DELETE /groups/1.xml
def destroy
@group = Group.find(params[:id])
@group.destroy
respond_to do |format|
format.html { redirect_to(groups_url) }
format.xml { head :ok }
end
end
def add_users
@group = Group.find(params[:id])
users = User.find_all_by_id(params[:user_ids])
@group.users << users if request.post?
respond_to do |format|
format.html { redirect_to :controller => 'groups', :action => 'edit', :id => @group, :tab => 'users' }
format.js {
render(:update) {|page|
page.replace_html "tab-content-users", :partial => 'groups/users'
users.each {|user| page.visual_effect(:highlight, "user-#{user.id}") }
}
}
end
end
def remove_user
@group = Group.find(params[:id])
@group.users.delete(User.find(params[:user_id])) if request.post?
respond_to do |format|
format.html { redirect_to :controller => 'groups', :action => 'edit', :id => @group, :tab => 'users' }
format.js { render(:update) {|page| page.replace_html "tab-content-users", :partial => 'groups/users'} }
end
end
def autocomplete_for_user
@group = Group.find(params[:id])
@users = User.active.like(params[:q]).find(:all, :limit => 100) - @group.users
render :layout => false
end
def edit_membership
@group = Group.find(params[:id])
@membership = Member.edit_membership(params[:membership_id], params[:membership], @group)
@membership.save if request.post?
respond_to do |format|
if @membership.valid?
format.html { redirect_to :controller => 'groups', :action => 'edit', :id => @group, :tab => 'memberships' }
format.js {
render(:update) {|page|
page.replace_html "tab-content-memberships", :partial => 'groups/memberships'
page.visual_effect(:highlight, "member-#{@membership.id}")
}
}
else
format.js {
render(:update) {|page|
page.alert(l(:notice_failed_to_save_members, :errors => @membership.errors.full_messages.join(', ')))
}
}
end
end
end
def destroy_membership
@group = Group.find(params[:id])
Member.find(params[:membership_id]).destroy if request.post?
respond_to do |format|
format.html { redirect_to :controller => 'groups', :action => 'edit', :id => @group, :tab => 'memberships' }
format.js { render(:update) {|page| page.replace_html "tab-content-memberships", :partial => 'groups/memberships'} }
end
end
end

View File

@@ -16,12 +16,42 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class IssueCategoriesController < ApplicationController
layout 'base'
menu_item :settings
before_filter :find_project, :authorize
model_object IssueCategory
before_filter :find_model_object, :except => :new
before_filter :find_project_from_association, :except => :new
before_filter :find_project, :only => :new
before_filter :authorize
verify :method => :post, :only => :destroy
def new
@category = @project.issue_categories.build(params[:category])
if request.post?
if @category.save
respond_to do |format|
format.html do
flash[:notice] = l(:notice_successful_create)
redirect_to :controller => 'projects', :action => 'settings', :tab => 'categories', :id => @project
end
format.js do
# IE doesn't support the replace_html rjs method for select box options
render(:update) {|page| page.replace "issue_category_id",
content_tag('select', '<option></option>' + options_from_collection_for_select(@project.issue_categories, 'id', 'name', @category.id), :id => 'issue_category_id', :name => 'issue[category_id]')
}
end
end
else
respond_to do |format|
format.html
format.js do
render(:update) {|page| page.alert(@category.errors.full_messages.join('\n')) }
end
end
end
end
end
def edit
if request.post? and @category.update_attributes(params[:category])
flash[:notice] = l(:notice_successful_update)
@@ -35,19 +65,27 @@ class IssueCategoriesController < ApplicationController
# No issue assigned to this category
@category.destroy
redirect_to :controller => 'projects', :action => 'settings', :id => @project, :tab => 'categories'
return
elsif params[:todo]
reassign_to = @project.issue_categories.find_by_id(params[:reassign_to_id]) if params[:todo] == 'reassign'
@category.destroy(reassign_to)
redirect_to :controller => 'projects', :action => 'settings', :id => @project, :tab => 'categories'
return
end
@categories = @project.issue_categories - [@category]
end
private
# Wrap ApplicationController's find_model_object method to set
# @category instead of just @issue_category
def find_model_object
super
@category = @object
end
def find_project
@category = IssueCategory.find(params[:id])
@project = @category.project
@project = Project.find(params[:project_id])
rescue ActiveRecord::RecordNotFound
render_404
end
end
end

View File

@@ -0,0 +1,68 @@
class IssueMovesController < ApplicationController
default_search_scope :issues
before_filter :find_issues, :check_project_uniqueness
before_filter :authorize
def new
prepare_for_issue_move
render :layout => false if request.xhr?
end
def create
prepare_for_issue_move
if request.post?
new_tracker = params[:new_tracker_id].blank? ? nil : @target_project.trackers.find_by_id(params[:new_tracker_id])
unsaved_issue_ids = []
moved_issues = []
@issues.each do |issue|
issue.reload
issue.init_journal(User.current)
issue.current_journal.notes = @notes if @notes.present?
call_hook(:controller_issues_move_before_save, { :params => params, :issue => issue, :target_project => @target_project, :copy => !!@copy })
if r = issue.move_to_project(@target_project, new_tracker, {:copy => @copy, :attributes => extract_changed_attributes_for_move(params)})
moved_issues << r
else
unsaved_issue_ids << issue.id
end
end
set_flash_from_bulk_issue_save(@issues, unsaved_issue_ids)
if params[:follow]
if @issues.size == 1 && moved_issues.size == 1
redirect_to :controller => 'issues', :action => 'show', :id => moved_issues.first
else
redirect_to :controller => 'issues', :action => 'index', :project_id => (@target_project || @project)
end
else
redirect_to :controller => 'issues', :action => 'index', :project_id => @project
end
return
end
end
private
def prepare_for_issue_move
@issues.sort!
@copy = params[:copy_options] && params[:copy_options][:copy]
@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
@available_statuses = Workflow.available_statuses(@project)
@notes = params[:notes]
@notes ||= ''
end
def extract_changed_attributes_for_move(params)
changed_attributes = {}
[:assigned_to_id, :status_id, :start_date, :due_date, :priority_id].each do |valid_attribute|
unless params[valid_attribute].blank?
changed_attributes[valid_attribute] = (params[valid_attribute] == 'none' ? nil : params[valid_attribute])
end
end
changed_attributes
end
end

View File

@@ -16,16 +16,19 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class IssueRelationsController < ApplicationController
layout 'base'
before_filter :find_project, :authorize
before_filter :find_issue, :find_project_from_association, :authorize
def new
@relation = IssueRelation.new(params[:relation])
@relation.issue_from = @issue
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|
format.html { redirect_to :controller => 'issues', :action => 'show', :id => @issue }
format.js do
@relations = @issue.relations.select {|r| r.other_issue(@issue) && r.other_issue(@issue).visible? }
render :update do |page|
page.replace_html "relations", :partial => 'issues/relations'
if @relation.errors.empty?
@@ -45,14 +48,16 @@ class IssueRelationsController < ApplicationController
end
respond_to do |format|
format.html { redirect_to :controller => 'issues', :action => 'show', :id => @issue }
format.js { render(:update) {|page| page.replace_html "relations", :partial => 'issues/relations'} }
format.js {
@relations = @issue.relations.select {|r| r.other_issue(@issue) && r.other_issue(@issue).visible? }
render(:update) {|page| page.replace_html "relations", :partial => 'issues/relations'}
}
end
end
private
def find_project
@issue = Issue.find(params[:issue_id])
@project = @issue.project
def find_issue
@issue = @object = Issue.find(params[:issue_id])
rescue ActiveRecord::RecordNotFound
render_404
end

View File

@@ -16,20 +16,16 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class IssueStatusesController < ApplicationController
layout 'base'
layout 'admin'
before_filter :require_admin
verify :method => :post, :only => [ :destroy, :create, :update, :move ],
:redirect_to => { :action => :list }
verify :method => :post, :only => [ :destroy, :create, :update, :move, :update_issue_done_ratio ],
:redirect_to => { :action => :index }
def index
list
render :action => 'list' unless request.xhr?
end
def list
@issue_status_pages, @issue_statuses = paginate :issue_statuses, :per_page => 25, :order => "position"
render :action => "list", :layout => false if request.xhr?
render :action => "index", :layout => false if request.xhr?
end
def new
@@ -40,7 +36,7 @@ class IssueStatusesController < ApplicationController
@issue_status = IssueStatus.new(params[:issue_status])
if @issue_status.save
flash[:notice] = l(:notice_successful_create)
redirect_to :action => 'list'
redirect_to :action => 'index'
else
render :action => 'new'
end
@@ -54,32 +50,26 @@ class IssueStatusesController < ApplicationController
@issue_status = IssueStatus.find(params[:id])
if @issue_status.update_attributes(params[:issue_status])
flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'list'
redirect_to :action => 'index'
else
render :action => 'edit'
end
end
def move
@issue_status = IssueStatus.find(params[:id])
case params[:position]
when 'highest'
@issue_status.move_to_top
when 'higher'
@issue_status.move_higher
when 'lower'
@issue_status.move_lower
when 'lowest'
@issue_status.move_to_bottom
end if params[:position]
redirect_to :action => 'list'
end
def destroy
IssueStatus.find(params[:id]).destroy
redirect_to :action => 'list'
redirect_to :action => 'index'
rescue
flash[:error] = "Unable to delete issue status"
redirect_to :action => 'list'
flash[:error] = l(:error_unable_delete_issue_status)
redirect_to :action => 'index'
end
def update_issue_done_ratio
if IssueStatus.update_issue_done_ratios
flash[:notice] = l(:notice_issue_done_ratios_updated)
else
flash[:error] = l(:error_issue_done_ratios_not_updated)
end
redirect_to :action => 'index'
end
end

View File

@@ -1,5 +1,5 @@
# redMine - project management software
# Copyright (C) 2006-2007 Jean-Philippe Lang
# Redmine - project management software
# Copyright (C) 2006-2008 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,23 +16,26 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class IssuesController < ApplicationController
layout 'base'
menu_item :new_issue, :only => :new
menu_item :new_issue, :only => [:new, :create]
default_search_scope :issues
before_filter :find_issue, :only => [:show, :edit, :destroy_attachment]
before_filter :find_issues, :only => [:bulk_edit, :move, :destroy]
before_filter :find_project, :only => [:new, :update_form, :preview]
before_filter :authorize, :except => [:index, :changes, :preview, :update_form, :context_menu]
before_filter :find_optional_project, :only => [:index, :changes]
accept_key_auth :index, :changes
before_filter :find_issue, :only => [:show, :edit, :update]
before_filter :find_issues, :only => [:bulk_edit, :bulk_update, :move, :perform_move, :destroy]
before_filter :check_project_uniqueness, :only => [:move, :perform_move]
before_filter :find_project, :only => [:new, :create]
before_filter :authorize, :except => [:index]
before_filter :find_optional_project, :only => [:index]
before_filter :check_for_default_issue_status, :only => [:new, :create]
before_filter :build_new_issue_from_params, :only => [:new, :create]
accept_key_auth :index, :show, :create, :update, :destroy
rescue_from Query::StatementInvalid, :with => :query_statement_invalid
helper :journals
helper :projects
include ProjectsHelper
helper :custom_fields
include CustomFieldsHelper
helper :ifpdf
include IfpdfHelper
helper :issue_relations
include IssueRelationsHelper
helper :watchers
@@ -40,235 +43,176 @@ class IssuesController < ApplicationController
helper :attachments
include AttachmentsHelper
helper :queries
include QueriesHelper
helper :repositories
include RepositoriesHelper
helper :sort
include SortHelper
include IssuesHelper
helper :timelog
helper :gantt
include Redmine::Export::PDF
verify :method => [:post, :delete],
:only => :destroy,
:render => { :nothing => true, :status => :method_not_allowed }
verify :method => :post, :only => :create, :render => {:nothing => true, :status => :method_not_allowed }
verify :method => :post, :only => :bulk_update, :render => {:nothing => true, :status => :method_not_allowed }
verify :method => :put, :only => :update, :render => {:nothing => true, :status => :method_not_allowed }
def index
sort_init "#{Issue.table_name}.id", "desc"
sort_update
retrieve_query
sort_init(@query.sort_criteria.empty? ? [['id', 'desc']] : @query.sort_criteria)
sort_update(@query.sortable_columns)
if @query.valid?
limit = per_page_option
respond_to do |format|
format.html { }
format.atom { }
format.csv { limit = Setting.issues_export_limit.to_i }
format.pdf { limit = Setting.issues_export_limit.to_i }
case params[:format]
when 'csv', 'pdf'
@limit = Setting.issues_export_limit.to_i
when 'atom'
@limit = Setting.feeds_limit.to_i
when 'xml', 'json'
@offset, @limit = api_offset_and_limit
else
@limit = per_page_option
end
@issue_count = Issue.count(:include => [:status, :project], :conditions => @query.statement)
@issue_pages = Paginator.new self, @issue_count, limit, params['page']
@issues = Issue.find :all, :order => sort_clause,
:include => [ :assigned_to, :status, :tracker, :project, :priority, :category, :fixed_version ],
:conditions => @query.statement,
:limit => limit,
:offset => @issue_pages.current.offset
@issue_count = @query.issue_count
@issue_pages = Paginator.new self, @issue_count, @limit, params['page']
@offset ||= @issue_pages.current.offset
@issues = @query.issues(:include => [:assigned_to, :tracker, :priority, :category, :fixed_version],
:order => sort_clause,
:offset => @offset,
:limit => @limit)
@issue_count_by_group = @query.issue_count_by_group
respond_to do |format|
format.html { render :template => 'issues/index.rhtml', :layout => !request.xhr? }
format.atom { render_feed(@issues, :title => l(:label_issue_plural)) }
format.csv { send_data(issues_to_csv(@issues, @project).read, :type => 'text/csv; header=present', :filename => 'export.csv') }
format.pdf { send_data(render(:template => 'issues/index.rfpdf', :layout => false), :type => 'application/pdf', :filename => 'export.pdf') }
format.api
format.atom { render_feed(@issues, :title => "#{@project || Setting.app_title}: #{l(:label_issue_plural)}") }
format.csv { send_data(issues_to_csv(@issues, @project), :type => 'text/csv; header=present', :filename => 'export.csv') }
format.pdf { send_data(issues_to_pdf(@issues, @project, @query), :type => 'application/pdf', :filename => 'export.pdf') }
end
else
# Send html if the query is not valid
render(:template => 'issues/index.rhtml', :layout => !request.xhr?)
end
end
def changes
sort_init "#{Issue.table_name}.id", "desc"
sort_update
retrieve_query
if @query.valid?
@journals = Journal.find :all, :include => [ :details, :user, {:issue => [:project, :author, :tracker, :status]} ],
:conditions => @query.statement,
:limit => 25,
:order => "#{Journal.table_name}.created_on DESC"
end
@title = (@project ? @project.name : Setting.app_title) + ": " + (@query.new_record? ? l(:label_changes_details) : @query.name)
render :layout => false, :content_type => 'application/atom+xml'
rescue ActiveRecord::RecordNotFound
render_404
end
def show
@custom_values = @project.custom_fields_for_issues(@issue.tracker).collect { |x| @issue.custom_values.find_by_custom_field_id(x.id) || CustomValue.new(:custom_field => x, :customized => @issue) }
@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.visible.all
@changesets.reverse! if User.current.wants_comments_in_reverse_order?
@relations = @issue.relations.select {|r| r.other_issue(@issue) && r.other_issue(@issue).visible? }
@allowed_statuses = @issue.new_statuses_allowed_to(User.current)
@edit_allowed = User.current.allowed_to?(:edit_issues, @project)
@activities = Enumeration::get_values('ACTI')
@priorities = Enumeration::get_values('IPRI')
@priorities = IssuePriority.all
@time_entry = TimeEntry.new
respond_to do |format|
format.html { render :template => 'issues/show.rhtml' }
format.atom { render :action => 'changes', :layout => false, :content_type => 'application/atom+xml' }
format.pdf { send_data(render(:template => 'issues/show.rfpdf', :layout => false), :type => 'application/pdf', :filename => "#{@project.identifier}-#{@issue.id}.pdf") }
format.api
format.atom { render :template => 'journals/index', :layout => false, :content_type => 'application/atom+xml' }
format.pdf { send_data(issue_to_pdf(@issue), :type => 'application/pdf', :filename => "#{@project.identifier}-#{@issue.id}.pdf") }
end
end
# Add a new issue
# The new issue will be created from an existing one if copy_from parameter is given
def new
@issue = params[:copy_from] ? Issue.new.copy_from(params[:copy_from]) : Issue.new(params[:issue])
@issue.project = @project
@issue.author = User.current
@issue.tracker ||= @project.trackers.find(params[:tracker_id] ? params[:tracker_id] : :first)
if @issue.tracker.nil?
flash.now[:error] = 'No tracker is associated to this project. Please check the Project settings.'
render :nothing => true, :layout => true
return
respond_to do |format|
format.html { render :action => 'new', :layout => !request.xhr? }
format.js { render :partial => 'attributes' }
end
default_status = IssueStatus.default
unless default_status
flash.now[:error] = 'No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses").'
render :nothing => true, :layout => true
return
end
@issue.status = default_status
@allowed_statuses = ([default_status] + default_status.find_new_statuses_allowed_to(User.current.role_for_project(@project), @issue.tracker)).uniq
if request.get? || request.xhr?
@issue.start_date ||= Date.today
@custom_values = @issue.custom_values.empty? ?
@project.custom_fields_for_issues(@issue.tracker).collect { |x| CustomValue.new(:custom_field => x, :customized => @issue) } :
@issue.custom_values
else
requested_status = IssueStatus.find_by_id(params[:issue][:status_id])
# Check that the user is allowed to apply the requested status
@issue.status = (@allowed_statuses.include? requested_status) ? requested_status : default_status
@custom_values = @project.custom_fields_for_issues(@issue.tracker).collect { |x| CustomValue.new(:custom_field => x, :customized => @issue, :value => params["custom_fields"][x.id.to_s]) }
@issue.custom_values = @custom_values
if @issue.save
attach_files(@issue, params[:attachments])
flash[:notice] = l(:notice_successful_create)
Mailer.deliver_issue_add(@issue) if Setting.notified_events.include?('issue_added')
redirect_to :controller => 'issues', :action => 'show', :id => @issue, :project_id => @project
return
end
end
@priorities = Enumeration::get_values('IPRI')
render :layout => !request.xhr?
end
# Attributes that can be updated on workflow transition (without :edit permission)
# TODO: make it configurable (at least per role)
UPDATABLE_ATTRS_ON_TRANSITION = %w(status_id assigned_to_id fixed_version_id done_ratio) unless const_defined?(:UPDATABLE_ATTRS_ON_TRANSITION)
def edit
@allowed_statuses = @issue.new_statuses_allowed_to(User.current)
@activities = Enumeration::get_values('ACTI')
@priorities = Enumeration::get_values('IPRI')
@custom_values = []
@edit_allowed = User.current.allowed_to?(:edit_issues, @project)
@notes = params[:notes]
journal = @issue.init_journal(User.current, @notes)
# User can change issue attributes only if he has :edit permission or if a workflow transition is allowed
if (@edit_allowed || !@allowed_statuses.empty?) && params[:issue]
attrs = params[:issue].dup
attrs.delete_if {|k,v| !UPDATABLE_ATTRS_ON_TRANSITION.include?(k) } unless @edit_allowed
attrs.delete(:status_id) unless @allowed_statuses.detect {|s| s.id.to_s == attrs[:status_id].to_s}
@issue.attributes = attrs
end
if request.get?
@custom_values = @project.custom_fields_for_issues(@issue.tracker).collect { |x| @issue.custom_values.find_by_custom_field_id(x.id) || CustomValue.new(:custom_field => x, :customized => @issue) }
else
# Update custom fields if user has :edit permission
if @edit_allowed && params[:custom_fields]
@custom_values = @project.custom_fields_for_issues(@issue.tracker).collect { |x| CustomValue.new(:custom_field => x, :customized => @issue, :value => params["custom_fields"][x.id.to_s]) }
@issue.custom_values = @custom_values
def create
call_hook(:controller_issues_new_before_save, { :params => params, :issue => @issue })
if @issue.save
attachments = Attachment.attach_files(@issue, params[:attachments])
render_attachment_warning_if_needed(@issue)
flash[:notice] = l(:notice_successful_create)
call_hook(:controller_issues_new_after_save, { :params => params, :issue => @issue})
respond_to do |format|
format.html {
redirect_to(params[:continue] ? { :action => 'new', :project_id => @project, :issue => {:tracker_id => @issue.tracker, :parent_issue_id => @issue.parent_issue_id}.reject {|k,v| v.nil?} } :
{ :action => 'show', :id => @issue })
}
format.api { render :action => 'show', :status => :created, :location => issue_url(@issue) }
end
attachments = attach_files(@issue, params[:attachments])
attachments.each {|a| journal.details << JournalDetail.new(:property => 'attachment', :prop_key => a.id, :value => a.filename)}
if @issue.save
# Log spend time
if current_role.allowed_to?(:log_time)
@time_entry = TimeEntry.new(:project => @project, :issue => @issue, :user => User.current, :spent_on => Date.today)
@time_entry.attributes = params[:time_entry]
@time_entry.save
end
if !journal.new_record?
# Only send notification if something was actually changed
flash[:notice] = l(:notice_successful_update)
Mailer.deliver_issue_edit(journal) if Setting.notified_events.include?('issue_updated')
end
redirect_to(params[:back_to] || {:action => 'show', :id => @issue})
return
else
respond_to do |format|
format.html { render :action => 'new' }
format.api { render_validation_errors(@issue) }
end
end
end
def edit
update_issue_from_params
@journal = @issue.current_journal
respond_to do |format|
format.html { }
format.xml { }
end
end
def update
update_issue_from_params
if @issue.save_issue_with_child_records(params, @time_entry)
render_attachment_warning_if_needed(@issue)
flash[:notice] = l(:notice_successful_update) unless @issue.current_journal.new_record?
respond_to do |format|
format.html { redirect_back_or_default({:action => 'show', :id => @issue}) }
format.api { head :ok }
end
else
render_attachment_warning_if_needed(@issue)
flash[:notice] = l(:notice_successful_update) unless @issue.current_journal.new_record?
@journal = @issue.current_journal
respond_to do |format|
format.html { render :action => 'edit' }
format.api { render_validation_errors(@issue) }
end
end
rescue ActiveRecord::StaleObjectError
# Optimistic locking exception
flash.now[:error] = l(:notice_locking_conflict)
end
# Bulk edit a set of issues
def bulk_edit
if request.post?
status = params[:status_id].blank? ? nil : IssueStatus.find_by_id(params[:status_id])
priority = params[:priority_id].blank? ? nil : Enumeration.find_by_id(params[:priority_id])
assigned_to = (params[:assigned_to_id].blank? || params[:assigned_to_id] == 'none') ? nil : User.find_by_id(params[:assigned_to_id])
category = (params[:category_id].blank? || params[:category_id] == 'none') ? nil : @project.issue_categories.find_by_id(params[:category_id])
fixed_version = (params[:fixed_version_id].blank? || params[:fixed_version_id] == 'none') ? nil : @project.versions.find_by_id(params[:fixed_version_id])
unsaved_issue_ids = []
@issues.each do |issue|
journal = issue.init_journal(User.current, params[:notes])
issue.priority = priority if priority
issue.assigned_to = assigned_to if assigned_to || params[:assigned_to_id] == 'none'
issue.category = category if category || params[:category_id] == 'none'
issue.fixed_version = fixed_version if fixed_version || params[:fixed_version_id] == 'none'
issue.start_date = params[:start_date] unless params[:start_date].blank?
issue.due_date = params[:due_date] unless params[:due_date].blank?
issue.done_ratio = params[:done_ratio] unless params[:done_ratio].blank?
# Don't save any change to the issue if the user is not authorized to apply the requested status
if (status.nil? || (issue.status.new_status_allowed_to?(status, current_role, issue.tracker) && issue.status = status)) && issue.save
# Send notification for each issue (if changed)
Mailer.deliver_issue_edit(journal) if journal.details.any? && Setting.notified_events.include?('issue_updated')
else
# Keep unsaved issue ids to display them in flash error
unsaved_issue_ids << issue.id
end
end
if unsaved_issue_ids.empty?
flash[:notice] = l(:notice_successful_update) unless @issues.empty?
else
flash[:error] = l(:notice_failed_to_save_issues, unsaved_issue_ids.size, @issues.size, '#' + unsaved_issue_ids.join(', #'))
end
redirect_to :controller => 'issues', :action => 'index', :project_id => @project
return
end
# Find potential statuses the user could be allowed to switch issues to
@available_statuses = Workflow.find(:all, :include => :new_status,
:conditions => {:role_id => current_role.id}).collect(&:new_status).compact.uniq
@issues.sort!
@available_statuses = @projects.map{|p|Workflow.available_statuses(p)}.inject{|memo,w|memo & w}
@custom_fields = @projects.map{|p|p.all_issue_custom_fields}.inject{|memo,c|memo & c}
@assignables = @projects.map(&:assignable_users).inject{|memo,a| memo & a}
@trackers = @projects.map(&:trackers).inject{|memo,t| memo & t}
end
def move
@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), :order => 'name')
else
User.current.memberships.each {|m| @allowed_projects << m.project if m.role.allowed_to?(:move_issues)}
end
@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
if request.post?
new_tracker = params[:new_tracker_id].blank? ? nil : @target_project.trackers.find_by_id(params[:new_tracker_id])
unsaved_issue_ids = []
@issues.each do |issue|
unsaved_issue_ids << issue.id unless issue.move_to(@target_project, new_tracker)
def bulk_update
@issues.sort!
attributes = parse_params_for_bulk_issue_attributes(params)
unsaved_issue_ids = []
@issues.each do |issue|
issue.reload
journal = issue.init_journal(User.current, params[:notes])
issue.safe_attributes = attributes
call_hook(:controller_issues_bulk_edit_before_save, { :params => params, :issue => issue })
unless issue.save
# Keep unsaved issue ids to display them in flash error
unsaved_issue_ids << issue.id
end
if unsaved_issue_ids.empty?
flash[:notice] = l(:notice_successful_update) unless @issues.empty?
else
flash[:error] = l(:notice_failed_to_save_issues, unsaved_issue_ids.size, @issues.size, '#' + unsaved_issue_ids.join(', #'))
end
redirect_to :controller => 'issues', :action => 'index', :project_id => @project
return
end
render :layout => false if request.xhr?
set_flash_from_bulk_issue_save(@issues, unsaved_issue_ids)
redirect_back_or_default({:controller => 'issues', :action => 'index', :project_id => @project})
end
def destroy
@@ -288,62 +232,23 @@ class IssuesController < ApplicationController
TimeEntry.update_all("issue_id = #{reassign_to.id}", ['issue_id IN (?)', @issues])
end
else
# display the destroy form
return
# display the destroy form if it's a user request
return unless api_request?
end
end
@issues.each(&:destroy)
redirect_to :action => 'index', :project_id => @project
end
def destroy_attachment
a = @issue.attachments.find(params[:attachment_id])
a.destroy
journal = @issue.init_journal(User.current)
journal.details << JournalDetail.new(:property => 'attachment',
:prop_key => a.id,
:old_value => a.filename)
journal.save
redirect_to :action => 'show', :id => @issue
end
def context_menu
@issues = Issue.find_all_by_id(params[:ids], :include => :project)
if (@issues.size == 1)
@issue = @issues.first
@allowed_statuses = @issue.new_statuses_allowed_to(User.current)
@assignables = @issue.assignable_users
@assignables << @issue.assigned_to if @issue.assigned_to && !@assignables.include?(@issue.assigned_to)
@issues.each do |issue|
begin
issue.reload.destroy
rescue ::ActiveRecord::RecordNotFound # raised by #reload if issue no longer exists
# nothing to do, issue was already deleted (eg. by a parent)
end
end
respond_to do |format|
format.html { redirect_back_or_default(:action => 'index', :project_id => @project) }
format.api { head :ok }
end
projects = @issues.collect(&:project).compact.uniq
@project = projects.first if projects.size == 1
@can = {:edit => (@project && User.current.allowed_to?(:edit_issues, @project)),
:update => (@issue && (User.current.allowed_to?(:edit_issues, @project) || (User.current.allowed_to?(:change_status, @project) && !@allowed_statuses.empty?))),
:move => (@project && User.current.allowed_to?(:move_issues, @project)),
:copy => (@issue && @project.trackers.include?(@issue.tracker) && User.current.allowed_to?(:add_issues, @project)),
:delete => (@project && User.current.allowed_to?(:delete_issues, @project))
}
@priorities = Enumeration.get_values('IPRI').reverse
@statuses = IssueStatus.find(:all, :order => 'position')
@back = request.env['HTTP_REFERER']
render :layout => false
end
def update_form
@issue = Issue.new(params[:issue])
render :action => :new, :layout => false
end
def preview
issue = @project.issues.find_by_id(params[:id])
@attachements = issue.attachments if issue
@text = params[:notes] || (params[:issue] ? params[:issue][:description] : nil)
render :partial => 'common/preview'
end
private
def find_issue
@issue = Issue.find(params[:id], :include => [:project, :tracker, :status, :author, :priority, :category])
@@ -352,59 +257,69 @@ private
render_404
end
# Filter for bulk operations
def find_issues
@issues = Issue.find_all_by_id(params[:id] || params[:ids])
raise ActiveRecord::RecordNotFound if @issues.empty?
projects = @issues.collect(&:project).compact.uniq
if projects.size == 1
@project = projects.first
else
# TODO: let users bulk edit/move/destroy issues from different projects
render_error 'Can not bulk edit/move/destroy issues from different projects' and return false
end
rescue ActiveRecord::RecordNotFound
render_404
end
def find_project
@project = Project.find(params[:project_id])
project_id = (params[:issue] && params[:issue][:project_id]) || params[:project_id]
@project = Project.find(project_id)
rescue ActiveRecord::RecordNotFound
render_404
end
def find_optional_project
return true unless params[:project_id]
@project = Project.find(params[:project_id])
authorize
rescue ActiveRecord::RecordNotFound
render_404
# Used by #edit and #update to set some common instance variables
# from the params
# TODO: Refactor, not everything in here is needed by #edit
def update_issue_from_params
@allowed_statuses = @issue.new_statuses_allowed_to(User.current)
@priorities = IssuePriority.all
@edit_allowed = User.current.allowed_to?(:edit_issues, @project)
@time_entry = TimeEntry.new
@time_entry.attributes = params[:time_entry]
@notes = params[:notes] || (params[:issue].present? ? params[:issue][:notes] : nil)
@issue.init_journal(User.current, @notes)
@issue.safe_attributes = params[:issue]
end
# Retrieve query from session or build a new query
def retrieve_query
if !params[:query_id].blank?
@query = Query.find(params[:query_id], :conditions => {:project_id => (@project ? @project.id : nil)})
session[:query] = {:id => @query.id, :project_id => @query.project_id}
# TODO: Refactor, lots of extra code in here
# TODO: Changing tracker on an existing issue should not trigger this
def build_new_issue_from_params
if params[:id].blank?
@issue = Issue.new
@issue.copy_from(params[:copy_from]) if params[:copy_from]
@issue.project = @project
else
if params[:set_filter] || session[:query].nil? || session[:query][:project_id] != (@project ? @project.id : nil)
# Give it a name, required to be valid
@query = Query.new(:name => "_")
@query.project = @project
if params[:fields] and params[:fields].is_a? Array
params[:fields].each do |field|
@query.add_filter(field, params[:operators][field], params[:values][field])
end
else
@query.available_filters.keys.each do |field|
@query.add_short_filter(field, params[field]) if params[field]
end
end
session[:query] = {:project_id => @query.project_id, :filters => @query.filters}
else
@query = Query.find_by_id(session[:query][:id]) if session[:query][:id]
@query ||= Query.new(:name => "_", :project => @project, :filters => session[:query][:filters])
@issue = @project.issues.visible.find(params[:id])
end
@issue.project = @project
# Tracker must be set before custom field values
@issue.tracker ||= @project.trackers.find((params[:issue] && params[:issue][:tracker_id]) || params[:tracker_id] || :first)
if @issue.tracker.nil?
render_error l(:error_no_tracker_in_project)
return false
end
@issue.start_date ||= Date.today
if params[:issue].is_a?(Hash)
@issue.safe_attributes = params[:issue]
if User.current.allowed_to?(:add_issue_watchers, @project) && @issue.new_record?
@issue.watcher_user_ids = params[:issue]['watcher_user_ids']
end
end
@issue.author = User.current
@priorities = IssuePriority.all
@allowed_statuses = @issue.new_statuses_allowed_to(User.current, true)
end
def check_for_default_issue_status
if IssueStatus.default.nil?
render_error l(:error_no_default_issue_status)
return false
end
end
def parse_params_for_bulk_issue_attributes(params)
attributes = (params[:issue] || {}).reject {|k,v| v.blank?}
attributes.keys.each {|k| attributes[k] = '' if attributes[k] == 'none'}
attributes[:custom_field_values].reject! {|k,v| v.blank?} if attributes[:custom_field_values]
attributes
end
end

View File

@@ -16,26 +16,91 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class JournalsController < ApplicationController
layout 'base'
before_filter :find_journal
before_filter :find_journal, :only => [:edit]
before_filter :find_issue, :only => [:new]
before_filter :find_optional_project, :only => [:index]
before_filter :authorize, :only => [:new, :edit]
accept_key_auth :index
helper :issues
helper :custom_fields
helper :queries
include QueriesHelper
helper :sort
include SortHelper
def index
retrieve_query
sort_init 'id', 'desc'
sort_update(@query.sortable_columns)
if @query.valid?
@journals = @query.journals(:order => "#{Journal.table_name}.created_on DESC",
:limit => 25)
end
@title = (@project ? @project.name : Setting.app_title) + ": " + (@query.new_record? ? l(:label_changes_details) : @query.name)
render :layout => false, :content_type => 'application/atom+xml'
rescue ActiveRecord::RecordNotFound
render_404
end
def new
journal = Journal.find(params[:journal_id]) if params[:journal_id]
if journal
user = journal.user
text = journal.notes
else
user = @issue.author
text = @issue.description
end
# 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 = \"#{escape_javascript content}\";"
page.show 'update'
page << "Form.Element.focus('notes');"
page << "Element.scrollTo('update');"
page << "$('notes').scrollTop = $('notes').scrollHeight - $('notes').clientHeight;"
}
end
def edit
if request.post?
@journal.update_attributes(:notes => params[:notes]) if params[:notes]
@journal.destroy if @journal.details.empty? && @journal.notes.blank?
call_hook(:controller_journals_edit_post, { :journal => @journal, :params => params})
respond_to do |format|
format.html { redirect_to :controller => 'issues', :action => 'show', :id => @journal.journalized_id }
format.js { render :action => 'update' }
end
else
respond_to do |format|
format.html {
# TODO: implement non-JS journal update
render :nothing => true
}
format.js
end
end
end
private
def find_journal
@journal = Journal.find(params[:id])
render_403 and return false unless @journal.editable_by?(User.current)
(render_403; return false) unless @journal.editable_by?(User.current)
@project = @journal.journalized.project
rescue ActiveRecord::RecordNotFound
render_404
end
# TODO: duplicated in IssuesController
def find_issue
@issue = Issue.find(params[:id], :include => [:project, :tracker, :status, :author, :priority, :category])
@project = @issue.project
rescue ActiveRecord::RecordNotFound
render_404
end
end

View File

@@ -0,0 +1,25 @@
# redMine - project management software
# Copyright (C) 2006 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
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class LdapAuthSourcesController < AuthSourcesController
protected
def auth_source_class
AuthSourceLdap
end
end

View File

@@ -0,0 +1,44 @@
# redMine - project management software
# Copyright (C) 2006-2008 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
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class MailHandlerController < ActionController::Base
before_filter :check_credential
verify :method => :post,
:only => :index,
:render => { :nothing => true, :status => 405 }
# Submits an incoming email to MailHandler
def index
options = params.dup
email = options.delete(:email)
if MailHandler.receive(email, options)
render :nothing => true, :status => :created
else
render :nothing => true, :status => :unprocessable_entity
end
end
private
def check_credential
User.current = nil
unless Setting.mail_handler_api_enabled? && params[:key].to_s == Setting.mail_handler_api_key
render :text => 'Access denied. Incoming emails WS is disabled or key is invalid.', :status => 403
end
end
end

View File

@@ -16,16 +16,50 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class MembersController < ApplicationController
layout 'base'
before_filter :find_member, :except => :new
before_filter :find_project, :only => :new
model_object Member
before_filter :find_model_object, :except => [:new, :autocomplete_for_member]
before_filter :find_project_from_association, :except => [:new, :autocomplete_for_member]
before_filter :find_project, :only => [:new, :autocomplete_for_member]
before_filter :authorize
def new
@project.members << Member.new(params[:member]) if request.post?
members = []
if params[:member] && request.post?
attrs = params[:member].dup
if (user_ids = attrs.delete(:user_ids))
user_ids.each do |user_id|
members << Member.new(attrs.merge(:user_id => user_id))
end
else
members << Member.new(attrs)
end
@project.members << members
end
respond_to do |format|
format.html { redirect_to :action => 'settings', :tab => 'members', :id => @project }
format.js { render(:update) {|page| page.replace_html "tab-content-members", :partial => 'projects/settings/members'} }
if members.present? && members.all? {|m| m.valid? }
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'
page << 'hideOnLoad()'
members.each {|member| page.visual_effect(:highlight, "member-#{member.id}") }
}
}
else
format.js {
render(:update) {|page|
errors = members.collect {|m|
m.errors.full_messages
}.flatten.uniq
page.alert(l(:notice_failed_to_save_members, :errors => errors.join(', ')))
}
}
end
end
end
@@ -33,30 +67,34 @@ class MembersController < ApplicationController
if request.post? and @member.update_attributes(params[:member])
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()'
page.visual_effect(:highlight, "member-#{@member.id}")
}
}
end
end
end
def destroy
@member.destroy
respond_to do |format|
if request.post? && @member.deletable?
@member.destroy
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
private
def find_project
@project = Project.find(params[:id])
rescue ActiveRecord::RecordNotFound
render_404
end
def find_member
@member = Member.find(params[:id])
@project = @member.project
rescue ActiveRecord::RecordNotFound
render_404
def autocomplete_for_member
@principals = Principal.active.like(params[:q]).find(:all, :limit => 100) - @project.principals
render :layout => false
end
end

View File

@@ -16,21 +16,37 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class MessagesController < ApplicationController
layout 'base'
menu_item :boards
default_search_scope :messages
before_filter :find_board, :only => [:new, :preview]
before_filter :find_message, :except => [:new, :preview]
before_filter :authorize, :except => :preview
before_filter :authorize, :except => [:preview, :edit, :destroy]
verify :method => :post, :only => [ :reply, :destroy ], :redirect_to => { :action => :show }
verify :xhr => true, :only => :quote
helper :watchers
helper :attachments
include AttachmentsHelper
REPLIES_PER_PAGE = 25 unless const_defined?(:REPLIES_PER_PAGE)
# Show a topic and its replies
def show
@replies = @topic.children
@replies.reverse! if User.current.wants_comments_in_reverse_order?
page = params[:page]
# Find the page of the requested reply
if params[:r] && page.nil?
offset = @topic.children.count(:conditions => ["#{Message.table_name}.id < ?", params[:r].to_i])
page = 1 + offset / REPLIES_PER_PAGE
end
@reply_count = @topic.children.count
@reply_pages = Paginator.new self, @reply_count, REPLIES_PER_PAGE, page
@replies = @topic.children.find(:all, :include => [:author, :attachments, {:board => :project}],
:order => "#{Message.table_name}.created_on ASC",
:limit => @reply_pages.items_per_page,
:offset => @reply_pages.current.offset)
@reply = Message.new(:subject => "RE: #{@message.subject}")
render :action => "show", :layout => false if request.xhr?
end
@@ -45,7 +61,9 @@ class MessagesController < ApplicationController
@message.sticky = params[:message]['sticky']
end
if request.post? && @message.save
attach_files(@message, params[:attachments])
call_hook(:controller_messages_new_after_save, { :params => params, :message => @message})
attachments = Attachment.attach_files(@message, params[:attachments])
render_attachment_warning_if_needed(@message)
redirect_to :action => 'show', :id => @message
end
end
@@ -57,30 +75,53 @@ class MessagesController < ApplicationController
@reply.board = @board
@topic.children << @reply
if !@reply.new_record?
attach_files(@reply, params[:attachments])
call_hook(:controller_messages_reply_after_save, { :params => params, :message => @reply})
attachments = Attachment.attach_files(@reply, params[:attachments])
render_attachment_warning_if_needed(@reply)
end
redirect_to :action => 'show', :id => @topic
redirect_to :action => 'show', :id => @topic, :r => @reply
end
# Edit a message
def edit
if params[:message] && User.current.allowed_to?(:edit_messages, @project)
(render_403; return false) unless @message.editable_by?(User.current)
if params[:message]
@message.locked = params[:message]['locked']
@message.sticky = params[:message]['sticky']
end
if request.post? && @message.update_attributes(params[:message])
attach_files(@message, params[:attachments])
attachments = Attachment.attach_files(@message, params[:attachments])
render_attachment_warning_if_needed(@message)
flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'show', :id => @topic
@message.reload
redirect_to :action => 'show', :board_id => @message.board, :id => @message.root, :r => (@message.parent_id && @message.id)
end
end
# Delete a messages
def destroy
(render_403; return false) unless @message.destroyable_by?(User.current)
@message.destroy
redirect_to @message.parent.nil? ?
{ :controller => 'boards', :action => 'show', :project_id => @project, :id => @board } :
{ :action => 'show', :id => @message.parent }
{ :action => 'show', :id => @message.parent, :r => @message }
end
def quote
user = @message.author
text = @message.content
subject = @message.subject.gsub('"', '\"')
subject = "RE: #{subject}" unless subject.starts_with?('RE:')
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"
render(:update) { |page|
page << "$('reply_subject').value = \"#{subject}\";"
page.<< "$('message_content').value = \"#{content}\";"
page.show 'reply'
page << "Form.Element.focus('message_content');"
page << "Element.scrollTo('reply');"
page << "$('message_content').scrollTop = $('message_content').scrollHeight - $('message_content').clientHeight;"
}
end
def preview

View File

@@ -1,5 +1,5 @@
# redMine - project management software
# Copyright (C) 2006 Jean-Philippe Lang
# Redmine - project management software
# Copyright (C) 2006-2009 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,11 +16,12 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class MyController < ApplicationController
helper :issues
layout 'base'
before_filter :require_login
helper :issues
helper :users
helper :custom_fields
BLOCKS = { 'issuesassignedtome' => :label_assigned_to_me_issues,
'issuesreportedbyme' => :label_reported_issues,
'issueswatched' => :label_watched_issues,
@@ -28,14 +29,13 @@ class MyController < ApplicationController
'calendar' => :label_calendar,
'documents' => :label_document_plural,
'timelog' => :label_spent_time
}.freeze
}.merge(Redmine::Views::MyPage::Block.additional_blocks).freeze
DEFAULT_LAYOUT = { 'left' => ['issuesassignedtome'],
'right' => ['issuesreportedbyme']
}.freeze
verify :xhr => true,
:session => :page_layout,
:only => [:add_block, :remove_block, :order_blocks]
def index
@@ -54,31 +54,28 @@ class MyController < ApplicationController
@user = User.current
@pref = @user.pref
if request.post?
@user.attributes = params[:user]
@user.mail_notification = (params[:notification_option] == 'all')
@user.safe_attributes = params[:user]
@user.pref.attributes = params[:pref]
@user.pref[:no_self_notified] = (params[:no_self_notified] == '1')
if @user.save
@user.pref.save
@user.notified_project_ids = (params[:notification_option] == 'selected' ? params[:notified_project_ids] : [])
@user.notified_project_ids = (@user.mail_notification == 'selected' ? params[:notified_project_ids] : [])
set_language_if_valid @user.language
flash[:notice] = l(:notice_account_updated)
redirect_to :action => 'account'
return
end
end
@notification_options = [[l(:label_user_mail_option_all), 'all'],
[l(:label_user_mail_option_none), 'none']]
# Only users that belong to more than 1 project can select projects for which they are notified
# Note that @user.membership.size would fail since AR ignores :include association option when doing a count
@notification_options.insert 1, [l(:label_user_mail_option_selected), 'selected'] if @user.memberships.length > 1
@notification_option = @user.mail_notification? ? 'all' : (@user.notified_projects_ids.empty? ? 'none' : 'selected')
end
# Manage user's password
def password
@user = User.current
flash[:error] = l(:notice_can_t_change_password) and redirect_to :action => 'account' and return if @user.auth_source_id
unless @user.change_password_allowed?
flash[:error] = l(:notice_can_t_change_password)
redirect_to :action => 'account'
return
end
if request.post?
if @user.check_password?(params[:password])
@user.password, @user.password_confirmation = params[:new_password], params[:new_password_confirmation]
@@ -94,43 +91,65 @@ class MyController < ApplicationController
# Create a new feeds key
def reset_rss_key
if request.post? && User.current.rss_token
User.current.rss_token.destroy
if request.post?
if User.current.rss_token
User.current.rss_token.destroy
User.current.reload
end
User.current.rss_key
flash[:notice] = l(:notice_feeds_access_key_reseted)
end
redirect_to :action => 'account'
end
# Create a new API key
def reset_api_key
if request.post?
if User.current.api_token
User.current.api_token.destroy
User.current.reload
end
User.current.api_key
flash[:notice] = l(:notice_api_access_key_reseted)
end
redirect_to :action => 'account'
end
# User's page layout configuration
def page_layout
@user = User.current
@blocks = @user.pref[:my_page_layout] || DEFAULT_LAYOUT.dup
session[:page_layout] = @blocks
%w(top left right).each {|f| session[:page_layout][f] ||= [] }
@block_options = []
BLOCKS.each {|k, v| @block_options << [l(v), k]}
BLOCKS.each {|k, v| @block_options << [l("my.blocks.#{v}", :default => [v, v.to_s.humanize]), k.dasherize]}
end
# Add a block to user's page
# The block is added on top of the page
# params[:block] : id of the block to add
def add_block
block = params[:block]
render(:nothing => true) and return unless block && (BLOCKS.keys.include? block)
block = params[:block].to_s.underscore
(render :nothing => true; return) unless block && (BLOCKS.keys.include? block)
@user = User.current
layout = @user.pref[:my_page_layout] || {}
# remove if already present in a group
%w(top left right).each {|f| (session[:page_layout][f] ||= []).delete block }
%w(top left right).each {|f| (layout[f] ||= []).delete block }
# add it on top
session[:page_layout]['top'].unshift block
layout['top'].unshift block
@user.pref[:my_page_layout] = layout
@user.pref.save
render :partial => "block", :locals => {:user => @user, :block_name => block}
end
# Remove a block to user's page
# params[:block] : id of the block to remove
def remove_block
block = params[:block]
block = params[:block].to_s.underscore
@user = User.current
# remove block in all groups
%w(top left right).each {|f| (session[:page_layout][f] ||= []).delete block }
layout = @user.pref[:my_page_layout] || {}
%w(top left right).each {|f| (layout[f] ||= []).delete block }
@user.pref[:my_page_layout] = layout
@user.pref.save
render :nothing => true
end
@@ -139,23 +158,20 @@ class MyController < ApplicationController
# params[:list-(top|left|right)] : array of block ids of the group
def order_blocks
group = params[:group]
group_items = params["list-#{group}"]
if group_items and group_items.is_a? Array
# remove group blocks if they are presents in other groups
%w(top left right).each {|f|
session[:page_layout][f] = (session[:page_layout][f] || []) - group_items
}
session[:page_layout][group] = group_items
@user = User.current
if group.is_a?(String)
group_items = (params["list-#{group}"] || []).collect(&:underscore)
if group_items and group_items.is_a? Array
layout = @user.pref[:my_page_layout] || {}
# remove group blocks if they are presents in other groups
%w(top left right).each {|f|
layout[f] = (layout[f] || []) - group_items
}
layout[group] = group_items
@user.pref[:my_page_layout] = layout
@user.pref.save
end
end
render :nothing => true
end
# Save user's page layout
def page_layout_save
@user = User.current
@user.pref[:my_page_layout] = session[:page_layout] if session[:page_layout]
@user.pref.save
session[:page_layout] = nil
redirect_to :action => 'page'
end
end

View File

@@ -16,21 +16,36 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class NewsController < ApplicationController
layout 'base'
before_filter :find_news, :except => [:new, :index, :preview]
before_filter :find_project, :only => :new
before_filter :authorize, :except => [:index, :preview]
default_search_scope :news
model_object News
before_filter :find_model_object, :except => [:new, :create, :index]
before_filter :find_project_from_association, :except => [:new, :create, :index]
before_filter :find_project, :only => [:new, :create]
before_filter :authorize, :except => [:index]
before_filter :find_optional_project, :only => :index
accept_key_auth :index
def index
@news_pages, @newss = paginate :news,
:per_page => 10,
:conditions => (@project ? {:project_id => @project.id} : Project.visible_by(User.current)),
:include => [:author, :project],
:order => "#{News.table_name}.created_on DESC"
case params[:format]
when 'xml', 'json'
@offset, @limit = api_offset_and_limit
else
@limit = 10
end
scope = @project ? @project.news.visible : News.visible
@news_count = scope.count
@news_pages = Paginator.new self, @news_count, @limit, params['page']
@offset ||= @news_pages.current.offset
@newss = scope.all(:include => [:author, :project],
:order => "#{News.table_name}.created_on DESC",
:offset => @offset,
:limit => @limit)
respond_to do |format|
format.html { render :layout => false if request.xhr? }
format.api
format.atom { render_feed(@newss, :title => (@project ? @project.name : Setting.app_title) + ": #{l(:label_news_plural)}") }
end
end
@@ -42,57 +57,39 @@ class NewsController < ApplicationController
def new
@news = News.new(:project => @project, :author => User.current)
end
def create
@news = News.new(:project => @project, :author => User.current)
if request.post?
@news.attributes = params[:news]
if @news.save
flash[:notice] = l(:notice_successful_create)
Mailer.deliver_news_added(@news) if Setting.notified_events.include?('news_added')
redirect_to :controller => 'news', :action => 'index', :project_id => @project
else
render :action => 'new'
end
end
end
def edit
if request.post? and @news.update_attributes(params[:news])
end
def update
if request.put? and @news.update_attributes(params[:news])
flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'show', :id => @news
end
end
def add_comment
@comment = Comment.new(params[:comment])
@comment.author = User.current
if @news.comments << @comment
flash[:notice] = l(:label_comment_added)
redirect_to :action => 'show', :id => @news
else
render :action => 'show'
render :action => 'edit'
end
end
def destroy_comment
@news.comments.find(params[:comment_id]).destroy
redirect_to :action => 'show', :id => @news
end
def destroy
@news.destroy
redirect_to :action => 'index', :project_id => @project
end
def preview
@text = (params[:news] ? params[:news][:description] : nil)
render :partial => 'common/preview'
end
private
def find_news
@news = News.find(params[:id])
@project = @news.project
rescue ActiveRecord::RecordNotFound
render_404
end
def find_project
@project = Project.find(params[:project_id])
rescue ActiveRecord::RecordNotFound

View File

@@ -0,0 +1,33 @@
class PreviewsController < ApplicationController
before_filter :find_project
def issue
@issue = @project.issues.find_by_id(params[:id]) unless params[:id].blank?
if @issue
@attachements = @issue.attachments
@description = params[:issue] && params[:issue][:description]
if @description && @description.gsub(/(\r?\n|\n\r?)/, "\n") == @issue.description.to_s.gsub(/(\r?\n|\n\r?)/, "\n")
@description = nil
end
@notes = params[:notes]
else
@description = (params[:issue] ? params[:issue][:description] : nil)
end
render :layout => false
end
def news
@text = (params[:news] ? params[:news][:description] : nil)
render :partial => 'common/preview'
end
private
def find_project
project_id = (params[:issue] && params[:issue][:project_id]) || params[:project_id]
@project = Project.find(project_id)
rescue ActiveRecord::RecordNotFound
render_404
end
end

View File

@@ -0,0 +1,26 @@
class ProjectEnumerationsController < ApplicationController
before_filter :find_project_by_project_id
before_filter :authorize
def update
if request.put? && params[:enumerations]
Project.transaction do
params[:enumerations].each do |id, activity|
@project.update_or_create_time_entry_activity(id, activity)
end
end
flash[:notice] = l(:notice_successful_update)
end
redirect_to :controller => 'projects', :action => 'settings', :tab => 'activities', :id => @project
end
def destroy
@project.time_entry_activities.each do |time_entry_activity|
time_entry_activity.destroy(time_entry_activity.parent)
end
flash[:notice] = l(:notice_successful_update)
redirect_to :controller => 'projects', :action => 'settings', :tab => 'activities', :id => @project
end
end

View File

@@ -1,5 +1,5 @@
# redMine - project management software
# Copyright (C) 2006-2007 Jean-Philippe Lang
# Redmine - project management software
# Copyright (C) 2006-2009 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,400 +16,234 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class ProjectsController < ApplicationController
layout 'base'
menu_item :overview
menu_item :activity, :only => :activity
menu_item :roadmap, :only => :roadmap
menu_item :files, :only => [:list_files, :add_file]
menu_item :settings, :only => :settings
menu_item :issues, :only => [:changelog]
before_filter :find_project, :except => [ :index, :list, :add, :activity ]
before_filter :find_optional_project, :only => :activity
before_filter :authorize, :except => [ :index, :list, :add, :archive, :unarchive, :destroy, :activity ]
before_filter :require_admin, :only => [ :add, :archive, :unarchive, :destroy ]
accept_key_auth :activity, :calendar
before_filter :find_project, :except => [ :index, :list, :new, :create, :copy ]
before_filter :authorize, :except => [ :index, :list, :new, :create, :copy, :archive, :unarchive, :destroy]
before_filter :authorize_global, :only => [:new, :create]
before_filter :require_admin, :only => [ :copy, :archive, :unarchive, :destroy ]
accept_key_auth :index, :show, :create, :update, :destroy
after_filter :only => [:create, :edit, :update, :archive, :unarchive, :destroy] do |controller|
if controller.request.post?
controller.send :expire_action, :controller => 'welcome', :action => 'robots.txt'
end
end
helper :sort
include SortHelper
helper :custom_fields
include CustomFieldsHelper
helper :ifpdf
include IfpdfHelper
helper :issues
helper IssuesHelper
helper :queries
include QueriesHelper
helper :repositories
include RepositoriesHelper
include ProjectsHelper
def index
list
render :action => 'list' unless request.xhr?
end
# Lists visible projects
def list
projects = Project.find :all,
:conditions => Project.visible_by(User.current),
:include => :parent
@project_tree = projects.group_by {|p| p.parent || p}
@project_tree.each_key {|p| @project_tree[p] -= [p]}
def index
respond_to do |format|
format.html {
@projects = Project.visible.find(:all, :order => 'lft')
}
format.api {
@offset, @limit = api_offset_and_limit
@project_count = Project.visible.count
@projects = Project.visible.all(:offset => @offset, :limit => @limit, :order => 'lft')
}
format.atom {
projects = Project.visible.find(:all, :order => 'created_on DESC',
:limit => Setting.feeds_limit.to_i)
render_feed(projects, :title => "#{Setting.app_title}: #{l(:label_project_latest)}")
}
end
end
# Add a new project
def add
@custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position")
def new
@issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position")
@trackers = Tracker.all
@project = Project.new(params[:project])
end
verify :method => :post, :only => :create, :render => {:nothing => true, :status => :method_not_allowed }
def create
@issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position")
@trackers = Tracker.all
@project = Project.new
@project.safe_attributes = params[:project]
if validate_parent_id && @project.save
@project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
# Add current user as a project member if he is not admin
unless User.current.admin?
r = Role.givable.find_by_id(Setting.new_project_user_role_id.to_i) || Role.givable.first
m = Member.new(:user => User.current, :roles => [r])
@project.members << m
end
respond_to do |format|
format.html {
flash[:notice] = l(:notice_successful_create)
redirect_to :controller => 'projects', :action => 'settings', :id => @project
}
format.api { render :action => 'show', :status => :created, :location => url_for(:controller => 'projects', :action => 'show', :id => @project.id) }
end
else
respond_to do |format|
format.html { render :action => 'new' }
format.api { render_validation_errors(@project) }
end
end
end
def copy
@issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position")
@trackers = Tracker.all
@root_projects = Project.find(:all,
:conditions => "parent_id IS NULL AND status = #{Project::STATUS_ACTIVE}",
:order => 'name')
@project = Project.new(params[:project])
@project.enabled_module_names = Redmine::AccessControl.available_project_modules
@source_project = Project.find(params[:id])
if request.get?
@custom_values = ProjectCustomField.find(:all, :order => "#{CustomField.table_name}.position").collect { |x| CustomValue.new(:custom_field => x, :customized => @project) }
@project.trackers = Tracker.all
@project.is_public = Setting.default_projects_public?
else
@project.custom_fields = CustomField.find(params[:custom_field_ids]) if params[:custom_field_ids]
@custom_values = ProjectCustomField.find(:all, :order => "#{CustomField.table_name}.position").collect { |x| CustomValue.new(:custom_field => x, :customized => @project, :value => (params[:custom_fields] ? params["custom_fields"][x.id.to_s] : nil)) }
@project.custom_values = @custom_values
if @project.save
@project.enabled_module_names = params[:enabled_modules]
flash[:notice] = l(:notice_successful_create)
@project = Project.copy_from(@source_project)
if @project
@project.identifier = Project.next_identifier if Setting.sequential_project_identifiers?
else
redirect_to :controller => 'admin', :action => 'projects'
end
end
end
else
Mailer.with_deliveries(params[:notifications] == '1') do
@project = Project.new
@project.safe_attributes = params[:project]
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 => 'projects', :action => 'settings', :id => @project
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 => 'projects', :action => 'settings', :id => @project
end
end
end
rescue ActiveRecord::RecordNotFound
redirect_to :controller => 'admin', :action => 'projects'
end
# Show @project
def show
@custom_values = @project.custom_values.find(:all, :include => :custom_field, :order => "#{CustomField.table_name}.position")
@members_by_role = @project.members.find(:all, :include => [:user, :role], :order => 'position').group_by {|m| m.role}
@subprojects = @project.active_children
if params[:jump]
# try to redirect to the requested menu item
redirect_to_project_menu_item(@project, params[:jump]) && return
end
@users_by_role = @project.users_by_role
@subprojects = @project.children.visible
@news = @project.news.find(:all, :limit => 5, :include => [ :author, :project ], :order => "#{News.table_name}.created_on DESC")
@trackers = @project.rolled_up_trackers
cond = @project.project_condition(Setting.display_subprojects_issues?)
Issue.visible_by(User.current) do
@open_issues_by_tracker = Issue.count(:group => :tracker,
@open_issues_by_tracker = Issue.visible.count(:group => :tracker,
:include => [:project, :status, :tracker],
:conditions => ["(#{cond}) AND #{IssueStatus.table_name}.is_closed=?", false])
@total_issues_by_tracker = Issue.count(:group => :tracker,
@total_issues_by_tracker = Issue.visible.count(:group => :tracker,
:include => [:project, :status, :tracker],
:conditions => cond)
end
TimeEntry.visible_by(User.current) do
@total_hours = TimeEntry.sum(:hours,
:include => :project,
:conditions => cond).to_f
end
@key = User.current.rss_key
respond_to do |format|
format.html
format.api
end
end
def settings
@root_projects = Project.find(:all,
:conditions => ["parent_id IS NULL AND status = #{Project::STATUS_ACTIVE} AND id <> ?", @project.id],
:order => 'name')
@custom_fields = IssueCustomField.find(:all)
@issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position")
@issue_category ||= IssueCategory.new
@member ||= @project.members.new
@trackers = Tracker.all
@custom_values ||= ProjectCustomField.find(:all, :order => "#{CustomField.table_name}.position").collect { |x| @project.custom_values.find_by_custom_field_id(x.id) || CustomValue.new(:custom_field => x) }
@repository ||= @project.repository
@wiki ||= @project.wiki
end
# Edit @project
def edit
if request.post?
if params[:custom_fields]
@custom_values = ProjectCustomField.find(:all, :order => "#{CustomField.table_name}.position").collect { |x| CustomValue.new(:custom_field => x, :customized => @project, :value => params["custom_fields"][x.id.to_s]) }
@project.custom_values = @custom_values
end
# TODO: convert to PUT only
verify :method => [:post, :put], :only => :update, :render => {:nothing => true, :status => :method_not_allowed }
def update
@project.safe_attributes = params[:project]
if validate_parent_id && @project.save
@project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
respond_to do |format|
format.html {
flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'settings', :id => @project
}
format.api { head :ok }
end
@project.attributes = params[:project]
if @project.save
flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'settings', :id => @project
else
settings
render :action => 'settings'
else
respond_to do |format|
format.html {
settings
render :action => 'settings'
}
format.api { render_validation_errors(@project) }
end
end
end
verify :method => :post, :only => :modules, :render => {:nothing => true, :status => :method_not_allowed }
def modules
@project.enabled_module_names = params[:enabled_modules]
@project.enabled_module_names = params[:enabled_module_names]
flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'settings', :id => @project, :tab => 'modules'
end
def archive
@project.archive if request.post? && @project.active?
redirect_to :controller => 'admin', :action => 'projects'
if request.post?
unless @project.archive
flash[:error] = l(:error_can_not_archive_project)
end
end
redirect_to(url_for(:controller => 'admin', :action => 'projects', :status => params[:status]))
end
def unarchive
@project.unarchive if request.post? && !@project.active?
redirect_to :controller => 'admin', :action => 'projects'
redirect_to(url_for(:controller => 'admin', :action => 'projects', :status => params[:status]))
end
# Delete @project
def destroy
@project_to_destroy = @project
if request.post? and params[:confirm]
@project_to_destroy.destroy
redirect_to :controller => 'admin', :action => 'projects'
if request.get?
# display confirmation view
else
if api_request? || params[:confirm]
@project_to_destroy.destroy
respond_to do |format|
format.html { redirect_to :controller => 'admin', :action => 'projects' }
format.api { head :ok }
end
end
end
# hide project in layout
@project = nil
end
# Add a new issue category to @project
def add_issue_category
@category = @project.issue_categories.build(params[:category])
if request.post? and @category.save
respond_to do |format|
format.html do
flash[:notice] = l(:notice_successful_create)
redirect_to :action => 'settings', :tab => 'categories', :id => @project
end
format.js do
# IE doesn't support the replace_html rjs method for select box options
render(:update) {|page| page.replace "issue_category_id",
content_tag('select', '<option></option>' + options_from_collection_for_select(@project.issue_categories, 'id', 'name', @category.id), :id => 'issue_category_id', :name => 'issue[category_id]')
}
end
end
end
end
# Add a new version to @project
def add_version
@version = @project.versions.build(params[:version])
if request.post? and @version.save
flash[:notice] = l(:notice_successful_create)
redirect_to :action => 'settings', :tab => 'versions', :id => @project
end
end
def add_file
if request.post?
@version = @project.versions.find_by_id(params[:version_id])
attachments = attach_files(@version, params[:attachments])
Mailer.deliver_attachments_added(attachments) if !attachments.empty? && Setting.notified_events.include?('file_added')
redirect_to :controller => 'projects', :action => 'list_files', :id => @project
end
@versions = @project.versions.sort
end
def list_files
@versions = @project.versions.sort.reverse
end
# Show changelog for @project
def changelog
@trackers = @project.trackers.find(:all, :conditions => ["is_in_chlog=?", true], :order => 'position')
retrieve_selected_tracker_ids(@trackers)
@versions = @project.versions.sort
end
def roadmap
@trackers = @project.trackers.find(:all, :conditions => ["is_in_roadmap=?", true])
retrieve_selected_tracker_ids(@trackers)
@versions = @project.versions.sort
@versions = @versions.select {|v| !v.completed? } unless params[:completed]
end
def activity
@days = Setting.activity_days_default.to_i
if params[:from]
begin; @date_to = params[:from].to_date; rescue; end
end
@date_to ||= Date.today + 1
@date_from = @date_to - @days
@event_types = %w(issues news files documents changesets wiki_pages messages)
if @project
@event_types.delete('wiki_pages') unless @project.wiki
@event_types.delete('changesets') unless @project.repository
@event_types.delete('messages') unless @project.boards.any?
# only show what the user is allowed to view
@event_types = @event_types.select {|o| User.current.allowed_to?("view_#{o}".to_sym, @project)}
@with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1')
end
@scope = @event_types.select {|t| params["show_#{t}"]}
# default events if none is specified in parameters
@scope = (@event_types - %w(wiki_pages messages))if @scope.empty?
@events = []
if @scope.include?('issues')
cond = ARCondition.new(Project.allowed_to_condition(User.current, :view_issues, :project => @project, :with_subprojects => @with_subprojects))
cond.add(["#{Issue.table_name}.created_on BETWEEN ? AND ?", @date_from, @date_to])
@events += Issue.find(:all, :include => [:project, :author, :tracker], :conditions => cond.conditions)
cond = ARCondition.new(Project.allowed_to_condition(User.current, :view_issues, :project => @project, :with_subprojects => @with_subprojects))
cond.add(["#{Journal.table_name}.journalized_type = 'Issue' AND #{JournalDetail.table_name}.prop_key = 'status_id' AND #{Journal.table_name}.created_on BETWEEN ? AND ?", @date_from, @date_to])
@events += Journal.find(:all, :include => [{:issue => :project}, :details, :user], :conditions => cond.conditions)
end
if @scope.include?('news')
cond = ARCondition.new(Project.allowed_to_condition(User.current, :view_news, :project => @project, :with_subprojects => @with_subprojects))
cond.add(["#{News.table_name}.created_on BETWEEN ? AND ?", @date_from, @date_to])
@events += News.find(:all, :include => [:project, :author], :conditions => cond.conditions)
end
if @scope.include?('files')
cond = ARCondition.new(Project.allowed_to_condition(User.current, :view_files, :project => @project, :with_subprojects => @with_subprojects))
cond.add(["#{Attachment.table_name}.created_on BETWEEN ? AND ?", @date_from, @date_to])
@events += Attachment.find(:all, :select => "#{Attachment.table_name}.*",
:joins => "LEFT JOIN #{Version.table_name} ON #{Attachment.table_name}.container_type='Version' AND #{Version.table_name}.id = #{Attachment.table_name}.container_id " +
"LEFT JOIN #{Project.table_name} ON #{Version.table_name}.project_id = #{Project.table_name}.id",
:conditions => cond.conditions)
end
if @scope.include?('documents')
cond = ARCondition.new(Project.allowed_to_condition(User.current, :view_documents, :project => @project, :with_subprojects => @with_subprojects))
cond.add(["#{Document.table_name}.created_on BETWEEN ? AND ?", @date_from, @date_to])
@events += Document.find(:all, :include => :project, :conditions => cond.conditions)
cond = ARCondition.new(Project.allowed_to_condition(User.current, :view_documents, :project => @project, :with_subprojects => @with_subprojects))
cond.add(["#{Attachment.table_name}.created_on BETWEEN ? AND ?", @date_from, @date_to])
@events += Attachment.find(:all, :select => "#{Attachment.table_name}.*",
:joins => "LEFT JOIN #{Document.table_name} ON #{Attachment.table_name}.container_type='Document' AND #{Document.table_name}.id = #{Attachment.table_name}.container_id " +
"LEFT JOIN #{Project.table_name} ON #{Document.table_name}.project_id = #{Project.table_name}.id",
:conditions => cond.conditions)
end
if @scope.include?('wiki_pages')
select = "#{WikiContent.versioned_table_name}.updated_on, #{WikiContent.versioned_table_name}.comments, " +
"#{WikiContent.versioned_table_name}.#{WikiContent.version_column}, #{WikiPage.table_name}.title, " +
"#{WikiContent.versioned_table_name}.page_id, #{WikiContent.versioned_table_name}.author_id, " +
"#{WikiContent.versioned_table_name}.id"
joins = "LEFT JOIN #{WikiPage.table_name} ON #{WikiPage.table_name}.id = #{WikiContent.versioned_table_name}.page_id " +
"LEFT JOIN #{Wiki.table_name} ON #{Wiki.table_name}.id = #{WikiPage.table_name}.wiki_id " +
"LEFT JOIN #{Project.table_name} ON #{Project.table_name}.id = #{Wiki.table_name}.project_id"
cond = ARCondition.new(Project.allowed_to_condition(User.current, :view_wiki_pages, :project => @project, :with_subprojects => @with_subprojects))
cond.add(["#{WikiContent.versioned_table_name}.updated_on BETWEEN ? AND ?", @date_from, @date_to])
@events += WikiContent.versioned_class.find(:all, :select => select, :joins => joins, :conditions => cond.conditions)
end
if @scope.include?('changesets')
cond = ARCondition.new(Project.allowed_to_condition(User.current, :view_changesets, :project => @project, :with_subprojects => @with_subprojects))
cond.add(["#{Changeset.table_name}.committed_on BETWEEN ? AND ?", @date_from, @date_to])
@events += Changeset.find(:all, :include => {:repository => :project}, :conditions => cond.conditions)
end
if @scope.include?('messages')
cond = ARCondition.new(Project.allowed_to_condition(User.current, :view_messages, :project => @project, :with_subprojects => @with_subprojects))
cond.add(["#{Message.table_name}.created_on BETWEEN ? AND ?", @date_from, @date_to])
@events += Message.find(:all, :include => [{:board => :project}, :author], :conditions => cond.conditions)
end
@events_by_day = @events.group_by(&:event_date)
respond_to do |format|
format.html { render :layout => false if request.xhr? }
format.atom { render_feed(@events, :title => "#{@project || Setting.app_title}: #{l(:label_activity)}") }
end
end
def calendar
@trackers = @project.rolled_up_trackers
retrieve_selected_tracker_ids(@trackers)
if params[:year] and params[:year].to_i > 1900
@year = params[:year].to_i
if params[:month] and params[:month].to_i > 0 and params[:month].to_i < 13
@month = params[:month].to_i
end
end
@year ||= Date.today.year
@month ||= Date.today.month
@calendar = Redmine::Helpers::Calendar.new(Date.civil(@year, @month, 1), current_language, :month)
@with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1')
events = []
@project.issues_with_subprojects(@with_subprojects) do
events += Issue.find(:all,
:include => [:tracker, :status, :assigned_to, :priority, :project],
:conditions => ["((start_date BETWEEN ? AND ?) OR (due_date BETWEEN ? AND ?)) AND #{Issue.table_name}.tracker_id IN (#{@selected_tracker_ids.join(',')})", @calendar.startdt, @calendar.enddt, @calendar.startdt, @calendar.enddt]
) unless @selected_tracker_ids.empty?
end
events += @project.versions.find(:all, :conditions => ["effective_date BETWEEN ? AND ?", @calendar.startdt, @calendar.enddt])
@calendar.events = events
render :layout => false if request.xhr?
end
def gantt
@trackers = @project.rolled_up_trackers
retrieve_selected_tracker_ids(@trackers)
if params[:year] and params[:year].to_i >0
@year_from = params[:year].to_i
if params[:month] and params[:month].to_i >=1 and params[:month].to_i <= 12
@month_from = params[:month].to_i
else
@month_from = 1
end
else
@month_from ||= Date.today.month
@year_from ||= Date.today.year
end
zoom = (params[:zoom] || User.current.pref[:gantt_zoom]).to_i
@zoom = (zoom > 0 && zoom < 5) ? zoom : 2
months = (params[:months] || User.current.pref[:gantt_months]).to_i
@months = (months > 0 && months < 25) ? months : 6
# Save gantt paramters as user preference (zoom and months count)
if (User.current.logged? && (@zoom != User.current.pref[:gantt_zoom] || @months != User.current.pref[:gantt_months]))
User.current.pref[:gantt_zoom], User.current.pref[:gantt_months] = @zoom, @months
User.current.preference.save
end
@date_from = Date.civil(@year_from, @month_from, 1)
@date_to = (@date_from >> @months) - 1
@with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1')
@events = []
@project.issues_with_subprojects(@with_subprojects) do
@events += Issue.find(:all,
:order => "start_date, due_date",
:include => [:tracker, :status, :assigned_to, :priority, :project],
:conditions => ["(((start_date>=? and start_date<=?) or (due_date>=? and due_date<=?) or (start_date<? and due_date>?)) and start_date is not null and due_date is not null and #{Issue.table_name}.tracker_id in (#{@selected_tracker_ids.join(',')}))", @date_from, @date_to, @date_from, @date_to, @date_from, @date_to]
) unless @selected_tracker_ids.empty?
end
@events += @project.versions.find(:all, :conditions => ["effective_date BETWEEN ? AND ?", @date_from, @date_to])
@events.sort! {|x,y| x.start_date <=> y.start_date }
if params[:format]=='pdf'
@options_for_rfpdf ||= {}
@options_for_rfpdf[:file_name] = "#{@project.identifier}-gantt.pdf"
render :template => "projects/gantt.rfpdf", :layout => false
elsif params[:format]=='png' && respond_to?('gantt_image')
image = gantt_image(@events, @date_from, @months, @zoom)
image.format = 'PNG'
send_data(image.to_blob, :disposition => 'inline', :type => 'image/png', :filename => "#{@project.identifier}-gantt.png")
else
render :template => "projects/gantt.rhtml"
end
end
private
# Find project of id params[:id]
# if not found, redirect to project list
# Used as a before_filter
def find_project
@project = Project.find(params[:id])
rescue ActiveRecord::RecordNotFound
render_404
end
def find_optional_project
return true unless params[:id]
@project = Project.find(params[:id])
@@ -418,11 +252,18 @@ private
render_404
end
def retrieve_selected_tracker_ids(selectable_trackers)
if ids = params[:tracker_ids]
@selected_tracker_ids = (ids.is_a? Array) ? ids.collect { |id| id.to_i.to_s } : ids.split('/').collect { |id| id.to_i.to_s }
else
@selected_tracker_ids = selectable_trackers.collect {|t| t.id.to_s }
# Validates parent_id param according to user's permissions
# TODO: move it to Project model in a validation that depends on User.current
def validate_parent_id
return true if User.current.admin?
parent_id = params[:project] && params[:project][:parent_id]
if parent_id || @project.new_record?
parent = parent_id.blank? ? nil : Project.find_by_id(parent_id.to_i)
unless @project.allowed_parents.include?(parent)
@project.errors.add :parent_id, :invalid
return false
end
end
true
end
end

View File

@@ -16,26 +16,19 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class QueriesController < ApplicationController
layout 'base'
menu_item :issues
before_filter :find_project, :authorize
def index
@queries = @project.queries.find(:all,
:order => "name ASC",
:conditions => ["is_public = ? or user_id = ?", true, (User.current.logged? ? User.current.id : 0)])
end
before_filter :find_query, :except => :new
before_filter :find_optional_project, :only => :new
def new
@query = Query.new(params[:query])
@query.project = @project
@query.project = params[:query_is_for_all] ? nil : @project
@query.user = User.current
@query.is_public = false unless current_role.allowed_to?(:manage_public_queries)
@query.is_public = false unless User.current.allowed_to?(:manage_public_queries, @project) || User.current.admin?
@query.column_names = nil if params[:default_columns]
params[:fields].each do |field|
@query.add_filter(field, params[:operators][field], params[:values][field])
end if params[:fields]
@query.add_filters(params[:fields], params[:operators], params[:values]) if params[:fields]
@query.group_by ||= params[:group_by]
if request.post? && params[:confirm] && @query.save
flash[:notice] = l(:notice_successful_create)
@@ -48,11 +41,10 @@ class QueriesController < ApplicationController
def edit
if request.post?
@query.filters = {}
params[:fields].each do |field|
@query.add_filter(field, params[:operators][field], params[:values][field])
end if params[:fields]
@query.add_filters(params[:fields], params[:operators], params[:values]) if params[:fields]
@query.attributes = params[:query]
@query.is_public = false unless current_role.allowed_to?(:manage_public_queries)
@query.project = nil if params[:query_is_for_all]
@query.is_public = false unless User.current.allowed_to?(:manage_public_queries, @project) || User.current.admin?
@query.column_names = nil if params[:default_columns]
if @query.save
@@ -64,18 +56,21 @@ class QueriesController < ApplicationController
def destroy
@query.destroy if request.post?
redirect_to :controller => 'queries', :project_id => @project
redirect_to :controller => 'issues', :action => 'index', :project_id => @project, :set_filter => 1
end
private
def find_project
if params[:id]
@query = Query.find(params[:id])
@project = @query.project
render_403 unless @query.editable_by?(User.current)
else
@project = Project.find(params[:project_id])
end
def find_query
@query = Query.find(params[:id])
@project = @query.project
render_403 unless @query.editable_by?(User.current)
rescue ActiveRecord::RecordNotFound
render_404
end
def find_optional_project
@project = Project.find(params[:project_id]) if params[:project_id]
render_403 unless User.current.allowed_to?(:save_queries, @project, :global => true)
rescue ActiveRecord::RecordNotFound
render_404
end

View File

@@ -16,222 +16,80 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class ReportsController < ApplicationController
layout 'base'
menu_item :issues
before_filter :find_project, :authorize
before_filter :find_project, :authorize, :find_issue_statuses
def issue_report
@statuses = IssueStatus.find(:all, :order => 'position')
@trackers = @project.trackers
@versions = @project.shared_versions.sort
@priorities = IssuePriority.all
@categories = @project.issue_categories
@assignees = @project.members.collect { |m| m.user }.sort
@authors = @project.members.collect { |m| m.user }.sort
@subprojects = @project.descendants.visible
@issues_by_tracker = Issue.by_tracker(@project)
@issues_by_version = Issue.by_version(@project)
@issues_by_priority = Issue.by_priority(@project)
@issues_by_category = Issue.by_category(@project)
@issues_by_assigned_to = Issue.by_assigned_to(@project)
@issues_by_author = Issue.by_author(@project)
@issues_by_subproject = Issue.by_subproject(@project) || []
render :template => "reports/issue_report"
end
def issue_report_details
case params[:detail]
when "tracker"
@field = "tracker_id"
@rows = @project.trackers
@data = issues_by_tracker
@data = Issue.by_tracker(@project)
@report_title = l(:field_tracker)
render :template => "reports/issue_report_details"
when "version"
@field = "fixed_version_id"
@rows = @project.versions.sort
@data = issues_by_version
@rows = @project.shared_versions.sort
@data = Issue.by_version(@project)
@report_title = l(:field_version)
render :template => "reports/issue_report_details"
when "priority"
@field = "priority_id"
@rows = Enumeration::get_values('IPRI')
@data = issues_by_priority
@rows = IssuePriority.all
@data = Issue.by_priority(@project)
@report_title = l(:field_priority)
render :template => "reports/issue_report_details"
when "category"
@field = "category_id"
@rows = @project.issue_categories
@data = issues_by_category
@data = Issue.by_category(@project)
@report_title = l(:field_category)
render :template => "reports/issue_report_details"
when "assigned_to"
@field = "assigned_to_id"
@rows = @project.members.collect { |m| m.user }
@data = issues_by_assigned_to
@rows = @project.members.collect { |m| m.user }.sort
@data = Issue.by_assigned_to(@project)
@report_title = l(:field_assigned_to)
render :template => "reports/issue_report_details"
when "author"
@field = "author_id"
@rows = @project.members.collect { |m| m.user }
@data = issues_by_author
@rows = @project.members.collect { |m| m.user }.sort
@data = Issue.by_author(@project)
@report_title = l(:field_author)
render :template => "reports/issue_report_details"
when "subproject"
@field = "project_id"
@rows = @project.active_children
@data = issues_by_subproject
@rows = @project.descendants.visible
@data = Issue.by_subproject(@project) || []
@report_title = l(:field_subproject)
render :template => "reports/issue_report_details"
else
@trackers = @project.trackers
@versions = @project.versions.sort
@priorities = Enumeration::get_values('IPRI')
@categories = @project.issue_categories
@assignees = @project.members.collect { |m| m.user }
@authors = @project.members.collect { |m| m.user }
@subprojects = @project.active_children
issues_by_tracker
issues_by_version
issues_by_priority
issues_by_category
issues_by_assigned_to
issues_by_author
issues_by_subproject
render :template => "reports/issue_report"
end
end
def delays
@trackers = Tracker.find(:all)
if request.get?
@selected_tracker_ids = @trackers.collect {|t| t.id.to_s }
else
@selected_tracker_ids = params[:tracker_ids].collect { |id| id.to_i.to_s } if params[:tracker_ids] and params[:tracker_ids].is_a? Array
respond_to do |format|
if @field
format.html {}
else
format.html { redirect_to :action => 'issue_report', :id => @project }
end
end
@selected_tracker_ids ||= []
@raw =
ActiveRecord::Base.connection.select_all("SELECT datediff( a.created_on, b.created_on ) as delay, count(a.id) as total
FROM issue_histories a, issue_histories b, issues i
WHERE a.status_id =5
AND a.issue_id = b.issue_id
AND a.issue_id = i.id
AND i.tracker_id in (#{@selected_tracker_ids.join(',')})
AND b.id = (
SELECT min( c.id )
FROM issue_histories c
WHERE b.issue_id = c.issue_id )
GROUP BY delay") unless @selected_tracker_ids.empty?
@raw ||=[]
@x_from = 0
@x_to = 0
@y_from = 0
@y_to = 0
@sum_total = 0
@sum_delay = 0
@raw.each do |r|
@x_to = [r['delay'].to_i, @x_to].max
@y_to = [r['total'].to_i, @y_to].max
@sum_total = @sum_total + r['total'].to_i
@sum_delay = @sum_delay + r['total'].to_i * r['delay'].to_i
end
end
private
# Find project of id params[:id]
def find_project
@project = Project.find(params[:id])
rescue ActiveRecord::RecordNotFound
render_404
end
def issues_by_tracker
@issues_by_tracker ||=
ActiveRecord::Base.connection.select_all("select s.id as status_id,
s.is_closed as closed,
t.id as tracker_id,
count(i.id) as total
from
#{Issue.table_name} i, #{IssueStatus.table_name} s, #{Tracker.table_name} t
where
i.status_id=s.id
and i.tracker_id=t.id
and i.project_id=#{@project.id}
group by s.id, s.is_closed, t.id")
end
private
def issues_by_version
@issues_by_version ||=
ActiveRecord::Base.connection.select_all("select s.id as status_id,
s.is_closed as closed,
v.id as fixed_version_id,
count(i.id) as total
from
#{Issue.table_name} i, #{IssueStatus.table_name} s, #{Version.table_name} v
where
i.status_id=s.id
and i.fixed_version_id=v.id
and i.project_id=#{@project.id}
group by s.id, s.is_closed, v.id")
end
def issues_by_priority
@issues_by_priority ||=
ActiveRecord::Base.connection.select_all("select s.id as status_id,
s.is_closed as closed,
p.id as priority_id,
count(i.id) as total
from
#{Issue.table_name} i, #{IssueStatus.table_name} s, #{Enumeration.table_name} p
where
i.status_id=s.id
and i.priority_id=p.id
and i.project_id=#{@project.id}
group by s.id, s.is_closed, p.id")
end
def issues_by_category
@issues_by_category ||=
ActiveRecord::Base.connection.select_all("select s.id as status_id,
s.is_closed as closed,
c.id as category_id,
count(i.id) as total
from
#{Issue.table_name} i, #{IssueStatus.table_name} s, #{IssueCategory.table_name} c
where
i.status_id=s.id
and i.category_id=c.id
and i.project_id=#{@project.id}
group by s.id, s.is_closed, c.id")
end
def issues_by_assigned_to
@issues_by_assigned_to ||=
ActiveRecord::Base.connection.select_all("select s.id as status_id,
s.is_closed as closed,
a.id as assigned_to_id,
count(i.id) as total
from
#{Issue.table_name} i, #{IssueStatus.table_name} s, #{User.table_name} a
where
i.status_id=s.id
and i.assigned_to_id=a.id
and i.project_id=#{@project.id}
group by s.id, s.is_closed, a.id")
end
def issues_by_author
@issues_by_author ||=
ActiveRecord::Base.connection.select_all("select s.id as status_id,
s.is_closed as closed,
a.id as author_id,
count(i.id) as total
from
#{Issue.table_name} i, #{IssueStatus.table_name} s, #{User.table_name} a
where
i.status_id=s.id
and i.author_id=a.id
and i.project_id=#{@project.id}
group by s.id, s.is_closed, a.id")
end
def issues_by_subproject
@issues_by_subproject ||=
ActiveRecord::Base.connection.select_all("select s.id as status_id,
s.is_closed as closed,
i.project_id as project_id,
count(i.id) as total
from
#{Issue.table_name} i, #{IssueStatus.table_name} s
where
i.status_id=s.id
and i.project_id IN (#{@project.active_children.collect{|p| p.id}.join(',')})
group by s.id, s.is_closed, i.project_id") if @project.active_children.any?
@issues_by_subproject ||= []
def find_issue_statuses
@statuses = IssueStatus.find(:all, :order => 'position')
end
end

View File

@@ -1,5 +1,5 @@
# redMine - project management software
# Copyright (C) 2006-2007 Jean-Philippe Lang
# Redmine - project management software
# Copyright (C) 2006-2009 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
@@ -19,28 +19,53 @@ require 'SVG/Graph/Bar'
require 'SVG/Graph/BarHorizontal'
require 'digest/sha1'
class ChangesetNotFound < Exception
end
class ChangesetNotFound < Exception; end
class InvalidRevisionParam < Exception; end
class RepositoriesController < ApplicationController
layout 'base'
menu_item :repository
menu_item :settings, :only => :edit
default_search_scope :changesets
before_filter :find_repository, :except => :edit
before_filter :find_project, :only => :edit
before_filter :authorize
accept_key_auth :revisions
rescue_from Redmine::Scm::Adapters::CommandFailed, :with => :show_error_command_failed
def edit
@repository = @project.repository
if !@repository
@repository = Repository.factory(params[:repository_scm])
@repository.project = @project
@repository.project = @project if @repository
end
if request.post?
if request.post? && @repository
@repository.attributes = params[:repository]
@repository.save
end
render(:update) {|page| page.replace_html "tab-content-repository", :partial => 'projects/settings/repository'}
render(:update) do |page|
page.replace_html "tab-content-repository", :partial => 'projects/settings/repository'
if @repository && !@project.repository
@project.reload #needed to reload association
page.replace_html "main-menu", render_main_menu(@project)
end
end
end
def committers
@committers = @repository.committers
@users = @project.users
additional_user_ids = @committers.collect(&:last).collect(&:to_i) - @users.collect(&:id)
@users += User.find_all_by_id(additional_user_ids) unless additional_user_ids.empty?
@users.compact!
@users.sort!
if request.post? && params[:committers].is_a?(Hash)
# Build a hash with repository usernames as keys and corresponding user ids as values
@repository.committer_ids = params[:committers].values.inject({}) {|h, c| h[c.first] = c.last; h}
flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'committers', :id => @project
end
end
def destroy
@@ -48,35 +73,27 @@ class RepositoriesController < ApplicationController
redirect_to :controller => 'projects', :action => 'settings', :id => @project, :tab => 'repository'
end
def show
# check if new revisions have been committed in the repository
@repository.fetch_changesets if Setting.autofetch_changesets?
# get entries for the browse frame
@entries = @repository.entries('')
# latest changesets
@changesets = @repository.changesets.find(:all, :limit => 10, :order => "committed_on DESC")
show_error_not_found unless @entries || @changesets.any?
rescue Redmine::Scm::Adapters::CommandFailed => e
show_error_command_failed(e.message)
end
def browse
def show
@repository.fetch_changesets if Setting.autofetch_changesets? && @path.empty?
@entries = @repository.entries(@path, @rev)
if request.xhr?
@entries ? render(:partial => 'dir_list_content') : render(:nothing => true)
else
show_error_not_found unless @entries
(show_error_not_found; return) unless @entries
@changesets = @repository.latest_changesets(@path, @rev)
@properties = @repository.properties(@path, @rev)
render :action => 'show'
end
rescue Redmine::Scm::Adapters::CommandFailed => e
show_error_command_failed(e.message)
end
alias_method :browse, :show
def changes
@entry = @repository.scm.entry(@path, @rev)
show_error_not_found and return unless @entry
@changesets = @repository.changesets_for_path(@path)
rescue Redmine::Scm::Adapters::CommandFailed => e
show_error_command_failed(e.message)
@entry = @repository.entry(@path, @rev)
(show_error_not_found; return) unless @entry
@changesets = @repository.latest_changesets(@path, @rev, Setting.repository_log_display_limit.to_i)
@properties = @repository.properties(@path, @rev)
end
def revisions
@@ -86,7 +103,8 @@ class RepositoriesController < ApplicationController
params['page']
@changesets = @repository.changesets.find(:all,
:limit => @changeset_pages.items_per_page,
:offset => @changeset_pages.current.offset)
:offset => @changeset_pages.current.offset,
:include => [:user, :repository])
respond_to do |format|
format.html { render :layout => false if request.xhr? }
@@ -95,34 +113,35 @@ class RepositoriesController < ApplicationController
end
def entry
@content = @repository.scm.cat(@path, @rev)
show_error_not_found and return unless @content
if 'raw' == params[:format] || @content.is_binary_data?
# Force the download if it's a binary file
send_data @content, :filename => @path.split('/').last
@entry = @repository.entry(@path, @rev)
(show_error_not_found; return) unless @entry
# If the entry is a dir, show the browser
(show; return) if @entry.is_dir?
@content = @repository.cat(@path, @rev)
(show_error_not_found; return) unless @content
if 'raw' == params[:format] || @content.is_binary_data? || (@entry.size && @entry.size > Setting.file_max_size_displayed.to_i.kilobyte)
# Force the download
send_data @content, :filename => filename_for_content_disposition(@path.split('/').last)
else
# Prevent empty lines when displaying a file with Windows style eol
@content.gsub!("\r\n", "\n")
end
rescue Redmine::Scm::Adapters::CommandFailed => e
show_error_command_failed(e.message)
end
end
def annotate
@entry = @repository.entry(@path, @rev)
(show_error_not_found; return) unless @entry
@annotate = @repository.scm.annotate(@path, @rev)
render_error l(:error_scm_annotate) and return if @annotate.nil? || @annotate.empty?
rescue Redmine::Scm::Adapters::CommandFailed => e
show_error_command_failed(e.message)
(render_error l(:error_scm_annotate); return) if @annotate.nil? || @annotate.empty?
end
def revision
@changeset = @repository.changesets.find_by_revision(@rev)
raise ChangesetNotFound if @rev.nil? || @rev.empty?
@changeset = @repository.find_changeset_by_name(@rev)
raise ChangesetNotFound unless @changeset
@changes_count = @changeset.changes.size
@changes_pages = Paginator.new self, @changes_count, 150, params['page']
@changes = @changeset.changes.find(:all,
:limit => @changes_pages.items_per_page,
:offset => @changes_pages.current.offset)
respond_to do |format|
format.html
@@ -130,28 +149,36 @@ class RepositoriesController < ApplicationController
end
rescue ChangesetNotFound
show_error_not_found
rescue Redmine::Scm::Adapters::CommandFailed => e
show_error_command_failed(e.message)
end
def diff
@rev_to = params[:rev_to]
@diff_type = params[:type] || User.current.pref[:diff_type] || 'inline'
@diff_type = 'inline' unless %w(inline sbs).include?(@diff_type)
# Save diff type as user preference
if User.current.logged? && @diff_type != User.current.pref[:diff_type]
User.current.pref[:diff_type] = @diff_type
User.current.preference.save
if params[:format] == 'diff'
@diff = @repository.diff(@path, @rev, @rev_to)
(show_error_not_found; return) unless @diff
filename = "changeset_r#{@rev}"
filename << "_r#{@rev_to}" if @rev_to
send_data @diff.join, :filename => "#{filename}.diff",
:type => 'text/x-patch',
:disposition => 'attachment'
else
@diff_type = params[:type] || User.current.pref[:diff_type] || 'inline'
@diff_type = 'inline' unless %w(inline sbs).include?(@diff_type)
# Save diff type as user preference
if User.current.logged? && @diff_type != User.current.pref[:diff_type]
User.current.pref[:diff_type] = @diff_type
User.current.preference.save
end
@cache_key = "repositories/diff/#{@repository.id}/" + Digest::MD5.hexdigest("#{@path}-#{@rev}-#{@rev_to}-#{@diff_type}")
unless read_fragment(@cache_key)
@diff = @repository.diff(@path, @rev, @rev_to)
show_error_not_found unless @diff
end
@changeset = @repository.find_changeset_by_name(@rev)
@changeset_to = @rev_to ? @repository.find_changeset_by_name(@rev_to) : nil
end
@cache_key = "repositories/diff/#{@repository.id}/" + Digest::MD5.hexdigest("#{@path}-#{@rev}-#{@rev_to}-#{@diff_type}")
unless read_fragment(@cache_key)
@diff = @repository.diff(@path, @rev, @rev_to, @diff_type)
show_error_not_found unless @diff
end
rescue Redmine::Scm::Adapters::CommandFailed => e
show_error_command_failed(e.message)
end
def stats
@@ -173,30 +200,37 @@ class RepositoriesController < ApplicationController
end
end
private
def find_project
@project = Project.find(params[:id])
rescue ActiveRecord::RecordNotFound
render_404
end
private
REV_PARAM_RE = %r{\A[a-f0-9]*\Z}i
def find_repository
@project = Project.find(params[:id])
@repository = @project.repository
render_404 and return false unless @repository
(render_404; return false) unless @repository
@path = params[:path].join('/') unless params[:path].nil?
@path ||= ''
@rev = params[:rev]
@rev = params[:rev].blank? ? @repository.default_branch : params[:rev].strip
@rev_to = params[:rev_to]
unless @rev.to_s.match(REV_PARAM_RE) && @rev_to.to_s.match(REV_PARAM_RE)
if @repository.branches.blank?
raise InvalidRevisionParam
end
end
rescue ActiveRecord::RecordNotFound
render_404
rescue InvalidRevisionParam
show_error_not_found
end
def show_error_not_found
render_error l(:error_scm_not_found)
render_error :message => l(:error_scm_not_found), :status => 404
end
def show_error_command_failed(msg)
render_error l(:error_scm_command_failed, msg)
# Handler for Redmine::Scm::Adapters::CommandFailed exception
def show_error_command_failed(exception)
render_error l(:error_scm_command_failed, exception.message)
end
def graph_commits_per_month(repository)
@@ -212,12 +246,11 @@ private
changes_by_day.each {|c| changes_by_month[c.first.to_date.months_ago] += c.last }
fields = []
month_names = l(:actionview_datehelper_select_month_names_abbr).split(',')
12.times {|m| fields << month_names[((Date.today.month - 1 - m) % 12)]}
12.times {|m| fields << month_name(((Date.today.month - 1 - m) % 12) + 1)}
graph = SVG::Graph::Bar.new(
:height => 300,
:width => 500,
:width => 800,
:fields => fields.reverse,
:stack => :side,
:scale_integers => true,
@@ -242,7 +275,7 @@ private
def graph_commits_per_author(repository)
commits_by_author = repository.changesets.count(:all, :group => :committer)
commits_by_author.sort! {|x, y| x.last <=> y.last}
commits_by_author.to_a.sort! {|x, y| x.last <=> y.last}
changes_by_author = repository.changes.count(:all, :group => :committer)
h = changes_by_author.inject({}) {|o, i| o[i.first] = i.last; o}
@@ -255,9 +288,12 @@ private
commits_data = commits_data + [0]*(10 - commits_data.length) if commits_data.length<10
changes_data = changes_data + [0]*(10 - changes_data.length) if changes_data.length<10
# Remove email adress in usernames
fields = fields.collect {|c| c.gsub(%r{<.+@.+>}, '') }
graph = SVG::Graph::BarHorizontal.new(
:height => 300,
:width => 500,
:height => 400,
:width => 800,
:fields => fields,
:stack => :side,
:scale_integers => true,

View File

@@ -16,20 +16,16 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class RolesController < ApplicationController
layout 'base'
layout 'admin'
before_filter :require_admin
verify :method => :post, :only => [ :destroy, :move ],
:redirect_to => { :action => :list }
:redirect_to => { :action => :index }
def index
list
render :action => 'list' unless request.xhr?
end
def list
@role_pages, @roles = paginate :roles, :per_page => 25, :order => 'builtin, position'
render :action => "list", :layout => false if request.xhr?
render :action => "index", :layout => false if request.xhr?
end
def new
@@ -41,64 +37,30 @@ class RolesController < ApplicationController
@role.workflows.copy(copy_from)
end
flash[:notice] = l(:notice_successful_create)
redirect_to :action => 'list'
redirect_to :action => 'index'
else
@permissions = @role.setable_permissions
@roles = Role.find :all, :order => 'builtin, position'
end
@permissions = @role.setable_permissions
@roles = Role.find :all, :order => 'builtin, position'
end
def edit
@role = Role.find(params[:id])
if request.post? and @role.update_attributes(params[:role])
flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'list'
redirect_to :action => 'index'
else
@permissions = @role.setable_permissions
end
@permissions = @role.setable_permissions
end
def destroy
@role = Role.find(params[:id])
@role.destroy
redirect_to :action => 'list'
rescue
flash[:error] = 'This role is in use and can not be deleted.'
redirect_to :action => 'index'
end
def move
@role = Role.find(params[:id])
case params[:position]
when 'highest'
@role.move_to_top
when 'higher'
@role.move_higher
when 'lower'
@role.move_lower
when 'lowest'
@role.move_to_bottom
end if params[:position]
redirect_to :action => 'list'
end
def workflow
@role = Role.find_by_id(params[:role_id])
@tracker = Tracker.find_by_id(params[:tracker_id])
if request.post?
Workflow.destroy_all( ["role_id=? and tracker_id=?", @role.id, @tracker.id])
(params[:issue_status] || []).each { |old, news|
news.each { |new|
@role.workflows.build(:tracker_id => @tracker.id, :old_status_id => old, :new_status_id => new)
}
}
if @role.save
flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'workflow', :role_id => @role, :tracker_id => @tracker
end
end
@roles = Role.find(:all, :order => 'builtin, position')
@trackers = Tracker.find(:all, :order => 'position')
@statuses = IssueStatus.find(:all, :order => 'position')
rescue
flash[:error] = l(:error_can_not_remove_role)
redirect_to :action => 'index'
end
def report
@@ -110,7 +72,7 @@ class RolesController < ApplicationController
role.save
end
flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'list'
redirect_to :action => 'index'
end
end
end

View File

@@ -16,8 +16,6 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class SearchController < ApplicationController
layout 'base'
before_filter :find_optional_project
helper :messages
@@ -29,70 +27,75 @@ class SearchController < ApplicationController
@all_words = params[:all_words] || (params[:submit] ? false : true)
@titles_only = !params[:titles_only].nil?
projects_to_search =
case params[:scope]
when 'all'
nil
when 'my_projects'
User.current.memberships.collect(&:project)
when 'subprojects'
@project ? (@project.self_and_descendants.active) : nil
else
@project
end
offset = nil
begin; offset = params[:offset].to_time if params[:offset]; rescue; end
# quick jump to an issue
if @question.match(/^#?(\d+)$/) && Issue.find_by_id($1, :include => :project, :conditions => Project.visible_by(User.current))
if @question.match(/^#?(\d+)$/) && Issue.visible.find_by_id($1.to_i)
redirect_to :controller => "issues", :action => "show", :id => $1
return
end
if @project
@object_types = Redmine::Search.available_search_types.dup
if projects_to_search.is_a? Project
# don't search projects
@object_types.delete('projects')
# only show what the user is allowed to view
@object_types = %w(issues news documents changesets wiki_pages messages)
@object_types = @object_types.select {|o| User.current.allowed_to?("view_#{o}".to_sym, @project)}
@scope = @object_types.select {|t| params[t]}
@scope = @object_types if @scope.empty?
else
@object_types = @scope = %w(projects)
@object_types = @object_types.select {|o| User.current.allowed_to?("view_#{o}".to_sym, projects_to_search)}
end
@scope = @object_types.select {|t| params[t]}
@scope = @object_types if @scope.empty?
# extract tokens from the question
# eg. hello "bye bye" => ["hello", "bye bye"]
@tokens = @question.scan(%r{((\s|^)"[\s\w]+"(\s|$)|\S+)}).collect {|m| m.first.gsub(%r{(^\s*"\s*|\s*"\s*$)}, '')}
# tokens must be at least 3 character long
@tokens = @tokens.uniq.select {|w| w.length > 2 }
# tokens must be at least 2 characters long
@tokens = @tokens.uniq.select {|w| w.length > 1 }
if !@tokens.empty?
# no more than 5 tokens to search for
@tokens.slice! 5..-1 if @tokens.size > 5
# strings used in sql like statement
like_tokens = @tokens.collect {|w| "%#{w.downcase}%"}
@tokens.slice! 5..-1 if @tokens.size > 5
@results = []
@results_by_type = Hash.new {|h,k| h[k] = 0}
limit = 10
if @project
@scope.each do |s|
@results += s.singularize.camelcase.constantize.search(like_tokens, @project,
:all_words => @all_words,
:titles_only => @titles_only,
:limit => (limit+1),
:offset => offset,
:before => params[:previous].nil?)
end
@results = @results.sort {|a,b| b.event_datetime <=> a.event_datetime}
if params[:previous].nil?
@pagination_previous_date = @results[0].event_datetime if offset && @results[0]
if @results.size > limit
@pagination_next_date = @results[limit-1].event_datetime
@results = @results[0, limit]
end
else
@pagination_next_date = @results[-1].event_datetime if offset && @results[-1]
if @results.size > limit
@pagination_previous_date = @results[-(limit)].event_datetime
@results = @results[-(limit), limit]
end
@scope.each do |s|
r, c = s.singularize.camelcase.constantize.search(@tokens, projects_to_search,
:all_words => @all_words,
:titles_only => @titles_only,
:limit => (limit+1),
:offset => offset,
:before => params[:previous].nil?)
@results += r
@results_by_type[s] += c
end
@results = @results.sort {|a,b| b.event_datetime <=> a.event_datetime}
if params[:previous].nil?
@pagination_previous_date = @results[0].event_datetime if offset && @results[0]
if @results.size > limit
@pagination_next_date = @results[limit-1].event_datetime
@results = @results[0, limit]
end
else
operator = @all_words ? ' AND ' : ' OR '
@results += Project.find(:all,
:limit => limit,
:conditions => [ (["(#{Project.visible_by(User.current)}) AND (LOWER(name) like ? OR LOWER(description) like ?)"] * like_tokens.size).join(operator), * (like_tokens * 2).sort]
) if @scope.include? 'projects'
# if only one project is found, user is redirected to its overview
redirect_to :controller => 'projects', :action => 'show', :id => @results.first and return if @results.size == 1
@pagination_next_date = @results[-1].event_datetime if offset && @results[-1]
if @results.size > limit
@pagination_previous_date = @results[-(limit)].event_datetime
@results = @results[-(limit), limit]
end
end
else
@question = ""

View File

@@ -5,27 +5,28 @@
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class SettingsController < ApplicationController
layout 'base'
before_filter :require_admin
layout 'admin'
before_filter :require_admin
def index
edit
render :action => 'edit'
end
def edit
@notifiables = %w(issue_added issue_updated news_added document_added file_added message_posted)
@notifiables = Redmine::Notifiable.all
if request.post? && params[:settings] && params[:settings].is_a?(Hash)
settings = (params[:settings] || {}).dup.symbolize_keys
settings.each do |name, value|
@@ -35,21 +36,29 @@ class SettingsController < ApplicationController
end
flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'edit', :tab => params[:tab]
return
else
@options = {}
@options[:user_format] = User::USER_FORMATS.keys.collect {|f| [User.current.name(f), f.to_s] }
@deliveries = ActionMailer::Base.perform_deliveries
@guessed_host_and_path = request.host_with_port.dup
@guessed_host_and_path << ('/'+ Redmine::Utils.relative_url_root.gsub(%r{^\/}, '')) unless Redmine::Utils.relative_url_root.blank?
Redmine::Themes.rescan
end
@options = {}
@options[:user_format] = User::USER_FORMATS.keys.collect {|f| [User.current.name(f), f.to_s] }
end
def plugin
plugin_id = params[:id].to_sym
@plugin = Redmine::Plugin.registered_plugins[plugin_id]
@plugin = Redmine::Plugin.find(params[:id])
if request.post?
Setting["plugin_#{plugin_id}"] = params[:settings]
Setting["plugin_#{@plugin.id}"] = params[:settings]
flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'plugin', :id => params[:id]
redirect_to :action => 'plugin', :id => @plugin.id
else
@partial = @plugin.settings[:partial]
@settings = Setting["plugin_#{@plugin.id}"]
end
@partial = "../../vendor/plugins/#{plugin_id}/app/views/" + @plugin.settings[:partial]
@settings = Setting["plugin_#{plugin_id}"]
rescue Redmine::PluginNotFound
render_404
end
end

View File

@@ -1,5 +1,5 @@
# redMine - project management software
# Copyright (C) 2006-2007 Jean-Philippe Lang
# Redmine - project management software
# Copyright (C) 2006-2009 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,32 +16,52 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class SysController < ActionController::Base
wsdl_service_name 'Sys'
web_service_api SysApi
web_service_scaffold :invoke
before_filter :check_enabled
before_invocation :check_enabled
# Returns the projects list, with their repositories
def projects
Project.find(:all, :include => :repository)
p = Project.active.has_module(:repository).find(:all, :include => :repository, :order => 'identifier')
render :xml => p.to_xml(:include => :repository)
end
def create_project_repository
project = Project.find(params[:id])
if project.repository
render :nothing => true, :status => 409
else
logger.info "Repository for #{project.name} was reported to be created by #{request.remote_ip}."
project.repository = Repository.factory(params[:vendor], params[:repository])
if project.repository && project.repository.save
render :xml => project.repository, :status => 201
else
render :nothing => true, :status => 422
end
end
end
def fetch_changesets
projects = []
if params[:id]
projects << Project.active.has_module(:repository).find(params[:id])
else
projects = Project.active.has_module(:repository).find(:all, :include => :repository)
end
projects.each do |project|
if project.repository
project.repository.fetch_changesets
end
end
render :nothing => true, :status => 200
rescue ActiveRecord::RecordNotFound
render :nothing => true, :status => 404
end
# Registers a repository for the given project identifier
# (Subversion specific)
def repository_created(identifier, url)
project = Project.find_by_identifier(identifier)
# Do not create the repository if the project has already one
return 0 unless project && project.repository.nil?
logger.debug "Repository for #{project.name} was created"
repository = Repository.factory('Subversion', :project => project, :url => url)
repository.save
repository.id || 0
end
protected
protected
def check_enabled(name, args)
Setting.sys_api_enabled?
def check_enabled
User.current = nil
unless Setting.sys_api_enabled? && params[:key].to_s == Setting.sys_api_key
render :text => 'Access denied. Repository management WS is disabled or key is invalid.', :status => 403
return false
end
end
end

View File

@@ -0,0 +1,209 @@
class TimeEntryReportsController < ApplicationController
menu_item :issues
before_filter :find_optional_project
before_filter :load_available_criterias
helper :sort
include SortHelper
helper :issues
helper :timelog
include TimelogHelper
helper :custom_fields
include CustomFieldsHelper
def report
@criterias = params[:criterias] || []
@criterias = @criterias.select{|criteria| @available_criterias.has_key? criteria}
@criterias.uniq!
@criterias = @criterias[0,3]
@columns = (params[:columns] && %w(year month week day).include?(params[:columns])) ? params[:columns] : 'month'
retrieve_date_range
unless @criterias.empty?
sql_select = @criterias.collect{|criteria| @available_criterias[criteria][:sql] + " AS " + criteria}.join(', ')
sql_group_by = @criterias.collect{|criteria| @available_criterias[criteria][:sql]}.join(', ')
sql_condition = ''
if @project.nil?
sql_condition = Project.allowed_to_condition(User.current, :view_time_entries)
elsif @issue.nil?
sql_condition = @project.project_condition(Setting.display_subprojects_issues?)
else
sql_condition = "#{Issue.table_name}.root_id = #{@issue.root_id} AND #{Issue.table_name}.lft >= #{@issue.lft} AND #{Issue.table_name}.rgt <= #{@issue.rgt}"
end
sql = "SELECT #{sql_select}, tyear, tmonth, tweek, spent_on, SUM(hours) AS hours"
sql << " FROM #{TimeEntry.table_name}"
sql << time_report_joins
sql << " WHERE"
sql << " (%s) AND" % sql_condition
sql << " (spent_on BETWEEN '%s' AND '%s')" % [ActiveRecord::Base.connection.quoted_date(@from), ActiveRecord::Base.connection.quoted_date(@to)]
sql << " GROUP BY #{sql_group_by}, tyear, tmonth, tweek, spent_on"
@hours = ActiveRecord::Base.connection.select_all(sql)
@hours.each do |row|
case @columns
when 'year'
row['year'] = row['tyear']
when 'month'
row['month'] = "#{row['tyear']}-#{row['tmonth']}"
when 'week'
row['week'] = "#{row['tyear']}-#{row['tweek']}"
when 'day'
row['day'] = "#{row['spent_on']}"
end
end
@total_hours = @hours.inject(0) {|s,k| s = s + k['hours'].to_f}
@periods = []
# Date#at_beginning_of_ not supported in Rails 1.2.x
date_from = @from.to_time
# 100 columns max
while date_from <= @to.to_time && @periods.length < 100
case @columns
when 'year'
@periods << "#{date_from.year}"
date_from = (date_from + 1.year).at_beginning_of_year
when 'month'
@periods << "#{date_from.year}-#{date_from.month}"
date_from = (date_from + 1.month).at_beginning_of_month
when 'week'
@periods << "#{date_from.year}-#{date_from.to_date.cweek}"
date_from = (date_from + 7.day).at_beginning_of_week
when 'day'
@periods << "#{date_from.to_date}"
date_from = date_from + 1.day
end
end
end
respond_to do |format|
format.html { render :layout => !request.xhr? }
format.csv { send_data(report_to_csv(@criterias, @periods, @hours), :type => 'text/csv; header=present', :filename => 'timelog.csv') }
end
end
private
# TODO: duplicated in TimelogController
def find_optional_project
if !params[:issue_id].blank?
@issue = Issue.find(params[:issue_id])
@project = @issue.project
elsif !params[:project_id].blank?
@project = Project.find(params[:project_id])
end
deny_access unless User.current.allowed_to?(:view_time_entries, @project, :global => true)
end
# Retrieves the date range based on predefined ranges or specific from/to param dates
# TODO: duplicated in TimelogController
def retrieve_date_range
@free_period = false
@from, @to = nil, nil
if params[:period_type] == '1' || (params[:period_type].nil? && !params[:period].nil?)
case params[:period].to_s
when 'today'
@from = @to = Date.today
when 'yesterday'
@from = @to = Date.today - 1
when 'current_week'
@from = Date.today - (Date.today.cwday - 1)%7
@to = @from + 6
when 'last_week'
@from = Date.today - 7 - (Date.today.cwday - 1)%7
@to = @from + 6
when '7_days'
@from = Date.today - 7
@to = Date.today
when 'current_month'
@from = Date.civil(Date.today.year, Date.today.month, 1)
@to = (@from >> 1) - 1
when 'last_month'
@from = Date.civil(Date.today.year, Date.today.month, 1) << 1
@to = (@from >> 1) - 1
when '30_days'
@from = Date.today - 30
@to = Date.today
when 'current_year'
@from = Date.civil(Date.today.year, 1, 1)
@to = Date.civil(Date.today.year, 12, 31)
end
elsif params[:period_type] == '2' || (params[:period_type].nil? && (!params[:from].nil? || !params[:to].nil?))
begin; @from = params[:from].to_s.to_date unless params[:from].blank?; rescue; end
begin; @to = params[:to].to_s.to_date unless params[:to].blank?; rescue; end
@free_period = true
else
# default
end
@from, @to = @to, @from if @from && @to && @from > @to
@from ||= (TimeEntry.earilest_date_for_project(@project) || Date.today)
@to ||= (TimeEntry.latest_date_for_project(@project) || Date.today)
end
def load_available_criterias
@available_criterias = { 'project' => {:sql => "#{TimeEntry.table_name}.project_id",
:klass => Project,
:label => :label_project},
'version' => {:sql => "#{Issue.table_name}.fixed_version_id",
:klass => Version,
:label => :label_version},
'category' => {:sql => "#{Issue.table_name}.category_id",
:klass => IssueCategory,
:label => :field_category},
'member' => {:sql => "#{TimeEntry.table_name}.user_id",
:klass => User,
:label => :label_member},
'tracker' => {:sql => "#{Issue.table_name}.tracker_id",
:klass => Tracker,
:label => :label_tracker},
'activity' => {:sql => "#{TimeEntry.table_name}.activity_id",
:klass => TimeEntryActivity,
:label => :label_activity},
'issue' => {:sql => "#{TimeEntry.table_name}.issue_id",
:klass => Issue,
:label => :label_issue}
}
# Add list and boolean custom fields as available criterias
custom_fields = (@project.nil? ? IssueCustomField.for_all : @project.all_issue_custom_fields)
custom_fields.select {|cf| %w(list bool).include? cf.field_format }.each do |cf|
@available_criterias["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'Issue' AND c.customized_id = #{Issue.table_name}.id)",
:format => cf.field_format,
:label => cf.name}
end if @project
# Add list and boolean time entry custom fields
TimeEntryCustomField.find(:all).select {|cf| %w(list bool).include? cf.field_format }.each do |cf|
@available_criterias["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'TimeEntry' AND c.customized_id = #{TimeEntry.table_name}.id)",
:format => cf.field_format,
:label => cf.name}
end
# Add list and boolean time entry activity custom fields
TimeEntryActivityCustomField.find(:all).select {|cf| %w(list bool).include? cf.field_format }.each do |cf|
@available_criterias["cf_#{cf.id}"] = {:sql => "(SELECT c.value FROM #{CustomValue.table_name} c WHERE c.custom_field_id = #{cf.id} AND c.customized_type = 'Enumeration' AND c.customized_id = #{TimeEntry.table_name}.activity_id)",
:format => cf.field_format,
:label => cf.name}
end
call_hook(:controller_timelog_available_criterias, { :available_criterias => @available_criterias, :project => @project })
@available_criterias
end
def time_report_joins
sql = ''
sql << " LEFT JOIN #{Issue.table_name} ON #{TimeEntry.table_name}.issue_id = #{Issue.table_name}.id"
sql << " LEFT JOIN #{Project.table_name} ON #{TimeEntry.table_name}.project_id = #{Project.table_name}.id"
# TODO: rename hook
call_hook(:controller_timelog_time_report_joins, {:sql => sql} )
sql
end
end

View File

@@ -1,5 +1,5 @@
# redMine - project management software
# Copyright (C) 2006-2007 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,107 +16,215 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class TimelogController < ApplicationController
layout 'base'
menu_item :issues
before_filter :find_project, :authorize
verify :method => :post, :only => :destroy, :redirect_to => { :action => :details }
before_filter :find_project, :only => [:new, :create]
before_filter :find_time_entry, :only => [:show, :edit, :update, :destroy]
before_filter :authorize, :except => [:index]
before_filter :find_optional_project, :only => [:index]
accept_key_auth :index, :show, :create, :update, :destroy
helper :sort
include SortHelper
helper :issues
include TimelogHelper
helper :custom_fields
include CustomFieldsHelper
def report
@available_criterias = { 'project' => {:sql => "#{TimeEntry.table_name}.project_id",
:klass => Project,
:label => :label_project},
'version' => {:sql => "#{Issue.table_name}.fixed_version_id",
:klass => Version,
:label => :label_version},
'category' => {:sql => "#{Issue.table_name}.category_id",
:klass => IssueCategory,
:label => :field_category},
'member' => {:sql => "#{TimeEntry.table_name}.user_id",
:klass => User,
:label => :label_member},
'tracker' => {:sql => "#{Issue.table_name}.tracker_id",
:klass => Tracker,
:label => :label_tracker},
'activity' => {:sql => "#{TimeEntry.table_name}.activity_id",
:klass => Enumeration,
:label => :label_activity}
}
def index
sort_init 'spent_on', 'desc'
sort_update 'spent_on' => 'spent_on',
'user' => 'user_id',
'activity' => 'activity_id',
'project' => "#{Project.table_name}.name",
'issue' => 'issue_id',
'hours' => 'hours'
@criterias = params[:criterias] || []
@criterias = @criterias.select{|criteria| @available_criterias.has_key? criteria}
@criterias.uniq!
@criterias = @criterias[0,3]
@columns = (params[:period] && %w(year month week).include?(params[:period])) ? params[:period] : 'month'
if params[:date_from]
begin; @date_from = params[:date_from].to_date; rescue; end
cond = ARCondition.new
if @project.nil?
cond << Project.allowed_to_condition(User.current, :view_time_entries)
elsif @issue.nil?
cond << @project.project_condition(Setting.display_subprojects_issues?)
else
cond << "#{Issue.table_name}.root_id = #{@issue.root_id} AND #{Issue.table_name}.lft >= #{@issue.lft} AND #{Issue.table_name}.rgt <= #{@issue.rgt}"
end
if params[:date_to]
begin; @date_to = params[:date_to].to_date; rescue; end
end
@date_from ||= Date.civil(Date.today.year, 1, 1)
@date_to ||= (Date.civil(Date.today.year, Date.today.month, 1) >> 1) - 1
unless @criterias.empty?
sql_select = @criterias.collect{|criteria| @available_criterias[criteria][:sql] + " AS " + criteria}.join(', ')
sql_group_by = @criterias.collect{|criteria| @available_criterias[criteria][:sql]}.join(', ')
sql = "SELECT #{sql_select}, tyear, tmonth, tweek, SUM(hours) AS hours"
sql << " FROM #{TimeEntry.table_name}"
sql << " LEFT JOIN #{Issue.table_name} ON #{TimeEntry.table_name}.issue_id = #{Issue.table_name}.id"
sql << " LEFT JOIN #{Project.table_name} ON #{TimeEntry.table_name}.project_id = #{Project.table_name}.id"
sql << " WHERE (%s)" % @project.project_condition(Setting.display_subprojects_issues?)
sql << " AND (%s)" % Project.allowed_to_condition(User.current, :view_time_entries)
sql << " AND spent_on BETWEEN '%s' AND '%s'" % [ActiveRecord::Base.connection.quoted_date(@date_from.to_time), ActiveRecord::Base.connection.quoted_date(@date_to.to_time)]
sql << " GROUP BY #{sql_group_by}, tyear, tmonth, tweek"
@hours = ActiveRecord::Base.connection.select_all(sql)
@hours.each do |row|
case @columns
when 'year'
row['year'] = row['tyear']
when 'month'
row['month'] = "#{row['tyear']}-#{row['tmonth']}"
when 'week'
row['week'] = "#{row['tyear']}-#{row['tweek']}"
end
end
@total_hours = @hours.inject(0) {|s,k| s = s + k['hours'].to_f}
end
@periods = []
date_from = @date_from
# 100 columns max
while date_from < @date_to && @periods.length < 100
case @columns
when 'year'
@periods << "#{date_from.year}"
date_from = date_from >> 12
when 'month'
@periods << "#{date_from.year}-#{date_from.month}"
date_from = date_from >> 1
when 'week'
@periods << "#{date_from.year}-#{date_from.cweek}"
date_from = date_from + 7
retrieve_date_range
cond << ['spent_on BETWEEN ? AND ?', @from, @to]
TimeEntry.visible_by(User.current) do
respond_to do |format|
format.html {
# Paginate results
@entry_count = TimeEntry.count(:include => [:project, :issue], :conditions => cond.conditions)
@entry_pages = Paginator.new self, @entry_count, per_page_option, params['page']
@entries = TimeEntry.find(:all,
:include => [:project, :activity, :user, {:issue => :tracker}],
:conditions => cond.conditions,
:order => sort_clause,
:limit => @entry_pages.items_per_page,
:offset => @entry_pages.current.offset)
@total_hours = TimeEntry.sum(:hours, :include => [:project, :issue], :conditions => cond.conditions).to_f
render :layout => !request.xhr?
}
format.api {
@entry_count = TimeEntry.count(:include => [:project, :issue], :conditions => cond.conditions)
@entry_pages = Paginator.new self, @entry_count, per_page_option, params['page']
@entries = TimeEntry.find(:all,
:include => [:project, :activity, :user, {:issue => :tracker}],
:conditions => cond.conditions,
:order => sort_clause,
:limit => @entry_pages.items_per_page,
:offset => @entry_pages.current.offset)
}
format.atom {
entries = TimeEntry.find(:all,
:include => [:project, :activity, :user, {:issue => :tracker}],
:conditions => cond.conditions,
:order => "#{TimeEntry.table_name}.created_on DESC",
:limit => Setting.feeds_limit.to_i)
render_feed(entries, :title => l(:label_spent_time))
}
format.csv {
# Export all entries
@entries = TimeEntry.find(:all,
:include => [:project, :activity, :user, {:issue => [:tracker, :assigned_to, :priority]}],
:conditions => cond.conditions,
:order => sort_clause)
send_data(entries_to_csv(@entries), :type => 'text/csv; header=present', :filename => 'timelog.csv')
}
end
end
render :layout => false if request.xhr?
end
def details
sort_init 'spent_on', 'desc'
sort_update
def show
respond_to do |format|
# TODO: Implement html response
format.html { render :nothing => true, :status => 406 }
format.api
end
end
def new
@time_entry ||= TimeEntry.new(:project => @project, :issue => @issue, :user => User.current, :spent_on => User.current.today)
@time_entry.attributes = params[:time_entry]
call_hook(:controller_timelog_edit_before_save, { :params => params, :time_entry => @time_entry })
render :action => 'edit'
end
verify :method => :post, :only => :create, :render => {:nothing => true, :status => :method_not_allowed }
def create
@time_entry ||= TimeEntry.new(:project => @project, :issue => @issue, :user => User.current, :spent_on => User.current.today)
@time_entry.attributes = params[:time_entry]
call_hook(:controller_timelog_edit_before_save, { :params => params, :time_entry => @time_entry })
if @time_entry.save
respond_to do |format|
format.html {
flash[:notice] = l(:notice_successful_update)
redirect_back_or_default :action => 'index', :project_id => @time_entry.project
}
format.api { render :action => 'show', :status => :created, :location => time_entry_url(@time_entry) }
end
else
respond_to do |format|
format.html { render :action => 'edit' }
format.api { render_validation_errors(@time_entry) }
end
end
end
def edit
@time_entry.attributes = params[:time_entry]
call_hook(:controller_timelog_edit_before_save, { :params => params, :time_entry => @time_entry })
end
verify :method => :put, :only => :update, :render => {:nothing => true, :status => :method_not_allowed }
def update
@time_entry.attributes = params[:time_entry]
call_hook(:controller_timelog_edit_before_save, { :params => params, :time_entry => @time_entry })
if @time_entry.save
respond_to do |format|
format.html {
flash[:notice] = l(:notice_successful_update)
redirect_back_or_default :action => 'index', :project_id => @time_entry.project
}
format.api { head :ok }
end
else
respond_to do |format|
format.html { render :action => 'edit' }
format.api { render_validation_errors(@time_entry) }
end
end
end
verify :method => :delete, :only => :destroy, :render => {:nothing => true, :status => :method_not_allowed }
def destroy
if @time_entry.destroy && @time_entry.destroyed?
respond_to do |format|
format.html {
flash[:notice] = l(:notice_successful_delete)
redirect_to :back
}
format.api { head :ok }
end
else
respond_to do |format|
format.html {
flash[:error] = l(:notice_unable_delete_time_entry)
redirect_to :back
}
format.api { render_validation_errors(@time_entry) }
end
end
rescue ::ActionController::RedirectBackError
redirect_to :action => 'index', :project_id => @time_entry.project
end
private
def find_time_entry
@time_entry = TimeEntry.find(params[:id])
unless @time_entry.editable_by?(User.current)
render_403
return false
end
@project = @time_entry.project
rescue ActiveRecord::RecordNotFound
render_404
end
def find_project
if (issue_id = (params[:issue_id] || params[:time_entry] && params[:time_entry][:issue_id])).present?
@issue = Issue.find(issue_id)
@project = @issue.project
elsif (project_id = (params[:project_id] || params[:time_entry] && params[:time_entry][:project_id])).present?
@project = Project.find(project_id)
else
render_404
return false
end
rescue ActiveRecord::RecordNotFound
render_404
end
def find_optional_project
if !params[:issue_id].blank?
@issue = Issue.find(params[:issue_id])
@project = @issue.project
elsif !params[:project_id].blank?
@project = Project.find(params[:project_id])
end
deny_access unless User.current.allowed_to?(:view_time_entries, @project, :global => true)
end
# Retrieves the date range based on predefined ranges or specific from/to param dates
def retrieve_date_range
@free_period = false
@from, @to = nil, nil
@@ -157,85 +265,8 @@ class TimelogController < ApplicationController
end
@from, @to = @to, @from if @from && @to && @from > @to
cond = ARCondition.new
cond << (@issue.nil? ? @project.project_condition(Setting.display_subprojects_issues?) :
["#{TimeEntry.table_name}.issue_id = ?", @issue.id])
if @from
if @to
cond << ['spent_on BETWEEN ? AND ?', @from, @to]
else
cond << ['spent_on >= ?', @from]
end
elsif @to
cond << ['spent_on <= ?', @to]
end
TimeEntry.visible_by(User.current) do
respond_to do |format|
format.html {
# Paginate results
@entry_count = TimeEntry.count(:include => :project, :conditions => cond.conditions)
@entry_pages = Paginator.new self, @entry_count, per_page_option, params['page']
@entries = TimeEntry.find(:all,
:include => [:project, :activity, :user, {:issue => :tracker}],
:conditions => cond.conditions,
:order => sort_clause,
:limit => @entry_pages.items_per_page,
:offset => @entry_pages.current.offset)
@total_hours = TimeEntry.sum(:hours, :include => :project, :conditions => cond.conditions).to_f
render :layout => !request.xhr?
}
format.csv {
# Export all entries
@entries = TimeEntry.find(:all,
:include => [:project, :activity, :user, {:issue => [:tracker, :assigned_to, :priority]}],
:conditions => cond.conditions,
:order => sort_clause)
send_data(entries_to_csv(@entries).read, :type => 'text/csv; header=present', :filename => 'timelog.csv')
}
end
end
end
def edit
render_403 and return if @time_entry && !@time_entry.editable_by?(User.current)
@time_entry ||= TimeEntry.new(:project => @project, :issue => @issue, :user => User.current, :spent_on => Date.today)
@time_entry.attributes = params[:time_entry]
if request.post? and @time_entry.save
flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'details', :project_id => @time_entry.project
return
end
@activities = Enumeration::get_values('ACTI')
end
def destroy
render_404 and return unless @time_entry
render_403 and return unless @time_entry.editable_by?(User.current)
@time_entry.destroy
flash[:notice] = l(:notice_successful_delete)
redirect_to :back
rescue RedirectBackError
redirect_to :action => 'details', :project_id => @time_entry.project
@from ||= (TimeEntry.earilest_date_for_project(@project) || Date.today)
@to ||= (TimeEntry.latest_date_for_project(@project) || Date.today)
end
private
def find_project
if params[:id]
@time_entry = TimeEntry.find(params[:id])
@project = @time_entry.project
elsif params[:issue_id]
@issue = Issue.find(params[:issue_id])
@project = @issue.project
elsif params[:project_id]
@project = Project.find(params[:project_id])
else
render_404
return false
end
rescue ActiveRecord::RecordNotFound
render_404
end
end

View File

@@ -1,5 +1,5 @@
# redMine - project management software
# Copyright (C) 2006 Jean-Philippe Lang
# Redmine - project management software
# Copyright (C) 2006-2009 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,20 +16,15 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class TrackersController < ApplicationController
layout 'base'
layout 'admin'
before_filter :require_admin
verify :method => :post, :only => :destroy, :redirect_to => { :action => :index }
def index
list
render :action => 'list' unless request.xhr?
end
# GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html)
verify :method => :post, :only => [ :destroy, :move ], :redirect_to => { :action => :list }
def list
@tracker_pages, @trackers = paginate :trackers, :per_page => 10, :order => 'position'
render :action => "list", :layout => false if request.xhr?
render :action => "index", :layout => false if request.xhr?
end
def new
@@ -40,41 +35,30 @@ class TrackersController < ApplicationController
@tracker.workflows.copy(copy_from)
end
flash[:notice] = l(:notice_successful_create)
redirect_to :action => 'list'
redirect_to :action => 'index'
return
end
@trackers = Tracker.find :all, :order => 'position'
@projects = Project.find(:all)
end
def edit
@tracker = Tracker.find(params[:id])
if request.post? and @tracker.update_attributes(params[:tracker])
flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'list'
redirect_to :action => 'index'
return
end
end
def move
@tracker = Tracker.find(params[:id])
case params[:position]
when 'highest'
@tracker.move_to_top
when 'higher'
@tracker.move_higher
when 'lower'
@tracker.move_lower
when 'lowest'
@tracker.move_to_bottom
end if params[:position]
redirect_to :action => 'list'
@projects = Project.find(:all)
end
def destroy
@tracker = Tracker.find(params[:id])
unless @tracker.issues.empty?
flash[:error] = "This tracker contains issues and can\'t be deleted."
flash[:error] = l(:error_can_not_delete_tracker)
else
@tracker.destroy
end
redirect_to :action => 'list'
redirect_to :action => 'index'
end
end

View File

@@ -1,5 +1,5 @@
# redMine - project management software
# Copyright (C) 2006-2007 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,8 +16,11 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class UsersController < ApplicationController
layout 'base'
before_filter :require_admin
layout 'admin'
before_filter :require_admin, :except => :show
before_filter :find_user, :only => [:show, :edit, :update, :edit_membership, :destroy_membership]
accept_key_auth :index, :show, :create, :update
helper :sort
include SortHelper
@@ -25,88 +28,198 @@ class UsersController < ApplicationController
include CustomFieldsHelper
def index
list
render :action => 'list' unless request.xhr?
end
def list
sort_init 'login', 'asc'
sort_update
sort_update %w(login firstname lastname mail admin created_on last_login_on)
case params[:format]
when 'xml', 'json'
@offset, @limit = api_offset_and_limit
else
@limit = per_page_option
end
@status = params[:status] ? params[:status].to_i : 1
conditions = "status <> 0"
conditions = ["status=?", @status] unless @status == 0
c = ARCondition.new(@status == 0 ? "status <> 0" : ["status = ?", @status])
unless params[:name].blank?
name = "%#{params[:name].strip.downcase}%"
c << ["LOWER(login) LIKE ? OR LOWER(firstname) LIKE ? OR LOWER(lastname) LIKE ? OR LOWER(mail) LIKE ?", name, name, name, name]
end
@user_count = User.count(:conditions => conditions)
@user_pages = Paginator.new self, @user_count,
per_page_option,
params['page']
@users = User.find :all,:order => sort_clause,
:conditions => conditions,
:limit => @user_pages.items_per_page,
:offset => @user_pages.current.offset
@user_count = User.count(:conditions => c.conditions)
@user_pages = Paginator.new self, @user_count, @limit, params['page']
@offset ||= @user_pages.current.offset
@users = User.find :all,
:order => sort_clause,
:conditions => c.conditions,
:limit => @limit,
:offset => @offset
render :action => "list", :layout => false if request.xhr?
respond_to do |format|
format.html { render :layout => !request.xhr? }
format.api
end
end
def add
if request.get?
@user = User.new(:language => Setting.default_language)
@custom_values = UserCustomField.find(:all, :order => "#{CustomField.table_name}.position").collect { |x| CustomValue.new(:custom_field => x, :customized => @user) }
else
@user = User.new(params[:user])
@user.admin = params[:user][:admin] || false
@user.login = params[:user][:login]
@user.password, @user.password_confirmation = params[:password], params[:password_confirmation] unless @user.auth_source_id
@custom_values = UserCustomField.find(:all, :order => "#{CustomField.table_name}.position").collect { |x| CustomValue.new(:custom_field => x, :customized => @user, :value => (params[:custom_fields] ? params["custom_fields"][x.id.to_s] : nil)) }
@user.custom_values = @custom_values
if @user.save
Mailer.deliver_account_information(@user, params[:password]) if params[:send_information]
flash[:notice] = l(:notice_successful_create)
redirect_to :action => 'list'
def show
# show projects based on current user visibility
@memberships = @user.memberships.all(:conditions => Project.visible_by(User.current))
events = Redmine::Activity::Fetcher.new(User.current, :author => @user).events(nil, nil, :limit => 10)
@events_by_day = events.group_by(&:event_date)
unless User.current.admin?
if !@user.active? || (@user != User.current && @memberships.empty? && events.empty?)
render_404
return
end
end
respond_to do |format|
format.html { render :layout => 'base' }
format.api
end
end
def new
@user = User.new(:language => Setting.default_language, :mail_notification => Setting.default_notification_option)
@auth_sources = AuthSource.find(:all)
end
verify :method => :post, :only => :create, :render => {:nothing => true, :status => :method_not_allowed }
def create
@user = User.new(:language => Setting.default_language, :mail_notification => Setting.default_notification_option)
@user.safe_attributes = params[:user]
@user.admin = params[:user][:admin] || false
@user.login = params[:user][:login]
@user.password, @user.password_confirmation = params[:user][:password], params[:user][:password_confirmation] unless @user.auth_source_id
# TODO: Similar to My#account
@user.pref.attributes = params[:pref]
@user.pref[:no_self_notified] = (params[:no_self_notified] == '1')
if @user.save
@user.pref.save
@user.notified_project_ids = (@user.mail_notification == 'selected' ? params[:notified_project_ids] : [])
Mailer.deliver_account_information(@user, params[:user][:password]) if params[:send_information]
respond_to do |format|
format.html {
flash[:notice] = l(:notice_successful_create)
redirect_to(params[:continue] ?
{:controller => 'users', :action => 'new'} :
{:controller => 'users', :action => 'edit', :id => @user}
)
}
format.api { render :action => 'show', :status => :created, :location => user_url(@user) }
end
else
@auth_sources = AuthSource.find(:all)
# Clear password input
@user.password = @user.password_confirmation = nil
respond_to do |format|
format.html { render :action => 'new' }
format.api { render_validation_errors(@user) }
end
end
end
def edit
@user = User.find(params[:id])
if request.get?
@custom_values = UserCustomField.find(:all, :order => "#{CustomField.table_name}.position").collect { |x| @user.custom_values.find_by_custom_field_id(x.id) || CustomValue.new(:custom_field => x) }
else
@user.admin = params[:user][:admin] if params[:user][:admin]
@user.login = params[:user][:login] if params[:user][:login]
@user.password, @user.password_confirmation = params[:password], params[:password_confirmation] unless params[:password].nil? or params[:password].empty? or @user.auth_source_id
if params[:custom_fields]
@custom_values = UserCustomField.find(:all, :order => "#{CustomField.table_name}.position").collect { |x| CustomValue.new(:custom_field => x, :customized => @user, :value => params["custom_fields"][x.id.to_s]) }
@user.custom_values = @custom_values
end
if @user.update_attributes(params[:user])
flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'list'
end
end
@auth_sources = AuthSource.find(:all)
@roles = Role.find_all_givable
@projects = Project.find(:all, :order => 'name', :conditions => "status=#{Project::STATUS_ACTIVE}") - @user.projects
@membership ||= Member.new
end
def edit_membership
@user = User.find(params[:id])
@membership = params[:membership_id] ? Member.find(params[:membership_id]) : Member.new(:user => @user)
@membership.attributes = params[:membership]
if request.post? and @membership.save
flash[:notice] = l(:notice_successful_update)
verify :method => :put, :only => :update, :render => {:nothing => true, :status => :method_not_allowed }
def update
@user.admin = params[:user][:admin] if params[:user][:admin]
@user.login = params[:user][:login] if params[:user][:login]
if params[:user][:password].present? && (@user.auth_source_id.nil? || params[:user][:auth_source_id].blank?)
@user.password, @user.password_confirmation = params[:user][:password], params[:user][:password_confirmation]
end
@user.safe_attributes = params[:user]
# Was the account actived ? (do it before User#save clears the change)
was_activated = (@user.status_change == [User::STATUS_REGISTERED, User::STATUS_ACTIVE])
# TODO: Similar to My#account
@user.pref.attributes = params[:pref]
@user.pref[:no_self_notified] = (params[:no_self_notified] == '1')
if @user.save
@user.pref.save
@user.notified_project_ids = (@user.mail_notification == 'selected' ? params[:notified_project_ids] : [])
if was_activated
Mailer.deliver_account_activated(@user)
elsif @user.active? && params[:send_information] && !params[:user][:password].blank? && @user.auth_source_id.nil?
Mailer.deliver_account_information(@user, params[:user][:password])
end
respond_to do |format|
format.html {
flash[:notice] = l(:notice_successful_update)
redirect_to :back
}
format.api { head :ok }
end
else
@auth_sources = AuthSource.find(:all)
@membership ||= Member.new
# Clear password input
@user.password = @user.password_confirmation = nil
respond_to do |format|
format.html { render :action => :edit }
format.api { render_validation_errors(@user) }
end
end
rescue ::ActionController::RedirectBackError
redirect_to :controller => 'users', :action => 'edit', :id => @user
end
def edit_membership
@membership = Member.edit_membership(params[:membership_id], params[:membership], @user)
@membership.save if request.post?
respond_to do |format|
if @membership.valid?
format.html { redirect_to :controller => 'users', :action => 'edit', :id => @user, :tab => 'memberships' }
format.js {
render(:update) {|page|
page.replace_html "tab-content-memberships", :partial => 'users/memberships'
page.visual_effect(:highlight, "member-#{@membership.id}")
}
}
else
format.js {
render(:update) {|page|
page.alert(l(:notice_failed_to_save_members, :errors => @membership.errors.full_messages.join(', ')))
}
}
end
end
redirect_to :action => 'edit', :id => @user and return
end
def destroy_membership
@user = User.find(params[:id])
if request.post? and Member.find(params[:membership_id]).destroy
flash[:notice] = l(:notice_successful_update)
@membership = Member.find(params[:membership_id])
if request.post? && @membership.deletable?
@membership.destroy
end
redirect_to :action => 'edit', :id => @user and return
respond_to do |format|
format.html { redirect_to :controller => 'users', :action => 'edit', :id => @user, :tab => 'memberships' }
format.js { render(:update) {|page| page.replace_html "tab-content-memberships", :partial => 'users/memberships'} }
end
end
private
def find_user
if params[:id] == 'current'
require_login || return
@user = User.current
else
@user = User.find(params[:id])
end
rescue ActiveRecord::RecordNotFound
render_404
end
end

View File

@@ -16,41 +16,122 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class VersionsController < ApplicationController
layout 'base'
menu_item :roadmap
before_filter :find_project, :authorize
model_object Version
before_filter :find_model_object, :except => [:index, :new, :create, :close_completed]
before_filter :find_project_from_association, :except => [:index, :new, :create, :close_completed]
before_filter :find_project, :only => [:index, :new, :create, :close_completed]
before_filter :authorize
def show
helper :custom_fields
helper :projects
def index
@trackers = @project.trackers.find(:all, :order => 'position')
retrieve_selected_tracker_ids(@trackers, @trackers.select {|t| t.is_in_roadmap?})
@with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1')
project_ids = @with_subprojects ? @project.self_and_descendants.collect(&:id) : [@project.id]
@versions = @project.shared_versions || []
@versions += @project.rolled_up_versions.visible if @with_subprojects
@versions = @versions.uniq.sort
@versions.reject! {|version| version.closed? || version.completed? } unless params[:completed]
@issues_by_version = {}
unless @selected_tracker_ids.empty?
@versions.each do |version|
issues = version.fixed_issues.visible.find(:all,
:include => [:project, :status, :tracker, :priority],
: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
end
@versions.reject! {|version| !project_ids.include?(version.project_id) && @issues_by_version[version].blank?}
end
def edit
if request.post? and @version.update_attributes(params[:version])
flash[:notice] = l(:notice_successful_update)
redirect_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project
def show
@issues = @version.fixed_issues.visible.find(:all,
:include => [:status, :tracker, :priority],
:order => "#{Tracker.table_name}.position, #{Issue.table_name}.id")
end
def new
@version = @project.versions.build
if params[:version]
attributes = params[:version].dup
attributes.delete('sharing') unless attributes.nil? || @version.allowed_sharings.include?(attributes['sharing'])
@version.attributes = attributes
end
end
def destroy
@version.destroy
redirect_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project
rescue
flash[:error] = "Unable to delete version"
def create
# TODO: refactor with code above in #new
@version = @project.versions.build
if params[:version]
attributes = params[:version].dup
attributes.delete('sharing') unless attributes.nil? || @version.allowed_sharings.include?(attributes['sharing'])
@version.attributes = attributes
end
if request.post?
if @version.save
respond_to do |format|
format.html do
flash[:notice] = l(:notice_successful_create)
redirect_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project
end
format.js do
# IE doesn't support the replace_html rjs method for select box options
render(:update) {|page| page.replace "issue_fixed_version_id",
content_tag('select', '<option></option>' + version_options_for_select(@project.shared_versions.open, @version), :id => 'issue_fixed_version_id', :name => 'issue[fixed_version_id]')
}
end
end
else
respond_to do |format|
format.html { render :action => 'new' }
format.js do
render(:update) {|page| page.alert(@version.errors.full_messages.join('\n')) }
end
end
end
end
end
def edit
end
def update
if request.put? && params[:version]
attributes = params[:version].dup
attributes.delete('sharing') unless @version.allowed_sharings.include?(attributes['sharing'])
if @version.update_attributes(attributes)
flash[:notice] = l(:notice_successful_update)
redirect_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project
else
respond_to do |format|
format.html { render :action => 'edit' }
end
end
end
end
def close_completed
if request.put?
@project.close_completed_versions
end
redirect_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project
end
def download
@attachment = @version.attachments.find(params[:attachment_id])
@attachment.increment_download
send_file @attachment.diskfile, :filename => filename_for_content_disposition(@attachment.filename),
:type => @attachment.content_type
rescue
render_404
end
def destroy_file
@version.attachments.find(params[:attachment_id]).destroy
flash[:notice] = l(:notice_successful_delete)
redirect_to :controller => 'projects', :action => 'list_files', :id => @project
def destroy
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
@@ -62,9 +143,17 @@ class VersionsController < ApplicationController
private
def find_project
@version = Version.find(params[:id])
@project = @version.project
@project = Project.find(params[:project_id])
rescue ActiveRecord::RecordNotFound
render_404
end
end
def retrieve_selected_tracker_ids(selectable_trackers, default_trackers=nil)
if ids = params[:tracker_ids]
@selected_tracker_ids = (ids.is_a? Array) ? ids.collect { |id| id.to_i.to_s } : ids.split('/').collect { |id| id.to_i.to_s }
else
@selected_tracker_ids = (default_trackers || selectable_trackers).collect {|t| t.id.to_s }
end
end
end

View File

@@ -16,27 +16,54 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class WatchersController < ApplicationController
layout 'base'
before_filter :require_login, :find_project, :check_project_privacy
before_filter :find_project
before_filter :require_login, :check_project_privacy, :only => [:watch, :unwatch]
before_filter :authorize, :only => [:new, :destroy]
def add
user = User.current
@watched.add_watcher(user)
respond_to do |format|
format.html { render :text => 'Watcher added.', :layout => true }
format.js { render(:update) {|page| page.replace_html 'watcher', watcher_link(@watched, user)} }
verify :method => :post,
:only => [ :watch, :unwatch ],
:render => { :nothing => true, :status => :method_not_allowed }
def watch
if @watched.respond_to?(:visible?) && !@watched.visible?(User.current)
render_403
else
set_watcher(User.current, true)
end
end
def remove
user = User.current
@watched.remove_watcher(user)
def unwatch
set_watcher(User.current, false)
end
def new
@watcher = Watcher.new(params[:watcher])
@watcher.watchable = @watched
@watcher.save if request.post?
respond_to do |format|
format.html { render :text => 'Watcher removed.', :layout => true }
format.js { render(:update) {|page| page.replace_html 'watcher', watcher_link(@watched, user)} }
format.html { redirect_to :back }
format.js do
render :update do |page|
page.replace_html 'watchers', :partial => 'watchers/watchers', :locals => {:watched => @watched}
end
end
end
rescue ::ActionController::RedirectBackError
render :text => 'Watcher added.', :layout => true
end
def destroy
@watched.set_watcher(User.find(params[:user_id]), false) if request.post?
respond_to do |format|
format.html { redirect_to :back }
format.js do
render :update do |page|
page.replace_html 'watchers', :partial => 'watchers/watchers', :locals => {:watched => @watched}
end
end
end
end
private
def find_project
klass = Object.const_get(params[:object_type].camelcase)
@@ -46,4 +73,29 @@ private
rescue
render_404
end
def set_watcher(user, watching)
@watched.set_watcher(user, watching)
if params[:replace].present?
if params[:replace].is_a? Array
replace_ids = params[:replace]
else
replace_ids = [params[:replace]]
end
else
replace_ids = ['watcher']
end
respond_to do |format|
format.html { redirect_to :back }
format.js do
render(:update) do |page|
replace_ids.each do |replace_id|
page.replace_html replace_id, watcher_link(@watched, user, :replace => replace_ids)
end
end
end
end
rescue ::ActionController::RedirectBackError
render :text => (watching ? 'Watcher added.' : 'Watcher removed.'), :layout => true
end
end

View File

@@ -16,10 +16,15 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class WelcomeController < ApplicationController
layout 'base'
caches_action :robots
def index
@news = News.latest User.current
@projects = Project.latest User.current
end
def robots
@projects = Project.all_public.active
render :layout => false, :content_type => 'text/plain'
end
end

View File

@@ -17,21 +17,42 @@
require 'diff'
# The WikiController follows the Rails REST controller pattern but with
# a few differences
#
# * index - shows a list of WikiPages grouped by page or date
# * new - not used
# * create - not used
# * show - will also show the form for creating a new wiki page
# * edit - used to edit an existing or new page
# * update - used to save a wiki page update to the database, including new pages
# * destroy - normal
#
# Other member and collection methods are also used
#
# TODO: still being worked on
class WikiController < ApplicationController
layout 'base'
default_search_scope :wiki_pages
before_filter :find_wiki, :authorize
before_filter :find_existing_page, :only => [:rename, :protect, :history, :diff, :annotate, :add_attachment, :destroy]
verify :method => :post, :only => [:destroy, :destroy_attachment], :redirect_to => { :action => :index }
verify :method => :post, :only => [:protect], :redirect_to => { :action => :show }
helper :attachments
include AttachmentsHelper
# display a page (in editing mode if it doesn't exist)
helper :watchers
# List of pages, sorted alphabetically and by parent (hierarchy)
def index
page_title = params[:page]
load_pages_grouped_by_date_without_content
end
# display a page (in editing mode if it doesn't exist)
def show
page_title = params[:id]
@page = @wiki.find_or_new_page(page_title)
if @page.new_record?
if User.current.allowed_to?(:edit_wiki_pages, @project)
if User.current.allowed_to?(:edit_wiki_pages, @project) && editable?
edit
render :action => 'edit'
else
@@ -39,63 +60,97 @@ class WikiController < ApplicationController
end
return
end
@content = @page.content_for_version(params[:version])
if params[:export] == 'html'
export = render_to_string :action => 'export', :layout => false
send_data(export, :type => 'text/html', :filename => "#{@page.title}.html")
return
elsif params[:export] == 'txt'
send_data(@content.text, :type => 'text/plain', :filename => "#{@page.title}.txt")
if params[:version] && !User.current.allowed_to?(:view_wiki_edits, @project)
# Redirects user to the current version if he's not allowed to view previous versions
redirect_to :version => nil
return
end
@content = @page.content_for_version(params[:version])
if User.current.allowed_to?(:export_wiki_pages, @project)
if params[:format] == 'html'
export = render_to_string :action => 'export', :layout => false
send_data(export, :type => 'text/html', :filename => "#{@page.title}.html")
return
elsif params[:format] == 'txt'
send_data(@content.text, :type => 'text/plain', :filename => "#{@page.title}.txt")
return
end
end
@editable = editable?
render :action => 'show'
end
# edit an existing page or a new one
def edit
@page = @wiki.find_or_new_page(params[:page])
@page = @wiki.find_or_new_page(params[:id])
return render_403 unless editable?
@page.content = WikiContent.new(:page => @page) if @page.new_record?
@content = @page.content_for_version(params[:version])
@content.text = "h1. #{@page.pretty_title}" if @content.text.blank?
@content.text = initial_page_content(@page) if @content.text.blank?
# don't keep previous comment
@content.comments = nil
if request.post?
if !@page.new_record? && @content.text == params[:content][:text]
# don't save if text wasn't changed
redirect_to :action => 'index', :id => @project, :page => @page.title
return
end
#@content.text = params[:content][:text]
#@content.comments = params[:content][:comments]
@content.attributes = params[:content]
@content.author = User.current
# if page is new @page.save will also save content, but not if page isn't a new record
if (@page.new_record? ? @page.save : @content.save)
redirect_to :action => 'index', :id => @project, :page => @page.title
end
# To prevent StaleObjectError exception when reverting to a previous version
@content.version = @page.content.version
end
verify :method => :put, :only => :update, :render => {:nothing => true, :status => :method_not_allowed }
# Creates a new page or updates an existing one
def update
@page = @wiki.find_or_new_page(params[:id])
return render_403 unless editable?
@page.content = WikiContent.new(:page => @page) if @page.new_record?
@content = @page.content_for_version(params[:version])
@content.text = initial_page_content(@page) if @content.text.blank?
# don't keep previous comment
@content.comments = nil
if !@page.new_record? && params[:content].present? && @content.text == params[:content][:text]
attachments = Attachment.attach_files(@page, params[:attachments])
render_attachment_warning_if_needed(@page)
# don't save if text wasn't changed
redirect_to :action => 'show', :project_id => @project, :id => @page.title
return
end
@content.attributes = params[:content]
@content.author = User.current
# if page is new @page.save will also save content, but not if page isn't a new record
if (@page.new_record? ? @page.save : @content.save)
attachments = Attachment.attach_files(@page, params[:attachments])
render_attachment_warning_if_needed(@page)
call_hook(:controller_wiki_edit_after_save, { :params => params, :page => @page})
redirect_to :action => 'show', :project_id => @project, :id => @page.title
else
render :action => 'edit'
end
rescue ActiveRecord::StaleObjectError
# Optimistic locking exception
flash[:error] = l(:notice_locking_conflict)
flash.now[:error] = l(:notice_locking_conflict)
render :action => 'edit'
end
# rename a page
def rename
@page = @wiki.find_page(params[:page])
return render_403 unless editable?
@page.redirect_existing_links = true
# used to display the *original* title if some AR validation errors occur
@original_title = @page.pretty_title
if request.post? && @page.update_attributes(params[:wiki_page])
flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'index', :id => @project, :page => @page.title
redirect_to :action => 'show', :project_id => @project, :id => @page.title
end
end
def protect
@page.update_attribute :protected, params[:protected]
redirect_to :action => 'show', :project_id => @project, :id => @page.title
end
# show page history
def history
@page = @wiki.find_page(params[:page])
@version_count = @page.content.versions.count
@version_pages = Paginator.new self, @version_count, per_page_option, params['p']
# don't load text
@@ -109,73 +164,114 @@ class WikiController < ApplicationController
end
def diff
@page = @wiki.find_page(params[:page])
@diff = @page.diff(params[:version], params[:version_from])
render_404 unless @diff
end
def annotate
@page = @wiki.find_page(params[:page])
@annotate = @page.annotate(params[:version])
end
# remove a wiki page and its history
def destroy
@page = @wiki.find_page(params[:page])
@page.destroy if @page
redirect_to :action => 'special', :id => @project, :page => 'Page_index'
render_404 unless @annotate
end
# display special pages
def special
page_title = params[:page].downcase
case page_title
# show pages index, sorted by title
when 'page_index', 'date_index'
# eager load information about last updates, without loading text
@pages = @wiki.pages.find :all, :select => "#{WikiPage.table_name}.*, #{WikiContent.table_name}.updated_on",
:joins => "LEFT JOIN #{WikiContent.table_name} ON #{WikiContent.table_name}.page_id = #{WikiPage.table_name}.id",
:order => 'title'
@pages_by_date = @pages.group_by {|p| p.updated_on.to_date}
# export wiki to a single html file
when 'export'
verify :method => :delete, :only => [:destroy], :redirect_to => { :action => :show }
# Removes a wiki page and its history
# Children can be either set as root pages, removed or reassigned to another parent page
def destroy
return render_403 unless editable?
@descendants_count = @page.descendants.size
if @descendants_count > 0
case params[:todo]
when 'nullify'
# Nothing to do
when 'destroy'
# Removes all its descendants
@page.descendants.each(&:destroy)
when 'reassign'
# Reassign children to another parent page
reassign_to = @wiki.pages.find_by_id(params[:reassign_to_id].to_i)
return unless reassign_to
@page.children.each do |child|
child.update_attribute(:parent, reassign_to)
end
else
@reassignable_to = @wiki.pages - @page.self_and_descendants
return
end
end
@page.destroy
redirect_to :action => 'index', :project_id => @project
end
# Export wiki to a single html file
def export
if User.current.allowed_to?(:export_wiki_pages, @project)
@pages = @wiki.pages.find :all, :order => 'title'
export = render_to_string :action => 'export_multiple', :layout => false
send_data(export, :type => 'text/html', :filename => "wiki.html")
return
else
# requested special page doesn't exist, redirect to default page
redirect_to :action => 'index', :id => @project, :page => nil and return
redirect_to :action => 'show', :project_id => @project, :id => nil
end
render :action => "special_#{page_title}"
end
def date_index
load_pages_grouped_by_date_without_content
end
def preview
page = @wiki.find_page(params[:page])
@attachements = page.attachments if page
page = @wiki.find_page(params[:id])
# page is nil when previewing a new page
return render_403 unless page.nil? || editable?(page)
if page
@attachements = page.attachments
@previewed = page.content
end
@text = params[:content][:text]
render :partial => 'common/preview'
end
def add_attachment
@page = @wiki.find_page(params[:page])
attach_files(@page, params[:attachments])
redirect_to :action => 'index', :page => @page.title
end
def destroy_attachment
@page = @wiki.find_page(params[:page])
@page.attachments.find(params[:attachment_id]).destroy
redirect_to :action => 'index', :page => @page.title
return render_403 unless editable?
attachments = Attachment.attach_files(@page, params[:attachments])
render_attachment_warning_if_needed(@page)
redirect_to :action => 'show', :id => @page.title, :project_id => @project
end
private
def find_wiki
@project = Project.find(params[:id])
@project = Project.find(params[:project_id])
@wiki = @project.wiki
render_404 unless @wiki
rescue ActiveRecord::RecordNotFound
render_404
end
# Finds the requested page and returns a 404 error if it doesn't exist
def find_existing_page
@page = @wiki.find_page(params[:id])
render_404 if @page.nil?
end
# Returns true if the current user is allowed to edit the page, otherwise false
def editable?(page = @page)
page.editable_by?(User.current)
end
# Returns the default content of a new wiki page
def initial_page_content(page)
helper = Redmine::WikiFormatting.helper_for(Setting.text_formatting)
extend helper unless self.instance_of?(helper)
helper.instance_method(:initial_page_content).bind(self).call(page)
end
# eager load information about last updates, without loading text
def load_pages_grouped_by_date_without_content
@pages = @wiki.pages.find :all, :select => "#{WikiPage.table_name}.*, #{WikiContent.table_name}.updated_on",
:joins => "LEFT JOIN #{WikiContent.table_name} ON #{WikiContent.table_name}.page_id = #{WikiPage.table_name}.id",
:order => 'title'
@pages_by_date = @pages.group_by {|p| p.updated_on.to_date}
@pages_by_parent_id = @pages.group_by(&:parent_id)
end
end

View File

@@ -16,7 +16,6 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class WikisController < ApplicationController
layout 'base'
menu_item :settings
before_filter :find_project, :authorize
@@ -35,11 +34,4 @@ class WikisController < ApplicationController
redirect_to :controller => 'projects', :action => 'settings', :id => @project, :tab => 'wiki'
end
end
private
def find_project
@project = Project.find(params[:id])
rescue ActiveRecord::RecordNotFound
render_404
end
end

View File

@@ -0,0 +1,91 @@
# Redmine - project management software
# Copyright (C) 2006-2008 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
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class WorkflowsController < ApplicationController
layout 'admin'
before_filter :require_admin
before_filter :find_roles
before_filter :find_trackers
def index
@workflow_counts = Workflow.count_by_tracker_and_role
end
def edit
@role = Role.find_by_id(params[:role_id])
@tracker = Tracker.find_by_id(params[:tracker_id])
if request.post?
Workflow.destroy_all( ["role_id=? and tracker_id=?", @role.id, @tracker.id])
(params[:issue_status] || []).each { |old, news|
news.each { |new|
@role.workflows.build(:tracker_id => @tracker.id, :old_status_id => old, :new_status_id => new)
}
}
if @role.save
flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'edit', :role_id => @role, :tracker_id => @tracker
end
end
@used_statuses_only = (params[:used_statuses_only] == '0' ? false : true)
if @tracker && @used_statuses_only && @tracker.issue_statuses.any?
@statuses = @tracker.issue_statuses
end
@statuses ||= IssueStatus.find(:all, :order => 'position')
end
def copy
if params[:source_tracker_id].blank? || params[:source_tracker_id] == 'any'
@source_tracker = nil
else
@source_tracker = Tracker.find_by_id(params[:source_tracker_id].to_i)
end
if params[:source_role_id].blank? || params[:source_role_id] == 'any'
@source_role = nil
else
@source_role = Role.find_by_id(params[:source_role_id].to_i)
end
@target_trackers = params[:target_tracker_ids].blank? ? nil : Tracker.find_all_by_id(params[:target_tracker_ids])
@target_roles = params[:target_role_ids].blank? ? nil : Role.find_all_by_id(params[:target_role_ids])
if request.post?
if params[:source_tracker_id].blank? || params[:source_role_id].blank? || (@source_tracker.nil? && @source_role.nil?)
flash.now[:error] = l(:error_workflow_copy_source)
elsif @target_trackers.nil? || @target_roles.nil?
flash.now[:error] = l(:error_workflow_copy_target)
else
Workflow.copy(@source_tracker, @source_role, @target_trackers, @target_roles)
flash[:notice] = l(:notice_successful_update)
redirect_to :action => 'copy', :source_tracker_id => @source_tracker, :source_role_id => @source_role
end
end
end
private
def find_roles
@roles = Role.find(:all, :order => 'builtin, position')
end
def find_trackers
@trackers = Tracker.find(:all, :order => 'position')
end
end

View File

@@ -17,7 +17,7 @@
module AdminHelper
def project_status_options_for_select(selected)
options_for_select([[l(:label_all), "*"],
options_for_select([[l(:label_all), ''],
[l(:status_active), 1]], selected)
end
end

File diff suppressed because it is too large Load Diff

View File

@@ -16,10 +16,19 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
module AttachmentsHelper
# displays the links to a collection of attachments
def link_to_attachments(attachments, options = {})
if attachments.any?
render :partial => 'attachments/links', :locals => {:attachments => attachments, :options => options}
# Displays view/delete links to the attachments of the given object
# Options:
# :author -- author names are not displayed if set to false
def link_to_attachments(container, options = {})
options.assert_valid_keys(:author)
if container.attachments.any?
options = {:deletable => container.attachments_deletable?, :author => true}.merge(options)
render :partial => 'attachments/links', :locals => {:attachments => container.attachments, :options => options}
end
end
def to_utf8(str)
str
end
end

View File

@@ -0,0 +1,45 @@
module CalendarsHelper
def link_to_previous_month(year, month, options={})
target_year, target_month = if month == 1
[year - 1, 12]
else
[year, month - 1]
end
name = if target_month == 12
"#{month_name(target_month)} #{target_year}"
else
"#{month_name(target_month)}"
end
link_to_month(('&#171; ' + name), target_year, target_month, options)
end
def link_to_next_month(year, month, options={})
target_year, target_month = if month == 12
[year + 1, 1]
else
[year, month + 1]
end
name = if target_month == 1
"#{month_name(target_month)} #{target_year}"
else
"#{month_name(target_month)}"
end
link_to_month((name + ' &#187;'), target_year, target_month, options)
end
def link_to_month(link_name, year, month, options={})
project_id = options[:project].present? ? options[:project].to_param : nil
link_target = calendar_path(:year => year, :month => month, :project_id => project_id)
link_to_remote(link_name,
{:update => "content", :url => link_target, :method => :put},
{:href => link_target})
end
end

View File

@@ -1,5 +1,5 @@
# redMine - project management software
# Copyright (C) 2006 Jean-Philippe Lang
# Redmine - project management software
# Copyright (C) 2006-2011 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
@@ -18,44 +18,75 @@
module CustomFieldsHelper
def custom_fields_tabs
tabs = [{:name => 'IssueCustomField', :label => :label_issue_plural},
{:name => 'ProjectCustomField', :label => :label_project_plural},
{:name => 'UserCustomField', :label => :label_user_plural}
tabs = [{:name => 'IssueCustomField', :partial => 'custom_fields/index', :label => :label_issue_plural},
{:name => 'TimeEntryCustomField', :partial => 'custom_fields/index', :label => :label_spent_time},
{:name => 'ProjectCustomField', :partial => 'custom_fields/index', :label => :label_project_plural},
{:name => 'VersionCustomField', :partial => 'custom_fields/index', :label => :label_version_plural},
{:name => 'UserCustomField', :partial => 'custom_fields/index', :label => :label_user_plural},
{:name => 'GroupCustomField', :partial => 'custom_fields/index', :label => :label_group_plural},
{:name => 'TimeEntryActivityCustomField', :partial => 'custom_fields/index', :label => TimeEntryActivity::OptionName},
{:name => 'IssuePriorityCustomField', :partial => 'custom_fields/index', :label => IssuePriority::OptionName},
{:name => 'DocumentCategoryCustomField', :partial => 'custom_fields/index', :label => DocumentCategory::OptionName}
]
end
# Return custom field html tag corresponding to its format
def custom_field_tag(custom_value)
def custom_field_tag(name, custom_value)
custom_field = custom_value.custom_field
field_name = "custom_fields[#{custom_field.id}]"
field_id = "custom_fields_#{custom_field.id}"
case custom_field.field_format
field_name = "#{name}[custom_field_values][#{custom_field.id}]"
field_id = "#{name}_custom_field_values_#{custom_field.id}"
field_format = Redmine::CustomFieldFormat.find_by_name(custom_field.field_format)
case field_format.try(:edit_as)
when "date"
text_field('custom_value', 'value', :name => field_name, :id => field_id, :size => 10) +
text_field_tag(field_name, custom_value.value, :id => field_id, :size => 10) +
calendar_for(field_id)
when "text"
text_area 'custom_value', 'value', :name => field_name, :id => field_id, :rows => 3, :style => 'width:99%'
text_area_tag(field_name, custom_value.value, :id => field_id, :rows => 3, :style => 'width:90%')
when "bool"
check_box 'custom_value', 'value', :name => field_name, :id => field_id
hidden_field_tag(field_name, '0') + check_box_tag(field_name, '1', custom_value.true?, :id => field_id)
when "list"
select 'custom_value', 'value', custom_field.possible_values, { :include_blank => true }, :name => field_name, :id => field_id
blank_option = custom_field.is_required? ?
(custom_field.default_value.blank? ? "<option value=\"\">--- #{l(:actionview_instancetag_blank_option)} ---</option>" : '') :
'<option></option>'
select_tag(field_name, blank_option + options_for_select(custom_field.possible_values, custom_value.value), :id => field_id)
else
text_field 'custom_value', 'value', :name => field_name, :id => field_id
text_field_tag(field_name, custom_value.value, :id => field_id)
end
end
# Return custom field label tag
def custom_field_label_tag(custom_value)
def custom_field_label_tag(name, custom_value)
content_tag "label", custom_value.custom_field.name +
(custom_value.custom_field.is_required? ? " <span class=\"required\">*</span>" : ""),
:for => "custom_fields_#{custom_value.custom_field.id}",
:for => "#{name}_custom_field_values_#{custom_value.custom_field.id}",
:class => (custom_value.errors.empty? ? nil : "error" )
end
# Return custom field tag with its label tag
def custom_field_tag_with_label(custom_value)
custom_field_label_tag(custom_value) + custom_field_tag(custom_value)
def custom_field_tag_with_label(name, custom_value)
custom_field_label_tag(name, custom_value) + custom_field_tag(name, custom_value)
end
def custom_field_tag_for_bulk_edit(name, custom_field)
field_name = "#{name}[custom_field_values][#{custom_field.id}]"
field_id = "#{name}_custom_field_values_#{custom_field.id}"
field_format = Redmine::CustomFieldFormat.find_by_name(custom_field.field_format)
case field_format.try(:edit_as)
when "date"
text_field_tag(field_name, '', :id => field_id, :size => 10) +
calendar_for(field_id)
when "text"
text_area_tag(field_name, '', :id => field_id, :rows => 3, :style => 'width:90%')
when "bool"
select_tag(field_name, options_for_select([[l(:label_no_change_option), ''],
[l(:general_text_yes), '1'],
[l(:general_text_no), '0']]), :id => field_id)
when "list"
select_tag(field_name, options_for_select([[l(:label_no_change_option), '']] + custom_field.possible_values), :id => field_id)
else
text_field_tag(field_name, '', :id => field_id)
end
end
# Return a string used to display a custom value
@@ -66,19 +97,22 @@ module CustomFieldsHelper
# Return a string used to display a custom value
def format_value(value, field_format)
return "" unless value && !value.empty?
case field_format
when "date"
begin; format_date(value.to_date); rescue; value end
when "bool"
l_YesNo(value == "1")
else
value
end
Redmine::CustomFieldFormat.format_value(value, field_format) # Proxy
end
# Return an array of custom field formats which can be used in select_tag
def custom_field_formats_for_select
CustomField::FIELD_FORMATS.sort {|a,b| a[1][:order]<=>b[1][:order]}.collect { |k| [ l(k[1][:name]), k[0] ] }
Redmine::CustomFieldFormat.as_select
end
# Renders the custom_values in api views
def render_api_custom_values(custom_values, api)
api.array :custom_fields do
custom_values.each do |custom_value|
api.custom_field :id => custom_value.custom_field_id, :name => custom_value.custom_field.name do
api.value custom_value.value
end
end
end unless custom_values.empty?
end
end

View File

@@ -0,0 +1,49 @@
# redMine - project management software
# Copyright (C) 2006 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
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
module GanttHelper
def gantt_zoom_link(gantt, in_or_out)
case in_or_out
when :in
if gantt.zoom < 4
link_to_remote(l(:text_zoom_in),
{:url => gantt.params.merge(:zoom => (gantt.zoom+1)), :method => :get, :update => 'content'},
{:href => url_for(gantt.params.merge(:zoom => (gantt.zoom+1))),
:class => 'icon icon-zoom-in'})
else
content_tag('span', l(:text_zoom_in), :class => 'icon icon-zoom-in')
end
when :out
if gantt.zoom > 1
link_to_remote(l(:text_zoom_out),
{:url => gantt.params.merge(:zoom => (gantt.zoom-1)), :method => :get, :update => 'content'},
{:href => url_for(gantt.params.merge(:zoom => (gantt.zoom-1))),
:class => 'icon icon-zoom-out'})
else
content_tag('span', l(:text_zoom_out), :class => 'icon icon-zoom-out')
end
end
end
def number_of_issues_on_versions(gantt)
versions = gantt.events.collect {|event| (event.is_a? Version) ? event : nil}.compact
versions.sum {|v| v.fixed_issues.for_gantt.with_query(@query).count}
end
end

View File

@@ -0,0 +1,34 @@
# Redmine - project management software
# Copyright (C) 2006-2009 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
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
module GroupsHelper
# Options for the new membership projects combo-box
def options_for_membership_project_select(user, projects)
options = content_tag('option', "--- #{l(:actionview_instancetag_blank_option)} ---")
options << project_tree_options_for_select(projects) do |p|
{:disabled => (user.projects.include?(p))}
end
options
end
def group_settings_tabs
tabs = [{:name => 'general', :partial => 'groups/general', :label => :label_general},
{:name => 'users', :partial => 'groups/users', :label => :label_user_plural},
{:name => 'memberships', :partial => 'groups/memberships', :label => :label_project_plural}
]
end
end

View File

@@ -1,85 +0,0 @@
# redMine - project management software
# Copyright (C) 2006 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
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
require 'iconv'
require 'rfpdf/chinese'
module IfpdfHelper
class IFPDF < FPDF
include GLoc
attr_accessor :footer_date
def initialize(lang)
super()
set_language_if_valid lang
case current_language.to_s
when 'ja'
extend(PDF_Japanese)
AddSJISFont()
@font_for_content = 'SJIS'
@font_for_footer = 'SJIS'
when 'zh'
extend(PDF_Chinese)
AddGBFont()
@font_for_content = 'GB'
@font_for_footer = 'GB'
when 'zh-tw'
extend(PDF_Chinese)
AddBig5Font()
@font_for_content = 'Big5'
@font_for_footer = 'Big5'
else
@font_for_content = 'Arial'
@font_for_footer = 'Helvetica'
end
SetCreator("redMine #{Redmine::VERSION}")
SetFont(@font_for_content)
end
def SetFontStyle(style, size)
SetFont(@font_for_content, style, size)
end
def Cell(w,h=0,txt='',border=0,ln=0,align='',fill=0,link='')
@ic ||= Iconv.new(l(:general_pdf_encoding), 'UTF-8')
# these quotation marks are not correctly rendered in the pdf
txt = txt.gsub(/[“”]/, '"') if txt
txt = begin
# 0x5c char handling
txtar = txt.split('\\')
txtar << '' if txt[-1] == ?\\
txtar.collect {|x| @ic.iconv(x)}.join('\\').gsub(/\\/, "\\\\\\\\")
rescue
txt
end || ''
super w,h,txt,border,ln,align,fill,link
end
def Footer
SetFont(@font_for_footer, 'I', 8)
SetY(-15)
SetX(15)
Cell(0, 5, @footer_date, 0, 0, 'L')
SetY(-15)
SetX(-30)
Cell(0, 5, PageNo().to_s + '/{nb}', 0, 0, 'C')
end
end
end

View File

@@ -0,0 +1,2 @@
module IssueMovesHelper
end

View File

@@ -15,47 +15,126 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
require 'csv'
module IssuesHelper
include ApplicationHelper
def issue_list(issues, &block)
ancestors = []
issues.each do |issue|
while (ancestors.any? && !issue.is_descendant_of?(ancestors.last))
ancestors.pop
end
yield issue, ancestors.size
ancestors << issue unless issue.leaf?
end
end
# Renders a HTML/CSS tooltip
#
# To use, a trigger div is needed. This is a div with the class of "tooltip"
# that contains this method wrapped in a span with the class of "tip"
#
# <div class="tooltip"><%= link_to_issue(issue) %>
# <span class="tip"><%= render_issue_tooltip(issue) %></span>
# </div>
#
def render_issue_tooltip(issue)
@cached_label_status ||= l(:field_status)
@cached_label_start_date ||= l(:field_start_date)
@cached_label_due_date ||= l(:field_due_date)
@cached_label_assigned_to ||= l(:field_assigned_to)
@cached_label_priority ||= l(:field_priority)
link_to_issue(issue) + ": #{h(issue.subject)}<br /><br />" +
@cached_label_project ||= l(:field_project)
link_to_issue(issue) + "<br /><br />" +
"<strong>#{@cached_label_project}</strong>: #{link_to_project(issue.project)}<br />" +
"<strong>#{@cached_label_status}</strong>: #{issue.status.name}<br />" +
"<strong>#{@cached_label_start_date}</strong>: #{format_date(issue.start_date)}<br />" +
"<strong>#{@cached_label_due_date}</strong>: #{format_date(issue.due_date)}<br />" +
"<strong>#{@cached_label_assigned_to}</strong>: #{issue.assigned_to}<br />" +
"<strong>#{@cached_label_priority}</strong>: #{issue.priority.name}"
end
def render_issue_subject_with_tree(issue)
s = ''
issue.ancestors.each do |ancestor|
s << '<div>' + content_tag('p', link_to_issue(ancestor))
end
s << '<div>' + content_tag('h3', h(issue.subject))
s << '</div>' * (issue.ancestors.size + 1)
s
end
def render_descendants_tree(issue)
s = '<form><table class="list issues">'
issue_list(issue.descendants.sort_by(&:lft)) do |child, level|
s << content_tag('tr',
content_tag('td', check_box_tag("ids[]", child.id, false, :id => nil), :class => 'checkbox') +
content_tag('td', link_to_issue(child, :truncate => 60), :class => 'subject') +
content_tag('td', h(child.status)) +
content_tag('td', link_to_user(child.assigned_to)) +
content_tag('td', progress_bar(child.done_ratio, :width => '80px')),
:class => "issue issue-#{child.id} hascontextmenu #{level > 0 ? "idnt idnt-#{level}" : nil}")
end
s << '</form></table>'
s
end
def render_custom_fields_rows(issue)
return if issue.custom_field_values.empty?
ordered_values = []
half = (issue.custom_field_values.size / 2.0).ceil
half.times do |i|
ordered_values << issue.custom_field_values[i]
ordered_values << issue.custom_field_values[i + half]
end
s = "<tr>\n"
n = 0
ordered_values.compact.each do |value|
s << "</tr>\n<tr>\n" if n > 0 && (n % 2) == 0
s << "\t<th>#{ h(value.custom_field.name) }:</th><td>#{ simple_format_without_paragraph(h(show_value(value))) }</td>\n"
n += 1
end
s << "</tr>\n"
s
end
def sidebar_queries
unless @sidebar_queries
# User can see public queries and his own queries
visible = ARCondition.new(["is_public = ? OR user_id = ?", true, (User.current.logged? ? User.current.id : 0)])
# Project specific queries and global queries
visible << (@project.nil? ? ["project_id IS NULL"] : ["project_id IS NULL OR project_id = ?", @project.id])
@sidebar_queries = Query.find(:all,
:select => 'id, name',
:order => "name ASC",
:conditions => visible.conditions)
end
@sidebar_queries
end
def show_detail(detail, no_html=false)
case detail.property
when 'attr'
label = l(("field_" + detail.prop_key.to_s.gsub(/\_id$/, "")).to_sym)
case detail.prop_key
when 'due_date', 'start_date'
field = detail.prop_key.to_s.gsub(/\_id$/, "")
label = l(("field_" + field).to_sym)
case
when ['due_date', 'start_date'].include?(detail.prop_key)
value = format_date(detail.value.to_date) if detail.value
old_value = format_date(detail.old_value.to_date) if detail.old_value
when 'status_id'
s = IssueStatus.find_by_id(detail.value) and value = s.name if detail.value
s = IssueStatus.find_by_id(detail.old_value) and old_value = s.name if detail.old_value
when 'assigned_to_id'
u = User.find_by_id(detail.value) and value = u.name if detail.value
u = User.find_by_id(detail.old_value) and old_value = u.name if detail.old_value
when 'priority_id'
e = Enumeration.find_by_id(detail.value) and value = e.name if detail.value
e = Enumeration.find_by_id(detail.old_value) and old_value = e.name if detail.old_value
when 'category_id'
c = IssueCategory.find_by_id(detail.value) and value = c.name if detail.value
c = IssueCategory.find_by_id(detail.old_value) and old_value = c.name if detail.old_value
when 'fixed_version_id'
v = Version.find_by_id(detail.value) and value = v.name if detail.value
v = Version.find_by_id(detail.old_value) and old_value = v.name if detail.old_value
when ['project_id', 'status_id', 'tracker_id', 'assigned_to_id', 'priority_id', 'category_id', 'fixed_version_id'].include?(detail.prop_key)
value = find_name_by_reflection(field, detail.value)
old_value = find_name_by_reflection(field, detail.old_value)
when detail.prop_key == 'estimated_hours'
value = "%0.02f" % detail.value.to_f unless detail.value.blank?
old_value = "%0.02f" % detail.old_value.to_f unless detail.old_value.blank?
when detail.prop_key == 'parent_id'
label = l(:field_parent_issue)
value = "##{detail.value}" unless detail.value.blank?
old_value = "##{detail.old_value}" unless detail.old_value.blank?
end
when 'cf'
custom_field = CustomField.find_by_id(detail.prop_key)
@@ -67,7 +146,8 @@ module IssuesHelper
when 'attachment'
label = l(:label_attachment)
end
call_hook(:helper_issues_show_detail_after_setting, {:detail => detail, :label => label, :value => value, :old_value => old_value })
label ||= detail.prop_key
value ||= detail.value
old_value ||= detail.old_value
@@ -76,9 +156,9 @@ module IssuesHelper
label = content_tag('strong', label)
old_value = content_tag("i", h(old_value)) if detail.old_value
old_value = content_tag("strike", old_value) if detail.old_value and (!detail.value or detail.value.empty?)
if detail.property == 'attachment' && !value.blank? && Attachment.find_by_id(detail.prop_key)
if detail.property == 'attachment' && !value.blank? && a = Attachment.find_by_id(detail.prop_key)
# Link to the attachment if it has not been removed
value = link_to(value, :controller => 'attachments', :action => 'download', :id => detail.prop_key)
value = link_to_attachment(a)
else
value = content_tag("i", h(value)) if value
end
@@ -88,27 +168,45 @@ module IssuesHelper
case detail.property
when 'attr', 'cf'
if !detail.old_value.blank?
label + " " + l(:text_journal_changed, old_value, value)
l(:text_journal_changed, :label => label, :old => old_value, :new => value)
else
label + " " + l(:text_journal_set_to, value)
l(:text_journal_set_to, :label => label, :value => value)
end
when 'attachment'
"#{label} #{value} #{l(:label_added)}"
l(:text_journal_added, :label => label, :value => value)
end
else
case detail.property
when 'attr', 'cf'
label + " " + l(:text_journal_deleted) + " (#{old_value})"
when 'attachment'
"#{label} #{old_value} #{l(:label_deleted)}"
l(:text_journal_deleted, :label => label, :old => old_value)
end
end
# Find the name of an associated record stored in the field attribute
def find_name_by_reflection(field, id)
association = Issue.reflect_on_association(field.to_sym)
if association
record = association.class_name.constantize.find_by_id(id)
return record.name if record
end
end
# Renders issue children recursively
def render_api_issue_children(issue, api)
return if issue.leaf?
api.array :children do
issue.children.each do |child|
api.issue(:id => child.id) do
api.tracker(:id => child.tracker_id, :name => child.tracker.name) unless child.tracker.nil?
api.subject child.subject
render_api_issue_children(child, api)
end
end
end
end
def issues_to_csv(issues, project = nil)
ic = Iconv.new(l(:general_csv_encoding), 'UTF-8')
export = StringIO.new
CSV::Writer.generate(export, l(:general_csv_separator)) do |csv|
decimal_separator = l(:general_csv_decimal_separator)
export = FCSV.generate(:col_sep => l(:general_csv_separator)) do |csv|
# csv header fields
headers = [ "#",
l(:field_status),
@@ -124,12 +222,13 @@ module IssuesHelper
l(:field_due_date),
l(:field_done_ratio),
l(:field_estimated_hours),
l(:field_parent_issue),
l(:field_created_on),
l(:field_updated_on)
]
# Export project custom fields if project is given
# otherwise export custom fields marked as "For all projects"
custom_fields = project.nil? ? IssueCustomField.for_all : project.all_custom_fields
custom_fields = project.nil? ? IssueCustomField.for_all : project.all_issue_custom_fields
custom_fields.each {|f| headers << f.name}
# Description in the last column
headers << l(:field_description)
@@ -149,7 +248,8 @@ module IssuesHelper
format_date(issue.start_date),
format_date(issue.due_date),
issue.done_ratio,
issue.estimated_hours,
issue.estimated_hours.to_s.gsub('.', decimal_separator),
issue.parent_id,
format_time(issue.created_on),
format_time(issue.updated_on)
]
@@ -158,7 +258,6 @@ module IssuesHelper
csv << fields.collect {|c| begin; ic.iconv(c.to_s); rescue; c.to_s; end }
end
end
export.rewind
export
end
end

View File

@@ -16,18 +16,23 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
module JournalsHelper
def render_notes(journal, options={})
def render_notes(issue, journal, options={})
content = ''
editable = journal.editable_by?(User.current)
if editable && !journal.notes.blank?
links = []
editable = User.current.logged? && (User.current.allowed_to?(:edit_issue_notes, issue.project) || (journal.user == User.current && User.current.allowed_to?(:edit_own_issue_notes, issue.project)))
links = []
if !journal.notes.blank?
links << link_to_remote(image_tag('comment.png'),
{ :url => {:controller => 'journals', :action => 'new', :id => issue, :journal_id => journal} },
:title => l(:button_quote)) if options[:reply_links]
links << link_to_in_place_notes_editor(image_tag('edit.png'), "journal-#{journal.id}-notes",
{ :controller => 'journals', :action => 'edit', :id => journal },
:title => l(:button_edit))
content << content_tag('div', links.join(' '), :class => 'contextual')
:title => l(:button_edit)) if editable
end
content << content_tag('div', links.join(' '), :class => 'contextual') unless links.empty?
content << textilizable(journal, :notes)
content_tag('div', content, :id => "journal-#{journal.id}-notes", :class => (editable ? 'wiki editable' : 'wiki'))
css_classes = "wiki"
css_classes << " editable" if editable
content_tag('div', content, :id => "journal-#{journal.id}-notes", :class => css_classes)
end
def link_to_in_place_notes_editor(text, field_id, url, options={})

View File

@@ -0,0 +1,19 @@
# redMine - project management software
# Copyright (C) 2006-2008 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
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
module MailHandlerHelper
end

View File

@@ -19,10 +19,11 @@ module MessagesHelper
def link_to_message(message)
return '' unless message
link_to h(truncate(message.subject, 60)), :controller => 'messages',
link_to h(truncate(message.subject, :length => 60)), :controller => 'messages',
:action => 'show',
:board_id => message.board_id,
:id => message.root,
:r => (message.parent_id && message.id),
:anchor => (message.parent_id ? "message-#{message.id}" : nil)
end
end

View File

@@ -18,15 +18,7 @@
module ProjectsHelper
def link_to_version(version, options = {})
return '' unless version && version.is_a?(Version)
link_to h(version.name), { :controller => 'versions', :action => 'show', :id => version }, options
end
def format_activity_day(date)
date == Date.today ? l(:label_today).titleize : format_date(date)
end
def format_activity_description(text)
h(truncate(text, 250))
link_to_if version.visible?, format_version_name(version), { :controller => 'versions', :action => 'show', :id => version }, options
end
def project_settings_tabs
@@ -37,158 +29,80 @@ module ProjectsHelper
{:name => 'categories', :action => :manage_categories, :partial => 'projects/settings/issue_categories', :label => :label_issue_category_plural},
{:name => 'wiki', :action => :manage_wiki, :partial => 'projects/settings/wiki', :label => :label_wiki},
{:name => 'repository', :action => :manage_repository, :partial => 'projects/settings/repository', :label => :label_repository},
{:name => 'boards', :action => :manage_boards, :partial => 'projects/settings/boards', :label => :label_board_plural}
{:name => 'boards', :action => :manage_boards, :partial => 'projects/settings/boards', :label => :label_board_plural},
{:name => 'activities', :action => :manage_project_activities, :partial => 'projects/settings/activities', :label => :enumeration_activities}
]
tabs.select {|tab| User.current.allowed_to?(tab[:action], @project)}
end
# Generates a gantt image
# Only defined if RMagick is avalaible
def gantt_image(events, date_from, months, zoom)
date_to = (date_from >> months)-1
show_weeks = zoom > 1
show_days = zoom > 2
subject_width = 320
header_heigth = 18
# width of one day in pixels
zoom = zoom*2
g_width = (date_to - date_from + 1)*zoom
g_height = 20 * events.length + 20
headers_heigth = (show_weeks ? 2*header_heigth : header_heigth)
height = g_height + headers_heigth
imgl = Magick::ImageList.new
imgl.new_image(subject_width+g_width+1, height)
gc = Magick::Draw.new
# Subjects
top = headers_heigth + 20
gc.fill('black')
gc.stroke('transparent')
gc.stroke_width(1)
events.each do |i|
gc.text(4, top + 2, (i.is_a?(Issue) ? i.subject : i.name))
top = top + 20
end
# Months headers
month_f = date_from
left = subject_width
months.times do
width = ((month_f >> 1) - month_f) * zoom
gc.fill('white')
gc.stroke('grey')
gc.stroke_width(1)
gc.rectangle(left, 0, left + width, height)
gc.fill('black')
gc.stroke('transparent')
gc.stroke_width(1)
gc.text(left.round + 8, 14, "#{month_f.year}-#{month_f.month}")
left = left + width
month_f = month_f >> 1
def parent_project_select_tag(project)
selected = project.parent
# retrieve the requested parent project
parent_id = (params[:project] && params[:project][:parent_id]) || params[:parent_id]
if parent_id
selected = (parent_id.blank? ? nil : Project.find(parent_id))
end
# Weeks headers
if show_weeks
left = subject_width
height = header_heigth
if date_from.cwday == 1
# date_from is monday
week_f = date_from
else
# find next monday after date_from
week_f = date_from + (7 - date_from.cwday + 1)
width = (7 - date_from.cwday + 1) * zoom
gc.fill('white')
gc.stroke('grey')
gc.stroke_width(1)
gc.rectangle(left, header_heigth, left + width, 2*header_heigth + g_height-1)
left = left + width
end
while week_f <= date_to
width = (week_f + 6 <= date_to) ? 7 * zoom : (date_to - week_f + 1) * zoom
gc.fill('white')
gc.stroke('grey')
gc.stroke_width(1)
gc.rectangle(left.round, header_heigth, left.round + width, 2*header_heigth + g_height-1)
gc.fill('black')
gc.stroke('transparent')
gc.stroke_width(1)
gc.text(left.round + 2, header_heigth + 14, week_f.cweek.to_s)
left = left + width
week_f = week_f+7
end
end
# Days details (week-end in grey)
if show_days
left = subject_width
height = g_height + header_heigth - 1
wday = date_from.cwday
(date_to - date_from + 1).to_i.times do
width = zoom
gc.fill(wday == 6 || wday == 7 ? '#eee' : 'white')
gc.stroke('grey')
gc.stroke_width(1)
gc.rectangle(left, 2*header_heigth, left + width, 2*header_heigth + g_height-1)
left = left + width
wday = wday + 1
wday = 1 if wday > 7
end
end
# border
gc.fill('transparent')
gc.stroke('grey')
gc.stroke_width(1)
gc.rectangle(0, 0, subject_width+g_width, headers_heigth)
gc.stroke('black')
gc.rectangle(0, 0, subject_width+g_width, g_height+ headers_heigth-1)
# content
top = headers_heigth + 20
gc.stroke('transparent')
events.each do |i|
if i.is_a?(Issue)
i_start_date = (i.start_date >= date_from ? i.start_date : date_from )
i_end_date = (i.due_date <= date_to ? i.due_date : date_to )
i_done_date = i.start_date + ((i.due_date - i.start_date+1)*i.done_ratio/100).floor
i_done_date = (i_done_date <= date_from ? date_from : i_done_date )
i_done_date = (i_done_date >= date_to ? date_to : i_done_date )
i_late_date = [i_end_date, Date.today].min if i_start_date < Date.today
i_left = subject_width + ((i_start_date - date_from)*zoom).floor
i_width = ((i_end_date - i_start_date + 1)*zoom).floor # total width of the issue
d_width = ((i_done_date - i_start_date)*zoom).floor # done width
l_width = i_late_date ? ((i_late_date - i_start_date+1)*zoom).floor : 0 # delay width
options = ''
options << "<option value=''></option>" if project.allowed_parents.include?(nil)
options << project_tree_options_for_select(project.allowed_parents.compact, :selected => selected)
content_tag('select', options, :name => 'project[parent_id]', :id => 'project_parent_id')
end
gc.fill('grey')
gc.rectangle(i_left, top, i_left + i_width, top - 6)
gc.fill('red')
gc.rectangle(i_left, top, i_left + l_width, top - 6) if l_width > 0
gc.fill('blue')
gc.rectangle(i_left, top, i_left + d_width, top - 6) if d_width > 0
gc.fill('black')
gc.text(i_left + i_width + 5,top + 1, "#{i.status.name} #{i.done_ratio}%")
else
i_left = subject_width + ((i.start_date - date_from)*zoom).floor
gc.fill('green')
gc.rectangle(i_left, top, i_left + 6, top - 6)
gc.fill('black')
gc.text(i_left + 11, top + 1, i.name)
# Renders a tree of projects as a nested set of unordered lists
# The given collection may be a subset of the whole project tree
# (eg. some intermediate nodes are private and can not be seen)
def render_project_hierarchy(projects)
s = ''
if projects.any?
ancestors = []
original_project = @project
projects.each do |project|
# set the project environment to please macros.
@project = project
if (ancestors.empty? || project.is_descendant_of?(ancestors.last))
s << "<ul class='projects #{ ancestors.empty? ? 'root' : nil}'>\n"
else
ancestors.pop
s << "</li>"
while (ancestors.any? && !project.is_descendant_of?(ancestors.last))
ancestors.pop
s << "</ul></li>\n"
end
end
classes = (ancestors.empty? ? 'root' : 'child')
s << "<li class='#{classes}'><div class='#{classes}'>" +
link_to_project(project, {}, :class => "project #{User.current.member_of?(project) ? 'my-project' : nil}")
s << "<div class='wiki description'>#{textilizable(project.short_description, :project => project)}</div>" unless project.description.blank?
s << "</div>\n"
ancestors << project
end
top = top + 20
s << ("</li></ul>\n" * ancestors.size)
@project = original_project
end
s
end
# Returns a set of options for a select field, grouped by project.
def version_options_for_select(versions, selected=nil)
grouped = Hash.new {|h,k| h[k] = []}
versions.each do |version|
grouped[version.project.name] << [version.name, version.id]
end
# Add in the selected
if selected && !versions.include?(selected)
grouped[selected.project.name] << [selected.name, selected.id]
end
# today red line
if Date.today >= date_from and Date.today <= date_to
gc.stroke('red')
x = (Date.today-date_from+1)*zoom + subject_width
gc.line(x, headers_heigth, x, headers_heigth + g_height-1)
end
gc.draw(imgl)
imgl
end if Object.const_defined?(:Magick)
if grouped.keys.size > 1
grouped_options_for_select(grouped, selected && selected.id)
else
options_for_select((grouped.values.first || []), selected && selected.id)
end
end
def format_version_sharing(sharing)
sharing = 'none' unless Version::VERSION_SHARINGS.include?(sharing)
l("label_version_sharing_#{sharing}")
end
end

View File

@@ -22,31 +22,77 @@ module QueriesHelper
end
def column_header(column)
column.sortable ? sort_header_tag(column.sortable, :caption => column.caption,
:default_order => column.default_order) :
column.sortable ? sort_header_tag(column.name.to_s, :caption => column.caption,
:default_order => column.default_order) :
content_tag('th', column.caption)
end
def column_content(column, issue)
if column.is_a?(QueryCustomFieldColumn)
cv = issue.custom_values.detect {|v| v.custom_field_id == column.custom_field.id}
show_value(cv)
else
value = issue.send(column.name)
if value.is_a?(Date)
format_date(value)
elsif value.is_a?(Time)
format_time(value)
value = column.value(issue)
case value.class.name
when 'String'
if column.name == :subject
link_to(h(value), :controller => 'issues', :action => 'show', :id => issue)
else
case column.name
when :subject
h((@project.nil? || @project != issue.project) ? "#{issue.project.name} - " : '') +
link_to(h(value), :controller => 'issues', :action => 'show', :id => issue)
when :done_ratio
progress_bar(value, :width => '80px')
h(value)
end
when 'Time'
format_time(value)
when 'Date'
format_date(value)
when 'Fixnum', 'Float'
if column.name == :done_ratio
progress_bar(value, :width => '80px')
else
value.to_s
end
when 'User'
link_to_user value
when 'Project'
link_to_project value
when 'Version'
link_to(h(value), :controller => 'versions', :action => 'show', :id => value)
when 'TrueClass'
l(:general_text_Yes)
when 'FalseClass'
l(:general_text_No)
when 'Issue'
link_to_issue(value, :subject => false)
else
h(value)
end
end
# Retrieve query from session or build a new query
def retrieve_query
if !params[:query_id].blank?
cond = "project_id IS NULL"
cond << " OR project_id = #{@project.id}" if @project
@query = Query.find(params[:query_id], :conditions => cond)
@query.project = @project
session[:query] = {:id => @query.id, :project_id => @query.project_id}
sort_clear
else
if api_request? || params[:set_filter] || session[:query].nil? || session[:query][:project_id] != (@project ? @project.id : nil)
# Give it a name, required to be valid
@query = Query.new(:name => "_")
@query.project = @project
if params[:fields]
@query.filters = {}
@query.add_filters(params[:fields], params[:operators], params[:values])
else
h(value)
@query.available_filters.keys.each do |field|
@query.add_short_filter(field, params[field]) if params[field]
end
end
@query.group_by = params[:group_by]
@query.column_names = params[:query] && params[:query][:column_names]
session[:query] = {:project_id => @query.project_id, :filters => @query.filters, :group_by => @query.group_by, :column_names => @query.column_names}
else
@query = Query.find_by_id(session[:query][:id]) if session[:query][:id]
@query ||= Query.new(:name => "_", :project => @project, :filters => session[:query][:filters], :group_by => session[:query][:group_by], :column_names => session[:query][:column_names])
@query.project = @project
end
end
end

View File

@@ -15,18 +15,105 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
require 'coderay'
require 'coderay/helpers/file_type'
require 'iconv'
module RepositoriesHelper
def syntax_highlight(name, content)
type = CodeRay::FileType[name]
type ? CodeRay.scan(content, type).html : h(content)
def format_revision(revision)
if revision.respond_to? :format_identifier
revision.format_identifier
else
revision.to_s
end
end
def format_revision(txt)
txt.to_s[0,8]
def truncate_at_line_break(text, length = 255)
if text
text.gsub(%r{^(.{#{length}}[^\n]*)\n.+$}m, '\\1...')
end
end
def render_properties(properties)
unless properties.nil? || properties.empty?
content = ''
properties.keys.sort.each do |property|
content << content_tag('li', "<b>#{h property}</b>: <span>#{h properties[property]}</span>")
end
content_tag('ul', content, :class => 'properties')
end
end
def render_changeset_changes
changes = @changeset.changes.find(:all, :limit => 1000, :order => 'path').collect do |change|
case change.action
when 'A'
# Detects moved/copied files
if !change.from_path.blank?
change.action = @changeset.changes.detect {|c| c.action == 'D' && c.path == change.from_path} ? 'R' : 'C'
end
change
when 'D'
@changeset.changes.detect {|c| c.from_path == change.path} ? nil : change
else
change
end
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[path] ||= {}
p = p[path]
end
p[:c] = change
end
render_changes_tree(tree[:s])
end
def render_changes_tree(tree)
return '' if tree.nil?
output = ''
output << '<ul>'
tree.keys.sort.each do |file|
style = 'change'
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.identifier)
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.identifier) unless c.action == 'D'
text << " - #{c.revision}" unless c.revision.blank?
text << ' (' + link_to('diff', :controller => 'repositories',
:action => 'diff',
:id => @project,
:path => path_param,
:rev => @changeset.identifier) + ') ' 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
end
output << '</ul>'
output
end
def to_utf8(str)
@@ -44,27 +131,33 @@ module RepositoriesHelper
def repository_field_tags(form, repository)
method = repository.class.name.demodulize.underscore + "_field_tags"
send(method, form, repository) if repository.is_a?(Repository) && respond_to?(method)
send(method, form, repository) if repository.is_a?(Repository) && respond_to?(method) && method != 'repository_field_tags'
end
def scm_select_tag(repository)
container = [[]]
REDMINE_SUPPORTED_SCM.each {|scm| container << ["Repository::#{scm}".constantize.scm_name, scm]}
scm_options = [["--- #{l(:actionview_instancetag_blank_option)} ---", '']]
Redmine::Scm::Base.all.each do |scm|
scm_options << ["Repository::#{scm}".constantize.scm_name, scm] if Setting.enabled_scm.include?(scm) || (repository && repository.class.name.demodulize == scm)
end
select_tag('repository_scm',
options_for_select(container, repository.class.name.demodulize),
options_for_select(scm_options, repository.class.name.demodulize),
:disabled => (repository && !repository.new_record?),
:onchange => remote_function(:url => { :controller => 'repositories', :action => 'edit', :id => @project }, :method => :get, :with => "Form.serialize(this.form)")
)
end
def with_leading_slash(path)
path ||= ''
path.starts_with?('/') ? path : "/#{path}"
path.to_s.starts_with?('/') ? path : "/#{path}"
end
def without_leading_slash(path)
path.gsub(%r{^/+}, '')
end
def subversion_field_tags(form, repository)
content_tag('p', form.text_field(:url, :size => 60, :required => true, :disabled => (repository && !repository.root_url.blank?)) +
'<br />(http://, https://, svn://, file:///)') +
'<br />(file:///, http://, https://, svn://, svn+[tunnelscheme]://)') +
content_tag('p', form.text_field(:login, :size => 30)) +
content_tag('p', form.password_field(:password, :size => 30, :name => 'ignore',
:value => ((repository.new_record? || repository.password.blank?) ? '' : ('x'*15)),
@@ -92,4 +185,8 @@ module RepositoriesHelper
def bazaar_field_tags(form, repository)
content_tag('p', form.text_field(:url, :label => 'Root directory', :size => 60, :required => true, :disabled => (repository && !repository.new_record?)))
end
def filesystem_field_tags(form, repository)
content_tag('p', form.text_field(:url, :label => 'Root directory', :size => 60, :required => true, :disabled => (repository && !repository.root_url.blank?)))
end
end

View File

@@ -18,7 +18,8 @@
module SearchHelper
def highlight_tokens(text, tokens)
return text unless text && tokens && !tokens.empty?
regexp = Regexp.new "(#{tokens.join('|')})", Regexp::IGNORECASE
re_tokens = tokens.collect {|t| Regexp.escape(t)}
regexp = Regexp.new "(#{re_tokens.join('|')})", Regexp::IGNORECASE
result = ''
text.split(regexp).each_with_index do |words, i|
if result.length > 1200
@@ -26,8 +27,9 @@ module SearchHelper
result << '...'
break
end
words = words.mb_chars
if i.even?
result << h(words.length > 100 ? "#{words[0..44]} ... #{words[-45..-1]}" : words)
result << h(words.length > 100 ? "#{words.slice(0..44)} ... #{words.slice(-45..-1)}" : words)
else
t = (tokens.index(words.downcase) || 0) % 4
result << content_tag('span', h(words), :class => "highlight token-#{t}")
@@ -35,4 +37,28 @@ module SearchHelper
end
result
end
def type_label(t)
l("label_#{t.singularize}_plural", :default => t.to_s.humanize)
end
def project_select_tag
options = [[l(:label_project_all), 'all']]
options << [l(:label_my_projects), 'my_projects'] unless User.current.memberships.empty?
options << [l(:label_and_its_subprojects, @project.name), 'subprojects'] unless @project.nil? || @project.descendants.active.empty?
options << [@project.name, ''] unless @project.nil?
select_tag('scope', options_for_select(options, params[:scope].to_s)) if options.size > 1
end
def render_results_by_type(results_by_type)
links = []
# Sorts types by results count
results_by_type.keys.sort {|a, b| results_by_type[b] <=> results_by_type[a]}.each do |t|
c = results_by_type[t]
next if c == 0
text = "#{type_label(t)} (#{c})"
links << link_to(text, :q => params[:q], :titles_only => params[:title_only], :all_words => params[:all_words], :scope => params[:scope], t => 1)
end
('<ul>' + links.map {|link| content_tag('li', link)}.join(' ') + '</ul>') unless links.empty?
end
end

View File

@@ -1,5 +1,5 @@
# redMine - project management software
# Copyright (C) 2006-2007 Jean-Philippe Lang
# Redmine - project management software
# Copyright (C) 2006-2009 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
@@ -18,10 +18,67 @@
module SettingsHelper
def administration_settings_tabs
tabs = [{:name => 'general', :partial => 'settings/general', :label => :label_general},
{:name => 'display', :partial => 'settings/display', :label => :label_display},
{:name => 'authentication', :partial => 'settings/authentication', :label => :label_authentication},
{:name => 'projects', :partial => 'settings/projects', :label => :label_project_plural},
{:name => 'issues', :partial => 'settings/issues', :label => :label_issue_tracking},
{:name => 'notifications', :partial => 'settings/notifications', :label => l(:field_mail_notification)},
{:name => 'notifications', :partial => 'settings/notifications', :label => :field_mail_notification},
{:name => 'mail_handler', :partial => 'settings/mail_handler', :label => :label_incoming_emails},
{:name => 'repositories', :partial => 'settings/repositories', :label => :label_repository_plural}
]
end
def setting_select(setting, choices, options={})
if blank_text = options.delete(:blank)
choices = [[blank_text.is_a?(Symbol) ? l(blank_text) : blank_text, '']] + choices
end
setting_label(setting, options) +
select_tag("settings[#{setting}]", options_for_select(choices, Setting.send(setting).to_s), options)
end
def setting_multiselect(setting, choices, options={})
setting_values = Setting.send(setting)
setting_values = [] unless setting_values.is_a?(Array)
setting_label(setting, options) +
hidden_field_tag("settings[#{setting}][]", '') +
choices.collect do |choice|
text, value = (choice.is_a?(Array) ? choice : [choice, choice])
content_tag('label',
check_box_tag("settings[#{setting}][]", value, Setting.send(setting).include?(value)) + text.to_s,
:class => 'block'
)
end.join
end
def setting_text_field(setting, options={})
setting_label(setting, options) +
text_field_tag("settings[#{setting}]", Setting.send(setting), options)
end
def setting_text_area(setting, options={})
setting_label(setting, options) +
text_area_tag("settings[#{setting}]", Setting.send(setting), options)
end
def setting_check_box(setting, options={})
setting_label(setting, options) +
hidden_field_tag("settings[#{setting}]", 0) +
check_box_tag("settings[#{setting}]", 1, Setting.send("#{setting}?"), options)
end
def setting_label(setting, options={})
label = options.delete(:label)
label != false ? content_tag("label", l(label || "setting_#{setting}")) : ''
end
# Renders a notification field for a Redmine::Notifiable option
def notification_field(notifiable)
return content_tag(:label,
check_box_tag('settings[notified_events][]',
notifiable.name,
Setting.notified_events.include?(notifiable.name)) +
l_or_humanize(notifiable.name, :prefix => 'label_'),
:class => notifiable.parent.present? ? "parent" : '')
end
end

View File

@@ -1,11 +1,12 @@
# Helpers to sort tables using clickable column headers.
#
# Author: Stuart Rackham <srackham@methods.co.nz>, March 2005.
# Jean-Philippe Lang, 2009
# License: This source code is released under the MIT license.
#
# - Consecutive clicks toggle the column's sort order.
# - Sort state is maintained by a session hash entry.
# - Icon image identifies sort column and state.
# - CSS classes identify sort column and state.
# - Typically used in conjunction with the Pagination module.
#
# Example code snippets:
@@ -17,7 +18,7 @@
#
# def list
# sort_init 'last_name'
# sort_update
# sort_update %w(first_name last_name)
# @items = Contact.find_all nil, sort_clause
# end
#
@@ -28,7 +29,7 @@
#
# def list
# sort_init 'last_name'
# sort_update
# sort_update %w(first_name last_name)
# @contact_pages, @items = paginate :contacts,
# :order_by => sort_clause,
# :per_page => 10
@@ -45,77 +46,170 @@
# </tr>
# </thead>
#
# - The ascending and descending sort icon images are sort_asc.png and
# sort_desc.png and reside in the application's images directory.
# - Introduces instance variables: @sort_name, @sort_default.
# - Introduces params :sort_key and :sort_order.
# - Introduces instance variables: @sort_default, @sort_criteria
# - Introduces param :sort
#
module SortHelper
# Initializes the default sort column (default_key) and sort order
# (default_order).
module SortHelper
class SortCriteria
def initialize
@criteria = []
end
def available_criteria=(criteria)
unless criteria.is_a?(Hash)
criteria = criteria.inject({}) {|h,k| h[k] = k; h}
end
@available_criteria = criteria
end
def from_param(param)
@criteria = param.to_s.split(',').collect {|s| s.split(':')[0..1]}
normalize!
end
def criteria=(arg)
@criteria = arg
normalize!
end
def to_param
@criteria.collect {|k,o| k + (o ? '' : ':desc')}.join(',')
end
def to_sql
sql = @criteria.collect do |k,o|
if s = @available_criteria[k]
(o ? s.to_a : s.to_a.collect {|c| append_desc(c)}).join(', ')
end
end.compact.join(', ')
sql.blank? ? nil : sql
end
def add!(key, asc)
@criteria.delete_if {|k,o| k == key}
@criteria = [[key, asc]] + @criteria
normalize!
end
def add(*args)
r = self.class.new.from_param(to_param)
r.add!(*args)
r
end
def first_key
@criteria.first && @criteria.first.first
end
def first_asc?
@criteria.first && @criteria.first.last
end
def empty?
@criteria.empty?
end
private
def normalize!
@criteria ||= []
@criteria = @criteria.collect {|s| s = s.to_a; [s.first, (s.last == false || s.last == 'desc') ? false : true]}
@criteria = @criteria.select {|k,o| @available_criteria.has_key?(k)} if @available_criteria
@criteria.slice!(3)
self
end
# Appends DESC to the sort criterion unless it has a fixed order
def append_desc(criterion)
if criterion =~ / (asc|desc)$/i
criterion
else
"#{criterion} DESC"
end
end
end
def sort_name
controller_name + '_' + action_name + '_sort'
end
# Initializes the default sort.
# Examples:
#
# sort_init 'name'
# sort_init 'id', 'desc'
# sort_init ['name', ['id', 'desc']]
# sort_init [['name', 'desc'], ['id', 'desc']]
#
# - default_key is a column attribute name.
# - default_order is 'asc' or 'desc'.
# - name is the name of the session hash entry that stores the sort state,
# defaults to '<controller_name>_sort'.
#
def sort_init(default_key, default_order='asc', name=nil)
@sort_name = name || params[:controller] + params[:action] + '_sort'
@sort_default = {:key => default_key, :order => default_order}
def sort_init(*args)
case args.size
when 1
@sort_default = args.first.is_a?(Array) ? args.first : [[args.first]]
when 2
@sort_default = [[args.first, args.last]]
else
raise ArgumentError
end
end
# Updates the sort state. Call this in the controller prior to calling
# sort_clause.
# - criteria can be either an array or a hash of allowed keys
#
def sort_update()
if params[:sort_key]
sort = {:key => params[:sort_key], :order => params[:sort_order]}
elsif session[@sort_name]
sort = session[@sort_name] # Previous sort.
else
sort = @sort_default
end
session[@sort_name] = sort
def sort_update(criteria)
@sort_criteria = SortCriteria.new
@sort_criteria.available_criteria = criteria
@sort_criteria.from_param(params[:sort] || session[sort_name])
@sort_criteria.criteria = @sort_default if @sort_criteria.empty?
session[sort_name] = @sort_criteria.to_param
end
# Clears the sort criteria session data
#
def sort_clear
session[sort_name] = nil
end
# Returns an SQL sort clause corresponding to the current sort state.
# Use this to sort the controller's table items collection.
#
def sort_clause()
session[@sort_name][:key] + ' ' + session[@sort_name][:order]
@sort_criteria.to_sql
end
# Returns a link which sorts by the named column.
#
# - column is the name of an attribute in the sorted record collection.
# - The optional caption explicitly specifies the displayed link text.
# - A sort icon image is positioned to the right of the sort link.
# - the optional caption explicitly specifies the displayed link text.
# - 2 CSS classes reflect the state of the link: sort and asc or desc
#
def sort_link(column, caption, default_order)
key, order = session[@sort_name][:key], session[@sort_name][:order]
if key == column
if order.downcase == 'asc'
icon = 'sort_asc.png'
css, order = nil, default_order
if column.to_s == @sort_criteria.first_key
if @sort_criteria.first_asc?
css = 'sort asc'
order = 'desc'
else
icon = 'sort_desc.png'
css = 'sort desc'
order = 'asc'
end
else
icon = nil
order = default_order
end
caption = titleize(Inflector::humanize(column)) unless caption
caption = column.to_s.humanize unless caption
sort_options = { :sort_key => column, :sort_order => order }
sort_options = { :sort => @sort_criteria.add(column.to_s, order).to_param }
# don't reuse params if filters are present
url_options = params.has_key?(:set_filter) ? sort_options : params.merge(sort_options)
# Add project_id to url_options
url_options = url_options.merge(:project_id => params[:project_id]) if params.has_key?(:project_id)
link_to_remote(caption,
{:update => "content", :url => url_options},
{:href => url_for(url_options)}) +
(icon ? nbsp(2) + image_tag(icon) : '')
{:update => "content", :url => url_options, :method => :get},
{:href => url_for(url_options),
:class => css})
end
# Returns a table header <th> tag with a sort link for the named column
@@ -131,30 +225,11 @@ module SortHelper
#
# <%= sort_header_tag('id', :title => 'Sort by contact ID', :width => 40) %>
#
# Renders:
#
# <th title="Sort by contact ID" width="40">
# <a href="/contact/list?sort_order=desc&amp;sort_key=id">Id</a>
# &nbsp;&nbsp;<img alt="Sort_asc" src="/images/sort_asc.png" />
# </th>
#
def sort_header_tag(column, options = {})
caption = options.delete(:caption) || titleize(Inflector::humanize(column))
caption = options.delete(:caption) || column.to_s.humanize
default_order = options.delete(:default_order) || 'asc'
options[:title]= l(:label_sort_by, "\"#{caption}\"") unless options[:title]
options[:title] = l(:label_sort_by, "\"#{caption}\"") unless options[:title]
content_tag('th', sort_link(column, caption, default_order), options)
end
private
# Return n non-breaking spaces.
def nbsp(n)
'&nbsp;' * n
end
# Return capitalized title.
def titleize(title)
title.split.map {|w| w.capitalize }.join(' ')
end
end

View File

@@ -16,8 +16,49 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
module TimelogHelper
include ApplicationHelper
def render_timelog_breadcrumb
links = []
links << link_to(l(:label_project_all), {:project_id => nil, :issue_id => nil})
links << link_to(h(@project), {:project_id => @project, :issue_id => nil}) if @project
if @issue
if @issue.visible?
links << link_to_issue(@issue, :subject => false)
else
links << "##{@issue.id}"
end
end
breadcrumb links
end
# Returns a collection of activities for a select field. time_entry
# is optional and will be used to check if the selected TimeEntryActivity
# is active.
def activity_collection_for_select_options(time_entry=nil, project=nil)
project ||= @project
if project.nil?
activities = TimeEntryActivity.shared.active
else
activities = project.activities
end
collection = []
if time_entry && time_entry.activity && !time_entry.activity.active?
collection << [ "--- #{l(:actionview_instancetag_blank_option)} ---", '' ]
else
collection << [ "--- #{l(:actionview_instancetag_blank_option)} ---", '' ] unless activities.detect(&:is_default)
end
activities.each { |a| collection << [a.name, a.id] }
collection
end
def select_hours(data, criteria, value)
data.select {|row| row[criteria] == value}
if value.to_s.empty?
data.select {|row| row[criteria].blank? }
else
data.select {|row| row[criteria].to_s == value.to_s}
end
end
def sum_hours(data)
@@ -44,8 +85,9 @@ module TimelogHelper
def entries_to_csv(entries)
ic = Iconv.new(l(:general_csv_encoding), 'UTF-8')
export = StringIO.new
CSV::Writer.generate(export, l(:general_csv_separator)) do |csv|
decimal_separator = l(:general_csv_decimal_separator)
custom_fields = TimeEntryCustomField.find(:all)
export = FCSV.generate(:col_sep => l(:general_csv_separator)) do |csv|
# csv header fields
headers = [l(:field_spent_on),
l(:field_user),
@@ -57,23 +99,92 @@ module TimelogHelper
l(:field_hours),
l(:field_comments)
]
# Export custom fields
headers += custom_fields.collect(&:name)
csv << headers.collect {|c| begin; ic.iconv(c.to_s); rescue; c.to_s; end }
# csv lines
entries.each do |entry|
fields = [l_date(entry.spent_on),
fields = [format_date(entry.spent_on),
entry.user,
entry.activity,
entry.project,
(entry.issue ? entry.issue.id : nil),
(entry.issue ? entry.issue.tracker : nil),
(entry.issue ? entry.issue.subject : nil),
entry.hours,
entry.hours.to_s.gsub('.', decimal_separator),
entry.comments
]
fields += custom_fields.collect {|f| show_value(entry.custom_value_for(f)) }
csv << fields.collect {|c| begin; ic.iconv(c.to_s); rescue; c.to_s; end }
end
end
export.rewind
export
end
def format_criteria_value(criteria, value)
if value.blank?
l(:label_none)
elsif k = @available_criterias[criteria][:klass]
obj = k.find_by_id(value.to_i)
if obj.is_a?(Issue)
obj.visible? ? "#{obj.tracker} ##{obj.id}: #{obj.subject}" : "##{obj.id}"
else
obj
end
else
format_value(value, @available_criterias[criteria][:format])
end
end
def report_to_csv(criterias, periods, hours)
export = FCSV.generate(:col_sep => l(:general_csv_separator)) do |csv|
# Column headers
headers = criterias.collect {|criteria| l(@available_criterias[criteria][:label]) }
headers += periods
headers << l(:label_total)
csv << headers.collect {|c| to_utf8(c) }
# Content
report_criteria_to_csv(csv, criterias, periods, hours)
# Total row
row = [ l(:label_total) ] + [''] * (criterias.size - 1)
total = 0
periods.each do |period|
sum = sum_hours(select_hours(hours, @columns, period.to_s))
total += sum
row << (sum > 0 ? "%.2f" % sum : '')
end
row << "%.2f" %total
csv << row
end
export
end
def report_criteria_to_csv(csv, criterias, periods, hours, level=0)
hours.collect {|h| h[criterias[level]].to_s}.uniq.each do |value|
hours_for_value = select_hours(hours, criterias[level], value)
next if hours_for_value.empty?
row = [''] * level
row << to_utf8(format_criteria_value(criterias[level], value))
row += [''] * (criterias.length - level - 1)
total = 0
periods.each do |period|
sum = sum_hours(select_hours(hours_for_value, @columns, period.to_s))
total += sum
row << (sum > 0 ? "%.2f" % sum : '')
end
row << "%.2f" %total
csv << row
if criterias.length > level + 1
report_criteria_to_csv(csv, criterias, periods, hours_for_value, level + 1)
end
end
end
def to_utf8(s)
@ic ||= Iconv.new(l(:general_csv_encoding), 'UTF-8')
begin; @ic.iconv(s.to_s); rescue; s.to_s; end
end
end

View File

@@ -16,10 +16,46 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
module UsersHelper
def status_options_for_select(selected)
def users_status_options_for_select(selected)
user_count_by_status = User.count(:group => 'status').to_hash
options_for_select([[l(:label_all), ''],
[l(:status_active), 1],
[l(:status_registered), 2],
[l(:status_locked), 3]], selected)
["#{l(:status_active)} (#{user_count_by_status[1].to_i})", 1],
["#{l(:status_registered)} (#{user_count_by_status[2].to_i})", 2],
["#{l(:status_locked)} (#{user_count_by_status[3].to_i})", 3]], selected)
end
# Options for the new membership projects combo-box
def options_for_membership_project_select(user, projects)
options = content_tag('option', "--- #{l(:actionview_instancetag_blank_option)} ---")
options << project_tree_options_for_select(projects) do |p|
{:disabled => (user.projects.include?(p))}
end
options
end
def user_mail_notification_options(user)
user.valid_notification_options.collect {|o| [l(o.last), o.first]}
end
def change_status_link(user)
url = {:controller => 'users', :action => 'update', :id => user, :page => params[:page], :status => params[:status], :tab => nil}
if user.locked?
link_to l(:button_unlock), url.merge(:user => {:status => User::STATUS_ACTIVE}), :method => :put, :class => 'icon icon-unlock'
elsif user.registered?
link_to l(:button_activate), url.merge(:user => {:status => User::STATUS_ACTIVE}), :method => :put, :class => 'icon icon-unlock'
elsif user != User.current
link_to l(:button_lock), url.merge(:user => {:status => User::STATUS_LOCKED}), :method => :put, :class => 'icon icon-lock'
end
end
def user_settings_tabs
tabs = [{:name => 'general', :partial => 'users/general', :label => :label_general},
{:name => 'memberships', :partial => 'users/memberships', :label => :label_project_plural}
]
if Group.all.any?
tabs.insert 1, {:name => 'groups', :partial => 'users/groups', :label => :label_group_plural}
end
tabs
end
end

View File

@@ -16,21 +16,54 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
module WatchersHelper
def watcher_tag(object, user)
content_tag("span", watcher_link(object, user), :id => 'watcher')
# Valid options
# * :id - the element id
# * :replace - a string or array of element ids that will be
# replaced
def watcher_tag(object, user, options={:replace => 'watcher'})
id = options[:id]
id ||= options[:replace] if options[:replace].is_a? String
content_tag("span", watcher_link(object, user, options), :id => id)
end
def watcher_link(object, user)
# Valid options
# * :replace - a string or array of element ids that will be
# replaced
def watcher_link(object, user, options={:replace => 'watcher'})
return '' unless user && user.logged? && object.respond_to?('watched_by?')
watched = object.watched_by?(user)
url = {:controller => 'watchers',
:action => (watched ? 'remove' : 'add'),
:action => (watched ? 'unwatch' : 'watch'),
:object_type => object.class.to_s.underscore,
:object_id => object.id}
:object_id => object.id,
:replace => options[:replace]}
link_to_remote((watched ? l(:button_unwatch) : l(:button_watch)),
{:url => url},
:href => url_for(url),
:class => (watched ? 'icon icon-fav' : 'icon icon-fav-off'))
end
# Returns a comma separated list of users watching the given object
def watchers_list(object)
remove_allowed = User.current.allowed_to?("delete_#{object.class.name.underscore}_watchers".to_sym, object.project)
lis = object.watcher_users.collect do |user|
s = avatar(user, :size => "16").to_s + link_to_user(user, :class => 'user').to_s
if remove_allowed
url = {:controller => 'watchers',
:action => 'destroy',
:object_type => object.class.to_s.underscore,
:object_id => object.id,
:user_id => user}
s += ' ' + link_to_remote(image_tag('delete.png'),
{:url => url},
:href => url_for(url),
:style => "vertical-align: middle",
:class => "delete")
end
"<li>#{ s }</li>"
end
lis.empty? ? "" : "<ul>#{ lis.join("\n") }</ul>"
end
end

View File

@@ -16,7 +16,20 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
module WikiHelper
def wiki_page_options_for_select(pages, selected = nil, parent = nil, level = 0)
s = ''
pages.select {|p| p.parent == parent}.each do |page|
attrs = "value='#{page.id}'"
attrs << " selected='selected'" if selected == page
indent = (level > 0) ? ('&nbsp;' * level * 2 + '&#187; ') : nil
s << "<option #{attrs}>#{indent}#{h page.pretty_title}</option>\n" +
wiki_page_options_for_select(pages, selected, page, level + 1)
end
s
end
def html_diff(wdiff)
words = wdiff.words.collect{|word| h(word)}
words_add = 0
@@ -36,7 +49,7 @@ module WikiHelper
words_add += 1
else
del_at = pos unless del_at
deleted << ' ' + change[2]
deleted << ' ' + h(change[2])
words_del += 1
end
end

View File

@@ -0,0 +1,19 @@
# Redmine - project management software
# Copyright (C) 2006-2008 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
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
module WorkflowsHelper
end

View File

@@ -26,57 +26,80 @@ class Attachment < ActiveRecord::Base
validates_length_of :disk_filename, :maximum => 255
acts_as_event :title => :filename,
:url => Proc.new {|o| {:controller => 'attachments', :action => 'download', :id => o.id}}
:url => Proc.new {|o| {:controller => 'attachments', :action => 'download', :id => o.id, :filename => o.filename}}
acts_as_activity_provider :type => 'files',
:permission => :view_files,
:author_key => :author_id,
:find_options => {:select => "#{Attachment.table_name}.*",
:joins => "LEFT JOIN #{Version.table_name} ON #{Attachment.table_name}.container_type='Version' AND #{Version.table_name}.id = #{Attachment.table_name}.container_id " +
"LEFT JOIN #{Project.table_name} ON #{Version.table_name}.project_id = #{Project.table_name}.id OR ( #{Attachment.table_name}.container_type='Project' AND #{Attachment.table_name}.container_id = #{Project.table_name}.id )"}
acts_as_activity_provider :type => 'documents',
:permission => :view_documents,
:author_key => :author_id,
:find_options => {:select => "#{Attachment.table_name}.*",
:joins => "LEFT JOIN #{Document.table_name} ON #{Attachment.table_name}.container_type='Document' AND #{Document.table_name}.id = #{Attachment.table_name}.container_id " +
"LEFT JOIN #{Project.table_name} ON #{Document.table_name}.project_id = #{Project.table_name}.id"}
cattr_accessor :storage_path
@@storage_path = "#{RAILS_ROOT}/files"
def validate
errors.add_to_base :too_long if self.filesize > Setting.attachment_max_size.to_i.kilobytes
if self.filesize > Setting.attachment_max_size.to_i.kilobytes
errors.add(:base, :too_long, :count => Setting.attachment_max_size.to_i.kilobytes)
end
end
def file=(incomming_file)
unless incomming_file.nil?
@temp_file = incomming_file
if @temp_file.size > 0
self.filename = sanitize_filename(@temp_file.original_filename)
self.disk_filename = DateTime.now.strftime("%y%m%d%H%M%S") + "_" + self.filename
self.content_type = @temp_file.content_type.to_s.chomp
self.filesize = @temp_file.size
end
end
end
def file=(incoming_file)
unless incoming_file.nil?
@temp_file = incoming_file
if @temp_file.size > 0
self.filename = sanitize_filename(@temp_file.original_filename)
self.disk_filename = Attachment.disk_filename(filename)
self.content_type = @temp_file.content_type.to_s.chomp
if content_type.blank?
self.content_type = Redmine::MimeType.of(filename)
end
self.filesize = @temp_file.size
end
end
end
def file
nil
end
# Copy temp file to its final location
def before_save
if @temp_file && (@temp_file.size > 0)
logger.debug("saving '#{self.diskfile}'")
File.open(diskfile, "wb") do |f|
f.write(@temp_file.read)
end
self.digest = Digest::MD5.hexdigest(File.read(diskfile))
end
# Don't save the content type if it's longer than the authorized length
if self.content_type && self.content_type.length > 255
self.content_type = nil
end
end
# Deletes file on the disk
def after_destroy
if self.filename?
File.delete(diskfile) if File.exist?(diskfile)
end
end
# Returns file's location on disk
def diskfile
"#{@@storage_path}/#{self.disk_filename}"
end
def file
nil
end
# Copies the temporary file to its final location
# and computes its MD5 hash
def before_save
if @temp_file && (@temp_file.size > 0)
logger.debug("saving '#{self.diskfile}'")
md5 = Digest::MD5.new
File.open(diskfile, "wb") do |f|
buffer = ""
while (buffer = @temp_file.read(8192))
f.write(buffer)
md5.update(buffer)
end
end
self.digest = md5.hexdigest
end
# Don't save the content type if it's longer than the authorized length
if self.content_type && self.content_type.length > 255
self.content_type = nil
end
end
# Deletes file on the disk
def after_destroy
File.delete(diskfile) if !filename.blank? && File.exist?(diskfile)
end
# Returns file's location on disk
def diskfile
"#{@@storage_path}/#{self.disk_filename}"
end
def increment_download
increment!(:downloads)
@@ -86,19 +109,83 @@ class Attachment < ActiveRecord::Base
container.project
end
def visible?(user=User.current)
container.attachments_visible?(user)
end
def deletable?(user=User.current)
container.attachments_deletable?(user)
end
def image?
self.filename =~ /\.(jpeg|jpg|gif|png)$/i
self.filename =~ /\.(jpe?g|gif|png)$/i
end
def is_text?
Redmine::MimeType.is_type?('text', filename)
end
def is_diff?
self.filename =~ /\.(patch|diff)$/i
end
# Returns true if the file is readable
def readable?
File.readable?(diskfile)
end
# Bulk attaches a set of files to an object
#
# Returns a Hash of the results:
# :files => array of the attached files
# :unsaved => array of the files that could not be attached
def self.attach_files(obj, attachments)
attached = []
if attachments && attachments.is_a?(Hash)
attachments.each_value do |attachment|
file = attachment['file']
next unless file && file.size > 0
a = Attachment.create(:container => obj,
:file => file,
:description => attachment['description'].to_s.strip,
:author => User.current)
if a.new_record?
obj.unsaved_attachments ||= []
obj.unsaved_attachments << a
else
attached << a
end
end
end
{:files => attached, :unsaved => obj.unsaved_attachments}
end
private
def sanitize_filename(value)
# get only the filename, not the whole path
just_filename = value.gsub(/^.*(\\|\/)/, '')
# NOTE: File.basename doesn't work right with Windows paths on Unix
# INCORRECT: just_filename = File.basename(value.gsub('\\\\', '/'))
# get only the filename, not the whole path
just_filename = value.gsub(/^.*(\\|\/)/, '')
# NOTE: File.basename doesn't work right with Windows paths on Unix
# INCORRECT: just_filename = File.basename(value.gsub('\\\\', '/'))
# Finally, replace all non alphanumeric, underscore or periods with underscore
@filename = just_filename.gsub(/[^\w\.\-]/,'_')
# Finally, replace all non alphanumeric, hyphens or periods with underscore
@filename = just_filename.gsub(/[^\w\.\-]/,'_')
end
# Returns an ASCII or hashed filename
def self.disk_filename(filename)
timestamp = DateTime.now.strftime("%y%m%d%H%M%S")
ascii = ''
if filename =~ %r{^[a-zA-Z0-9_\.\-]*$}
ascii = filename
else
ascii = Digest::MD5.hexdigest(filename)
# keep the extension if any
ascii << $1 if filename =~ %r{(\.[a-zA-Z0-9]+)$}
end
while File.exist?(File.join(@@storage_path, "#{timestamp}_#{ascii}"))
timestamp.succ!
end
"#{timestamp}_#{ascii}"
end
end

View File

@@ -20,10 +20,7 @@ class AuthSource < ActiveRecord::Base
validates_presence_of :name
validates_uniqueness_of :name
validates_length_of :name, :host, :maximum => 60
validates_length_of :account_password, :maximum => 60, :allow_nil => true
validates_length_of :account, :base_dn, :maximum => 255
validates_length_of :attr_login, :attr_firstname, :attr_lastname, :attr_mail, :maximum => 30
validates_length_of :name, :maximum => 60
def authenticate(login, password)
end
@@ -35,13 +32,23 @@ class AuthSource < ActiveRecord::Base
"Abstract"
end
def allow_password_changes?
self.class.allow_password_changes?
end
# Does this auth source backend allow password changes?
def self.allow_password_changes?
false
end
# Try to authenticate a user not yet registered against available sources
def self.authenticate(login, password)
AuthSource.find(:all, :conditions => ["onthefly_register=?", true]).each do |source|
begin
logger.debug "Authenticating '#{login}' against '#{source.name}'" if logger && logger.debug?
attrs = source.authenticate(login, password)
rescue
rescue => e
logger.error "Error during authentication: #{e.message}"
attrs = nil
end
return attrs if attrs

View File

@@ -20,7 +20,12 @@ require 'iconv'
class AuthSourceLdap < AuthSource
validates_presence_of :host, :port, :attr_login
validates_presence_of :attr_firstname, :attr_lastname, :attr_mail, :if => Proc.new { |a| a.onthefly_register? }
validates_length_of :name, :host, :account_password, :maximum => 60, :allow_nil => true
validates_length_of :account, :base_dn, :maximum => 255, :allow_nil => true
validates_length_of :attr_login, :attr_firstname, :attr_lastname, :attr_mail, :maximum => 30, :allow_nil => true
validates_numericality_of :port, :only_integer => true
before_validation :strip_ldap_attributes
def after_initialize
self.port = 389 if self.port == 0
@@ -28,30 +33,12 @@ class AuthSourceLdap < AuthSource
def authenticate(login, password)
return nil if login.blank? || password.blank?
attrs = []
# get user's DN
ldap_con = initialize_ldap_con(self.account, self.account_password)
login_filter = Net::LDAP::Filter.eq( self.attr_login, login )
object_filter = Net::LDAP::Filter.eq( "objectClass", "*" )
dn = String.new
ldap_con.search( :base => self.base_dn,
:filter => object_filter & login_filter,
# only ask for the DN if on-the-fly registration is disabled
:attributes=> (onthefly_register? ? ['dn', self.attr_firstname, self.attr_lastname, self.attr_mail] : ['dn'])) do |entry|
dn = entry.dn
attrs = [:firstname => AuthSourceLdap.get_attr(entry, self.attr_firstname),
:lastname => AuthSourceLdap.get_attr(entry, self.attr_lastname),
:mail => AuthSourceLdap.get_attr(entry, self.attr_mail),
:auth_source_id => self.id ] if onthefly_register?
attrs = get_user_dn(login)
if attrs && attrs[:dn] && authenticate_dn(attrs[:dn], password)
logger.debug "Authentication successful for '#{login}'" if logger && logger.debug?
return attrs.except(:dn)
end
return nil if dn.empty?
logger.debug "DN found for #{login}: #{dn}" if logger && logger.debug?
# authenticate user
ldap_con = initialize_ldap_con(dn, password)
return nil unless ldap_con.bind
# return user's attributes
logger.debug "Authentication successful for '#{login}'" if logger && logger.debug?
attrs
rescue Net::LDAP::LdapError => text
raise "LdapError: " + text
end
@@ -68,7 +55,14 @@ class AuthSourceLdap < AuthSource
"LDAP"
end
private
private
def strip_ldap_attributes
[:attr_login, :attr_firstname, :attr_lastname, :attr_mail].each do |attr|
write_attribute(attr, read_attribute(attr).strip) unless read_attribute(attr).nil?
end
end
def initialize_ldap_con(ldap_user, ldap_password)
options = { :host => self.host,
:port => self.port,
@@ -77,8 +71,60 @@ private
options.merge!(:auth => { :method => :simple, :username => ldap_user, :password => ldap_password }) unless ldap_user.blank? && ldap_password.blank?
Net::LDAP.new options
end
def get_user_attributes_from_ldap_entry(entry)
{
:dn => entry.dn,
:firstname => AuthSourceLdap.get_attr(entry, self.attr_firstname),
:lastname => AuthSourceLdap.get_attr(entry, self.attr_lastname),
:mail => AuthSourceLdap.get_attr(entry, self.attr_mail),
:auth_source_id => self.id
}
end
# Return the attributes needed for the LDAP search. It will only
# include the user attributes if on-the-fly registration is enabled
def search_attributes
if onthefly_register?
['dn', self.attr_firstname, self.attr_lastname, self.attr_mail]
else
['dn']
end
end
# Check if a DN (user record) authenticates with the password
def authenticate_dn(dn, password)
if dn.present? && password.present?
initialize_ldap_con(dn, password).bind
end
end
# Get the user's dn and any attributes for them, given their login
def get_user_dn(login)
ldap_con = initialize_ldap_con(self.account, self.account_password)
login_filter = Net::LDAP::Filter.eq( self.attr_login, login )
object_filter = Net::LDAP::Filter.eq( "objectClass", "*" )
attrs = {}
ldap_con.search( :base => self.base_dn,
:filter => object_filter & login_filter,
:attributes=> search_attributes) do |entry|
if onthefly_register?
attrs = get_user_attributes_from_ldap_entry(entry)
else
attrs = {:dn => entry.dn}
end
logger.debug "DN found for #{login}: #{attrs[:dn]}" if logger && logger.debug?
end
attrs
end
def self.get_attr(entry, attr_name)
entry[attr_name].is_a?(Array) ? entry[attr_name].first : entry[attr_name]
if !attr_name.blank?
entry[attr_name].is_a?(Array) ? entry[attr_name].first : entry[attr_name]
end
end
end

View File

@@ -18,7 +18,7 @@
class Board < ActiveRecord::Base
belongs_to :project
has_many :topics, :class_name => 'Message', :conditions => "#{Message.table_name}.parent_id IS NULL", :order => "#{Message.table_name}.created_on DESC"
has_many :messages, :dependent => :delete_all, :order => "#{Message.table_name}.created_on DESC"
has_many :messages, :dependent => :destroy, :order => "#{Message.table_name}.created_on DESC"
belongs_to :last_message, :class_name => 'Message', :foreign_key => :last_message_id
acts_as_list :scope => :project_id
acts_as_watchable
@@ -26,4 +26,25 @@ class Board < ActiveRecord::Base
validates_presence_of :name, :description
validates_length_of :name, :maximum => 30
validates_length_of :description, :maximum => 255
def visible?(user=User.current)
!user.nil? && user.allowed_to?(:view_messages, project)
end
def to_s
name
end
def reset_counters!
self.class.reset_counters!(id)
end
# Updates topics_count, messages_count and last_message_id attributes for +board_id+
def self.reset_counters!(board_id)
board_id = board_id.to_i
update_all("topics_count = (SELECT COUNT(*) FROM #{Message.table_name} WHERE board_id=#{board_id} AND parent_id IS NULL)," +
" messages_count = (SELECT COUNT(*) FROM #{Message.table_name} WHERE board_id=#{board_id})," +
" last_message_id = (SELECT MAX(id) FROM #{Message.table_name} WHERE board_id=#{board_id})",
["id = ?", board_id])
end
end

View File

@@ -19,4 +19,13 @@ class Change < ActiveRecord::Base
belongs_to :changeset
validates_presence_of :changeset_id, :action, :path
before_save :init_path
def relative_path
changeset.repository.relative_path(path)
end
def init_path
self.path ||= ""
end
end

View File

@@ -1,5 +1,5 @@
# redMine - project management software
# Copyright (C) 2006-2007 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
@@ -15,103 +15,141 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
require 'iconv'
class Changeset < ActiveRecord::Base
belongs_to :repository
belongs_to :user
has_many :changes, :dependent => :delete_all
has_and_belongs_to_many :issues
acts_as_event :title => Proc.new {|o| "#{l(:label_revision)} #{o.revision}" + (o.comments.blank? ? '' : (': ' + o.comments))},
:description => :comments,
acts_as_event :title => Proc.new {|o| "#{l(:label_revision)} #{o.format_identifier}" + (o.short_comments.blank? ? '' : (': ' + o.short_comments))},
:description => :long_comments,
:datetime => :committed_on,
:author => :committer,
:url => Proc.new {|o| {:controller => 'repositories', :action => 'revision', :id => o.repository.project_id, :rev => o.revision}}
:url => Proc.new {|o| {:controller => 'repositories', :action => 'revision', :id => o.repository.project, :rev => o.identifier}}
acts_as_searchable :columns => 'comments',
:include => :repository,
:include => {:repository => :project},
:project_key => "#{Repository.table_name}.project_id",
:date_column => 'committed_on'
acts_as_activity_provider :timestamp => "#{table_name}.committed_on",
:author_key => :user_id,
:find_options => {:include => [:user, {:repository => :project}]}
validates_presence_of :repository_id, :revision, :committed_on, :commit_date
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
# Returns the identifier of this changeset; depending on repository backends
def identifier
if repository.class.respond_to? :changeset_identifier
repository.class.changeset_identifier self
else
revision.to_s
end
end
def comments=(comment)
write_attribute(:comments, comment.strip)
write_attribute(:comments, Changeset.normalize_comments(comment))
end
def committed_on=(date)
self.commit_date = date
super
end
# Returns the readable identifier
def format_identifier
if repository.class.respond_to? :format_changeset_identifier
repository.class.format_changeset_identifier self
else
identifier
end
end
def committer=(arg)
write_attribute(:committer, self.class.to_utf8(arg.to_s))
end
def project
repository.project
end
def author
user || committer.to_s.split('<').first
end
def before_create
self.user = repository.find_committer_user(committer)
end
def after_create
scan_comment_for_issue_ids
end
require 'pp'
TIMELOG_RE = /
(
((\d+)(h|hours?))((\d+)(m|min)?)?
|
((\d+)(h|hours?|m|min))
|
(\d+):(\d+)
|
(\d+([\.,]\d+)?)h?
)
/x
def scan_comment_for_issue_ids
return if comments.blank?
# keywords used to reference issues
ref_keywords = Setting.commit_ref_keywords.downcase.split(",").collect(&:strip)
ref_keywords_any = ref_keywords.delete('*')
# 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?
referenced_issues = []
if ref_keywords.delete('*')
# 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)
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)
# update status of issues
logger.debug "Issues fixed by changeset #{self.revision}: #{issue_ids.join(', ')}." if logger && logger.debug?
target_issues.each do |issue|
# the issue may have been updated by the closure of another one (eg. duplicate)
issue.reload
# don't change the status is the issue is closed
next if issue.status.is_closed?
user = committer_user || User.anonymous
csettext = "r#{self.revision}"
if self.scmid && (! (csettext =~ /^r[0-9]+$/))
csettext = "commit:\"#{self.scmid}\""
end
journal = issue.init_journal(user, l(:text_status_changed_by_changeset, csettext))
issue.status = fix_status
issue.done_ratio = done_ratio if done_ratio
issue.save
Mailer.deliver_issue_edit(journal) if Setting.notified_events.include?('issue_updated')
comments.scan(/([\s\(\[,-]|^)((#{kw_regexp})[\s:]+)?(#\d+(\s+@#{TIMELOG_RE})?([\s,;&]+#\d+(\s+@#{TIMELOG_RE})?)*)(?=[[:punct:]]|\s|<|$)/i) do |match|
action, refs = match[2], match[3]
next unless action.present? || ref_keywords_any
refs.scan(/#(\d+)(\s+@#{TIMELOG_RE})?/).each do |m|
issue, hours = find_referenced_issue_by_id(m[0].to_i), m[2]
if issue
referenced_issues << issue
fix_issue(issue) if fix_keywords.include?(action.to_s.downcase)
log_time(issue, hours) if hours && Setting.commit_logtime_enabled?
end
end
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
@short_comments || split_comments.first
end
def long_comments
@long_comments || split_comments.last
end
# Returns the Redmine User corresponding to the committer
def committer_user
if committer && committer.strip =~ /^([^<]+)(<(.*)>)?$/
username, email = $1.strip, $3
u = User.find_by_login(username)
u ||= User.find_by_mail(email) unless email.blank?
u
def text_tag
if scmid?
"commit:#{scmid}"
else
"r#{revision}"
end
end
@@ -124,4 +162,106 @@ class Changeset < ActiveRecord::Base
def next
@next ||= Changeset.find(:first, :conditions => ['id > ? AND repository_id = ?', self.id, self.repository_id], :order => 'id ASC')
end
# Strips and reencodes a commit log before insertion into the database
def self.normalize_comments(str)
to_utf8(str.to_s.strip)
end
# Creates a new Change from it's common parameters
def create_change(change)
Change.create(:changeset => self,
:action => change[:action],
:path => change[:path],
:from_path => change[:from_path],
:from_revision => change[:from_revision])
end
private
# Finds an issue that can be referenced by the commit message
# i.e. an issue that belong to the repository project, a subproject or a parent project
def find_referenced_issue_by_id(id)
return nil if id.blank?
issue = Issue.find_by_id(id.to_i, :include => :project)
if issue
unless issue.project && (project == issue.project || project.is_ancestor_of?(issue.project) || project.is_descendant_of?(issue.project))
issue = nil
end
end
issue
end
def fix_issue(issue)
status = IssueStatus.find_by_id(Setting.commit_fix_status_id.to_i)
if status.nil?
logger.warn("No status macthes commit_fix_status_id setting (#{Setting.commit_fix_status_id})") if logger
return issue
end
# the issue may have been updated by the closure of another one (eg. duplicate)
issue.reload
# don't change the status is the issue is closed
return if issue.status && issue.status.is_closed?
journal = issue.init_journal(user || User.anonymous, ll(Setting.default_language, :text_status_changed_by_changeset, text_tag))
issue.status = status
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 })
unless issue.save
logger.warn("Issue ##{issue.id} could not be saved by changeset #{id}: #{issue.errors.full_messages}") if logger
end
issue
end
def log_time(issue, hours)
time_entry = TimeEntry.new(
:user => user,
:hours => hours,
:issue => issue,
:spent_on => commit_date,
:comments => l(:text_time_logged_by_changeset, :value => text_tag, :locale => Setting.default_language)
)
time_entry.activity = log_time_activity unless log_time_activity.nil?
unless time_entry.save
logger.warn("TimeEntry could not be created by changeset #{id}: #{time_entry.errors.full_messages}") if logger
end
time_entry
end
def log_time_activity
if Setting.commit_logtime_activity_id.to_i > 0
TimeEntryActivity.find_by_id(Setting.commit_logtime_activity_id.to_i)
end
end
def split_comments
comments =~ /\A(.+?)\r?\n(.*)$/m
@short_comments = $1 || comments
@long_comments = $2.to_s.strip
return @short_comments, @long_comments
end
def self.to_utf8(str)
return str if /\A[\r\n\t\x20-\x7e]*\Z/n.match(str) # for us-ascii
encoding = Setting.commit_logs_encoding.to_s.strip
unless encoding.blank? || encoding == 'UTF-8'
begin
str = Iconv.conv('UTF-8', encoding, str)
rescue Iconv::Failure
# do nothing here
end
end
# 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

@@ -20,20 +20,11 @@ class CustomField < ActiveRecord::Base
acts_as_list :scope => 'type = \'#{self.class}\''
serialize :possible_values
FIELD_FORMATS = { "string" => { :name => :label_string, :order => 1 },
"text" => { :name => :label_text, :order => 2 },
"int" => { :name => :label_integer, :order => 3 },
"float" => { :name => :label_float, :order => 4 },
"list" => { :name => :label_list, :order => 5 },
"date" => { :name => :label_date, :order => 6 },
"bool" => { :name => :label_boolean, :order => 7 }
}.freeze
validates_presence_of :name, :field_format
validates_uniqueness_of :name
validates_uniqueness_of :name, :scope => :type
validates_length_of :name, :maximum => 30
validates_format_of :name, :with => /^[\w\s\'\-]*$/i
validates_inclusion_of :field_format, :in => FIELD_FORMATS.keys
validates_format_of :name, :with => /^[\w\s\.\'\-]*$/i
validates_inclusion_of :field_format, :in => Redmine::CustomFieldFormat.available_formats
def initialize(attributes = nil)
super
@@ -41,8 +32,6 @@ class CustomField < ActiveRecord::Base
end
def before_validation
# remove empty values
self.possible_values = self.possible_values.collect{|v| v unless v.empty?}.compact
# make sure these fields are not searchable
self.searchable = false if %w(int float date bool).include?(field_format)
true
@@ -50,23 +39,80 @@ class CustomField < ActiveRecord::Base
def validate
if self.field_format == "list"
errors.add(:possible_values, :activerecord_error_blank) if self.possible_values.nil? || self.possible_values.empty?
errors.add(:possible_values, :activerecord_error_invalid) unless self.possible_values.is_a? Array
errors.add(:possible_values, :blank) if self.possible_values.nil? || self.possible_values.empty?
errors.add(:possible_values, :invalid) unless self.possible_values.is_a? Array
end
# validate default value
v = CustomValue.new(:custom_field => self.clone, :value => default_value, :customized => nil)
v.custom_field.is_required = false
errors.add(:default_value, :activerecord_error_invalid) unless v.valid?
errors.add(:default_value, :invalid) unless v.valid?
end
# Makes possible_values accept a multiline string
def possible_values=(arg)
if arg.is_a?(Array)
write_attribute(:possible_values, arg.compact.collect(&:strip).select {|v| !v.blank?})
else
self.possible_values = arg.to_s.split(/[\n\r]+/)
end
end
def cast_value(value)
casted = nil
unless value.blank?
case field_format
when 'string', 'text', 'list'
casted = value
when 'date'
casted = begin; value.to_date; rescue; nil end
when 'bool'
casted = (value == '1' ? true : false)
when 'int'
casted = value.to_i
when 'float'
casted = value.to_f
end
end
casted
end
# Returns a ORDER BY clause that can used to sort customized
# objects by their value of the custom field.
# Returns false, if the custom field can not be used for sorting.
def order_statement
case field_format
when 'string', 'text', 'list', 'date', 'bool'
# COALESCE is here to make sure that blank and NULL values are sorted equally
"COALESCE((SELECT cv_sort.value FROM #{CustomValue.table_name} cv_sort" +
" WHERE cv_sort.customized_type='#{self.class.customized_class.name}'" +
" AND cv_sort.customized_id=#{self.class.customized_class.table_name}.id" +
" AND cv_sort.custom_field_id=#{id} LIMIT 1), '')"
when 'int', 'float'
# Make the database cast values into numeric
# Postgresql will raise an error if a value can not be casted!
# CustomValue validations should ensure that it doesn't occur
"(SELECT CAST(cv_sort.value AS decimal(60,3)) FROM #{CustomValue.table_name} cv_sort" +
" WHERE cv_sort.customized_type='#{self.class.customized_class.name}'" +
" AND cv_sort.customized_id=#{self.class.customized_class.table_name}.id" +
" AND cv_sort.custom_field_id=#{id} AND cv_sort.value <> '' AND cv_sort.value IS NOT NULL LIMIT 1)"
else
nil
end
end
def <=>(field)
position <=> field.position
end
def self.customized_class
self.name =~ /^(.+)CustomField$/
begin; $1.constantize; rescue nil; end
end
# to move in project_custom_field
def self.for_all
find(:all, :conditions => ["is_for_all=?", true])
find(:all, :conditions => ["is_for_all=?", true], :order => 'position')
end
def type_name

View File

@@ -20,30 +20,51 @@ class CustomValue < ActiveRecord::Base
belongs_to :customized, :polymorphic => true
def after_initialize
if custom_field && new_record? && (customized_type.blank? || (customized && customized.new_record?))
if new_record? && custom_field && (customized_type.blank? || (customized && customized.new_record?))
self.value ||= custom_field.default_value
end
end
# Returns true if the boolean custom value is true
def true?
self.value == '1'
end
def editable?
custom_field.editable?
end
def visible?
custom_field.visible?
end
def required?
custom_field.is_required?
end
def to_s
value.to_s
end
protected
def validate
if value.blank?
errors.add(:value, :activerecord_error_blank) if custom_field.is_required? and value.blank?
errors.add(:value, :blank) if custom_field.is_required? and value.blank?
else
errors.add(:value, :activerecord_error_invalid) unless custom_field.regexp.blank? or value =~ Regexp.new(custom_field.regexp)
errors.add(:value, :activerecord_error_too_short) if custom_field.min_length > 0 and value.length < custom_field.min_length
errors.add(:value, :activerecord_error_too_long) if custom_field.max_length > 0 and value.length > custom_field.max_length
errors.add(:value, :invalid) unless custom_field.regexp.blank? or value =~ Regexp.new(custom_field.regexp)
errors.add(:value, :too_short, :count => custom_field.min_length) if custom_field.min_length > 0 and value.length < custom_field.min_length
errors.add(:value, :too_long, :count => custom_field.max_length) if custom_field.max_length > 0 and value.length > custom_field.max_length
# Format specific validations
case custom_field.field_format
when 'int'
errors.add(:value, :activerecord_error_not_a_number) unless value =~ /^[+-]?\d+$/
errors.add(:value, :not_a_number) unless value =~ /^[+-]?\d+$/
when 'float'
begin; Kernel.Float(value); rescue; errors.add(:value, :activerecord_error_invalid) end
begin; Kernel.Float(value); rescue; errors.add(:value, :invalid) end
when 'date'
errors.add(:value, :activerecord_error_not_a_date) unless value =~ /^\d{4}-\d{2}-\d{2}$/
errors.add(:value, :not_a_date) unless value =~ /^\d{4}-\d{2}-\d{2}$/
when 'list'
errors.add(:value, :activerecord_error_inclusion) unless custom_field.possible_values.include?(value)
errors.add(:value, :inclusion) unless custom_field.possible_values.include?(value)
end
end
end

View File

@@ -17,14 +17,33 @@
class Document < ActiveRecord::Base
belongs_to :project
belongs_to :category, :class_name => "Enumeration", :foreign_key => "category_id"
has_many :attachments, :as => :container, :dependent => :destroy
belongs_to :category, :class_name => "DocumentCategory", :foreign_key => "category_id"
acts_as_attachable :delete_permission => :manage_documents
acts_as_searchable :columns => ['title', 'description']
acts_as_searchable :columns => ['title', "#{table_name}.description"], :include => :project
acts_as_event :title => Proc.new {|o| "#{l(:label_document)}: #{o.title}"},
:author => Proc.new {|o| (a = o.attachments.find(:first, :order => "#{Attachment.table_name}.created_on ASC")) ? a.author : nil },
:url => Proc.new {|o| {:controller => 'documents', :action => 'show', :id => o.id}}
acts_as_activity_provider :find_options => {:include => :project}
validates_presence_of :project, :title, :category
validates_length_of :title, :maximum => 60
def visible?(user=User.current)
!user.nil? && user.allowed_to?(:view_documents, project)
end
def after_initialize
if new_record?
self.category ||= DocumentCategory.default
end
end
def updated_on
unless @updated_on
a = attachments.find(:first, :order => 'created_on DESC')
@updated_on = (a && a.created_on) || created_on
end
@updated_on
end
end

View File

@@ -0,0 +1,34 @@
# redMine - project management software
# Copyright (C) 2006 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
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class DocumentCategory < Enumeration
has_many :documents, :foreign_key => 'category_id'
OptionName = :enumeration_doc_categories
def option_name
OptionName
end
def objects_count
documents.count
end
def transfer_relations(to)
documents.update_all("category_id = #{to.id}")
end
end

View File

@@ -0,0 +1,23 @@
# redMine - project management software
# Copyright (C) 2006 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
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class DocumentCategoryCustomField < CustomField
def type_name
:enumeration_doc_categories
end
end

View File

@@ -15,11 +15,8 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class SysApi < ActionWebService::API::Base
api_method :projects,
:expects => [],
:returns => [[Project]]
api_method :repository_created,
:expects => [:string, :string],
:returns => [:int]
class DocumentObserver < ActiveRecord::Observer
def after_create(document)
Mailer.deliver_document_added(document) if Setting.notified_events.include?('document_added')
end
end

View File

@@ -1,5 +1,5 @@
# redMine - project management software
# Copyright (C) 2006-2007 Jean-Philippe Lang
# Redmine - project management software
# Copyright (C) 2006-2009 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
@@ -20,4 +20,19 @@ class EnabledModule < ActiveRecord::Base
validates_presence_of :name
validates_uniqueness_of :name, :scope => :project_id
after_create :module_enabled
private
# after_create callback used to do things when a module is enabled
def module_enabled
case name
when 'wiki'
# Create a wiki with a default start page
if project && project.wiki.nil?
Wiki.create(:project => project, :start_page => 'Wiki')
end
end
end
end

View File

@@ -16,35 +16,69 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class Enumeration < ActiveRecord::Base
acts_as_list :scope => 'opt = \'#{opt}\''
default_scope :order => "#{Enumeration.table_name}.position ASC"
belongs_to :project
acts_as_list :scope => 'type = \'#{type}\''
acts_as_customizable
acts_as_tree :order => 'position ASC'
before_destroy :check_integrity
validates_presence_of :opt, :name
validates_uniqueness_of :name, :scope => [:opt]
validates_presence_of :name
validates_uniqueness_of :name, :scope => [:type, :project_id]
validates_length_of :name, :maximum => 30
validates_format_of :name, :with => /^[\w\s\'\-]*$/i
OPTIONS = {
"IPRI" => :enumeration_issue_priorities,
"DCAT" => :enumeration_doc_categories,
"ACTI" => :enumeration_activities
}.freeze
def self.get_values(option)
find(:all, :conditions => {:opt => option}, :order => 'position')
named_scope :shared, :conditions => { :project_id => nil }
named_scope :active, :conditions => { :active => true }
def self.default
# Creates a fake default scope so Enumeration.default will check
# it's type. STI subclasses will automatically add their own
# types to the finder.
if self.descends_from_active_record?
find(:first, :conditions => { :is_default => true, :type => 'Enumeration' })
else
# STI classes are
find(:first, :conditions => { :is_default => true })
end
end
def self.default(option)
find(:first, :conditions => {:opt => option, :is_default => true}, :order => 'position')
end
# Overloaded on concrete classes
def option_name
OPTIONS[self.opt]
nil
end
def before_save
Enumeration.update_all("is_default = #{connection.quoted_false}", {:opt => opt}) if is_default?
if is_default? && is_default_changed?
Enumeration.update_all("is_default = #{connection.quoted_false}", {:type => type})
end
end
# Overloaded on concrete classes
def objects_count
0
end
def in_use?
self.objects_count != 0
end
# Is this enumeration overiding a system level enumeration?
def is_override?
!self.parent.nil?
end
alias :destroy_without_reassign :destroy
# Destroy the enumeration
# If a enumeration is specified, objects are reassigned
def destroy(reassign_to = nil)
if reassign_to && reassign_to.is_a?(Enumeration)
self.transfer_relations(reassign_to)
end
destroy_without_reassign
end
def <=>(enumeration)
@@ -52,16 +86,49 @@ class Enumeration < ActiveRecord::Base
end
def to_s; name end
# Returns the Subclasses of Enumeration. Each Subclass needs to be
# required in development mode.
#
# Note: subclasses is protected in ActiveRecord
def self.get_subclasses
@@subclasses[Enumeration]
end
# Does the +new+ Hash override the previous Enumeration?
def self.overridding_change?(new, previous)
if (same_active_state?(new['active'], previous.active)) && same_custom_values?(new,previous)
return false
else
return true
end
end
# Does the +new+ Hash have the same custom values as the previous Enumeration?
def self.same_custom_values?(new, previous)
previous.custom_field_values.each do |custom_value|
if custom_value.value != new["custom_field_values"][custom_value.custom_field_id.to_s]
return false
end
end
return true
end
# Are the new and previous fields equal?
def self.same_active_state?(new, previous)
new = (new == "1" ? true : false)
return new == previous
end
private
def check_integrity
case self.opt
when "IPRI"
raise "Can't delete enumeration" if Issue.find(:first, :conditions => ["priority_id=?", self.id])
when "DCAT"
raise "Can't delete enumeration" if Document.find(:first, :conditions => ["category_id=?", self.id])
when "ACTI"
raise "Can't delete enumeration" if TimeEntry.find(:first, :conditions => ["activity_id=?", self.id])
end
raise "Can't delete enumeration" if self.in_use?
end
end
# Force load the subclasses in development mode
require_dependency 'time_entry_activity'
require_dependency 'document_category'
require_dependency 'issue_priority'

49
app/models/group.rb Normal file
View File

@@ -0,0 +1,49 @@
# Redmine - project management software
# Copyright (C) 2006-2009 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
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class Group < Principal
has_and_belongs_to_many :users, :after_add => :user_added,
:after_remove => :user_removed
acts_as_customizable
validates_presence_of :lastname
validates_uniqueness_of :lastname, :case_sensitive => false
validates_length_of :lastname, :maximum => 30
def to_s
lastname.to_s
end
def user_added(user)
members.each do |member|
next if member.project.nil?
user_member = Member.find_by_project_id_and_user_id(member.project_id, user.id) || Member.new(:project_id => member.project_id, :user_id => user.id)
member.member_roles.each do |member_role|
user_member.member_roles << MemberRole.new(:role => member_role.role, :inherited_from => member_role.id)
end
user_member.save!
end
end
def user_removed(user)
members.each do |member|
MemberRole.find(:all, :include => :member,
:conditions => ["#{Member.table_name}.user_id = ? AND #{MemberRole.table_name}.inherited_from IN (?)", user.id, member.member_role_ids]).each(&:destroy)
end
end
end

View File

@@ -0,0 +1,22 @@
# Redmine - project management software
# Copyright (C) 2006-2009 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
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class GroupCustomField < CustomField
def type_name
:label_group_plural
end
end

View File

@@ -16,77 +16,175 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class Issue < ActiveRecord::Base
include Redmine::SafeAttributes
belongs_to :project
belongs_to :tracker
belongs_to :status, :class_name => 'IssueStatus', :foreign_key => 'status_id'
belongs_to :author, :class_name => 'User', :foreign_key => 'author_id'
belongs_to :assigned_to, :class_name => 'User', :foreign_key => 'assigned_to_id'
belongs_to :fixed_version, :class_name => 'Version', :foreign_key => 'fixed_version_id'
belongs_to :priority, :class_name => 'Enumeration', :foreign_key => 'priority_id'
belongs_to :priority, :class_name => 'IssuePriority', :foreign_key => 'priority_id'
belongs_to :category, :class_name => 'IssueCategory', :foreign_key => 'category_id'
has_many :journals, :as => :journalized, :dependent => :destroy
has_many :attachments, :as => :container, :dependent => :destroy
has_many :time_entries, :dependent => :delete_all
has_many :custom_values, :dependent => :delete_all, :as => :customized
has_many :custom_fields, :through => :custom_values
has_and_belongs_to_many :changesets, :order => "revision ASC"
has_and_belongs_to_many :changesets, :order => "#{Changeset.table_name}.committed_on ASC, #{Changeset.table_name}.id ASC"
has_many :relations_from, :class_name => 'IssueRelation', :foreign_key => 'issue_from_id', :dependent => :delete_all
has_many :relations_to, :class_name => 'IssueRelation', :foreign_key => 'issue_to_id', :dependent => :delete_all
acts_as_nested_set :scope => 'root_id', :dependent => :destroy
acts_as_attachable :after_remove => :attachment_removed
acts_as_customizable
acts_as_watchable
acts_as_searchable :columns => ['subject', 'description'], :with => {:journal => :issue}
acts_as_event :title => Proc.new {|o| "#{o.tracker.name} ##{o.id}: #{o.subject}"},
:url => Proc.new {|o| {:controller => 'issues', :action => 'show', :id => o.id}}
acts_as_searchable :columns => ['subject', "#{table_name}.description", "#{Journal.table_name}.notes"],
:include => [:project, :journals],
# sort by id so that limited eager loading doesn't break with postgresql
:order_column => "#{table_name}.id"
acts_as_event :title => Proc.new {|o| "#{o.tracker.name} ##{o.id} (#{o.status}): #{o.subject}"},
:url => Proc.new {|o| {:controller => 'issues', :action => 'show', :id => o.id}},
:type => Proc.new {|o| 'issue' + (o.closed? ? ' closed' : '') }
validates_presence_of :subject, :description, :priority, :project, :tracker, :author, :status
acts_as_activity_provider :find_options => {:include => [:project, :author, :tracker]},
:author_key => :author_id
DONE_RATIO_OPTIONS = %w(issue_field issue_status)
attr_reader :current_journal
validates_presence_of :subject, :priority, :project, :tracker, :author, :status
validates_length_of :subject, :maximum => 255
validates_inclusion_of :done_ratio, :in => 0..100
validates_numericality_of :estimated_hours, :allow_nil => true
validates_associated :custom_values, :on => :update
named_scope :visible, lambda {|*args| { :include => :project,
:conditions => Project.allowed_to_condition(args.first || User.current, :view_issues) } }
named_scope :open, :conditions => ["#{IssueStatus.table_name}.is_closed = ?", false], :include => :status
named_scope :recently_updated, :order => "#{Issue.table_name}.updated_on DESC"
named_scope :with_limit, lambda { |limit| { :limit => limit} }
named_scope :on_active_project, :include => [:status, :project, :tracker],
:conditions => ["#{Project.table_name}.status=#{Project::STATUS_ACTIVE}"]
named_scope :for_gantt, lambda {
{
:include => [:tracker, :status, :assigned_to, :priority, :project, :fixed_version]
}
}
named_scope :without_version, lambda {
{
:conditions => { :fixed_version_id => nil}
}
}
named_scope :with_query, lambda {|query|
{
:conditions => Query.merge_conditions(query.statement)
}
}
before_create :default_assign
before_save :close_duplicates, :update_done_ratio_from_issue_status
after_save :reschedule_following_issues, :update_nested_set_attributes, :update_parent_attributes, :create_journal
after_destroy :update_parent_attributes
# Returns true if usr or current user is allowed to view the issue
def visible?(usr=nil)
(usr || User.current).allowed_to?(:view_issues, self.project)
end
def after_initialize
if new_record?
# set default values for new records only
self.status ||= IssueStatus.default
self.priority ||= Enumeration.default('IPRI')
self.priority ||= IssuePriority.default
end
end
# Overrides Redmine::Acts::Customizable::InstanceMethods#available_custom_fields
def available_custom_fields
(project && tracker) ? project.all_issue_custom_fields.select {|c| tracker.custom_fields.include? c } : []
end
def copy_from(arg)
issue = arg.is_a?(Issue) ? arg : Issue.find(arg)
self.attributes = issue.attributes.dup
self.custom_values = issue.custom_values.collect {|v| v.clone}
issue = arg.is_a?(Issue) ? arg : Issue.visible.find(arg)
self.attributes = issue.attributes.dup.except("id", "root_id", "parent_id", "lft", "rgt", "created_on", "updated_on")
self.custom_field_values = issue.custom_field_values.inject({}) {|h,v| h[v.custom_field_id] = v.value; h}
self.status = issue.status
self
end
# Move an issue to a new project and tracker
def move_to(new_project, new_tracker = nil)
transaction do
if new_project && project_id != new_project.id
# delete issue relations
unless Setting.cross_project_issue_relations?
self.relations_from.clear
self.relations_to.clear
end
# issue is moved to another project
self.category = nil
self.fixed_version = nil
self.project = new_project
# Moves/copies an issue to a new project and tracker
# Returns the moved/copied issue on success, false on failure
def move_to_project(*args)
ret = Issue.transaction do
move_to_project_without_transaction(*args) || raise(ActiveRecord::Rollback)
end || false
end
def move_to_project_without_transaction(new_project, new_tracker = nil, options = {})
options ||= {}
issue = options[:copy] ? self.class.new.copy_from(self) : self
if new_project && issue.project_id != new_project.id
# delete issue relations
unless Setting.cross_project_issue_relations?
issue.relations_from.clear
issue.relations_to.clear
end
if new_tracker
self.tracker = new_tracker
# issue is moved to another project
# reassign to the category with same name if any
new_category = issue.category.nil? ? nil : new_project.issue_categories.find_by_name(issue.category.name)
issue.category = new_category
# Keep the fixed_version if it's still valid in the new_project
unless new_project.shared_versions.include?(issue.fixed_version)
issue.fixed_version = nil
end
if save
# Manually update project_id on related time entries
TimeEntry.update_all("project_id = #{new_project.id}", {:issue_id => id})
else
rollback_db_transaction
return false
issue.project = new_project
if issue.parent && issue.parent.project_id != issue.project_id
issue.parent_issue_id = nil
end
end
return true
if new_tracker
issue.tracker = new_tracker
issue.reset_custom_values!
end
if options[:copy]
issue.custom_field_values = self.custom_field_values.inject({}) {|h,v| h[v.custom_field_id] = v.value; h}
issue.status = if options[:attributes] && options[:attributes][:status_id]
IssueStatus.find_by_id(options[:attributes][:status_id])
else
self.status
end
end
# Allow bulk setting of attributes on the issue
if options[:attributes]
issue.attributes = options[:attributes]
end
if issue.save
unless options[:copy]
# Manually update project_id on related time entries
TimeEntry.update_all("project_id = #{new_project.id}", {:issue_id => id})
issue.children.each do |child|
unless child.move_to_project_without_transaction(new_project)
# Move failed and transaction was rollback'd
return false
end
end
end
else
return false
end
issue
end
def status_id=(sid)
self.status = nil
write_attribute(:status_id, sid)
end
def priority_id=(pid)
@@ -94,77 +192,158 @@ class Issue < ActiveRecord::Base
write_attribute(:priority_id, pid)
end
def tracker_id=(tid)
self.tracker = nil
result = write_attribute(:tracker_id, tid)
@custom_field_values = nil
result
end
# Overrides attributes= so that tracker_id gets assigned first
def attributes_with_tracker_first=(new_attributes, *args)
return if new_attributes.nil?
new_tracker_id = new_attributes['tracker_id'] || new_attributes[:tracker_id]
if new_tracker_id
self.tracker_id = new_tracker_id
end
send :attributes_without_tracker_first=, new_attributes, *args
end
# 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)
end
safe_attributes 'tracker_id',
'status_id',
'parent_issue_id',
'category_id',
'assigned_to_id',
'priority_id',
'fixed_version_id',
'subject',
'description',
'start_date',
'due_date',
'done_ratio',
'estimated_hours',
'custom_field_values',
'custom_fields',
'lock_version',
:if => lambda {|issue, user| issue.new_record? || user.allowed_to?(:edit_issues, issue.project) }
safe_attributes 'status_id',
'assigned_to_id',
'fixed_version_id',
'done_ratio',
:if => lambda {|issue, user| issue.new_statuses_allowed_to(user).any? }
# Safely sets attributes
# Should be called from controllers instead of #attributes=
# attr_accessible is too rough because we still want things like
# Issue.new(:project => foo) to work
# TODO: move workflow/permission checks from controllers to here
def safe_attributes=(attrs, user=User.current)
return unless attrs.is_a?(Hash)
# User can change issue attributes only if he has :edit permission or if a workflow transition is allowed
attrs = delete_unsafe_attributes(attrs, user)
return if attrs.empty?
# Tracker must be set before since new_statuses_allowed_to depends on it.
if t = attrs.delete('tracker_id')
self.tracker_id = t
end
if attrs['status_id']
unless new_statuses_allowed_to(user).collect(&:id).include?(attrs['status_id'].to_i)
attrs.delete('status_id')
end
end
unless leaf?
attrs.reject! {|k,v| %w(priority_id done_ratio start_date due_date estimated_hours).include?(k)}
end
if attrs.has_key?('parent_issue_id')
if !user.allowed_to?(:manage_subtasks, project)
attrs.delete('parent_issue_id')
elsif !attrs['parent_issue_id'].blank?
attrs.delete('parent_issue_id') unless Issue.visible(user).exists?(attrs['parent_issue_id'].to_i)
end
end
self.attributes = attrs
end
def done_ratio
if Issue.use_status_for_done_ratio? && status && status.default_done_ratio
status.default_done_ratio
else
read_attribute(:done_ratio)
end
end
def self.use_status_for_done_ratio?
Setting.issue_done_ratio == 'issue_status'
end
def self.use_field_for_done_ratio?
Setting.issue_done_ratio == 'issue_field'
end
def validate
if self.due_date.nil? && @attributes['due_date'] && !@attributes['due_date'].empty?
errors.add :due_date, :activerecord_error_not_a_date
errors.add :due_date, :not_a_date
end
if self.due_date and self.start_date and self.due_date < self.start_date
errors.add :due_date, :activerecord_error_greater_than_start_date
errors.add :due_date, :greater_than_start_date
end
if start_date && soonest_start && start_date < soonest_start
errors.add :start_date, :activerecord_error_invalid
errors.add :start_date, :invalid
end
end
def validate_on_create
errors.add :tracker_id, :activerecord_error_invalid unless project.trackers.include?(tracker)
end
def before_create
# default assignment based on category
if assigned_to.nil? && category && category.assigned_to
self.assigned_to = category.assigned_to
end
end
def before_save
if @current_journal
# attributes changes
(Issue.column_names - %w(id description)).each {|c|
@current_journal.details << JournalDetail.new(:property => 'attr',
:prop_key => c,
:old_value => @issue_before_change.send(c),
:value => send(c)) unless send(c)==@issue_before_change.send(c)
}
# custom fields changes
custom_values.each {|c|
next if (@custom_values_before_change[c.custom_field_id]==c.value ||
(@custom_values_before_change[c.custom_field_id].blank? && c.value.blank?))
@current_journal.details << JournalDetail.new(:property => 'cf',
:prop_key => c.custom_field_id,
:old_value => @custom_values_before_change[c.custom_field_id],
:value => c.value)
}
@current_journal.save
end
# Save the issue even if the journal is not saved (because empty)
true
end
def after_save
# Reload is needed in order to get the right status
reload
# Update start/due dates of following issues
relations_from.each(&:set_issue_to_dates)
if fixed_version
if !assignable_versions.include?(fixed_version)
errors.add :fixed_version_id, :inclusion
elsif reopened? && fixed_version.closed?
errors.add_to_base I18n.t(:error_can_not_reopen_issue_on_closed_version)
end
end
# Close duplicates if the issue was closed
if @issue_before_change && !@issue_before_change.closed? && self.closed?
duplicates.each do |duplicate|
# Don't re-close it if it's already closed
next if duplicate.closed?
# Same user and notes
duplicate.init_journal(@current_journal.user, @current_journal.notes)
duplicate.update_attribute :status, self.status
# Checks that the issue can not be added/moved to a disabled tracker
if project && (tracker_id_changed? || project_id_changed?)
unless project.trackers.include?(tracker)
errors.add :tracker_id, :inclusion
end
end
# Checks parent issue assignment
if @parent_issue
if @parent_issue.project_id != project_id
errors.add :parent_issue_id, :not_same_project
elsif !new_record?
# moving an existing issue
if @parent_issue.root_id != root_id
# we can always move to another tree
elsif move_possible?(@parent_issue)
# move accepted inside tree
else
errors.add :parent_issue_id, :not_a_valid_parent
end
end
end
end
def custom_value_for(custom_field)
self.custom_values.each {|v| return v if v.custom_field_id == custom_field.id }
return nil
# Set the done_ratio using the status if that setting is set. This will keep the done_ratios
# even if the user turns off the setting later
def update_done_ratio_from_issue_status
if Issue.use_status_for_done_ratio? && status && status.default_done_ratio
self.done_ratio = status.default_done_ratio
end
end
def init_journal(user, notes = "")
@@ -173,6 +352,8 @@ class Issue < ActiveRecord::Base
@issue_before_change.status = self.status
@custom_values_before_change = {}
self.custom_values.each {|c| @custom_values_before_change.store c.custom_field_id, c.value }
# Make sure updated_on is updated when adding a note.
updated_on_will_change!
@current_journal
end
@@ -181,29 +362,93 @@ class Issue < ActiveRecord::Base
self.status.is_closed?
end
# Return true if the issue is being reopened
def reopened?
if !new_record? && status_id_changed?
status_was = IssueStatus.find_by_id(status_id_was)
status_new = IssueStatus.find_by_id(status_id)
if status_was && status_new && status_was.is_closed? && !status_new.is_closed?
return true
end
end
false
end
# Return true if the issue is being closed
def closing?
if !new_record? && status_id_changed?
status_was = IssueStatus.find_by_id(status_id_was)
status_new = IssueStatus.find_by_id(status_id)
if status_was && status_new && !status_was.is_closed? && status_new.is_closed?
return true
end
end
false
end
# Returns true if the issue is overdue
def overdue?
!due_date.nil? && (due_date < Date.today) && !status.is_closed?
end
# Is the amount of work done less than it should for the due date
def behind_schedule?
return false if start_date.nil? || due_date.nil?
done_date = start_date + ((due_date - start_date+1)* done_ratio/100).floor
return done_date <= Date.today
end
# Does this issue have children?
def children?
!leaf?
end
# Users the issue can be assigned to
def assignable_users
project.assignable_users
users = project.assignable_users
users << author if author
users.uniq.sort
end
# Versions that the issue can be assigned to
def assignable_versions
@assignable_versions ||= (project.shared_versions.open + [Version.find_by_id(fixed_version_id_was)]).compact.uniq.sort
end
# Returns true if this issue is blocked by another issue that is still open
def blocked?
!relations_to.detect {|ir| ir.relation_type == 'blocks' && !ir.issue_from.closed?}.nil?
end
# Returns an array of status that user is able to apply
def new_statuses_allowed_to(user)
statuses = status.find_new_statuses_allowed_to(user.role_for_project(project), tracker)
def new_statuses_allowed_to(user, include_default=false)
statuses = status.find_new_statuses_allowed_to(user.roles_for_project(project), tracker)
statuses << status unless statuses.empty?
statuses.uniq.sort
statuses << IssueStatus.default if include_default
statuses = statuses.uniq.sort
blocked? ? statuses.reject {|s| s.is_closed?} : statuses
end
# Returns the mail adresses of users that should be notified for the issue
# Returns the mail adresses of users that should be notified
def recipients
recipients = project.recipients
# Author and assignee are always notified unless they have been locked
recipients << author.mail if author && author.active?
recipients << assigned_to.mail if assigned_to && assigned_to.active?
recipients.compact.uniq
notified = project.notified_users
# Author and assignee are always notified unless they have been
# locked or don't want to be notified
notified << author if author && author.active? && author.notify_about?(self)
notified << assigned_to if assigned_to && assigned_to.active? && assigned_to.notify_about?(self)
notified.uniq!
# Remove users that can not view the issue
notified.reject! {|user| !visible?(user)}
notified.collect(&:mail)
end
# Returns the total number of hours spent on this issue and its descendants
#
# Example:
# spent_hours => 0.0
# spent_hours => 50.2
def spent_hours
@spent_hours ||= time_entries.sum(:hours) || 0
@spent_hours ||= self_and_descendants.sum("#{TimeEntry.table_name}.hours", :include => :time_entries).to_f || 0.0
end
def relations
@@ -219,22 +464,410 @@ class Issue < ActiveRecord::Base
dependencies
end
# Returns an array of the duplicate issues
# Returns an array of issues that duplicate this one
def duplicates
relations.select {|r| r.relation_type == IssueRelation::TYPE_DUPLICATES}.collect {|r| r.other_issue(self)}
relations_to.select {|r| r.relation_type == IssueRelation::TYPE_DUPLICATES}.collect {|r| r.issue_from}
end
# Returns the due date or the target due date if any
# Used on gantt chart
def due_before
due_date || (fixed_version ? fixed_version.effective_date : nil)
end
# Returns the time scheduled for this issue.
#
# Example:
# Start Date: 2/26/09, End Date: 3/04/09
# duration => 6
def duration
(start_date && due_date) ? due_date - start_date : 0
end
def soonest_start
@soonest_start ||= relations_to.collect{|relation| relation.successor_soonest_start}.compact.min
@soonest_start ||= (
relations_to.collect{|relation| relation.successor_soonest_start} +
ancestors.collect(&:soonest_start)
).compact.max
end
def self.visible_by(usr)
with_scope(:find => { :conditions => Project.visible_by(usr) }) do
yield
def reschedule_after(date)
return if date.nil?
if leaf?
if start_date.nil? || start_date < date
self.start_date, self.due_date = date, date + duration
save
end
else
leaves.each do |leaf|
leaf.reschedule_after(date)
end
end
end
def <=>(issue)
if issue.nil?
-1
elsif root_id != issue.root_id
(root_id || 0) <=> (issue.root_id || 0)
else
(lft || 0) <=> (issue.lft || 0)
end
end
def to_s
"#{tracker} ##{id}: #{subject}"
end
# Returns a string of css classes that apply to the issue
def css_classes
s = "issue status-#{status.position} priority-#{priority.position}"
s << ' closed' if closed?
s << ' overdue' if overdue?
s << ' created-by-me' if User.current.logged? && author_id == User.current.id
s << ' assigned-to-me' if User.current.logged? && assigned_to_id == User.current.id
s
end
# Saves an issue, time_entry, attachments, and a journal from the parameters
# Returns false if save fails
def save_issue_with_child_records(params, existing_time_entry=nil)
Issue.transaction do
if params[:time_entry] && params[:time_entry][:hours].present? && User.current.allowed_to?(:log_time, project)
@time_entry = existing_time_entry || TimeEntry.new
@time_entry.project = project
@time_entry.issue = self
@time_entry.user = User.current
@time_entry.spent_on = Date.today
@time_entry.attributes = params[:time_entry]
self.time_entries << @time_entry
end
if valid?
attachments = Attachment.attach_files(self, params[:attachments])
attachments[:files].each {|a| @current_journal.details << JournalDetail.new(:property => 'attachment', :prop_key => a.id, :value => a.filename)}
# TODO: Rename hook
Redmine::Hook.call_hook(:controller_issues_edit_before_save, { :params => params, :issue => self, :time_entry => @time_entry, :journal => @current_journal})
begin
if save
# TODO: Rename hook
Redmine::Hook.call_hook(:controller_issues_edit_after_save, { :params => params, :issue => self, :time_entry => @time_entry, :journal => @current_journal})
else
raise ActiveRecord::Rollback
end
rescue ActiveRecord::StaleObjectError
attachments[:files].each(&:destroy)
errors.add_to_base l(:notice_locking_conflict)
raise ActiveRecord::Rollback
end
end
end
end
# Unassigns issues from +version+ if it's no longer shared with issue's project
def self.update_versions_from_sharing_change(version)
# Update issues assigned to the version
update_versions(["#{Issue.table_name}.fixed_version_id = ?", version.id])
end
# Unassigns issues from versions that are no longer shared
# after +project+ was moved
def self.update_versions_from_hierarchy_change(project)
moved_project_ids = project.self_and_descendants.reload.collect(&:id)
# Update issues of the moved projects and issues assigned to a version of a moved project
Issue.update_versions(["#{Version.table_name}.project_id IN (?) OR #{Issue.table_name}.project_id IN (?)", moved_project_ids, moved_project_ids])
end
def parent_issue_id=(arg)
parent_issue_id = arg.blank? ? nil : arg.to_i
if parent_issue_id && @parent_issue = Issue.find_by_id(parent_issue_id)
@parent_issue.id
else
@parent_issue = nil
nil
end
end
def parent_issue_id
if instance_variable_defined? :@parent_issue
@parent_issue.nil? ? nil : @parent_issue.id
else
parent_id
end
end
# Extracted from the ReportsController.
def self.by_tracker(project)
count_and_group_by(:project => project,
:field => 'tracker_id',
:joins => Tracker.table_name)
end
def self.by_version(project)
count_and_group_by(:project => project,
:field => 'fixed_version_id',
:joins => Version.table_name)
end
def self.by_priority(project)
count_and_group_by(:project => project,
:field => 'priority_id',
:joins => IssuePriority.table_name)
end
def self.by_category(project)
count_and_group_by(:project => project,
:field => 'category_id',
:joins => IssueCategory.table_name)
end
def self.by_assigned_to(project)
count_and_group_by(:project => project,
:field => 'assigned_to_id',
:joins => User.table_name)
end
def self.by_author(project)
count_and_group_by(:project => project,
:field => 'author_id',
:joins => User.table_name)
end
def self.by_subproject(project)
ActiveRecord::Base.connection.select_all("select s.id as status_id,
s.is_closed as closed,
i.project_id as project_id,
count(i.id) as total
from
#{Issue.table_name} i, #{IssueStatus.table_name} s
where
i.status_id=s.id
and i.project_id IN (#{project.descendants.active.collect{|p| p.id}.join(',')})
group by s.id, s.is_closed, i.project_id") if project.descendants.active.any?
end
# End ReportsController extraction
# 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
def update_nested_set_attributes
if root_id.nil?
# issue was just created
self.root_id = (@parent_issue.nil? ? id : @parent_issue.root_id)
set_default_left_and_right
Issue.update_all("root_id = #{root_id}, lft = #{lft}, rgt = #{rgt}", ["id = ?", id])
if @parent_issue
move_to_child_of(@parent_issue)
end
reload
elsif parent_issue_id != parent_id
former_parent_id = parent_id
# moving an existing issue
if @parent_issue && @parent_issue.root_id == root_id
# inside the same tree
move_to_child_of(@parent_issue)
else
# to another tree
unless root?
move_to_right_of(root)
reload
end
old_root_id = root_id
self.root_id = (@parent_issue.nil? ? id : @parent_issue.root_id )
target_maxright = nested_set_scope.maximum(right_column_name) || 0
offset = target_maxright + 1 - lft
Issue.update_all("root_id = #{root_id}, lft = lft + #{offset}, rgt = rgt + #{offset}",
["root_id = ? AND lft >= ? AND rgt <= ? ", old_root_id, lft, rgt])
self[left_column_name] = lft + offset
self[right_column_name] = rgt + offset
if @parent_issue
move_to_child_of(@parent_issue)
end
end
reload
# delete invalid relations of all descendants
self_and_descendants.each do |issue|
issue.relations.each do |relation|
relation.destroy unless relation.valid?
end
end
# update former parent
recalculate_attributes_for(former_parent_id) if former_parent_id
end
remove_instance_variable(:@parent_issue) if instance_variable_defined?(:@parent_issue)
end
def update_parent_attributes
recalculate_attributes_for(parent_id) if parent_id
end
def recalculate_attributes_for(issue_id)
if issue_id && p = Issue.find_by_id(issue_id)
# priority = highest priority of children
if priority_position = p.children.maximum("#{IssuePriority.table_name}.position", :include => :priority)
p.priority = IssuePriority.find_by_position(priority_position)
end
# start/due dates = lowest/highest dates of children
p.start_date = p.children.minimum(:start_date)
p.due_date = p.children.maximum(:due_date)
if p.start_date && p.due_date && p.due_date < p.start_date
p.start_date, p.due_date = p.due_date, p.start_date
end
# done ratio = weighted average ratio of leaves
unless Issue.use_status_for_done_ratio? && p.status && p.status.default_done_ratio
leaves_count = p.leaves.count
if leaves_count > 0
average = p.leaves.average(:estimated_hours).to_f
if average == 0
average = 1
end
done = p.leaves.sum("COALESCE(estimated_hours, #{average}) * (CASE WHEN is_closed = #{connection.quoted_true} THEN 100 ELSE COALESCE(done_ratio, 0) END)", :include => :status).to_f
progress = done / (average * leaves_count)
p.done_ratio = progress.round
end
end
# estimate = sum of leaves estimates
p.estimated_hours = p.leaves.sum(:estimated_hours).to_f
p.estimated_hours = nil if p.estimated_hours == 0.0
# ancestors will be recursively updated
p.save(false)
end
end
# Update issues so their versions are not pointing to a
# fixed_version that is not shared with the issue's project
def self.update_versions(conditions=nil)
# Only need to update issues with a fixed_version from
# a different project and that is not systemwide shared
Issue.all(:conditions => merge_conditions("#{Issue.table_name}.fixed_version_id IS NOT NULL" +
" AND #{Issue.table_name}.project_id <> #{Version.table_name}.project_id" +
" AND #{Version.table_name}.sharing <> 'system'",
conditions),
:include => [:project, :fixed_version]
).each do |issue|
next if issue.project.nil? || issue.fixed_version.nil?
unless issue.project.shared_versions.include?(issue.fixed_version)
issue.init_journal(User.current)
issue.fixed_version = nil
issue.save
end
end
end
# Callback on attachment deletion
def attachment_removed(obj)
journal = init_journal(User.current)
journal.details << JournalDetail.new(:property => 'attachment',
:prop_key => obj.id,
:old_value => obj.filename)
journal.save
end
# Default assignment based on category
def default_assign
if assigned_to.nil? && category && category.assigned_to
self.assigned_to = category.assigned_to
end
end
# Updates start/due dates of following issues
def reschedule_following_issues
if start_date_changed? || due_date_changed?
relations_from.each do |relation|
relation.set_issue_to_dates
end
end
end
# Closes duplicates if the issue is being closed
def close_duplicates
if closing?
duplicates.each do |duplicate|
# Reload is need in case the duplicate was updated by a previous duplicate
duplicate.reload
# Don't re-close it if it's already closed
next if duplicate.closed?
# Same user and notes
if @current_journal
duplicate.init_journal(@current_journal.user, @current_journal.notes)
end
duplicate.update_attribute :status, self.status
end
end
end
# Saves the changes in a Journal
# Called after_save
def create_journal
if @current_journal
# attributes changes
(Issue.column_names - %w(id description root_id lft rgt lock_version created_on updated_on)).each {|c|
@current_journal.details << JournalDetail.new(:property => 'attr',
:prop_key => c,
:old_value => @issue_before_change.send(c),
:value => send(c)) unless send(c)==@issue_before_change.send(c)
}
# custom fields changes
custom_values.each {|c|
next if (@custom_values_before_change[c.custom_field_id]==c.value ||
(@custom_values_before_change[c.custom_field_id].blank? && c.value.blank?))
@current_journal.details << JournalDetail.new(:property => 'cf',
:prop_key => c.custom_field_id,
:old_value => @custom_values_before_change[c.custom_field_id],
:value => c.value)
}
@current_journal.save
# reset current journal
init_journal @current_journal.user, @current_journal.notes
end
end
# Query generator for selecting groups of issue counts for a project
# based on specific criteria
#
# Options
# * project - Project to search in.
# * field - String. Issue field to key off of in the grouping.
# * joins - String. The table name to join against.
def self.count_and_group_by(options)
project = options.delete(:project)
select_field = options.delete(:field)
joins = options.delete(:joins)
where = "i.#{select_field}=j.id"
ActiveRecord::Base.connection.select_all("select s.id as status_id,
s.is_closed as closed,
j.id as #{select_field},
count(i.id) as total
from
#{Issue.table_name} i, #{IssueStatus.table_name} s, #{joins} j
where
i.status_id=s.id
and #{where}
and i.project_id=#{project.id}
group by s.id, s.is_closed, j.id")
end
end

View File

@@ -0,0 +1,22 @@
# redMine - project management software
# Copyright (C) 2006-2007 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
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class IssueObserver < ActiveRecord::Observer
def after_create(issue)
Mailer.deliver_issue_add(issue) if Setting.notified_events.include?('issue_added')
end
end

View File

@@ -0,0 +1,34 @@
# redMine - project management software
# Copyright (C) 2006 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
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class IssuePriority < Enumeration
has_many :issues, :foreign_key => 'priority_id'
OptionName = :enumeration_issue_priorities
def option_name
OptionName
end
def objects_count
issues.count
end
def transfer_relations(to)
issues.update_all("priority_id = #{to.id}")
end
end

View File

@@ -0,0 +1,23 @@
# redMine - project management software
# Copyright (C) 2006 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
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class IssuePriorityCustomField < CustomField
def type_name
:enumeration_issue_priorities
end
end

View File

@@ -21,13 +21,19 @@ class IssueRelation < ActiveRecord::Base
TYPE_RELATES = "relates"
TYPE_DUPLICATES = "duplicates"
TYPE_DUPLICATED = "duplicated"
TYPE_BLOCKS = "blocks"
TYPE_BLOCKED = "blocked"
TYPE_PRECEDES = "precedes"
TYPE_FOLLOWS = "follows"
TYPES = { TYPE_RELATES => { :name => :label_relates_to, :sym_name => :label_relates_to, :order => 1 },
TYPE_DUPLICATES => { :name => :label_duplicates, :sym_name => :label_duplicates, :order => 2 },
TYPE_BLOCKS => { :name => :label_blocks, :sym_name => :label_blocked_by, :order => 3 },
TYPE_PRECEDES => { :name => :label_precedes, :sym_name => :label_follows, :order => 4 },
TYPES = { TYPE_RELATES => { :name => :label_relates_to, :sym_name => :label_relates_to, :order => 1, :sym => TYPE_RELATES },
TYPE_DUPLICATES => { :name => :label_duplicates, :sym_name => :label_duplicated_by, :order => 2, :sym => TYPE_DUPLICATED },
TYPE_DUPLICATED => { :name => :label_duplicated_by, :sym_name => :label_duplicates, :order => 3, :sym => TYPE_DUPLICATES, :reverse => TYPE_DUPLICATES },
TYPE_BLOCKS => { :name => :label_blocks, :sym_name => :label_blocked_by, :order => 4, :sym => TYPE_BLOCKED },
TYPE_BLOCKED => { :name => :label_blocked_by, :sym_name => :label_blocks, :order => 5, :sym => TYPE_BLOCKS, :reverse => TYPE_BLOCKS },
TYPE_PRECEDES => { :name => :label_precedes, :sym_name => :label_follows, :order => 6, :sym => TYPE_FOLLOWS },
TYPE_FOLLOWS => { :name => :label_follows, :sym_name => :label_precedes, :order => 7, :sym => TYPE_PRECEDES, :reverse => TYPE_PRECEDES }
}.freeze
validates_presence_of :issue_from, :issue_to, :relation_type
@@ -35,11 +41,14 @@ class IssueRelation < ActiveRecord::Base
validates_numericality_of :delay, :allow_nil => true
validates_uniqueness_of :issue_to_id, :scope => :issue_from_id
attr_protected :issue_from_id, :issue_to_id
def validate
if issue_from && issue_to
errors.add :issue_to_id, :activerecord_error_invalid if issue_from_id == issue_to_id
errors.add :issue_to_id, :activerecord_error_not_same_project unless issue_from.project_id == issue_to.project_id || Setting.cross_project_issue_relations?
errors.add_to_base :activerecord_error_circular_dependency if issue_to.all_dependent_issues.include? issue_from
errors.add :issue_to_id, :invalid if issue_from_id == issue_to_id
errors.add :issue_to_id, :not_same_project unless issue_from.project_id == issue_to.project_id || Setting.cross_project_issue_relations?
errors.add_to_base :circular_dependency if issue_to.all_dependent_issues.include? issue_from
errors.add_to_base :cant_link_an_issue_with_a_descendant if issue_from.is_descendant_of?(issue_to) || issue_from.is_ancestor_of?(issue_to)
end
end
@@ -47,11 +56,24 @@ class IssueRelation < ActiveRecord::Base
(self.issue_from_id == issue.id) ? issue_to : issue_from
end
# Returns the relation type for +issue+
def relation_type_for(issue)
if TYPES[relation_type]
if self.issue_from_id == issue.id
relation_type
else
TYPES[relation_type][:sym]
end
end
end
def label_for(issue)
TYPES[relation_type] ? TYPES[relation_type][(self.issue_from_id == issue.id) ? :name : :sym_name] : :unknow
end
def before_save
reverse_if_needed
if TYPE_PRECEDES == relation_type
self.delay ||= 0
else
@@ -62,18 +84,30 @@ class IssueRelation < ActiveRecord::Base
def set_issue_to_dates
soonest_start = self.successor_soonest_start
if soonest_start && (!issue_to.start_date || issue_to.start_date < soonest_start)
issue_to.start_date, issue_to.due_date = successor_soonest_start, successor_soonest_start + issue_to.duration
issue_to.save
if soonest_start && issue_to
issue_to.reschedule_after(soonest_start)
end
end
def successor_soonest_start
return nil unless (TYPE_PRECEDES == self.relation_type) && (issue_from.start_date || issue_from.due_date)
(issue_from.due_date || issue_from.start_date) + 1 + delay
if (TYPE_PRECEDES == self.relation_type) && delay && issue_from && (issue_from.start_date || issue_from.due_date)
(issue_from.due_date || issue_from.start_date) + 1 + delay
end
end
def <=>(relation)
TYPES[self.relation_type][:order] <=> TYPES[relation.relation_type][:order]
end
private
# Reverses the relation if needed so that it gets stored in the proper way
def reverse_if_needed
if TYPES.has_key?(relation_type) && TYPES[relation_type][:reverse]
issue_tmp = issue_to
self.issue_to = issue_from
self.issue_from = issue_tmp
self.relation_type = TYPES[relation_type][:reverse]
end
end
end

View File

@@ -17,43 +17,68 @@
class IssueStatus < ActiveRecord::Base
before_destroy :check_integrity
has_many :workflows, :foreign_key => "old_status_id", :dependent => :delete_all
has_many :workflows, :foreign_key => "old_status_id"
acts_as_list
before_destroy :delete_workflows
validates_presence_of :name
validates_uniqueness_of :name
validates_length_of :name, :maximum => 30
validates_format_of :name, :with => /^[\w\s\'\-]*$/i
validates_inclusion_of :default_done_ratio, :in => 0..100, :allow_nil => true
def before_save
IssueStatus.update_all "is_default=#{connection.quoted_false}" if self.is_default?
def after_save
IssueStatus.update_all("is_default=#{connection.quoted_false}", ['id <> ?', id]) if self.is_default?
end
# Returns the default status for new issues
def self.default
find(:first, :conditions =>["is_default=?", true])
end
# Update all the +Issues+ setting their done_ratio to the value of their +IssueStatus+
def self.update_issue_done_ratios
if Issue.use_status_for_done_ratio?
IssueStatus.find(:all, :conditions => ["default_done_ratio >= 0"]).each do |status|
Issue.update_all(["done_ratio = ?", status.default_done_ratio],
["status_id = ?", status.id])
end
end
return Issue.use_status_for_done_ratio?
end
# Returns an array of all statuses the given role can switch to
# Uses association cache when called more than one time
def new_statuses_allowed_to(role, tracker)
new_statuses = workflows.select {|w| w.role_id == role.id && w.tracker_id == tracker.id}.collect{|w| w.new_status} if role && tracker
new_statuses ? new_statuses.compact.sort{|x, y| x.position <=> y.position } : []
def new_statuses_allowed_to(roles, tracker)
if roles && tracker
role_ids = roles.collect(&:id)
new_statuses = workflows.select {|w| role_ids.include?(w.role_id) && w.tracker_id == tracker.id}.collect{|w| w.new_status}.compact.sort
else
[]
end
end
# Same thing as above but uses a database query
# More efficient than the previous method if called just once
def find_new_statuses_allowed_to(role, tracker)
new_statuses = workflows.find(:all,
:include => :new_status,
:conditions => ["role_id=? and tracker_id=?", role.id, tracker.id]).collect{ |w| w.new_status }.compact if role && tracker
new_statuses ? new_statuses.sort{|x, y| x.position <=> y.position } : []
def find_new_statuses_allowed_to(roles, tracker)
if roles && tracker
workflows.find(:all,
:include => :new_status,
:conditions => { :role_id => roles.collect(&:id),
:tracker_id => tracker.id}).collect{ |w| w.new_status }.compact.sort
else
[]
end
end
def new_status_allowed_to?(status, role, tracker)
status && role && tracker ?
!workflows.find(:first, :conditions => {:new_status_id => status.id, :role_id => role.id, :tracker_id => tracker.id}).nil? :
def new_status_allowed_to?(status, roles, tracker)
if status && roles && tracker
!workflows.find(:first, :conditions => {:new_status_id => status.id, :role_id => roles.collect(&:id), :tracker_id => tracker.id}).nil?
else
false
end
end
def <=>(status)
@@ -66,4 +91,9 @@ private
def check_integrity
raise "Can't delete status" if Issue.find(:first, :conditions => ["status_id=?", self.id])
end
# Deletes associated workflows
def delete_workflows
Workflow.delete_all(["old_status_id = :id OR new_status_id = :id", {:id => id}])
end
end

View File

@@ -25,17 +25,20 @@ class Journal < ActiveRecord::Base
has_many :details, :class_name => "JournalDetail", :dependent => :delete_all
attr_accessor :indice
acts_as_searchable :columns => 'notes',
:include => :issue,
:project_key => "#{Issue.table_name}.project_id",
:date_column => "#{Issue.table_name}.created_on"
acts_as_event :title => Proc.new {|o| "#{o.issue.tracker.name} ##{o.issue.id}: #{o.issue.subject}" + ((s = o.new_status) ? " (#{s})" : '') },
acts_as_event :title => Proc.new {|o| status = ((s = o.new_status) ? " (#{s})" : nil); "#{o.issue.tracker} ##{o.issue.id}#{status}: #{o.issue.subject}" },
:description => :notes,
:author => :user,
:type => Proc.new {|o| (s = o.new_status) ? (s.is_closed? ? 'issue-closed' : 'issue-edit') : 'issue-note' },
:url => Proc.new {|o| {:controller => 'issues', :action => 'show', :id => o.issue.id, :anchor => "change-#{o.id}"}}
def save
acts_as_activity_provider :type => 'issues',
:permission => :view_issues,
:author_key => :user_id,
:find_options => {:include => [{:issue => :project}, :details, :user],
:conditions => "#{Journal.table_name}.journalized_type = 'Issue' AND" +
" (#{JournalDetail.table_name}.prop_key = 'status_id' OR #{Journal.table_name}.notes <> '')"}
def save(*args)
# Do not save an empty journal
(details.empty? && notes.blank?) ? false : super
end
@@ -62,4 +65,12 @@ class Journal < ActiveRecord::Base
def attachments
journalized.respond_to?(:attachments) ? journalized.attachments : nil
end
# Returns a string of css classes
def css_classes
s = 'journal'
s << ' has-notes' unless notes.blank?
s << ' has-details' unless details.blank?
s
end
end

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