2017-04-07 10:16:13 +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
before_filter :authorize1 , :only = > [ :show ]
menu_item :boards
default_search_scope :messages
2017-07-28 16:59:17 +08:00
before_filter :find_board , :only = > [ :new , :create , :preview , :edit , :update , :sticky_topic ]
2017-04-07 10:16:13 +08:00
before_filter :find_attachments , :only = > [ :preview ]
2017-07-28 16:59:17 +08:00
before_filter :find_message , :except = > [ :new , :create , :preview , :join_org_subfield , :get_subfield_on_click_org , :join_org_subfields ]
before_filter :authorize , :except = > [ :preview , :edit , :update , :destroy , :message_replies , :new , :create , :join_org_subfield , :get_subfield_on_click_org , :join_org_subfields , :sticky_topic ]
2017-04-07 10:16:13 +08:00
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
# 顶部导航
@project_menu_type = 3
2017-07-28 16:59:17 +08:00
@topic . update_column ( 'visits' , @topic . visits + 1 )
2017-04-07 10:16:13 +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
all_comments = [ ]
@replies = Message . where ( " root_id = #{ @topic . id } " ) . reorder ( " created_on desc " )
@reply_count = @replies . count
@replies = get_no_children_comments_all @replies
2017-07-28 16:59:17 +08:00
#@limit_count = @replies.count
#@page = params[:page] ? params[:page].to_i + 1 : 0
#@limit = 10
#@replies = @replies[@page * @limit..@page * @limit + 9]
@reply = Message . new
2017-04-07 10:16:13 +08:00
if @course
#帖子消息状态更新
course_messages = CourseMessage . where ( " user_id =? and course_message_type =? and course_message_id =? and course_id =? and viewed =? " , User . current . id , 'Message' , @topic . id , @course . id , 0 )
course_messages . update_all ( :viewed = > true )
#@replies = @topic.children.
2017-07-26 16:28:34 +08:00
#includes(:author, :attachments, :praise_tread_cache, {:board => :project}).
#reorder("#{Message.table_name}.created_on DESC").
#limit(@reply_pages.per_page).
#offset(@reply_pages.offset).
#all
2017-04-07 10:16:13 +08:00
#@replies = paginateHelper messages_replies,10
# 班级帖子回复消息设为已读
2017-07-28 16:59:17 +08:00
2017-04-07 10:16:13 +08:00
@replies . each do | comment |
2017-07-26 16:28:34 +08:00
course_message = CourseMessage . where ( :course_message_type = > 'Message' , :course_message_id = > comment . id , :user_id = > User . current . id , :viewed = > 0 )
course_message . update_all ( :viewed = > 1 )
2017-04-07 10:16:13 +08:00
end
@left_nav_type = 2
respond_to do | format |
format . js
2017-07-28 16:59:17 +08:00
format . html { render :layout = > 'base_edu' }
2017-04-07 10:16:13 +08:00
end
#render :action => "show", :layout => "base_courses"#by young
elsif @project
#帖子消息状态更新
project_messages = ForgeMessage . where ( " user_id =? and forge_message_type =? and forge_message_id =? and project_id =? and viewed =? " , User . current . id , 'Message' , @topic . id , @project . id , 0 )
project_messages . update_all ( :viewed = > true )
#@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
# 项目帖子回复消息设为已读
@replies . each do | comment |
project_message = ForgeMessage . where ( :forge_message_type = > 'Message' , :forge_message_id = > comment . id , :user_id = > User . current . id , :viewed = > 0 )
project_message . update_all ( :viewed = > 1 )
end
respond_to do | format |
format . js
format . html { render :layout = > 'base_projects' }
end
elsif @contest
#帖子消息状态更新
contest_messages = ContestMessage . where ( " user_id =? and contest_message_type =? and contest_message_id =? and contest_id =? and viewed =? " , User . current . id , 'Message' , @topic . id , @contest . id , 0 )
contest_messages . update_all ( :viewed = > true )
# 竞赛帖子回复消息设为已读
@replies . each do | comment |
contest_message = ContestMessage . where ( :contest_message_type = > 'Message' , :contest_message_id = > comment . id , :user_id = > User . current . id , :viewed = > 0 )
contest_message . update_all ( :viewed = > 1 )
end
@left_nav_type = 4
respond_to do | format |
format . js
format . html { render :layout = > 'base_contests' }
end
#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
@organization = @org_subfield . organization
respond_to do | format |
format . js
format . html { render :layout = > 'base_org' }
end
end
end
# Create a new topic
def new
2017-07-28 16:59:17 +08:00
@message = Message . new
respond_to do | format |
format . html { render :layout = > 'base_edu' }
end
2017-07-26 16:28:34 +08:00
end
def create
2017-04-07 10:16:13 +08:00
if User . current . logged?
@message = Message . new
@message . author = User . current
@message . board = @board
@message . safe_attributes = params [ :message ]
2017-07-28 16:59:17 +08:00
@message . sticky = params [ :message ] [ :sticky ] ? 1 : 0
2017-04-07 10:16:13 +08:00
if request . post?
if @project
is_public = @project . is_public
elsif @course
is_public = @course . is_public
elsif @contest
is_public = @contest . is_public
end
# 公开项目/课程上传的资源是公开的,私有项目上传的是私有的
@message . save_attachments_containers ( params [ :attachments ] , User . current , is_public )
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 )
2017-07-28 16:59:17 +08:00
if @course
2017-04-07 10:16:13 +08:00
redirect_to board_message_url ( @board , @message )
2017-07-28 16:59:17 +08:00
else
if params [ :is_board ]
if @project
redirect_to project_boards_path ( @project )
elsif @contest
redirect_to contest_boards_path ( @contest , :board_id = > @board . id )
end
else
redirect_to board_message_url ( @board , @message )
end
2017-04-07 10:16:13 +08:00
end
else
if params [ :is_board ]
if @project
redirect_to project_boards_path ( @project , :flag = > true )
elsif @course
redirect_to course_boards_path ( @course , :board_id = > @board . id , :flag = > true )
elsif @contest
redirect_to contest_boards_path ( @contest , :board_id = > @board . id , :flag = > true )
end
else
2017-07-28 16:59:17 +08:00
layout_file = @project ? 'base_projects' : ( @course ? 'base_edu' : 'base_contests' )
2017-04-07 10:16:13 +08:00
render :action = > 'new' , :layout = > layout_file
end
end
else
@left_nav_type = 2
respond_to do | format |
format . html {
2017-07-28 16:59:17 +08:00
layout_file = @project ? 'base_projects' : ( @course ? 'base_edu' : 'base_contests' )
2017-04-07 10:16:13 +08:00
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 ]
2017-07-28 16:59:17 +08:00
@topic = params [ :activity_id ] . blank? ? parent : Message . find ( params [ :activity_id ] . to_i )
2017-04-07 10:16:13 +08:00
@reply = Message . new
@reply . author = User . current
@reply . board = parent . board
@reply . content = params [ :content ]
@reply . subject = " RE: #{ @topic . subject } "
@reply . reply_id = params [ :id ]
@reply . root_id = parent . root_id . nil? ? parent . id : parent . root_id
# @reply.reply_id = params[:id]
parent . children << @reply
else
#@quote = params[:quote][:quote]
@reply = Message . new
@reply . author = User . current
@reply . board = @board
@reply . subject = @topic . subject
@reply . content = params [ :content ]
@reply . safe_attributes = params [ :reply ]
#@reply.content = @quote + @reply.content
#@reply.subject = "RE: #{@topic.subject}" unless params[:reply][:subject]
@reply . root_id = @topic . id
@topic . children << @reply
# @reply.reply_id = params[:id]
end
update_course_activity ( @topic . class , @topic . id )
update_contest_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 )
2017-07-28 16:59:17 +08:00
redirect_to message_replies_board_message_path ( @topic , :board_id = > @board . id , :user_activity_id = > params [ :user_activity_id ] )
2017-04-07 10:16:13 +08:00
#@topic.update_attribute(:updated_on, Time.now)
2017-07-28 16:59:17 +08:00
# 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
2017-04-07 10:16:13 +08:00
2017-07-28 16:59:17 +08:00
# if params[:user_activity_id]
# @user_activity_id = params[:user_activity_id]
# @is_course = params[:is_course] if params[:is_course]
# @is_board = params[:is_board] if params[:is_board]
# respond_to do |format|
# format.js
# end
# return
# else
# redirect_to board_message_url(@board, @topic)
# return
# end
2017-04-07 10:16:13 +08:00
end
2017-07-28 16:59:17 +08:00
def message_replies
@replies = Message . where ( " root_id = #{ @topic . id } " ) . reorder ( " created_on desc " )
@reply_count = @replies . count
@replies = get_no_children_comments_all @replies
#@limit_count = @replies.count
#@page = params[:page] ? params[:page].to_i + 1 : 0
#@limit = 10
#@replies = @replies[@page * @limit..@page * @limit + 9]
@reply = Message . new ( )
@user_activity_id = params [ :user_activity_id ] . blank? ? @topic . id : params [ :user_activity_id ] . to_i
respond_to do | format |
format . js
end
end
2017-04-07 10:16:13 +08:00
# Edit a message
def edit
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 )
elsif @contest
( render_403 ; return false ) unless @message . contest_editable_by? ( User . current )
else
( render_403 ; return false ) unless @message . org_subfield_editable_by? ( User . current )
end
2017-07-28 16:59:17 +08:00
respond_to do | format |
format . html {
if @project
layout_file = 'base_projects'
elsif @course
@left_nav_type = 2
layout_file = 'base_edu'
elsif @contest
@left_nav_type = 4
layout_file = 'base_contests'
elsif @org_subfield
@organization = @org_subfield . organization
layout_file = 'base_org'
end
render :layout = > layout_file
}
end
end
def update
2017-04-07 10:16:13 +08:00
@message . safe_attributes = params [ :message ]
2017-07-28 16:59:17 +08:00
@message . sticky = params [ :message ] [ :sticky ] ? 1 : 0
if @message . save
2017-04-07 10:16:13 +08:00
attachments = Attachment . attach_files ( @message , params [ :attachments ] )
render_attachment_warning_if_needed ( @message )
#flash[:notice] = l(:notice_successful_update)
@message . reload
2017-07-28 16:59:17 +08:00
redirect_to board_message_url ( @message . board , @message . root , :r = > ( @message . parent_id && @message . id ) )
2017-04-07 10:16:13 +08:00
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 ] if params [ :is_course ]
@is_board = params [ :is_board ] if params [ :is_board ]
2017-07-28 16:59:17 +08:00
redirect_to message_replies_board_message_path ( @topic , :board_id = > @board . id , :user_activity_id = > params [ :user_activity_id ] )
2017-04-07 10:16:13 +08:00
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 )
elsif @contest
( render_403 ; return false ) unless @message . contest_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 , :board_id = > @board . id )
end
elsif @contest
if params [ :is_course ] && params [ :is_course ] . to_i == 0
redirect_to user_contest_community_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 contest_path ( @contest )
elsif params [ :is_course ] && params [ :is_course ] . to_i == 1 && params [ :is_board ] && params [ :is_board ] . to_i == 1
redirect_to contest_boards_path ( @contest )
elsif @message . parent
redirect_to board_message_url ( @board , @message . parent , :r = > r )
else
redirect_to contest_boards_path ( @contest , :board_id = > @board . id )
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
2017-07-28 16:59:17 +08:00
def sticky_topic
( render_403 ; return false ) unless ( User . current . admin? || User . current . allowed_to? ( :as_teacher , @course ) )
@topic . update_attributes ( :sticky = > @topic . sticky == 1 ? 0 : 1 )
redirect_to board_message_path ( @topic . board_id , @topic )
end
2017-04-07 10:16:13 +08:00
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 = "<blockquote>#{ll(Setting.default_language, :text_user_wrote, @message.author.show_name)} <br/>#{@message.content.html_safe}</blockquote>".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 ,
2017-07-26 16:28:34 +08:00
: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 )
2017-04-07 10:16:13 +08:00
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 && @board . course_id != - 1
@course = @board . course
elsif @board . contest_id
@contest = @board . contest
else
@org_subfield = @board . org_subfield
@organization = @org_subfield
end
rescue ActiveRecord :: RecordNotFound
render_404
nil
end
end