From 8994a0b58dcb3885e6b6ebb6626cb8cf1247315a Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Fri, 20 May 2011 14:49:18 -0700 Subject: [PATCH] [#406] Added missing and removed unused code for Journals acts_as_journalized changed the interfaces and didn't include all of the recent changes to the Journals system. * removed Journal diffs, acts_as_journalized handles them differently * fixed the Journal atom feed * added the journal preview back in * added missing tests --- app/controllers/journals_controller.rb | 91 +++++++++++++++++---- app/views/journals/_notes_form.rhtml | 10 +++ app/views/journals/diff.html.erb | 10 --- test/functional/journals_controller_test.rb | 28 +++++++ 4 files changed, 114 insertions(+), 25 deletions(-) delete mode 100644 app/views/journals/diff.html.erb diff --git a/app/controllers/journals_controller.rb b/app/controllers/journals_controller.rb index 6ea072a5..c0816f15 100644 --- a/app/controllers/journals_controller.rb +++ b/app/controllers/journals_controller.rb @@ -1,44 +1,105 @@ -# This file is part of the acts_as_journalized plugin for the redMine -# project management software -# -# Copyright (C) 2006-2008 Jean-Philippe Lang +# Redmine - project management software +# Copyright (C) 2006-2011 Jean-Philippe Lang # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either journal 2 -# of the License, or (at your option) any later journal. -# +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -# +# # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. class JournalsController < ApplicationController - unloadable - before_filter :find_journal + before_filter :find_journal, :only => [:edit, :diff] + before_filter :find_issue, :only => [:new] + before_filter :find_optional_project, :only => [:index] + before_filter :authorize, :only => [:new, :edit, :diff] + accept_key_auth :index + menu_item :issues + + include QueriesHelper + include SortHelper + def index + retrieve_query + sort_init 'id', 'desc' + sort_update(@query.sortable_columns) + + if @query.valid? + @journals = @query.issue_journals(:order => "#{Journal.table_name}.created_at DESC", + :limit => 25) + end + @title = (@project ? @project.name : Setting.app_title) + ": " + (@query.new_record? ? l(:label_changes_details) : @query.name) + render :layout => false, :content_type => 'application/atom+xml' + rescue ActiveRecord::RecordNotFound + render_404 + end + + # Used when replying to an issue or journal + def new + journal = Journal.find(params[:journal_id]) if params[:journal_id] + if journal + user = journal.user + text = journal.notes + else + user = @issue.author + text = @issue.description + end + # Replaces pre blocks with [...] + text = text.to_s.strip.gsub(%r{
((.|\s)*?)
}m, '[...]') + content = "#{ll(Setting.default_language, :text_user_wrote, user)}\n> " + content << text.gsub(/(\r?\n|\r\n?)/, "\n> ") + "\n\n" + + render(:update) { |page| + page.<< "$('notes').value = \"#{escape_javascript content}\";" + page.show 'update' + page << "Form.Element.focus('notes');" + page << "Element.scrollTo('update');" + page << "$('notes').scrollTop = $('notes').scrollHeight - $('notes').clientHeight;" + } + end + def edit + (render_403; return false) unless @journal.editable_by?(User.current) if request.post? @journal.update_attribute(:notes, params[:notes]) if params[:notes] @journal.destroy if @journal.details.empty? && @journal.notes.blank? call_hook(:controller_journals_edit_post, { :journal => @journal, :params => params}) respond_to do |format| format.html { redirect_to :controller => @journal.journaled.class.name.pluralize.downcase, - :action => 'show', :id => @journal.journaled_id } + :action => 'show', :id => @journal.journaled_id } format.js { render :action => 'update' } end + else + respond_to do |format| + format.html { + # TODO: implement non-JS journal update + render :nothing => true + } + format.js + end end end - -private + + private + def find_journal @journal = Journal.find(params[:id]) - (render_403; return false) unless @journal.editable_by?(User.current) - @project = @journal.project + @project = @journal.journalized.project + rescue ActiveRecord::RecordNotFound + render_404 + end + + # TODO: duplicated in IssuesController + def find_issue + @issue = Issue.find(params[:id], :include => [:project, :tracker, :status, :author, :priority, :category]) + @project = @issue.project rescue ActiveRecord::RecordNotFound render_404 end diff --git a/app/views/journals/_notes_form.rhtml b/app/views/journals/_notes_form.rhtml index 8344d938..610260b3 100644 --- a/app/views/journals/_notes_form.rhtml +++ b/app/views/journals/_notes_form.rhtml @@ -3,6 +3,16 @@ :rows => (@journal.notes.blank? ? 10 : [[10, @journal.notes.length / 50].max, 100].min) %> <%= call_hook(:view_journals_notes_form_after_notes, { :journal => @journal}) %>

<%= submit_tag l(:button_save) %> + <%= link_to_remote l(:label_preview), + { :url => preview_issue_path(:project_id => @project, :id => @journal.issue), + :method => 'post', + :update => "journal_#{@journal.id}_preview", + :with => "Form.serialize('journal-#{@journal.id}-form')", + :complete => "Element.scrollTo('journal_#{@journal.id}_preview')" + }, :accesskey => accesskey(:preview) %> + | <%= link_to l(:button_cancel), '#', :onclick => "Element.remove('journal-#{@journal.id}-form'); " + "Element.show('journal-#{@journal.id}-notes'); return false;" %>

+ +
<% end %> diff --git a/app/views/journals/diff.html.erb b/app/views/journals/diff.html.erb deleted file mode 100644 index 21b8755e..00000000 --- a/app/views/journals/diff.html.erb +++ /dev/null @@ -1,10 +0,0 @@ -

<%=h @issue.tracker %> #<%= @issue.id %>

-

<%= authoring @journal.created_on, @journal.user, :label => :label_updated_time_by %>

- -
-<%= simple_format_without_paragraph @diff.to_html %> -
- -

<%= link_to l(:button_back), issue_path(@issue), :onclick => 'history.back(); return false;' %>

- -<% html_title "#{@issue.tracker.name} ##{@issue.id}: #{@issue.subject}" %> diff --git a/test/functional/journals_controller_test.rb b/test/functional/journals_controller_test.rb index 73c81fa3..ac3bf88a 100644 --- a/test/functional/journals_controller_test.rb +++ b/test/functional/journals_controller_test.rb @@ -56,4 +56,32 @@ class JournalsControllerTest < ActionController::TestCase assert_select_rjs :remove, 'change-2' assert_nil Journal.find_by_id(2) end + + def test_index + get :index, :project_id => 1 + assert_response :success + assert_not_nil assigns(:journals) + assert_equal 'application/atom+xml', @response.content_type + end + + def test_reply_to_issue + @request.session[:user_id] = 2 + get :new, :id => 6 + assert_response :success + assert_select_rjs :show, "update" + end + + def test_reply_to_issue_without_permission + @request.session[:user_id] = 7 + get :new, :id => 6 + assert_response 403 + end + + def test_reply_to_note + @request.session[:user_id] = 2 + get :new, :id => 6, :journal_id => 4 + assert_response :success + assert_select_rjs :show, "update" + end + end