class SiteFeedAnnc include Mongoid::Document include Mongoid::Timestamps UseSourceUrl = SiteFeedSetting.first.use_source_url rescue false field :top_list,type: Array,default: [] field :hot_list,type: Array,default: [] field :all_contents_for_feed field :channel_key field :feed_id field :feed_name field :category_title field :hidden_annc,type: Array,default: [] field :merge_with_category field :remote_site_url field :channel_title field :feeds_model field :feeds_model field :feeds_uid_field field :feeds_update_callback field :feeds_time_field, type: String, default: "postdate" field :feeds_finish_callback field :feeds_update_statuses_callback #I18n.available_locales.each do |locale| # index({ "all_contents_for_feed.#{locale}.is_hidden"=> -1, # "all_contents_for_feed.#{locale}.is_top"=> -1, # "all_contents_for_feed.#{locale}.#{self.feeds_time_field}"=> -1}, { unique: false, background: true, name: "cache_#{locale}" }) #end def get_annc(annc_uid) Array(self[:all_contents_for_feed][I18n.locale.to_s]).select{|v| v['id']==annc_uid}[0] rescue {} end before_save do unless @skip_callback 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 end def update_remote_site_url update_fields = ['source_url','source-site'] tmp_url = self.remote_site_url self.all_contents_for_feed_will_change! locales = Site.first.in_use_locales rescue I18n.available_locales locales.each do |l| anns = self[:all_contents_for_feed][l.to_s] if anns (0...anns.count).each do |i| a = anns[i] update_fields.each do |f| a[f] = tmp_url end a['statuses'] = [] if a[:is_top] a['statuses'] << { "status" => trans[locale]['top'], "status-class" => "status-top" } end if a[:is_hot] a['statuses'] << { "status" => trans[locale]['hot'], "status-class" => "status-hot" } end if !a["source-site-title"].blank? a['statuses'] << { "status" => "#{a["source-site-title"]}", "status-class" => "status-source" } end end end end self.save end def update_channel_title(update_url=false) #update_url=true will also fix remote_site_url in data update_fields = [] if update_url update_fields = ['source_url','source-site'] end tmp_url = self.remote_site_url self.all_contents_for_feed_will_change! locales = Site.first.in_use_locales rescue I18n.available_locales trans = {} locales.each do |locale| locale = locale.to_s trans[locale] = {} I18n.with_locale(locale) do trans[locale]['top'] = I18n.t(:top) trans[locale]['hot'] = I18n.t(:hot) trans[locale]['more_plus'] = I18n.t("feed.more") end end locales.each do |locale| source_site_title = (self[:channel_title][locale] rescue "") anns = self[:all_contents_for_feed][locale.to_s] if anns (0...anns.count).each do |i| a = anns[i] a["source-site-title"] = source_site_title update_fields.each do |f| a[f] = tmp_url end a['statuses'] = [] if a[:is_top] a['statuses'] << { "status" => trans[locale]['top'], "status-class" => "status-top" } end if a[:is_hot] a['statuses'] << { "status" => trans[locale]['hot'], "status-class" => "status-hot" } end if !a["source-site-title"].blank? a['statuses'] << { "status" => "#{a["source-site-title"]}", "status-class" => "status-source" } end end end end self.save end def process_tmp(a, locale=nil, trans=nil, site_root_url=nil) cat = self[:category_title] locale = I18n.locale.to_s if locale.nil? if trans.nil? trans = {} locales.each do |locale| locale = locale.to_s trans[locale] = {} I18n.with_locale(locale) do trans[locale]['top'] = I18n.t(:top) trans[locale]['hot'] = I18n.t(:hot) trans[locale]['more_plus'] = I18n.t("feed.more") end end end if site_root_url.nil? site_root_url = Site.first.root_url rescue "" end tmp = a.deep_dup tmp[:is_hidden] = self.hidden_annc.include?(tmp['id']) if self.channel_key == "announcement" 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" => trans[locale]['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" => trans[locale]['hot'], "status-class" => "status-hot" } end tmp["category"] = cat tmp["source_url"] = self.remote_site_url 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"] = (site_root_url.blank? || tmp["link_to_show"].blank?) ? '_blank' : (tmp["link_to_show"].include?(site_root_url) ? '_self' : '_blank') tmp["img_src"] = tmp["image"]["thumb"] || "/assets/announcement-default.jpg" tmp["img_src"] = "/assets/announcement-default.jpg" if tmp["img_src"] == "" tmp["img_description"] = tmp["image_description_translations"][locale] tmp["more"] = trans[locale]['more_plus'] tmp["view_count"] = "" else new_tmp = {} tmp.each do |key,value| key = key.to_s if key.include? "_translations" new_tmp[key] = value 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 new_tmp[key] = {} value.each do |sub_k,sub_v| if sub_k.include? "_translations" new_tmp[key][sub_k] = sub_v 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) 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" => trans[locale]['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" => trans[locale]['hot'], "status-class" => "status-hot" } end tmp["category"] = cat tmp["source_url"] = self.remote_site_url 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" } tmp["source-site-link"] = tmp["source-site"] tmp["source-site"] = "#{tmp["source-site-title"]}" tmp["target"] = "_self" tmp["more"] = trans[locale]['more_plus'] tmp["view_count"] = "" end feeds_time_field = self.feeds_time_field feeds_time_field = 'postdate' if feeds_time_field.nil? time_field_value = tmp[feeds_time_field] tmp[feeds_time_field] = (time_field_value.blank? ? nil : time_field_value.to_time rescue time_field_value) tmp[feeds_time_field] = time_field_value if tmp[feeds_time_field].nil? return tmp end def cache_annc(force_refresh=false,locales=nil,trans=nil) feed = SiteFeed.find(self.feed_id) anns = feed.get_annc(force_refresh) cat = self[:category_title] feeds_time_field = self.feeds_time_field if locales.nil? locales = Site.first.in_use_locales rescue I18n.available_locales end if trans.nil? trans = {} locales.each do |locale| locale = locale.to_s trans[locale] = {} I18n.with_locale(locale) do trans[locale]['top'] = I18n.t(:top) trans[locale]['hot'] = I18n.t(:hot) trans[locale]['more_plus'] = I18n.t("feed.more") end end end cache_data = {} site_root_url = Site.first.root_url rescue "" locales.each do |locale| locale = locale.to_s data_for_locale = anns.collect do |a| tmp = process_tmp(a, locale, trans, site_root_url) 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) locale = I18n.locale.to_s max_len = ((max_len.to_i < 0 rescue true) ? 0 : max_len.to_i) if max_len > 0 module_app = ModuleApp.where(:key=>channel_key).first feeds_time_field = module_app.feeds_time_field rescue nil if feeds_time_field.nil? feeds_time_field = 'postdate' end 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"}, {"$sort"=>{"data.is_hidden"=>-1,"data.is_top"=>-1,"data.#{feeds_time_field}"=>-1}}, {"$match"=>{"data.is_hidden"=>{"$ne"=>true}, "data.postdate"=>{"$lte"=>Time.now}, "data.title" => {"$gt"=>""} } } ] if max_len pipeline << {"$limit"=> max_len} end self.collection.aggregate(pipeline).collect do |data| tmp = data['data'] tmp['category'] = tmp['category'][locale] if @image_version != 'thumb' && !@image_version.nil? if @image_version == 'mobile' tmp["img_src"] = tmp["image"]["mobile"] else tmp["img_src"] = tmp["image"]["original"] end tmp["img_src"] = tmp["img_src"] || "/assets/announcement-default.jpg" end if tmp["link_to_show"].nil? if !is_widget tmp["link_to_show"] = UseSourceUrl && tmp["show_url"] ? "#{tmp["source_url"]}/#{locale}#{tmp["show_url"]}" : OrbitHelper.url_to_show(tmp["params"]) rescue '' else tmp["link_to_show"] = UseSourceUrl && tmp["show_url"] ? "#{tmp["source_url"]}/#{locale}#{tmp["show_url"]}" : OrbitHelper.widget_item_url(tmp["params"]) rescue '' end end tmp end else [] 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"]