diff --git a/generators/__init__.py b/generators/__init__.py index a22d781..9a1cf8c 100644 --- a/generators/__init__.py +++ b/generators/__init__.py @@ -1 +1 @@ -__all__ = ["generator", "index", "article", "category", "archive"] +__all__ = ["generator", "index", "article", "category", "archive", "rss", "atom"] diff --git a/generators/atom.py b/generators/atom.py new file mode 100644 index 0000000..e81f14f --- /dev/null +++ b/generators/atom.py @@ -0,0 +1,73 @@ +import os +import datetime +import xml +from dynastie.generators.generator import DynastieGenerator +from dynastie.generators.rss import RSS +from xml.dom.minidom import getDOMImplementation +from django.db import models + +class Atom(RSS): + + def generate(self, blog, src, output): + from dynastie.models import Article, Blog + + now = datetime.datetime.now() + + impl = getDOMImplementation() + + dom = impl.createDocument(None, "feed", None) + root = dom.documentElement + root.setAttributeNS('xml', 'xml:lang', 'en-gb') + root.setAttribute('xmlns', 'http://www.w3.org/2005/Atom') + + self.appendElement(dom, root, 'title', blog.title, {'type':'text'}) + self.appendElement(dom, root, 'subtitle', blog.description, {'type':'text'}) + address = 'http://' + blog.name + self.appendElement(dom, root, 'link', '', {'rel':'alternate', 'type':'text/html', 'href' : address}) + self.appendElement(dom, root, 'id', address) + + builddate = now.strftime('%Y-%m-%dT%H:%M:%SZ') + self.appendElement(dom, root, 'updated', builddate) + self.appendElement(dom, root, 'generator', 'The Dynastie project', {'uri':'http://indefero.soutade.fr/p/dynastie', 'version':'0.1'}) + self.appendElement(dom, root, 'link', '', {'rel':'self', 'type':'application/atom+xml', 'href':address + '/atom.xml'}) + + articles = Article.objects.filter(published=True).order_by('-creation_date')[:10] + + for article in articles: + item = dom.createElement('entry') + self.appendElement(dom, item, 'title', article.title) + path = 'http://' + blog.name + article.getPath() + self.appendElement(dom, item, 'link', '', {'rel':'alternate', 'type':'text/html', 'href':path}) + + creationDate = article.creation_date.strftime('%Y-%m-%dT%H:%M:%SZ') + self.appendElement(dom, item, 'published', creationDate) + self.appendElement(dom, item, 'updated', creationDate) + self.appendElement(dom, item, 'id', path) + author = dom.createElement('author') + self.appendElement(dom, author, 'name', article.author.first_name + ' ' + article.author.last_name) + self.appendElement(dom, author, 'email', article.author.email) + item.appendChild(author) + + filename = blog.src_path + '/_articles/' + str(article.id) + + if not os.path.exists(filename): + self.addError('File does not exists ' + filename) + return + + f = open(filename, 'rb') + article_content = '' + f.close() + + self.appendElement(dom, item, 'summary', article_content, {'type':'html'}) + self.appendElement(dom, item, 'content', article_content, {'type':'html'}) + root.appendChild(item) + + + filename = 'atom.xml' + self.writeIfNotTheSame(output + '/' + filename, root) + + if not self.somethingWrote: + self.addReport('Nothing changed') + + return self.report + diff --git a/generators/generator.py b/generators/generator.py index cc4d91b..f5130d9 100644 --- a/generators/generator.py +++ b/generators/generator.py @@ -92,13 +92,13 @@ class DynastieGenerator: return os.unlink(filename) - self.addReport('Write ' + filename) + self.addReport('Write (and compress) ' + filename) f = open(filename,'wb') f.write(content) f.close() filename = filename + '.gz' - self.addReport('Compressing it ' + filename) + #self.addReport('Compressing it ' + filename) f = gzip.open(filename, 'wb') f.write(content) f.close() diff --git a/generators/rss.py b/generators/rss.py new file mode 100644 index 0000000..34b06f2 --- /dev/null +++ b/generators/rss.py @@ -0,0 +1,81 @@ +import os +import datetime +import xml +from dynastie.generators.generator import DynastieGenerator +from xml.dom.minidom import getDOMImplementation +from django.db import models + +class RSS(DynastieGenerator): + + def appendElement(self, dom, root, name='', content='', attributes=None): + elem = dom.createElement(name) + if not attributes is None: + for k, v in attributes.iteritems(): + 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 Article, 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') + + articles = Article.objects.filter(published=True).order_by('-creation_date')[:10] + + for article in articles: + item = dom.createElement('item') + self.appendElement(dom, item, 'title', article.title) + path = 'http://' + blog.name + article.getPath() + self.appendElement(dom, item, 'link', path) + self.appendElement(dom, item, 'guid', path) + + filename = blog.src_path + '/_articles/' + str(article.id) + + if not os.path.exists(filename): + self.addError('File does not exists ' + filename) + return + + f = open(filename, 'rb') + article_content = f.read() + f.close() + + self.appendElement(dom, item, 'description', '') + + author = article.author.email + author += ' (' + article.author.first_name + ' ' + article.author.last_name + ')' + self.appendElement(dom, item, 'author', author) + self.appendElement(dom, item, 'category', article.category.name) + + creationDate = article.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 + diff --git a/models.py b/models.py index 38c111d..5aa0a45 100644 --- a/models.py +++ b/models.py @@ -2,6 +2,7 @@ import os import shutil import hashlib import inspect +import gzip from unicodedata import normalize from re import sub from datetime import datetime @@ -77,6 +78,7 @@ class Blog(models.Model): os.makedirs(dstname) self.copytree(srcname, dstname) else: + copied = False if os.path.exists(dstname): src_md5 = hashlib.md5() f = open(srcname,'rb') @@ -91,9 +93,31 @@ class Blog(models.Model): if src_md5.digest() != dst_md5.digest(): self.report = self.report + 'Update ' + dstname + '
\n' shutil.copy2(srcname, dstname) + copied = True + else: self.report = self.report + 'Add ' + dstname + '
\n' shutil.copy2(srcname, dstname) + copied = True + + if copied: + exts = ('css', 'html', 'htm', 'xhtml', 'js') + found = False + for ext in exts: + if srname.endswith(ext): + found = True + break + if found: + dstname = dstname + '.gz' + if os.path.exists(dstname): + os.unlink(dstname) + f = open(srcname) + content = f.read() + f.close() + f = gzip.open(dstname, 'wb') + f.write(content) + f.close() + # XXX What about devices, sockets etc.? except (IOError, os.error), why: diff --git a/templates/generate.html b/templates/generate.html index 212d6c3..1b0d759 100644 --- a/templates/generate.html +++ b/templates/generate.html @@ -15,6 +15,7 @@ {% else %} {% autoescape off %} {{ report }} +

{% endautoescape %} {% endif %} {% if articles|length == 0 %} @@ -23,7 +24,7 @@ {% else %} {% for article in articles %} -
{{ article.id }}{{ article.title }}{{ article.category.name }}{{ article.creation_date }}{{ article.published }}{{ article.front_page }}Delete + {% endfor %} {% endif %}
{{ article.id }}{{ article.title }}{{ article.category.name }}{{ article.creation_date }}{{ article.published }}{{ article.front_page }}Delete
diff --git a/templates/view_blog.html b/templates/view_blog.html index 171342e..62efc76 100644 --- a/templates/view_blog.html +++ b/templates/view_blog.html @@ -10,13 +10,14 @@ {% endif %}

Add an article Generate blog +

{% if articles|length == 0 %}

Any article available

{% else %} {% for article in articles %} -
{{ article.id }}{{ article.title }}{{ article.category.name }}{{ article.creation_date }}{{ article.published }}{{ article.front_page }}Delete + {% endfor %} {% endif %}
{{ article.id }}{{ article.title }}{{ article.category.name }}{{ article.creation_date }}{{ article.published }}{{ article.front_page }}Delete