Merge branch 'unstable' of github.com:chiliproject/chiliproject into unstable
This commit is contained in:
commit
79ed4920cf
|
@ -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{<pre>((.|\s)*?)</pre>}m, '[...]')
|
||||
content = "#{ll(Setting.default_language, :text_user_wrote, user)}\n> "
|
||||
content << text.gsub(/(\r?\n|\r\n?)/, "\n> ") + "\n\n"
|
||||
|
||||
render(:update) { |page|
|
||||
page.<< "$('notes').value = \"#{escape_javascript content}\";"
|
||||
page.show 'update'
|
||||
page << "Form.Element.focus('notes');"
|
||||
page << "Element.scrollTo('update');"
|
||||
page << "$('notes').scrollTop = $('notes').scrollHeight - $('notes').clientHeight;"
|
||||
}
|
||||
end
|
||||
|
||||
def edit
|
||||
(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
|
||||
|
|
|
@ -39,7 +39,14 @@ class Issue < ActiveRecord::Base
|
|||
acts_as_watchable
|
||||
|
||||
acts_as_journalized :event_title => Proc.new {|o| "#{o.tracker.name} ##{o.journaled_id} (#{o.status}): #{o.subject}"},
|
||||
:event_type => Proc.new {|o| 'issue' + (o.closed? ? ' closed' : '')}
|
||||
:event_type => Proc.new {|o|
|
||||
t = 'issue'
|
||||
if o.changes.empty?
|
||||
t << '-note' unless o.initial?
|
||||
else
|
||||
t << (IssueStatus.find_by_id(o.new_value_for(:status_id)).try(:is_closed?) ? '-closed' : '-edit')
|
||||
end
|
||||
t }
|
||||
|
||||
register_on_journal_formatter(:id, 'parent_id')
|
||||
register_on_journal_formatter(:named_association, 'project_id', 'status_id', 'tracker_id', 'assigned_to_id',
|
||||
|
|
|
@ -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}) %>
|
||||
<p><%= 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;" %></p>
|
||||
|
||||
<div id="journal_<%= @journal.id %>_preview" class="wiki"></div>
|
||||
<% end %>
|
||||
|
|
|
@ -1,10 +0,0 @@
|
|||
<h2><%=h @issue.tracker %> #<%= @issue.id %></h2>
|
||||
<p><%= authoring @journal.created_on, @journal.user, :label => :label_updated_time_by %></p>
|
||||
|
||||
<div class="text-diff">
|
||||
<%= simple_format_without_paragraph @diff.to_html %>
|
||||
</div>
|
||||
|
||||
<p><%= link_to l(:button_back), issue_path(@issue), :onclick => 'history.back(); return false;' %></p>
|
||||
|
||||
<% html_title "#{@issue.tracker.name} ##{@issue.id}: #{@issue.subject}" %>
|
|
@ -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
|
||||
|
|
|
@ -37,7 +37,7 @@ class RepositoriesFilesystemControllerTest < ActionController::TestCase
|
|||
@repository = Repository::Filesystem.create(
|
||||
:project => Project.find(PRJ_ID),
|
||||
:url => REPOSITORY_PATH,
|
||||
:path_encoding => ''
|
||||
:path_encoding => nil
|
||||
)
|
||||
assert @repository
|
||||
end
|
||||
|
|
|
@ -49,11 +49,12 @@ class SearchControllerTest < ActionController::TestCase
|
|||
get :index, :q => 'issue', :issues => 1
|
||||
assert_response :success
|
||||
assert_template 'index'
|
||||
|
||||
|
||||
assert assigns(:results).include?(Issue.find(8))
|
||||
assert assigns(:results).include?(Issue.find(5))
|
||||
assert_tag :dt, :attributes => { :class => /issue closed/ },
|
||||
:child => { :tag => 'a', :content => /Closed/ }
|
||||
assert_select "dt.issue" do
|
||||
assert_select "a", :text => /Closed/
|
||||
end
|
||||
end
|
||||
|
||||
def test_search_project_and_subprojects
|
||||
|
|
|
@ -88,7 +88,7 @@ class WikiControllerTest < ActionController::TestCase
|
|||
page = Project.find(1).wiki.find_page('New page')
|
||||
assert !page.new_record?
|
||||
assert_not_nil page.content
|
||||
assert_equal 'Created the page', page.content.comments
|
||||
assert_equal 'Created the page', page.content.last_journal.notes
|
||||
end
|
||||
|
||||
def test_create_page_with_attachments
|
||||
|
@ -128,7 +128,7 @@ class WikiControllerTest < ActionController::TestCase
|
|||
page = Wiki.find(1).pages.find_by_title('Another_page')
|
||||
assert_equal "edited", page.content.text
|
||||
assert_equal 2, page.content.version
|
||||
assert_equal "my comments", page.content.comments
|
||||
assert_equal "my comments", page.content.last_journal.notes
|
||||
end
|
||||
|
||||
def test_update_page_with_failure
|
||||
|
|
|
@ -16,12 +16,10 @@
|
|||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
require File.expand_path('../../../../test_helper', __FILE__)
|
||||
require 'sqlite3_api'
|
||||
|
||||
class ChiliProject::DatabaseTest < ActiveSupport::TestCase
|
||||
setup do
|
||||
ChiliProject::Database.stubs(:adapter_name).returns "SQLite"
|
||||
SQLite3::Driver::Native::API.stubs(:sqlite3_libversion).returns "3.6.12"
|
||||
end
|
||||
|
||||
should "return the correct identifier" do
|
||||
|
@ -34,13 +32,31 @@ class ChiliProject::DatabaseTest < ActiveSupport::TestCase
|
|||
assert_equal true, ChiliProject::Database.sqlite?
|
||||
end
|
||||
|
||||
should "return a version string" do
|
||||
assert_equal "3.6.12", ChiliProject::Database.version
|
||||
should "return a version string for SQLite3" do
|
||||
begin
|
||||
ChiliProject::Database.stubs(:adapter_name).returns "SQLite"
|
||||
|
||||
# if we run the tests on sqlite, just stub the version method
|
||||
if Object.const_defined? 'SQLite3'
|
||||
SQLite3::Driver::Native::API.stubs(:sqlite3_libversion).returns "1.2.3"
|
||||
else
|
||||
# if we don't have any sqlite3 module, stub the whole module
|
||||
module ::SQLite3; module Driver; module Native; module API
|
||||
def self.sqlite3_libversion; "1.2.3"; end
|
||||
end; end; end; end
|
||||
created_stub = true
|
||||
end
|
||||
|
||||
assert_equal "1.2.3", ChiliProject::Database.version
|
||||
assert_equal "1.2.3", ChiliProject::Database.version(true)
|
||||
ensure
|
||||
# Clean up after us
|
||||
Object.instance_eval{remove_const :SQLite3 } if created_stub
|
||||
end
|
||||
end
|
||||
|
||||
should "return long version string for raw==true" do
|
||||
should "return a version string for PostgreSQL" do
|
||||
ChiliProject::Database.stubs(:adapter_name).returns "PostgreSQL"
|
||||
|
||||
raw_version = "PostgreSQL 8.3.11 on x86_64-pc-linux-gnu, compiled by GCC gcc-4.3.real (Debian 4.3.2-1.1) 4.3.2"
|
||||
ActiveRecord::Base.connection.stubs(:select_value).returns raw_version
|
||||
|
||||
|
@ -48,4 +64,12 @@ class ChiliProject::DatabaseTest < ActiveSupport::TestCase
|
|||
assert_equal raw_version, ChiliProject::Database.version(true)
|
||||
end
|
||||
|
||||
should "return a version string for MySQL" do
|
||||
ChiliProject::Database.stubs(:adapter_name).returns "MySQL"
|
||||
ActiveRecord::Base.connection.stubs(:select_value).returns "5.1.2"
|
||||
|
||||
assert_equal "5.1.2", ChiliProject::Database.version
|
||||
assert_equal "5.1.2", ChiliProject::Database.version(true)
|
||||
end
|
||||
|
||||
end
|
||||
|
|
|
@ -172,6 +172,7 @@ module Redmine
|
|||
:anchor => ("note-#{journal.anchor}" unless journal.initial?) }
|
||||
end
|
||||
end
|
||||
options[:type] ||= self.name.underscore.dasherize # Make sure the name of the journalized model and not the name of the journal is used for events
|
||||
{ :description => :notes, :author => :user }.reverse_merge options
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue