diff --git a/app/models/site_feed_annc.rb b/app/models/site_feed_annc.rb
index d2069ae..b3e93c0 100644
--- a/app/models/site_feed_annc.rb
+++ b/app/models/site_feed_annc.rb
@@ -15,131 +15,181 @@ class SiteFeedAnnc
def get_annc(annc_uid)
Array(self[:all_contents_for_feed]).select{|v| v['id']==annc_uid}[0] rescue {}
end
- def all_contents_for_feed(site_source=nil,locale=I18n.locale.to_s,is_widget=false)
+ before_save do
+ if self.top_list_changed? || self.hot_list_changed? || self.hidden_annc_changed? || self.category_title_changed?
+ self[:all_contents_for_feed] = self.cache_annc
+ end
+ end
+ def cache_annc(force_refresh=false)
+ feed = SiteFeed.find(self.feed_id)
+ anns = feed.get_annc(force_refresh)
cat = self.category_title
- Array(self[:all_contents_for_feed]).collect do |v|
- tmp = v
- if hidden_annc.exclude?(v['id']) && !tmp["title_translations"][locale].blank?
- if self.channel_key == "announcement"
- if (!tmp["postdate"].blank? && tmp["postdate"].to_time>Time.now)
- next
- end
- tmp['statuses'] = []
- if self[:top_list].count == 0 || self[:top_list].exclude?(tmp['id'])
- tmp[:is_top] = false
+ locales = Site.first.in_use_locales rescue I18n.available_locales
+ cache_data = {}
+ locales.each do |locale|
+ locale = locale.to_s
+ data_for_locale = I18n.with_locale(locale) do
+ anns.collect do |a|
+ tmp = a.deep_dup
+ tmp[:is_hidden] = self.hidden_annc.include?(tmp['id'])
+ if self.channel_key == "announcement"
+ tmp["postdate"] = tmp["postdate"].blank? ? nil : tmp["postdate"].to_time
+ tmp['statuses'] = []
+ if self[:top_list].count == 0 || self[:top_list].exclude?(tmp['id'])
+ tmp[:is_top] = false
+ else
+ tmp[:is_top] = true
+ tmp['statuses'] << {
+ "status" => I18n.t(:top),
+ "status-class" => "status-top"
+ }
+ end
+ if self[:hot_list].count == 0 || self[:top_list].exclude?(tmp['id'])
+ tmp[:is_hot] = false
+ else
+ tmp[:is_hot] = true
+ tmp['statuses'] << {
+ "status" => I18n.t(:hot),
+ "status-class" => "status-hot"
+ }
+ end
+ tmp["category"] = cat
+ tmp["source-site"] = self.remote_site_url
+ tmp["source-site-title"] = (self[:channel_title][locale] rescue "")
+ tmp["params"] = tmp["params"].to_s + "_" + self.feed_id.to_s + "h"
+ if !tmp["source-site-title"].blank?
+ tmp['statuses'] << {
+ "status" => "#{tmp["source-site-title"]}",
+ "status-class" => "status-source"
+ }
+ end
+
+ files = tmp["bulletin_files"].collect{|bf| { "file_url" => bf["url"], "file_title" => (bf["title_translations"][locale].blank? ? File.basename(bf["url"]) : bf["title_translations"][locale] rescue '') }} rescue []
+ links = tmp["bulletin_links"].map{|link| { "link_url" => link["url"], "link_title" => (link["title_translations"][locale].blank? ? link["url"] : link["title_translations"][locale]) } } rescue []
+ tmp["bulletin_links"] = links
+ tmp["bulletin_files"] = files
+ tmp["title"] = tmp["title_translations"][locale]
+ tmp["subtitle"] = tmp["subtitle_translations"][locale]
+ tmp["source-site-link"] = tmp["source-site"]
+ tmp["source-site"] = "#{tmp["source-site-title"]}"
+ tmp["link_to_show"] = !tmp["external_link"].blank? ? tmp["external_link"] : nil
+ tmp["target"] = "_self"
+ tmp["img_src"] = tmp["image"]["thumb"] || "/assets/announcement-default.jpg"
+ tmp["img_description"] = tmp["image_description_translations"][locale]
+ tmp["more"] = I18n.t(:more_plus)
+ tmp["view_count"] = ""
else
- tmp[:is_top] = true
- tmp['statuses'] << {
- "status" => I18n.t(:top),
- "status-class" => "status-top"
- }
- end
- if self[:hot_list].count == 0 || self[:top_list].exclude?(tmp['id'])
- tmp[:is_hot] = false
- else
- tmp[:is_hot] = true
- tmp['statuses'] << {
- "status" => I18n.t(:hot),
- "status-class" => "status-hot"
- }
- end
- tmp["category"] = cat
- tmp["source-site"] = self.remote_site_url
- tmp["source-site-title"] = (self[:channel_title][locale] rescue "")
- tmp["params"] = tmp["params"].to_s + "_" + self.feed_id.to_s + "h"
- next if !site_source.nil? && site_source != tmp["source-site-title"]
- if !tmp["source-site-title"].blank?
+ tmp['statuses'] = []
+ if self[:top_list].count == 0 || self[:top_list].exclude?(tmp['id'])
+ tmp[:is_top] = false
+ else
+ tmp[:is_top] = true
+ tmp['statuses'] << {
+ "status" => I18n.t(:top),
+ "status-class" => "status-top"
+ }
+ end
+ if self[:hot_list].count == 0 || self[:top_list].exclude?(tmp['id'])
+ tmp[:is_hot] = false
+ else
+ tmp[:is_hot] = true
+ tmp['statuses'] << {
+ "status" => I18n.t(:hot),
+ "status-class" => "status-hot"
+ }
+ end
+ tmp["category"] = cat
+ tmp["source-site"] = self.remote_site_url
+ tmp["source-site-title"] = (self[:channel_title][locale] rescue "")
+ tmp["params"] = tmp["params"].to_s + "_" + self.feed_id.to_s + "h"
tmp['statuses'] << {
"status" => "#{tmp["source-site-title"]}",
"status-class" => "status-source"
}
- end
-
- files = tmp["bulletin_files"].collect{|bf| { "file_url" => bf["url"], "file_title" => (bf["title_translations"][locale].blank? ? File.basename(bf["url"]) : bf["title_translations"][locale] rescue '') }} rescue []
- links = tmp["bulletin_links"].map{|link| { "link_url" => link["url"], "link_title" => (link["title_translations"][locale].blank? ? link["url"] : link["title_translations"][locale]) } } rescue []
- tmp["bulletin_links"] = links
- tmp["bulletin_files"] = files
- tmp["title"] = tmp["title_translations"][locale]
- tmp["subtitle"] = tmp["subtitle_translations"][locale]
- tmp["source-site-link"] = tmp["source-site"]
- tmp["source-site"] = "#{tmp["source-site-title"]}"
- if !tmp["external_link"].blank?
- tmp["link_to_show"] = tmp["external_link"]
- else
- if !is_widget
- tmp["link_to_show"] = OrbitHelper.url_to_show(tmp["params"]) rescue ''
- else
- tmp["link_to_show"] = OrbitHelper.widget_item_url(tmp["params"]) rescue ''
- end
- end
- tmp["target"] = "_self"
- tmp["img_src"] = tmp["image"]["thumb"] || "/assets/announcement-default.jpg"
- tmp["img_description"] = tmp["image_description_translations"][locale]
- tmp["more"] = I18n.t(:more_plus)
- tmp["view_count"] = ""
- else
- tmp['statuses'] = []
- if self[:top_list].count == 0 || self[:top_list].exclude?(tmp['id'])
- tmp[:is_top] = false
- else
- tmp[:is_top] = true
- tmp['statuses'] << {
- "status" => I18n.t(:top),
- "status-class" => "status-top"
- }
- end
- if self[:hot_list].count == 0 || self[:top_list].exclude?(tmp['id'])
- tmp[:is_hot] = false
- else
- tmp[:is_hot] = true
- tmp['statuses'] << {
- "status" => I18n.t(:hot),
- "status-class" => "status-hot"
- }
- end
- tmp["category"] = cat
- tmp["source-site"] = self.remote_site_url
- tmp["source-site-title"] = (self[:channel_title][locale] rescue "")
- tmp["params"] = tmp["params"].to_s + "_" + self.feed_id.to_s + "h"
- next if !site_source.nil? && site_source != tmp["source-site-title"]
- tmp['statuses'] << {
- "status" => "#{tmp["source-site-title"]}",
- "status-class" => "status-source"
- }
- tmp["source-site-link"] = tmp["source-site"]
- tmp["source-site"] = "#{tmp["source-site-title"]}"
- if !is_widget
- tmp["link_to_show"] = OrbitHelper.url_to_show(tmp["params"]) rescue ''
- else
- tmp["link_to_show"] = OrbitHelper.widget_item_url(tmp["params"]) rescue ''
- end
- tmp["target"] = "_self"
- tmp["more"] = I18n.t(:more_plus)
- tmp["view_count"] = ""
- new_tmp = {}
- tmp.each do |key,value|
- if key.include? "_translations"
- new_tmp[key.sub("_translations","")] = value[locale].to_s rescue ""
- elsif key.include?("date") || key.include?("Date")
- new_tmp[key] = DateTime.parse(value) rescue nil
- else
- if value.class == Hash
- value.each do |sub_k,sub_v|
- if sub_k.include? "_translations"
- new_tmp[key][sub_k.sub("_translations","")] = sub_v[locale].to_s rescue ""
- else
- new_tmp[key][sub_k] = sub_v
- end
- end
+ tmp["source-site-link"] = tmp["source-site"]
+ tmp["source-site"] = "#{tmp["source-site-title"]}"
+ tmp["target"] = "_self"
+ tmp["more"] = I18n.t(:more_plus)
+ tmp["view_count"] = ""
+ new_tmp = {}
+ tmp.each do |key,value|
+ if key.include? "_translations"
+ new_tmp[key.sub("_translations","")] = value[locale].to_s rescue ""
+ elsif key.include?("date") || key.include?("Date")
+ new_tmp[key] = DateTime.parse(value) rescue nil
else
- new_tmp[key] = value
+ if value.class == Hash
+ value.each do |sub_k,sub_v|
+ if sub_k.include? "_translations"
+ new_tmp[key][sub_k.sub("_translations","")] = sub_v[locale].to_s rescue ""
+ else
+ new_tmp[key][sub_k] = sub_v
+ end
+ end
+ else
+ new_tmp[key] = value
+ end
end
end
+ tmp = BSON::Document.new(new_tmp)
end
- tmp = BSON::Document.new(new_tmp)
+ tmp
+ end
+ end
+ cache_data[locale.to_s] = data_for_locale
+ end
+ cache_data
+ end
+
+ def self.get_feed_cache(channel_key,merge_with_category=nil,site_source=nil,locale=I18n.locale.to_s,is_widget=false,max_len=nil)
+ match_cond = {"channel_key"=>channel_key}
+ if !merge_with_category.blank? && merge_with_category.exclude?('all')
+ match_cond["merge_with_category"] = {"$in"=>merge_with_category}
+ end
+ if site_source
+ match_cond["channel_title.#{locale}"] = site_source
+ end
+ pipeline = [
+ {"$match"=>match_cond},
+ {"$project"=>{"data"=>"$all_contents_for_feed.#{locale}"}},
+ {"$unwind"=>"$data"},
+ {"$match"=>{"data.is_hidden"=>{"$ne"=>true},
+ "data.postdate"=>{"$lte"=>Time.now},
+ "data.title" => {"$gt"=>""}
+ }
+ },
+ {"$sort"=>{"data.is_top"=>-1,"data.postdate"=>-1}}
+ ]
+ if max_len
+ pipeline << {"$limit"=> max_len}
+ end
+ self.collection.aggregate(pipeline).collect do |data|
+ tmp = data['data']
+ if tmp["link_to_show"].nil?
+ if !is_widget
+ tmp["link_to_show"] = OrbitHelper.url_to_show(tmp["params"]) rescue ''
+ else
+ tmp["link_to_show"] = OrbitHelper.widget_item_url(tmp["params"]) rescue ''
+ end
+ end
+ tmp
+ end
+ end
+
+ def all_contents_for_feed(site_source=nil,locale=I18n.locale.to_s,is_widget=false)
+ if !site_source.nil? && site_source != self[:channel_title][locale]
+ return []
+ end
+ time_now = Time.now
+ Array(self[:all_contents_for_feed][locale.to_s]).collect do |v|
+ tmp = v
+ next if tmp["is_hidden"] || (!tmp["postdate"].nil? && tmp["postdate"]