Friday, December 19, 2008

Script to generate an RSS feed from RenWeb's announcements

The following ruby (jruby) and sql code will get the Announcements from RenWeb and create an RSS feed file from them. The scripts needs the JDBC ActiveRecord gem. If you have any questions on how to run this script, please write a comment below. Both files are released under the MIT license.

main.rb:

require 'rss/maker'
require 'cgi'
require 'rubygems'
gem 'activerecord-jdbc-adapter'
require 'jdbc_adapter'


class AnnouncementsDistrict < ActiveRecord::Base
    
  AnnouncementsDistrict.establish_connection(
    :adapter => :jdbc,
    :username =>  "YOUR ODBC USERNAME",
    :password =>  "YOUR ODBC PASSWORD",
    :driver =>  "com.microsoft.sqlserver.jdbc.SQLServerDriver",
    :url =>  "jdbc:sqlserver://THE URL TO CONNECT;DatabaseName=YOUR DATABASE NAME")
  
  set_table_name("AnnouncementsDistrict")

#Gets an sql query from a file
  def self.get_sql_query_from_file(filename, params_hash_for_sql_query = nil)
    fi = File.open(filename)
    sql_query = fi.read
    if params_hash_for_sql_query != nil
      params_hash_for_sql_query.each do |key, value|
        sql_query = sql_query.gsub("$P!{#{key.to_s}}", value.to_s)
      end
    end
    fi.close
    return sql_query
  end
  
  def self.get_announcements
    announcements = self.find_by_sql(get_sql_query_from_file("parents_web_announcements.sql"))
  end
  
end

version = "2.0" # ["0.9", "1.0", "2.0"]
destination = "news.xml" # local file to write

announcements = AnnouncementsDistrict.get_announcements()
content = RSS::Maker.make(version) do |m|
  m.channel.title = "School News"
  m.channel.link = "http://www.yourlink.com"
  m.channel.description = "School News RSS"
  m.items.do_sort = true # sort items by date
  
  announcements.each do |item|
    i = m.items.new_item
    i.title = item.Title
    i.link = "http://www.yourlink.com"
    #replace new lines with html's 
and then html escape the whole message i.description = item.Message.to_s.gsub("\n","<br/>") i.date = item.BeginDate end end File.open(destination,"w") do |f| f.write(content) end

parents_web_announcements.sql:


SELECT
    AnnouncementID,     
    Title,     
    SchoolCode,     
    Message,     
    BeginDate,    
    EndDate 
FROM
     AnnouncementsDistrict 
where  
    AnnouncementsDistrict."Public" = 1 and EndDate >= GetDate() 
order by 
BeginDate,
AnnouncementID
Put both files in the same folder and run it as "jruby main.rb". Alternatively, you can use NetBeans to run it and/or edit it.

0 comments: