Compare commits

...

2 Commits

Author SHA1 Message Date
邱博亞 fd4555a8d0 Add notify remote. 2024-09-16 19:39:12 +08:00
邱博亞 ab902a8c04 Fix feed. 2024-09-16 19:39:12 +08:00
10 changed files with 396 additions and 252 deletions

View File

@ -307,6 +307,9 @@ class Admin::EventNewsController < OrbitAdminController
event_news.save
build_email(event_news,I18n.locale)
Thread.new do
event_news.notify_feed("create")
end
redirect_to params['referer_url']
end
@ -393,6 +396,9 @@ class Admin::EventNewsController < OrbitAdminController
event_news.save
end
build_email(event_news,I18n.locale)
Thread.new do
event_news.notify_feed("update")
end
now_event_news_page = EventNews.where(:title.ne => "",:is_preview.in=>[false,nil])
.order_by(sort).map(&:id).map.with_index.select{|v,i| v==event_news.id}[0][1] rescue nil
now_event_news_page = now_event_news_page.nil? ? 0 : ((now_event_news_page+1).to_f/10).ceil
@ -401,12 +407,18 @@ class Admin::EventNewsController < OrbitAdminController
def destroy
@event_news.destroy
Thread.new do
@event_news.notify_feed("destroy")
end
redirect_to "/admin/event_news"
end
def delete
if params[:ids]
EventNews.any_in(:uid => params[:ids]).destroy_all
Thread.new do
EventNews.notify_feed_delete(params[:ids])
end
end
redirect_to "/admin/event_news"
end

View File

@ -1,10 +1,48 @@
require "rss"
class EventNewsFeedsController < ApplicationController
include Admin::EventNewsHelper
def feed_add_remote
if params[:url].present?
uid = params[:uid].to_s
event_news_feed = EventNewsFeed.where(uid: uid).first
if !(event_news_feed.remote_urls.include?(params[:url]))
event_news_feed.remote_urls << params[:url]
event_news_feed.save
end
end
render :json => {success: true}
end
def feed_remove_remote
if params[:url].present?
uid = params[:uid].to_s
event_news_feed = EventNewsFeed.where(uid: uid).first
if event_news_feed.remote_urls.delete(params[:url])
event_news_feed.save
end
end
render :json => {success: true}
end
def feed
uid = params[:uid].to_s
anns = get_event_news(uid)
render :json => anns.to_json
startdt = params[:start].blank? ? nil : params[:start]
enddt = params[:end].blank? ? nil : params[:end]
dt = params[:date].blank? ? nil : params[:date]
feed_cache = EventNewsFeedCache.where(uid: uid, start: startdt, end: enddt, date: dt)
feed_cache_old = feed_cache.all_of([{:invalid_date.ne=>nil},{:invalid_date.lte => Time.now}]).last
feed_cache.all_of([{:invalid_date.ne=>nil},{:invalid_date.lte => Time.now}]).destroy
count = feed_cache.count
if count > 1
feed_cache.limit(count-1).destroy
end
feed_cache = feed_cache.first
anns = ''
if feed_cache.nil?
anns = EventNewsFeed.where(uid: uid).first.generate_one_cache_timeout(startdt: startdt,enddt: enddt,dt: dt,base_url: request.base_url,timeout: 20)
anns = (feed_cache_old.content rescue "") if anns.nil?
else
anns = feed_cache.content
end
render :json => anns
end
def rssfeed
@ -14,6 +52,8 @@ class EventNewsFeedsController < ApplicationController
tags = @bf.tag_ids
if !tags.empty?
@event_news = EventNews.can_display_and_sorted.is_approved.filter_by_tags(tags)
else
@event_news = EventNews.can_display_and_sorted.is_approved
end
categories = @bf.category_ids
if !categories.empty?
@ -48,136 +88,6 @@ class EventNewsFeedsController < ApplicationController
render :json => {"feeds" => feeds}.to_json
end
private
def smart_convertor(text)
html_string = text
links = html_string.scan(/img.*?src="(.*?)"/i)
links = links + html_string.scan(/a.*?href="(.*?)"/i)
links.uniq!
links.each do |link|
l = link.first
new_link = nil
if l.starts_with?("/")
new_link = request.protocol + request.host_with_port + l
elsif l.starts_with?("..")
l1 = l.gsub("../","")
new_link = request.protocol + request.host_with_port + "/" + l1
end
html_string = html_string.gsub(l,new_link) if !new_link.nil?
end
return html_string
end
def get_event_news(uid)
bf = EventNewsFeed.find_by(:uid => uid) rescue nil
startdt = params[:start]
enddt = params[:end]
dt = params[:date]
if !bf.nil?
tags = bf.tag_ids
categories = bf.category_ids
if !(categories.empty? && tags.empty?)
if !dt.nil?
dt = DateTime.parse(dt)
dtt = dt + 1.day
event_news = EventNews.where(:postdate.gt => dt, :postdate.lt => dtt).can_display_and_sorted.is_approved
elsif !startdt.nil? && enddt.nil?
startdt = DateTime.parse(startdt)
enddt = DateTime.now
event_news = EventNews.where(:postdate.gt => startdt, :postdate.lt => enddt).can_display_and_sorted.is_approved
elsif !startdt.nil? && !enddt.nil?
startdt = DateTime.parse(startdt)
enddt = DateTime.parse(enddt) + 1.day
event_news = EventNews.where(:postdate.gt => startdt, :postdate.lt => enddt).can_display_and_sorted.is_approved
else
event_news = EventNews.all.can_display_and_sorted.is_approved
end
if !tags.empty?
event_news = event_news.filter_by_tags(tags)
end
if !categories.empty?
event_news = event_news.filter_by_categories(categories)
end
else
event_news = []
end
end
all_anns = []
tag_names = []
category_titles = []
tag_ids = []
category_ids = []
event_news.each do |anns|
user = User.find(anns.create_user_id) rescue nil
if !user.nil?
author = user.member_profile && user.member_profile.name == "" ? user.user_name : user.member_profile.name
else
author = ""
end
a = {}
a["id"] = anns.uid
translations_fields = ["title","subtitle","speaker","place","host","notes"]
translations_fields.each do |translations_field|
a[translations_field+"_translations"] = anns.send(translations_field+"_translations") rescue {}
end
a["text_translations"] = {}
a["text_translations"]["en"] = smart_convertor(anns.text_translations["en"]) if !anns.text_translations["en"].blank?
a["text_translations"]["zh_tw"] = smart_convertor(anns.text_translations["zh_tw"]) if !anns.text_translations["zh_tw"].blank?
a["event_date"] = anns.event_date
a["event_end_date"] = anns.event_end_date
a["postdate"] = anns.event_date#anns.postdate
a["image_description_translations"] = anns.image_description_translations
a["image"] = {}
a["image"]["original"] = ("#{request.base_url}" + anns.image.url rescue "")
a["image"]["thumb"] = ("#{request.base_url}" + anns.image.thumb.url rescue "")
a["image"]["mobile"] = ("#{request.base_url}" + anns.image.mobile.url rescue "")
a["img_src"] = a["image"]["thumb"] || "/assets/announcement-default.jpg"
a["tags"] = []
a["category"] = {}
a["author"] = author
a["params"] = anns.to_param
a["event_news_links"] = []
a["event_news_files"] = []
a["event_carousel_images"] = anns.event_carousel_images.map{|image| {"src"=>"#{request.base_url}" + image.file.url,"description"=>image.description.to_s,"description_text"=>image.description_text }}
anns.tags.each do |tag|
if !tag_ids.include?(tag.id.to_s)
tag_ids << tag.id.to_s
tag_names << {"name_translations" => tag.name_translations}
end
a["tags"] << {"name_translations" => tag.name_translations}
end
cat = anns.category
if (!category_ids.include?(cat.id.to_s) rescue false)
category_ids << cat.id.to_s
category_titles << {"title_translations" => cat.title_translations}
end
a["category"] = {"title_translations" => (cat.title_translations rescue {})}
anns.event_news_links.each do |bl|
b = {}
b["url"] = bl.url
b["title_translations"] = bl.title_translations
b["link_url"] = b["url"]
b["link_title_translations"] = bl.title_translations.map{|k,v| [k,(v.blank? ? File.basename(b["url"]) : v rescue '')]}.to_h
a["event_news_links"] << b
end
anns.event_news_files.each do |bf|
b = {}
b["description_translations"] = bf.description_translations
b["title_translations"] = bf.title_translations
b["url"] = ("#{request.base_url}" + bf.file.url rescue "")
b["file_url"] = b["url"]
b["file_title_translations"] = bf.title_translations.map{|k,v| [k,(v.blank? ? File.basename(b["url"]) : v rescue '')]}.to_h
a["event_news_files"] << b
end
all_anns << a
end
{
"event_news" => all_anns,
"tags" => tag_names,
"categories" => category_titles
}
end
end

