# Redmine - project management software # Copyright (C) 2006-2013 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. class MessagesController < ApplicationController include ApplicationHelper before_filter :authorize1, :only => [:show] menu_item :boards default_search_scope :messages before_filter :find_board, :only => [:new, :preview,:edit] before_filter :find_attachments, :only => [:preview] before_filter :find_message, :except => [:new, :preview] before_filter :authorize, :except => [:preview, :edit, :destroy, :new] helper :boards helper :watchers helper :attachments include AttachmentsHelper helper :project_score REPLIES_PER_PAGE = 25 unless const_defined?(:REPLIES_PER_PAGE) # Show a topic and its replies def show @isReply = true page = params[:page] # Find the page of the requested reply if params[:r] && page.nil? offset = @topic.children.count(:conditions => ["#{Message.table_name}.id < ?", params[:r].to_i]) page = 1 + offset / REPLIES_PER_PAGE end @reply_count = @topic.children.count @reply_pages = Paginator.new @reply_count, REPLIES_PER_PAGE, page @replies = @topic.children. includes(:author, :attachments, {:board => :project}). reorder("#{Message.table_name}.created_on DESC"). limit(@reply_pages.per_page). offset(@reply_pages.offset). all @reply = Message.new(:subject => "RE: #{@message.subject}") if @course render :action => "show", :layout => "base_courses"#by young else render :action => "show", :layout => "base_projects"#by young end end # Create a new topic def new @message = Message.new @message.author = User.current @message.board = @board @message.safe_attributes = params[:message] if request.post? @message.save_attachments(params[:attachments]) if @message.save call_hook(:controller_messages_new_after_save, { :params => params, :message => @message}) render_attachment_warning_if_needed(@message) redirect_to board_message_url(@board, @message) else layout_file = @project ? 'base_projects' : 'base_courses' render :action => 'new', :layout => layout_file end end end # Reply to a topic def reply if params[:reply][:content] == "" (redirect_to board_message_url(@board, @topic, :r => @reply), :notice => l(:label_reply_empty);return) end @quote = params[:quote][:quote] @reply = Message.new @reply.author = User.current @reply.board = @board @reply.safe_attributes = params[:reply] @reply.content = @quote + @reply.content @topic.children << @reply #@topic.update_attribute(:updated_on, Time.now) if !@reply.new_record? call_hook(:controller_messages_reply_after_save, { :params => params, :message => @reply}) attachments = Attachment.attach_files(@reply, params[:attachments]) render_attachment_warning_if_needed(@reply) else #render file: 'messages#show', layout: 'base_courses' end redirect_to board_message_url(@board, @topic, :r => @reply) end # Edit a message def edit @isReply = false if @project (render_403; return false) unless @message.editable_by?(User.current) else (render_403; return false) unless @message.course_editable_by?(User.current) end @message.safe_attributes = params[:message] if request.post? && @message.save attachments = Attachment.attach_files(@message, params[:attachments]) render_attachment_warning_if_needed(@message) flash[:notice] = l(:notice_successful_update) @message.reload redirect_to board_message_url(@message.board, @message.root, :r => (@message.parent_id && @message.id)) elsif request.get? respond_to do |format| format.html { layout_file = @project ? 'base_projects' : 'base_courses' render :layout => layout_file } end end end # Delete a messages def destroy if @project (render_403; return false) unless @message.destroyable_by?(User.current) else (render_403; return false) unless @message.course_destroyable_by?(User.current) end r = @message.to_param @message.destroy # modify by nwb if @project if @message.parent redirect_to board_message_url(@board, @message.parent, :r => r) else redirect_to project_boards_url(@project) end elsif @course if @message.parent redirect_to board_message_url(@board, @message.parent, :r => r) else redirect_to course_board_url(@course, @board) end end end def quote @subject = @message.subject @subject = "RE: #{@subject}" unless @subject.starts_with?('RE:') @content = "> #{ll(Setting.default_language, :text_user_wrote, @message.author)}\n> " @temp = Message.new #@temp.content = "> #{ll(Setting.default_language, :text_user_wrote, @message.author)}> " @content << @message.content.to_s.strip.gsub(%r{
((.|\s)*?)}m, '[...]').gsub(/(\r?\n|\r\n?)/, "\n> ") + "\n\n" @content_html = textilizable(@content) @temp.content = @content_html #@content = "#{ll(Setting.default_language, :text_user_wrote, @message.author)}
((.|\s)*?)}m, '[...]').gsub(/(\r?\n|\r\n?)/, "\n") + "\n\n
" << @content #@temp = Message.new #@temp.content = @content end def preview message = @board.messages.find_by_id(params[:id]) @text = (params[:message] || params[:reply])[:content] @previewed = message render :partial => 'common/preview' end private def find_message return unless find_board @message = @board.messages.find(params[:id], :include => :parent) @topic = @message.root rescue ActiveRecord::RecordNotFound render_404 end def find_board #modify by nwb @board = Board.find(params[:board_id]) if @board.project_id != -1 && @board.project_id != nil @project = @board.project elsif @board.course_id @course = @board.course end rescue ActiveRecord::RecordNotFound render_404 nil end end