fix feed error
This commit is contained in:
1 parent
c5f95c9968
commit
234ed6cfea
10 files changed
+232
-172
No files matched your search
@@ -81,6 +81,7 @@ class Bulletin
|
||||
scope :open_in_future, ->{where(:is_hidden.ne=>true,:is_preview.ne => true,:postdate.gt=>Time.now).order(postdate: :asc)}
|
||||
scope :can_display_and_sorted, ->{where(:is_hidden.ne=>true,:is_preview.ne => true).any_of({:postdate.lte=>Time.now, :deadline.gte=>Time.now},{:postdate.lte=>Time.now, :deadline=>nil},{:postdate=>nil}).order(is_top: :desc,postdate: :desc,id: :desc)}
|
||||
scope :is_approved, ->{where(:approved => true)}
|
||||
scope :is_approved_and_show, ->{where(:approved => true,:is_hidden.ne=>true,:is_preview.ne => true)}
|
||||
scope :filter_cats_and_tags, ->(cats,tags) {filter_by_widget_categories(cats,false).filter_by_tags(tags)}
|
||||
before_create :set_expire
|
||||
before_save :check_limit
|
||||
|
||||
+159
-1
@@ -7,6 +7,164 @@ class BulletinFeed
|
||||
field :tag_ids, type: Array, default: []
|
||||
field :category_ids, type: Array, default: []
|
||||
before_save do
|
||||
BulletinFeedCache.where(uid: self.uid).destroy
|
||||
BulletinFeedCache.where(uid: self.uid).each do |cache|
|
||||
cache.regenerate
|
||||
end
|
||||
end
|
||||
def self.create_feed_cache(bulletin=nil,bulletin_feed=nil)
|
||||
Thread.new do
|
||||
if !bulletin.nil?
|
||||
BulletinFeed.where(:tag_ids.in => Array(bulletin.tag_ids).collect{|v| v.to_s}).each do |bulletin_feed|
|
||||
uid = bulletin_feed.uid
|
||||
BulletinFeedCache.where(:uid => uid).each do |cache|
|
||||
cache.regenerate
|
||||
end
|
||||
end
|
||||
elsif !bulletin_feed.nil?
|
||||
uid = bulletin_feed.uid
|
||||
BulletinFeedCache.where(:uid => uid).each do |cache|
|
||||
cache.regenerate
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
def generate_one_cache_timeout(startdt: nil,enddt: nil,dt: nil, base_url: nil, timeout: nil)
|
||||
timeout = 100000 if timeout.nil?
|
||||
begin
|
||||
Timeout::timeout(timeout) {
|
||||
feed_cache = nil
|
||||
Thread.new do
|
||||
feed_cache = self.generate_one_cache(startdt: startdt,enddt: enddt,dt: dt,base_url: base_url)
|
||||
end
|
||||
(1..(timeout.to_i+1)).each do
|
||||
sleep(1)
|
||||
break if !feed_cache.nil?
|
||||
end
|
||||
feed_cache.content
|
||||
}
|
||||
rescue=> e
|
||||
puts [e,e.backtrace]
|
||||
""
|
||||
end
|
||||
end
|
||||
def generate_one_cache(startdt: nil,enddt: nil,dt: nil, base_url: nil)
|
||||
base_url = Site.first.root_url if base_url.nil?
|
||||
uid = self.uid
|
||||
bf = self
|
||||
if !bf.nil?
|
||||
tags = bf.tag_ids
|
||||
categories = bf.category_ids
|
||||
if !(categories.empty? && tags.empty?)
|
||||
anns_before_filter = Bulletin.any_of([{"title.en"=>{"$nin"=>["", nil]}},{"title.zh_tw"=>{"$nin"=>["", nil]}}]).is_approved_and_show
|
||||
if !dt.nil?
|
||||
dt = DateTime.parse(dt)
|
||||
dtt = dt + 1.day
|
||||
anns_before_filter = anns_before_filter.where(:postdate.gt => dt, :postdate.lt => dtt)
|
||||
elsif !startdt.blank? && enddt.blank?
|
||||
startdt = DateTime.parse(startdt)
|
||||
enddt = DateTime.now
|
||||
anns_before_filter = anns_before_filter.where(:postdate.gt => startdt, :postdate.lt => enddt)
|
||||
elsif !startdt.blank? && !enddt.blank?
|
||||
startdt = DateTime.parse(startdt)
|
||||
enddt = DateTime.parse(enddt) + 1.day
|
||||
anns_before_filter = anns_before_filter.where(:postdate.gt => startdt, :postdate.lt => enddt)
|
||||
end
|
||||
anns_before_filter = anns_before_filter.can_display_and_sorted
|
||||
if !tags.empty?
|
||||
anns_before_filter = anns_before_filter.filter_by_tags(tags)
|
||||
end
|
||||
if !categories.empty?
|
||||
anns_before_filter = anns_before_filter.filter_by_categories(categories)
|
||||
end
|
||||
announcements = anns_before_filter.can_display_and_sorted
|
||||
else
|
||||
announcements = []
|
||||
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
|
||||
|
||||
announcements.each do |anns|
|
||||
deadline = anns.deadline
|
||||
if !deadline.blank?
|
||||
if first_deadline.nil? || first_deadline>deadline
|
||||
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["bulletin_links"] = []
|
||||
a["bulletin_files"] = []
|
||||
a["bulletin_carousel_images"] = anns.bulletin_carousel_images.map{|image| {"src"=>"#{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.bulletin_links.each do |bl|
|
||||
b = {}
|
||||
b["url"] = bl.url
|
||||
b["title_translations"] = bl.title_translations
|
||||
a["bulletin_links"] << b
|
||||
end
|
||||
anns.bulletin_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["bulletin_files"] << b
|
||||
end
|
||||
all_anns << a
|
||||
end
|
||||
invalid_date = [first_postdate,first_deadline].compact.sort[0]
|
||||
anns = {
|
||||
"announcements" => all_anns,
|
||||
"tags" => tag_names,
|
||||
"categories" => category_titles
|
||||
}.to_json
|
||||
feed_cache = BulletinFeedCache.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
|
||||
@@ -4,5 +4,26 @@ class BulletinFeedCache
|
||||
|
||||
field :content, type: String, default: ''
|
||||
field :uid
|
||||
|
||||
field :start
|
||||
field :end
|
||||
field :date
|
||||
field :invalid_date, type: DateTime
|
||||
def self.regenerate_all
|
||||
caches = BulletinFeedCache.all.to_a
|
||||
caches.each do |cache|
|
||||
cache.regenerate
|
||||
end
|
||||
uids = BulletinFeed.all.pluck(:uid) - caches.collect(&:uid)
|
||||
BulletinFeed.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
|
||||
BulletinFeed.where(uid: uid).first.generate_one_cache(startdt: st,enddt: et,dt: dt) rescue nil
|
||||
self.destroy
|
||||
end
|
||||
end
|
||||
Reference in new issue
Block a user