View File

@ -709,14 +709,14 @@ class EventNewsModsController < ApplicationController
}
}
files = event_news["event_news_files"].map{|file| { "file_url" => file["url"], "file_title" => (file["title_translations"][locale] == "" ? URI.unescape(File.basename(file["url"])) : file["title_translations"][locale] rescue '') } } rescue []
files = event_news["event_news_files"].map{|file| { "file_url" => file["file_url"], "file_title" => file["file_title_translations"][locale] } } rescue []
files.each do |file|
if file["file_url"] =="" || file["file_url"] == nil
files.delete(file)
end
end
links = event_news["event_news_links"].map{|link| { "link_url" => link["url"], "link_title" => (link["title_translations"][locale] == "" ? link["url"] : link["title_translations"][locale]) } } rescue []
links = event_news["event_news_links"].map{|link| { "link_url" => link["link_url"], "link_title" => link["link_title_translations"][locale] } } rescue []
update_user = event_news["author"]
desc = event_news["image_description_translations"][locale] rescue ""
@ -733,18 +733,29 @@ class EventNewsModsController < ApplicationController
meta_desc = ""
end
OrbitHelper.render_meta_tags([{"property" => "og:title", "content" => event_news["title_translations"][locale]},{"property" => "og:site_name", "content" => Site.first.title},{"property" => "og:url", "content" => request.original_url.split("?").first},{"property" => "og:description", "content" => meta_desc},{"property" => "og:image", "content" => event_news["image"]["original"]},{"property" => "og:type", "content" => "Article"}])
metas = [{"property" => "og:title", "content" => event_news["title_translations"][locale]},{"property" => "og:site_name", "content" => Site.first.title},{"property" => "og:url", "content" => request.original_url.split("?").first},{"property" => "og:description", "content" => meta_desc},{"property" => "og:type", "content" => "Article"}]
if event_news["image"]["original"].present?
image = event_news["image"]
metas << {"property" => "og:image", "content" => image["original"]}
if image["width"]
metas << {"property" => "og:image:width", "content" => image["width"].to_s}
end
if image["height"]
metas << {"property" => "og:image:height", "content" => image["height"].to_s}
end
end
OrbitHelper.render_meta_tags(metas)
event_date = DateTime.parse(event_news["event_date"].to_s) rescue nil
event_end_date = DateTime.parse(event_news["event_end_date"].to_s) rescue nil
event_time = EventNewsSetting.event_time_formated_for_frontend(event_news["event_date"],event_news["event_end_date"])
event_time = EventNewsSetting.event_time_formated_for_frontend(event_date, event_end_date)
event_carousel_images = Array(event_news["event_carousel_images"])
resume_btn_title = (I18n.locale.to_s =="zh_tw") ? "繼續播放" : "resume"
pause_btn_title = (I18n.locale.to_s =="zh_tw") ? "暫停播放" : "pause"
prev_btn_title = (I18n.locale.to_s =="zh_tw") ? "上一張" : "prev"
next_btn_title = (I18n.locale.to_s =="zh_tw") ? "下一張" : "next"
speaker = event_news["speaker_translations"][locale] rescue ""
host = event_news["host_translations"][locale] rescue ""
speaker = event_news["speaker_translations"][locale]
host = event_news["host_translations"][locale]
{
"tags" => tags,
"event_news_files" => files,

View File

@ -75,8 +75,8 @@ module EventNewsHelper
"img_description" => desc
}
end
def get_feed_annc(type,site_source,locale,categories=nil)
ma_key = 'event_news'
def get_feed_annc(type,site_source,locale,categories=nil,max_len=nil)
ma_key = 'event_news_mod'
if categories.nil?
if type == "index"
categories = Array(OrbitHelper.page_categories)
@ -87,25 +87,13 @@ module EventNewsHelper
end
end
categories = ["all"] if categories.length==0
if categories.include?("all")
feeds = SiteFeedAnnc.where(:channel_key => ma_key)
else
feeds = SiteFeedAnnc.where(:channel_key => ma_key, :merge_with_category.in => categories)
end
if feeds.count > 0
temp_ids = []
data = feeds.collect do |feed|
feed.all_contents_for_feed(site_source,locale,type=='widget')
end.flatten.compact
else
data = []
end
data = SiteFeedAnnc.get_feed_cache(ma_key,categories,site_source,locale,type=='widget',max_len)
data
end
def get_feed_event_news(type,site_source=nil,categories=nil,max_len=nil)
locale = OrbitHelper.get_site_locale.to_s
if !(defined? SiteFeedAnnc).nil?
fans = get_feed_annc(type,site_source,locale,categories)
fans = get_feed_annc(type,site_source,locale,categories,max_len)
else
feed_anns = OrbitHelper.get_feed_for_module(type)
fans = []
@ -116,8 +104,8 @@ module EventNewsHelper
"status-class" => "status-source"
}
files = fa["event_news_files"].collect{|bf| { "file_url" => bf["url"], "file_title" => (fa["title_translations"][locale].blank? ? File.basename(fa["url"]) : fa["title_translations"][locale] rescue '') }} rescue []
links = fa["event_news_links"].map{|link| { "link_url" => link["url"], "link_title" => (link["title_translations"][locale].blank? ? link["url"] : link["title_translations"][locale]) } } rescue []
files = fa["event_news_files"].collect{|bf| { "file_url" => bf["file_url"], "file_title" => fa["file_title_translations"][locale] }} rescue []
links = fa["event_news_links"].map{|link| { "link_url" => link["link_url"], "link_title" => link["link_title_translations"][locale] } } rescue []
event_time_formated = a.event_time_formated
s = DateTime.parse(fa["event_date"]) rescue nil
e = DateTime.parse(fa["event_end_date"]) rescue nil

