dashboard_controller.rb
上传用户:netsea168
上传日期:2022-07-22
资源大小:4652k
文件大小:3k
源码类别:

Ajax

开发平台:

Others

  1. class Admin::DashboardController < Admin::BaseController
  2.   require 'open-uri'
  3.   require 'time'
  4.   require 'rexml/document'
  5.   
  6.   def index
  7.     @newposts = Article.count(:all, :conditions => ['published = ? and published_at > ?', true, current_user.last_venue])
  8.     @newcomments = Feedback.count(:all, :conditions =>['state in (?,?) and published_at > ?', 'presumed_ham', 'ham', current_user.last_venue])
  9.     comments
  10.     lastposts
  11.     popular
  12.     statistics
  13.     inbound_links
  14.     typo_dev
  15.   end
  16.   
  17.   private
  18.   
  19.   def statistics
  20.     @statposts = Article.count_published_articles
  21.     @statuserposts = current_user.articles.size
  22.     @statcomments = Comment.count(:all, :conditions => "state != 'spam'")
  23.     @statspam = Comment.count(:all, :conditions => { :state => 'spam' })
  24.   end
  25.   
  26.   def comments
  27.     @comments ||=
  28.       Comment.find(:all,
  29.                    :limit => 5,
  30.                    :conditions => ['published = ?', true],
  31.                    :order => 'created_at DESC')
  32.   end
  33.   
  34.   def lastposts
  35.     @recent_posts = Article.find(:all, 
  36.                                  :conditions => ["published = ?", true], 
  37.                                  :order => 'published_at DESC', 
  38.                                  :limit => 5)
  39.   end
  40.   
  41.   def popular
  42.     @bestof = Article.find(:all,
  43.                            :select => 'contents.*, comment_counts.count AS comment_count',
  44.                            :from => "contents, (SELECT feedback.article_id AS article_id, COUNT(feedback.id) as count FROM feedback WHERE feedback.state IN ('presumed_ham', 'ham') GROUP BY feedback.article_id ORDER BY count DESC LIMIT 9) AS comment_counts",
  45.                            :conditions => ['comment_counts.article_id = contents.id AND published = ?', true],
  46.                            :order => 'comment_counts.count DESC',
  47.                            :limit => 5) 
  48.   end
  49.   
  50.   def inbound_links
  51.     url = "http://blogsearch.google.com/blogsearch_feeds?q=link:#{this_blog.base_url}&num=5&output=rss"
  52.     open(url) do |http|
  53.       @inbound_links = parse_rss(http.read)
  54.     end
  55.   rescue
  56.     @inbound_links = nil
  57.   end
  58.   
  59.   def typo_dev
  60.     url = "http://blog.typosphere.org/articles.rss"
  61.     open(url) do |http|
  62.       @typo_links = parse_rss(http.read)[0..1]
  63.     end
  64.   rescue
  65.     @typo_links = nil
  66.   end
  67.   
  68.   private
  69.   
  70.   class RssItem < Struct.new(:link, :title, :description, :description_link, :date, :author)
  71.     def to_s; title end
  72.   end
  73.   
  74.   def parse_rss(body)
  75.     xml = REXML::Document.new(body)
  76.  
  77.     items        = []
  78.     link         = REXML::XPath.match(xml, "//channel/link/text()").first.value rescue ""
  79.     title        = REXML::XPath.match(xml, "//channel/title/text()").first.value rescue ""
  80.  
  81.     REXML::XPath.each(xml, "//item/") do |elem|
  82.       item = RssItem.new
  83.       item.title       = REXML::XPath.match(elem, "title/text()").first.value rescue ""
  84.       item.link        = REXML::XPath.match(elem, "link/text()").first.value rescue ""
  85.       item.description = REXML::XPath.match(elem, "description/text()").first.value rescue ""
  86.       item.author = REXML::XPath.match(elem, "dc:publisher/text()").first.value rescue ""
  87.       item.date        = Time.mktime(*ParseDate.parsedate(XPath.match(elem, "dc:date/text()").first.value)) rescue Time.now
  88.  
  89.       item.description_link = item.description
  90.       item.description.gsub!(/</?ab.*?>/, "") # remove all <a> tags
  91.       items << item
  92.     end
  93.  
  94.     items.sort_by { |item| item.date }
  95.   end
  96. end