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"]