Dynastie/dynastie/generators/rss.py

109 lines
3.9 KiB
Python
Executable File

# -*- coding: utf-8 -*-
"""
Copyright 2012-2014 Grégory Soutadé
This file is part of Dynastie.
Dynastie is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Dynastie is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Dynastie. If not, see <http://www.gnu.org/licenses/>.
"""
import os
import datetime
import xml
from dynastie.generators.generator import DynastieGenerator
from xml.dom.minidom import getDOMImplementation
from django.db import models
from dynastie.generators import markdown2
class RSS(DynastieGenerator):
def appendElement(self, dom, root, name='', content='', attributes=None):
elem = dom.createElement(name)
if attributes:
for k, v in attributes.items():
elem.setAttribute(k, v)
if content != '':
elem.appendChild(dom.createTextNode(content))
root.appendChild(elem)
return elem
def generate(self, blog, src, output):
from dynastie.models import Post, Blog
now = datetime.datetime.now()
impl = getDOMImplementation()
dom = impl.createDocument(None, "rss", None)
root = dom.documentElement
root.setAttribute('version', '2.0')
root.setAttributeNS('xmlns', 'xmlns:atom', 'http://www.w3.org/2005/Atom')
channel = dom.createElement('channel')
root.appendChild(channel)
self.appendElement(dom, channel, 'title', blog.title)
self.appendElement(dom, channel, 'description', blog.description)
self.appendElement(dom, channel, 'link', 'http://' + blog.name)
builddate = now.strftime('%a, %d %b %Y %H:%M:%S')
self.appendElement(dom, channel, 'lastBuildDate', builddate)
self.appendElement(dom, channel, 'generator', 'Dynastie')
self.appendElement(dom, channel, 'language', 'en-gb')
posts = Post.objects.filter(published=True).order_by('-modification_date')[:10]
for post in posts:
item = dom.createElement('item')
self.appendElement(dom, item, 'title', post.title)
path = 'http://' + blog.name + post.getPath()
self.appendElement(dom, item, 'link', path)
self.appendElement(dom, item, 'guid', path)
filename = blog.src_path + '/_post/' + str(post.id)
if not os.path.exists(filename):
self.addError('File does not exists ' + filename)
return
f = open(filename, 'rb')
post_content = f.read().decode('utf-8')
f.close()
if post.content_format == Post.CONTENT_TEXT:
post_content = markdown2.markdown(post_content)
self.appendElement(dom, item, 'description', '<![CDATA[' + post_content + ']]>')
try:
author = post.author.email
author += ' (' + post.author.first_name + ' ' + post.author.last_name + ')'
self.appendElement(dom, item, 'author', author)
self.appendElement(dom, item, 'category', post.category.name)
except:
pass
creationDate = post.creation_date.strftime('%a, %d %b %Y %H:%M:%S')
self.appendElement(dom, item, 'pubDate', creationDate)
channel.appendChild(item)
filename = 'rss.xml'
self.writeIfNotTheSame(output + '/' + filename, root)
if not self.somethingWrote:
self.addReport('Nothing changed')
return self.report