View File

@ -10,14 +10,32 @@ class EventNews
include Slug
require 'event_news_model/cache'
include EventNewsModel::Cache
attr_accessor :org_tag_ids
attr_accessor :org_tag_ids, :org_category_id
def tags=(ids)
self.org_tag_ids = self.tag_ids
super(ids)
end
def category=(cat)
self.org_category_id = self.category_id
super(cat)
end
def tag_ids=(ids)
self.org_tag_ids = self.tag_ids
super(ids)
end
def category_id=(cat_id)
self.org_category_id = self.category_id
super(cat_id)
end
def tags=(ids)
self.org_tag_ids = self.tag_ids
super(ids)
end
def []=(index,value)
if index.to_s=='tags'
if index.to_s=='tags' || index.to_s=='tag_ids'
self.org_tag_ids = self.tag_ids
elsif index.to_s=='category' || index.to_s=='category_id'
self.org_category_id = self.category_id
end
super(index,value)
end
@ -379,4 +397,224 @@ class EventNews
:end => re.event_end_date}
end
end
def self.smart_convertor(text,url)
html_string = text
html_string = html_string.gsub(/img.*?src="(?=\/)(.*?)|a.*?href="(?=\/)(.*?)/i){|w| w+url}
html_string = html_string.gsub(/img.*?src="\.\.(?=\/)(.*?)|a.*?href="\.\.(?=\/)(.*?)/i){|w| w[0...-2]+url}
return html_string
end
def get_data(more_url=nil, base_url=nil, cat_ids=nil, tag_ids=nil, locale=nil)
locale = I18n.locale if locale.nil?
base_url = Site.first.root_url if base_url.nil?
user = User.find(self.create_user_id) rescue nil
if !user.nil?
author = user.member_name || user.user_name
else
author = ""
end
a = {}
if more_url.nil?
if cat_ids.nil?
cat_ids = [self.category_id]
end
if tag_ids.nil?
tag_ids = self.tag_ids
end
basic_query = {:module => 'event_news_mod',:enabled_for=>locale}
if !cat_ids.blank?
query = basic_query.merge({:categories.all => cat_ids})
else
query = basic_query.clone
end
if !tag_ids.blank?
query = query.merge({:tags.all => tag_ids})
end
page = Page.where(query).first || Page.where(basic_query).first
more_url = page ? page.get_url : nil
end
if more_url
a['show_url'] = "#{more_url}/#{self.to_param}"
end
a["org_is_top"] = (self.is_top ? 1 : 0)
a["id"] = self.uid
a["title_translations"] = self.title_translations
a["subtitle_translations"] = self.subtitle_translations
a["speaker_translations"] = self.speaker_translations
a["host_translations"] = self.host_translations
a["place_translations"] = self.place_translations
a["notes_translations"] = self.notes_translations
a["text_translations"] = {}
text_translations = self.text_translations
self.text_translations.each do |l, text|
a["text_translations"][l] = self.class.smart_convertor(text,base_url)
end
a["event_date"] = self.event_date
a["event_end_date"] = self.event_end_date
a["postdate"] = self.postdate
a["img_description_translations"] = self.image_description_translations
a["image"] = {}
a["display_img"] = self.display_img
if self.image.present?
a["image"]["original"] = base_url + self.image.url
a["image"]["thumb"] = base_url + self.image.thumb.url
a["image"]["mobile"] = base_url + self.image.mobile.url
a["img_src"] = a["image"]["thumb"] || "/assets/event_news-default.jpg"
image = MiniMagick::Image.open(self.image.path) rescue nil
if image
a["image"]["width"] = image[:width]
a["image"]["height"] = image[:height]
end
end
a["tags"] = []
a["category"] = {}
a["author"] = author
a["params"] = self.to_param
a["subtitle_ann"] = self.subtitle if self.display_subtitle?
a["event_news_links"] = []
a["event_news_files"] = []
a["event_carousel_images"] = self.event_carousel_images.map{|image| {"src"=> base_url + image.file.url,"description"=>image.description.to_s,"description_text"=>image.description_text }}
a["external_link"] = self["is_external_link"] ? self.external_link : nil
self.tags.each do |tag|
a["tags"] << {"name_translations" => tag.name_translations}
end
cat = self.category
a["category"] = cat ? {"title_translations" => cat.title_translations} : {"title_translations" => {}}
self.event_news_links.each do |bl|
b = {}
b["link_url"] = bl.url
b["link_title_translations"] = bl.title_translations.map{|k,v| [k, (v.blank? ? b["url"] : v)]}.to_h
a["event_news_links"] << b
end
self.event_news_files.each do |bf|
next if bf.file.blank?
b = {}
b["description_translations"] = bf.description_translations
b["file_url"] = base_url + bf.file.url
b["file_title_translations"] = bf.title_translations.map{|k,v| [k, (v.blank? ? File.basename(b["url"]) : v)]}.to_h
a["event_news_files"] << b
end
return a
end
def get_related_feeds
@category_id ||= self.category_id
@tag_ids ||= self.tag_ids
related_feeds = EventNewsFeed.any_of({:category_ids=>@category_id.to_s}, {:tag_ids.in=>@tag_ids.map(&:to_s)}).to_a
end
def notify_feed(type="create")
if @is_hidden_changed
if self.is_hidden
if type == 'create'
return []
else
type = 'destroy'
end
else
type = 'create'
end
elsif self.is_hidden
return []
end
related_feeds = self.get_related_feeds.select{|feed| feed.remote_urls.count != 0}
if related_feeds.count != 0
bulletin_data = self.get_data
if type == "destroy"
tmp_data = {'type'=>'destroy', 'data'=>[self.uid]}
else
tmp_data = {'type'=>type, 'data'=>[bulletin_data.to_json]}
end
request = Net::HTTP::Post.new('/xhr/feeds/notify_change', 'Content-Type' => 'application/json')
related_feeds.each do |feed|
tmp_data['uid'] = feed.uid
request.body = tmp_data.to_json
feed.remote_urls.each do |remote_url|
uri = URI(remote_url)
http_req = Net::HTTP.new(uri.host, uri.port)
if remote_url.include?('https')
http_req.use_ssl = true
end
response = self.class.http_request( http_req , request )
end
end
end
end
def self.notify_all_feed(force_update=false)
related_feeds = EventNewsFeed.where(:remote_urls.nin=>[nil, []]).to_a
related_feeds.each do |feed|
uid = feed.uid
startdt = nil
enddt = nil
dt = nil
feed_cache = EventNewsFeedCache.where(uid: uid, start: startdt, end: enddt, date: dt)
if force_update
feed_cache = nil
else
feed_cache_old = feed_cache.all_of([{:invalid_date.ne=>nil},{:invalid_date.lte => Time.now}]).last
feed_cache.all_of([{:invalid_date.ne=>nil},{:invalid_date.lte => Time.now}]).destroy
count = feed_cache.count
if count > 1
feed_cache.limit(count-1).destroy
end
feed_cache = feed_cache.first
anns = ''
end
if feed_cache.nil?
anns = feed.generate_one_cache_timeout(startdt: startdt,enddt: enddt,dt: dt,timeout: 20)
anns = (feed_cache_old.content rescue "") if anns.nil?
else
anns = feed_cache.content
end
request = Net::HTTP::Post.new('/xhr/feeds/notify_change', 'Content-Type' => 'application/json')
tmp_data = {'type'=>'update_all', 'uid'=> uid, 'data'=>anns}
request.body = tmp_data.to_json
feed.remote_urls.each do |remote_url|
uri = URI(remote_url)
http_req = Net::HTTP.new(uri.host, uri.port)
if remote_url.include?('https')
http_req.use_ssl = true
end
response = self.http_request( http_req , request )
end
end
end
def self.notify_feed_delete(ids)
all_feeds = EventNewsFeed.all.select{|feed| feed.remote_urls.count != 0}
if all_feeds.count != 0
tmp_data = {'type'=>'destroy'}
request = Net::HTTP::Post.new('/xhr/feeds/notify_change', 'Content-Type' => 'application/json')
all_feeds.each do |feed|
feed_uid = feed.uid
feed_cache = EventNewsFeedCache.where(:uid=>feed_uid).first
if feed_cache
tmp_data['uid'] = feed_uid
tmp_data['data'] = ids & JSON.parse(feed_cache.content)["announcements"].map{|a| a["id"]}
request.body = tmp_data.to_json
if tmp_data['data'].count != 0
feed.remote_urls.each do |remote_url|
uri = URI(remote_url)
http_req = Net::HTTP.new(uri.host, uri.port)
if remote_url.include?('https')
http_req.use_ssl = true
end
response = self.http_request( http_req , request )
end
end
end
end
end
end
def self.http_request(http, request)
response = http.request(request)
if response.code.to_i == 301 || response.code.to_i == 302
location = response["location"]
new_uri = URI(location)
http = Net::HTTP.new(new_uri.host, new_uri.port)
if location.include?('https')
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
end
request.instance_variable_set(:@path, new_uri.path)
response = self.http_request(http, request)
end
response
end
end

