From: Jean-Philippe Lang Date: Tue, 18 Dec 2007 18:50:41 +0000 (+0000) Subject: Moved ProjectsController#list_documents and add_document to DocumentsController#index... X-Git-Tag: 0.7.0-RC1~264 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=8e00f57a886ae529ae308a17bfc9a363056754bf;p=redmine.git Moved ProjectsController#list_documents and add_document to DocumentsController#index and new. git-svn-id: http://redmine.rubyforge.org/svn/trunk@1011 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- diff --git a/app/controllers/documents_controller.rb b/app/controllers/documents_controller.rb index 104cca10c..b37a8371a 100644 --- a/app/controllers/documents_controller.rb +++ b/app/controllers/documents_controller.rb @@ -17,12 +17,40 @@ class DocumentsController < ApplicationController layout 'base' - before_filter :find_project, :authorize - + before_filter :find_project, :only => [:index, :new] + before_filter :find_document, :except => [:index, :new] + before_filter :authorize + + def index + @sort_by = %w(category date title author).include?(params[:sort_by]) ? params[:sort_by] : 'category' + documents = @project.documents.find :all, :include => [:attachments, :category] + case @sort_by + when 'date' + @grouped = documents.group_by {|d| d.created_on.to_date } + when 'title' + @grouped = documents.group_by {|d| d.title.first.upcase} + when 'author' + @grouped = documents.select{|d| d.attachments.any?}.group_by {|d| d.attachments.last.author} + else + @grouped = documents.group_by(&:category) + end + render :layout => false if request.xhr? + end + def show @attachments = @document.attachments.find(:all, :order => "created_on DESC") end + def new + @document = @project.documents.build(params[:document]) + if request.post? and @document.save + attach_files(@document, params[:attachments]) + flash[:notice] = l(:notice_successful_create) + Mailer.deliver_document_added(@document) if Setting.notified_events.include?('document_added') + redirect_to :action => 'index', :project_id => @project + end + end + def edit @categories = Enumeration::get_values('DCAT') if request.post? and @document.update_attributes(params[:document]) @@ -33,7 +61,7 @@ class DocumentsController < ApplicationController def destroy @document.destroy - redirect_to :controller => 'projects', :action => 'list_documents', :id => @project + redirect_to :controller => 'documents', :action => 'index', :project_id => @project end def download @@ -57,9 +85,15 @@ class DocumentsController < ApplicationController private def find_project + @project = Project.find(params[:project_id]) + rescue ActiveRecord::RecordNotFound + render_404 + end + + def find_document @document = Document.find(params[:id]) @project = @document.project rescue ActiveRecord::RecordNotFound render_404 - end + end end diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 7b1e4ef3d..84203a34d 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -177,34 +177,6 @@ class ProjectsController < ApplicationController end end - # Add a new document to @project - def add_document - @document = @project.documents.build(params[:document]) - if request.post? and @document.save - attach_files(@document, params[:attachments]) - flash[:notice] = l(:notice_successful_create) - Mailer.deliver_document_added(@document) if Setting.notified_events.include?('document_added') - redirect_to :action => 'list_documents', :id => @project - end - end - - # Show documents list of @project - def list_documents - @sort_by = %w(category date title author).include?(params[:sort_by]) ? params[:sort_by] : 'category' - documents = @project.documents.find :all, :include => [:attachments, :category] - case @sort_by - when 'date' - @grouped = documents.group_by {|d| d.created_on.to_date } - when 'title' - @grouped = documents.group_by {|d| d.title.first.upcase} - when 'author' - @grouped = documents.select{|d| d.attachments.any?}.group_by {|d| d.attachments.last.author} - else - @grouped = documents.group_by(&:category) - end - render :layout => false if request.xhr? - end - # Add a new issue to @project # The new issue will be created from an existing one if copy_from parameter is given def add_issue diff --git a/app/views/documents/index.rhtml b/app/views/documents/index.rhtml new file mode 100644 index 000000000..a7cefb733 --- /dev/null +++ b/app/views/documents/index.rhtml @@ -0,0 +1,39 @@ +
+<%= link_to_if_authorized l(:label_document_new), + {:controller => 'documents', :action => 'new', :project_id => @project}, + :class => 'icon icon-add', + :onclick => 'Element.show("add-document"); return false;' %> +
+ + + +

