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
+ {{ article.id }} | {{ article.title }} | {{ article.category.name }} | {{ article.creation_date }} | {{ article.published }} | {{ article.front_page }} | Delete |
{% endfor %}
{% endif %}
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
+ {{ article.id }} | {{ article.title }} | {{ article.category.name }} | {{ article.creation_date }} | {{ article.published }} | {{ article.front_page }} | Delete |
{% endfor %}
{% endif %}