##// END OF EJS Templates
Refactor: move NewsController#add_comment to CommentsController#create...
Eric Davis -
r4056:1f2f9536875a
parent child
Show More
@@ -0,0 +1,30
1 class CommentsController < ApplicationController
2 default_search_scope :news
3 model_object News
4 before_filter :find_model_object
5 before_filter :find_project_from_association
6 before_filter :authorize
7
8 verify :method => :post, :only => :create, :render => {:nothing => true, :status => :method_not_allowed }
9 def create
10 @comment = Comment.new(params[:comment])
11 @comment.author = User.current
12 if @news.comments << @comment
13 flash[:notice] = l(:label_comment_added)
14 end
15
16 redirect_to :controller => 'news', :action => 'show', :id => @news
17 end
18
19 private
20
21 # ApplicationController's find_model_object sets it based on the controller
22 # name so it needs to be overriden and set to @news instead
23 def find_model_object
24 super
25 @news = @object
26 @comment = nil
27 @news
28 end
29
30 end
@@ -0,0 +1,46
1 # redMine - project management software
2 # Copyright (C) 2006-2007 Jean-Philippe Lang
3 #
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
18 require File.dirname(__FILE__) + '/../test_helper'
19
20 class CommentsControllerTest < ActionController::TestCase
21 fixtures :projects, :users, :roles, :members, :member_roles, :enabled_modules, :news, :comments
22
23 def setup
24 User.current = nil
25 end
26
27 def test_add_comment
28 @request.session[:user_id] = 2
29 post :create, :id => 1, :comment => { :comments => 'This is a test comment' }
30 assert_redirected_to 'news/1'
31
32 comment = News.find(1).comments.find(:first, :order => 'created_on DESC')
33 assert_not_nil comment
34 assert_equal 'This is a test comment', comment.comments
35 assert_equal User.find(2), comment.author
36 end
37
38 def test_empty_comment_should_not_be_added
39 @request.session[:user_id] = 2
40 assert_no_difference 'Comment.count' do
41 post :create, :id => 1, :comment => { :comments => '' }
42 assert_response :redirect
43 assert_redirected_to 'news/1'
44 end
45 end
46 end
@@ -1,117 +1,105
1 # redMine - project management software
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
2 # Copyright (C) 2006 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 class NewsController < ApplicationController
18 class NewsController < ApplicationController
19 default_search_scope :news
19 default_search_scope :news
20 model_object News
20 model_object News
21 before_filter :find_model_object, :except => [:new, :create, :index, :preview]
21 before_filter :find_model_object, :except => [:new, :create, :index, :preview]
22 before_filter :find_project_from_association, :except => [:new, :create, :index, :preview]
22 before_filter :find_project_from_association, :except => [:new, :create, :index, :preview]
23 before_filter :find_project, :only => [:new, :create, :preview]
23 before_filter :find_project, :only => [:new, :create, :preview]
24 before_filter :authorize, :except => [:index, :preview]
24 before_filter :authorize, :except => [:index, :preview]
25 before_filter :find_optional_project, :only => :index
25 before_filter :find_optional_project, :only => :index
26 accept_key_auth :index
26 accept_key_auth :index
27
27
28 def index
28 def index
29 @news_pages, @newss = paginate :news,
29 @news_pages, @newss = paginate :news,
30 :per_page => 10,
30 :per_page => 10,
31 :conditions => Project.allowed_to_condition(User.current, :view_news, :project => @project),
31 :conditions => Project.allowed_to_condition(User.current, :view_news, :project => @project),
32 :include => [:author, :project],
32 :include => [:author, :project],
33 :order => "#{News.table_name}.created_on DESC"
33 :order => "#{News.table_name}.created_on DESC"
34 respond_to do |format|
34 respond_to do |format|
35 format.html { render :layout => false if request.xhr? }
35 format.html { render :layout => false if request.xhr? }
36 format.xml { render :xml => @newss.to_xml }
36 format.xml { render :xml => @newss.to_xml }
37 format.json { render :json => @newss.to_json }
37 format.json { render :json => @newss.to_json }
38 format.atom { render_feed(@newss, :title => (@project ? @project.name : Setting.app_title) + ": #{l(:label_news_plural)}") }
38 format.atom { render_feed(@newss, :title => (@project ? @project.name : Setting.app_title) + ": #{l(:label_news_plural)}") }
39 end
39 end
40 end
40 end
41
41
42 def show
42 def show
43 @comments = @news.comments
43 @comments = @news.comments
44 @comments.reverse! if User.current.wants_comments_in_reverse_order?
44 @comments.reverse! if User.current.wants_comments_in_reverse_order?
45 end
45 end
46
46
47 def new
47 def new
48 @news = News.new(:project => @project, :author => User.current)
48 @news = News.new(:project => @project, :author => User.current)
49 end
49 end
50
50
51 def create
51 def create
52 @news = News.new(:project => @project, :author => User.current)
52 @news = News.new(:project => @project, :author => User.current)
53 if request.post?
53 if request.post?
54 @news.attributes = params[:news]
54 @news.attributes = params[:news]
55 if @news.save
55 if @news.save
56 flash[:notice] = l(:notice_successful_create)
56 flash[:notice] = l(:notice_successful_create)
57 redirect_to :controller => 'news', :action => 'index', :project_id => @project
57 redirect_to :controller => 'news', :action => 'index', :project_id => @project
58 else
58 else
59 render :action => 'new'
59 render :action => 'new'
60 end
60 end
61 end
61 end
62 end
62 end
63
63
64 def edit
64 def edit
65 end
65 end
66
66
67 def update
67 def update
68 if request.put? and @news.update_attributes(params[:news])
68 if request.put? and @news.update_attributes(params[:news])
69 flash[:notice] = l(:notice_successful_update)
69 flash[:notice] = l(:notice_successful_update)
70 redirect_to :action => 'show', :id => @news
70 redirect_to :action => 'show', :id => @news
71 else
71 else
72 render :action => 'edit'
72 render :action => 'edit'
73 end
73 end
74 end
74 end
75
75
76 def add_comment
77 @comment = Comment.new(params[:comment])
78 @comment.author = User.current
79 if @news.comments << @comment
80 flash[:notice] = l(:label_comment_added)
81 redirect_to :action => 'show', :id => @news
82 else
83 show
84 render :action => 'show'
85 end
86 end
87
88 def destroy_comment
76 def destroy_comment
89 @news.comments.find(params[:comment_id]).destroy
77 @news.comments.find(params[:comment_id]).destroy
90 redirect_to :action => 'show', :id => @news
78 redirect_to :action => 'show', :id => @news
91 end
79 end
92
80
93 def destroy
81 def destroy
94 @news.destroy
82 @news.destroy
95 redirect_to :action => 'index', :project_id => @project
83 redirect_to :action => 'index', :project_id => @project
96 end
84 end
97
85
98 def preview
86 def preview
99 @text = (params[:news] ? params[:news][:description] : nil)
87 @text = (params[:news] ? params[:news][:description] : nil)
100 render :partial => 'common/preview'
88 render :partial => 'common/preview'
101 end
89 end
102
90
103 private
91 private
104 def find_project
92 def find_project
105 @project = Project.find(params[:project_id])
93 @project = Project.find(params[:project_id])
106 rescue ActiveRecord::RecordNotFound
94 rescue ActiveRecord::RecordNotFound
107 render_404
95 render_404
108 end
96 end
109
97
110 def find_optional_project
98 def find_optional_project
111 return true unless params[:project_id]
99 return true unless params[:project_id]
112 @project = Project.find(params[:project_id])
100 @project = Project.find(params[:project_id])
113 authorize
101 authorize
114 rescue ActiveRecord::RecordNotFound
102 rescue ActiveRecord::RecordNotFound
115 render_404
103 render_404
116 end
104 end
117 end
105 end
@@ -1,65 +1,65
1 <div class="contextual">
1 <div class="contextual">
2 <%= link_to_if_authorized l(:button_edit),
2 <%= link_to_if_authorized l(:button_edit),
3 {:controller => 'news', :action => 'edit', :id => @news},
3 {:controller => 'news', :action => 'edit', :id => @news},
4 :class => 'icon icon-edit',
4 :class => 'icon icon-edit',
5 :accesskey => accesskey(:edit),
5 :accesskey => accesskey(:edit),
6 :onclick => 'Element.show("edit-news"); return false;' %>
6 :onclick => 'Element.show("edit-news"); return false;' %>
7 <%= link_to_if_authorized l(:button_delete), {:controller => 'news', :action => 'destroy', :id => @news}, :confirm => l(:text_are_you_sure), :method => :post, :class => 'icon icon-del' %>
7 <%= link_to_if_authorized l(:button_delete), {:controller => 'news', :action => 'destroy', :id => @news}, :confirm => l(:text_are_you_sure), :method => :post, :class => 'icon icon-del' %>
8 </div>
8 </div>
9
9
10 <h2><%= avatar(@news.author, :size => "24") %><%=h @news.title %></h2>
10 <h2><%= avatar(@news.author, :size => "24") %><%=h @news.title %></h2>
11
11
12 <% if authorize_for('news', 'edit') %>
12 <% if authorize_for('news', 'edit') %>
13 <div id="edit-news" style="display:none;">
13 <div id="edit-news" style="display:none;">
14 <% labelled_tabular_form_for :news, @news, :url => { :action => "update", :id => @news },
14 <% labelled_tabular_form_for :news, @news, :url => { :action => "update", :id => @news },
15 :html => { :id => 'news-form', :method => :put } do |f| %>
15 :html => { :id => 'news-form', :method => :put } do |f| %>
16 <%= render :partial => 'form', :locals => { :f => f } %>
16 <%= render :partial => 'form', :locals => { :f => f } %>
17 <%= submit_tag l(:button_save) %>
17 <%= submit_tag l(:button_save) %>
18 <%= link_to_remote l(:label_preview),
18 <%= link_to_remote l(:label_preview),
19 { :url => { :controller => 'news', :action => 'preview', :project_id => @project },
19 { :url => { :controller => 'news', :action => 'preview', :project_id => @project },
20 :method => 'post',
20 :method => 'post',
21 :update => 'preview',
21 :update => 'preview',
22 :with => "Form.serialize('news-form')"
22 :with => "Form.serialize('news-form')"
23 }, :accesskey => accesskey(:preview) %> |
23 }, :accesskey => accesskey(:preview) %> |
24 <%= link_to l(:button_cancel), "#", :onclick => 'Element.hide("edit-news"); return false;' %>
24 <%= link_to l(:button_cancel), "#", :onclick => 'Element.hide("edit-news"); return false;' %>
25 <% end %>
25 <% end %>
26 <div id="preview" class="wiki"></div>
26 <div id="preview" class="wiki"></div>
27 </div>
27 </div>
28 <% end %>
28 <% end %>
29
29
30 <p><% unless @news.summary.blank? %><em><%=h @news.summary %></em><br /><% end %>
30 <p><% unless @news.summary.blank? %><em><%=h @news.summary %></em><br /><% end %>
31 <span class="author"><%= authoring @news.created_on, @news.author %></span></p>
31 <span class="author"><%= authoring @news.created_on, @news.author %></span></p>
32 <div class="wiki">
32 <div class="wiki">
33 <%= textilizable(@news.description) %>
33 <%= textilizable(@news.description) %>
34 </div>
34 </div>
35 <br />
35 <br />
36
36
37 <div id="comments" style="margin-bottom:16px;">
37 <div id="comments" style="margin-bottom:16px;">
38 <h3 class="comments"><%= l(:label_comment_plural) %></h3>
38 <h3 class="comments"><%= l(:label_comment_plural) %></h3>
39 <% @comments.each do |comment| %>
39 <% @comments.each do |comment| %>
40 <% next if comment.new_record? %>
40 <% next if comment.new_record? %>
41 <div class="contextual">
41 <div class="contextual">
42 <%= link_to_if_authorized image_tag('delete.png'), {:controller => 'news', :action => 'destroy_comment', :id => @news, :comment_id => comment},
42 <%= link_to_if_authorized image_tag('delete.png'), {:controller => 'news', :action => 'destroy_comment', :id => @news, :comment_id => comment},
43 :confirm => l(:text_are_you_sure), :method => :post, :title => l(:button_delete) %>
43 :confirm => l(:text_are_you_sure), :method => :post, :title => l(:button_delete) %>
44 </div>
44 </div>
45 <h4><%= avatar(comment.author, :size => "24") %><%= authoring comment.created_on, comment.author %></h4>
45 <h4><%= avatar(comment.author, :size => "24") %><%= authoring comment.created_on, comment.author %></h4>
46 <%= textilizable(comment.comments) %>
46 <%= textilizable(comment.comments) %>
47 <% end if @comments.any? %>
47 <% end if @comments.any? %>
48 </div>
48 </div>
49
49
50 <% if authorize_for 'news', 'add_comment' %>
50 <% if authorize_for 'comments', 'create' %>
51 <p><%= toggle_link l(:label_comment_add), "add_comment_form", :focus => "comment_comments" %></p>
51 <p><%= toggle_link l(:label_comment_add), "add_comment_form", :focus => "comment_comments" %></p>
52 <% form_tag({:action => 'add_comment', :id => @news}, :id => "add_comment_form", :style => "display:none;") do %>
52 <% form_tag({:controller => 'comments', :action => 'create', :id => @news}, :id => "add_comment_form", :style => "display:none;") do %>
53 <div class="box">
53 <div class="box">
54 <%= text_area 'comment', 'comments', :cols => 80, :rows => 15, :class => 'wiki-edit' %>
54 <%= text_area 'comment', 'comments', :cols => 80, :rows => 15, :class => 'wiki-edit' %>
55 <%= wikitoolbar_for 'comment_comments' %>
55 <%= wikitoolbar_for 'comment_comments' %>
56 </div>
56 </div>
57 <p><%= submit_tag l(:button_add) %></p>
57 <p><%= submit_tag l(:button_add) %></p>
58 <% end %>
58 <% end %>
59 <% end %>
59 <% end %>
60
60
61 <% html_title @news.title -%>
61 <% html_title @news.title -%>
62
62
63 <% content_for :header_tags do %>
63 <% content_for :header_tags do %>
64 <%= stylesheet_link_tag 'scm' %>
64 <%= stylesheet_link_tag 'scm' %>
65 <% end %>
65 <% end %>
@@ -1,269 +1,271
1 ActionController::Routing::Routes.draw do |map|
1 ActionController::Routing::Routes.draw do |map|
2 # Add your own custom routes here.
2 # Add your own custom routes here.
3 # The priority is based upon order of creation: first created -> highest priority.
3 # The priority is based upon order of creation: first created -> highest priority.
4
4
5 # Here's a sample route:
5 # Here's a sample route:
6 # map.connect 'products/:id', :controller => 'catalog', :action => 'view'
6 # map.connect 'products/:id', :controller => 'catalog', :action => 'view'
7 # Keep in mind you can assign values other than :controller and :action
7 # Keep in mind you can assign values other than :controller and :action
8
8
9 map.home '', :controller => 'welcome'
9 map.home '', :controller => 'welcome'
10
10
11 map.signin 'login', :controller => 'account', :action => 'login'
11 map.signin 'login', :controller => 'account', :action => 'login'
12 map.signout 'logout', :controller => 'account', :action => 'logout'
12 map.signout 'logout', :controller => 'account', :action => 'logout'
13
13
14 map.connect 'roles/workflow/:id/:role_id/:tracker_id', :controller => 'roles', :action => 'workflow'
14 map.connect 'roles/workflow/:id/:role_id/:tracker_id', :controller => 'roles', :action => 'workflow'
15 map.connect 'help/:ctrl/:page', :controller => 'help'
15 map.connect 'help/:ctrl/:page', :controller => 'help'
16
16
17 map.connect 'time_entries/:id/edit', :action => 'edit', :controller => 'timelog'
17 map.connect 'time_entries/:id/edit', :action => 'edit', :controller => 'timelog'
18 map.connect 'projects/:project_id/time_entries/new', :action => 'edit', :controller => 'timelog'
18 map.connect 'projects/:project_id/time_entries/new', :action => 'edit', :controller => 'timelog'
19 map.connect 'projects/:project_id/issues/:issue_id/time_entries/new', :action => 'edit', :controller => 'timelog'
19 map.connect 'projects/:project_id/issues/:issue_id/time_entries/new', :action => 'edit', :controller => 'timelog'
20
20
21 map.with_options :controller => 'timelog' do |timelog|
21 map.with_options :controller => 'timelog' do |timelog|
22 timelog.connect 'projects/:project_id/time_entries', :action => 'details'
22 timelog.connect 'projects/:project_id/time_entries', :action => 'details'
23
23
24 timelog.with_options :action => 'details', :conditions => {:method => :get} do |time_details|
24 timelog.with_options :action => 'details', :conditions => {:method => :get} do |time_details|
25 time_details.connect 'time_entries'
25 time_details.connect 'time_entries'
26 time_details.connect 'time_entries.:format'
26 time_details.connect 'time_entries.:format'
27 time_details.connect 'issues/:issue_id/time_entries'
27 time_details.connect 'issues/:issue_id/time_entries'
28 time_details.connect 'issues/:issue_id/time_entries.:format'
28 time_details.connect 'issues/:issue_id/time_entries.:format'
29 time_details.connect 'projects/:project_id/time_entries.:format'
29 time_details.connect 'projects/:project_id/time_entries.:format'
30 time_details.connect 'projects/:project_id/issues/:issue_id/time_entries'
30 time_details.connect 'projects/:project_id/issues/:issue_id/time_entries'
31 time_details.connect 'projects/:project_id/issues/:issue_id/time_entries.:format'
31 time_details.connect 'projects/:project_id/issues/:issue_id/time_entries.:format'
32 end
32 end
33 timelog.connect 'projects/:project_id/time_entries/report', :action => 'report'
33 timelog.connect 'projects/:project_id/time_entries/report', :action => 'report'
34 timelog.with_options :action => 'report',:conditions => {:method => :get} do |time_report|
34 timelog.with_options :action => 'report',:conditions => {:method => :get} do |time_report|
35 time_report.connect 'time_entries/report'
35 time_report.connect 'time_entries/report'
36 time_report.connect 'time_entries/report.:format'
36 time_report.connect 'time_entries/report.:format'
37 time_report.connect 'projects/:project_id/time_entries/report.:format'
37 time_report.connect 'projects/:project_id/time_entries/report.:format'
38 end
38 end
39
39
40 timelog.with_options :action => 'edit', :conditions => {:method => :get} do |time_edit|
40 timelog.with_options :action => 'edit', :conditions => {:method => :get} do |time_edit|
41 time_edit.connect 'issues/:issue_id/time_entries/new'
41 time_edit.connect 'issues/:issue_id/time_entries/new'
42 end
42 end
43
43
44 timelog.connect 'time_entries/:id/destroy', :action => 'destroy', :conditions => {:method => :post}
44 timelog.connect 'time_entries/:id/destroy', :action => 'destroy', :conditions => {:method => :post}
45 end
45 end
46
46
47 map.connect 'projects/:id/wiki', :controller => 'wikis', :action => 'edit', :conditions => {:method => :post}
47 map.connect 'projects/:id/wiki', :controller => 'wikis', :action => 'edit', :conditions => {:method => :post}
48 map.connect 'projects/:id/wiki/destroy', :controller => 'wikis', :action => 'destroy', :conditions => {:method => :get}
48 map.connect 'projects/:id/wiki/destroy', :controller => 'wikis', :action => 'destroy', :conditions => {:method => :get}
49 map.connect 'projects/:id/wiki/destroy', :controller => 'wikis', :action => 'destroy', :conditions => {:method => :post}
49 map.connect 'projects/:id/wiki/destroy', :controller => 'wikis', :action => 'destroy', :conditions => {:method => :post}
50 map.with_options :controller => 'wiki' do |wiki_routes|
50 map.with_options :controller => 'wiki' do |wiki_routes|
51 wiki_routes.with_options :conditions => {:method => :get} do |wiki_views|
51 wiki_routes.with_options :conditions => {:method => :get} do |wiki_views|
52 wiki_views.connect 'projects/:id/wiki/:page', :action => 'special', :page => /page_index|date_index|export/i
52 wiki_views.connect 'projects/:id/wiki/:page', :action => 'special', :page => /page_index|date_index|export/i
53 wiki_views.connect 'projects/:id/wiki/:page', :action => 'index', :page => nil
53 wiki_views.connect 'projects/:id/wiki/:page', :action => 'index', :page => nil
54 wiki_views.connect 'projects/:id/wiki/:page/edit', :action => 'edit'
54 wiki_views.connect 'projects/:id/wiki/:page/edit', :action => 'edit'
55 wiki_views.connect 'projects/:id/wiki/:page/rename', :action => 'rename'
55 wiki_views.connect 'projects/:id/wiki/:page/rename', :action => 'rename'
56 wiki_views.connect 'projects/:id/wiki/:page/history', :action => 'history'
56 wiki_views.connect 'projects/:id/wiki/:page/history', :action => 'history'
57 wiki_views.connect 'projects/:id/wiki/:page/diff/:version/vs/:version_from', :action => 'diff'
57 wiki_views.connect 'projects/:id/wiki/:page/diff/:version/vs/:version_from', :action => 'diff'
58 wiki_views.connect 'projects/:id/wiki/:page/annotate/:version', :action => 'annotate'
58 wiki_views.connect 'projects/:id/wiki/:page/annotate/:version', :action => 'annotate'
59 end
59 end
60
60
61 wiki_routes.connect 'projects/:id/wiki/:page/:action',
61 wiki_routes.connect 'projects/:id/wiki/:page/:action',
62 :action => /edit|rename|destroy|preview|protect/,
62 :action => /edit|rename|destroy|preview|protect/,
63 :conditions => {:method => :post}
63 :conditions => {:method => :post}
64 end
64 end
65
65
66 map.with_options :controller => 'messages' do |messages_routes|
66 map.with_options :controller => 'messages' do |messages_routes|
67 messages_routes.with_options :conditions => {:method => :get} do |messages_views|
67 messages_routes.with_options :conditions => {:method => :get} do |messages_views|
68 messages_views.connect 'boards/:board_id/topics/new', :action => 'new'
68 messages_views.connect 'boards/:board_id/topics/new', :action => 'new'
69 messages_views.connect 'boards/:board_id/topics/:id', :action => 'show'
69 messages_views.connect 'boards/:board_id/topics/:id', :action => 'show'
70 messages_views.connect 'boards/:board_id/topics/:id/edit', :action => 'edit'
70 messages_views.connect 'boards/:board_id/topics/:id/edit', :action => 'edit'
71 end
71 end
72 messages_routes.with_options :conditions => {:method => :post} do |messages_actions|
72 messages_routes.with_options :conditions => {:method => :post} do |messages_actions|
73 messages_actions.connect 'boards/:board_id/topics/new', :action => 'new'
73 messages_actions.connect 'boards/:board_id/topics/new', :action => 'new'
74 messages_actions.connect 'boards/:board_id/topics/:id/replies', :action => 'reply'
74 messages_actions.connect 'boards/:board_id/topics/:id/replies', :action => 'reply'
75 messages_actions.connect 'boards/:board_id/topics/:id/:action', :action => /edit|destroy/
75 messages_actions.connect 'boards/:board_id/topics/:id/:action', :action => /edit|destroy/
76 end
76 end
77 end
77 end
78
78
79 map.with_options :controller => 'boards' do |board_routes|
79 map.with_options :controller => 'boards' do |board_routes|
80 board_routes.with_options :conditions => {:method => :get} do |board_views|
80 board_routes.with_options :conditions => {:method => :get} do |board_views|
81 board_views.connect 'projects/:project_id/boards', :action => 'index'
81 board_views.connect 'projects/:project_id/boards', :action => 'index'
82 board_views.connect 'projects/:project_id/boards/new', :action => 'new'
82 board_views.connect 'projects/:project_id/boards/new', :action => 'new'
83 board_views.connect 'projects/:project_id/boards/:id', :action => 'show'
83 board_views.connect 'projects/:project_id/boards/:id', :action => 'show'
84 board_views.connect 'projects/:project_id/boards/:id.:format', :action => 'show'
84 board_views.connect 'projects/:project_id/boards/:id.:format', :action => 'show'
85 board_views.connect 'projects/:project_id/boards/:id/edit', :action => 'edit'
85 board_views.connect 'projects/:project_id/boards/:id/edit', :action => 'edit'
86 end
86 end
87 board_routes.with_options :conditions => {:method => :post} do |board_actions|
87 board_routes.with_options :conditions => {:method => :post} do |board_actions|
88 board_actions.connect 'projects/:project_id/boards', :action => 'new'
88 board_actions.connect 'projects/:project_id/boards', :action => 'new'
89 board_actions.connect 'projects/:project_id/boards/:id/:action', :action => /edit|destroy/
89 board_actions.connect 'projects/:project_id/boards/:id/:action', :action => /edit|destroy/
90 end
90 end
91 end
91 end
92
92
93 map.with_options :controller => 'documents' do |document_routes|
93 map.with_options :controller => 'documents' do |document_routes|
94 document_routes.with_options :conditions => {:method => :get} do |document_views|
94 document_routes.with_options :conditions => {:method => :get} do |document_views|
95 document_views.connect 'projects/:project_id/documents', :action => 'index'
95 document_views.connect 'projects/:project_id/documents', :action => 'index'
96 document_views.connect 'projects/:project_id/documents/new', :action => 'new'
96 document_views.connect 'projects/:project_id/documents/new', :action => 'new'
97 document_views.connect 'documents/:id', :action => 'show'
97 document_views.connect 'documents/:id', :action => 'show'
98 document_views.connect 'documents/:id/edit', :action => 'edit'
98 document_views.connect 'documents/:id/edit', :action => 'edit'
99 end
99 end
100 document_routes.with_options :conditions => {:method => :post} do |document_actions|
100 document_routes.with_options :conditions => {:method => :post} do |document_actions|
101 document_actions.connect 'projects/:project_id/documents', :action => 'new'
101 document_actions.connect 'projects/:project_id/documents', :action => 'new'
102 document_actions.connect 'documents/:id/:action', :action => /destroy|edit/
102 document_actions.connect 'documents/:id/:action', :action => /destroy|edit/
103 end
103 end
104 end
104 end
105
105
106 map.resources :issue_moves, :only => [:new, :create], :path_prefix => '/issues', :as => 'move'
106 map.resources :issue_moves, :only => [:new, :create], :path_prefix => '/issues', :as => 'move'
107
107
108 # Misc issue routes. TODO: move into resources
108 # Misc issue routes. TODO: move into resources
109 map.auto_complete_issues '/issues/auto_complete', :controller => 'auto_completes', :action => 'issues'
109 map.auto_complete_issues '/issues/auto_complete', :controller => 'auto_completes', :action => 'issues'
110 map.preview_issue '/issues/preview/:id', :controller => 'previews', :action => 'issue' # TODO: would look nicer as /issues/:id/preview
110 map.preview_issue '/issues/preview/:id', :controller => 'previews', :action => 'issue' # TODO: would look nicer as /issues/:id/preview
111 map.issues_context_menu '/issues/context_menu', :controller => 'context_menus', :action => 'issues'
111 map.issues_context_menu '/issues/context_menu', :controller => 'context_menus', :action => 'issues'
112 map.issue_changes '/issues/changes', :controller => 'journals', :action => 'index'
112 map.issue_changes '/issues/changes', :controller => 'journals', :action => 'index'
113 map.bulk_edit_issue 'issues/bulk_edit', :controller => 'issues', :action => 'bulk_edit', :conditions => { :method => :get }
113 map.bulk_edit_issue 'issues/bulk_edit', :controller => 'issues', :action => 'bulk_edit', :conditions => { :method => :get }
114 map.bulk_update_issue 'issues/bulk_edit', :controller => 'issues', :action => 'bulk_update', :conditions => { :method => :post }
114 map.bulk_update_issue 'issues/bulk_edit', :controller => 'issues', :action => 'bulk_update', :conditions => { :method => :post }
115 map.quoted_issue '/issues/:id/quoted', :controller => 'journals', :action => 'new', :id => /\d+/, :conditions => { :method => :post }
115 map.quoted_issue '/issues/:id/quoted', :controller => 'journals', :action => 'new', :id => /\d+/, :conditions => { :method => :post }
116 map.connect '/issues/:id/destroy', :controller => 'issues', :action => 'destroy', :conditions => { :method => :post } # legacy
116 map.connect '/issues/:id/destroy', :controller => 'issues', :action => 'destroy', :conditions => { :method => :post } # legacy
117
117
118 map.resource :gantt, :path_prefix => '/issues', :controller => 'gantts', :only => [:show, :update]
118 map.resource :gantt, :path_prefix => '/issues', :controller => 'gantts', :only => [:show, :update]
119 map.resource :gantt, :path_prefix => '/projects/:project_id/issues', :controller => 'gantts', :only => [:show, :update]
119 map.resource :gantt, :path_prefix => '/projects/:project_id/issues', :controller => 'gantts', :only => [:show, :update]
120 map.resource :calendar, :path_prefix => '/issues', :controller => 'calendars', :only => [:show, :update]
120 map.resource :calendar, :path_prefix => '/issues', :controller => 'calendars', :only => [:show, :update]
121 map.resource :calendar, :path_prefix => '/projects/:project_id/issues', :controller => 'calendars', :only => [:show, :update]
121 map.resource :calendar, :path_prefix => '/projects/:project_id/issues', :controller => 'calendars', :only => [:show, :update]
122
122
123 map.with_options :controller => 'reports', :conditions => {:method => :get} do |reports|
123 map.with_options :controller => 'reports', :conditions => {:method => :get} do |reports|
124 reports.connect 'projects/:id/issues/report', :action => 'issue_report'
124 reports.connect 'projects/:id/issues/report', :action => 'issue_report'
125 reports.connect 'projects/:id/issues/report/:detail', :action => 'issue_report_details'
125 reports.connect 'projects/:id/issues/report/:detail', :action => 'issue_report_details'
126 end
126 end
127
127
128 # Following two routes conflict with the resources because #index allows POST
128 # Following two routes conflict with the resources because #index allows POST
129 map.connect '/issues', :controller => 'issues', :action => 'index', :conditions => { :method => :post }
129 map.connect '/issues', :controller => 'issues', :action => 'index', :conditions => { :method => :post }
130 map.connect '/issues/create', :controller => 'issues', :action => 'index', :conditions => { :method => :post }
130 map.connect '/issues/create', :controller => 'issues', :action => 'index', :conditions => { :method => :post }
131
131
132 map.resources :issues, :member => { :edit => :post }, :collection => {}
132 map.resources :issues, :member => { :edit => :post }, :collection => {}
133 map.resources :issues, :path_prefix => '/projects/:project_id', :collection => { :create => :post }
133 map.resources :issues, :path_prefix => '/projects/:project_id', :collection => { :create => :post }
134
134
135 map.with_options :controller => 'issue_relations', :conditions => {:method => :post} do |relations|
135 map.with_options :controller => 'issue_relations', :conditions => {:method => :post} do |relations|
136 relations.connect 'issues/:issue_id/relations/:id', :action => 'new'
136 relations.connect 'issues/:issue_id/relations/:id', :action => 'new'
137 relations.connect 'issues/:issue_id/relations/:id/destroy', :action => 'destroy'
137 relations.connect 'issues/:issue_id/relations/:id/destroy', :action => 'destroy'
138 end
138 end
139
139
140 map.with_options :controller => 'news' do |news_routes|
140 map.with_options :controller => 'news' do |news_routes|
141 news_routes.with_options :conditions => {:method => :get} do |news_views|
141 news_routes.with_options :conditions => {:method => :get} do |news_views|
142 news_views.connect 'news', :action => 'index'
142 news_views.connect 'news', :action => 'index'
143 news_views.connect 'projects/:project_id/news', :action => 'index'
143 news_views.connect 'projects/:project_id/news', :action => 'index'
144 news_views.connect 'projects/:project_id/news.:format', :action => 'index'
144 news_views.connect 'projects/:project_id/news.:format', :action => 'index'
145 news_views.connect 'news.:format', :action => 'index'
145 news_views.connect 'news.:format', :action => 'index'
146 news_views.connect 'projects/:project_id/news/new', :action => 'new'
146 news_views.connect 'projects/:project_id/news/new', :action => 'new'
147 news_views.connect 'news/:id', :action => 'show'
147 news_views.connect 'news/:id', :action => 'show'
148 news_views.connect 'news/:id/edit', :action => 'edit'
148 news_views.connect 'news/:id/edit', :action => 'edit'
149 end
149 end
150 news_routes.with_options do |news_actions|
150 news_routes.with_options do |news_actions|
151 news_actions.connect 'projects/:project_id/news', :action => 'create', :conditions => {:method => :post}
151 news_actions.connect 'projects/:project_id/news', :action => 'create', :conditions => {:method => :post}
152 news_actions.connect 'news/:id/destroy', :action => 'destroy'
152 news_actions.connect 'news/:id/destroy', :action => 'destroy'
153 end
153 end
154 news_routes.connect 'news/:id/edit', :action => 'update', :conditions => {:method => :put}
154 news_routes.connect 'news/:id/edit', :action => 'update', :conditions => {:method => :put}
155
156 news_routes.connect 'news/:id/comments', :controller => 'comments', :action => 'create', :conditions => {:method => :post}
155 end
157 end
156
158
157 map.connect 'projects/:id/members/new', :controller => 'members', :action => 'new'
159 map.connect 'projects/:id/members/new', :controller => 'members', :action => 'new'
158
160
159 map.with_options :controller => 'users' do |users|
161 map.with_options :controller => 'users' do |users|
160 users.with_options :conditions => {:method => :get} do |user_views|
162 users.with_options :conditions => {:method => :get} do |user_views|
161 user_views.connect 'users', :action => 'index'
163 user_views.connect 'users', :action => 'index'
162 user_views.connect 'users/:id', :action => 'show', :id => /\d+/
164 user_views.connect 'users/:id', :action => 'show', :id => /\d+/
163 user_views.connect 'users/new', :action => 'add'
165 user_views.connect 'users/new', :action => 'add'
164 user_views.connect 'users/:id/edit/:tab', :action => 'edit', :tab => nil
166 user_views.connect 'users/:id/edit/:tab', :action => 'edit', :tab => nil
165 end
167 end
166 users.with_options :conditions => {:method => :post} do |user_actions|
168 users.with_options :conditions => {:method => :post} do |user_actions|
167 user_actions.connect 'users', :action => 'add'
169 user_actions.connect 'users', :action => 'add'
168 user_actions.connect 'users/new', :action => 'add'
170 user_actions.connect 'users/new', :action => 'add'
169 user_actions.connect 'users/:id/edit', :action => 'edit'
171 user_actions.connect 'users/:id/edit', :action => 'edit'
170 user_actions.connect 'users/:id/memberships', :action => 'edit_membership'
172 user_actions.connect 'users/:id/memberships', :action => 'edit_membership'
171 user_actions.connect 'users/:id/memberships/:membership_id', :action => 'edit_membership'
173 user_actions.connect 'users/:id/memberships/:membership_id', :action => 'edit_membership'
172 user_actions.connect 'users/:id/memberships/:membership_id/destroy', :action => 'destroy_membership'
174 user_actions.connect 'users/:id/memberships/:membership_id/destroy', :action => 'destroy_membership'
173 end
175 end
174 end
176 end
175
177
176 # For nice "roadmap" in the url for the index action
178 # For nice "roadmap" in the url for the index action
177 map.connect 'projects/:project_id/roadmap', :controller => 'versions', :action => 'index'
179 map.connect 'projects/:project_id/roadmap', :controller => 'versions', :action => 'index'
178
180
179 map.resources :projects, :member => {
181 map.resources :projects, :member => {
180 :copy => [:get, :post],
182 :copy => [:get, :post],
181 :settings => :get,
183 :settings => :get,
182 :modules => :post,
184 :modules => :post,
183 :archive => :post,
185 :archive => :post,
184 :unarchive => :post
186 :unarchive => :post
185 } do |project|
187 } do |project|
186 project.resource :project_enumerations, :as => 'enumerations', :only => [:update, :destroy]
188 project.resource :project_enumerations, :as => 'enumerations', :only => [:update, :destroy]
187 project.resources :files, :only => [:index, :new, :create]
189 project.resources :files, :only => [:index, :new, :create]
188 project.resources :versions, :collection => {:close_completed => :put}, :member => {:status_by => :post}
190 project.resources :versions, :collection => {:close_completed => :put}, :member => {:status_by => :post}
189 end
191 end
190
192
191 # Destroy uses a get request to prompt the user before the actual DELETE request
193 # Destroy uses a get request to prompt the user before the actual DELETE request
192 map.project_destroy_confirm 'projects/:id/destroy', :controller => 'projects', :action => 'destroy', :conditions => {:method => :get}
194 map.project_destroy_confirm 'projects/:id/destroy', :controller => 'projects', :action => 'destroy', :conditions => {:method => :get}
193
195
194 # TODO: port to be part of the resources route(s)
196 # TODO: port to be part of the resources route(s)
195 map.with_options :controller => 'projects' do |project_mapper|
197 map.with_options :controller => 'projects' do |project_mapper|
196 project_mapper.with_options :conditions => {:method => :get} do |project_views|
198 project_mapper.with_options :conditions => {:method => :get} do |project_views|
197 project_views.connect 'projects/:id/settings/:tab', :controller => 'projects', :action => 'settings'
199 project_views.connect 'projects/:id/settings/:tab', :controller => 'projects', :action => 'settings'
198 project_views.connect 'projects/:project_id/issues/:copy_from/copy', :controller => 'issues', :action => 'new'
200 project_views.connect 'projects/:project_id/issues/:copy_from/copy', :controller => 'issues', :action => 'new'
199 end
201 end
200 end
202 end
201
203
202 map.with_options :controller => 'activities', :action => 'index', :conditions => {:method => :get} do |activity|
204 map.with_options :controller => 'activities', :action => 'index', :conditions => {:method => :get} do |activity|
203 activity.connect 'projects/:id/activity'
205 activity.connect 'projects/:id/activity'
204 activity.connect 'projects/:id/activity.:format'
206 activity.connect 'projects/:id/activity.:format'
205 activity.connect 'activity', :id => nil
207 activity.connect 'activity', :id => nil
206 activity.connect 'activity.:format', :id => nil
208 activity.connect 'activity.:format', :id => nil
207 end
209 end
208
210
209
211
210 map.with_options :controller => 'issue_categories' do |categories|
212 map.with_options :controller => 'issue_categories' do |categories|
211 categories.connect 'projects/:project_id/issue_categories/new', :action => 'new'
213 categories.connect 'projects/:project_id/issue_categories/new', :action => 'new'
212 end
214 end
213
215
214 map.with_options :controller => 'repositories' do |repositories|
216 map.with_options :controller => 'repositories' do |repositories|
215 repositories.with_options :conditions => {:method => :get} do |repository_views|
217 repositories.with_options :conditions => {:method => :get} do |repository_views|
216 repository_views.connect 'projects/:id/repository', :action => 'show'
218 repository_views.connect 'projects/:id/repository', :action => 'show'
217 repository_views.connect 'projects/:id/repository/edit', :action => 'edit'
219 repository_views.connect 'projects/:id/repository/edit', :action => 'edit'
218 repository_views.connect 'projects/:id/repository/statistics', :action => 'stats'
220 repository_views.connect 'projects/:id/repository/statistics', :action => 'stats'
219 repository_views.connect 'projects/:id/repository/revisions', :action => 'revisions'
221 repository_views.connect 'projects/:id/repository/revisions', :action => 'revisions'
220 repository_views.connect 'projects/:id/repository/revisions.:format', :action => 'revisions'
222 repository_views.connect 'projects/:id/repository/revisions.:format', :action => 'revisions'
221 repository_views.connect 'projects/:id/repository/revisions/:rev', :action => 'revision'
223 repository_views.connect 'projects/:id/repository/revisions/:rev', :action => 'revision'
222 repository_views.connect 'projects/:id/repository/revisions/:rev/diff', :action => 'diff'
224 repository_views.connect 'projects/:id/repository/revisions/:rev/diff', :action => 'diff'
223 repository_views.connect 'projects/:id/repository/revisions/:rev/diff.:format', :action => 'diff'
225 repository_views.connect 'projects/:id/repository/revisions/:rev/diff.:format', :action => 'diff'
224 repository_views.connect 'projects/:id/repository/revisions/:rev/raw/*path', :action => 'entry', :format => 'raw', :requirements => { :rev => /[a-z0-9\.\-_]+/ }
226 repository_views.connect 'projects/:id/repository/revisions/:rev/raw/*path', :action => 'entry', :format => 'raw', :requirements => { :rev => /[a-z0-9\.\-_]+/ }
225 repository_views.connect 'projects/:id/repository/revisions/:rev/:action/*path', :requirements => { :rev => /[a-z0-9\.\-_]+/ }
227 repository_views.connect 'projects/:id/repository/revisions/:rev/:action/*path', :requirements => { :rev => /[a-z0-9\.\-_]+/ }
226 repository_views.connect 'projects/:id/repository/raw/*path', :action => 'entry', :format => 'raw'
228 repository_views.connect 'projects/:id/repository/raw/*path', :action => 'entry', :format => 'raw'
227 # TODO: why the following route is required?
229 # TODO: why the following route is required?
228 repository_views.connect 'projects/:id/repository/entry/*path', :action => 'entry'
230 repository_views.connect 'projects/:id/repository/entry/*path', :action => 'entry'
229 repository_views.connect 'projects/:id/repository/:action/*path'
231 repository_views.connect 'projects/:id/repository/:action/*path'
230 end
232 end
231
233
232 repositories.connect 'projects/:id/repository/:action', :conditions => {:method => :post}
234 repositories.connect 'projects/:id/repository/:action', :conditions => {:method => :post}
233 end
235 end
234
236
235 map.connect 'attachments/:id', :controller => 'attachments', :action => 'show', :id => /\d+/
237 map.connect 'attachments/:id', :controller => 'attachments', :action => 'show', :id => /\d+/
236 map.connect 'attachments/:id/:filename', :controller => 'attachments', :action => 'show', :id => /\d+/, :filename => /.*/
238 map.connect 'attachments/:id/:filename', :controller => 'attachments', :action => 'show', :id => /\d+/, :filename => /.*/
237 map.connect 'attachments/download/:id/:filename', :controller => 'attachments', :action => 'download', :id => /\d+/, :filename => /.*/
239 map.connect 'attachments/download/:id/:filename', :controller => 'attachments', :action => 'download', :id => /\d+/, :filename => /.*/
238
240
239 map.resources :groups
241 map.resources :groups
240
242
241 #left old routes at the bottom for backwards compat
243 #left old routes at the bottom for backwards compat
242 map.connect 'projects/:project_id/issues/:action', :controller => 'issues'
244 map.connect 'projects/:project_id/issues/:action', :controller => 'issues'
243 map.connect 'projects/:project_id/documents/:action', :controller => 'documents'
245 map.connect 'projects/:project_id/documents/:action', :controller => 'documents'
244 map.connect 'projects/:project_id/boards/:action/:id', :controller => 'boards'
246 map.connect 'projects/:project_id/boards/:action/:id', :controller => 'boards'
245 map.connect 'boards/:board_id/topics/:action/:id', :controller => 'messages'
247 map.connect 'boards/:board_id/topics/:action/:id', :controller => 'messages'
246 map.connect 'wiki/:id/:page/:action', :page => nil, :controller => 'wiki'
248 map.connect 'wiki/:id/:page/:action', :page => nil, :controller => 'wiki'
247 map.connect 'issues/:issue_id/relations/:action/:id', :controller => 'issue_relations'
249 map.connect 'issues/:issue_id/relations/:action/:id', :controller => 'issue_relations'
248 map.connect 'projects/:project_id/news/:action', :controller => 'news'
250 map.connect 'projects/:project_id/news/:action', :controller => 'news'
249 map.connect 'projects/:project_id/timelog/:action/:id', :controller => 'timelog', :project_id => /.+/
251 map.connect 'projects/:project_id/timelog/:action/:id', :controller => 'timelog', :project_id => /.+/
250 map.with_options :controller => 'repositories' do |omap|
252 map.with_options :controller => 'repositories' do |omap|
251 omap.repositories_show 'repositories/browse/:id/*path', :action => 'browse'
253 omap.repositories_show 'repositories/browse/:id/*path', :action => 'browse'
252 omap.repositories_changes 'repositories/changes/:id/*path', :action => 'changes'
254 omap.repositories_changes 'repositories/changes/:id/*path', :action => 'changes'
253 omap.repositories_diff 'repositories/diff/:id/*path', :action => 'diff'
255 omap.repositories_diff 'repositories/diff/:id/*path', :action => 'diff'
254 omap.repositories_entry 'repositories/entry/:id/*path', :action => 'entry'
256 omap.repositories_entry 'repositories/entry/:id/*path', :action => 'entry'
255 omap.repositories_entry 'repositories/annotate/:id/*path', :action => 'annotate'
257 omap.repositories_entry 'repositories/annotate/:id/*path', :action => 'annotate'
256 omap.connect 'repositories/revision/:id/:rev', :action => 'revision'
258 omap.connect 'repositories/revision/:id/:rev', :action => 'revision'
257 end
259 end
258
260
259 map.with_options :controller => 'sys' do |sys|
261 map.with_options :controller => 'sys' do |sys|
260 sys.connect 'sys/projects.:format', :action => 'projects', :conditions => {:method => :get}
262 sys.connect 'sys/projects.:format', :action => 'projects', :conditions => {:method => :get}
261 sys.connect 'sys/projects/:id/repository.:format', :action => 'create_project_repository', :conditions => {:method => :post}
263 sys.connect 'sys/projects/:id/repository.:format', :action => 'create_project_repository', :conditions => {:method => :post}
262 end
264 end
263
265
264 # Install the default route as the lowest priority.
266 # Install the default route as the lowest priority.
265 map.connect ':controller/:action/:id'
267 map.connect ':controller/:action/:id'
266 map.connect 'robots.txt', :controller => 'welcome', :action => 'robots'
268 map.connect 'robots.txt', :controller => 'welcome', :action => 'robots'
267 # Used for OpenID
269 # Used for OpenID
268 map.root :controller => 'account', :action => 'login'
270 map.root :controller => 'account', :action => 'login'
269 end
271 end
@@ -1,230 +1,230
1 require 'redmine/access_control'
1 require 'redmine/access_control'
2 require 'redmine/menu_manager'
2 require 'redmine/menu_manager'
3 require 'redmine/activity'
3 require 'redmine/activity'
4 require 'redmine/search'
4 require 'redmine/search'
5 require 'redmine/custom_field_format'
5 require 'redmine/custom_field_format'
6 require 'redmine/mime_type'
6 require 'redmine/mime_type'
7 require 'redmine/core_ext'
7 require 'redmine/core_ext'
8 require 'redmine/themes'
8 require 'redmine/themes'
9 require 'redmine/hook'
9 require 'redmine/hook'
10 require 'redmine/plugin'
10 require 'redmine/plugin'
11 require 'redmine/wiki_formatting'
11 require 'redmine/wiki_formatting'
12 require 'redmine/scm/base'
12 require 'redmine/scm/base'
13
13
14 begin
14 begin
15 require_library_or_gem 'RMagick' unless Object.const_defined?(:Magick)
15 require_library_or_gem 'RMagick' unless Object.const_defined?(:Magick)
16 rescue LoadError
16 rescue LoadError
17 # RMagick is not available
17 # RMagick is not available
18 end
18 end
19
19
20 if RUBY_VERSION < '1.9'
20 if RUBY_VERSION < '1.9'
21 require 'faster_csv'
21 require 'faster_csv'
22 else
22 else
23 require 'csv'
23 require 'csv'
24 FCSV = CSV
24 FCSV = CSV
25 end
25 end
26
26
27 Redmine::Scm::Base.add "Subversion"
27 Redmine::Scm::Base.add "Subversion"
28 Redmine::Scm::Base.add "Darcs"
28 Redmine::Scm::Base.add "Darcs"
29 Redmine::Scm::Base.add "Mercurial"
29 Redmine::Scm::Base.add "Mercurial"
30 Redmine::Scm::Base.add "Cvs"
30 Redmine::Scm::Base.add "Cvs"
31 Redmine::Scm::Base.add "Bazaar"
31 Redmine::Scm::Base.add "Bazaar"
32 Redmine::Scm::Base.add "Git"
32 Redmine::Scm::Base.add "Git"
33 Redmine::Scm::Base.add "Filesystem"
33 Redmine::Scm::Base.add "Filesystem"
34
34
35 Redmine::CustomFieldFormat.map do |fields|
35 Redmine::CustomFieldFormat.map do |fields|
36 fields.register Redmine::CustomFieldFormat.new('string', :label => :label_string, :order => 1)
36 fields.register Redmine::CustomFieldFormat.new('string', :label => :label_string, :order => 1)
37 fields.register Redmine::CustomFieldFormat.new('text', :label => :label_text, :order => 2)
37 fields.register Redmine::CustomFieldFormat.new('text', :label => :label_text, :order => 2)
38 fields.register Redmine::CustomFieldFormat.new('int', :label => :label_integer, :order => 3)
38 fields.register Redmine::CustomFieldFormat.new('int', :label => :label_integer, :order => 3)
39 fields.register Redmine::CustomFieldFormat.new('float', :label => :label_float, :order => 4)
39 fields.register Redmine::CustomFieldFormat.new('float', :label => :label_float, :order => 4)
40 fields.register Redmine::CustomFieldFormat.new('list', :label => :label_list, :order => 5)
40 fields.register Redmine::CustomFieldFormat.new('list', :label => :label_list, :order => 5)
41 fields.register Redmine::CustomFieldFormat.new('date', :label => :label_date, :order => 6)
41 fields.register Redmine::CustomFieldFormat.new('date', :label => :label_date, :order => 6)
42 fields.register Redmine::CustomFieldFormat.new('bool', :label => :label_boolean, :order => 7)
42 fields.register Redmine::CustomFieldFormat.new('bool', :label => :label_boolean, :order => 7)
43 end
43 end
44
44
45 # Permissions
45 # Permissions
46 Redmine::AccessControl.map do |map|
46 Redmine::AccessControl.map do |map|
47 map.permission :view_project, {:projects => [:show], :activities => [:index]}, :public => true
47 map.permission :view_project, {:projects => [:show], :activities => [:index]}, :public => true
48 map.permission :search_project, {:search => :index}, :public => true
48 map.permission :search_project, {:search => :index}, :public => true
49 map.permission :add_project, {:projects => [:new, :create]}, :require => :loggedin
49 map.permission :add_project, {:projects => [:new, :create]}, :require => :loggedin
50 map.permission :edit_project, {:projects => [:settings, :edit, :update]}, :require => :member
50 map.permission :edit_project, {:projects => [:settings, :edit, :update]}, :require => :member
51 map.permission :select_project_modules, {:projects => :modules}, :require => :member
51 map.permission :select_project_modules, {:projects => :modules}, :require => :member
52 map.permission :manage_members, {:projects => :settings, :members => [:new, :edit, :destroy, :autocomplete_for_member]}, :require => :member
52 map.permission :manage_members, {:projects => :settings, :members => [:new, :edit, :destroy, :autocomplete_for_member]}, :require => :member
53 map.permission :manage_versions, {:projects => :settings, :versions => [:new, :create, :edit, :update, :close_completed, :destroy]}, :require => :member
53 map.permission :manage_versions, {:projects => :settings, :versions => [:new, :create, :edit, :update, :close_completed, :destroy]}, :require => :member
54 map.permission :add_subprojects, {:projects => [:new, :create]}, :require => :member
54 map.permission :add_subprojects, {:projects => [:new, :create]}, :require => :member
55
55
56 map.project_module :issue_tracking do |map|
56 map.project_module :issue_tracking do |map|
57 # Issue categories
57 # Issue categories
58 map.permission :manage_categories, {:projects => :settings, :issue_categories => [:new, :edit, :destroy]}, :require => :member
58 map.permission :manage_categories, {:projects => :settings, :issue_categories => [:new, :edit, :destroy]}, :require => :member
59 # Issues
59 # Issues
60 map.permission :view_issues, {:issues => [:index, :show],
60 map.permission :view_issues, {:issues => [:index, :show],
61 :auto_complete => [:issues],
61 :auto_complete => [:issues],
62 :context_menus => [:issues],
62 :context_menus => [:issues],
63 :versions => [:index, :show, :status_by],
63 :versions => [:index, :show, :status_by],
64 :journals => :index,
64 :journals => :index,
65 :queries => :index,
65 :queries => :index,
66 :reports => [:issue_report, :issue_report_details]}
66 :reports => [:issue_report, :issue_report_details]}
67 map.permission :add_issues, {:issues => [:new, :create, :update_form]}
67 map.permission :add_issues, {:issues => [:new, :create, :update_form]}
68 map.permission :edit_issues, {:issues => [:edit, :update, :bulk_edit, :bulk_update, :update_form], :journals => [:new]}
68 map.permission :edit_issues, {:issues => [:edit, :update, :bulk_edit, :bulk_update, :update_form], :journals => [:new]}
69 map.permission :manage_issue_relations, {:issue_relations => [:new, :destroy]}
69 map.permission :manage_issue_relations, {:issue_relations => [:new, :destroy]}
70 map.permission :manage_subtasks, {}
70 map.permission :manage_subtasks, {}
71 map.permission :add_issue_notes, {:issues => [:edit, :update], :journals => [:new]}
71 map.permission :add_issue_notes, {:issues => [:edit, :update], :journals => [:new]}
72 map.permission :edit_issue_notes, {:journals => :edit}, :require => :loggedin
72 map.permission :edit_issue_notes, {:journals => :edit}, :require => :loggedin
73 map.permission :edit_own_issue_notes, {:journals => :edit}, :require => :loggedin
73 map.permission :edit_own_issue_notes, {:journals => :edit}, :require => :loggedin
74 map.permission :move_issues, {:issue_moves => [:new, :create]}, :require => :loggedin
74 map.permission :move_issues, {:issue_moves => [:new, :create]}, :require => :loggedin
75 map.permission :delete_issues, {:issues => :destroy}, :require => :member
75 map.permission :delete_issues, {:issues => :destroy}, :require => :member
76 # Queries
76 # Queries
77 map.permission :manage_public_queries, {:queries => [:new, :edit, :destroy]}, :require => :member
77 map.permission :manage_public_queries, {:queries => [:new, :edit, :destroy]}, :require => :member
78 map.permission :save_queries, {:queries => [:new, :edit, :destroy]}, :require => :loggedin
78 map.permission :save_queries, {:queries => [:new, :edit, :destroy]}, :require => :loggedin
79 # Watchers
79 # Watchers
80 map.permission :view_issue_watchers, {}
80 map.permission :view_issue_watchers, {}
81 map.permission :add_issue_watchers, {:watchers => :new}
81 map.permission :add_issue_watchers, {:watchers => :new}
82 map.permission :delete_issue_watchers, {:watchers => :destroy}
82 map.permission :delete_issue_watchers, {:watchers => :destroy}
83 end
83 end
84
84
85 map.project_module :time_tracking do |map|
85 map.project_module :time_tracking do |map|
86 map.permission :log_time, {:timelog => :edit}, :require => :loggedin
86 map.permission :log_time, {:timelog => :edit}, :require => :loggedin
87 map.permission :view_time_entries, :timelog => [:details, :report]
87 map.permission :view_time_entries, :timelog => [:details, :report]
88 map.permission :edit_time_entries, {:timelog => [:edit, :destroy]}, :require => :member
88 map.permission :edit_time_entries, {:timelog => [:edit, :destroy]}, :require => :member
89 map.permission :edit_own_time_entries, {:timelog => [:edit, :destroy]}, :require => :loggedin
89 map.permission :edit_own_time_entries, {:timelog => [:edit, :destroy]}, :require => :loggedin
90 map.permission :manage_project_activities, {:project_enumerations => [:update, :destroy]}, :require => :member
90 map.permission :manage_project_activities, {:project_enumerations => [:update, :destroy]}, :require => :member
91 end
91 end
92
92
93 map.project_module :news do |map|
93 map.project_module :news do |map|
94 map.permission :manage_news, {:news => [:new, :create, :edit, :update, :destroy, :destroy_comment]}, :require => :member
94 map.permission :manage_news, {:news => [:new, :create, :edit, :update, :destroy, :destroy_comment]}, :require => :member
95 map.permission :view_news, {:news => [:index, :show]}, :public => true
95 map.permission :view_news, {:news => [:index, :show]}, :public => true
96 map.permission :comment_news, {:news => :add_comment}
96 map.permission :comment_news, {:comments => :create}
97 end
97 end
98
98
99 map.project_module :documents do |map|
99 map.project_module :documents do |map|
100 map.permission :manage_documents, {:documents => [:new, :edit, :destroy, :add_attachment]}, :require => :loggedin
100 map.permission :manage_documents, {:documents => [:new, :edit, :destroy, :add_attachment]}, :require => :loggedin
101 map.permission :view_documents, :documents => [:index, :show, :download]
101 map.permission :view_documents, :documents => [:index, :show, :download]
102 end
102 end
103
103
104 map.project_module :files do |map|
104 map.project_module :files do |map|
105 map.permission :manage_files, {:files => [:new, :create]}, :require => :loggedin
105 map.permission :manage_files, {:files => [:new, :create]}, :require => :loggedin
106 map.permission :view_files, :files => :index, :versions => :download
106 map.permission :view_files, :files => :index, :versions => :download
107 end
107 end
108
108
109 map.project_module :wiki do |map|
109 map.project_module :wiki do |map|
110 map.permission :manage_wiki, {:wikis => [:edit, :destroy]}, :require => :member
110 map.permission :manage_wiki, {:wikis => [:edit, :destroy]}, :require => :member
111 map.permission :rename_wiki_pages, {:wiki => :rename}, :require => :member
111 map.permission :rename_wiki_pages, {:wiki => :rename}, :require => :member
112 map.permission :delete_wiki_pages, {:wiki => :destroy}, :require => :member
112 map.permission :delete_wiki_pages, {:wiki => :destroy}, :require => :member
113 map.permission :view_wiki_pages, :wiki => [:index, :special]
113 map.permission :view_wiki_pages, :wiki => [:index, :special]
114 map.permission :export_wiki_pages, {}
114 map.permission :export_wiki_pages, {}
115 map.permission :view_wiki_edits, :wiki => [:history, :diff, :annotate]
115 map.permission :view_wiki_edits, :wiki => [:history, :diff, :annotate]
116 map.permission :edit_wiki_pages, :wiki => [:edit, :preview, :add_attachment]
116 map.permission :edit_wiki_pages, :wiki => [:edit, :preview, :add_attachment]
117 map.permission :delete_wiki_pages_attachments, {}
117 map.permission :delete_wiki_pages_attachments, {}
118 map.permission :protect_wiki_pages, {:wiki => :protect}, :require => :member
118 map.permission :protect_wiki_pages, {:wiki => :protect}, :require => :member
119 end
119 end
120
120
121 map.project_module :repository do |map|
121 map.project_module :repository do |map|
122 map.permission :manage_repository, {:repositories => [:edit, :committers, :destroy]}, :require => :member
122 map.permission :manage_repository, {:repositories => [:edit, :committers, :destroy]}, :require => :member
123 map.permission :browse_repository, :repositories => [:show, :browse, :entry, :annotate, :changes, :diff, :stats, :graph]
123 map.permission :browse_repository, :repositories => [:show, :browse, :entry, :annotate, :changes, :diff, :stats, :graph]
124 map.permission :view_changesets, :repositories => [:show, :revisions, :revision]
124 map.permission :view_changesets, :repositories => [:show, :revisions, :revision]
125 map.permission :commit_access, {}
125 map.permission :commit_access, {}
126 end
126 end
127
127
128 map.project_module :boards do |map|
128 map.project_module :boards do |map|
129 map.permission :manage_boards, {:boards => [:new, :edit, :destroy]}, :require => :member
129 map.permission :manage_boards, {:boards => [:new, :edit, :destroy]}, :require => :member
130 map.permission :view_messages, {:boards => [:index, :show], :messages => [:show]}, :public => true
130 map.permission :view_messages, {:boards => [:index, :show], :messages => [:show]}, :public => true
131 map.permission :add_messages, {:messages => [:new, :reply, :quote]}
131 map.permission :add_messages, {:messages => [:new, :reply, :quote]}
132 map.permission :edit_messages, {:messages => :edit}, :require => :member
132 map.permission :edit_messages, {:messages => :edit}, :require => :member
133 map.permission :edit_own_messages, {:messages => :edit}, :require => :loggedin
133 map.permission :edit_own_messages, {:messages => :edit}, :require => :loggedin
134 map.permission :delete_messages, {:messages => :destroy}, :require => :member
134 map.permission :delete_messages, {:messages => :destroy}, :require => :member
135 map.permission :delete_own_messages, {:messages => :destroy}, :require => :loggedin
135 map.permission :delete_own_messages, {:messages => :destroy}, :require => :loggedin
136 end
136 end
137
137
138 map.project_module :calendar do |map|
138 map.project_module :calendar do |map|
139 map.permission :view_calendar, :calendars => [:show, :update]
139 map.permission :view_calendar, :calendars => [:show, :update]
140 end
140 end
141
141
142 map.project_module :gantt do |map|
142 map.project_module :gantt do |map|
143 map.permission :view_gantt, :gantts => [:show, :update]
143 map.permission :view_gantt, :gantts => [:show, :update]
144 end
144 end
145 end
145 end
146
146
147 Redmine::MenuManager.map :top_menu do |menu|
147 Redmine::MenuManager.map :top_menu do |menu|
148 menu.push :home, :home_path
148 menu.push :home, :home_path
149 menu.push :my_page, { :controller => 'my', :action => 'page' }, :if => Proc.new { User.current.logged? }
149 menu.push :my_page, { :controller => 'my', :action => 'page' }, :if => Proc.new { User.current.logged? }
150 menu.push :projects, { :controller => 'projects', :action => 'index' }, :caption => :label_project_plural
150 menu.push :projects, { :controller => 'projects', :action => 'index' }, :caption => :label_project_plural
151 menu.push :administration, { :controller => 'admin', :action => 'index' }, :if => Proc.new { User.current.admin? }, :last => true
151 menu.push :administration, { :controller => 'admin', :action => 'index' }, :if => Proc.new { User.current.admin? }, :last => true
152 menu.push :help, Redmine::Info.help_url, :last => true
152 menu.push :help, Redmine::Info.help_url, :last => true
153 end
153 end
154
154
155 Redmine::MenuManager.map :account_menu do |menu|
155 Redmine::MenuManager.map :account_menu do |menu|
156 menu.push :login, :signin_path, :if => Proc.new { !User.current.logged? }
156 menu.push :login, :signin_path, :if => Proc.new { !User.current.logged? }
157 menu.push :register, { :controller => 'account', :action => 'register' }, :if => Proc.new { !User.current.logged? && Setting.self_registration? }
157 menu.push :register, { :controller => 'account', :action => 'register' }, :if => Proc.new { !User.current.logged? && Setting.self_registration? }
158 menu.push :my_account, { :controller => 'my', :action => 'account' }, :if => Proc.new { User.current.logged? }
158 menu.push :my_account, { :controller => 'my', :action => 'account' }, :if => Proc.new { User.current.logged? }
159 menu.push :logout, :signout_path, :if => Proc.new { User.current.logged? }
159 menu.push :logout, :signout_path, :if => Proc.new { User.current.logged? }
160 end
160 end
161
161
162 Redmine::MenuManager.map :application_menu do |menu|
162 Redmine::MenuManager.map :application_menu do |menu|
163 # Empty
163 # Empty
164 end
164 end
165
165
166 Redmine::MenuManager.map :admin_menu do |menu|
166 Redmine::MenuManager.map :admin_menu do |menu|
167 menu.push :projects, {:controller => 'admin', :action => 'projects'}, :caption => :label_project_plural
167 menu.push :projects, {:controller => 'admin', :action => 'projects'}, :caption => :label_project_plural
168 menu.push :users, {:controller => 'users'}, :caption => :label_user_plural
168 menu.push :users, {:controller => 'users'}, :caption => :label_user_plural
169 menu.push :groups, {:controller => 'groups'}, :caption => :label_group_plural
169 menu.push :groups, {:controller => 'groups'}, :caption => :label_group_plural
170 menu.push :roles, {:controller => 'roles'}, :caption => :label_role_and_permissions
170 menu.push :roles, {:controller => 'roles'}, :caption => :label_role_and_permissions
171 menu.push :trackers, {:controller => 'trackers'}, :caption => :label_tracker_plural
171 menu.push :trackers, {:controller => 'trackers'}, :caption => :label_tracker_plural
172 menu.push :issue_statuses, {:controller => 'issue_statuses'}, :caption => :label_issue_status_plural,
172 menu.push :issue_statuses, {:controller => 'issue_statuses'}, :caption => :label_issue_status_plural,
173 :html => {:class => 'issue_statuses'}
173 :html => {:class => 'issue_statuses'}
174 menu.push :workflows, {:controller => 'workflows', :action => 'edit'}, :caption => :label_workflow
174 menu.push :workflows, {:controller => 'workflows', :action => 'edit'}, :caption => :label_workflow
175 menu.push :custom_fields, {:controller => 'custom_fields'}, :caption => :label_custom_field_plural,
175 menu.push :custom_fields, {:controller => 'custom_fields'}, :caption => :label_custom_field_plural,
176 :html => {:class => 'custom_fields'}
176 :html => {:class => 'custom_fields'}
177 menu.push :enumerations, {:controller => 'enumerations'}
177 menu.push :enumerations, {:controller => 'enumerations'}
178 menu.push :settings, {:controller => 'settings'}
178 menu.push :settings, {:controller => 'settings'}
179 menu.push :ldap_authentication, {:controller => 'ldap_auth_sources', :action => 'index'},
179 menu.push :ldap_authentication, {:controller => 'ldap_auth_sources', :action => 'index'},
180 :html => {:class => 'server_authentication'}
180 :html => {:class => 'server_authentication'}
181 menu.push :plugins, {:controller => 'admin', :action => 'plugins'}, :last => true
181 menu.push :plugins, {:controller => 'admin', :action => 'plugins'}, :last => true
182 menu.push :info, {:controller => 'admin', :action => 'info'}, :caption => :label_information_plural, :last => true
182 menu.push :info, {:controller => 'admin', :action => 'info'}, :caption => :label_information_plural, :last => true
183 end
183 end
184
184
185 Redmine::MenuManager.map :project_menu do |menu|
185 Redmine::MenuManager.map :project_menu do |menu|
186 menu.push :overview, { :controller => 'projects', :action => 'show' }
186 menu.push :overview, { :controller => 'projects', :action => 'show' }
187 menu.push :activity, { :controller => 'activities', :action => 'index' }
187 menu.push :activity, { :controller => 'activities', :action => 'index' }
188 menu.push :roadmap, { :controller => 'versions', :action => 'index' }, :param => :project_id,
188 menu.push :roadmap, { :controller => 'versions', :action => 'index' }, :param => :project_id,
189 :if => Proc.new { |p| p.shared_versions.any? }
189 :if => Proc.new { |p| p.shared_versions.any? }
190 menu.push :issues, { :controller => 'issues', :action => 'index' }, :param => :project_id, :caption => :label_issue_plural
190 menu.push :issues, { :controller => 'issues', :action => 'index' }, :param => :project_id, :caption => :label_issue_plural
191 menu.push :new_issue, { :controller => 'issues', :action => 'new' }, :param => :project_id, :caption => :label_issue_new,
191 menu.push :new_issue, { :controller => 'issues', :action => 'new' }, :param => :project_id, :caption => :label_issue_new,
192 :html => { :accesskey => Redmine::AccessKeys.key_for(:new_issue) }
192 :html => { :accesskey => Redmine::AccessKeys.key_for(:new_issue) }
193 menu.push :gantt, { :controller => 'gantts', :action => 'show' }, :param => :project_id, :caption => :label_gantt
193 menu.push :gantt, { :controller => 'gantts', :action => 'show' }, :param => :project_id, :caption => :label_gantt
194 menu.push :calendar, { :controller => 'calendars', :action => 'show' }, :param => :project_id, :caption => :label_calendar
194 menu.push :calendar, { :controller => 'calendars', :action => 'show' }, :param => :project_id, :caption => :label_calendar
195 menu.push :news, { :controller => 'news', :action => 'index' }, :param => :project_id, :caption => :label_news_plural
195 menu.push :news, { :controller => 'news', :action => 'index' }, :param => :project_id, :caption => :label_news_plural
196 menu.push :documents, { :controller => 'documents', :action => 'index' }, :param => :project_id, :caption => :label_document_plural
196 menu.push :documents, { :controller => 'documents', :action => 'index' }, :param => :project_id, :caption => :label_document_plural
197 menu.push :wiki, { :controller => 'wiki', :action => 'index', :page => nil },
197 menu.push :wiki, { :controller => 'wiki', :action => 'index', :page => nil },
198 :if => Proc.new { |p| p.wiki && !p.wiki.new_record? }
198 :if => Proc.new { |p| p.wiki && !p.wiki.new_record? }
199 menu.push :boards, { :controller => 'boards', :action => 'index', :id => nil }, :param => :project_id,
199 menu.push :boards, { :controller => 'boards', :action => 'index', :id => nil }, :param => :project_id,
200 :if => Proc.new { |p| p.boards.any? }, :caption => :label_board_plural
200 :if => Proc.new { |p| p.boards.any? }, :caption => :label_board_plural
201 menu.push :files, { :controller => 'files', :action => 'index' }, :caption => :label_file_plural, :param => :project_id
201 menu.push :files, { :controller => 'files', :action => 'index' }, :caption => :label_file_plural, :param => :project_id
202 menu.push :repository, { :controller => 'repositories', :action => 'show' },
202 menu.push :repository, { :controller => 'repositories', :action => 'show' },
203 :if => Proc.new { |p| p.repository && !p.repository.new_record? }
203 :if => Proc.new { |p| p.repository && !p.repository.new_record? }
204 menu.push :settings, { :controller => 'projects', :action => 'settings' }, :last => true
204 menu.push :settings, { :controller => 'projects', :action => 'settings' }, :last => true
205 end
205 end
206
206
207 Redmine::Activity.map do |activity|
207 Redmine::Activity.map do |activity|
208 activity.register :issues, :class_name => %w(Issue Journal)
208 activity.register :issues, :class_name => %w(Issue Journal)
209 activity.register :changesets
209 activity.register :changesets
210 activity.register :news
210 activity.register :news
211 activity.register :documents, :class_name => %w(Document Attachment)
211 activity.register :documents, :class_name => %w(Document Attachment)
212 activity.register :files, :class_name => 'Attachment'
212 activity.register :files, :class_name => 'Attachment'
213 activity.register :wiki_edits, :class_name => 'WikiContent::Version', :default => false
213 activity.register :wiki_edits, :class_name => 'WikiContent::Version', :default => false
214 activity.register :messages, :default => false
214 activity.register :messages, :default => false
215 activity.register :time_entries, :default => false
215 activity.register :time_entries, :default => false
216 end
216 end
217
217
218 Redmine::Search.map do |search|
218 Redmine::Search.map do |search|
219 search.register :issues
219 search.register :issues
220 search.register :news
220 search.register :news
221 search.register :documents
221 search.register :documents
222 search.register :changesets
222 search.register :changesets
223 search.register :wiki_pages
223 search.register :wiki_pages
224 search.register :messages
224 search.register :messages
225 search.register :projects
225 search.register :projects
226 end
226 end
227
227
228 Redmine::WikiFormatting.map do |format|
228 Redmine::WikiFormatting.map do |format|
229 format.register :textile, Redmine::WikiFormatting::Textile::Formatter, Redmine::WikiFormatting::Textile::Helper
229 format.register :textile, Redmine::WikiFormatting::Textile::Formatter, Redmine::WikiFormatting::Textile::Helper
230 end
230 end
@@ -1,160 +1,140
1 # redMine - project management software
1 # redMine - project management software
2 # Copyright (C) 2006-2007 Jean-Philippe Lang
2 # Copyright (C) 2006-2007 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 require File.dirname(__FILE__) + '/../test_helper'
18 require File.dirname(__FILE__) + '/../test_helper'
19 require 'news_controller'
19 require 'news_controller'
20
20
21 # Re-raise errors caught by the controller.
21 # Re-raise errors caught by the controller.
22 class NewsController; def rescue_action(e) raise e end; end
22 class NewsController; def rescue_action(e) raise e end; end
23
23
24 class NewsControllerTest < ActionController::TestCase
24 class NewsControllerTest < ActionController::TestCase
25 fixtures :projects, :users, :roles, :members, :member_roles, :enabled_modules, :news, :comments
25 fixtures :projects, :users, :roles, :members, :member_roles, :enabled_modules, :news, :comments
26
26
27 def setup
27 def setup
28 @controller = NewsController.new
28 @controller = NewsController.new
29 @request = ActionController::TestRequest.new
29 @request = ActionController::TestRequest.new
30 @response = ActionController::TestResponse.new
30 @response = ActionController::TestResponse.new
31 User.current = nil
31 User.current = nil
32 end
32 end
33
33
34 def test_index
34 def test_index
35 get :index
35 get :index
36 assert_response :success
36 assert_response :success
37 assert_template 'index'
37 assert_template 'index'
38 assert_not_nil assigns(:newss)
38 assert_not_nil assigns(:newss)
39 assert_nil assigns(:project)
39 assert_nil assigns(:project)
40 end
40 end
41
41
42 def test_index_with_project
42 def test_index_with_project
43 get :index, :project_id => 1
43 get :index, :project_id => 1
44 assert_response :success
44 assert_response :success
45 assert_template 'index'
45 assert_template 'index'
46 assert_not_nil assigns(:newss)
46 assert_not_nil assigns(:newss)
47 end
47 end
48
48
49 def test_show
49 def test_show
50 get :show, :id => 1
50 get :show, :id => 1
51 assert_response :success
51 assert_response :success
52 assert_template 'show'
52 assert_template 'show'
53 assert_tag :tag => 'h2', :content => /eCookbook first release/
53 assert_tag :tag => 'h2', :content => /eCookbook first release/
54 end
54 end
55
55
56 def test_show_not_found
56 def test_show_not_found
57 get :show, :id => 999
57 get :show, :id => 999
58 assert_response 404
58 assert_response 404
59 end
59 end
60
60
61 def test_get_new
61 def test_get_new
62 @request.session[:user_id] = 2
62 @request.session[:user_id] = 2
63 get :new, :project_id => 1
63 get :new, :project_id => 1
64 assert_response :success
64 assert_response :success
65 assert_template 'new'
65 assert_template 'new'
66 end
66 end
67
67
68 def test_post_create
68 def test_post_create
69 ActionMailer::Base.deliveries.clear
69 ActionMailer::Base.deliveries.clear
70 Setting.notified_events << 'news_added'
70 Setting.notified_events << 'news_added'
71
71
72 @request.session[:user_id] = 2
72 @request.session[:user_id] = 2
73 post :create, :project_id => 1, :news => { :title => 'NewsControllerTest',
73 post :create, :project_id => 1, :news => { :title => 'NewsControllerTest',
74 :description => 'This is the description',
74 :description => 'This is the description',
75 :summary => '' }
75 :summary => '' }
76 assert_redirected_to 'projects/ecookbook/news'
76 assert_redirected_to 'projects/ecookbook/news'
77
77
78 news = News.find_by_title('NewsControllerTest')
78 news = News.find_by_title('NewsControllerTest')
79 assert_not_nil news
79 assert_not_nil news
80 assert_equal 'This is the description', news.description
80 assert_equal 'This is the description', news.description
81 assert_equal User.find(2), news.author
81 assert_equal User.find(2), news.author
82 assert_equal Project.find(1), news.project
82 assert_equal Project.find(1), news.project
83 assert_equal 1, ActionMailer::Base.deliveries.size
83 assert_equal 1, ActionMailer::Base.deliveries.size
84 end
84 end
85
85
86 def test_get_edit
86 def test_get_edit
87 @request.session[:user_id] = 2
87 @request.session[:user_id] = 2
88 get :edit, :id => 1
88 get :edit, :id => 1
89 assert_response :success
89 assert_response :success
90 assert_template 'edit'
90 assert_template 'edit'
91 end
91 end
92
92
93 def test_put_update
93 def test_put_update
94 @request.session[:user_id] = 2
94 @request.session[:user_id] = 2
95 put :update, :id => 1, :news => { :description => 'Description changed by test_post_edit' }
95 put :update, :id => 1, :news => { :description => 'Description changed by test_post_edit' }
96 assert_redirected_to 'news/1'
96 assert_redirected_to 'news/1'
97 news = News.find(1)
97 news = News.find(1)
98 assert_equal 'Description changed by test_post_edit', news.description
98 assert_equal 'Description changed by test_post_edit', news.description
99 end
99 end
100
100
101 def test_post_create_with_validation_failure
101 def test_post_create_with_validation_failure
102 @request.session[:user_id] = 2
102 @request.session[:user_id] = 2
103 post :create, :project_id => 1, :news => { :title => '',
103 post :create, :project_id => 1, :news => { :title => '',
104 :description => 'This is the description',
104 :description => 'This is the description',
105 :summary => '' }
105 :summary => '' }
106 assert_response :success
106 assert_response :success
107 assert_template 'new'
107 assert_template 'new'
108 assert_not_nil assigns(:news)
108 assert_not_nil assigns(:news)
109 assert assigns(:news).new_record?
109 assert assigns(:news).new_record?
110 assert_tag :tag => 'div', :attributes => { :id => 'errorExplanation' },
110 assert_tag :tag => 'div', :attributes => { :id => 'errorExplanation' },
111 :content => /1 error/
111 :content => /1 error/
112 end
112 end
113
113
114 def test_add_comment
115 @request.session[:user_id] = 2
116 post :add_comment, :id => 1, :comment => { :comments => 'This is a NewsControllerTest comment' }
117 assert_redirected_to 'news/1'
118
119 comment = News.find(1).comments.find(:first, :order => 'created_on DESC')
120 assert_not_nil comment
121 assert_equal 'This is a NewsControllerTest comment', comment.comments
122 assert_equal User.find(2), comment.author
123 end
124
125 def test_empty_comment_should_not_be_added
126 @request.session[:user_id] = 2
127 assert_no_difference 'Comment.count' do
128 post :add_comment, :id => 1, :comment => { :comments => '' }
129 assert_response :success
130 assert_template 'show'
131 end
132 end
133
134 def test_destroy_comment
114 def test_destroy_comment
135 comments_count = News.find(1).comments.size
115 comments_count = News.find(1).comments.size
136 @request.session[:user_id] = 2
116 @request.session[:user_id] = 2
137 post :destroy_comment, :id => 1, :comment_id => 2
117 post :destroy_comment, :id => 1, :comment_id => 2
138 assert_redirected_to 'news/1'
118 assert_redirected_to 'news/1'
139 assert_nil Comment.find_by_id(2)
119 assert_nil Comment.find_by_id(2)
140 assert_equal comments_count - 1, News.find(1).comments.size
120 assert_equal comments_count - 1, News.find(1).comments.size
141 end
121 end
142
122
143 def test_destroy
123 def test_destroy
144 @request.session[:user_id] = 2
124 @request.session[:user_id] = 2
145 post :destroy, :id => 1
125 post :destroy, :id => 1
146 assert_redirected_to 'projects/ecookbook/news'
126 assert_redirected_to 'projects/ecookbook/news'
147 assert_nil News.find_by_id(1)
127 assert_nil News.find_by_id(1)
148 end
128 end
149
129
150 def test_preview
130 def test_preview
151 get :preview, :project_id => 1,
131 get :preview, :project_id => 1,
152 :news => {:title => '',
132 :news => {:title => '',
153 :description => 'News description',
133 :description => 'News description',
154 :summary => ''}
134 :summary => ''}
155 assert_response :success
135 assert_response :success
156 assert_template 'common/_preview'
136 assert_template 'common/_preview'
157 assert_tag :tag => 'fieldset', :attributes => { :class => 'preview' },
137 assert_tag :tag => 'fieldset', :attributes => { :class => 'preview' },
158 :content => /News description/
138 :content => /News description/
159 end
139 end
160 end
140 end
@@ -1,298 +1,299
1 # redMine - project management software
1 # redMine - project management software
2 # Copyright (C) 2006-2010 Jean-Philippe Lang
2 # Copyright (C) 2006-2010 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 require "#{File.dirname(__FILE__)}/../test_helper"
18 require "#{File.dirname(__FILE__)}/../test_helper"
19
19
20 class RoutingTest < ActionController::IntegrationTest
20 class RoutingTest < ActionController::IntegrationTest
21 context "activities" do
21 context "activities" do
22 should_route :get, "/activity", :controller => 'activities', :action => 'index', :id => nil
22 should_route :get, "/activity", :controller => 'activities', :action => 'index', :id => nil
23 should_route :get, "/activity.atom", :controller => 'activities', :action => 'index', :id => nil, :format => 'atom'
23 should_route :get, "/activity.atom", :controller => 'activities', :action => 'index', :id => nil, :format => 'atom'
24 end
24 end
25
25
26 context "attachments" do
26 context "attachments" do
27 should_route :get, "/attachments/1", :controller => 'attachments', :action => 'show', :id => '1'
27 should_route :get, "/attachments/1", :controller => 'attachments', :action => 'show', :id => '1'
28 should_route :get, "/attachments/1/filename.ext", :controller => 'attachments', :action => 'show', :id => '1', :filename => 'filename.ext'
28 should_route :get, "/attachments/1/filename.ext", :controller => 'attachments', :action => 'show', :id => '1', :filename => 'filename.ext'
29 should_route :get, "/attachments/download/1", :controller => 'attachments', :action => 'download', :id => '1'
29 should_route :get, "/attachments/download/1", :controller => 'attachments', :action => 'download', :id => '1'
30 should_route :get, "/attachments/download/1/filename.ext", :controller => 'attachments', :action => 'download', :id => '1', :filename => 'filename.ext'
30 should_route :get, "/attachments/download/1/filename.ext", :controller => 'attachments', :action => 'download', :id => '1', :filename => 'filename.ext'
31 end
31 end
32
32
33 context "boards" do
33 context "boards" do
34 should_route :get, "/projects/world_domination/boards", :controller => 'boards', :action => 'index', :project_id => 'world_domination'
34 should_route :get, "/projects/world_domination/boards", :controller => 'boards', :action => 'index', :project_id => 'world_domination'
35 should_route :get, "/projects/world_domination/boards/new", :controller => 'boards', :action => 'new', :project_id => 'world_domination'
35 should_route :get, "/projects/world_domination/boards/new", :controller => 'boards', :action => 'new', :project_id => 'world_domination'
36 should_route :get, "/projects/world_domination/boards/44", :controller => 'boards', :action => 'show', :project_id => 'world_domination', :id => '44'
36 should_route :get, "/projects/world_domination/boards/44", :controller => 'boards', :action => 'show', :project_id => 'world_domination', :id => '44'
37 should_route :get, "/projects/world_domination/boards/44.atom", :controller => 'boards', :action => 'show', :project_id => 'world_domination', :id => '44', :format => 'atom'
37 should_route :get, "/projects/world_domination/boards/44.atom", :controller => 'boards', :action => 'show', :project_id => 'world_domination', :id => '44', :format => 'atom'
38 should_route :get, "/projects/world_domination/boards/44/edit", :controller => 'boards', :action => 'edit', :project_id => 'world_domination', :id => '44'
38 should_route :get, "/projects/world_domination/boards/44/edit", :controller => 'boards', :action => 'edit', :project_id => 'world_domination', :id => '44'
39
39
40 should_route :post, "/projects/world_domination/boards/new", :controller => 'boards', :action => 'new', :project_id => 'world_domination'
40 should_route :post, "/projects/world_domination/boards/new", :controller => 'boards', :action => 'new', :project_id => 'world_domination'
41 should_route :post, "/projects/world_domination/boards/44/edit", :controller => 'boards', :action => 'edit', :project_id => 'world_domination', :id => '44'
41 should_route :post, "/projects/world_domination/boards/44/edit", :controller => 'boards', :action => 'edit', :project_id => 'world_domination', :id => '44'
42 should_route :post, "/projects/world_domination/boards/44/destroy", :controller => 'boards', :action => 'destroy', :project_id => 'world_domination', :id => '44'
42 should_route :post, "/projects/world_domination/boards/44/destroy", :controller => 'boards', :action => 'destroy', :project_id => 'world_domination', :id => '44'
43
43
44 end
44 end
45
45
46 context "documents" do
46 context "documents" do
47 should_route :get, "/projects/567/documents", :controller => 'documents', :action => 'index', :project_id => '567'
47 should_route :get, "/projects/567/documents", :controller => 'documents', :action => 'index', :project_id => '567'
48 should_route :get, "/projects/567/documents/new", :controller => 'documents', :action => 'new', :project_id => '567'
48 should_route :get, "/projects/567/documents/new", :controller => 'documents', :action => 'new', :project_id => '567'
49 should_route :get, "/documents/22", :controller => 'documents', :action => 'show', :id => '22'
49 should_route :get, "/documents/22", :controller => 'documents', :action => 'show', :id => '22'
50 should_route :get, "/documents/22/edit", :controller => 'documents', :action => 'edit', :id => '22'
50 should_route :get, "/documents/22/edit", :controller => 'documents', :action => 'edit', :id => '22'
51
51
52 should_route :post, "/projects/567/documents/new", :controller => 'documents', :action => 'new', :project_id => '567'
52 should_route :post, "/projects/567/documents/new", :controller => 'documents', :action => 'new', :project_id => '567'
53 should_route :post, "/documents/567/edit", :controller => 'documents', :action => 'edit', :id => '567'
53 should_route :post, "/documents/567/edit", :controller => 'documents', :action => 'edit', :id => '567'
54 should_route :post, "/documents/567/destroy", :controller => 'documents', :action => 'destroy', :id => '567'
54 should_route :post, "/documents/567/destroy", :controller => 'documents', :action => 'destroy', :id => '567'
55 end
55 end
56
56
57 context "issues" do
57 context "issues" do
58 # REST actions
58 # REST actions
59 should_route :get, "/issues", :controller => 'issues', :action => 'index'
59 should_route :get, "/issues", :controller => 'issues', :action => 'index'
60 should_route :get, "/issues.pdf", :controller => 'issues', :action => 'index', :format => 'pdf'
60 should_route :get, "/issues.pdf", :controller => 'issues', :action => 'index', :format => 'pdf'
61 should_route :get, "/issues.atom", :controller => 'issues', :action => 'index', :format => 'atom'
61 should_route :get, "/issues.atom", :controller => 'issues', :action => 'index', :format => 'atom'
62 should_route :get, "/issues.xml", :controller => 'issues', :action => 'index', :format => 'xml'
62 should_route :get, "/issues.xml", :controller => 'issues', :action => 'index', :format => 'xml'
63 should_route :get, "/projects/23/issues", :controller => 'issues', :action => 'index', :project_id => '23'
63 should_route :get, "/projects/23/issues", :controller => 'issues', :action => 'index', :project_id => '23'
64 should_route :get, "/projects/23/issues.pdf", :controller => 'issues', :action => 'index', :project_id => '23', :format => 'pdf'
64 should_route :get, "/projects/23/issues.pdf", :controller => 'issues', :action => 'index', :project_id => '23', :format => 'pdf'
65 should_route :get, "/projects/23/issues.atom", :controller => 'issues', :action => 'index', :project_id => '23', :format => 'atom'
65 should_route :get, "/projects/23/issues.atom", :controller => 'issues', :action => 'index', :project_id => '23', :format => 'atom'
66 should_route :get, "/projects/23/issues.xml", :controller => 'issues', :action => 'index', :project_id => '23', :format => 'xml'
66 should_route :get, "/projects/23/issues.xml", :controller => 'issues', :action => 'index', :project_id => '23', :format => 'xml'
67 should_route :get, "/issues/64", :controller => 'issues', :action => 'show', :id => '64'
67 should_route :get, "/issues/64", :controller => 'issues', :action => 'show', :id => '64'
68 should_route :get, "/issues/64.pdf", :controller => 'issues', :action => 'show', :id => '64', :format => 'pdf'
68 should_route :get, "/issues/64.pdf", :controller => 'issues', :action => 'show', :id => '64', :format => 'pdf'
69 should_route :get, "/issues/64.atom", :controller => 'issues', :action => 'show', :id => '64', :format => 'atom'
69 should_route :get, "/issues/64.atom", :controller => 'issues', :action => 'show', :id => '64', :format => 'atom'
70 should_route :get, "/issues/64.xml", :controller => 'issues', :action => 'show', :id => '64', :format => 'xml'
70 should_route :get, "/issues/64.xml", :controller => 'issues', :action => 'show', :id => '64', :format => 'xml'
71
71
72 should_route :get, "/projects/23/issues/new", :controller => 'issues', :action => 'new', :project_id => '23'
72 should_route :get, "/projects/23/issues/new", :controller => 'issues', :action => 'new', :project_id => '23'
73 should_route :post, "/projects/23/issues", :controller => 'issues', :action => 'create', :project_id => '23'
73 should_route :post, "/projects/23/issues", :controller => 'issues', :action => 'create', :project_id => '23'
74 should_route :post, "/issues.xml", :controller => 'issues', :action => 'create', :format => 'xml'
74 should_route :post, "/issues.xml", :controller => 'issues', :action => 'create', :format => 'xml'
75
75
76 should_route :get, "/issues/64/edit", :controller => 'issues', :action => 'edit', :id => '64'
76 should_route :get, "/issues/64/edit", :controller => 'issues', :action => 'edit', :id => '64'
77 # TODO: Should use PUT
77 # TODO: Should use PUT
78 should_route :post, "/issues/64/edit", :controller => 'issues', :action => 'edit', :id => '64'
78 should_route :post, "/issues/64/edit", :controller => 'issues', :action => 'edit', :id => '64'
79 should_route :put, "/issues/1.xml", :controller => 'issues', :action => 'update', :id => '1', :format => 'xml'
79 should_route :put, "/issues/1.xml", :controller => 'issues', :action => 'update', :id => '1', :format => 'xml'
80
80
81 # TODO: Should use DELETE
81 # TODO: Should use DELETE
82 should_route :post, "/issues/64/destroy", :controller => 'issues', :action => 'destroy', :id => '64'
82 should_route :post, "/issues/64/destroy", :controller => 'issues', :action => 'destroy', :id => '64'
83 should_route :delete, "/issues/1.xml", :controller => 'issues', :action => 'destroy', :id => '1', :format => 'xml'
83 should_route :delete, "/issues/1.xml", :controller => 'issues', :action => 'destroy', :id => '1', :format => 'xml'
84
84
85 # Extra actions
85 # Extra actions
86 should_route :get, "/projects/23/issues/64/copy", :controller => 'issues', :action => 'new', :project_id => '23', :copy_from => '64'
86 should_route :get, "/projects/23/issues/64/copy", :controller => 'issues', :action => 'new', :project_id => '23', :copy_from => '64'
87
87
88 should_route :get, "/issues/move/new", :controller => 'issue_moves', :action => 'new'
88 should_route :get, "/issues/move/new", :controller => 'issue_moves', :action => 'new'
89 should_route :post, "/issues/move", :controller => 'issue_moves', :action => 'create'
89 should_route :post, "/issues/move", :controller => 'issue_moves', :action => 'create'
90
90
91 should_route :post, "/issues/1/quoted", :controller => 'journals', :action => 'new', :id => '1'
91 should_route :post, "/issues/1/quoted", :controller => 'journals', :action => 'new', :id => '1'
92
92
93 should_route :get, "/issues/calendar", :controller => 'calendars', :action => 'show'
93 should_route :get, "/issues/calendar", :controller => 'calendars', :action => 'show'
94 should_route :put, "/issues/calendar", :controller => 'calendars', :action => 'update'
94 should_route :put, "/issues/calendar", :controller => 'calendars', :action => 'update'
95 should_route :get, "/projects/project-name/issues/calendar", :controller => 'calendars', :action => 'show', :project_id => 'project-name'
95 should_route :get, "/projects/project-name/issues/calendar", :controller => 'calendars', :action => 'show', :project_id => 'project-name'
96 should_route :put, "/projects/project-name/issues/calendar", :controller => 'calendars', :action => 'update', :project_id => 'project-name'
96 should_route :put, "/projects/project-name/issues/calendar", :controller => 'calendars', :action => 'update', :project_id => 'project-name'
97
97
98 should_route :get, "/issues/gantt", :controller => 'gantts', :action => 'show'
98 should_route :get, "/issues/gantt", :controller => 'gantts', :action => 'show'
99 should_route :put, "/issues/gantt", :controller => 'gantts', :action => 'update'
99 should_route :put, "/issues/gantt", :controller => 'gantts', :action => 'update'
100 should_route :get, "/projects/project-name/issues/gantt", :controller => 'gantts', :action => 'show', :project_id => 'project-name'
100 should_route :get, "/projects/project-name/issues/gantt", :controller => 'gantts', :action => 'show', :project_id => 'project-name'
101 should_route :put, "/projects/project-name/issues/gantt", :controller => 'gantts', :action => 'update', :project_id => 'project-name'
101 should_route :put, "/projects/project-name/issues/gantt", :controller => 'gantts', :action => 'update', :project_id => 'project-name'
102
102
103 should_route :get, "/issues/auto_complete", :controller => 'auto_completes', :action => 'issues'
103 should_route :get, "/issues/auto_complete", :controller => 'auto_completes', :action => 'issues'
104
104
105 should_route :get, "/issues/preview/123", :controller => 'previews', :action => 'issue', :id => '123'
105 should_route :get, "/issues/preview/123", :controller => 'previews', :action => 'issue', :id => '123'
106 should_route :post, "/issues/preview/123", :controller => 'previews', :action => 'issue', :id => '123'
106 should_route :post, "/issues/preview/123", :controller => 'previews', :action => 'issue', :id => '123'
107 should_route :get, "/issues/context_menu", :controller => 'context_menus', :action => 'issues'
107 should_route :get, "/issues/context_menu", :controller => 'context_menus', :action => 'issues'
108 should_route :post, "/issues/context_menu", :controller => 'context_menus', :action => 'issues'
108 should_route :post, "/issues/context_menu", :controller => 'context_menus', :action => 'issues'
109
109
110 should_route :get, "/issues/changes", :controller => 'journals', :action => 'index'
110 should_route :get, "/issues/changes", :controller => 'journals', :action => 'index'
111
111
112 should_route :get, "/issues/bulk_edit", :controller => 'issues', :action => 'bulk_edit'
112 should_route :get, "/issues/bulk_edit", :controller => 'issues', :action => 'bulk_edit'
113 should_route :post, "/issues/bulk_edit", :controller => 'issues', :action => 'bulk_update'
113 should_route :post, "/issues/bulk_edit", :controller => 'issues', :action => 'bulk_update'
114 end
114 end
115
115
116 context "issue categories" do
116 context "issue categories" do
117 should_route :get, "/projects/test/issue_categories/new", :controller => 'issue_categories', :action => 'new', :project_id => 'test'
117 should_route :get, "/projects/test/issue_categories/new", :controller => 'issue_categories', :action => 'new', :project_id => 'test'
118
118
119 should_route :post, "/projects/test/issue_categories/new", :controller => 'issue_categories', :action => 'new', :project_id => 'test'
119 should_route :post, "/projects/test/issue_categories/new", :controller => 'issue_categories', :action => 'new', :project_id => 'test'
120 end
120 end
121
121
122 context "issue relations" do
122 context "issue relations" do
123 should_route :post, "/issues/1/relations", :controller => 'issue_relations', :action => 'new', :issue_id => '1'
123 should_route :post, "/issues/1/relations", :controller => 'issue_relations', :action => 'new', :issue_id => '1'
124 should_route :post, "/issues/1/relations/23/destroy", :controller => 'issue_relations', :action => 'destroy', :issue_id => '1', :id => '23'
124 should_route :post, "/issues/1/relations/23/destroy", :controller => 'issue_relations', :action => 'destroy', :issue_id => '1', :id => '23'
125 end
125 end
126
126
127 context "issue reports" do
127 context "issue reports" do
128 should_route :get, "/projects/567/issues/report", :controller => 'reports', :action => 'issue_report', :id => '567'
128 should_route :get, "/projects/567/issues/report", :controller => 'reports', :action => 'issue_report', :id => '567'
129 should_route :get, "/projects/567/issues/report/assigned_to", :controller => 'reports', :action => 'issue_report_details', :id => '567', :detail => 'assigned_to'
129 should_route :get, "/projects/567/issues/report/assigned_to", :controller => 'reports', :action => 'issue_report_details', :id => '567', :detail => 'assigned_to'
130 end
130 end
131
131
132 context "members" do
132 context "members" do
133 should_route :post, "/projects/5234/members/new", :controller => 'members', :action => 'new', :id => '5234'
133 should_route :post, "/projects/5234/members/new", :controller => 'members', :action => 'new', :id => '5234'
134 end
134 end
135
135
136 context "messages" do
136 context "messages" do
137 should_route :get, "/boards/22/topics/2", :controller => 'messages', :action => 'show', :id => '2', :board_id => '22'
137 should_route :get, "/boards/22/topics/2", :controller => 'messages', :action => 'show', :id => '2', :board_id => '22'
138 should_route :get, "/boards/lala/topics/new", :controller => 'messages', :action => 'new', :board_id => 'lala'
138 should_route :get, "/boards/lala/topics/new", :controller => 'messages', :action => 'new', :board_id => 'lala'
139 should_route :get, "/boards/lala/topics/22/edit", :controller => 'messages', :action => 'edit', :id => '22', :board_id => 'lala'
139 should_route :get, "/boards/lala/topics/22/edit", :controller => 'messages', :action => 'edit', :id => '22', :board_id => 'lala'
140
140
141 should_route :post, "/boards/lala/topics/new", :controller => 'messages', :action => 'new', :board_id => 'lala'
141 should_route :post, "/boards/lala/topics/new", :controller => 'messages', :action => 'new', :board_id => 'lala'
142 should_route :post, "/boards/lala/topics/22/edit", :controller => 'messages', :action => 'edit', :id => '22', :board_id => 'lala'
142 should_route :post, "/boards/lala/topics/22/edit", :controller => 'messages', :action => 'edit', :id => '22', :board_id => 'lala'
143 should_route :post, "/boards/22/topics/555/replies", :controller => 'messages', :action => 'reply', :id => '555', :board_id => '22'
143 should_route :post, "/boards/22/topics/555/replies", :controller => 'messages', :action => 'reply', :id => '555', :board_id => '22'
144 should_route :post, "/boards/22/topics/555/destroy", :controller => 'messages', :action => 'destroy', :id => '555', :board_id => '22'
144 should_route :post, "/boards/22/topics/555/destroy", :controller => 'messages', :action => 'destroy', :id => '555', :board_id => '22'
145 end
145 end
146
146
147 context "news" do
147 context "news" do
148 should_route :get, "/news", :controller => 'news', :action => 'index'
148 should_route :get, "/news", :controller => 'news', :action => 'index'
149 should_route :get, "/news.atom", :controller => 'news', :action => 'index', :format => 'atom'
149 should_route :get, "/news.atom", :controller => 'news', :action => 'index', :format => 'atom'
150 should_route :get, "/news.xml", :controller => 'news', :action => 'index', :format => 'xml'
150 should_route :get, "/news.xml", :controller => 'news', :action => 'index', :format => 'xml'
151 should_route :get, "/news.json", :controller => 'news', :action => 'index', :format => 'json'
151 should_route :get, "/news.json", :controller => 'news', :action => 'index', :format => 'json'
152 should_route :get, "/projects/567/news", :controller => 'news', :action => 'index', :project_id => '567'
152 should_route :get, "/projects/567/news", :controller => 'news', :action => 'index', :project_id => '567'
153 should_route :get, "/projects/567/news.atom", :controller => 'news', :action => 'index', :format => 'atom', :project_id => '567'
153 should_route :get, "/projects/567/news.atom", :controller => 'news', :action => 'index', :format => 'atom', :project_id => '567'
154 should_route :get, "/projects/567/news.xml", :controller => 'news', :action => 'index', :format => 'xml', :project_id => '567'
154 should_route :get, "/projects/567/news.xml", :controller => 'news', :action => 'index', :format => 'xml', :project_id => '567'
155 should_route :get, "/projects/567/news.json", :controller => 'news', :action => 'index', :format => 'json', :project_id => '567'
155 should_route :get, "/projects/567/news.json", :controller => 'news', :action => 'index', :format => 'json', :project_id => '567'
156 should_route :get, "/news/2", :controller => 'news', :action => 'show', :id => '2'
156 should_route :get, "/news/2", :controller => 'news', :action => 'show', :id => '2'
157 should_route :get, "/projects/567/news/new", :controller => 'news', :action => 'new', :project_id => '567'
157 should_route :get, "/projects/567/news/new", :controller => 'news', :action => 'new', :project_id => '567'
158 should_route :get, "/news/234", :controller => 'news', :action => 'show', :id => '234'
158 should_route :get, "/news/234", :controller => 'news', :action => 'show', :id => '234'
159 should_route :get, "/news/567/edit", :controller => 'news', :action => 'edit', :id => '567'
159 should_route :get, "/news/567/edit", :controller => 'news', :action => 'edit', :id => '567'
160
160
161 should_route :post, "/projects/567/news", :controller => 'news', :action => 'create', :project_id => '567'
161 should_route :post, "/projects/567/news", :controller => 'news', :action => 'create', :project_id => '567'
162 should_route :post, "/news/567/destroy", :controller => 'news', :action => 'destroy', :id => '567'
162 should_route :post, "/news/567/destroy", :controller => 'news', :action => 'destroy', :id => '567'
163 should_route :post, "/news/567/comments", :controller => 'comments', :action => 'create', :id => '567'
163
164
164 should_route :put, "/news/567/edit", :controller => 'news', :action => 'update', :id => '567'
165 should_route :put, "/news/567/edit", :controller => 'news', :action => 'update', :id => '567'
165 end
166 end
166
167
167 context "projects" do
168 context "projects" do
168 should_route :get, "/projects", :controller => 'projects', :action => 'index'
169 should_route :get, "/projects", :controller => 'projects', :action => 'index'
169 should_route :get, "/projects.atom", :controller => 'projects', :action => 'index', :format => 'atom'
170 should_route :get, "/projects.atom", :controller => 'projects', :action => 'index', :format => 'atom'
170 should_route :get, "/projects.xml", :controller => 'projects', :action => 'index', :format => 'xml'
171 should_route :get, "/projects.xml", :controller => 'projects', :action => 'index', :format => 'xml'
171 should_route :get, "/projects/new", :controller => 'projects', :action => 'new'
172 should_route :get, "/projects/new", :controller => 'projects', :action => 'new'
172 should_route :get, "/projects/test", :controller => 'projects', :action => 'show', :id => 'test'
173 should_route :get, "/projects/test", :controller => 'projects', :action => 'show', :id => 'test'
173 should_route :get, "/projects/1.xml", :controller => 'projects', :action => 'show', :id => '1', :format => 'xml'
174 should_route :get, "/projects/1.xml", :controller => 'projects', :action => 'show', :id => '1', :format => 'xml'
174 should_route :get, "/projects/4223/settings", :controller => 'projects', :action => 'settings', :id => '4223'
175 should_route :get, "/projects/4223/settings", :controller => 'projects', :action => 'settings', :id => '4223'
175 should_route :get, "/projects/4223/settings/members", :controller => 'projects', :action => 'settings', :id => '4223', :tab => 'members'
176 should_route :get, "/projects/4223/settings/members", :controller => 'projects', :action => 'settings', :id => '4223', :tab => 'members'
176 should_route :get, "/projects/33/files", :controller => 'files', :action => 'index', :project_id => '33'
177 should_route :get, "/projects/33/files", :controller => 'files', :action => 'index', :project_id => '33'
177 should_route :get, "/projects/33/files/new", :controller => 'files', :action => 'new', :project_id => '33'
178 should_route :get, "/projects/33/files/new", :controller => 'files', :action => 'new', :project_id => '33'
178 should_route :get, "/projects/33/roadmap", :controller => 'versions', :action => 'index', :project_id => '33'
179 should_route :get, "/projects/33/roadmap", :controller => 'versions', :action => 'index', :project_id => '33'
179 should_route :get, "/projects/33/activity", :controller => 'activities', :action => 'index', :id => '33'
180 should_route :get, "/projects/33/activity", :controller => 'activities', :action => 'index', :id => '33'
180 should_route :get, "/projects/33/activity.atom", :controller => 'activities', :action => 'index', :id => '33', :format => 'atom'
181 should_route :get, "/projects/33/activity.atom", :controller => 'activities', :action => 'index', :id => '33', :format => 'atom'
181
182
182 should_route :post, "/projects", :controller => 'projects', :action => 'create'
183 should_route :post, "/projects", :controller => 'projects', :action => 'create'
183 should_route :post, "/projects.xml", :controller => 'projects', :action => 'create', :format => 'xml'
184 should_route :post, "/projects.xml", :controller => 'projects', :action => 'create', :format => 'xml'
184 should_route :post, "/projects/33/files", :controller => 'files', :action => 'create', :project_id => '33'
185 should_route :post, "/projects/33/files", :controller => 'files', :action => 'create', :project_id => '33'
185 should_route :post, "/projects/64/archive", :controller => 'projects', :action => 'archive', :id => '64'
186 should_route :post, "/projects/64/archive", :controller => 'projects', :action => 'archive', :id => '64'
186 should_route :post, "/projects/64/unarchive", :controller => 'projects', :action => 'unarchive', :id => '64'
187 should_route :post, "/projects/64/unarchive", :controller => 'projects', :action => 'unarchive', :id => '64'
187
188
188 should_route :put, "/projects/64/enumerations", :controller => 'project_enumerations', :action => 'update', :project_id => '64'
189 should_route :put, "/projects/64/enumerations", :controller => 'project_enumerations', :action => 'update', :project_id => '64'
189 should_route :put, "/projects/4223", :controller => 'projects', :action => 'update', :id => '4223'
190 should_route :put, "/projects/4223", :controller => 'projects', :action => 'update', :id => '4223'
190 should_route :put, "/projects/1.xml", :controller => 'projects', :action => 'update', :id => '1', :format => 'xml'
191 should_route :put, "/projects/1.xml", :controller => 'projects', :action => 'update', :id => '1', :format => 'xml'
191
192
192 should_route :delete, "/projects/64", :controller => 'projects', :action => 'destroy', :id => '64'
193 should_route :delete, "/projects/64", :controller => 'projects', :action => 'destroy', :id => '64'
193 should_route :delete, "/projects/1.xml", :controller => 'projects', :action => 'destroy', :id => '1', :format => 'xml'
194 should_route :delete, "/projects/1.xml", :controller => 'projects', :action => 'destroy', :id => '1', :format => 'xml'
194 should_route :delete, "/projects/64/enumerations", :controller => 'project_enumerations', :action => 'destroy', :project_id => '64'
195 should_route :delete, "/projects/64/enumerations", :controller => 'project_enumerations', :action => 'destroy', :project_id => '64'
195 end
196 end
196
197
197 context "repositories" do
198 context "repositories" do
198 should_route :get, "/projects/redmine/repository", :controller => 'repositories', :action => 'show', :id => 'redmine'
199 should_route :get, "/projects/redmine/repository", :controller => 'repositories', :action => 'show', :id => 'redmine'
199 should_route :get, "/projects/redmine/repository/edit", :controller => 'repositories', :action => 'edit', :id => 'redmine'
200 should_route :get, "/projects/redmine/repository/edit", :controller => 'repositories', :action => 'edit', :id => 'redmine'
200 should_route :get, "/projects/redmine/repository/revisions", :controller => 'repositories', :action => 'revisions', :id => 'redmine'
201 should_route :get, "/projects/redmine/repository/revisions", :controller => 'repositories', :action => 'revisions', :id => 'redmine'
201 should_route :get, "/projects/redmine/repository/revisions.atom", :controller => 'repositories', :action => 'revisions', :id => 'redmine', :format => 'atom'
202 should_route :get, "/projects/redmine/repository/revisions.atom", :controller => 'repositories', :action => 'revisions', :id => 'redmine', :format => 'atom'
202 should_route :get, "/projects/redmine/repository/revisions/2457", :controller => 'repositories', :action => 'revision', :id => 'redmine', :rev => '2457'
203 should_route :get, "/projects/redmine/repository/revisions/2457", :controller => 'repositories', :action => 'revision', :id => 'redmine', :rev => '2457'
203 should_route :get, "/projects/redmine/repository/revisions/2457/diff", :controller => 'repositories', :action => 'diff', :id => 'redmine', :rev => '2457'
204 should_route :get, "/projects/redmine/repository/revisions/2457/diff", :controller => 'repositories', :action => 'diff', :id => 'redmine', :rev => '2457'
204 should_route :get, "/projects/redmine/repository/revisions/2457/diff.diff", :controller => 'repositories', :action => 'diff', :id => 'redmine', :rev => '2457', :format => 'diff'
205 should_route :get, "/projects/redmine/repository/revisions/2457/diff.diff", :controller => 'repositories', :action => 'diff', :id => 'redmine', :rev => '2457', :format => 'diff'
205 should_route :get, "/projects/redmine/repository/diff/path/to/file.c", :controller => 'repositories', :action => 'diff', :id => 'redmine', :path => %w[path to file.c]
206 should_route :get, "/projects/redmine/repository/diff/path/to/file.c", :controller => 'repositories', :action => 'diff', :id => 'redmine', :path => %w[path to file.c]
206 should_route :get, "/projects/redmine/repository/revisions/2/diff/path/to/file.c", :controller => 'repositories', :action => 'diff', :id => 'redmine', :path => %w[path to file.c], :rev => '2'
207 should_route :get, "/projects/redmine/repository/revisions/2/diff/path/to/file.c", :controller => 'repositories', :action => 'diff', :id => 'redmine', :path => %w[path to file.c], :rev => '2'
207 should_route :get, "/projects/redmine/repository/browse/path/to/file.c", :controller => 'repositories', :action => 'browse', :id => 'redmine', :path => %w[path to file.c]
208 should_route :get, "/projects/redmine/repository/browse/path/to/file.c", :controller => 'repositories', :action => 'browse', :id => 'redmine', :path => %w[path to file.c]
208 should_route :get, "/projects/redmine/repository/entry/path/to/file.c", :controller => 'repositories', :action => 'entry', :id => 'redmine', :path => %w[path to file.c]
209 should_route :get, "/projects/redmine/repository/entry/path/to/file.c", :controller => 'repositories', :action => 'entry', :id => 'redmine', :path => %w[path to file.c]
209 should_route :get, "/projects/redmine/repository/revisions/2/entry/path/to/file.c", :controller => 'repositories', :action => 'entry', :id => 'redmine', :path => %w[path to file.c], :rev => '2'
210 should_route :get, "/projects/redmine/repository/revisions/2/entry/path/to/file.c", :controller => 'repositories', :action => 'entry', :id => 'redmine', :path => %w[path to file.c], :rev => '2'
210 should_route :get, "/projects/redmine/repository/raw/path/to/file.c", :controller => 'repositories', :action => 'entry', :id => 'redmine', :path => %w[path to file.c], :format => 'raw'
211 should_route :get, "/projects/redmine/repository/raw/path/to/file.c", :controller => 'repositories', :action => 'entry', :id => 'redmine', :path => %w[path to file.c], :format => 'raw'
211 should_route :get, "/projects/redmine/repository/revisions/2/raw/path/to/file.c", :controller => 'repositories', :action => 'entry', :id => 'redmine', :path => %w[path to file.c], :rev => '2', :format => 'raw'
212 should_route :get, "/projects/redmine/repository/revisions/2/raw/path/to/file.c", :controller => 'repositories', :action => 'entry', :id => 'redmine', :path => %w[path to file.c], :rev => '2', :format => 'raw'
212 should_route :get, "/projects/redmine/repository/annotate/path/to/file.c", :controller => 'repositories', :action => 'annotate', :id => 'redmine', :path => %w[path to file.c]
213 should_route :get, "/projects/redmine/repository/annotate/path/to/file.c", :controller => 'repositories', :action => 'annotate', :id => 'redmine', :path => %w[path to file.c]
213 should_route :get, "/projects/redmine/repository/changes/path/to/file.c", :controller => 'repositories', :action => 'changes', :id => 'redmine', :path => %w[path to file.c]
214 should_route :get, "/projects/redmine/repository/changes/path/to/file.c", :controller => 'repositories', :action => 'changes', :id => 'redmine', :path => %w[path to file.c]
214 should_route :get, "/projects/redmine/repository/statistics", :controller => 'repositories', :action => 'stats', :id => 'redmine'
215 should_route :get, "/projects/redmine/repository/statistics", :controller => 'repositories', :action => 'stats', :id => 'redmine'
215
216
216
217
217 should_route :post, "/projects/redmine/repository/edit", :controller => 'repositories', :action => 'edit', :id => 'redmine'
218 should_route :post, "/projects/redmine/repository/edit", :controller => 'repositories', :action => 'edit', :id => 'redmine'
218 end
219 end
219
220
220 context "timelogs" do
221 context "timelogs" do
221 should_route :get, "/issues/567/time_entries/new", :controller => 'timelog', :action => 'edit', :issue_id => '567'
222 should_route :get, "/issues/567/time_entries/new", :controller => 'timelog', :action => 'edit', :issue_id => '567'
222 should_route :get, "/projects/ecookbook/time_entries/new", :controller => 'timelog', :action => 'edit', :project_id => 'ecookbook'
223 should_route :get, "/projects/ecookbook/time_entries/new", :controller => 'timelog', :action => 'edit', :project_id => 'ecookbook'
223 should_route :get, "/projects/ecookbook/issues/567/time_entries/new", :controller => 'timelog', :action => 'edit', :project_id => 'ecookbook', :issue_id => '567'
224 should_route :get, "/projects/ecookbook/issues/567/time_entries/new", :controller => 'timelog', :action => 'edit', :project_id => 'ecookbook', :issue_id => '567'
224 should_route :get, "/time_entries/22/edit", :controller => 'timelog', :action => 'edit', :id => '22'
225 should_route :get, "/time_entries/22/edit", :controller => 'timelog', :action => 'edit', :id => '22'
225 should_route :get, "/time_entries/report", :controller => 'timelog', :action => 'report'
226 should_route :get, "/time_entries/report", :controller => 'timelog', :action => 'report'
226 should_route :get, "/projects/567/time_entries/report", :controller => 'timelog', :action => 'report', :project_id => '567'
227 should_route :get, "/projects/567/time_entries/report", :controller => 'timelog', :action => 'report', :project_id => '567'
227 should_route :get, "/projects/567/time_entries/report.csv", :controller => 'timelog', :action => 'report', :project_id => '567', :format => 'csv'
228 should_route :get, "/projects/567/time_entries/report.csv", :controller => 'timelog', :action => 'report', :project_id => '567', :format => 'csv'
228 should_route :get, "/time_entries", :controller => 'timelog', :action => 'details'
229 should_route :get, "/time_entries", :controller => 'timelog', :action => 'details'
229 should_route :get, "/time_entries.csv", :controller => 'timelog', :action => 'details', :format => 'csv'
230 should_route :get, "/time_entries.csv", :controller => 'timelog', :action => 'details', :format => 'csv'
230 should_route :get, "/time_entries.atom", :controller => 'timelog', :action => 'details', :format => 'atom'
231 should_route :get, "/time_entries.atom", :controller => 'timelog', :action => 'details', :format => 'atom'
231 should_route :get, "/projects/567/time_entries", :controller => 'timelog', :action => 'details', :project_id => '567'
232 should_route :get, "/projects/567/time_entries", :controller => 'timelog', :action => 'details', :project_id => '567'
232 should_route :get, "/projects/567/time_entries.csv", :controller => 'timelog', :action => 'details', :project_id => '567', :format => 'csv'
233 should_route :get, "/projects/567/time_entries.csv", :controller => 'timelog', :action => 'details', :project_id => '567', :format => 'csv'
233 should_route :get, "/projects/567/time_entries.atom", :controller => 'timelog', :action => 'details', :project_id => '567', :format => 'atom'
234 should_route :get, "/projects/567/time_entries.atom", :controller => 'timelog', :action => 'details', :project_id => '567', :format => 'atom'
234 should_route :get, "/issues/234/time_entries", :controller => 'timelog', :action => 'details', :issue_id => '234'
235 should_route :get, "/issues/234/time_entries", :controller => 'timelog', :action => 'details', :issue_id => '234'
235 should_route :get, "/issues/234/time_entries.csv", :controller => 'timelog', :action => 'details', :issue_id => '234', :format => 'csv'
236 should_route :get, "/issues/234/time_entries.csv", :controller => 'timelog', :action => 'details', :issue_id => '234', :format => 'csv'
236 should_route :get, "/issues/234/time_entries.atom", :controller => 'timelog', :action => 'details', :issue_id => '234', :format => 'atom'
237 should_route :get, "/issues/234/time_entries.atom", :controller => 'timelog', :action => 'details', :issue_id => '234', :format => 'atom'
237 should_route :get, "/projects/ecookbook/issues/123/time_entries", :controller => 'timelog', :action => 'details', :project_id => 'ecookbook', :issue_id => '123'
238 should_route :get, "/projects/ecookbook/issues/123/time_entries", :controller => 'timelog', :action => 'details', :project_id => 'ecookbook', :issue_id => '123'
238
239
239 should_route :post, "/time_entries/55/destroy", :controller => 'timelog', :action => 'destroy', :id => '55'
240 should_route :post, "/time_entries/55/destroy", :controller => 'timelog', :action => 'destroy', :id => '55'
240 end
241 end
241
242
242 context "users" do
243 context "users" do
243 should_route :get, "/users", :controller => 'users', :action => 'index'
244 should_route :get, "/users", :controller => 'users', :action => 'index'
244 should_route :get, "/users/44", :controller => 'users', :action => 'show', :id => '44'
245 should_route :get, "/users/44", :controller => 'users', :action => 'show', :id => '44'
245 should_route :get, "/users/new", :controller => 'users', :action => 'add'
246 should_route :get, "/users/new", :controller => 'users', :action => 'add'
246 should_route :get, "/users/444/edit", :controller => 'users', :action => 'edit', :id => '444'
247 should_route :get, "/users/444/edit", :controller => 'users', :action => 'edit', :id => '444'
247 should_route :get, "/users/222/edit/membership", :controller => 'users', :action => 'edit', :id => '222', :tab => 'membership'
248 should_route :get, "/users/222/edit/membership", :controller => 'users', :action => 'edit', :id => '222', :tab => 'membership'
248
249
249 should_route :post, "/users/new", :controller => 'users', :action => 'add'
250 should_route :post, "/users/new", :controller => 'users', :action => 'add'
250 should_route :post, "/users/444/edit", :controller => 'users', :action => 'edit', :id => '444'
251 should_route :post, "/users/444/edit", :controller => 'users', :action => 'edit', :id => '444'
251 should_route :post, "/users/123/memberships", :controller => 'users', :action => 'edit_membership', :id => '123'
252 should_route :post, "/users/123/memberships", :controller => 'users', :action => 'edit_membership', :id => '123'
252 should_route :post, "/users/123/memberships/55", :controller => 'users', :action => 'edit_membership', :id => '123', :membership_id => '55'
253 should_route :post, "/users/123/memberships/55", :controller => 'users', :action => 'edit_membership', :id => '123', :membership_id => '55'
253 should_route :post, "/users/567/memberships/12/destroy", :controller => 'users', :action => 'destroy_membership', :id => '567', :membership_id => '12'
254 should_route :post, "/users/567/memberships/12/destroy", :controller => 'users', :action => 'destroy_membership', :id => '567', :membership_id => '12'
254 end
255 end
255
256
256 # TODO: should they all be scoped under /projects/:project_id ?
257 # TODO: should they all be scoped under /projects/:project_id ?
257 context "versions" do
258 context "versions" do
258 should_route :get, "/projects/foo/versions/new", :controller => 'versions', :action => 'new', :project_id => 'foo'
259 should_route :get, "/projects/foo/versions/new", :controller => 'versions', :action => 'new', :project_id => 'foo'
259 should_route :get, "/versions/show/1", :controller => 'versions', :action => 'show', :id => '1'
260 should_route :get, "/versions/show/1", :controller => 'versions', :action => 'show', :id => '1'
260 should_route :get, "/versions/edit/1", :controller => 'versions', :action => 'edit', :id => '1'
261 should_route :get, "/versions/edit/1", :controller => 'versions', :action => 'edit', :id => '1'
261
262
262 should_route :post, "/projects/foo/versions", :controller => 'versions', :action => 'create', :project_id => 'foo'
263 should_route :post, "/projects/foo/versions", :controller => 'versions', :action => 'create', :project_id => 'foo'
263 should_route :post, "/versions/update/1", :controller => 'versions', :action => 'update', :id => '1'
264 should_route :post, "/versions/update/1", :controller => 'versions', :action => 'update', :id => '1'
264
265
265 should_route :delete, "/versions/destroy/1", :controller => 'versions', :action => 'destroy', :id => '1'
266 should_route :delete, "/versions/destroy/1", :controller => 'versions', :action => 'destroy', :id => '1'
266 end
267 end
267
268
268 context "wiki (singular, project's pages)" do
269 context "wiki (singular, project's pages)" do
269 should_route :get, "/projects/567/wiki", :controller => 'wiki', :action => 'index', :id => '567'
270 should_route :get, "/projects/567/wiki", :controller => 'wiki', :action => 'index', :id => '567'
270 should_route :get, "/projects/567/wiki/lalala", :controller => 'wiki', :action => 'index', :id => '567', :page => 'lalala'
271 should_route :get, "/projects/567/wiki/lalala", :controller => 'wiki', :action => 'index', :id => '567', :page => 'lalala'
271 should_route :get, "/projects/567/wiki/my_page/edit", :controller => 'wiki', :action => 'edit', :id => '567', :page => 'my_page'
272 should_route :get, "/projects/567/wiki/my_page/edit", :controller => 'wiki', :action => 'edit', :id => '567', :page => 'my_page'
272 should_route :get, "/projects/1/wiki/CookBook_documentation/history", :controller => 'wiki', :action => 'history', :id => '1', :page => 'CookBook_documentation'
273 should_route :get, "/projects/1/wiki/CookBook_documentation/history", :controller => 'wiki', :action => 'history', :id => '1', :page => 'CookBook_documentation'
273 should_route :get, "/projects/1/wiki/CookBook_documentation/diff/2/vs/1", :controller => 'wiki', :action => 'diff', :id => '1', :page => 'CookBook_documentation', :version => '2', :version_from => '1'
274 should_route :get, "/projects/1/wiki/CookBook_documentation/diff/2/vs/1", :controller => 'wiki', :action => 'diff', :id => '1', :page => 'CookBook_documentation', :version => '2', :version_from => '1'
274 should_route :get, "/projects/1/wiki/CookBook_documentation/annotate/2", :controller => 'wiki', :action => 'annotate', :id => '1', :page => 'CookBook_documentation', :version => '2'
275 should_route :get, "/projects/1/wiki/CookBook_documentation/annotate/2", :controller => 'wiki', :action => 'annotate', :id => '1', :page => 'CookBook_documentation', :version => '2'
275 should_route :get, "/projects/22/wiki/ladida/rename", :controller => 'wiki', :action => 'rename', :id => '22', :page => 'ladida'
276 should_route :get, "/projects/22/wiki/ladida/rename", :controller => 'wiki', :action => 'rename', :id => '22', :page => 'ladida'
276 should_route :get, "/projects/567/wiki/page_index", :controller => 'wiki', :action => 'special', :id => '567', :page => 'page_index'
277 should_route :get, "/projects/567/wiki/page_index", :controller => 'wiki', :action => 'special', :id => '567', :page => 'page_index'
277 should_route :get, "/projects/567/wiki/Page_Index", :controller => 'wiki', :action => 'special', :id => '567', :page => 'Page_Index'
278 should_route :get, "/projects/567/wiki/Page_Index", :controller => 'wiki', :action => 'special', :id => '567', :page => 'Page_Index'
278 should_route :get, "/projects/567/wiki/date_index", :controller => 'wiki', :action => 'special', :id => '567', :page => 'date_index'
279 should_route :get, "/projects/567/wiki/date_index", :controller => 'wiki', :action => 'special', :id => '567', :page => 'date_index'
279 should_route :get, "/projects/567/wiki/export", :controller => 'wiki', :action => 'special', :id => '567', :page => 'export'
280 should_route :get, "/projects/567/wiki/export", :controller => 'wiki', :action => 'special', :id => '567', :page => 'export'
280
281
281 should_route :post, "/projects/567/wiki/my_page/edit", :controller => 'wiki', :action => 'edit', :id => '567', :page => 'my_page'
282 should_route :post, "/projects/567/wiki/my_page/edit", :controller => 'wiki', :action => 'edit', :id => '567', :page => 'my_page'
282 should_route :post, "/projects/567/wiki/CookBook_documentation/preview", :controller => 'wiki', :action => 'preview', :id => '567', :page => 'CookBook_documentation'
283 should_route :post, "/projects/567/wiki/CookBook_documentation/preview", :controller => 'wiki', :action => 'preview', :id => '567', :page => 'CookBook_documentation'
283 should_route :post, "/projects/22/wiki/ladida/rename", :controller => 'wiki', :action => 'rename', :id => '22', :page => 'ladida'
284 should_route :post, "/projects/22/wiki/ladida/rename", :controller => 'wiki', :action => 'rename', :id => '22', :page => 'ladida'
284 should_route :post, "/projects/22/wiki/ladida/destroy", :controller => 'wiki', :action => 'destroy', :id => '22', :page => 'ladida'
285 should_route :post, "/projects/22/wiki/ladida/destroy", :controller => 'wiki', :action => 'destroy', :id => '22', :page => 'ladida'
285 should_route :post, "/projects/22/wiki/ladida/protect", :controller => 'wiki', :action => 'protect', :id => '22', :page => 'ladida'
286 should_route :post, "/projects/22/wiki/ladida/protect", :controller => 'wiki', :action => 'protect', :id => '22', :page => 'ladida'
286 end
287 end
287
288
288 context "wikis (plural, admin setup)" do
289 context "wikis (plural, admin setup)" do
289 should_route :get, "/projects/ladida/wiki/destroy", :controller => 'wikis', :action => 'destroy', :id => 'ladida'
290 should_route :get, "/projects/ladida/wiki/destroy", :controller => 'wikis', :action => 'destroy', :id => 'ladida'
290
291
291 should_route :post, "/projects/ladida/wiki", :controller => 'wikis', :action => 'edit', :id => 'ladida'
292 should_route :post, "/projects/ladida/wiki", :controller => 'wikis', :action => 'edit', :id => 'ladida'
292 should_route :post, "/projects/ladida/wiki/destroy", :controller => 'wikis', :action => 'destroy', :id => 'ladida'
293 should_route :post, "/projects/ladida/wiki/destroy", :controller => 'wikis', :action => 'destroy', :id => 'ladida'
293 end
294 end
294
295
295 context "administration panel" do
296 context "administration panel" do
296 should_route :get, "/admin/projects", :controller => 'admin', :action => 'projects'
297 should_route :get, "/admin/projects", :controller => 'admin', :action => 'projects'
297 end
298 end
298 end
299 end
General Comments 0
You need to be logged in to leave comments. Login now