You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

routes.rb 18KB

Converted routing and urls to follow the Rails REST convention. Patch supplied by commits from Gerrit Kaiser on Github. Existing routes will still work (backwards compatible) but any new urls will be generated using the new routing rules. Changes listed below: * made the URLs for some project tabs and project settings follow the new rails RESTful conventions of /collection/:id/subcollection/:sub_id * prettier URL for project roadmap * more nice project URLs * use GET for filtering form * prettified URLs used on issues tab * custom route for activity atom feeds * prettier repository urls * fixed broken route definition * fixed failing tests for issuecontroller that were hardcoding the url string * more RESTful routes for boards and messages * RESTful routes for wiki pages * RESTful routes for documents * moved old routes that are retained for compatibility to the bottom and grouped them together * added RESTful URIs for issues * RESTfulness for the news section * fixed route order * changed hardcoded URLs in tests * fixed badly written tests * fixed forgotten parameter in routes * changed hardcoded URLS to new scheme * changed project add url to the standard POST to collection * create new issue by POSTing to collection * changed hardcoded URLs in integrations tests * made project add form work again * restful routes for project deletion * prettier routes for project (un)archival * made routes table more readable * fixed note quoting * user routing * fixed bug * always sort by GET * Fixed: cross-project issue list should not show issues of projects for which the issue tracking module was disabled. * prettified URLs used on issues tab * urls for time log * fixed reply routing * eliminate revision query paremeter for diff and entry actions * fixed test failures with hard-coded urls * ensure ajax links always use get * refactored ajax link generation into separate method #1901 git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2317 e93f8b46-1217-0410-a6f0-8f06a7374b81
15 years ago
Converted routing and urls to follow the Rails REST convention. Patch supplied by commits from Gerrit Kaiser on Github. Existing routes will still work (backwards compatible) but any new urls will be generated using the new routing rules. Changes listed below: * made the URLs for some project tabs and project settings follow the new rails RESTful conventions of /collection/:id/subcollection/:sub_id * prettier URL for project roadmap * more nice project URLs * use GET for filtering form * prettified URLs used on issues tab * custom route for activity atom feeds * prettier repository urls * fixed broken route definition * fixed failing tests for issuecontroller that were hardcoding the url string * more RESTful routes for boards and messages * RESTful routes for wiki pages * RESTful routes for documents * moved old routes that are retained for compatibility to the bottom and grouped them together * added RESTful URIs for issues * RESTfulness for the news section * fixed route order * changed hardcoded URLs in tests * fixed badly written tests * fixed forgotten parameter in routes * changed hardcoded URLS to new scheme * changed project add url to the standard POST to collection * create new issue by POSTing to collection * changed hardcoded URLs in integrations tests * made project add form work again * restful routes for project deletion * prettier routes for project (un)archival * made routes table more readable * fixed note quoting * user routing * fixed bug * always sort by GET * Fixed: cross-project issue list should not show issues of projects for which the issue tracking module was disabled. * prettified URLs used on issues tab * urls for time log * fixed reply routing * eliminate revision query paremeter for diff and entry actions * fixed test failures with hard-coded urls * ensure ajax links always use get * refactored ajax link generation into separate method #1901 git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2317 e93f8b46-1217-0410-a6f0-8f06a7374b81
15 years ago
Converted routing and urls to follow the Rails REST convention. Patch supplied by commits from Gerrit Kaiser on Github. Existing routes will still work (backwards compatible) but any new urls will be generated using the new routing rules. Changes listed below: * made the URLs for some project tabs and project settings follow the new rails RESTful conventions of /collection/:id/subcollection/:sub_id * prettier URL for project roadmap * more nice project URLs * use GET for filtering form * prettified URLs used on issues tab * custom route for activity atom feeds * prettier repository urls * fixed broken route definition * fixed failing tests for issuecontroller that were hardcoding the url string * more RESTful routes for boards and messages * RESTful routes for wiki pages * RESTful routes for documents * moved old routes that are retained for compatibility to the bottom and grouped them together * added RESTful URIs for issues * RESTfulness for the news section * fixed route order * changed hardcoded URLs in tests * fixed badly written tests * fixed forgotten parameter in routes * changed hardcoded URLS to new scheme * changed project add url to the standard POST to collection * create new issue by POSTing to collection * changed hardcoded URLs in integrations tests * made project add form work again * restful routes for project deletion * prettier routes for project (un)archival * made routes table more readable * fixed note quoting * user routing * fixed bug * always sort by GET * Fixed: cross-project issue list should not show issues of projects for which the issue tracking module was disabled. * prettified URLs used on issues tab * urls for time log * fixed reply routing * eliminate revision query paremeter for diff and entry actions * fixed test failures with hard-coded urls * ensure ajax links always use get * refactored ajax link generation into separate method #1901 git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2317 e93f8b46-1217-0410-a6f0-8f06a7374b81
15 years ago
Converted routing and urls to follow the Rails REST convention. Patch supplied by commits from Gerrit Kaiser on Github. Existing routes will still work (backwards compatible) but any new urls will be generated using the new routing rules. Changes listed below: * made the URLs for some project tabs and project settings follow the new rails RESTful conventions of /collection/:id/subcollection/:sub_id * prettier URL for project roadmap * more nice project URLs * use GET for filtering form * prettified URLs used on issues tab * custom route for activity atom feeds * prettier repository urls * fixed broken route definition * fixed failing tests for issuecontroller that were hardcoding the url string * more RESTful routes for boards and messages * RESTful routes for wiki pages * RESTful routes for documents * moved old routes that are retained for compatibility to the bottom and grouped them together * added RESTful URIs for issues * RESTfulness for the news section * fixed route order * changed hardcoded URLs in tests * fixed badly written tests * fixed forgotten parameter in routes * changed hardcoded URLS to new scheme * changed project add url to the standard POST to collection * create new issue by POSTing to collection * changed hardcoded URLs in integrations tests * made project add form work again * restful routes for project deletion * prettier routes for project (un)archival * made routes table more readable * fixed note quoting * user routing * fixed bug * always sort by GET * Fixed: cross-project issue list should not show issues of projects for which the issue tracking module was disabled. * prettified URLs used on issues tab * urls for time log * fixed reply routing * eliminate revision query paremeter for diff and entry actions * fixed test failures with hard-coded urls * ensure ajax links always use get * refactored ajax link generation into separate method #1901 git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2317 e93f8b46-1217-0410-a6f0-8f06a7374b81
15 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  1. # frozen_string_literal: true
  2. # Redmine - project management software
  3. # Copyright (C) 2006-2020 Jean-Philippe Lang
  4. #
  5. # This program is free software; you can redistribute it and/or
  6. # modify it under the terms of the GNU General Public License
  7. # as published by the Free Software Foundation; either version 2
  8. # of the License, or (at your option) any later version.
  9. #
  10. # This program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. # GNU General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU General Public License
  16. # along with this program; if not, write to the Free Software
  17. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  18. Rails.application.routes.draw do
  19. root :to => 'welcome#index', :as => 'home'
  20. match 'login', :to => 'account#login', :as => 'signin', :via => [:get, :post]
  21. match 'logout', :to => 'account#logout', :as => 'signout', :via => [:get, :post]
  22. match 'account/twofa/confirm', :to => 'account#twofa_confirm', :via => :get
  23. match 'account/twofa/resend', :to => 'account#twofa_resend', :via => :post
  24. match 'account/twofa', :to => 'account#twofa', :via => [:get, :post]
  25. match 'account/register', :to => 'account#register', :via => [:get, :post], :as => 'register'
  26. match 'account/lost_password', :to => 'account#lost_password', :via => [:get, :post], :as => 'lost_password'
  27. match 'account/activate', :to => 'account#activate', :via => :get
  28. get 'account/activation_email', :to => 'account#activation_email', :as => 'activation_email'
  29. match '/news/preview', :controller => 'previews', :action => 'news', :as => 'preview_news', :via => [:get, :post, :put, :patch]
  30. match '/issues/preview', :to => 'previews#issue', :as => 'preview_issue', :via => [:get, :post, :put, :patch]
  31. match '/preview/text', :to => 'previews#text', :as => 'preview_text', :via => [:get, :post, :put, :patch]
  32. match 'projects/:id/wiki/destroy', :to => 'wikis#destroy', :via => [:get, :post]
  33. match 'boards/:board_id/topics/new', :to => 'messages#new', :via => [:get, :post], :as => 'new_board_message'
  34. get 'boards/:board_id/topics/:id', :to => 'messages#show', :as => 'board_message'
  35. match 'boards/:board_id/topics/quote/:id', :to => 'messages#quote', :via => [:get, :post]
  36. get 'boards/:board_id/topics/:id/edit', :to => 'messages#edit'
  37. post 'boards/:board_id/topics/preview', :to => 'messages#preview', :as => 'preview_board_message'
  38. post 'boards/:board_id/topics/:id/replies', :to => 'messages#reply'
  39. post 'boards/:board_id/topics/:id/edit', :to => 'messages#edit'
  40. post 'boards/:board_id/topics/:id/destroy', :to => 'messages#destroy'
  41. # Misc issue routes. TODO: move into resources
  42. match '/issues/auto_complete', :to => 'auto_completes#issues', :via => :get, :as => 'auto_complete_issues'
  43. match '/issues/context_menu', :to => 'context_menus#issues', :as => 'issues_context_menu', :via => [:get, :post]
  44. match '/issues/changes', :to => 'journals#index', :as => 'issue_changes', :via => :get
  45. match '/issues/:id/quoted', :to => 'journals#new', :id => /\d+/, :via => :post, :as => 'quoted_issue'
  46. resources :journals, :only => [:edit, :update] do
  47. member do
  48. get 'diff'
  49. end
  50. end
  51. get '/projects/:project_id/issues/gantt', :to => 'gantts#show', :as => 'project_gantt'
  52. get '/issues/gantt', :to => 'gantts#show'
  53. get '/projects/:project_id/issues/calendar', :to => 'calendars#show', :as => 'project_calendar'
  54. get '/issues/calendar', :to => 'calendars#show'
  55. get 'projects/:id/issues/report', :to => 'reports#issue_report', :as => 'project_issues_report'
  56. get 'projects/:id/issues/report/:detail', :to => 'reports#issue_report_details', :as => 'project_issues_report_details'
  57. get '/issues/imports/new', :to => 'imports#new', :defaults => { :type => 'IssueImport' }, :as => 'new_issues_import'
  58. get '/time_entries/imports/new', :to => 'imports#new', :defaults => { :type => 'TimeEntryImport' }, :as => 'new_time_entries_import'
  59. get '/users/imports/new', :to => 'imports#new', :defaults => { :type => 'UserImport' }, :as => 'new_users_import'
  60. post '/imports', :to => 'imports#create', :as => 'imports'
  61. get '/imports/:id', :to => 'imports#show', :as => 'import'
  62. match '/imports/:id/settings', :to => 'imports#settings', :via => [:get, :post], :as => 'import_settings'
  63. match '/imports/:id/mapping', :to => 'imports#mapping', :via => [:get, :post], :as => 'import_mapping'
  64. match '/imports/:id/run', :to => 'imports#run', :via => [:get, :post], :as => 'import_run'
  65. match 'my/account', :controller => 'my', :action => 'account', :via => [:get, :put]
  66. match 'my/account/destroy', :controller => 'my', :action => 'destroy', :via => [:get, :post]
  67. match 'my/page', :controller => 'my', :action => 'page', :via => :get
  68. post 'my/page', :to => 'my#update_page'
  69. match 'my', :controller => 'my', :action => 'index', :via => :get # Redirects to my/page
  70. get 'my/api_key', :to => 'my#show_api_key', :as => 'my_api_key'
  71. post 'my/api_key', :to => 'my#reset_api_key'
  72. post 'my/rss_key', :to => 'my#reset_rss_key', :as => 'my_rss_key'
  73. match 'my/password', :controller => 'my', :action => 'password', :via => [:get, :post]
  74. match 'my/add_block', :controller => 'my', :action => 'add_block', :via => :post
  75. match 'my/remove_block', :controller => 'my', :action => 'remove_block', :via => :post
  76. match 'my/order_blocks', :controller => 'my', :action => 'order_blocks', :via => :post
  77. match 'my/twofa/activate/init', :controller => 'twofa', :action => 'activate_init', :via => :post
  78. match 'my/twofa/:scheme/activate/init', :controller => 'twofa', :action => 'activate_init', :via => :post
  79. match 'my/twofa/:scheme/activate/confirm', :controller => 'twofa', :action => 'activate_confirm', :via => :get
  80. match 'my/twofa/:scheme/activate', :controller => 'twofa', :action => 'activate', :via => [:get, :post]
  81. match 'my/twofa/:scheme/deactivate/init', :controller => 'twofa', :action => 'deactivate_init', :via => :post
  82. match 'my/twofa/:scheme/deactivate/confirm', :controller => 'twofa', :action => 'deactivate_confirm', :via => :get
  83. match 'my/twofa/:scheme/deactivate', :controller => 'twofa', :action => 'deactivate', :via => [:get, :post]
  84. match 'my/twofa/select_scheme', :controller => 'twofa', :action => 'select_scheme', :via => :get
  85. match 'my/twofa/backup_codes/init', :controller => 'twofa_backup_codes', :action => 'init', :via => :post
  86. match 'my/twofa/backup_codes/confirm', :controller => 'twofa_backup_codes', :action => 'confirm', :via => :get
  87. match 'my/twofa/backup_codes/create', :controller => 'twofa_backup_codes', :action => 'create', :via => [:get, :post]
  88. match 'my/twofa/backup_codes', :controller => 'twofa_backup_codes', :action => 'show', :via => [:get]
  89. match 'users/:user_id/twofa/deactivate', :controller => 'twofa', :action => 'admin_deactivate', :via => :post
  90. resources :users do
  91. resources :memberships, :controller => 'principal_memberships'
  92. resources :email_addresses, :only => [:index, :create, :update, :destroy]
  93. end
  94. post 'watchers/watch', :to => 'watchers#watch', :as => 'watch'
  95. delete 'watchers/watch', :to => 'watchers#unwatch'
  96. get 'watchers/new', :to => 'watchers#new', :as => 'new_watchers'
  97. post 'watchers', :to => 'watchers#create'
  98. post 'watchers/append', :to => 'watchers#append'
  99. delete 'watchers', :to => 'watchers#destroy'
  100. get 'watchers/autocomplete_for_user', :to => 'watchers#autocomplete_for_user'
  101. # Specific routes for issue watchers API
  102. post 'issues/:object_id/watchers', :to => 'watchers#create', :object_type => 'issue'
  103. delete 'issues/:object_id/watchers/:user_id' => 'watchers#destroy', :object_type => 'issue'
  104. resources :projects do
  105. collection do
  106. get 'autocomplete'
  107. end
  108. member do
  109. get 'settings(/:tab)', :action => 'settings', :as => 'settings'
  110. post 'archive'
  111. post 'unarchive'
  112. post 'close'
  113. post 'reopen'
  114. match 'copy', :via => [:get, :post]
  115. match 'bookmark', :via => [:delete, :post]
  116. end
  117. shallow do
  118. resources :memberships, :controller => 'members' do
  119. collection do
  120. get 'autocomplete'
  121. end
  122. end
  123. end
  124. resource :enumerations, :controller => 'project_enumerations', :only => [:update, :destroy]
  125. get 'issues/:copy_from/copy', :to => 'issues#new', :as => 'copy_issue'
  126. resources :issues, :only => [:index, :new, :create]
  127. # Used when updating the form of a new issue
  128. post 'issues/new', :to => 'issues#new'
  129. resources :files, :only => [:index, :new, :create]
  130. resources :versions, :except => [:index, :show, :edit, :update, :destroy] do
  131. collection do
  132. put 'close_completed'
  133. end
  134. end
  135. get 'versions.:format', :to => 'versions#index'
  136. get 'roadmap', :to => 'versions#index', :format => false
  137. get 'versions', :to => 'versions#index'
  138. resources :news, :except => [:show, :edit, :update, :destroy]
  139. resources :time_entries, :controller => 'timelog', :except => [:show, :edit, :update, :destroy] do
  140. get 'report', :on => :collection
  141. end
  142. resources :queries, :only => [:new, :create]
  143. shallow do
  144. resources :issue_categories
  145. end
  146. resources :documents, :except => [:show, :edit, :update, :destroy]
  147. resources :boards
  148. shallow do
  149. resources :repositories, :except => [:index, :show] do
  150. member do
  151. match 'committers', :via => [:get, :post]
  152. end
  153. end
  154. end
  155. match 'wiki/index', :controller => 'wiki', :action => 'index', :via => :get
  156. resources :wiki, :except => [:index, :create], :as => 'wiki_page' do
  157. member do
  158. get 'rename'
  159. post 'rename'
  160. get 'history'
  161. get 'diff'
  162. match 'preview', :via => [:post, :put, :patch]
  163. post 'protect'
  164. post 'add_attachment'
  165. end
  166. collection do
  167. get 'export'
  168. get 'date_index'
  169. post 'new'
  170. end
  171. end
  172. match 'wiki', :controller => 'wiki', :action => 'show', :via => :get
  173. get 'wiki/:id/:version', :to => 'wiki#show', :constraints => {:version => /\d+/}
  174. delete 'wiki/:id/:version', :to => 'wiki#destroy_version'
  175. get 'wiki/:id/:version/annotate', :to => 'wiki#annotate'
  176. get 'wiki/:id/:version/diff', :to => 'wiki#diff'
  177. end
  178. resources :issues do
  179. member do
  180. # Used when updating the form of an existing issue
  181. patch 'edit', :to => 'issues#edit'
  182. get 'tab/:name', :action => 'issue_tab', :as => 'tab'
  183. end
  184. collection do
  185. match 'bulk_edit', :via => [:get, :post]
  186. post 'bulk_update'
  187. end
  188. resources :time_entries, :controller => 'timelog', :only => [:new, :create]
  189. shallow do
  190. resources :relations, :controller => 'issue_relations', :only => [:index, :show, :create, :destroy]
  191. end
  192. end
  193. # Used when updating the form of a new issue outside a project
  194. post '/issues/new', :to => 'issues#new'
  195. match '/issues', :controller => 'issues', :action => 'destroy', :via => :delete
  196. resources :queries, :except => [:show]
  197. get '/queries/filter', :to => 'queries#filter', :as => 'queries_filter'
  198. resources :news, :only => [:index, :show, :edit, :update, :destroy]
  199. match '/news/:id/comments', :to => 'comments#create', :via => :post
  200. match '/news/:id/comments/:comment_id', :to => 'comments#destroy', :via => :delete
  201. resources :versions, :only => [:show, :edit, :update, :destroy] do
  202. post 'status_by', :on => :member
  203. end
  204. resources :documents, :only => [:show, :edit, :update, :destroy] do
  205. post 'add_attachment', :on => :member
  206. end
  207. match '/time_entries/context_menu', :to => 'context_menus#time_entries', :as => :time_entries_context_menu, :via => [:get, :post]
  208. resources :time_entries, :controller => 'timelog', :except => :destroy do
  209. member do
  210. # Used when updating the edit form of an existing time entry
  211. patch 'edit', :to => 'timelog#edit'
  212. end
  213. collection do
  214. get 'report'
  215. get 'bulk_edit'
  216. post 'bulk_update'
  217. end
  218. end
  219. match '/time_entries/:id', :to => 'timelog#destroy', :via => :delete, :id => /\d+/
  220. # TODO: delete /time_entries for bulk deletion
  221. match '/time_entries/destroy', :to => 'timelog#destroy', :via => :delete
  222. # Used to update the new time entry form
  223. post '/time_entries/new', :to => 'timelog#new'
  224. # Used to update the bulk edit time entry form
  225. post '/time_entries/bulk_edit', :to => 'timelog#bulk_edit'
  226. get 'projects/:id/activity', :to => 'activities#index', :as => :project_activity
  227. get 'activity', :to => 'activities#index'
  228. # repositories routes
  229. get 'projects/:id/repository/:repository_id/statistics', :to => 'repositories#stats'
  230. get 'projects/:id/repository/:repository_id/graph', :to => 'repositories#graph'
  231. get 'projects/:id/repository/:repository_id/revisions/:rev', :to => 'repositories#revision'
  232. get 'projects/:id/repository/:repository_id/revision', :to => 'repositories#revision'
  233. post 'projects/:id/repository/:repository_id/revisions/:rev/issues', :to => 'repositories#add_related_issue'
  234. delete 'projects/:id/repository/:repository_id/revisions/:rev/issues/:issue_id', :to => 'repositories#remove_related_issue'
  235. get 'projects/:id/repository/:repository_id/revisions', :to => 'repositories#revisions'
  236. %w(browse show entry raw annotate).each do |action|
  237. get "projects/:id/repository/:repository_id/revisions/:rev/#{action}(/*path)",
  238. :controller => 'repositories',
  239. :action => action,
  240. :format => 'html',
  241. :constraints => {:rev => /[a-z0-9\.\-_]+/, :path => /.*/}
  242. end
  243. %w(browse entry raw changes annotate).each do |action|
  244. get "projects/:id/repository/:repository_id/#{action}(/*path)",
  245. :controller => 'repositories',
  246. :action => action,
  247. :format => 'html',
  248. :constraints => {:path => /.*/}
  249. end
  250. get "projects/:id/repository/:repository_id/revisions/:rev/diff(/*path)",
  251. :to => 'repositories#diff',
  252. :format => false,
  253. :constraints => {:rev => /[a-z0-9\.\-_]+/, :path => /.*/}
  254. get "projects/:id/repository/:repository_id/diff(/*path)",
  255. :to => 'repositories#diff',
  256. :format => false,
  257. :constraints => {:path => /.*/}
  258. get 'projects/:id/repository/:repository_id/show/*path', :to => 'repositories#show', :format => 'html', :constraints => {:path => /.*/}
  259. get 'projects/:id/repository/:repository_id', :to => 'repositories#show', :path => nil
  260. get 'projects/:id/repository', :to => 'repositories#show', :path => nil
  261. # additional routes for having the file name at the end of url
  262. get 'attachments/:id/:filename', :to => 'attachments#show', :id => /\d+/, :filename => /.*/, :as => 'named_attachment', :format => 'html'
  263. get 'attachments/download/:id/:filename', :to => 'attachments#download', :id => /\d+/, :filename => /.*/, :as => 'download_named_attachment'
  264. get 'attachments/download/:id', :to => 'attachments#download', :id => /\d+/
  265. get 'attachments/thumbnail/:id(/:size)', :to => 'attachments#thumbnail', :id => /\d+/, :size => /\d+/, :as => 'thumbnail'
  266. resources :attachments, :only => [:show, :update, :destroy]
  267. get 'attachments/:object_type/:object_id/edit', :to => 'attachments#edit_all', :as => :object_attachments_edit
  268. patch 'attachments/:object_type/:object_id', :to => 'attachments#update_all', :as => :object_attachments
  269. get 'attachments/:object_type/:object_id/download', :to => 'attachments#download_all', :as => :object_attachments_download
  270. resources :groups do
  271. resources :memberships, :controller => 'principal_memberships'
  272. member do
  273. get 'autocomplete_for_user'
  274. end
  275. end
  276. get 'groups/:id/users/new', :to => 'groups#new_users', :id => /\d+/, :as => 'new_group_users'
  277. post 'groups/:id/users', :to => 'groups#add_users', :id => /\d+/, :as => 'group_users'
  278. delete 'groups/:id/users/:user_id', :to => 'groups#remove_user', :id => /\d+/, :as => 'group_user'
  279. resources :trackers, :except => :show do
  280. collection do
  281. match 'fields', :via => [:get, :post]
  282. end
  283. end
  284. resources :issue_statuses, :except => :show do
  285. collection do
  286. post 'update_issue_done_ratio'
  287. end
  288. end
  289. resources :custom_fields, :except => :show do
  290. resources :enumerations, :controller => 'custom_field_enumerations', :except => [:show, :new, :edit]
  291. put 'enumerations', :to => 'custom_field_enumerations#update_each'
  292. end
  293. resources :roles do
  294. collection do
  295. get 'permissions'
  296. post 'permissions', :to => 'roles#update_permissions'
  297. end
  298. end
  299. resources :enumerations, :except => :show
  300. match 'enumerations/:type', :to => 'enumerations#index', :via => :get
  301. get 'projects/:id/search', :controller => 'search', :action => 'index'
  302. get 'search', :controller => 'search', :action => 'index'
  303. get 'mail_handler', :to => 'mail_handler#new'
  304. post 'mail_handler', :to => 'mail_handler#index'
  305. get 'admin', :to => 'admin#index'
  306. get 'admin/projects', :to => 'admin#projects'
  307. get 'admin/plugins', :to => 'admin#plugins'
  308. get 'admin/info', :to => 'admin#info'
  309. post 'admin/test_email', :to => 'admin#test_email', :as => 'test_email'
  310. post 'admin/default_configuration', :to => 'admin#default_configuration'
  311. resources :auth_sources do
  312. member do
  313. get 'test_connection', :as => 'try_connection'
  314. end
  315. collection do
  316. get 'autocomplete_for_new_user'
  317. end
  318. end
  319. match 'workflows', :controller => 'workflows', :action => 'index', :via => :get
  320. match 'workflows/edit', :controller => 'workflows', :action => 'edit', :via => [:get, :post]
  321. match 'workflows/permissions', :controller => 'workflows', :action => 'permissions', :via => [:get, :post]
  322. match 'workflows/copy', :controller => 'workflows', :action => 'copy', :via => [:get, :post]
  323. match 'settings', :controller => 'settings', :action => 'index', :via => :get
  324. match 'settings/edit', :controller => 'settings', :action => 'edit', :via => [:get, :post]
  325. match 'settings/plugin/:id', :controller => 'settings', :action => 'plugin', :via => [:get, :post], :as => 'plugin_settings'
  326. match 'sys/projects', :to => 'sys#projects', :via => :get
  327. match 'sys/projects/:id/repository', :to => 'sys#create_project_repository', :via => :post
  328. match 'sys/fetch_changesets', :to => 'sys#fetch_changesets', :via => [:get, :post]
  329. match 'uploads', :to => 'attachments#upload', :via => :post
  330. get 'robots', :to => 'welcome#robots'
  331. Dir.glob File.expand_path("#{Redmine::Plugin.directory}/*") do |plugin_dir|
  332. file = File.join(plugin_dir, "config/routes.rb")
  333. if File.exists?(file)
  334. begin
  335. instance_eval File.read(file)
  336. rescue SyntaxError, StandardError => e
  337. puts "An error occurred while loading the routes definition of #{File.basename(plugin_dir)} plugin (#{file}): #{e.message}."
  338. exit 1
  339. end
  340. end
  341. end
  342. end