View File

@ -6,8 +6,9 @@ class EventNewsFeed
field :title, as: :slug_title, type: String, localize: true
field :tag_ids, type: Array, default: []
field :category_ids, type: Array, default: []
field :remote_urls, type: Array, default: []
before_save do
EventNewsCache.where(uid: self.uid).each do |cache|
EventNewsFeedCache.where(uid: self.uid).each do |cache|
cache.regenerate
end
end
@ -16,13 +17,13 @@ class EventNewsFeed
if !event_news.nil?
self.where(:tag_ids.in => Array(event_news.tag_ids).collect{|v| v.to_s}).each do |event_news_feed|
uid = event_news_feed.uid
EventNewsCache.where(:uid => uid).each do |cache|
EventNewsFeedCache.where(:uid => uid).each do |cache|
cache.regenerate
end
end
elsif !event_news_feed.nil?
uid = event_news_feed.uid
EventNewsCache.where(:uid => uid).each do |cache|
EventNewsFeedCache.where(:uid => uid).each do |cache|
cache.regenerate
end
end
@ -82,13 +83,24 @@ class EventNewsFeed
end
end
all_anns = []
tag_names = []
category_titles = []
tag_ids = []
category_ids = []
first_postdate = anns_before_filter.open_in_future.limit(1).pluck(:postdate)[0]
first_deadline = nil
cat_ids = announcements.collect{|a| a.category_id.blank? ? nil : a.category_id.to_s}.compact.uniq
tag_ids = announcements.collect{|a| a.tag_ids.collect{|v| v.blank? ? nil : v.to_s}}.flatten.compact.uniq
tag_names = tag_ids.map{|tag_id| Tag.find(tag_id).name_translations rescue nil}.compact
category_titles = cat_ids.map{|cat_id| Category.find(cat_id).title_translations rescue nil}.compact
basic_query = {:module => 'event_news_mod',:enabled_for=>I18n.locale}
if !cat_ids.blank?
query = basic_query.merge({:categories.all => cat_ids})
else
query = basic_query.clone
end
if !tag_ids.blank?
query = query.merge({:tags.all => tag_ids})
end
page = Page.where(query).first || Page.where(basic_query).first
more_url = page ? page.get_url : nil
announcements.each do |anns|
deadline = anns.deadline
@ -97,75 +109,15 @@ class EventNewsFeed
first_deadline = deadline
end
end
user = User.find(anns.create_user_id) rescue nil
if !user.nil?
author = user.member_profile && user.member_profile.name == "" ? user.user_name : user.member_profile.name
else
author = ""
end
a = {}
a["id"] = anns.uid
a["title_translations"] = anns.title_translations
a["subtitle_translations"] = anns.subtitle_translations
a["text_translations"] = {}
a["text_translations"]["en"] = self.class.smart_convertor(anns.text_translations["en"],base_url) if !anns.text_translations["en"].blank?
a["text_translations"]["zh_tw"] = self.class.smart_convertor(anns.text_translations["zh_tw"],base_url) if !anns.text_translations["zh_tw"].blank?
a["postdate"] = anns.postdate
a["image_description_translations"] = anns.image_description_translations
a["image"] = {}
a["display_img"] = anns.display_img
a["image"]["original"] = ("#{base_url}" + anns.image.url rescue "")
a["image"]["thumb"] = ("#{base_url}" + anns.image.thumb.url rescue "")
a["image"]["mobile"] = ("#{base_url}" + anns.image.mobile.url rescue "")
a["tags"] = []
a["category"] = {}
a["author"] = author
a["params"] = anns.to_param
a["subtitle_ann"] = anns.subtitle if anns.display_subtitle?
a["event_news_links"] = []
a["event_news_files"] = []
a["event_carousel_images"] = anns.event_carousel_images.map{|image| {"src"=>"#{base_url}" + image.file.url,"description"=>image.description.to_s,"description_text"=>image.description_text }}
a["external_link"] = anns["is_external_link"] ? anns.external_link : nil
anns.tags.each do |tag|
if !tag_ids.include?(tag.id.to_s)
tag_ids << tag.id.to_s
tag_names << {"name_translations" => tag.name_translations}
end
a["tags"] << {"name_translations" => tag.name_translations}
end
cat = anns.category
if (!category_ids.include?(cat.id.to_s) rescue false)
category_ids << cat.id.to_s
category_titles << {"title_translations" => cat.title_translations}
end
a["category"] = {"title_translations" => (cat.title_translations rescue {})}
anns.event_news_links.each do |bl|
b = {}
b["url"] = bl.url
b["title_translations"] = bl.title_translations
a["event_news_links"] << b
end
anns.event_news_files.each do |bf|
b = {}
b["description_translations"] = bf.description_translations
b["title_translations"] = bf.title_translations
b["url"] = ("#{base_url}" + bf.file.url rescue "")
a["event_news_files"] << b
end
a = anns.get_data(more_url, base_url, cat_ids, tag_ids)
all_anns << a
end
invalid_date = [first_postdate,first_deadline].compact.sort[0]
anns = {
"announcements" => all_anns,
"event_news_mods" => all_anns,
"tags" => tag_names,
"categories" => category_titles
}.to_json
feed_cache = EventNewsFeedCache.create(uid: uid,content: anns,start: startdt,end: enddt,date: dt,invalid_date: invalid_date)
end
def self.smart_convertor(text,url)
html_string = text
html_string = html_string.gsub(/img.*?src="(?=\/)(.*?)|a.*?href="(?=\/)(.*?)/i){|w| w+url}
html_string = html_string.gsub(/img.*?src="\.\.(?=\/)(.*?)|a.*?href="\.\.(?=\/)(.*?)/i){|w| w[0...-2]+url}
return html_string
end
end

