blob: 335ede97225a53e2d974bdb2fa64c7ad6f009078 [file] [log] [blame]
import feedparser
import html2text
from bson import ObjectId
import base
from pylons import c
from allura import model as M
from forgeblog import model as BM
from forgeblog import version
from forgeblog.main import ForgeBlogApp
from allura.lib import exceptions
class RssFeedsCommand(base.Command):
summary = 'Rss feed client'
parser = base.Command.standard_parser(verbose=True)
parser.add_option('-a', '--appid', dest='appid', default='',
help='application id')
parser.add_option('-u', '--username', dest='username', default='root',
help='poster username')
def command(self):
self.basic_setup()
user = M.User.query.get(username=self.options.username)
c.user = user
self.prepare_feeds()
for appid in self.feed_dict:
for feed_url in self.feed_dict[appid]:
self.process_feed(appid, feed_url)
def prepare_feeds(self):
feed_dict = {}
if self.options.appid != '':
gl_app = BM.Globals.query.get(app_config_id=ObjectId(self.options.appid))
if not gl_app:
raise exceptions.NoSuchGlobalsError("The globals %s " \
"could not be found in the database" % self.options.appid)
if len(gl_app.external_feeds) > 0:
feed_dict[gl_app.app_config_id] = gl_app.external_feeds
else:
for gl_app in BM.Globals.query.find().all():
if len(gl_app.external_feeds) > 0:
feed_dict[gl_app.app_config_id] = gl_app.external_feeds
self.feed_dict = feed_dict
def process_feed(self, appid, feed_url):
appconf = M.AppConfig.query.get(_id=appid)
if not appconf:
return
c.project = appconf.project
app = ForgeBlogApp(c.project, appconf)
c.app = app
base.log.info("Get feed: %s" % feed_url)
f = feedparser.parse(feed_url)
if f.bozo:
base.log.exception("%s: %s" % (feed_url, f.bozo_exception))
return
for e in f.entries:
title = e.title
if 'content' in e:
content = u''
for ct in e.content:
if ct.type != 'text/html':
content = u"%s<p>%s</p>" % (content, ct.value)
else:
content = content + ct.value
else:
content = e.summary
content = u'%s <a href="%s">link</a>' % (content, e.link)
content = html2text.html2text(content, e.link)
post = BM.BlogPost(title=title, text=content, app_config_id=appid,
tool_version={'blog': version.__version__},
state='draft')
post.neighborhood_id=c.project.neighborhood_id
post.make_slug()
post.commit()