# 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 include CoursesHelper REPLIES_PER_PAGE = 25 unless const_defined?(:REPLIES_PER_PAGE) # Show a topic and its replies def show if @course topic_id = params[:r]?params[:r]:params[:id] parent_id = params[:id] url = course_boards_path(@course,:topic_id => topic_id,:parent_id=>parent_id); redirect_to url return; end @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 messages_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 @replies = paginateHelper messages_replies,10 @reply = Message.new(:subject => "RE: #{@message.subject}") render :action => "show", :layout => "base_courses"#by young else @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}") 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 # 更新kindeditor上传的图片资源所有者 if params[:asset_id] ids = params[:asset_id].split(',') update_kindeditor_assets_owner ids,@message.id,OwnerTypeHelper::MESSAGE end # 与我相关动态的记录add start if(@board && @board.course) #项目的先不管 teachers = searchTeacherAndAssistant(@board.course) for teacher in teachers if(teacher.user_id != User.current.id) notify = ActivityNotify.new() if(@board.course) notify.activity_container_id = @board.course_id notify.activity_container_type = 'Course' else notify.activity_container_id = @board.project_id notify.activity_container_type = 'Project' end notify.activity_id = @message.id notify.activity_type = 'Message' notify.notify_to = teacher.user_id notify.is_read = 0 notify.save() end end end # 与我相关动态的记录add end call_hook(:controller_messages_new_after_save, { :params => params, :message => @message}) render_attachment_warning_if_needed(@message) if params[:is_board] if @project redirect_to project_boards_path(@project) elsif @course redirect_to course_boards_path(@course) end else redirect_to board_message_url(@board, @message) end else if params[:is_board] if @project redirect_to project_boards_path(@project, :flag => true) elsif @course redirect_to course_boards_path(@course, :flag => true) end else layout_file = @project ? 'base_projects' : 'base_courses' render :action => 'new', :layout => layout_file end end else respond_to do |format| format.html { layout_file = @project ? 'base_projects' : 'base_courses' render :layout => layout_file } end end end # Reply to a topic def reply if params[:reply][:content] == "" if params[:is_board] if @project (redirect_to project_boards_path(@project), :notice => l(:label_reply_empty);return) elsif @course (redirect_to course_boards_path(@course), :notice => l(:label_reply_empty);return) end else (redirect_to board_message_url(@board, @topic, :r => @reply), :notice => l(:label_reply_empty);return) end 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? if params[:asset_id] ids = params[:asset_id].split(',') update_kindeditor_assets_owner ids,@reply.id,OwnerTypeHelper::MESSAGE end # 与我相关动态的记录add start if(@board && @board.course) #项目的先不管 notifyto_arr = {} notifyto_arr[@topic.author_id] = @topic.author_id if( params[:parent_topic] != nil && params[:parent_topic] != '') parent_topic = Message.find(params[:parent_topic]) notifyto_arr[parent_topic.author_id] = parent_topic.author_id end notifyto_arr.each do |k,user_id| if(user_id != User.current.id) notify = ActivityNotify.new() if(@board.course) notify.activity_container_id = @board.course_id notify.activity_container_type = 'Course' else notify.activity_container_id = @board.project_id notify.activity_container_type = 'Project' end notify.activity_id = @reply.id notify.activity_type = 'Message' notify.notify_to = user_id notify.is_read = 0 notify.save() end end end # 与我相关动态的记录add end 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 if params[:is_board] if @project redirect_to project_boards_path(@project) elsif @course redirect_to course_boards_path(@course) end else redirect_to board_message_url(@board, @topic, :r => @reply) end 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 if params[:is_board] if @project redirect_to project_boards_path(@project) elsif @course redirect_to course_boards_path(@course) end else redirect_to board_message_url(@message.board, @message.root, :r => (@message.parent_id && @message.id)) end elsif request.get? || request.post? if params[:is_board] if @project redirect_to project_boards_path(@project) elsif @course redirect_to course_boards_path(@course) end else respond_to do |format| format.html { layout_file = @project ? 'base_projects' : 'base_courses' render :layout => layout_file } end 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 params[:is_board] redirect_to project_boards_url(@project) else redirect_to board_message_url(@board, @topic, :r => @reply) end elsif @course if params[:is_board] redirect_to course_boards_url(@course) else if @message.parent redirect_to board_message_url(@board, @message.parent, :r => r) else redirect_to course_board_url(@course, @board) end 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)}
#{@message.content.html_safe}
".html_safe 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