View File

@ -1,29 +1,34 @@
class EventNewsFeedCache
include Mongoid::Document
include Mongoid::Timestamps
include Mongoid::Document
include Mongoid::Timestamps
field :content, type: String, default: ''
field :uid
field :start
field :end
field :date
field :invalid_date, type: DateTime
def self.regenerate_all
caches = self.all.to_a
caches.each do |cache|
cache.regenerate
end
uids = EventNewsFeed.all.pluck(:uid) - caches.collect(&:uid)
EventNewsFeed.where(:uid.in=> uids).each do |feed|
feed.generate_one_cache()
end
end
def regenerate
st = self.start
et = self.end
dt = self.date
uid = self.uid
EventNewsFeed.where(uid: uid).first.generate_one_cache(startdt: st,enddt: et,dt: dt) rescue nil
self.destroy
end
field :invalid_date, type: DateTime
def self.regenerate_all
caches = self.all.to_a
time_now = Time.now
caches.each do |cache|
if cache.invalid_date && cache.invalid_date <= time_now
cache.destroy
else
cache.regenerate
end
end
uids = EventNewsFeed.all.pluck(:uid) - caches.collect(&:uid)
EventNewsFeed.where(:uid.in=> uids).each do |feed|
feed.generate_one_cache()
end
end
def regenerate
st = self.start
et = self.end
dt = self.date
uid = self.uid
EventNewsFeed.where(uid: uid).each{|v| v.generate_one_cache(startdt: st,enddt: et,dt: dt)} rescue nil
self.destroy
end
end

