2016-04-12 15:12:40 +08:00
#encoding: utf-8
2015-04-07 13:47:39 +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 News < ActiveRecord :: Base
2016-04-12 15:12:40 +08:00
require 'net/http'
require 'json'
2015-04-07 13:47:39 +08:00
include Redmine :: SafeAttributes
2015-11-26 16:43:10 +08:00
belongs_to :project , :touch = > true
2015-04-07 13:47:39 +08:00
include ApplicationHelper
has_many_kindeditor_assets :assets , :dependent = > :destroy
#added by nwb
2015-11-30 12:55:19 +08:00
belongs_to :course , :touch = > true
2016-12-23 17:00:11 +08:00
belongs_to :contest , :touch = > true
2016-01-20 16:24:14 +08:00
belongs_to :org_subfield , :touch = > true
2015-04-07 13:47:39 +08:00
belongs_to :author , :class_name = > 'User' , :foreign_key = > 'author_id'
2015-08-21 11:28:10 +08:00
has_many :comments , :as = > :commented , :dependent = > :destroy , :order = > " created_on "
2015-04-07 13:47:39 +08:00
# fq
has_many :acts , :class_name = > 'Activity' , :as = > :act , :dependent = > :destroy
# 被ForgeActivity虚拟关联
has_many :forge_acts , :class_name = > 'ForgeActivity' , :as = > :forge_act , :dependent = > :destroy
2015-08-11 15:54:05 +08:00
# 课程动态
has_many :course_acts , :class_name = > 'CourseActivity' , :as = > :course_act , :dependent = > :destroy
2016-12-22 10:01:37 +08:00
# 竞赛动态
has_many :contest_acts , :class_name = > 'ContestActivity' , :as = > :contest_act , :dependent = > :destroy
2015-04-07 13:47:39 +08:00
# end
2016-12-22 10:01:37 +08:00
# 课程/项目/竞赛消息关联
2015-08-14 10:19:59 +08:00
has_many :course_messages , :class_name = > 'CourseMessage' , :as = > :course_message , :dependent = > :destroy
2015-08-18 10:31:40 +08:00
has_many :forge_messages , :class_name = > 'ForgeMessage' , :as = > :forge_message , :dependent = > :destroy
2016-12-22 10:01:37 +08:00
has_many :contest_messages , :class_name = > 'ContestMessage' , :as = > :contest_message , :dependent = > :destroy
2015-08-14 10:19:59 +08:00
#end
2015-04-07 13:47:39 +08:00
2016-09-23 16:44:49 +08:00
has_many :praise_tread , as : :praise_tread_object , dependent : :destroy
has_one :praise_tread_cache , as : :object , dependent : :destroy
2016-02-25 16:22:42 +08:00
#转发表
has_many :forwards , :as = > :from , :dependent = > :destroy
2015-07-03 15:03:53 +08:00
has_many :ActivityNotifies , :as = > :activity , :dependent = > :destroy
2015-04-07 13:47:39 +08:00
validates_presence_of :title , :description
validates_length_of :title , :maximum = > 60
validates_length_of :summary , :maximum = > 255
2015-12-21 14:00:09 +08:00
# validates_length_of :description, :maximum => 10000
2015-04-07 13:47:39 +08:00
acts_as_attachable :delete_permission = > :manage_news
acts_as_searchable :columns = > [ 'title' , 'summary' , " #{ table_name } .description " ] , :include = > :project
acts_as_event :url = > Proc . new { | o | { :controller = > 'news' , :action = > 'show' , :id = > o . id } }
acts_as_activity_provider :find_options = > { :include = > [ :project , :author ] } ,
:author_key = > :author_id
#added by nwb
#课程新闻独立于项目
acts_as_activity_provider :type = > 'course_news' ,
:find_options = > { :include = > [ :course , :author ] } ,
:author_key = > :author_id
acts_as_watchable
2016-12-28 11:30:31 +08:00
after_create :act_as_course_activity , :add_author_as_watcher , :add_news_count , :act_as_student_score , :delay_news_wechat_send , :delay_news_send , :act_as_contest_message
2016-01-12 15:53:15 +08:00
after_update :update_activity
2016-03-08 17:38:38 +08:00
after_destroy :delete_kindeditor_assets , :decrease_news_count , :delete_org_activities , :down_course_score
2015-04-07 13:47:39 +08:00
scope :visible , lambda { | * args |
includes ( :project ) . where ( Project . allowed_to_condition ( args . shift || User . current , :view_news , * args ) )
}
scope :course_visible , lambda { | * args |
includes ( :course ) . where ( Course . allowed_to_condition ( args . shift || User . current , :view_course_news , * args ) )
}
2016-12-23 17:00:11 +08:00
scope :contest_visible , lambda { | * args |
includes ( :contest ) . where ( Contest . allowed_to_condition ( args . shift || User . current , :view_contest_news , * args ) )
}
2015-11-12 16:52:42 +08:00
safe_attributes 'title' , 'summary' , 'description' , 'sticky'
2015-04-07 13:47:39 +08:00
2016-01-12 15:53:15 +08:00
#动态的更新
def update_activity
update_course_activity ( self . class , self . id )
update_user_activity ( self . class , self . id )
update_org_activity ( self . class , self . id )
update_forge_activity ( self . class , self . id )
end
2015-04-07 13:47:39 +08:00
def visible? ( user = User . current )
! user . nil? && user . allowed_to? ( :view_news , project )
end
# Returns true if the news can be commented by user
def commentable? ( user = User . current )
user . allowed_to? ( :comment_news , project )
end
def recipients
project . users . select { | user | user . notify_about? ( self ) } . map ( & :mail )
end
# returns latest news for projects visible by user
def self . latest ( user = User . current , count = 5 )
visible ( user ) . includes ( [ :author , :project ] ) . order ( " #{ News . table_name } .created_on DESC " ) . limit ( count ) . all
end
# 新闻的短描述信息
def short_description ( length = 255 )
description . gsub ( / < \/ ?.*?> / , " " ) . html_safe if description
#description.gsub(/^(.{#{length}}[^\n\r]*).*$/m, '\1...').strip if description
#description
end
2015-07-03 15:03:53 +08:00
def set_notify_id ( notify_id )
@notify_id = notify_id
end
def get_notify_id ( )
return @notify_id
end
def set_notify_is_read ( notify_is_read )
@notify_is_read = notify_is_read
end
def get_notify_is_read ( )
return @notify_is_read
end
2015-04-07 13:47:39 +08:00
private
2016-01-13 10:08:48 +08:00
def add_news_count
2016-01-14 14:32:19 +08:00
if self . project && ! self . project . project_score . nil?
count = self . project . project_score . news_num + 1
self . project . project_score . update_attribute ( :news_num , count )
end
end
def decrease_news_count
if self . project && ! self . project . project_score . nil?
count = self . project . project_score . news_num - 1
2016-02-23 13:24:20 +08:00
self . project . project_score . update_attribute ( :news_num , count < 0 ? 0 : count )
2016-01-13 10:08:48 +08:00
end
end
2015-04-07 13:47:39 +08:00
def add_author_as_watcher
Watcher . create ( :watchable = > self , :user = > author )
end
2016-01-13 10:08:48 +08:00
2015-04-07 13:47:39 +08:00
# Time 2015-02-27 15:48:17
# Author lizanle
# Description 公用表中也要记录
def act_as_forge_activity
# 如果是project为空, 那么是课程相关的, 不需要保存
2015-09-06 11:22:27 +08:00
if self . project
2016-09-14 15:12:04 +08:00
self . forge_acts << ForgeActivity . new ( :user_id = > self . author_id , :project_id = > self . project . id )
2015-04-07 13:47:39 +08:00
end
end
2015-08-11 15:54:05 +08:00
#课程动态公共表记录
def act_as_course_activity
if self . course
self . course_acts << CourseActivity . new ( :user_id = > self . author_id , :course_id = > self . course_id )
2016-12-23 19:35:02 +08:00
elsif self . contest
self . contest_acts << ContestActivity . new ( :user_id = > self . author_id , :contest_id = > self . contest_id )
2015-08-11 15:54:05 +08:00
end
end
2016-05-23 15:03:22 +08:00
# 课程/项目通知 消息发送
# 消息发送原则:除了消息的发布者,课程的其它成员都能收到消息提醒
2015-08-18 10:31:40 +08:00
def act_as_system_message
2015-08-14 10:19:59 +08:00
if self . course
2016-10-26 13:41:58 +08:00
# self.course.members.each do |m|
# if m.user_id != self.author_id
# #self.course_messages << CourseMessage.new(:user_id => m.user_id, :course_id => self.course_id, :viewed => false)
# count = ShieldWechatMessage.where("container_type='User' and container_id=#{m.user_id} and shield_type='Course' and shield_id=#{self.course_id}").count
# if count == 0
# ws = WechatService.new
# content = self.title
# ws.class_notice m.user_id, "course_notice", self.id, "#{l(:label_new_notice_template)}", self.course.name, self.author.show_name, format_time(self.created_on), content, "点击查看通知详情"
# end
# end
# end
2015-08-18 10:31:40 +08:00
else
if ! self . project . nil?
self . project . members . each do | m |
if m . user_id != self . author_id
self . forge_messages << ForgeMessage . new ( :user_id = > m . user_id , :project_id = > self . project_id , :viewed = > false )
end
end
end
2015-08-14 10:19:59 +08:00
end
end
2016-10-26 11:18:05 +08:00
def delay_news_wechat_send
if self . course
2016-10-26 14:44:44 +08:00
self . delay . news_wechat_message
2016-10-26 11:18:05 +08:00
end
end
def news_wechat_message
self . course . members . each do | m |
if m . user_id != self . author_id
#self.course_messages << CourseMessage.new(:user_id => m.user_id, :course_id => self.course_id, :viewed => false)
count = ShieldWechatMessage . where ( " container_type='User' and container_id= #{ m . user_id } and shield_type='Course' and shield_id= #{ self . course_id } " ) . count
if count == 0
ws = WechatService . new
content = self . title
ws . class_notice m . user_id , " course_notice " , self . id , " #{ l ( :label_new_notice_template ) } " , self . course . name , self . author . show_name , format_time ( self . created_on ) , content , " 点击查看通知详情 "
end
end
end
end
2016-12-28 11:30:31 +08:00
def act_as_contest_message
if self . contest_id
self . contest . contest_members . each do | m |
if m . user_id != self . author_id
self . contest_messages << ContestMessage . new ( :user_id = > m . user_id , :contest_id = > self . contest_id , :viewed = > false )
end
end
end
end
2016-05-27 15:25:27 +08:00
def delay_news_send
if self . course
2016-12-18 18:17:39 +08:00
vs = [ ]
self . course . members . each do | m |
if m . user_id != self . author_id
vs << { course_message_type : 'News' , course_message_id : self . id , :user_id = > m . user_id ,
:course_id = > self . course_id , :viewed = > false }
2016-12-27 21:40:14 +08:00
#delayed_job卡住的原因是一次执行的条数太多, 导致超时。
#现在把每次只执行不超过30条, 就不会超了。
2016-12-18 18:17:39 +08:00
if vs . size > = 30
self . delay . contain_news_message ( vs )
vs . clear
end
end
2016-05-23 16:04:06 +08:00
end
2016-12-18 18:17:39 +08:00
2016-12-18 18:25:14 +08:00
unless vs . empty?
self . delay . contain_news_message ( vs )
end
2016-12-23 20:19:17 +08:00
elsif self . contest_id
vs = [ ]
self . contest . contest_members . each do | m |
if m . user_id != self . author_id
2016-12-28 11:30:31 +08:00
vs << { contest_message_type : 'Contest' , contest_message_id : self . id , :user_id = > m . user_id ,
2016-12-23 20:19:17 +08:00
:contest_id = > self . contest_id , :viewed = > false }
if vs . size > = 30
self . delay . contain_contst_news_message ( vs )
vs . clear
end
end
end
unless vs . empty?
self . delay . contain_contst_news_message ( vs )
end
2016-05-23 16:04:06 +08:00
end
2016-05-23 15:03:22 +08:00
end
2016-12-18 18:17:39 +08:00
def contain_news_message ( vs )
CourseMessage . create ( vs )
end
2016-12-23 20:19:17 +08:00
def contain_contst_news_message ( vs )
ContestMessage . create ( vs )
end
2015-04-07 13:47:39 +08:00
# Time 2015-03-31 13:50:54
# Author lizanle
# Description 删除news后删除对应的资源
def delete_kindeditor_assets
delete_kindeditor_assets_from_disk self . id , OwnerTypeHelper :: NEWS
end
def send_mail
2016-12-23 14:29:48 +08:00
# Mailer.run.news_added(self) if Setting.notified_events.include?('news_added')
2015-04-07 13:47:39 +08:00
end
2016-01-20 17:23:02 +08:00
def delete_org_activities
OrgActivity . where ( " container_type='OrgSubfield' and org_act_type='News' and org_act_id=? " , self . id ) . destroy_all
end
2016-03-08 17:38:38 +08:00
# 新增新闻统计数增加
2016-03-05 04:01:10 +08:00
def act_as_student_score
if self . course
course_member_score ( self . course . id , self . author_id , " News " )
end
end
2016-03-08 17:38:38 +08:00
# 删除新闻统计数减少
def down_course_score
if self . course
down_course_score_num ( self . course . id , self . author_id , " News " )
end
end
2015-08-14 10:19:59 +08:00
end