<%=l(:label_document_plural)%>

+ +<% if @grouped.empty? %>

<%= l(:label_no_data) %>

<% end %> + +<% @grouped.keys.sort.each do |group| %> +

<%= group %>

+ <%= render :partial => 'documents/document', :collection => @grouped[group] %> +<% end %> + +<% content_for :sidebar do %> +

<%= l(:label_sort_by, '') %>

+ <% form_tag({}, :method => :get) do %> +
+
+
+ + <% end %> +<% end %> + +<% set_html_title l(:label_document_plural) -%> diff --git a/app/views/documents/new.rhtml b/app/views/documents/new.rhtml new file mode 100644 index 000000000..4f728da79 --- /dev/null +++ b/app/views/documents/new.rhtml @@ -0,0 +1,13 @@ +

<%=l(:label_document_new)%>

+ +<% form_tag({:controller => 'documents', :action => 'new', :project_id => @project}, :class => "tabular", :multipart => true) do %> +<%= render :partial => 'documents/form' %> + +
+<%= render :partial => 'common/attachments_form'%> +
+ +<%= submit_tag l(:button_create) %> +<% end %> + + diff --git a/app/views/projects/add_document.rhtml b/app/views/projects/add_document.rhtml deleted file mode 100644 index 6c3fe2c7b..000000000 --- a/app/views/projects/add_document.rhtml +++ /dev/null @@ -1,13 +0,0 @@ -

<%=l(:label_document_new)%>

- -<% form_tag( { :action => 'add_document', :id => @project }, :class => "tabular", :multipart => true) do %> -<%= render :partial => 'documents/form' %> - -
-<%= render :partial => 'common/attachments_form'%> -
- -<%= submit_tag l(:button_create) %> -<% end %> - - diff --git a/app/views/projects/list_documents.rhtml b/app/views/projects/list_documents.rhtml deleted file mode 100644 index 6829b9bf5..000000000 --- a/app/views/projects/list_documents.rhtml +++ /dev/null @@ -1,39 +0,0 @@ -
-<%= link_to_if_authorized l(:label_document_new), - {:controller => 'projects', :action => 'add_document', :id => @project}, - :class => 'icon icon-add', - :onclick => 'Element.show("add-document"); return false;' %> -
- - - -

<%=l(:label_document_plural)%>

- -<% if @grouped.empty? %>

<%= l(:label_no_data) %>

<% end %> - -<% @grouped.keys.sort.each do |group| %> -

<%= group %>

- <%= render :partial => 'documents/document', :collection => @grouped[group] %> -<% end %> - -<% content_for :sidebar do %> -

<%= l(:label_sort_by, '') %>

