# 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, :join_org_subfield, :get_subfield_on_click_org, :join_org_subfields] before_filter :authorize, :except => [:preview, :edit, :destroy, :new,:join_org_subfield, :get_subfield_on_click_org, :join_org_subfields] 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 @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 all_comments = [] @reply_count = get_all_children(all_comments, @topic).count @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 elsif @project @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 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}") @organization = @org_subfield.organization render :action => "show", :layout => "base_org"#by young end end # Create a new topic def new if User.current.logged? @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 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 else redirect_to signin_path end end # Reply to a topic def reply if params[:parent_id] parent = Message.find params[:parent_id] @reply = Message.new @reply.author = User.current @reply.board = parent.board @reply.content = params[:content] @reply.subject = "RE: #{parent.subject}" @reply.reply_id = params[:reply_id] # @reply.reply_id = params[:id] parent.children << @reply @topic = params[:activity_id].nil? ? parent : Message.find(params[:activity_id].to_i) @user_activity_id = params[:user_activity_id] if params[:user_activity_id] @is_course = params[:is_course] if params[:is_course] @is_board = params[:is_board] if params[:is_board] else @quote = params[:quote][:quote] @reply = Message.new @reply.author = User.current @reply.board = @board @reply.safe_attributes = params[:reply] @reply.content = @quote + @reply.content @reply.subject = "RE: #{@topic.subject}" unless params[:reply][:subject] @topic.children << @reply # @reply.reply_id = params[:id] end update_course_activity(@topic.class,@topic.id) update_user_activity(@topic.class,@topic.id) update_forge_activity(@topic.class,@topic.id) update_org_activity(@topic.class,@topic.id) #@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 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[:user_activity_id] @user_activity_id = params[:user_activity_id] @is_course = params[:is_course] @is_board = params[:is_board] respond_to do |format| format.js end return else redirect_to board_message_url(@board, @topic) return end end # Edit a message def edit @isReply = false if @project (render_403; return false) unless @message.editable_by?(User.current) elsif @course (render_403; return false) unless @message.course_editable_by?(User.current) else (render_403; return false) unless @message.org_subfield_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_course] && params[:is_course].to_i == 0 redirect_to user_activities_path(User.current.id) elsif params[:is_course] && params[:is_course].to_i == 1 && params[:is_board] && params[:is_board].to_i == 0 if @project redirect_to project_path(@project) elsif @course redirect_to course_activity_path(@course) end elsif params[:is_course] && params[:is_course].to_i == 1 && params[:is_board] && params[:is_board].to_i == 1 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_course] && params[:is_board] @is_course = params[:is_course] @is_board = params[:is_board] end respond_to do |format| format.html { if @project layout_file = 'base_projects' elsif @course layout_file = 'base_courses' elsif @org_subfield @organization = @org_subfield.organization layout_file = 'base_org' end render :layout => layout_file } end end end # Delete a messages def destroy if params[:user_activity_id] @message.destroy @topic = Message.find(params[:activity_id].to_i) @user_activity_id = params[:user_activity_id] @is_course = params[:is_course] @is_board = params[:is_board] respond_to do |format| format.js end return end if @project (render_403; return false) unless @message.destroyable_by?(User.current) elsif @course (render_403; return false) unless @message.course_destroyable_by?(User.current) else (render_403; return false) unless @message.org_subfield_editable_by?(User.current) end r = @message.to_param @message.destroy # modify by nwb if @project if params[:is_course] && params[:is_course].to_i == 0 redirect_to user_activities_path(User.current.id) elsif params[:is_course] && params[:is_course].to_i == 1 && params[:is_board] && params[:is_board].to_i == 0 redirect_to project_path(@project) elsif params[:is_course] && params[:is_course].to_i == 1 && params[:is_board] && params[:is_board].to_i == 1 redirect_to project_boards_path(@project) elsif @message.parent redirect_to board_message_url(@board, @message.parent, :r => r) else redirect_to project_board_url(@project, @board) end elsif @course if params[:is_course] && params[:is_course].to_i == 0 redirect_to user_activities_path(User.current.id) elsif params[:is_course] && params[:is_course].to_i == 1 && params[:is_board] && params[:is_board].to_i == 0 redirect_to course_activity_path(@course) elsif params[:is_course] && params[:is_course].to_i == 1 && params[:is_board] && params[:is_board].to_i == 1 redirect_to course_boards_path(@course) elsif @message.parent redirect_to board_message_url(@board, @message.parent, :r => r) else redirect_to course_boards_path(@course) end elsif @org_subfield if params[:is_board] redirect_to organization_path(:id => @org_subfield.organization_id, :org_subfield_id => @org_subfield.id) else if @message.parent redirect_to board_message_url(@board, @message.parent, :r => r) else redirect_to organization_path(:id => @org_subfield.organization_id, :org_subfield_id => @org_subfield.id) 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.show_name)}
#{@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 def join_org_subfield @message = Message.find(params[:message_id]) @organizations = User.current.organizations end def get_subfield_on_click_org @org = Organization.find(params[:organization_id]) end def join_org_subfields org_subfield_ids = params[:org_subfields] @message = Message.find(params[:id]) # @message.update_attribute(:updated_on, Time.now) # type = @message.board.course_id.nil? ? "Project":"Course" org_subfield_ids.each do |field_id| @message.quotes = @message.quotes.nil? ? 1 : (@message.quotes + 1) @message.save board = OrgSubfield.find(field_id).boards.first mes = Message.create(:board_id => board.id, :subject => @message.subject, :content => @message.content, :author_id => User.current.id, :created_on => Time.now, :updated_on => Time.now, :locked => @message.locked, :sticky => @message.sticky) @message.attachments.each do |attach| mes.attachments << Attachment.new(:filename => attach.filename, :disk_filename => attach.disk_filename, :filesize => attach.filesize, :content_type => attach.content_type, :digest => attach.digest, :downloads => 0, :author_id => User.current.id, :created_on => Time.now, :description => attach.description, :disk_directory => attach.disk_directory, :attachtype => attach.attachtype, :is_public => attach.is_public, :quotes => 0) end # OrgSubfieldMessage.create(:org_subfield_id => field_id.to_i, :message_id => mes.id, :message_type => type) # org_acts = OrgActivity.where("container_type='OrgSubfield' and container_id=? and org_act_type='Message' and org_act_id=?", field_id.to_i, @message.id) # if org_acts.all.size() > 0 # org_acts.first.update_attribute(:updated_at, Time.now) # else OrgActivity.create(:container_type => 'OrgSubfield', :container_id => field_id.to_i, :org_act_type=>'Message', :org_act_id => mes.id, :user_id => User.current.id) # end end 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 else @org_subfield = @board.org_subfield @organization = @org_subfield end rescue ActiveRecord::RecordNotFound render_404 nil end end