2014-09-15 10:58:14 +08:00
# 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
2015-02-06 18:15:08 +08:00
before_filter :authorize1 , :only = > [ :show ]
2014-09-15 10:58:14 +08:00
menu_item :boards
default_search_scope :messages
before_filter :find_board , :only = > [ :new , :preview , :edit ]
before_filter :find_attachments , :only = > [ :preview ]
2015-12-23 15:35:26 +08:00
before_filter :find_message , :except = > [ :new , :preview , :join_org_subfield , :get_subfield_on_click_org , :join_org_subfields ]
2015-12-28 14:35:13 +08:00
before_filter :authorize , :except = > [ :preview , :edit , :destroy , :new , :join_org_subfield , :get_subfield_on_click_org , :join_org_subfields ]
2014-09-15 10:58:14 +08:00
helper :boards
helper :watchers
helper :attachments
include AttachmentsHelper
helper :project_score
2015-06-04 15:55:41 +08:00
include CoursesHelper
2014-09-15 10:58:14 +08:00
REPLIES_PER_PAGE = 25 unless const_defined? ( :REPLIES_PER_PAGE )
# Show a topic and its replies
def show
2015-10-09 14:39:40 +08:00
= begin
2015-06-23 16:05:08 +08:00
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
2015-10-09 14:39:40 +08:00
= end
2015-06-23 16:05:08 +08:00
2014-09-15 10:58:14 +08:00
@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
2015-03-26 16:17:33 +08:00
# @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
2014-09-15 10:58:14 +08:00
@reply = Message . new ( :subject = > " RE: #{ @message . subject } " )
if @course
2015-03-26 16:17:33 +08:00
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 } " )
2014-09-15 10:58:14 +08:00
render :action = > " show " , :layout = > " base_courses " #by young
else
2015-03-26 16:17:33 +08:00
@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 } " )
2014-09-15 10:58:14 +08:00
render :action = > " show " , :layout = > " base_projects " #by young
end
end
# Create a new topic
def new
2015-09-06 17:27:20 +08:00
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
2015-06-04 15:55:41 +08:00
2015-09-06 17:27:20 +08:00
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 )
2015-05-11 17:23:53 +08:00
end
else
2015-09-06 17:27:20 +08:00
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
2015-05-11 17:23:53 +08:00
end
2014-09-15 10:58:14 +08:00
else
2015-09-06 17:27:20 +08:00
respond_to do | format |
format . html {
layout_file = @project ? 'base_projects' : 'base_courses'
render :layout = > layout_file
}
2015-05-11 17:35:36 +08:00
end
2014-09-15 10:58:14 +08:00
end
2015-03-24 17:12:51 +08:00
else
2015-09-06 17:27:20 +08:00
redirect_to signin_path
2014-09-15 10:58:14 +08:00
end
end
# Reply to a topic
def reply
if params [ :reply ] [ :content ] == " "
2015-05-11 17:35:36 +08:00
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
2014-09-15 10:58:14 +08:00
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
2015-09-01 14:18:44 +08:00
@reply . subject = " RE: #{ @topic . subject } " unless params [ :reply ] [ :subject ]
2015-09-24 17:18:58 +08:00
# @reply.reply_id = params[:id]
2014-09-15 10:58:14 +08:00
@topic . children << @reply
2015-09-24 16:30:14 +08:00
course_activity = CourseActivity . where ( " course_act_type='Message' and course_act_id = #{ @topic . id } " ) . first
2015-09-29 11:54:43 +08:00
if course_activity
course_activity . updated_at = Time . now
course_activity . save
end
2015-12-04 10:59:09 +08:00
forge_activity = ForgeActivity . where ( " forge_act_type='Message' and forge_act_id= #{ @topic . id } " ) . first
if forge_activity
forge_activity . updated_at = Time . now
forge_activity . save
end
2015-09-17 15:50:33 +08:00
user_activity = UserActivity . where ( " act_type='Message' and act_id = #{ @topic . id } " ) . first
2015-09-29 11:54:43 +08:00
if user_activity
user_activity . updated_at = Time . now
user_activity . save
end
2015-11-17 09:51:16 +08:00
org_activity = OrgActivity . where ( " org_act_type='Message' and org_act_id = #{ @topic . id } " ) . first
if org_activity
org_activity . updated_at = Time . now
org_activity . save
end
2014-09-15 10:58:14 +08:00
#@topic.update_attribute(:updated_on, Time.now)
if ! @reply . new_record?
2015-04-03 16:35:46 +08:00
if params [ :asset_id ]
2015-05-08 15:02:04 +08:00
ids = params [ :asset_id ] . split ( ',' )
update_kindeditor_assets_owner ids , @reply . id , OwnerTypeHelper :: MESSAGE
2015-04-03 16:35:46 +08:00
end
2015-06-04 15:55:41 +08:00
2014-09-15 10:58:14 +08:00
call_hook ( :controller_messages_reply_after_save , { :params = > params , :message = > @reply } )
attachments = Attachment . attach_files ( @reply , params [ :attachments ] )
render_attachment_warning_if_needed ( @reply )
2015-05-05 14:32:40 +08:00
else
2015-05-08 15:02:04 +08:00
#render file: 'messages#show', layout: 'base_courses'
2014-09-15 10:58:14 +08:00
end
2015-09-01 14:18:44 +08:00
if params [ :user_activity_id ]
@user_activity_id = params [ :user_activity_id ]
respond_to do | format |
format . js
end
elsif params [ :is_board ]
2015-05-11 17:23:53 +08:00
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
2015-05-08 15:02:04 +08:00
2014-09-15 10:58:14 +08:00
end
# Edit a message
def edit
@isReply = false
2015-05-12 17:14:07 +08:00
if @project
( render_403 ; return false ) unless @message . editable_by? ( User . current )
2014-09-15 10:58:14 +08:00
else
2015-05-12 17:14:07 +08:00
( render_403 ; return false ) unless @message . course_editable_by? ( User . current )
2014-09-15 10:58:14 +08:00
end
2015-05-11 17:35:36 +08:00
2014-09-15 10:58:14 +08:00
@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
2015-05-11 17:23:53 +08:00
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
2015-05-22 11:09:43 +08:00
elsif request . get? || request . post?
2015-05-13 14:31:54 +08:00
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
2014-09-15 10:58:14 +08:00
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
2015-05-11 17:23:53 +08:00
if params [ :is_board ]
2015-05-08 15:02:04 +08:00
redirect_to project_boards_url ( @project )
2015-05-11 17:23:53 +08:00
else
2015-12-29 15:46:20 +08:00
if @message . parent
redirect_to board_message_url ( @board , @message . parent , :r = > r )
else
redirect_to project_board_url ( @project , @board )
end
# redirect_to board_message_url(@board, @topic, :r => @reply)
2014-09-15 10:58:14 +08:00
end
elsif @course
2015-05-11 17:23:53 +08:00
if params [ :is_board ]
redirect_to course_boards_url ( @course )
2014-09-15 10:58:14 +08:00
else
2015-05-11 17:23:53 +08:00
if @message . parent
redirect_to board_message_url ( @board , @message . parent , :r = > r )
else
redirect_to course_board_url ( @course , @board )
end
2014-09-15 10:58:14 +08:00
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
2015-04-08 17:25:52 +08:00
@temp . content = " <blockquote> #{ ll ( Setting . default_language , :text_user_wrote , @message . author ) } <br/> #{ @message . content . html_safe } </blockquote> " . html_safe
2014-09-15 10:58:14 +08:00
end
def preview
message = @board . messages . find_by_id ( params [ :id ] )
@text = ( params [ :message ] || params [ :reply ] ) [ :content ]
@previewed = message
render :partial = > 'common/preview'
end
2015-12-23 15:35:26 +08:00
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 ] )
2015-12-23 16:49:05 +08:00
# @message.update_attribute(:updated_on, Time.now)
2015-12-23 15:35:26 +08:00
type = @message . board . course_id . nil? ? " Project " :" Course "
org_subfield_ids . each do | field_id |
2015-12-29 15:49:24 +08:00
@message . quotes = @message . quotes . nil? ? 1 : ( @message . quotes + 1 )
@message . save
mes = Message . create ( :board_id = > @message . 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 )
2015-12-23 16:49:05 +08:00
end
2015-12-29 15:49:24 +08:00
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
2015-12-23 15:35:26 +08:00
end
end
2015-05-08 15:02:04 +08:00
private
2014-09-15 10:58:14 +08:00
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