- <% form_tag({}, :method => :get) do %> -
-
-
- - <% end %> -<% end %> - -<% set_html_title l(:label_document_plural) -%> diff --git a/config/routes.rb b/config/routes.rb index 5048da2f5..febb5e247 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -16,6 +16,7 @@ ActionController::Routing::Routes.draw do |map| map.connect 'issues/:issue_id/relations/:action/:id', :controller => 'issue_relations' map.connect 'projects/:project_id/issues/:action', :controller => 'issues' map.connect 'projects/:project_id/news/:action', :controller => 'news' + map.connect 'projects/:project_id/documents/:action', :controller => 'documents' map.connect 'projects/:project_id/boards/:action/:id', :controller => 'boards' map.connect 'boards/:board_id/topics/:action/:id', :controller => 'messages' diff --git a/lib/redmine.rb b/lib/redmine.rb index 1f1053438..921e16b30 100644 --- a/lib/redmine.rb +++ b/lib/redmine.rb @@ -58,8 +58,8 @@ Redmine::AccessControl.map do |map| end map.project_module :documents do |map| - map.permission :manage_documents, {:projects => :add_document, :documents => [:edit, :destroy, :add_attachment, :destroy_attachment]}, :require => :loggedin - map.permission :view_documents, :projects => :list_documents, :documents => [:show, :download] + map.permission :manage_documents, {:documents => [:new, :edit, :destroy, :add_attachment, :destroy_attachment]}, :require => :loggedin + map.permission :view_documents, :documents => [:index, :show, :download] end map.project_module :files do |map| @@ -97,7 +97,7 @@ Redmine::MenuManager.map :project_menu do |menu| menu.push :label_roadmap, :controller => 'projects', :action => 'roadmap' menu.push :label_issue_plural, { :controller => 'issues', :action => 'index' }, :param => :project_id menu.push :label_news_plural, { :controller => 'news', :action => 'index' }, :param => :project_id - menu.push :label_document_plural, :controller => 'projects', :action => 'list_documents' + menu.push :label_document_plural, { :controller => 'documents', :action => 'index' }, :param => :project_id menu.push :label_wiki, { :controller => 'wiki', :action => 'index', :page => nil }, :if => Proc.new { |p| p.wiki && !p.wiki.new_record? } menu.push :label_board_plural, { :controller => 'boards', :action => 'index', :id => nil }, :param => :project_id, :if => Proc.new { |p| p.boards.any? } menu.push :label_attachment_plural, :controller => 'projects', :action => 'list_files' diff --git a/test/functional/documents_controller_test.rb b/test/functional/documents_controller_test.rb new file mode 100644 index 000000000..7ba308ec5 --- /dev/null +++ b/test/functional/documents_controller_test.rb @@ -0,0 +1,64 @@ +# redMine - project management software +# Copyright (C) 2006-2007 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require File.dirname(__FILE__) + '/../test_helper' +require 'documents_controller' + +# Re-raise errors caught by the controller. +class DocumentsController; def rescue_action(e) raise e end; end + +class DocumentsControllerTest < Test::Unit::TestCase + fixtures :projects, :users, :roles, :members, :enabled_modules, :documents, :enumerations + + def setup + @controller = DocumentsController.new + @request = ActionController::TestRequest.new + @response = ActionController::TestResponse.new + User.current = nil + end + + def test_index + get :index, :project_id => 'ecookbook' + assert_response :success + assert_template 'index' + assert_not_nil assigns(:grouped) + end + + def test_new_with_one_attachment + @request.session[:user_id] = 2 + post :new, :project_id => 'ecookbook', + :document => { :title => 'DocumentsControllerTest#test_post_new', + :description => 'This is a new document', + :category_id => 2}, + :attachments => [ ActionController::TestUploadedFile.new(Test::Unit::TestCase.fixture_path + '/files/testfile.txt', 'text/plain') ] + + assert_redirected_to 'projects/ecookbook/documents' + + document = Document.find_by_title('DocumentsControllerTest#test_post_new') + assert_not_nil document + assert_equal Enumeration.find(2), document.category + assert_equal 1, document.attachments.size + assert_equal 'testfile.txt', document.attachments.first.filename + end + + def test_destroy + @request.session[:user_id] = 2 + post :destroy, :id => 1 + assert_redirected_to 'projects/ecookbook/documents' + assert_nil Document.find_by_id(1) + end +end diff --git a/test/functional/projects_controller_test.rb b/test/functional/projects_controller_test.rb index 556d5d407..896f59074 100644 --- a/test/functional/projects_controller_test.rb +++ b/test/functional/projects_controller_test.rb @@ -92,13 +92,6 @@ class ProjectsControllerTest < Test::Unit::TestCase assert_nil Project.find_by_id(1) end - def test_list_documents - get :list_documents, :id => 1 - assert_response :success - assert_template 'list_documents' - assert_not_nil assigns(:grouped) - end - def test_bulk_edit_issues @request.session[:user_id] = 2 # update issues priority