View File

@ -67,6 +67,21 @@ class EventNewsSetting
end
datetime_format
end
def get_weekday(w)
trans = EventNews::Week_day_trans
if trans.keys.include?(I18n.locale)
trans[I18n.locale][w]
else
trans[:en][w]
end
end
def custom_strftime(dt, datetime_format)
if dt
dt.strftime(datetime_format.sub("%a","%%a")).sub("%a",get_weekday(dt.wday))
else
""
end
end
def event_date_format
@event_date_format ||= self.event_date_default_format
end

View File

@ -43,6 +43,8 @@ Rails.application.routes.draw do
get ':slug_title-:uid', to: 'event_news_mods#show', as: :display
end
end
post "/xhr/event_news_mods/feed_add_remote/:uid" => "event_news_feeds#feed_add_remote"
post "/xhr/event_news_mods/feed_remove_remote/:uid" => "event_news_feeds#feed_remove_remote"
get '/xhr/event_news/agenda' => 'event_news_mods#agenda'
get "/xhr/event_news/feed/:uid" => "event_news_feeds#feed"
get "/xhr/event_news/rssfeed/:uid" => "event_news_feeds#rssfeed"

View File

@ -3,16 +3,27 @@ module EventNewsModel
require 'active_support/concern'
extend ActiveSupport::Concern
included do
before_save :do_before_save
after_save :cache_tag_ids, :do_before_save
after_destroy :do_before_save
before_destroy :cache_tag_ids
end
def cache_tag_ids
if self.class == ::EventNews
@tag_ids = self.tag_ids
@org_tag_ids = self.org_tag_ids
@category_id = self.category_id
@org_category_id = self.org_category_id
end
end
def do_before_save
if self.class == SubPart
::EventNewsCache.where(parent_id:self.id).destroy
elsif self.class == ::EventNews || (self.class == Page && self.module == "event_news")
elsif self.class == ::EventNews || (self.class == Page && self.module == "event_news_mod")
if self.class == ::EventNews
tmp_tag_ids = (Array(self.tag_ids) + Array(self.org_tag_ids)).uniq
tmp_tag_ids = (Array(@tag_ids) + Array(@org_tag_ids)).uniq
tmp_cat_ids = (Array(@category_id) + Array(@org_category_id)).uniq
Thread.new do
::EventNewsCache.where(:uid.in => ::EventNewsFeed.where(:tag_ids.in => tmp_tag_ids.collect{|v| v.to_s}).pluck(:uid)).each do |cache|
::EventNewsFeedCache.where(:uid.in => ::EventNewsFeed.any_of([{:tag_ids.in => tmp_tag_ids.collect{|v| v.to_s}},{:category_ids.in => tmp_cat_ids.collect{|v| v.to_s}}]).pluck(:uid)).to_a.each do |cache|
cache.regenerate
end
end